-- ========================================== -- 任务附件同步定时任务配置脚本 -- ========================================== -- -- 功能说明: -- 将已同步调度单的任务附件同步到旧系统ImageData表 -- -- 使用场景: -- 1. 新系统上传了任务附件 -- 2. 任务的调度单已成功同步到旧系统 -- 3. 附件需要同步到旧系统以便旧系统查看 -- -- 同步条件: -- 1. 任务类型为急救转运 (task_type = 'EMERGENCY_TRANSFER') -- 2. 调度单已同步成功 (dispatch_sync_status = 2) -- 3. 有调度单ID和服务单ID (legacy_dispatch_ord_id IS NOT NULL AND legacy_service_ord_id IS NOT NULL) -- 4. 附件未同步 (synced_to_image_data = 0 OR synced_to_image_data IS NULL) -- -- 执行频率建议: -- - 生产环境: 每5分钟执行一次 (0 0/5 * * * ?) -- - 测试环境: 每2分钟执行一次 (0 0/2 * * * ?) -- -- 注意事项: -- 1. 依赖调度单同步完成 -- 2. 会上传文件并生成缩略图 -- 3. 附件分类映射见TaskAttachmentSyncServiceImpl类 -- ========================================== -- 插入定时任务配置 INSERT INTO `sys_job` ( `job_name`, `job_group`, `invoke_target`, `cron_expression`, `misfire_policy`, `concurrent`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark` ) VALUES ( '任务附件同步', 'DEFAULT', 'legacySystemSyncTask.syncPendingAttachments()', '0 0/5 * * * ?', '2', '1', '0', 'admin', NOW(), 'admin', NOW(), '将已同步调度单的任务附件同步到旧系统ImageData表,每5分钟执行一次。同步条件:调度单已同步、附件未同步、有服务单和调度单ID。' ); -- ========================================== -- 验证查询 -- ========================================== -- 1. 查看定时任务是否添加成功 SELECT job_id, job_name, job_group, invoke_target, cron_expression, CASE status WHEN '0' THEN '正常' WHEN '1' THEN '暂停' END AS job_status, remark FROM sys_job WHERE job_name = '任务附件同步'; -- 2. 查看需要同步的附件数量 SELECT COUNT(*) AS total_attachments, SUM(CASE WHEN a.attachment_category = '1' THEN 1 ELSE 0 END) AS consent_form, SUM(CASE WHEN a.attachment_category = '2' THEN 1 ELSE 0 END) AS patient_data, SUM(CASE WHEN a.attachment_category = '3' THEN 1 ELSE 0 END) AS operation_record, SUM(CASE WHEN a.attachment_category = '4' THEN 1 ELSE 0 END) AS before_departure, SUM(CASE WHEN a.attachment_category = '5' THEN 1 ELSE 0 END) AS after_departure, SUM(CASE WHEN a.attachment_category = '6' THEN 1 ELSE 0 END) AS seat_belt FROM sys_task_attachment a INNER JOIN sys_task t ON a.task_id = t.task_id INNER JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_type = 'EMERGENCY_TRANSFER' AND e.dispatch_sync_status = 2 AND e.legacy_dispatch_ord_id IS NOT NULL AND e.legacy_service_ord_id IS NOT NULL AND (a.synced_to_image_data = 0 OR a.synced_to_image_data IS NULL); -- 3. 查看待同步附件详情(最近10条) SELECT a.attachment_id, t.task_code, a.file_name, CASE a.attachment_category WHEN '1' THEN '知情同意书' WHEN '2' THEN '病人资料' WHEN '3' THEN '操作记录' WHEN '4' THEN '出车前' WHEN '5' THEN '出车后' WHEN '6' THEN '系安全带' ELSE '未分类' END AS category_name, e.legacy_service_ord_id, e.legacy_dispatch_ord_id, a.upload_time, a.synced_to_image_data, a.sync_time FROM sys_task_attachment a INNER JOIN sys_task t ON a.task_id = t.task_id INNER JOIN sys_task_emergency e ON t.task_id = e.task_id WHERE t.task_type = 'EMERGENCY_TRANSFER' AND e.dispatch_sync_status = 2 AND e.legacy_dispatch_ord_id IS NOT NULL AND e.legacy_service_ord_id IS NOT NULL AND (a.synced_to_image_data = 0 OR a.synced_to_image_data IS NULL) ORDER BY a.upload_time DESC LIMIT 10; -- 4. 查看已同步附件统计 SELECT COUNT(*) AS synced_attachments, MIN(a.sync_time) AS first_sync_time, MAX(a.sync_time) AS last_sync_time FROM sys_task_attachment a WHERE a.synced_to_image_data = 1 AND a.sync_time IS NOT NULL; -- 5. 按任务统计待同步附件 SELECT t.task_id, t.task_code, e.legacy_service_ord_id, e.legacy_dispatch_ord_id, COUNT(a.attachment_id) AS attachment_count, GROUP_CONCAT( CASE a.attachment_category WHEN '1' THEN '知情同意书' WHEN '2' THEN '病人资料' WHEN '3' THEN '操作记录' WHEN '4' THEN '出车前' WHEN '5' THEN '出车后' WHEN '6' THEN '系安全带' END SEPARATOR ', ' ) AS categories FROM sys_task t INNER JOIN sys_task_emergency e ON t.task_id = e.task_id INNER JOIN sys_task_attachment a ON t.task_id = a.task_id WHERE t.task_type = 'EMERGENCY_TRANSFER' AND e.dispatch_sync_status = 2 AND e.legacy_dispatch_ord_id IS NOT NULL AND e.legacy_service_ord_id IS NOT NULL AND (a.synced_to_image_data = 0 OR a.synced_to_image_data IS NULL) GROUP BY t.task_id, t.task_code, e.legacy_service_ord_id, e.legacy_dispatch_ord_id ORDER BY attachment_count DESC; -- ========================================== -- 附件分类映射规则参考 -- ========================================== /* 附件分类 -> ImageData类型: 1-知情同意书 -> ImageType: 1 2-病人资料 -> ImageType: 2 3-操作记录 -> ImageType: 3 4-出车前 -> ImageType: 4 5-出车后 -> ImageType: 5 6-系安全带 -> ImageType: 6 详细说明见: com.ruoyi.system.service.impl.TaskAttachmentSyncServiceImpl.getImageTypeByCategory() */ -- ========================================== -- 同步流程说明 -- ========================================== /* 1. 查询待同步附件列表(符合条件的附件) 2. 按任务分组,获取服务单ID、调度单ID、创建人OA用户ID 3. 读取本地附件文件 4. 上传到文件服务器并生成缩略图 5. 将附件信息写入旧系统ImageData表 - DOrdIDDt: 调度单ID - SOrdIDDt: 服务单ID - ImageType: 附件分类对应的类型 - ImageUrl: 原图路径 - ImageUrls: 缩略图路径 - UpImageTime: 上传时间 - UpImageOAid: 上传者OA用户ID 6. 更新附件同步状态 - synced_to_image_data = 1 - sync_time = 当前时间 - image_data_id = ImageData表ID */ -- ========================================== -- 手动触发测试 -- ========================================== /* -- 在定时任务管理页面手动执行一次任务,或者在代码中调用: -- legacySystemSyncTask.syncPendingAttachments() -- 查看同步日志(需要查看应用日志文件) */ -- ========================================== -- 故障排查SQL -- ========================================== -- 查看同步失败的附件(如果有错误记录) SELECT a.attachment_id, t.task_code, a.file_name, a.file_path, a.upload_time, a.synced_to_image_data, a.sync_time FROM sys_task_attachment a INNER JOIN sys_task t ON a.task_id = t.task_id WHERE a.synced_to_image_data = 0 AND a.upload_time < DATE_SUB(NOW(), INTERVAL 1 HOUR) ORDER BY a.upload_time DESC; -- 查看某个任务的所有附件同步状态 -- SELECT -- a.attachment_id, -- a.file_name, -- a.attachment_category, -- a.synced_to_image_data, -- a.sync_time, -- a.image_data_id -- FROM sys_task_attachment a -- WHERE a.task_id = ? -- 替换为具体的任务ID -- ORDER BY a.upload_time DESC;