package com.ruoyi.system.service.impl; import java.util.Date; import java.util.List; import com.ruoyi.common.utils.LongUtil; import com.ruoyi.system.domain.*; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.*; import com.ruoyi.system.task.ITaskAttachmentService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import com.ruoyi.common.config.LegacySystemConfig; /** * 旧系统同步Service业务层处理 * * @author ruoyi * @date 2024-01-20 */ @Service public class LegacySystemSyncServiceImpl implements ILegacySystemSyncService { private static final Logger log = LoggerFactory.getLogger(LegacySystemSyncServiceImpl.class); @Autowired private LegacySystemConfig legacyConfig; @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private SysDeptMapper sysDeptMapper; @Autowired private SysTaskVehicleMapper sysTaskVehicleMapper; @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; @Autowired private VehicleInfoMapper vehicleInfoMapper; @Autowired private IDispatchOrdService dispatchOrdService; @Autowired private ISysTaskEmergencyService sysTaskEmergencyService; @Autowired private ITaskAttachmentSyncService taskAttachmentSyncService; @Autowired private ISysTaskService sysTaskService; @Autowired private ITaskAttachmentService taskAttachmentService; @Autowired private ApplicationEventPublisher eventPublisher; @Autowired private LegacyTransferSyncMapper legacyTransferSyncMapper; @Autowired private TaskEmergencySyncService taskEmergencySyncService; @Autowired private ITaskDispatchSyncService taskDispatchSyncService; @Override public Long syncEmergencyTaskToLegacy(Long taskId) { return taskEmergencySyncService.syncEmergency(taskId); } /** * 批量同步未同步的急救转运任务 * 使用分页查询,确保所有符合条件的任务都能被同步 */ @Override public int batchSyncPendingTasks() { if (!legacyConfig.isEnabled()) { log.info("旧系统同步已禁用"); return 0; } try { int totalSuccessCount = 0; int pageSize = 100; // 每页100条 int offset = 0; while (true) { // 分页查询未同步的急救转运任务(同步状态为0或3的任务) List pendingTasks = sysTaskEmergencyService.selectPendingSyncTasks(offset, pageSize); if (pendingTasks == null || pendingTasks.isEmpty()) { log.info("没有更多需要同步的任务,offset: {}", offset); break; // 没有更多数据,退出循环 } // log.info("开始同步第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size()); int pageSuccessCount = 0; for (SysTaskEmergency emergency : pendingTasks) { Long serviceOrdId = syncEmergencyTaskToLegacy(emergency.getTaskId()); if (LongUtil.isNotEmpty(serviceOrdId)) { pageSuccessCount++; } // 避免过于频繁的请求 try { Thread.sleep(1000); // 每个请求间隔1秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("同步被中断"); return totalSuccessCount + pageSuccessCount; } } totalSuccessCount += pageSuccessCount; // log.info("第 {} 页同步完成,总数: {}, 成功: {}", // (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount); // 如果本页数据少于每页大小,说明已经是最后一页 if (pendingTasks.size() < pageSize) { // log.info("已到达最后一页,同步结束"); break; } offset += pageSize; // 下一页 } // log.info("批量同步完成,总成功数: {}", totalSuccessCount); return totalSuccessCount; } catch (Exception e) { log.error("批量同步任务异常", e); return 0; } } /** * 重新同步失败的任务 */ @Override public boolean retrySyncTask(Long taskId) { try { // 重置同步状态 SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if (emergency != null) { emergency.setSyncStatus(0); // 重置为未同步 emergency.setLegacyServiceOrdId(null); emergency.setSyncErrorMsg(null); sysTaskEmergencyService.updateSysTaskEmergency(emergency); } // 重新同步 Long serviceOrdId = syncEmergencyTaskToLegacy(taskId); return LongUtil.isNotEmpty(serviceOrdId); } catch (Exception e) { log.error("重新同步任务失败,任务ID: {}", taskId, e); return false; } } @Override public Long syncDispatchOrderToLegacy(Long taskId) { return taskDispatchSyncService.syncDispatch(taskId); } /** * 同步任务附件到旧系统 * @param taskAttachments * @param serviceOrdId * @param dispatchOrdId * @param oaUserID */ public void syncAttachmentToLegacy(List taskAttachments, Long serviceOrdId,Long dispatchOrdId,Integer oaUserID) { taskAttachments.forEach((taskAttachment)->{ Long imageDataId= taskAttachmentSyncService.syncAttachmentToImageData(taskAttachment,serviceOrdId,dispatchOrdId,oaUserID); if (imageDataId != null && imageDataId > 0) { taskAttachment.setSyncedToImageData(1); taskAttachment.setSyncTime(new Date()); taskAttachment.setImageDataId(imageDataId); taskAttachmentService.updateAttachment(taskAttachment); } }); } @Override public void syncTaskAttachment(Long taskId, Long dispatchOrdId, Long serviceOrdId, Integer oaUserID){ List taskAttachments= sysTaskService.getAttachmentsByTaskId(taskId); if (taskAttachments != null && !taskAttachments.isEmpty()) { //同步附件 this.syncAttachmentToLegacy(taskAttachments,serviceOrdId,dispatchOrdId,oaUserID); } } /** * 批量同步未同步的调度单 * 使用分页查询,确保所有符合条件的任务都能被同步 */ @Override public int batchSyncPendingDispatchOrders() { if (!legacyConfig.isEnabled()) { log.info("旧系统同步已禁用"); return 0; } try { int totalSuccessCount = 0; int pageSize = 100; // 每页100条 int offset = 0; while (true) { // 分页查询已同步服务单但未同步调度单的任务 List pendingTasks = sysTaskEmergencyService.selectPendingDispatchSyncTasks(offset, pageSize); // log.info("查询到未同步调度单的任务数量: {}", pendingTasks.size()); if (pendingTasks == null || pendingTasks.isEmpty()) { log.info("没有更多需要同步调度单的任务,offset: {}", offset); break; // 没有更多数据,退出循环 } // log.info("开始同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, pendingTasks.size()); int pageSuccessCount = 0; for (SysTaskEmergency emergency : pendingTasks) { // log.info("开始同步调度单,任务ID: {}", emergency.getTaskId()); Long dispatchOrdId = syncDispatchOrderToLegacy(emergency.getTaskId()); if (dispatchOrdId != null && dispatchOrdId > 0) { pageSuccessCount++; } // 避免过于频繁的请求 try { Thread.sleep(1000); // 每个请求间隔1秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("同步调度单被中断"); return totalSuccessCount + pageSuccessCount; } } totalSuccessCount += pageSuccessCount; // log.info("调度单第 {} 页同步完成,总数: {}, 成功: {}", // (offset / pageSize) + 1, pendingTasks.size(), pageSuccessCount); // 如果本页数据少于每页大小,说明已经是最后一页 if (pendingTasks.size() < pageSize) { // log.info("已到达最后一页,调度单同步结束"); break; } offset += pageSize; // 下一页 } // log.info("批量同步调度单完成,总成功数: {}", totalSuccessCount); return totalSuccessCount; } catch (Exception e) { log.error("批量同步调度单异常", e); return 0; } } @Override public boolean resyncDispatchOrderToLegacy(Long taskId) { SysTaskEmergency emergency=sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); Long dispatchOrderId = emergency.getLegacyDispatchOrdId(); if(LongUtil.isEmpty(dispatchOrderId)){ Long serviceOrderId= taskEmergencySyncService.syncEmergency(taskId); if(LongUtil.isNotEmpty(serviceOrderId)) { emergency.setNeedResync(0); // emergency.setSyncStatus(2); emergency.setSyncTime(new Date()); sysTaskEmergencyService.updateSysTaskEmergency(emergency); return true; } return false; }else { return taskDispatchSyncService.resyncDispatchOrderToLegacy(taskId); } } /** * 批量重新同步需要更新的调度单 */ @Override public int batchResyncPendingDispatchOrders() { if (!legacyConfig.isEnabled()) { log.info("旧系统同步已禁用"); return 0; } try { int totalSuccessCount = 0; int pageSize = 100; // 每页100条 int offset = 0; while (true) { // 分页查询需要重新同步的任务 List needResyncTasks = sysTaskEmergencyMapper.selectNeedResyncTasks(offset, pageSize); // log.info("查询到需要重新同步的任务数量: {}", needResyncTasks.size()); if (needResyncTasks == null || needResyncTasks.isEmpty()) { log.info("没有更多需要重新同步的任务,offset: {}", offset); break; // 没有更多数据,退出循环 } // log.info("开始重新同步调度单第 {} 页,任务数量: {}", (offset / pageSize) + 1, needResyncTasks.size()); int pageSuccessCount = 0; for (SysTaskEmergency emergency : needResyncTasks) { Long dispatchOrdId = emergency.getLegacyDispatchOrdId(); Long taskId = emergency.getTaskId(); if (LongUtil.isEmpty(dispatchOrdId)) { //没有调度单,我们就调用创建调度单 Long serviceOrderId = syncDispatchOrderToLegacy(taskId); if (LongUtil.isNotEmpty(serviceOrderId)) { emergency.setNeedResync(0); emergency.setDispatchSyncTime(new Date()); emergency.setDispatchSyncErrorMsg(null); sysTaskEmergencyService.updateSysTaskEmergency(emergency); continue; } // log.info("开始重新同步调度单,任务ID: {}", emergency.getTaskId()); boolean success = resyncDispatchOrderToLegacy(emergency.getTaskId()); if (success) { pageSuccessCount++; } // 避免过于频繁的请求 try { Thread.sleep(1000); // 每个请求间隔1秒 } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("重新同步调度单被中断"); return totalSuccessCount + pageSuccessCount; } } totalSuccessCount += pageSuccessCount; // log.info("调度单重新同步第 {} 页完成,总数: {}, 成功: {}", // (offset / pageSize) + 1, needResyncTasks.size(), pageSuccessCount); // 如果本页数据少于每页大小,说明已经是最后一页 if (needResyncTasks.size() < pageSize) { // log.info("已到达最后一页,调度单重新同步结束"); break; } offset += pageSize; // 下一页 } } // log.info("批量重新同步调度单完成,总成功数: {}", totalSuccessCount); return totalSuccessCount; } catch (Exception e) { log.error("批量重新同步调度单异常", e); return 0; } } }