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.StringUtils; import com.ruoyi.system.domain.*; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.mapper.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @Slf4j public class TaskDispatchSyncUtilService { @Autowired private SysUserMapper sysUserMapper; @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; @Autowired private TaskSyncUtilService taskSyncUtilService; @Autowired private SysDeptMapper sysDeptMapper; /** * 构建调度单同步参数 */ public Map buildDispatchOrderParams(SysTask task, SysTaskEmergency emergency) { Map params = new HashMap<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 获取管理员ID(创建人ID对应的OA_UserID) String adminID = taskSyncUtilService.getAdminID(task); // 获取调度单类型(从任务所属部门的调度单编码获取) String dispatchOrdClass = "SA"; // 默认值 if (task.getDeptId() != null) { try { SysDept dept = sysDeptMapper.selectDeptById(task.getDeptId()); if (dept != null && StringUtils.isNotEmpty(dept.getDispatchOrderClass())) { dispatchOrdClass = dept.getDispatchOrderClass(); // log.info("获取任务所属部门的调度单编码成功,部门ID: {}, 调度单编码: {}", task.getDeptId(), dispatchOrdClass); } } catch (Exception e) { log.error("查询任务所属部门信息异常,部门ID: {}", task.getDeptId(), e); } } params.put("AdminID", adminID); // 基本信息 params.put("DispatchOrdClass", dispatchOrdClass); params.put("ServiceOrdID", emergency.getLegacyServiceOrdId().toString()); params.put("DispatchOrdState", "1"); // 调度单状态 // 时间信息 if (task.getPlannedStartTime() != null) { params.put("DispatchOrdTraSDTime", sdf.format(task.getPlannedStartTime())); // 拟出发时间 } else { params.put("DispatchOrdTraSDTime", ""); } params.put("DispatchOrd_NS_Time", task.getCreateTime() != null ? sdf.format(task.getCreateTime()) : sdf.format(new Date())); // 开单时间 // 车辆信息 - 从任务关联的车辆获取CarID Long carId = getTaskVehicleCarId(task.getTaskId()); params.put("DispatchOrdCarID", carId.toString()); // 联系人信息 params.put("DispatchOrdCoName", StringUtils.nvl(emergency.getPatientContact(), "")); params.put("DispatchOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), "")); params.put("ServiceOrdCoName", StringUtils.nvl(emergency.getPatientContact(), "")); params.put("ServiceOrdCoPhone", StringUtils.nvl(emergency.getPatientPhone(), "")); params.put("ServiceOrdPtName", StringUtils.nvl(emergency.getPatientName(), "")); params.put("ServiceOrdTraStreet",StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), ""))); // 地址信息 params.put("DispatchOrdTraStreet", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), ""))); params.put("DispatchOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), ""))); params.put("DispatchOrdTraVia", ""); // 实际途经地 // 操作命令 params.put("DispatchOrd_Check", "0"); // 3=直接强制完成 // 绩效和费用:确保数值字段不为null String transferPrice = "0"; if (emergency.getTransferPrice() != null) { try { transferPrice = emergency.getTransferPrice().toString(); if (transferPrice.contains(".")) { transferPrice = new java.math.BigDecimal(transferPrice).stripTrailingZeros().toPlainString(); } } catch (Exception e) { log.warn("转换转运价格失败,任务ID: {}, 使用默认值0", task.getTaskId(), e); transferPrice = "0"; } } params.put("DispatchOrdPerfomance", transferPrice); params.put("StretcherMoney", "0"); // 抬担架费 params.put("AddMoneyType", ""); // 附加项目 params.put("AddMoney", "0"); // 附加项目费用 params.put("AddMoneyExplain", ""); // 附加项目说明 // 人员信息 params.put("EntourageName_aid1", ""); // 外援人员1 params.put("EntourageName_aid2", ""); // 外援人员2 params.put("DispatchOrd_NS_ID", adminID); // 调度人员ID params.put("RecommendedCar", ""); // 指定车型 params.put("ServiceOrdTaskRemarks", StringUtils.nvl(task.getTaskDescription(), "")); // 医护司备注 // 电话信息 params.put("Phone", StringUtils.nvl(emergency.getPatientPhone(), "")); params.put("TEL_Time", sdf.format(new Date())); params.put("TEL_Remarks", "新系统同步创建调度单"); // 时长信息 params.put("TimeLength_Program", "0"); // 大型活动保障时长 params.put("TimeLength_ICU", "0"); // 居家ICU时长 params.put("TimeLength_Wait", "0"); // 等待时长 // 里程数 params.put("DispatchOrdTraStreetMileage", ""); // 开始里程数 params.put("DispatchOrdTraEndMileage", ""); // 结束里程数 // 服务单相关信息(从admin_save_24.gds 221-255行补充) params.put("ServiceOrdPtCondition", StringUtils.nvl(emergency.getPatientCondition(), "")); // 病情描述 params.put("ServiceOrdPtDoctor", ""); // 患者医生 params.put("ServiceOrdPtDoctorPhone", ""); // 患者医生电话 params.put("TransferModeID", ""); // 转运方式 params.put("ServiceOrdVIP", "0"); // VIP客户 // 价格字段复用,确保一致性 params.put("ServiceOrdTraTxnPrice", transferPrice); // 成交价 params.put("ServiceOrdTraPrePayment", "0"); // 需预付款 params.put("SettlementPrice", "0"); // 结算价 params.put("ServiceOrdTraPriceReason", ""); // 差价原因 params.put("ServiceOrd_CC_ID", ""); // 客服人员ID params.put("ServiceOrd_Sale_ID", ""); // 销售人员ID params.put("ServiceOrdIntroducer", ""); // 介绍人 params.put("ServiceOrd_work_ID", ""); // 主要企微客服ID params.put("ServiceOrd_work_IDs", ""); // 其他企微客服ID params.put("ServiceOrd_work_is", "0"); // 是否企微成交 params.put("CommissionScenarioID", "0"); // 企微绩效方案 params.put("ServiceOrdApptDate", task.getPlannedStartTime() != null ? sdf.format(task.getPlannedStartTime()) : ""); // 预约时间 params.put("ServiceOrdPtDiagnosis", ""); // 诊断 params.put("ServiceOrdOperationRemarks", "新系统同步创建"); // 操作备注 params.put("ServiceOrdEstimatedOrderDate", ""); // 预计派单时间 params.put("ServiceOrdEstimatedOrderDateOld", ""); // 原预计派单时间 params.put("ServiceOrdViaDistance", "0"); // 中途距离 // 距离字段:确保不为空,避免旧系统接口报错 String transferDistance = "0"; if (emergency.getTransferDistance() != null) { try { transferDistance = emergency.getTransferDistance().toString(); // 去除可能的小数点后多余的0 if (transferDistance.contains(".")) { transferDistance = new java.math.BigDecimal(transferDistance).stripTrailingZeros().toPlainString(); } } catch (Exception e) { log.warn("转换转运距离失败,任务ID: {}, 使用默认值0", task.getTaskId(), e); transferDistance = "0"; } } // log.info("转运距离:{}",transferDistance); params.put("ServiceOrdTraDistance", transferDistance); params.put("OrderLevel", "0"); // 查看等级 params.put("ServiceOrdDepartureType", "1"); // 预约类型 params.put("ConditionLevel", "0"); // 病重级别 params.put("DirectionType", "0"); // 转运去向 params.put("ServiceOrdPtOutHospID", emergency.getHospitalOutId() != null ? emergency.getHospitalOutId().toString() : "0"); // 转出医院ID params.put("ServiceOrdPtServices", emergency.getHospitalOutBedNumber()==null?"":emergency.getHospitalOutBedNumber().toString()); // 转出床位 params.put("ServiceOrdPtServicesID",emergency.getHospitalOutDepartmentId()==null?"":emergency.getHospitalOutDepartmentId().toString()); // 转出科室ID params.put("ServiceOrdPtInServicesID",emergency.getHospitalInDepartmentId()==null?"":emergency.getHospitalInDepartmentId().toString()); // 转入科室ID params.put("ServiceOrdPtInServices", emergency.getHospitalInBedNumber()==null?"":emergency.getHospitalInBedNumber().toString());// 转入床位 params.put("ServiceOrdPtInHospID", emergency.getHospitalInId() != null ? emergency.getHospitalInId().toString() : "0"); // 转入医院ID params.put("ServiceOrdPtOutHosp", StringUtils.nvl(emergency.getHospitalOutName(), "")); // 转出医院 params.put("ServiceOrdTraVia", StringUtils.nvl(task.getDepartureAddress(), StringUtils.nvl(emergency.getHospitalOutAddress(), ""))); // 转出地址 params.put("ServiceOrdPtInHosp", StringUtils.nvl(emergency.getHospitalInName(), "")); // 转入医院 params.put("ServiceOrdTraEnd", StringUtils.nvl(task.getDestinationAddress(), StringUtils.nvl(emergency.getHospitalInAddress(), ""))); // 转入地址 params.put("FromHQ2_is", "0"); // 广州总部推送任务标记 // 病情ID列表(ICD-10疾病ID,用于诊断ICD) // 格式:逗号分隔的ID列表,如 ",1,2,3," String ordIcdId = ""; if (StringUtils.isNotEmpty(emergency.getDiseaseIds())) { // 将存储的 "1,2,3" 格式转换为旧系统要求的 ",1,2,3," 格式 ordIcdId = "," + emergency.getDiseaseIds() + ","; log.info("病情ID列表已设置,任务ID: {}, OrdICD_ID: {}", task.getTaskId(), ordIcdId); } params.put("OrdICD_ID", ordIcdId); params.put("OrdICD_ID_old", ""); // 旧病情ID列表(用于对比是否需要更新) // 执行人员信息(随行人员) syncTaskAssignees(task, params); return params; } @Autowired private SysTaskVehicleMapper sysTaskVehicleMapper; @Autowired private VehicleInfoMapper vehicleInfoMapper; /** * 获取任务关联车辆的旧系统CarID * * @param taskId 任务ID * @return CarID,如果未找到则返回0L */ private Long getTaskVehicleCarId(Long taskId) { try { // 从 sys_task_vehicle 表查询车辆ID List taskVehicles = sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); if (taskVehicles != null && !taskVehicles.isEmpty()) { // 取第一个关联的车辆 Long vehicleId = taskVehicles.get(0).getVehicleId(); if (vehicleId != null) { // 从 tb_vehicle_info 表获取 car_id VehicleInfo vehicleInfo = vehicleInfoMapper.selectVehicleInfoById(vehicleId); if (vehicleInfo != null && vehicleInfo.getCarId() != null) { Long carId = vehicleInfo.getCarId().longValue(); log.info("获取任务关联车辆的CarID成功,任务ID: {}, 车辆ID: {}, CarID: {}", taskId, vehicleId, carId); return carId; } else { log.warn("车辆信息中未配置CarID,任务ID: {}, 车辆ID: {}", taskId, vehicleId); } } else { log.warn("任务车辆关联记录中车辆ID为空,任务ID: {}", taskId); } } else { log.warn("任务未关联车辆,任务ID: {}", taskId); } } catch (Exception e) { log.error("查询任务关联车辆的CarID异常,任务ID: {}", taskId, e); } return 0L; } /** * 获取任务的执行人员信息列表(包含角色类型) * * @param taskId 任务ID * @return 执行人员信息列表 */ private List getTaskAssignees(Long taskId) { List assignees = new java.util.ArrayList<>(); try { // 从数据库查询执行人员信息(按排序顺序) List taskAssignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); if (taskAssignees != null && !taskAssignees.isEmpty()) { // 将数据库中的执行人员转换为AssigneeInfo对象 for (SysTaskAssignee taskAssignee : taskAssignees) { TaskCreateVO.AssigneeInfo assignee = new TaskCreateVO.AssigneeInfo(); assignee.setUserId(taskAssignee.getUserId()); assignee.setUserName(taskAssignee.getUserName()); assignee.setUserType(taskAssignee.getUserType()); assignees.add(assignee); } log.info("从数据库获取执行人员信息成功,任务ID: {}, 人员数量: {}", taskId, assignees.size()); return assignees; } // 如果数据库中没有执行人员信息,尝试从任务的主要执行人获取 // log.warn("数据库中未找到执行人员信息,尝试从任务主要执行人获取,任务ID: {}", taskId); SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task != null && task.getAssigneeId() != null) { SysUser user = sysUserMapper.selectUserById(task.getAssigneeId()); if (user != null) { TaskCreateVO.AssigneeInfo assignee = new TaskCreateVO.AssigneeInfo(); assignee.setUserId(user.getUserId()); assignee.setUserName(user.getNickName()); assignee.setUserType(taskSyncUtilService.getUserType(user)); // 通过角色判断类型 assignees.add(assignee); } } } catch (Exception e) { log.error("获取任务执行人员信息异常,任务ID: {}", taskId, e); } return assignees; } /** * 同步任务执行人员信息到调度单随行人员参数 * * @param task 任务信息 * @param params 调度单参数Map */ private void syncTaskAssignees(SysTask task, Map params) { try { // 获取任务的执行人员信息列表(包含角色类型) //TODO 如果有两个司机就要 设置 Entourage_1和Entourage_2 //两个护士就要设置 Entourage_4和Entourage_6 //两个医生要设置 Entourage_3和Entourage_5 List assignees = getTaskAssignees(task.getTaskId()); if (assignees == null || assignees.isEmpty()) { log.warn("任务无执行人员,任务ID: {}", task.getTaskId()); // 设置默认空值 params.put("EntourageLeadID", ""); params.put("Entourage_1", ""); // 司机 params.put("Entourage_2", ""); //司机 params.put("Entourage_3", ""); // 医生 params.put("Entourage_5", ""); //医生 params.put("Entourage_4", ""); // 护士 params.put("Entourage_6", ""); // 护士 return; } String leadEntourageId = ""; // 领队的EntourageID String driverOaId = ""; // 司机的OA_UserID String doctorOaId = ""; // 医生的OA_UserID String nurseOaId = ""; // 护士的OA_UserID // 遍历执行人员,根据角色类型分配到对应的Entourage参数 for (int i = 0; i < assignees.size(); i++) { TaskCreateVO.AssigneeInfo assignee = assignees.get(i); Long userId = assignee.getUserId(); String userType = assignee.getUserType(); // 直接使用前端传递的角色类型 if (userId == null) { continue; } // 查询用户的OA_UserID SysUser user = sysUserMapper.selectUserById(userId); if (user == null || user.getOaUserId() == null) { log.warn("执行人员信息不存在或未配置OA_UserID,用户ID: {}", userId); continue; } String oaUserId = user.getOaUserId().toString(); // 根据用户类型分配到对应的Entourage参数 if ("driver".equals(userType)) { if (driverOaId.isEmpty()) { driverOaId = oaUserId; if(params.get("Entourage_1")==null) { params.put("Entourage_1", oaUserId); }else{ params.put("Entourage_2", oaUserId); } // 如果是第一个执行人员,设置为领队 if (i == 0 && leadEntourageId.isEmpty()) { leadEntourageId = "1"; // 司机对应Entourage_1 } } } else if ("doctor".equals(userType)) { if (doctorOaId.isEmpty()) { doctorOaId = oaUserId; if(params.get("Entourage_3")==null) { params.put("Entourage_3", oaUserId); }else{ params.put("Entourage_5", oaUserId); } // 如果是第一个执行人员,设置为领队 if (i == 0 && leadEntourageId.isEmpty()) { leadEntourageId = "3"; // 医生对应Entourage_3 } } } else if ("nurse".equals(userType)) { if (nurseOaId.isEmpty()) { nurseOaId = oaUserId; if(params.get("Entourage_4")==null) { params.put("Entourage_4", oaUserId); }else{ params.put("Entourage_6", oaUserId); } // 如果是第一个执行人员,设置为领队 if (i == 0 && leadEntourageId.isEmpty()) { leadEntourageId = "4"; // 护士对应Entourage_4 } } } } // 设置参数 params.put("EntourageLeadID", leadEntourageId); // params.put("Entourage_1", driverOaId); // 司机 // params.put("Entourage_3", doctorOaId); // 医生 // params.put("Entourage_4", nurseOaId); // 护士 // log.info("任务执行人员同步成功,任务ID: {}, 领队ID: {}, 司机: {}, 医生: {}, 护士: {}", // task.getTaskId(), leadEntourageId, driverOaId, doctorOaId, nurseOaId); } catch (Exception e) { log.error("同步任务执行人员异常,任务ID: {}", task.getTaskId(), e); // 设置默认空值 params.put("EntourageLeadID", ""); params.put("Entourage_1", ""); params.put("Entourage_3", ""); params.put("Entourage_4", ""); } } }