package com.ruoyi.system.service.impl; import com.ruoyi.common.config.LegacySystemConfig; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.LongUtil; import com.ruoyi.common.utils.MapValueUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskAssignee; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.SysTaskVehicle; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.event.TaskDispatchSyncEvent; import com.ruoyi.system.mapper.*; import com.ruoyi.system.service.ISysTaskEmergencyService; import com.ruoyi.system.service.ITaskDispatchSyncService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.Date; import java.util.List; import java.util.Map; /** * 同步新系统中的调度到旧系统中 */ @Slf4j @Service public class TaskDispatchSyncServiceImpl implements ITaskDispatchSyncService { @Autowired private ApplicationEventPublisher eventPublisher; @Override public Long syncDispatch(Long taskId) { return this.syncDispatchOrderToLegacy(taskId); } @Autowired private LegacySystemConfig legacyConfig; @Autowired private ISysTaskEmergencyService sysTaskEmergencyService; @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskVehicleMapper sysTaskVehicleMapper; @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private LegacyTransferSyncMapper legacyTransferSyncMapper; @Autowired private TaskSyncUtilService taskSyncUtilService; @Autowired private TaskDispatchSyncUtilService taskDispatchSyncUtilService; /** * 重新同步车辆和人员变更的任务到旧系统 * 当任务的车辆信息或人员信息发生变更时,需要调用旧系统接口重新同步 * 使用 admin_save_25.asp 接口,而不是 admin_save_24.gds */ @Override public boolean resyncDispatchOrderToLegacy(Long taskId) { if (!legacyConfig.isEnabled()) { log.info("旧系统同步已禁用,跳过调度单重新同步,任务ID: {}", taskId); return false; } try { // 查询任务信息 SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task == null) { log.error("任务不存在,任务ID: {}", taskId); return false; } // 只同步急救转运任务 if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) { log.info("非急救转运任务,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 查询急救转运扩展信息 SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if (emergency == null) { log.error("急救转运扩展信息不存在,任务ID: {}", taskId); return false; } // 必须已经同步过调度单 if (emergency.getLegacyDispatchOrdId() == null || emergency.getLegacyDispatchOrdId() <= 0) { log.warn("调度单未同步,无法重新同步,任务ID: {}", taskId); return false; } Long serviceOrdId = emergency.getLegacyServiceOrdId(); if (serviceOrdId == null || serviceOrdId <= 0) { log.warn("服务单未同步,无法重新同步调度单,任务ID: {}", taskId); return false; } // ====== 前置校验:确保任务数据完整 ====== // 1. 检查是否已分配车辆 List taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); if (taskVehicles == null || taskVehicles.isEmpty()) { log.warn("任务未分配车辆,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 2. 检查是否已分配执行人员 List taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); if (taskAssignees == null || taskAssignees.isEmpty()) { log.warn("任务未分配执行人员,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 3. 检查预约时间是否有效 if (task.getPlannedStartTime() == null || task.getPlannedStartTime().getTime() <= 0L) { log.warn("任务预约时间无效,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 4. 检查转出医院信息 if (StringUtils.isEmpty(emergency.getHospitalOutName()) || StringUtils.isEmpty(emergency.getHospitalOutAddress())) { log.warn("任务转出医院信息不完整,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 5. 检查转入医院信息 if (StringUtils.isEmpty(emergency.getHospitalInName()) || StringUtils.isEmpty(emergency.getHospitalInAddress())) { log.warn("任务转入医院信息不完整,跳过调度单重新同步,任务ID: {}", taskId); return false; } // 6. 检查患者基本信息 if (StringUtils.isEmpty(emergency.getPatientName()) || StringUtils.isEmpty(emergency.getPatientPhone())) { log.warn("任务患者信息不完整,跳过调度单重新同步,任务ID: {}", taskId); return false; } log.info("任务数据校验通过,开始重新同步调度单,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); // 构建请求参数(使用相同的参数构建方法) Map params = taskDispatchSyncUtilService.buildDispatchOrderParams(task, emergency); params.put("DispatchOrdID", emergency.getLegacyDispatchOrdId().toString()); params.put("ServiceOrdID", emergency.getLegacyServiceOrdId().toString()); params.put("DispatchOrdState", "3"); log.info("重新同步调度单到旧系统请求参数: {}", params); // 发送HTTP请求到旧系统(使用admin_save_25.asp接口) String response =taskSyncUtilService.sendHttpPost(legacyConfig.getDispatchUpdateUrl(), params); log.info("重新同步调度单到旧系统响应: ServiceOrdID:{},DispatchOrdId:{},Result: {}",emergency.getLegacyServiceOrdId(),emergency.getLegacyDispatchOrdId(), response); // 解析响应 // Long dispatchOrdId = parseResponse(response); if (response != null && response.equals("OK")) { // 重新同步成功,清除重新同步标记 emergency.setNeedResync(0); emergency.setDispatchSyncTime(new Date()); emergency.setDispatchSyncErrorMsg(null); sysTaskEmergencyService.updateSysTaskEmergency(emergency); // log.info("调度单重新同步成功,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); return true; } else { // 重新同步失败 emergency.setDispatchSyncErrorMsg("重新同步失败:" + response); sysTaskEmergencyService.updateSysTaskEmergency(emergency); log.error("调度单重新同步失败,任务ID: {}, 响应: {}", taskId, response); return false; } } catch (Exception e) { log.error("重新同步调度单到旧系统异常,任务ID: {}", taskId, e); // 更新同步状态为失败 try { SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if (emergency != null) { emergency.setDispatchSyncErrorMsg("重新同步异常: " + e.getMessage()); sysTaskEmergencyService.updateSysTaskEmergency(emergency); } } catch (Exception ex) { log.error("更新调度单同步状态失败", ex); } return false; } } public Map getLegacyDispatchByDispatchId(Long dispatchId) { List> result = legacyTransferSyncMapper.selectByDispatchId(dispatchId); if(!CollectionUtils.isEmpty(result)){ return result.get(0); }else{ return null; } } /** * 同步调度单到旧系统(admin_save_24.asp) */ private Long syncDispatchOrderToLegacy(Long taskId) { if (!legacyConfig.isEnabled()) { log.info("旧系统同步已禁用,跳过调度单同步,任务ID: {}", taskId); return null; } try { // 查询任务信息 SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task == null) { log.error("任务不存在,任务ID: {}", taskId); return null; } // 只同步急救转运任务 if (!"EMERGENCY_TRANSFER".equals(task.getTaskType())) { log.info("非急救转运任务,跳过调度单同步,任务ID: {}", taskId); return null; } // 查询急救转运扩展信息 SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if (emergency == null) { log.error("急救转运扩展信息不存在,任务ID: {}", taskId); return null; } // 如果已经同步过,不再重复同步 if (emergency.getLegacyDispatchOrdId() != null && emergency.getLegacyDispatchOrdId() > 0) { // log.info("调度单已同步过,任务ID: {}, DispatchOrdID: {}", taskId, emergency.getLegacyDispatchOrdId()); return emergency.getLegacyDispatchOrdId(); } Long serviceOrdId=emergency.getLegacyServiceOrdId(); // 必须先同步服务单 if (LongUtil.isEmpty(serviceOrdId)) { log.warn("服务单未同步,无法同步调度单,任务ID: {}", taskId); return null; } // ====== 前置校验:确保任务数据完整 ====== // 1. 检查是否已分配车辆 List taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); if (taskVehicles == null || taskVehicles.isEmpty()) { log.warn("任务未分配车辆,跳过调度单同步,任务ID: {}", taskId); return null; } // 2. 检查是否已分配执行人员 List taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); if (taskAssignees == null || taskAssignees.isEmpty()) { log.warn("任务未分配执行人员,跳过调度单同步,任务ID: {}", taskId); return null; } // 3. 检查预约时间是否有效(必须大于1970年) if (task.getPlannedStartTime() == null) { log.warn("任务未设置预约时间,跳过调度单同步,任务ID: {}", taskId); return null; } // 检查预约时间是否大于1970-01-01(时间戳0对应1970-01-01 00:00:00) long timestamp1970 = 0L; if (task.getPlannedStartTime().getTime() <= timestamp1970) { log.warn("任务预约时间无效(小于等于1970年),跳过调度单同步,任务ID: {}, 预约时间: {}", taskId, task.getPlannedStartTime()); return null; } // 4. 检查转出医院信息 if (StringUtils.isEmpty(emergency.getHospitalOutName())) { log.warn("任务未设置转出医院,跳过调度单同步,任务ID: {}", taskId); return null; } if (StringUtils.isEmpty(emergency.getHospitalOutAddress())) { log.warn("任务未设置转出医院地址,跳过调度单同步,任务ID: {}", taskId); return null; } // 5. 检查转入医院信息 if (StringUtils.isEmpty(emergency.getHospitalInName())) { log.warn("任务未设置转入医院,跳过调度单同步,任务ID: {}", taskId); return null; } if (StringUtils.isEmpty(emergency.getHospitalInAddress())) { log.warn("任务未设置转入医院地址,跳过调度单同步,任务ID: {}", taskId); return null; } // 6. 检查患者基本信息 if (StringUtils.isEmpty(emergency.getPatientName())) { log.warn("任务未设置患者姓名,跳过调度单同步,任务ID: {}", taskId); return null; } if (StringUtils.isEmpty(emergency.getPatientPhone())) { log.warn("任务未设置患者电话,跳过调度单同步,任务ID: {}", taskId); return null; } log.info("任务数据校验通过,开始同步调度单,任务ID: {}", taskId); // 更新同步状态为同步中 emergency.setDispatchSyncStatus(1); sysTaskEmergencyService.updateSysTaskEmergency(emergency); SysUser u=sysUserMapper.selectUserById(task.getCreatorId()); Integer oaUserID= u.getOaUserId(); // 构建请求参数 Map params = taskDispatchSyncUtilService.buildDispatchOrderParams(task, emergency); // 发送HTTP请求 String response =taskSyncUtilService.sendHttpPost(legacyConfig.getDispatchCreateUrl(), params); // 解析响应 Long dispatchOrdId = taskSyncUtilService.parseResponse(response); if (dispatchOrdId != null && dispatchOrdId > 0) { // 同步成功,更新记录 emergency.setLegacyDispatchOrdId(dispatchOrdId); emergency.setDispatchSyncStatus(2); // 同步成功 emergency.setDispatchSyncTime(new Date()); emergency.setDispatchSyncErrorMsg(null); //更新调度单信息开到新系统 Map dispatchInfo = this.getLegacyDispatchByDispatchId(dispatchOrdId); if (dispatchInfo != null) { emergency.setLegacyDispatchNsTime(MapValueUtils.getDateValue(dispatchInfo, "DispatchOrd_NS_Time")); // 同步成功 emergency.setLegacyDispatchOrdClass(MapValueUtils.getStringValue(dispatchInfo, "DispatchOrdClass")); // 同步成功 emergency.setLegacyDispatchOrdNo(MapValueUtils.getStringValue(dispatchInfo, "DispatchOrdNo")); // 同步成功 emergency.setLegacyServiceNsTime(MapValueUtils.getDateValue(dispatchInfo, "ServiceOrd_CC_Time")); // 同步成功 emergency.setLegacyServiceOrdClass(MapValueUtils.getStringValue(dispatchInfo, "ServiceOrdClass")); // 同步成功 } sysTaskEmergencyService.updateSysTaskEmergency(emergency); eventPublisher.publishEvent(new TaskDispatchSyncEvent(this, taskId, task.getTaskCode(),serviceOrdId, dispatchOrdId, oaUserID)); // log.info("调度单同步成功,任务ID: {}, DispatchOrdID: {}", taskId, dispatchOrdId); return dispatchOrdId; } else { // 同步失败 emergency.setDispatchSyncStatus(3); // 同步失败 emergency.setDispatchSyncTime(new Date()); emergency.setDispatchSyncErrorMsg("旧系统返回无效的DispatchOrdID: " + response); sysTaskEmergencyService.updateSysTaskEmergency(emergency); log.error("调度单同步失败,任务ID: {}, 响应: {}", taskId, response); return null; } } catch (Exception e) { log.error("同步调度单到旧系统异常,任务ID: {}", taskId, e); // 更新同步状态为失败 try { SysTaskEmergency emergency = sysTaskEmergencyService.selectSysTaskEmergencyByTaskId(taskId); if (emergency != null) { emergency.setDispatchSyncStatus(3); // 同步失败 emergency.setDispatchSyncTime(new Date()); emergency.setDispatchSyncErrorMsg("同步异常: " + e.getMessage()); sysTaskEmergencyService.updateSysTaskEmergency(emergency); } } catch (Exception ex) { log.error("更新调度单同步状态失败", ex); } return null; } } }