实现从旧系统同步任务状态到新系统,确保新旧系统的任务状态保持一致。当旧系统操作人员更新调度单状态后,新系统能够自动获取最新状态并更新本地任务。
| 旧系统状态 | 状态码 | 新系统状态 | 说明 |
|---|---|---|---|
| 新调度单(未下发) | 0 | PENDING | 待处理 |
| 完全未确认 | 1 | PENDING | 待处理 |
| 部分已确认 | 2 | PENDING | 待处理 |
| 未出车 | 3 | PENDING | 待处理 |
| 已出车(去接患者途中) | 4 | DEPARTING | 出发中 |
| 已出车(等待患者) | 5 | ARRIVED | 已到达 |
| 已出车(服务中) | 6 | IN_PROGRESS | 任务中 |
| 已送达(回程中) | 7 | RETURNING | 返程中 |
| 已返回 | 8 | COMPLETED | 已完成 |
| 跑空单,已返回 | 9 | COMPLETED | 已完成 |
| 取消 | 10 | CANCELLED | 已取消 |
| 已提交,等待审核 | 11 | PENDING | 待处理 |
| 审核完成 | 12 | PENDING | 待处理 |
| 审核不通过 | 13 | CANCELLED | 已取消 |
| 已驻点 | 14 | ARRIVED | 已到达 |
TaskStatusConverter.javaruoyi-system/src/main/java/com/ruoyi/system/utils/// 使用示例
TaskStatus newStatus = TaskStatusConverter.convertFromLegacyStatus(4);
// 返回: TaskStatus.DEPARTING
Integer legacyCode = TaskStatusConverter.convertToLegacyStatus(TaskStatus.DEPARTING);
// 返回: 4
String description = TaskStatusConverter.getLegacyStatusDescription(4);
// 返回: "已出车(去接患者途中)"
ILegacySystemSyncService.javaLegacySystemSyncServiceImpl.javasyncTaskStatusFromLegacy(Long taskId): 同步单个任务状态batchSyncTaskStatusFromLegacy(): 批量同步任务状态LegacySystemSyncTask.javaruoyi-quartz/src/main/java/com/ruoyi/quartz/task/syncTaskStatusFromLegacy()# application.yml
legacy:
system:
base-url: http://legacy-system.com
status-query-path: /task_status_query.asp # 新增状态查询接口路径
enabled: true
执行SQL脚本: sql/legacy_status_sync_job.sql
-- 任务配置
任务名称: 任务状态同步
调用目标: legacySystemSyncTask.syncTaskStatusFromLegacy()
Cron表达式: 0 0/5 * * * ? (每5分钟执行一次)
graph TB
A[定时任务启动] --> B[查询需同步任务]
B --> C{是否有任务}
C -->|是| D[遍历任务列表]
C -->|否| E[结束]
D --> F[查询旧系统状态]
F --> G{查询成功?}
G -->|是| H[状态码转换]
G -->|否| I[记录错误日志]
H --> J{状态是否变化?}
J -->|是| K[更新任务状态]
J -->|否| L[跳过更新]
K --> M[设置时间戳]
M --> N[保存任务]
L --> D
N --> D
I --> D
D --> O{是否完成}
O -->|否| D
O -->|是| P[统计同步结果]
P --> E
<!-- 查询已同步调度单且状态未完成的任务 -->
<select id="selectSyncedTasksForStatusUpdate" resultMap="SysTaskEmergencyResult">
SELECT * FROM sys_task_emergency
WHERE dispatch_sync_status = 2
AND legacy_dispatch_ord_id IS NOT NULL
AND task_id IN (
SELECT task_id FROM sys_task
WHERE task_status NOT IN ('COMPLETED', 'CANCELLED')
AND del_flag = '0'
)
ORDER BY id ASC
LIMIT 200
</select>
# 重新编译项目
mvn clean package
# 重启应用
./ry.sh restart
确保旧系统提供状态查询接口,接口规范:
- URL: /task_status_query.asp
- 方法: POST
- 参数: DispatchOrdID (调度单ID)
- 响应格式:
- 成功: OK:状态码 (如: OK:4)
- 失败: ERROR:错误信息
执行SQL脚本:bash mysql -u root -p your_database < sql/legacy_status_sync_job.sql
或在系统管理界面手动添加:
1. 登录系统管理后台
2. 进入 系统管理 -> 定时任务
3. 点击 新增
4. 填写任务信息:
- 任务名称: 任务状态同步
- 调用目标字符串: legacySystemSyncTask.syncTaskStatusFromLegacy()
- Cron表达式: 0 0/5 * * * ?
- 状态: 正常
5. 保存并启动任务
// 在定时任务管理页面点击"执行一次"按钮
// 或在代码中调用
@Autowired
private ILegacySystemSyncService legacySystemSyncService;
// 同步单个任务
boolean success = legacySystemSyncService.syncTaskStatusFromLegacy(taskId);
// 批量同步
int count = legacySystemSyncService.batchSyncTaskStatusFromLegacy();
-- 查看最近同步的任务
SELECT
t.task_id,
t.task_code,
t.task_status,
e.legacy_dispatch_ord_id,
t.update_time
FROM sys_task t
INNER JOIN sys_task_emergency e ON t.task_id = e.task_id
WHERE e.dispatch_sync_status = 2
ORDER BY t.update_time DESC
LIMIT 20;
# 查看应用日志
tail -f logs/sys-info.log | grep "任务状态同步"
任务需要满足以下所有条件才会被同步:
1. ✅ 调度单已同步成功 (dispatch_sync_status = 2)
2. ✅ 存在旧系统调度单ID (legacy_dispatch_ord_id IS NOT NULL)
3. ✅ 任务状态未完成 (task_status NOT IN ('COMPLETED', 'CANCELLED'))
4. ✅ 任务未删除 (del_flag = '0')
DEPARTING/ARRIVED/IN_PROGRESS: 设置 actual_start_timeCOMPLETED/CANCELLED: 设置 actual_start_time 和 actual_end_time可能原因:
1. 定时任务未启动
2. 旧系统接口不可用
3. 任务不满足同步条件
排查步骤:
```sql
-- 1. 检查定时任务状态
SELECT * FROM sys_job WHERE job_name = '任务状态同步';
-- 2. 检查任务同步状态
SELECT
e.task_id,
e.dispatch_sync_status,
e.legacy_dispatch_ord_id,
t.task_status
FROM sys_task_emergency e
INNER JOIN sys_task t ON e.task_id = t.task_id
WHERE e.task_id = 'YOUR_TASK_ID';
-- 3. 查看错误日志
-- tail -f logs/sys-error.log | grep "状态同步"
```
解决方案:
检查 TaskStatusConverter.java 的映射规则是否正确
优化建议:
- 调整定时任务执行频率
- 减少每批查询的任务数量
- 增加请求间隔时间