编辑 | blame | 历史 | 原始文档

adminID 参数修正说明

📋 问题描述

在旧系统同步功能的初始实现中,adminID 参数使用的是新系统的 creator_id(用户ID),但实际应该使用该用户对应的 OA_UserID


✅ 修正方案

修正前 (v1.1)

// 直接使用 creator_id
params.put("adminID", task.getCreatorId() != null ? task.getCreatorId().toString() : "");

修正后 (v1.2)

// 通过 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管理员

🎯 为什么要使用 OA_UserID?

1. 数据一致性

  • 新系统的 user_id 是自增主键,与旧系统的管理员ID不对应
  • 旧系统的管理员ID就是OA系统的用户ID
  • 使用 oa_user_id 才能在两个系统间建立正确的映射关系

2. 业务需求

  • 旧系统依赖 OA_UserID 进行权限控制
  • 旧系统的数据统计和报表使用 OA_UserID 作为关键字段
  • 旧系统的工作流审批基于 OA_UserID

3. 数据追溯

  • 在旧系统中可以通过 ServiceOrd_CC_ID 查找到正确的创建人
  • 便于跨系统的数据分析和审计

🔧 代码修改内容

1. 添加依赖注入

文件: LegacySystemSyncServiceImpl.java

import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.mapper.SysUserMapper;

// ...

@Autowired
private SysUserMapper sysUserMapper;

2. 修改参数构建逻辑

文件: LegacySystemSyncServiceImpl.java
方法: buildSyncParams()
位置: 第223-237行

替换了原来简单的 creator_id 获取逻辑,改为通过用户表查询 oa_user_id


⚠️ 注意事项

1. 用户必须配置 OA_UserID

操作路径:
后台管理 → 系统管理 → 用户管理 → 编辑用户 → OA用户ID

如果未配置:
- 同步时会记录警告日志
- adminID 传递空字符串
- 旧系统可能拒绝创建订单(取决于旧系统的验证规则)

2. 数据库字段要求

确保 sys_user 表有 oa_user_id 字段:
sql -- 检查字段是否存在 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'sys_user' AND COLUMN_NAME = 'oa_user_id';

如果不存在,需要执行之前的迁移脚本添加该字段。

3. 历史数据处理

对于已经同步但使用错误 adminID 的订单:
- 需要在旧系统中手动修正(如果必要)
- 或者标记为无效,重新创建订单


🧪 测试验证

测试步骤

  1. 准备测试用户
    sql -- 为测试用户设置 oa_user_id UPDATE sys_user SET oa_user_id = 1001 WHERE user_id = 10;

  2. 创建测试任务

  • 以该用户身份登录
  • 创建一个急救转运任务
  1. 查看同步日志
    log INFO LegacySystemSyncServiceImpl - 获取创建人OA_UserID成功,用户ID: 10, OA_UserID: 1001

  2. 验证数据库
    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>;

  3. 验证旧系统
    ```sql
    -- 在旧系统查询
    SELECT
    ServiceOrdID,
    ServiceOrd_CC_ID
    FROM ServiceOrder
    WHERE ServiceOrdID = ;

-- ServiceOrd_CC_ID 应该等于 1001
```


📝 影响范围

受影响的功能

  • ✅ 急救转运任务同步到旧系统

不受影响的功能

  • ✅ 任务创建
  • ✅ 任务查询
  • ✅ 任务状态变更
  • ✅ 其他类型任务(福祉车等)

🚀 部署建议

开发环境

  1. 更新代码
  2. 为测试用户配置 OA_UserID
  3. 创建测试任务验证

生产环境

  1. 数据准备: 确保所有用户都配置了 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';

  2. 批量配置 (如果需要):
    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;

  3. 部署更新

  4. 验证功能

📚 相关文档


📞 FAQ

Q1: 如果用户没有配置 OA_UserID 会怎样?

A:
- 同步时会记录警告日志
- adminID 参数传递空字符串
- 旧系统可能拒绝创建订单,导致同步失败
- 建议: 提前为所有用户配置 OA_UserID

Q2: 已经同步的错误数据怎么处理?

A:
- 如果影响业务,需要在旧系统中手动修正
- 或者删除旧系统中的错误订单,重新同步
- 可以通过 legacy_service_ord_id 字段定位到旧系统订单

Q3: 如何批量为用户配置 OA_UserID?

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
状态: ✅ 已修正,待测试