| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import com.ruoyi.common.annotation.DataSource; |
| | | import com.ruoyi.common.core.domain.entity.SysDept; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.common.enums.DataSourceType; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | 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.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; |
| | | |
| | |
| | | |
| | | @Autowired |
| | | private ISysUserService sysUserService; |
| | | |
| | | |
| | | @Autowired |
| | | private IWechatTaskNotifyService wechatTaskNotifyService; |
| | | |
| | | |
| | | |
| | | /** |
| | | * 同步指定日期范围的旧系统转运单到新系统 |
| | | * |
| | |
| | | // 检查是否已同步 |
| | | if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { |
| | | log.debug("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); |
| | | //进行更新操作 |
| | | updateTransferOrder(serviceOrdID, dispatchOrdID, order); |
| | | continue; |
| | | } |
| | | |
| | |
| | | log.error("服务单ID不能为空"); |
| | | return false; |
| | | } |
| | | |
| | | // 直接查询指定的转运单信息 |
| | | List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID); |
| | | |
| | | Map<String, Object> order = transferOrders.get(0); |
| | | |
| | | // 检查是否已同步 |
| | | if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) { |
| | | log.info("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); |
| | | updateTransferOrder(serviceOrdID, dispatchOrdID, order); |
| | | return true; |
| | | } |
| | | |
| | | // 直接查询指定的转运单信息 |
| | | List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrdersByIDs(serviceOrdID, dispatchOrdID); |
| | | |
| | | |
| | | if (transferOrders == null || transferOrders.isEmpty()) { |
| | | log.error("未查询到对应的转运单信息: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID); |
| | | return false; |
| | | } |
| | | |
| | | Map<String, Object> order = transferOrders.get(0); |
| | | |
| | | |
| | | // 同步单个转运单 |
| | | return syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order); |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | private boolean updateTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> 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; |
| | | } |
| | | } |
| | | /** |
| | | * 同步单个旧系统转运单到新系统(带详细信息) |
| | | * |
| | |
| | | */ |
| | | private boolean syncSingleTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> 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; |
| | |
| | | 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"); |
| | | /** |
| | | * 创建人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, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time); |
| | | 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); |
| | |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("同步单个转运单异常: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e); |
| | | log.error("同步单个转运单异常: ServiceOrdID={}, DispatchOrdID={},sysTaskCode:{}", serviceOrdID, dispatchOrdID,sysTaskCode, e); |
| | | return false; |
| | | } |
| | | } |
| | |
| | | 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对象用于创建任务 |
| | | * |
| | |
| | | log.error("服务单ID不能为空"); |
| | | return null; |
| | | } |
| | | |
| | | String serviceOrdClass = getStringValue(order, "ServiceOrdClass"); |
| | | //TODO |
| | | TaskCreateVO createTaskVo = new TaskCreateVO(); |
| | | String Old_ServiceOrdID_TXT=getStringValue(order,"Old_ServiceOrdID_TXT"); |
| | | if(Old_ServiceOrdID_TXT!=null){ |
| | | createTaskVo.setTaskCode(Old_ServiceOrdID_TXT); |
| | | } |
| | | |
| | | 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(从旧系统字段映射) |
| | | String serviceOrdClass = getStringValue(order, "ServiceOrdClass"); |
| | | |
| | | if (StringUtils.isNotEmpty(serviceOrdClass)) { |
| | | createTaskVo.setDocumentTypeId(serviceOrdClass); |
| | | } |
| | |
| | | |
| | | // 设置区域类型 |
| | | String serviceOrdAreaType = getStringValue(order, "ServiceOrdAreaType"); |
| | | if (StringUtils.isNotEmpty(serviceOrdAreaType)) { |
| | | // 可以根据需要将区域类型映射到TaskCreateVO的其他字段 |
| | | log.debug("区域类型: {}", serviceOrdAreaType); |
| | | } |
| | | |
| | | |
| | | // 设置用户ID |
| | | Long serviceOrdUserID = getLongValue(order, "ServiceOrdUserID"); |
| | | if (serviceOrdUserID != null) { |
| | | // 可以根据需要将用户ID映射到TaskCreateVO的其他字段 |
| | | log.debug("用户ID: {}", serviceOrdUserID); |
| | | } |
| | | |
| | | |
| | | // 设置患者信息 |
| | | TaskCreateVO.PatientInfo patientInfo = new TaskCreateVO.PatientInfo(); |
| | | patientInfo.setName(getStringValue(order, "ServiceOrdPtName")); |
| | |
| | | |
| | | |
| | | String hospitalOutDeptId = getStringValue(order, "ServiceOrdPtServicesID"); |
| | | |
| | | //转出床位 |
| | | String serviceOrdPtServices=getStringValue(order, "ServiceOrdPtServices"); |
| | | hospitalOutInfo.setDepartmentId(hospitalOutDeptId); |
| | | if (StringUtils.isNotEmpty(hospitalOutDeptId)) { |
| | | String hospitalOutDeptName = legacyTransferSyncMapper.selectDepartmentNameByDeptID(hospitalOutDeptId); |
| | |
| | | hospitalOutInfo.setDepartment(hospitalOutDeptName); |
| | | } |
| | | } |
| | | //转出床位 |
| | | String serviceOrdPtServices=getStringValue(order, "ServiceOrdPtServices"); |
| | | if(serviceOrdPtServices!= null){ |
| | | hospitalOutInfo.setBedNumber(serviceOrdPtServices); |
| | | } |
| | |
| | | hospitalInInfo.setName(hospitalInName); |
| | | } |
| | | } |
| | | String DispatchOrdTraEnd = getStringValue(order, "DispatchOrdTraEnd"); |
| | | if(DispatchOrdTraEnd!= null){ |
| | | hospitalInInfo.setAddress(DispatchOrdTraEnd); |
| | | String serviceOrdTraEnd = getStringValue(order, "ServiceOrdTraEnd"); |
| | | if(serviceOrdTraEnd!= null){ |
| | | hospitalInInfo.setAddress(serviceOrdTraEnd); |
| | | } |
| | | //转入床位 |
| | | String serviceOrdPtInServices =getStringValue(order, "ServiceOrdPtInServices"); |
| | |
| | | createTaskVo.setHospitalIn(hospitalInInfo); |
| | | |
| | | // 设置地址信息 |
| | | createTaskVo.setDepartureAddress(getStringValue(order, "ServiceOrdTraVia")); |
| | | createTaskVo.setDepartureAddress(getStringValue(order, "ServiceOrdTraStreet")); |
| | | createTaskVo.setDestinationAddress(getStringValue(order, "ServiceOrdTraEnd")); |
| | | |
| | | // 设置价格和距离信息 |
| | | createTaskVo.setPrice(getBigDecimalValue(order, "ServiceOrdTraTxnPrice")); |
| | | // 距离信息需要从其他字段计算或获取 |
| | | |
| | | // 设置执行人信息 |
| | | List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID); |
| | | createTaskVo.setAssignees(assignees); |
| | | |
| | | |
| | | if(dispatchOrdID!=null) { |
| | | // 设置执行人信息 |
| | | List<TaskCreateVO.AssigneeInfo> assignees = queryAssignees(dispatchOrdID); |
| | | createTaskVo.setAssignees(assignees); |
| | | if (!assignees.isEmpty()) { |
| | | createTaskVo.setAssigneeId(assignees.get(0).getUserId()); |
| | | } |
| | | } |
| | | // 设置车辆信息 |
| | | // 车辆ID需要根据DispatchOrdCarID查询获取 |
| | | String carID = getStringValue(order, "DispatchOrdCarID"); |
| | |
| | | |
| | | |
| | | |
| | | // 设置创建时间 |
| | | // 设置创建时间 开单日期 |
| | | Date createTime = getDateValue(order, "ServiceOrd_CC_Time"); |
| | | if (createTime != null) { |
| | | createTaskVo.setCreateTime(createTime); |
| | |
| | | if (assigneeList != null && !assigneeList.isEmpty()) { |
| | | for (Map<String, Object> assigneeMap : assigneeList) { |
| | | String entourageOAId = getStringValue(assigneeMap, "EntourageOAId"); |
| | | String entourageState = getStringValue(assigneeMap, "EntourageState"); |
| | | String entourageState = getStringValue(assigneeMap, "EntourageID"); |
| | | |
| | | if (StringUtils.isNotEmpty(entourageOAId)) { |
| | | try { |
| | |
| | | if (sysUser != null) { |
| | | TaskCreateVO.AssigneeInfo assigneeInfo = new TaskCreateVO.AssigneeInfo(); |
| | | assigneeInfo.setUserId(sysUser.getUserId()); // 使用系统用户ID |
| | | assigneeInfo.setUserName(sysUser.getUserName()); |
| | | assigneeInfo.setUserName(sysUser.getNickName()); |
| | | // 根据EntourageState确定角色类型 |
| | | // 1,2 司机,3,5 医生,4,6 护士 |
| | | if ("1".equals(entourageState) || "2".equals(entourageState)) { |
| | |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void notifyTransferOrderByWechat(Long taskId, |
| | | String serviceOrdID, |
| | | String dispatchOrdID, |
| | | String serviceOrdNo, |
| | | Date serviceOrdCcTime, |
| | | SysDept dept, |
| | | Map<String, Object> order) { |
| | | try { |
| | | // 获取通知接收人列表 |
| | | List<SysUser> receivers = getWechatNotifyUsers(dispatchOrdID, dept); |
| | | if (receivers == null || receivers.isEmpty()) { |
| | | log.info("旧系统同步转运单无可用微信接收人,taskId={}", taskId); |
| | | return; |
| | | } |
| | | |
| | | // 提取接收人 ID 列表 |
| | | List<Long> 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<SysUser> getWechatNotifyUsers(String dispatchOrdID, SysDept dept) { |
| | | try { |
| | | List<SysUser> result = new ArrayList<>(); |
| | | |
| | | List<TaskCreateVO.AssigneeInfo> 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<>(); |
| | | } |
| | | } |
| | | } |