# 用户创建任务单权限功能说明 ## 📋 功能概述 在 sys_user 表中新增 `can_create_task` 字段,用于标识用户是否具有创建任务单的权限。该字段从 OA 系统的 `OA_User` 表中的 `OA_Power` 字段同步而来。 ## 🎯 同步规则 当 `OA_Power` 字段包含 `,020101,` 时,用户具有创建任务单权限。 **SQL 判断逻辑**: ```sql CASE WHEN OA_Power LIKE '%,020101,%' THEN '1' ELSE '0' END AS can_create_task ``` ## 🔨 实现内容 ### 1. 数据库修改 #### 添加字段 **文件**: `sql/add_can_create_task_to_sys_user.sql` ```sql ALTER TABLE sys_user ADD COLUMN can_create_task CHAR(1) DEFAULT '0' COMMENT '是否可创建任务单(0否 1是)'; CREATE INDEX idx_can_create_task ON sys_user(can_create_task); ``` **字段说明**: - **字段名**: `can_create_task` - **类型**: `CHAR(1)` - **默认值**: `'0'` (不可创建) - **可选值**: - `'0'`: 不可创建任务单 - `'1'`: 可以创建任务单 - **索引**: 已添加索引 `idx_can_create_task` 方便查询 ### 2. 实体类修改 #### SysUser 实体 **文件**: `ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java` **新增字段**: ```java /** 是否可创建任务单(0否 1是) */ @Excel(name = "可创建任务单", readConverterExp = "0=否,1=是") private String canCreateTask; public String getCanCreateTask() { return canCreateTask; } public void setCanCreateTask(String canCreateTask) { this.canCreateTask = canCreateTask; } ``` ### 3. DTO 层修改 #### UserSyncDTO **文件**: `ruoyi-system/src/main/java/com/ruoyi/system/domain/UserSyncDTO.java` **新增字段**: ```java /** 是否可创建任务单(0否 1是) */ private String canCreateTask; public String getCanCreateTask() { return canCreateTask; } public void setCanCreateTask(String canCreateTask) { this.canCreateTask = canCreateTask; } ``` ### 4. Mapper 层修改 #### UserSyncMapper.xml **文件**: `ruoyi-system/src/main/resources/mapper/system/UserSyncMapper.xml` **修改内容**: 1. 在 resultMap 中添加字段映射 2. 在 SQL 查询中添加 CASE 判断逻辑 ```xml CASE WHEN OA_Power LIKE '%,020101,%' THEN '1' ELSE '0' END AS can_create_task ``` #### SysUserMapper.xml **文件**: `ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml` **修改内容**: 1. resultMap 添加字段映射 2. selectUserVo 查询添加字段 3. insertUser 添加字段插入 4. updateUser 添加字段更新 ### 5. Service 层修改 #### UserSyncServiceImpl **文件**: `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java` **修改内容**: **更新已存在用户**: ```java if (StringUtils.isNotEmpty(dto.getCanCreateTask())) { existingUser.setCanCreateTask(dto.getCanCreateTask()); } ``` **创建新用户**: ```java if (StringUtils.isNotEmpty(dto.getCanCreateTask())) { newUser.setCanCreateTask(dto.getCanCreateTask()); } ``` ## 📊 数据流转过程 ``` OA_User (SQL Server) ↓ OA_Power LIKE '%,020101,%' ↓ SQL CASE 判断 ↓ UserSyncDTO.canCreateTask ↓ SysUser.canCreateTask ↓ sys_user.can_create_task ``` ## 🚀 使用步骤 ### 1. 执行数据库脚本 ```bash mysql -u root -p ry-vue < sql/add_can_create_task_to_sys_user.sql ``` ### 2. 同步用户数据 通过后台管理界面或 API 执行用户同步: ```bash POST http://localhost:8080/system/dept/sync/user Headers: Authorization: Bearer {你的token} ``` ### 3. 验证同步结果 ```sql -- 查看具有创建任务单权限的用户 SELECT user_name, nick_name, can_create_task, oa_user_id FROM sys_user WHERE can_create_task = '1' AND del_flag = '0' ORDER BY create_time DESC; -- 统计权限分布 SELECT can_create_task, CASE can_create_task WHEN '1' THEN '可创建' ELSE '不可创建' END AS permission_label, COUNT(*) AS user_count FROM sys_user WHERE del_flag = '0' GROUP BY can_create_task; ``` ## 💡 使用示例 ### 场景1:查询有权限的用户 ```java // 在 Service 层添加查询方法 public List getUsersWithCreateTaskPermission() { SysUser query = new SysUser(); query.setCanCreateTask("1"); return userMapper.selectUserList(query); } ``` ### 场景2:前端权限控制 ```javascript // 根据用户权限显示/隐藏创建任务按钮 if (user.canCreateTask === '1') { // 显示创建任务按钮 showCreateTaskButton(); } else { // 隐藏创建任务按钮 hideCreateTaskButton(); } ``` ### 场景3:后端接口权限验证 ```java @PreAuthorize("@ss.hasPermi('task:create')") @PostMapping("/create") public AjaxResult createTask(@RequestBody Task task) { SysUser user = SecurityUtils.getLoginUser().getUser(); if (!"1".equals(user.getCanCreateTask())) { return AjaxResult.error("您没有创建任务单的权限"); } // 创建任务逻辑 return taskService.createTask(task); } ``` ## 📝 注意事项 ### 重要提示 1. **权限同步**: 该字段从 OA 系统自动同步,请勿手动修改 2. **默认值**: 新创建用户默认为 `'0'`(不可创建) 3. **同步更新**: 每次用户同步时会自动更新该字段 4. **权限粒度**: 该字段仅控制是否可创建任务单,不影响其他权限 ### 与其他权限字段的关系 - `can_view_all_consult`: 是否可查看所有咨询单(OA_Power LIKE '%,020112,%') - `can_create_task`: 是否可创建任务单(OA_Power LIKE '%,020101,%') 这两个字段互相独立,用户可以同时拥有或分别拥有这些权限。 ## 🔍 验证方法 ### 查看后台用户管理界面 1. 登录后台管理系统 2. 进入 **系统管理** → **用户管理** 3. 在用户列表中查看 "可创建任务单" 列 4. 编辑用户时可看到该字段(只读,由同步控制) ### 数据库验证 ```sql -- 检查字段是否存在 SELECT COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_user' AND COLUMN_NAME = 'can_create_task'; -- 查看具体用户的权限 SELECT u.user_name, u.nick_name, u.can_view_all_consult, u.can_create_task, u.oa_user_id FROM sys_user u WHERE u.oa_user_id IS NOT NULL ORDER BY u.user_id; ``` ## 📚 相关文件清单 ### SQL 脚本 - `sql/add_can_create_task_to_sys_user.sql` - 添加字段脚本 ### Java 文件 - `SysUser.java`(修改) - 添加字段定义 - `UserSyncDTO.java`(修改) - 添加 DTO 字段 - `UserSyncServiceImpl.java`(修改) - 添加同步逻辑 ### Mapper 文件 - `UserSyncMapper.xml`(修改) - 添加 SQL 查询逻辑 - `SysUserMapper.xml`(修改) - 添加字段映射和操作 ### 文档 - `prd/用户创建任务单权限功能说明.md` - 本文档 ## 🎯 常见问题 ### Q1: 字段值为什么是字符串而不是布尔值? **A**: 为了与若依框架的数据字典规范保持一致,使用 `'0'` 和 `'1'` 字符串表示布尔值。 ### Q2: 如何手动设置用户权限? **A**: 不建议手动修改。该字段应通过 OA 系统的 `OA_Power` 字段控制,通过用户同步自动更新。 ### Q3: 用户同步后权限没有变化? **A**: 请检查: 1. OA 系统中用户的 `OA_Power` 字段是否包含 `,020101,` 2. 用户同步是否执行成功 3. 查看同步日志确认更新情况 ### Q4: 如何批量设置用户权限? **A**: 在 OA 系统中批量修改用户的 `OA_Power` 字段,然后执行用户同步即可。 --- **版本**: v1.0 **更新时间**: 2025-12-29 **相关功能**: 用户同步、权限管理