# 旧系统同步ServiceOrdAreaType参数优化说明 ## 修改日期 2025-10-19 ## 修改内容 ### 问题描述 之前的实现中,`ServiceOrdAreaType`参数固定传入"1",没有使用任务所属分公司的实际服务单编码。 **原代码**: ```java params.put("ServiceOrdAreaType", "1"); // 服务单执行区域(默认1) ``` ### 优化方案 修改为从任务所属部门查询服务单编码,自动传入对应的编码值。 **新代码**: ```java // 服务单执行区域(使用任务所属分公司的服务单编码) String serviceOrdAreaType = "1"; // 默认值 if (task.getDeptId() != null) { try { SysDept dept = sysDeptMapper.selectDeptById(task.getDeptId()); if (dept != null && StringUtils.isNotEmpty(dept.getServiceOrderClass())) { serviceOrdAreaType = dept.getServiceOrderClass(); log.info("获取任务所属部门的服务单编码成功,部门ID: {}, 部门名称: {}, 服务单编码: {}", task.getDeptId(), dept.getDeptName(), serviceOrdAreaType); } else { log.warn("任务所属部门未配置服务单编码,部门ID: {}、部门名称: {},使用默认值", task.getDeptId(), dept != null ? dept.getDeptName() : "null"); } } catch (Exception e) { log.error("查询任务所属部门信息异常,部门ID: {}", task.getDeptId(), e); } } else { log.warn("任务未关联部门,使用默认服务单编码"); } params.put("ServiceOrdAreaType", serviceOrdAreaType); ``` ## 技术实现 ### 1. 依赖注入 新增`SysDeptMapper`依赖: ```java @Autowired private SysDeptMapper sysDeptMapper; ``` ### 2. 导入部门实体 ```java import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.system.mapper.SysDeptMapper; ``` ### 3. 查询逻辑 1. **检查任务是否有部门ID** - 有:继续查询部门信息 - 无:使用默认值"1",记录警告日志 2. **查询部门信息** - 成功:获取部门的`serviceOrderClass`字段 - 失败:使用默认值"1",记录错误日志 3. **检查编码是否存在** - 存在:使用该编码值 - 不存在:使用默认值"1",记录警告日志 4. **异常处理** - 捕获所有异常,使用默认值"1" - 记录错误日志,不影响同步流程 ## 数据流转 ``` 创建急救转运任务 ↓ 设置归属部门(deptId) ↓ 部门自动同步时获取服务单编码 ├─ 从SQL Server查询编码 └─ 根据地名自动匹配 ↓ 保存到sys_dept.service_order_class ↓ 同步任务到旧系统时 ↓ 根据task.deptId查询部门 ↓ 获取dept.serviceOrderClass ↓ 传入ServiceOrdAreaType参数 ``` ## 示例场景 ### 场景1:正常情况 **任务数据**: - taskId: 1001 - deptId: 200(中山分公司) - taskType: EMERGENCY_TRANSFER **部门数据**: - deptId: 200 - deptName: "中山分公司" - serviceOrderClass: "JA" **同步参数**: ``` ServiceOrdAreaType = "JA" ``` **日志**: ``` INFO - 获取任务所属部门的服务单编码成功,部门ID: 200, 部门名称: 中山分公司, 服务单编码: JA ``` ### 场景2:部门未配置编码 **任务数据**: - taskId: 1002 - deptId: 203(深圳分公司) **部门数据**: - deptId: 203 - deptName: "深圳分公司" - serviceOrderClass: null **同步参数**: ``` ServiceOrdAreaType = "1" (使用默认值) ``` **日志**: ``` WARN - 任务所属部门未配置服务单编码,部门ID: 203、部门名称: 深圳分公司,使用默认值 ``` ### 场景3:任务未关联部门 **任务数据**: - taskId: 1003 - deptId: null **同步参数**: ``` ServiceOrdAreaType = "1" (使用默认值) ``` **日志**: ``` WARN - 任务未关联部门,使用默认服务单编码 ``` ### 场景4:查询异常 **任务数据**: - taskId: 1004 - deptId: 999(不存在的部门) **同步参数**: ``` ServiceOrdAreaType = "1" (使用默认值) ``` **日志**: ``` ERROR - 查询任务所属部门信息异常,部门ID: 999 ``` ## 参数映射 | 分公司 | 部门ID | 服务单编码 | ServiceOrdAreaType | |--------|--------|-----------|-------------------| | 中山分公司 | 200 | JA | JA | | 广州分公司 | 201 | GZ | GZ | | 湛江分公司 | 202 | ZJ | ZJ | | 珠海分公司 | 203 | ZH | ZH | | 未配置 | 204 | null | 1(默认值) | | 未关联 | null | - | 1(默认值) | ## 优势 ### 1. 自动化 ✅ 无需手动配置每个分公司的编码 ✅ 部门同步时自动获取编码 ✅ 创建任务时自动使用对应编码 ### 2. 容错性 ✅ 多层异常处理 ✅ 默认值保底 ✅ 不影响同步流程 ### 3. 可维护性 ✅ 详细的日志记录 ✅ 清晰的逻辑流程 ✅ 便于问题排查 ### 4. 扩展性 ✅ 支持未来添加新分公司 ✅ 支持编码动态更新 ✅ 支持手动修正编码 ## 注意事项 ### 1. 部门编码配置 确保每个分公司都配置了服务单编码: **检查SQL**: ```sql SELECT dept_id, dept_name, service_order_class FROM sys_dept WHERE parent_id = 100 AND dept_name LIKE '%分公司'; ``` **配置方法**: - 自动同步:执行部门同步任务 - 手动配置:后台部门管理界面编辑 ### 2. 任务归属部门 创建任务时确保设置了正确的归属部门: ```java SysTask task = new SysTask(); task.setDeptId(200L); // 设置归属部门 ``` ### 3. 默认值兜底 即使部门未配置编码,系统也会使用默认值"1",确保同步不会失败。 ### 4. 日志监控 定期检查日志,关注以下警告: - "任务所属部门未配置服务单编码" - "任务未关联部门" ## 测试建议 ### 测试用例1:正常同步 1. 创建任务,归属中山分公司 2. 同步到旧系统 3. 检查日志和参数 **预期结果**: - ServiceOrdAreaType = "JA" - 日志显示成功获取编码 ### 测试用例2:未配置编码 1. 创建任务,归属未配置编码的分公司 2. 同步到旧系统 3. 检查日志和参数 **预期结果**: - ServiceOrdAreaType = "1" - 日志显示使用默认值 ### 测试用例3:未关联部门 1. 创建任务,不设置归属部门 2. 同步到旧系统 3. 检查日志和参数 **预期结果**: - ServiceOrdAreaType = "1" - 日志显示未关联部门警告 ## 相关文档 - [旧系统同步功能实现总结](./旧系统同步功能实现总结.md) - [旧系统同步参数映射表](./旧系统同步参数映射表.md) - [部门编码同步功能说明](./部门编码同步功能说明.md) - [部门编码映射表](./部门编码映射表.md) ## 变更历史 | 版本 | 日期 | 说明 | |------|------|------| | v1.0 | 2025-10-19 | 初始实现,固定传"1" | | v1.1 | 2025-10-19 | 优化为从部门获取服务单编码 | --- **维护人**:系统开发团队 **最后更新**:2025-10-19