# 用户创建任务单权限功能说明
## 📋 功能概述
在 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
**相关功能**: 用户同步、权限管理