在急救转运任务成功同步到旧系统(创建ServiceOrder)后,再将任务同步为调度单(DispatchOrder),将返回的DispatchOrdID保存到sys_task_emergency表中。
创建急救转运任务
↓
同步到旧系统(admin_save_19.gds)
↓
获得ServiceOrdID,保存到legacy_service_ord_id
↓
同步调度单(admin_save_24.asp)
↓
获得DispatchOrdID,保存到legacy_dispatch_ord_id
在sys_task_emergency表中添加以下字段:
-- 旧系统调度单ID
ALTER TABLE sys_task_emergency
ADD COLUMN legacy_dispatch_ord_id BIGINT NULL COMMENT '旧系统调度单ID(DispatchOrdID)';
-- 调度单同步状态
ALTER TABLE sys_task_emergency
ADD COLUMN dispatch_sync_status TINYINT DEFAULT 0 COMMENT '调度单同步状态:0-未同步,1-同步中,2-同步成功,3-同步失败';
-- 调度单同步时间
ALTER TABLE sys_task_emergency
ADD COLUMN dispatch_sync_time DATETIME NULL COMMENT '调度单同步时间';
-- 调度单同步错误信息
ALTER TABLE sys_task_emergency
ADD COLUMN dispatch_sync_error_msg VARCHAR(500) NULL COMMENT '调度单同步错误信息';
根据ASP代码分析,主要参数包括:
| ASP参数 | 说明 | 数据来源 |
|---|---|---|
| DispatchOrdClass | 调度单类型 | sys_dept.dispatch_order_class |
| ServiceOrdID | 服务单ID | sys_task_emergency.legacy_service_ord_id |
| DispatchOrdTraSDTime | 拟出发时间 | sys_task.planned_start_time |
| DispatchOrdCarID | 派遣车辆ID | sys_task_vehicle → tb_vehicle_info.car_id |
| DispatchOrdCoName | 调度联系人姓名 | sys_task_emergency.patient_contact |
| DispatchOrdCoPhone | 调度联系人电话 | sys_task_emergency.patient_phone |
| DispatchOrdTraStreet | 实际出发地 | sys_task.departure_address |
| DispatchOrdTraEnd | 实际目的地 | sys_task.destination_address |
| DispatchOrd_Check | 操作命令 | 固定值"3"(直接强制完成) |
| DispatchOrdPerfomance | 订单绩效 | sys_task_emergency.transfer_price |
| DispatchOrd_NS_ID | 调度人员ID | sys_user.oa_user_id |
| DispatchOrd_NS_Time | 开单时间 | sys_task.create_time |
新增字段:
- legacyDispatchOrdId - 旧系统调度单ID
- dispatchSyncStatus - 调度单同步状态
- dispatchSyncTime - 调度单同步时间
- dispatchSyncErrorMsg - 调度单同步错误信息
新增方法:
```java
/**
* 同步调度单到旧系统(admin_save_24.asp)
*/
Long syncDispatchOrderToLegacy(Long taskId);
/**
* 批量同步未同步的调度单
*/
int batchSyncPendingDispatchOrders();
```
核心方法:
- syncDispatchOrderToLegacy() - 同步单个调度单
- buildDispatchOrderParams() - 构建调度单参数
- batchSyncPendingDispatchOrders() - 批量同步
同步逻辑:
1. 检查服务单是否已同步(必须先有ServiceOrdID)
2. 检查调度单是否已同步(避免重复)
3. 构建请求参数
4. 发送HTTP POST请求
5. 解析响应(格式:OK:DispatchOrdID)
6. 保存DispatchOrdID到数据库
新增配置:
```java
private String dispatchCreatePath = "/oldCode/admin_save_24.asp";
public String getDispatchCreateUrl() {
return baseUrl + dispatchCreatePath;
}
```
新增方法:java public void syncPendingDispatchOrders() { // 批量同步未同步的调度单 }
dispatch_sync_status状态值:
- 0 - 未同步
- 1 - 同步中
- 2 - 同步成功
- 3 - 同步失败
查询条件:sql -- 查询待同步调度单的任务 SELECT * FROM sys_task_emergency WHERE sync_status = 2 -- 服务单已同步 AND legacy_service_ord_id IS NOT NULL AND (dispatch_sync_status = 0 OR dispatch_sync_status = 3) LIMIT 100;
配置定时任务:
1. 进入「系统监控」→「定时任务」
2. 添加新任务:
- 任务名称:旧系统调度单同步
- 任务组名:DEFAULT
- 调用目标:legacySystemSyncTask.syncPendingDispatchOrders()
- cron表达式:0 0/10 * * * ?(每10分钟执行)
通过Service调用:
```java
@Autowired
private ILegacySystemSyncService legacySystemSyncService;
// 同步单个调度单
Long dispatchOrdId = legacySystemSyncService.syncDispatchOrderToLegacy(taskId);
// 批量同步
int successCount = legacySystemSyncService.batchSyncPendingDispatchOrders();
```
-- 查询调度单同步结果
SELECT
task_id,
legacy_service_ord_id,
legacy_dispatch_ord_id,
dispatch_sync_status,
dispatch_sync_time,
dispatch_sync_error_msg
FROM sys_task_emergency
WHERE dispatch_sync_status IS NOT NULL
ORDER BY id DESC;
-- 统计同步情况
SELECT
dispatch_sync_status,
COUNT(*) as count
FROM sys_task_emergency
WHERE legacy_service_ord_id IS NOT NULL
GROUP BY dispatch_sync_status;
// 1. 创建急救转运任务
SysTask task = createEmergencyTask(...);
// 2. 同步服务单到旧系统
Long serviceOrdId = legacySystemSyncService.syncEmergencyTaskToLegacy(task.getTaskId());
// 3. 同步调度单到旧系统(需要在服务单同步成功后)
if (serviceOrdId != null && serviceOrdId > 0) {
Long dispatchOrdId = legacySystemSyncService.syncDispatchOrderToLegacy(task.getTaskId());
}
定时任务1:同步服务单
- 调用:legacySystemSyncTask.syncPendingTasks()
- 频率:每10分钟
- 处理:未同步或同步失败的服务单
定时任务2:同步调度单
- 调用:legacySystemSyncTask.syncPendingDispatchOrders()
- 频率:每10分钟
- 处理:已同步服务单但未同步调度单的任务
错误1:服务单未同步 错误信息:服务单未同步,无法同步调度单 解决方案:先确保服务单同步成功
错误2:重复同步 处理逻辑:自动跳过已同步的调度单 日志:调度单已同步过,任务ID: xxx, DispatchOrdID: xxx
错误3:ASP接口返回错误 错误信息:旧系统返回无效的DispatchOrdID: {response} 解决方案:检查ASP接口日志,查看具体错误原因
# 查看同步日志
tail -f logs/sys-info.log | grep "调度单同步"
# 查看错误日志
tail -f logs/sys-error.log | grep "syncDispatchOrderToLegacy"
⚠️ 必须先同步服务单,再同步调度单
原因:调度单需要关联ServiceOrdID参数
必需字段:
- legacy_service_ord_id - 必须存在且大于0
- patient_contact - 联系人姓名(DispatchOrd_Check≠3时必填)
- patient_phone - 联系人电话(DispatchOrd_Check≠3时必填)
可选字段:
- planned_start_time - 拟出发时间
- transfer_price - 订单绩效
步骤1:创建测试任务sql -- 确保任务已同步服务单 SELECT task_id, legacy_service_ord_id, sync_status FROM sys_task_emergency WHERE sync_status = 2 LIMIT 1;
步骤2:手动触发同步java Long dispatchOrdId = legacySystemSyncService.syncDispatchOrderToLegacy(taskId);
步骤3:验证结果sql SELECT task_id, legacy_service_ord_id, legacy_dispatch_ord_id, dispatch_sync_status, dispatch_sync_error_msg FROM sys_task_emergency WHERE task_id = {taskId};
| 字段 | 预期值 |
|---|---|
| legacy_dispatch_ord_id | > 0 |
| dispatch_sync_status | 2(同步成功) |
| dispatch_sync_time | 当前时间 |
| dispatch_sync_error_msg | NULL |
SysTaskEmergency.java - 新增字段SysTaskEmergencyMapper.java - 新增查询方法SysTaskEmergencyMapper.xml - 新增SQL语句ILegacySystemSyncService.java - 新增接口方法LegacySystemSyncServiceImpl.java - 实现调度单同步逻辑LegacySystemConfig.java - 新增配置项LegacySystemSyncTask.java - 新增定时任务方法add_legacy_dispatch_ord_id.sql - 数据库变更脚本旧系统调度单同步功能说明.md - 本文档sys_task_vehicle表查询车辆,获取car_id填充DispatchOrdCarID参数版本:v1.0
日期:2025-10-20
作者:Qoder AI