package com.ruoyi.system.service.impl; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.VehicleInfo; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.domain.vo.TaskUpdateVO; import com.ruoyi.system.mapper.SysTaskEmergencyMapper; import com.ruoyi.system.mapper.SysTaskMapper; import com.ruoyi.system.service.ILegacyTransferSyncService; import com.ruoyi.system.service.ISysDeptService; import com.ruoyi.system.service.ISysTaskService; import com.ruoyi.system.mapper.LegacyTransferSyncMapper; import com.ruoyi.system.mapper.VehicleInfoMapper; import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.IWechatTaskNotifyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; /** * 旧系统转运单同步Service业务层处理 * * @author ruoyi * @date 2025-11-19 */ @Service public class LegacyTransferSyncServiceImpl implements ILegacyTransferSyncService { private static final Logger log = LoggerFactory.getLogger(LegacyTransferSyncServiceImpl.class); @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private ISysTaskService sysTaskService; @Autowired private LegacyTransferSyncMapper legacyTransferSyncMapper; @Autowired private VehicleInfoMapper vehicleInfoMapper; @Autowired private ISysDeptService sysDeptService; @Autowired private ISysUserService sysUserService; @Autowired private IWechatTaskNotifyService wechatTaskNotifyService; /** * 同步指定日期范围的旧系统转运单到新系统 * * @param daysAgo 多少天前的数据(如7表示7天前的数据) * @return 成功同步的转运单数量 */ @Override public int syncLegacyTransferOrders(int daysAgo) { log.info("开始同步{}天前的旧系统转运单数据", daysAgo); try { // 参数验证 if (daysAgo <= 0) { log.error("天数参数必须大于0"); return 0; } // 计算日期范围 Date startDate = DateUtils.addDays(new Date(), -daysAgo); String startDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", startDate); // 从SQL Server查询转运单数据 List> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr); if (transferOrders == null || transferOrders.isEmpty()) { log.info("未查询到{}天前的转运单数据", daysAgo); return 0; } log.info("查询到{}条转运单数据,开始同步...", transferOrders.size()); int successCount = 0; int totalCount = transferOrders.size(); int processedCount = 0; for (Map order : transferOrders) { processedCount++; try { String serviceOrdID = getStringValue(order, "ServiceOrdID"); String dispatchOrdID = getStringValue(order, "DispatchOrdID"); // 检查参数有效性 if (StringUtils.isEmpty(serviceOrdID)) { log.warn("第{}条数据服务单ID为空,跳过处理", processedCount); continue; } log.debug("正在处理第{}/{}条转运单: ServiceOrdID={}, DispatchOrdID={}", processedCount, totalCount, serviceOrdID, dispatchOrdID); // 检查是否已同步 if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { log.debug("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); //进行更新操作 updateTransferOrder(serviceOrdID, dispatchOrdID, order); continue; } // 同步单个转运单 boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order); if (success) { successCount++; } // 控制同步频率,避免请求过快 Thread.sleep(100); } catch (InterruptedException ie) { log.warn("同步任务被中断"); Thread.currentThread().interrupt(); break; } catch (Exception e) { log.error("同步单个转运单失败: ServiceOrdID={}, DispatchOrdID={}", getStringValue(order, "ServiceOrdID"), getStringValue(order, "DispatchOrdID"), e); } } log.info("同步完成,共处理{}条转运单,成功同步{}条转运单数据", totalCount, successCount); return successCount; } catch (Exception e) { log.error("同步{}天前的旧系统转运单数据异常", daysAgo, e); return 0; } } /** * 同步单个旧系统转运单到新系统 * * @param serviceOrdID 服务单ID * @param dispatchOrdID 调度单ID * @return 是否同步成功 */ @Override public boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID) { log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); try { // 检查参数有效性 if (StringUtils.isEmpty(serviceOrdID)) { log.error("服务单ID不能为空"); return false; } // 直接查询指定的转运单信息 List> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID); Map order = transferOrders.get(0); // 检查是否已同步 if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { log.info("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); updateTransferOrder(serviceOrdID, dispatchOrdID, order); return true; } if (transferOrders == null || transferOrders.isEmpty()) { log.error("未查询到对应的转运单信息: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } // 同步单个转运单 return syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order); } catch (Exception e) { log.error("同步单个转运单异常: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return false; } } private boolean updateTransferOrder(String serviceOrdID, String dispatchOrdID, Map order){ log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); String sysTaskCode=""; try { SysTaskEmergency emergency=sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.parseLong(serviceOrdID)); if(emergency.getNeedResync().equals(1)){ log.info("新系统需要同步到旧系统那里,所以不要同步旧数据到新系统,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } // 构造TaskCreateVO对象 TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order); sysTaskCode = createTaskVo.getTaskCode(); if (createTaskVo == null) { log.error("构造TaskCreateVO失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } // 记录创建的任务信息 log.debug("准备创建任务: ServiceOrdID={}, DispatchOrdID={}, 患者姓名={}, 转出医院={}, 转入医院={}", serviceOrdID, dispatchOrdID, createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "未知", createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "未知", createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "未知"); /** * 开单时间 */ Date ServiceOrd_CC_Time= getDateValue(order, "ServiceOrd_CC_Time"); // 调用sysTaskService创建任务 String serviceOrdClass = getStringValue(order,"ServiceOrdClass"); String serviceOrdNo = getStringValue(order,"ServiceOrdNo"); Integer oauserId=getIntegerValue(order,"ServiceOrd_NS_ID"); SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId); Long taskCreatorId=sysUser==null?null:sysUser.getUserId(); String createUserName=sysUser==null?"system":sysUser.getUserName(); SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass); Long deptId=dept==null?null:dept.getDeptId(); TaskUpdateVO updateTaskVo = new TaskUpdateVO(); BeanUtils.copyProperties(createTaskVo, updateTaskVo); int result = sysTaskService.updateTask(updateTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time); if (result > 0) { log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result); try { notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order); } catch (Exception e) { log.error("转运单同步成功后发送微信通知失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); } return true; } else { log.error("转运单同步失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } } catch (Exception e) { log.error("同步单个转运单异常: ServiceOrdID={}, DispatchOrdID={},sysTaskCode:{}", serviceOrdID, dispatchOrdID,sysTaskCode, e); return false; } } /** * 同步单个旧系统转运单到新系统(带详细信息) * * @param serviceOrdID 服务单ID * @param dispatchOrdID 调度单ID * @param order 转运单详细信息 * @return 是否同步成功 */ private boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID, Map order) { log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); String sysTaskCode=""; try { // 构造TaskCreateVO对象 TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order); sysTaskCode = createTaskVo.getTaskCode(); if (createTaskVo == null) { log.error("构造TaskCreateVO失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } // 记录创建的任务信息 log.debug("准备创建任务: ServiceOrdID={}, DispatchOrdID={}, 患者姓名={}, 转出医院={}, 转入医院={}", serviceOrdID, dispatchOrdID, createTaskVo.getPatient() != null ? createTaskVo.getPatient().getName() : "未知", createTaskVo.getHospitalOut() != null ? createTaskVo.getHospitalOut().getName() : "未知", createTaskVo.getHospitalIn() != null ? createTaskVo.getHospitalIn().getName() : "未知"); /** * 开单时间 */ Date ServiceOrd_CC_Time= getDateValue(order, "ServiceOrd_CC_Time"); // 调用sysTaskService创建任务 String serviceOrdClass = getStringValue(order,"ServiceOrdClass"); String serviceOrdNo = getStringValue(order,"ServiceOrdNo"); /** * 创建人ID */ Integer oauserId=getIntegerValue(order,"ServiceOrd_CC_ID"); SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId); Long taskCreatorId=sysUser==null?null:sysUser.getUserId(); String createUserName=sysUser==null?"system":sysUser.getUserName(); SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass); Long deptId=dept==null?null:dept.getDeptId(); int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time); if (result > 0) { log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result); try { notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order); } catch (Exception e) { log.error("转运单同步成功后发送微信通知失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); } return true; } else { log.error("转运单同步失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return false; } } catch (Exception e) { log.error("同步单个转运单异常: ServiceOrdID={}, DispatchOrdID={},sysTaskCode:{}", serviceOrdID, dispatchOrdID,sysTaskCode, e); return false; } } /** * 检查转运单是否已同步 * * @param serviceOrdID 服务单ID * @param dispatchOrdID 调度单ID * @return 是否已同步 */ @Override public boolean isTransferOrderSynced(String serviceOrdID, String dispatchOrdID) { try { // 检查参数有效性 if (StringUtils.isEmpty(serviceOrdID)) { log.warn("服务单ID不能为空"); return false; } // 检查sys_task_emergency表中是否已存在对应的记录 // 条件:legacy_service_ord_id = serviceOrdID 或 legacy_dispatch_ord_id = dispatchOrdID try { SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(Long.valueOf(serviceOrdID)); if (emergency != null) { return true; } } catch (NumberFormatException e) { log.warn("服务单ID不是有效数字: {}", serviceOrdID); } if (StringUtils.isNotEmpty(dispatchOrdID)) { try { SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyDispatchOrdId(Long.valueOf(dispatchOrdID)); if (emergency != null) { return true; } } catch (NumberFormatException e) { log.warn("调度单ID不是有效数字: {}", dispatchOrdID); } } return false; } catch (Exception e) { log.error("检查转运单是否已同步异常: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return false; } } private String getServiceOrdCode(Date ServiceOrd_CC_Time,String serviceOrdClass,String serviceOrdNo){ //BF20251101-serviceOrdNo; //将 ServiceOrd_CC_Time 转为 yyyyMMdd 格式 String ServiceOrd_CC_Time_Str= DateUtils.parseDateToStr(DateUtils.YYYYMMDD,ServiceOrd_CC_Time); //serviceOrdNo 这个是数字,固定3位数 ,将32,转成032;将1转成001 Integer intServiceNo=Integer.valueOf(serviceOrdNo); String ServiceOrdNo_Str=String.format("%03d", intServiceNo); return serviceOrdClass+ServiceOrd_CC_Time_Str+"-"+ServiceOrdNo_Str; } /** * 构造TaskCreateVO对象用于创建任务 * * @param serviceOrdID 服务单ID * @param dispatchOrdID 调度单ID * @param order 转运单详细信息 * @return TaskCreateVO对象 */ @Override public TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map order) { log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); try { // 检查参数有效性 if (order == null || order.isEmpty()) { log.error("转运单详细信息不能为空"); return null; } if (StringUtils.isEmpty(serviceOrdID)) { log.error("服务单ID不能为空"); return null; } String serviceOrdClass = getStringValue(order, "ServiceOrdClass"); //TODO TaskCreateVO createTaskVo = new TaskCreateVO(); String serviceOrdCode=this.getServiceOrdCode(getDateValue(order, "ServiceOrd_CC_Time"),serviceOrdClass,getStringValue(order, "ServiceOrdNo")); createTaskVo.setTaskCode(serviceOrdCode); log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={},taskCode:{}", serviceOrdID, dispatchOrdID,serviceOrdCode); // 设置基本信息 createTaskVo.setTaskType("EMERGENCY_TRANSFER"); // 急救转运任务 // 设置单据类型和任务类型ID(从旧系统字段映射) if (StringUtils.isNotEmpty(serviceOrdClass)) { createTaskVo.setDocumentTypeId(serviceOrdClass); } String serviceOrdType = getStringValue(order, "ServiceOrdType"); if (StringUtils.isNotEmpty(serviceOrdType)) { createTaskVo.setTaskTypeId(serviceOrdType); } // 设置区域类型 String serviceOrdAreaType = getStringValue(order, "ServiceOrdAreaType"); // 设置用户ID Long serviceOrdUserID = getLongValue(order, "ServiceOrdUserID"); // 设置患者信息 TaskCreateVO.PatientInfo patientInfo = new TaskCreateVO.PatientInfo(); patientInfo.setName(getStringValue(order, "ServiceOrdPtName")); patientInfo.setPhone(getStringValue(order, "ServiceOrdCoPhone")); patientInfo.setIdCard(getStringValue(order, "ServiceOrdPtIDCard")); patientInfo.setCondition(getStringValue(order, "ServiceOrdPtCondition")); patientInfo.setContact(getStringValue(order, "ServiceOrdCoName")); String serviceOrdPtSex = getStringValue(order, "ServiceOrdPtSex"); if(serviceOrdPtSex!=null){ if(serviceOrdPtSex.equals("男")){ patientInfo.setGender("male"); }else if(serviceOrdPtSex.equals("女")){ patientInfo.setGender("female"); } } createTaskVo.setPatient(patientInfo); //1000公里,提取数字 String ServiceOrdTraDistance=getStringValue(order, "ServiceOrdTraDistance"); if(ServiceOrdTraDistance!=null){ ServiceOrdTraDistance=ServiceOrdTraDistance.replaceAll("[^0-9]", ""); createTaskVo.setDistance(new BigDecimal(ServiceOrdTraDistance)); } // 设置转出医院信息 TaskCreateVO.HospitalInfo hospitalOutInfo = new TaskCreateVO.HospitalInfo(); Long hospitalOutId = getLongValue(order, "ServiceOrdPtOutHospID"); hospitalOutInfo.setId(hospitalOutId); if (hospitalOutId != null) { String hospitalOutName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalOutId.toString()); if (StringUtils.isNotEmpty(hospitalOutName)) { hospitalOutInfo.setName(hospitalOutName); } } String ServiceOrdTraVia=getStringValue(order, "ServiceOrdTraVia"); if(ServiceOrdTraVia!=null){ hospitalOutInfo.setAddress(ServiceOrdTraVia); } String hospitalOutDeptId = getStringValue(order, "ServiceOrdPtServicesID"); hospitalOutInfo.setDepartmentId(hospitalOutDeptId); if (StringUtils.isNotEmpty(hospitalOutDeptId)) { String hospitalOutDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalOutDeptId); if (StringUtils.isNotEmpty(hospitalOutDeptName)) { hospitalOutInfo.setDepartment(hospitalOutDeptName); } } //转出床位 String serviceOrdPtServices=getStringValue(order, "ServiceOrdPtServices"); if(serviceOrdPtServices!= null){ hospitalOutInfo.setBedNumber(serviceOrdPtServices); } createTaskVo.setHospitalOut(hospitalOutInfo); // 设置转入医院信息 TaskCreateVO.HospitalInfo hospitalInInfo = new TaskCreateVO.HospitalInfo(); Long hospitalInId = getLongValue(order, "ServiceOrdPtInHospID"); hospitalInInfo.setId(hospitalInId); if (hospitalInId != null) { String hospitalInName = legacyTransferSyncMapper.selectHospitalNameByHospID(hospitalInId.toString()); if (StringUtils.isNotEmpty(hospitalInName)) { hospitalInInfo.setName(hospitalInName); } } String serviceOrdTraEnd = getStringValue(order, "ServiceOrdTraEnd"); if(serviceOrdTraEnd!= null){ hospitalInInfo.setAddress(serviceOrdTraEnd); } //转入床位 String serviceOrdPtInServices =getStringValue(order, "ServiceOrdPtInServices"); if(serviceOrdPtInServices!= null){ hospitalInInfo.setBedNumber(serviceOrdPtInServices); } String hospitalInDeptId = getStringValue(order, "ServiceOrdPtInServicesID"); hospitalInInfo.setDepartmentId(hospitalInDeptId); if (StringUtils.isNotEmpty(hospitalInDeptId)) { String hospitalInDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalInDeptId); if (StringUtils.isNotEmpty(hospitalInDeptName)) { hospitalInInfo.setDepartment(hospitalInDeptName); } } createTaskVo.setHospitalIn(hospitalInInfo); // 设置地址信息 createTaskVo.setDepartureAddress(getStringValue(order, "ServiceOrdTraStreet")); createTaskVo.setDestinationAddress(getStringValue(order, "ServiceOrdTraEnd")); // 设置价格和距离信息 createTaskVo.setPrice(getBigDecimalValue(order, "ServiceOrdTraTxnPrice")); // 距离信息需要从其他字段计算或获取 if(dispatchOrdID!=null) { // 设置执行人信息 List assignees = queryAssignees(dispatchOrdID); createTaskVo.setAssignees(assignees); if (!assignees.isEmpty()) { createTaskVo.setAssigneeId(assignees.get(0).getUserId()); } } // 设置车辆信息 // 车辆ID需要根据DispatchOrdCarID查询获取 String carID = getStringValue(order, "DispatchOrdCarID"); if (StringUtils.isNotEmpty(carID)) { String carLicense = legacyTransferSyncMapper.selectCarLicenseByCarID(carID); if (StringUtils.isNotEmpty(carLicense)) { // 根据车牌号查询新系统中的车辆ID log.debug("车辆车牌号: {}", carLicense); // 首先尝试通过VehicleInfoMapper查询车辆信息 try { // 先尝试通过car_id查询车辆信息 Integer carIdInt = Integer.valueOf(carID); VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoByCarId(carIdInt); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { // 设置车辆ID列表 List vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("通过car_id找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { // 如果通过car_id找不到,尝试通过车牌号查询 vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { List vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("通过车牌号找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { log.warn("未找到对应的车辆信息: car_id={}, vehicle_no={}", carID, carLicense); } } } catch (NumberFormatException e) { log.warn("carID不是有效数字: {}", carID); // 如果carID不是数字,直接通过车牌号查询 VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense); if (vehicleInfo != null && vehicleInfo.getVehicleId() != null) { List vehicleIds = new ArrayList<>(); vehicleIds.add(vehicleInfo.getVehicleId()); createTaskVo.setVehicleIds(vehicleIds); log.debug("通过车牌号找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo()); } else { log.warn("未找到对应的车辆信息: vehicle_no={}", carLicense); } } } } // 设置其他信息 createTaskVo.setTaskDescription("从旧系统同步的转运单"); // 设置备注信息 String remark = "服务单ID: " + serviceOrdID + ", 调度单ID: " + dispatchOrdID; String serviceOrdCoTies = getStringValue(order, "ServiceOrdCoTies"); if (StringUtils.isNotEmpty(serviceOrdCoTies)) { remark += ", 联系人关系: " + serviceOrdCoTies; } createTaskVo.setRemark(remark); // 设置计划开始时间 Date plannedStartTime = getDateValue(order, "ServiceOrdApptDate"); if (plannedStartTime != null) { createTaskVo.setPlannedStartTime(plannedStartTime); } Date actualStartTime = getDateValue(order, "DispatchOrdActualDate"); if (actualStartTime != null) { createTaskVo.setActualStartTime(actualStartTime); } Date actualEndTime = getDateValue(order, "DispatchOrdReturnDate"); if (actualEndTime != null) { createTaskVo.setActualEndTime(actualEndTime); } // 设置创建时间 开单日期 Date createTime = getDateValue(order, "ServiceOrd_CC_Time"); if (createTime != null) { createTaskVo.setCreateTime(createTime); } // 查询并设置病情信息 String diseaseIdsStr = queryDiseaseIds(serviceOrdID); if (StringUtils.isNotEmpty(diseaseIdsStr)) { String[] diseaseIdArray = diseaseIdsStr.split(","); List diseaseIds = new ArrayList<>(); for (String diseaseId : diseaseIdArray) { try { diseaseIds.add(Long.valueOf(diseaseId.trim())); } catch (NumberFormatException e) { log.warn("无效的疾病ID: {}", diseaseId); } } createTaskVo.setDiseaseIds(diseaseIds); } log.info("TaskCreateVO构造完成: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); return createTaskVo; } catch (Exception e) { log.error("构造TaskCreateVO异常: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); return null; } } /** * 查询执行人信息 * * @param dispatchOrdID 调度单ID * @return 执行人信息列表 */ private List queryAssignees(String dispatchOrdID) { try { // 检查参数有效性 if (StringUtils.isEmpty(dispatchOrdID)) { log.warn("调度单ID不能为空"); return new ArrayList<>(); } // 从SQL Server查询执行人信息 List> assigneeList = legacyTransferSyncMapper.selectAssigneesByDispatchOrdID(dispatchOrdID); // 转换为TaskCreateVO.AssigneeInfo对象 List assignees = new ArrayList<>(); if (assigneeList != null && !assigneeList.isEmpty()) { for (Map assigneeMap : assigneeList) { String entourageOAId = getStringValue(assigneeMap, "EntourageOAId"); String entourageState = getStringValue(assigneeMap, "EntourageID"); if (StringUtils.isNotEmpty(entourageOAId)) { try { // 将OA用户ID转换为系统用户ID Integer oaUserId = Integer.valueOf(entourageOAId); SysUser sysUser = sysUserService.selectUserByOaUserId(oaUserId); if (sysUser != null) { TaskCreateVO.AssigneeInfo assigneeInfo = new TaskCreateVO.AssigneeInfo(); assigneeInfo.setUserId(sysUser.getUserId()); // 使用系统用户ID assigneeInfo.setUserName(sysUser.getNickName()); // 根据EntourageState确定角色类型 // 1,2 司机,3,5 医生,4,6 护士 if ("1".equals(entourageState) || "2".equals(entourageState)) { assigneeInfo.setUserType("driver"); } else if ("3".equals(entourageState) || "5".equals(entourageState)) { assigneeInfo.setUserType("doctor"); } else if ("4".equals(entourageState) || "6".equals(entourageState)) { assigneeInfo.setUserType("nurse"); } else { assigneeInfo.setUserType("other"); } assignees.add(assigneeInfo); } else { log.warn("未找到对应的系统用户: OA用户ID={}", oaUserId); } } catch (NumberFormatException e) { log.warn("执行人OA ID不是有效数字: {}", entourageOAId); } } } } log.info("查询到{}个执行人,调度单ID: {}", assignees.size(), dispatchOrdID); return assignees; } catch (Exception e) { log.error("查询执行人信息异常,调度单ID: {}", dispatchOrdID, e); return new ArrayList<>(); // 返回空列表而不是null } } /** * 查询病情信息 * * @param serviceOrdID 服务单ID * @return 病情ID列表 */ private String queryDiseaseIds(String serviceOrdID) { try { // 检查参数有效性 if (StringUtils.isEmpty(serviceOrdID)) { log.warn("服务单ID不能为空"); return null; } // 从SQL Server查询病情信息 List diseaseIds = legacyTransferSyncMapper.selectDiseaseIdsByServiceOrdID(serviceOrdID); // 转换为逗号分隔的字符串 if (diseaseIds != null && !diseaseIds.isEmpty()) { return String.join(",", diseaseIds); } log.info("查询到病情信息,服务单ID: {}, 病情数量: {}", serviceOrdID, diseaseIds != null ? diseaseIds.size() : 0); return null; } catch (Exception e) { log.error("查询病情信息异常,服务单ID: {}", serviceOrdID, e); return null; } } /** * 从Map中获取字符串值 * * @param map Map对象 * @param key 键 * @return 字符串值 */ private String getStringValue(Map map, String key) { Object value = map.get(key); return value != null ? value.toString() : null; } /** * 从Map中获取BigDecimal值 * * @param map Map对象 * @param key 键 * @return BigDecimal值 */ private BigDecimal getBigDecimalValue(Map map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof BigDecimal) { return (BigDecimal) value; } try { return new BigDecimal(value.toString()); } catch (NumberFormatException e) { return null; } } /** * 从Map中获取Long值 * * @param map Map对象 * @param key 键 * @return Long值 */ private Long getLongValue(Map map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Long) { return (Long) value; } try { return Long.valueOf(value.toString()); } catch (NumberFormatException e) { return null; } } private Integer getIntegerValue(Map map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Integer) { return (Integer) value; } try { return Integer.valueOf(value.toString()); } catch (NumberFormatException e) { return null; } } /** * 从Map中获取Date值 * * @param map Map对象 * @param key 键 * @return Date值 */ private Date getDateValue(Map map, String key) { Object value = map.get(key); if (value == null) { return null; } if (value instanceof Date) { return (Date) value; } // 如果是字符串,尝试解析 if (value instanceof String) { try { return DateUtils.parseDate(value.toString()); } catch (Exception e) { return null; } } return null; } /** * 验证日期字符串格式是否有效 * * @param dateStr 日期字符串 * @param format 日期格式 * @return 是否有效 */ private boolean isValidDateFormat(String dateStr, String format) { if (StringUtils.isEmpty(dateStr)) { return false; } try { SimpleDateFormat sdf = new SimpleDateFormat(format); sdf.setLenient(false); sdf.parse(dateStr); return true; } catch (Exception e) { return false; } } private void notifyTransferOrderByWechat(Long taskId, String serviceOrdID, String dispatchOrdID, String serviceOrdNo, Date serviceOrdCcTime, SysDept dept, Map order) { try { // 获取通知接收人列表 List receivers = getWechatNotifyUsers(dispatchOrdID, dept); if (receivers == null || receivers.isEmpty()) { log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId); return; } // 提取接收人 ID 列表 List userIds = new ArrayList<>(); for (SysUser user : receivers) { if (user != null && user.getUserId() != null) { userIds.add(user.getUserId()); } } // 调用统一的微信通知服务 int successCount = wechatTaskNotifyService.sendTaskNotifyMessage(taskId, userIds); log.info("旧系统同步转运单微信通知发送完成,taskId={}, 成功={}", taskId, successCount); } catch (Exception e) { log.error("notifyTransferOrderByWechat发生异常, serviceOrdID={}, dispatchOrdID={}", serviceOrdID, dispatchOrdID, e); } } private List getWechatNotifyUsers(String dispatchOrdID, SysDept dept) { try { List result = new ArrayList<>(); List assignees = queryAssignees(dispatchOrdID); if (assignees != null && !assignees.isEmpty()) { for (TaskCreateVO.AssigneeInfo assigneeInfo : assignees) { if (assigneeInfo == null || assigneeInfo.getUserId() == null) { continue; } SysUser user = sysUserService.selectUserById(assigneeInfo.getUserId()); if (user != null && StringUtils.isNotEmpty(user.getOpenId())) { result.add(user); } } } if (!result.isEmpty()) { return result; } if (dept == null || StringUtils.isEmpty(dept.getPhone())) { return result; } SysUser leader = sysUserService.selectUserByPhonenumber(dept.getPhone()); if (leader != null && StringUtils.isNotEmpty(leader.getOpenId())) { result.add(leader); } return result; } catch (Exception e) { log.error("获取旧系统同步转运单微信通知接收人失败, dispatchOrdID={}", dispatchOrdID, e); return new ArrayList<>(); } } }