wlzboy
1 天以前 08f95b2f159b56fa3bd4f4b348855989de8aa456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
-- 旧系统调度单同步定时任务配置SQL
-- 在sys_job表中添加定时任务
 
-- 调度单自动同步到旧系统(必须在服务单同步成功后执行)
INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark)
VALUES 
('旧系统调度单同步', 'DEFAULT', 'legacySystemSyncTask.syncPendingDispatchOrders', '0 0/10 * * * ?', '3', '1', '0', 'admin', sysdate(), 
'每10分钟自动同步未同步的调度单到旧系统(admin_save_24.asp)。同步条件:服务单已同步成功且调度单未同步。');
 
-- 说明:
-- job_name: 任务名称 - 旧系统调度单同步
-- job_group: 任务组名(DEFAULT为默认组)
-- invoke_target: 调用目标字符串(Bean名称.方法名)
--   - legacySystemSyncTask.syncPendingDispatchOrders() 批量同步未同步的调度单
-- cron_expression: cron表达式
--   - '0 0/10 * * * ?' = 每10分钟执行一次(推荐)
--   - '0 0/5 * * * ?' = 每5分钟执行一次
--   - '0 0/15 * * * ?' = 每15分钟执行一次
--   - '0 0/30 * * * ?' = 每30分钟执行一次
-- misfire_policy: 错过执行策略
--   - 1=立即执行
--   - 2=执行一次
--   - 3=放弃执行(推荐)
-- concurrent: 是否并发
--   - 0=允许并发
--   - 1=禁止并发(推荐,避免重复同步)
-- status: 状态
--   - 0=正常(启用)
--   - 1=暂停(停用)
-- create_by: 创建者
-- create_time: 创建时间
-- remark: 备注说明
 
-- 同步依赖关系:
-- 1. 必须先执行服务单同步(legacySystemSyncTask.syncPendingTasks)
-- 2. 服务单同步成功后(sync_status = 2, legacy_service_ord_id IS NOT NULL)
-- 3. 才能执行调度单同步(syncPendingDispatchOrders)
 
-- 定时任务执行逻辑:
-- 1. 查询条件:
--    - sync_status = 2(服务单已同步成功)
--    - legacy_service_ord_id IS NOT NULL(有ServiceOrdID)
--    - dispatch_sync_status IN (0, 3)(调度单未同步或同步失败)
-- 2. 逐个调用旧系统接口 admin_save_24.asp
-- 3. 每个请求间隔1秒,避免并发过高
-- 4. 更新 dispatch_sync_status 和 legacy_dispatch_ord_id
-- 5. 记录错误信息到 dispatch_sync_error_msg 字段
 
-- 监控查询:
-- 查看待同步调度单的任务数:
SELECT COUNT(*) AS pending_dispatch_count
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);
 
-- 查看今日调度单同步统计:
SELECT 
    dispatch_sync_status,
    CASE dispatch_sync_status
        WHEN 0 THEN '未同步'
        WHEN 1 THEN '同步中'
        WHEN 2 THEN '同步成功'
        WHEN 3 THEN '同步失败'
    END AS status_name,
    COUNT(*) AS count
FROM sys_task_emergency
WHERE DATE(create_time) = CURDATE()
  AND legacy_service_ord_id IS NOT NULL
GROUP BY dispatch_sync_status;
 
-- 查看同步失败的调度单详情:
SELECT 
    task_id,
    legacy_service_ord_id,
    dispatch_sync_status,
    dispatch_sync_time,
    dispatch_sync_error_msg
FROM sys_task_emergency
WHERE dispatch_sync_status = 3
ORDER BY id DESC
LIMIT 20;
 
-- 完整同步流程统计:
SELECT 
    CASE 
        WHEN sync_status != 2 THEN '1.服务单未同步'
        WHEN legacy_service_ord_id IS NULL THEN '2.服务单ID为空'
        WHEN dispatch_sync_status = 0 THEN '3.调度单待同步'
        WHEN dispatch_sync_status = 1 THEN '4.调度单同步中'
        WHEN dispatch_sync_status = 2 THEN '5.调度单同步成功'
        WHEN dispatch_sync_status = 3 THEN '6.调度单同步失败'
        ELSE '7.未知状态'
    END AS sync_stage,
    COUNT(*) AS count
FROM sys_task_emergency
WHERE DATE(create_time) = CURDATE()
GROUP BY sync_stage
ORDER BY sync_stage;
 
-- 使用建议:
-- 1. 调度单同步应在服务单同步任务之后执行(时间错开5分钟)
-- 2. 如服务单每10分钟同步,调度单可在每10分钟的第5分钟同步
--    例如:服务单 '0 0/10 * * * ?',调度单 '0 5/10 * * * ?'
-- 3. 生产环境建议每10-15分钟执行一次
-- 4. 可通过修改 legacy.system.enabled=false 临时禁用所有同步功能
 
-- 错误处理:
-- 1. 如果调度单同步失败次数过多,检查:
--    - ASP接口 admin_save_24.asp 是否正常
--    - ServiceOrdID 是否有效
--    - 联系人和电话是否缺失
-- 2. 可通过定时任务日志查看详细错误:
--    系统监控 -> 定时任务 -> 调度日志