# adminID 参数修正说明 ## 📋 问题描述 在旧系统同步功能的初始实现中,`adminID` 参数使用的是新系统的 `creator_id`(用户ID),但实际应该使用该用户对应的 **OA_UserID**。 --- ## ✅ 修正方案 ### 修正前 (v1.1) ```java // 直接使用 creator_id params.put("adminID", task.getCreatorId() != null ? task.getCreatorId().toString() : ""); ``` ### 修正后 (v1.2) ```java // 通过 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` ```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. **创建测试任务** - 以该用户身份登录 - 创建一个急救转运任务 3. **查看同步日志** ```log INFO LegacySystemSyncServiceImpl - 获取创建人OA_UserID成功,用户ID: 10, OA_UserID: 1001 ``` 4. **验证数据库** ```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>; ``` 5. **验证旧系统** ```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. **验证功能** --- ## 📚 相关文档 - [旧系统同步参数映射表.md](./旧系统同步参数映射表.md) - 完整的66个参数说明 - [旧系统同步更新说明-v1.1.md](./旧系统同步更新说明-v1.1.md) - 详细的更新说明 - [旧系统同步配置说明.md](./旧系统同步配置说明.md) - 配置指南 - [旧系统同步-快速开始.md](./旧系统同步-快速开始.md) - 快速上手 --- ## 📞 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 **状态**: ✅ 已修正,待测试