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

旧系统同步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依赖:

@Autowired
private SysDeptMapper sysDeptMapper;

2. 导入部门实体

import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.system.mapper.SysDeptMapper;

3. 查询逻辑

  1. 检查任务是否有部门ID
  • 有:继续查询部门信息
  • 无:使用默认值"1",记录警告日志
  1. 查询部门信息
  • 成功:获取部门的serviceOrderClass字段
  • 失败:使用默认值"1",记录错误日志
  1. 检查编码是否存在
  • 存在:使用该编码值
  • 不存在:使用默认值"1",记录警告日志
  1. 异常处理
  • 捕获所有异常,使用默认值"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. 任务归属部门

创建任务时确保设置了正确的归属部门:

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"
- 日志显示未关联部门警告

相关文档

变更历史

版本 日期 说明
v1.0 2025-10-19 初始实现,固定传"1"
v1.1 2025-10-19 优化为从部门获取服务单编码

维护人:系统开发团队
最后更新:2025-10-19