从SQL Server的OA_User表同步用户数据到若依系统的sys_user表,并通过department_id字段关联部门。
SELECT
OA_User_ID as OA_UserID,
OA_User as user_name,
OA_Name as nick_name,
OA_departmentID as department_id,
OA_gender as sex,
OA_email as email,
OA_mobile as phonenumber
FROM OA_User
WHERE OA_User IS NOT NULL
AND OA_Name IS NOT NULL
| SQL Server字段 | 若依字段 | 说明 |
|---|---|---|
| OA_User_ID | oa_user_id | OA用户ID(唯一标识) |
| OA_User | user_name | 用户账号 |
| OA_Name | nick_name | 用户昵称 |
| OA_departmentID | department_id | 部门ID(通过此字段关联sys_dept) |
| OA_gender | sex | 性别 |
| OA_email | 邮箱 | |
| OA_mobile | phonenumber | 手机号 |
-- 在sys_user表中添加oa_user_id字段
ALTER TABLE sys_user ADD COLUMN oa_user_id INT NULL COMMENT 'SQL Server中的OA用户ID';
CREATE INDEX idx_oa_user_id ON sys_user(oa_user_id);
文件: sql/add_oa_user_id_to_sys_user.sql
文件: ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
修改内容:
```java
/** SQL Server中的OA用户ID */
private Integer oaUserId;
public Integer getOaUserId() { return oaUserId; }
public void setOaUserId(Integer oaUserId) { this.oaUserId = oaUserId; }
```
文件: UserSyncDTO.java
- 字段: oaUserId, userName, nickName, departmentId, sex, email, phonenumber
文件:
- UserSyncMapper.java - 查询SQL Server用户数据
- UserSyncMapper.xml - SQL映射
- SysUserMapper.java(扩展) - 添加根据oaUserId查询方法
- SysUserMapper.xml(扩展) - 添加字段映射和查询SQL
文件: UserSyncServiceImpl.java
核心逻辑:
1. 从SQL Server查询OA_User数据
2. 遍历每条用户数据
3. 根据department_id查找对应的dept_id
4. 检查用户是否已存在(根据oa_user_id)
5. 已存在则更新,不存在则创建
6. 记录同步统计信息
文件: DepartmentSyncController.java(扩展)
接口:
- POST /system/dept/sync/user - 同步OA用户
- 权限: system:user:sync
1. 获取OA_User的OA_departmentID
↓
2. 在sys_dept表中查询department_id = OA_departmentID的记录
↓
3. 找到则使用该dept_id
↓
4. 未找到则使用默认部门(100-若依科技)
1. 根据oa_user_id查询用户
↓
2. 如果找到
├─ 更新用户信息(昵称、部门、邮箱、手机、性别)
└─ 返回"更新用户"
↓
3. 如果未找到
├─ 检查用户名是否存在
│ ├─ 存在:更新该用户的oa_user_id及其他信息
│ └─ 不存在:创建新用户
└─ 返回"创建用户"或"更新用户"
创建新用户时的默认值:
- 默认密码: 123456(加密存储)
- 默认部门: 100(若依科技)
- 默认性别: 2(未知)
- 默认状态: 0(正常)
- 创建者: sync
POST /system/dept/sync/usersystem:user:syncjson { "code": 200, "msg": "同步完成!创建用户: 15, 更新用户: 5, 跳过: 2, 失败: 0", "data": { "created": 15, "updated": 5, "skipped": 2, "error": 0, "totalProcessed": 22 } } # 先同步部门(用户同步依赖部门数据)
mysql -u root -p ry-vue < sql/add_department_id_to_sys_dept.sql
# 再添加用户字段
mysql -u root -p ry-vue < sql/add_oa_user_id_to_sys_user.sql
POST http://localhost:8080/system/dept/sync/branch
POST http://localhost:8080/system/dept/sync/user
Headers:
Authorization: Bearer {你的token}
OA_User_ID | OA_User | OA_Name | OA_departmentID | OA_gender | OA_email | OA_mobile
1001 | zhangsan | 张三 | 1001 | 0 | zhangsan@qq.com | 13800138001
1002 | lisi | 李四 | 1001 | 1 | lisi@qq.com | 13800138002
1003 | wangwu | 王五 | 1002 | 0 | wangwu@qq.com | 13800138003
1. 用户zhangsan:
- OA_departmentID=1001 → 查询sys_dept找到dept_id=201(护士部门)
- 检查oa_user_id=1001的用户 → 不存在
- 检查用户名zhangsan → 不存在
- 创建新用户: userName=zhangsan, deptId=201, password=123456(加密)
2. 用户lisi:
- OA_departmentID=1001 → dept_id=201
- 检查oa_user_id=1002的用户 → 不存在
- 检查用户名lisi → 已存在(之前手动创建的)
- 更新用户: 设置oaUserId=1002, deptId=201
3. 用户wangwu:
- OA_departmentID=1002 → dept_id=202(车队部门)
- 检查oa_user_id=1003的用户 → 不存在
- 创建新用户: userName=wangwu, deptId=202
user_id | user_name | nick_name | dept_id | oa_user_id | email | phonenumber | password
101 | zhangsan | 张三 | 201 | 1001 | zhangsan@qq.com | 13800138001 | $2a$10$...
102 | lisi | 李四 | 201 | 1002 | lisi@qq.com | 13800138002 | (原密码)
103 | wangwu | 王五 | 202 | 1003 | wangwu@qq.com | 13800138003 | $2a$10$...
oa_user_id判断用户是否已存在department_id自动关联部门@Transactional注解123456,建议首次登录后修改system:user:sync权限1. 执行SQL脚本(部门和用户)
2. 同步部门数据
3. 同步用户数据
-- 查看所有同步的用户(有oa_user_id的)
SELECT u.user_name, u.nick_name, u.oa_user_id, d.dept_name, u.email, u.phonenumber
FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
WHERE u.oa_user_id IS NOT NULL
ORDER BY u.oa_user_id;
-- 检查部门关联情况
SELECT
u.user_name,
u.oa_user_id,
d.dept_name,
d.department_id
FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
WHERE u.oa_user_id IS NOT NULL;
-- 统计同步用户数
SELECT
COUNT(*) as total_synced_users,
COUNT(DISTINCT dept_id) as dept_count
FROM sys_user
WHERE oa_user_id IS NOT NULL;
A: 可能原因:
1. 部门数据未同步,先执行部门同步
2. department_id在sys_dept中不存在
3. 查看日志中的警告信息
A: 系统会自动处理:
1. 如果用户名已存在,会更新该用户的oa_user_id
2. 不会创建重复用户
A: 默认密码为123456,建议用户首次登录后修改
A: 直接调用同步接口即可,系统会根据oa_user_id自动判断是创建还是更新
查看同步日志:bash tail -f ruoyi-admin/logs/sys-info.log | grep -i "user"
关键日志示例: 2025-10-18 15:00:00 INFO UserSyncServiceImpl - 从SQL Server获取到 50 条用户数据 2025-10-18 15:00:01 INFO UserSyncServiceImpl - 创建新用户: 张三 (zhangsan), oaUserId: 1001, deptId: 201 2025-10-18 15:00:01 INFO UserSyncServiceImpl - 更新用户: 李四 (lisi), oaUserId: 1002 2025-10-18 15:00:01 WARN UserSyncServiceImpl - 未找到对应的部门: departmentId=9999, 用户: test 2025-10-18 15:00:02 INFO UserSyncServiceImpl - 同步完成!创建用户: 30, 更新用户: 15, 跳过: 3, 失败: 2
sql/add_oa_user_id_to_sys_user.sql - 添加字段SysUser.java(修改) - 添加oaUserId字段UserSyncDTO.java - 用户同步DTOUserSyncMapper.java + XML - 查询SQL Server数据SysUserMapper.java(扩展) - 添加查询方法SysUserMapper.xml(扩展) - 添加SQL映射IUserSyncService.java - Service接口UserSyncServiceImpl.java - Service实现(核心逻辑)DepartmentSyncController.java(扩展) - 添加用户同步接口prd/用户同步功能说明.md - 本文档ruoyi
2025-10-18