在旧系统同步功能的初始实现中,adminID 参数使用的是新系统的 creator_id(用户ID),但实际应该使用该用户对应的 OA_UserID。
// 直接使用 creator_id
params.put("adminID", task.getCreatorId() != null ? task.getCreatorId().toString() : "");
// 通过 creator_id 查询用户表,获取 oa_user_id
String adminID = "";
if (task.getCreatorId() != null) {
try {
SysUser creator = sysUserMapper.selectUserById(task.getCreatorId());
if (creator != null && creator.getOaUserId() != null) {
adminID = creator.getOaUserId().toString();
log.info("获取创建人OA_UserID成功,用户ID: {}, OA_UserID: {}", task.getCreatorId(), adminID);
} else {
log.warn("创建人未配置OA_UserID,用户ID: {}", task.getCreatorId());
}
} catch (Exception e) {
log.error("查询创建人OA_UserID异常,用户ID: {}", task.getCreatorId(), e);
}
}
params.put("adminID", adminID);
新系统任务表 (sys_task)
↓
creator_id (创建人ID,例如: 10)
↓
查询用户表 (sys_user)
↓
oa_user_id (OA系统用户ID,例如: 1001)
↓
传递给旧系统
↓
adminID 参数 (例如: "1001")
↓
旧系统 ServiceOrder 表
↓
ServiceOrd_CC_ID 字段
| 项目 | v1.1 (错误) | v1.2 (正确) |
|---|---|---|
| 参数来源 | task.creator_id |
user.oa_user_id |
| 示例值 | 10 (新系统用户ID) |
1001 (OA系统用户ID) |
| 查询逻辑 | 直接获取 | 先查询用户表再获取 |
| 日志记录 | 无 | 详细的成功/失败日志 |
| 空值处理 | 返回空字符串 | 返回空字符串 + 警告日志 |
| 旧系统关联 | ❌ 无法正确关联 | ✅ 正确关联到OA管理员 |
user_id 是自增主键,与旧系统的管理员ID不对应oa_user_id 才能在两个系统间建立正确的映射关系文件: LegacySystemSyncServiceImpl.java
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.mapper.SysUserMapper;
// ...
@Autowired
private SysUserMapper sysUserMapper;
文件: LegacySystemSyncServiceImpl.java
方法: buildSyncParams()
位置: 第223-237行
替换了原来简单的 creator_id 获取逻辑,改为通过用户表查询 oa_user_id。
操作路径: 后台管理 → 系统管理 → 用户管理 → 编辑用户 → OA用户ID
如果未配置:
- 同步时会记录警告日志
- adminID 传递空字符串
- 旧系统可能拒绝创建订单(取决于旧系统的验证规则)
确保 sys_user 表有 oa_user_id 字段:sql -- 检查字段是否存在 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_user' AND COLUMN_NAME = 'oa_user_id';
如果不存在,需要执行之前的迁移脚本添加该字段。
对于已经同步但使用错误 adminID 的订单:
- 需要在旧系统中手动修正(如果必要)
- 或者标记为无效,重新创建订单
准备测试用户
sql -- 为测试用户设置 oa_user_id UPDATE sys_user SET oa_user_id = 1001 WHERE user_id = 10;
创建测试任务
查看同步日志
log INFO LegacySystemSyncServiceImpl - 获取创建人OA_UserID成功,用户ID: 10, OA_UserID: 1001
验证数据库
sql -- 查看新系统记录 SELECT t.task_id, t.creator_id, u.oa_user_id, e.legacy_service_ord_id FROM sys_task t JOIN sys_user u ON t.creator_id = u.user_id JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_id = <任务ID>;
验证旧系统
```sql
-- 在旧系统查询
SELECT
ServiceOrdID,
ServiceOrd_CC_ID
FROM ServiceOrder
WHERE ServiceOrdID = ;
-- ServiceOrd_CC_ID 应该等于 1001
```
数据准备: 确保所有用户都配置了 OA_UserID
sql -- 查询未配置 OA_UserID 的用户 SELECT user_id, user_name, nick_name FROM sys_user WHERE oa_user_id IS NULL AND del_flag = '0' AND status = '0';
批量配置 (如果需要):
sql -- 示例:从旧系统导入映射关系 UPDATE sys_user u JOIN old_system_user_mapping m ON u.user_name = m.username SET u.oa_user_id = m.oa_user_id;
部署更新
A:
- 同步时会记录警告日志
- adminID 参数传递空字符串
- 旧系统可能拒绝创建订单,导致同步失败
- 建议: 提前为所有用户配置 OA_UserID
A:
- 如果影响业务,需要在旧系统中手动修正
- 或者删除旧系统中的错误订单,重新同步
- 可以通过 legacy_service_ord_id 字段定位到旧系统订单
A:
```sql
-- 方法1: 从旧系统导入
-- 假设旧系统有用户名和OA_UserID的映射表
-- 方法2: 如果OA_UserID规则固定
-- 例如:OA_UserID = 1000 + user_id
UPDATE sys_user
SET oa_user_id = 1000 + user_id
WHERE oa_user_id IS NULL;
-- 方法3: 通过Excel导入
-- 在后台用户管理中使用导入功能
```
修正时间: 2025-01-20
当前版本: v1.2
状态: ✅ 已修正,待测试