wlzboy
9 天以前 09faa36132c8cbada5327649875534ef01c1a3b1
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysTaskEmergency;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.domain.enums.TaskStatus;
import com.ruoyi.system.domain.vo.TaskCreateVO;
import com.ruoyi.system.domain.vo.TaskUpdateVO;
import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
@@ -17,6 +18,7 @@
import com.ruoyi.system.mapper.VehicleInfoMapper;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.service.IWechatTaskNotifyService;
import com.ruoyi.system.utils.TaskStatusConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
@@ -170,22 +172,24 @@
                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);
@@ -196,6 +200,13 @@
        }
    }
    /**
     * 更新单个转运单
     * @param serviceOrdID
     * @param dispatchOrdID
     * @param order
     * @return
     */
    private boolean updateTransferOrder(String serviceOrdID, String dispatchOrdID, Map<String, Object> order){
        log.info("开始同步单个转运单: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        String sysTaskCode="";
@@ -207,13 +218,11 @@
            }
            // 构造TaskCreateVO对象
            TaskCreateVO createTaskVo = buildCreateTaskVo(serviceOrdID, dispatchOrdID, order);
            sysTaskCode = createTaskVo.getTaskCode();
            if (createTaskVo == null) {
                log.error("构造TaskCreateVO失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                return false;
            }
            sysTaskCode = createTaskVo.getTaskCode();
            // 记录创建的任务信息
            log.debug("准备创建任务: ServiceOrdID={}, DispatchOrdID={}, 患者姓名={}, 转出医院={}, 转入医院={}",
                    serviceOrdID, dispatchOrdID,
@@ -228,15 +237,26 @@
            String serviceOrdClass = getStringValue(order,"ServiceOrdClass");
            String serviceOrdNo = getStringValue(order,"ServiceOrdNo");
            Integer oauserId=getIntegerValue(order,"ServiceOrd_NS_ID");
            Integer oauserId=getIntegerValue(order,"ServiceOrd_CC_ID");
            if(oauserId==null){
                oauserId=getIntegerValue(order,"ServiceOrd_NS_ID");
            }
            if(oauserId==null || oauserId==0){
                log.error("创建任务时,获取创建人信息失败,serviceOrdID={}, DispatchOrdID={} ServiceOrd_NS_ID={},ServiceOrd_CC_ID={}", serviceOrdID, dispatchOrdID, getIntegerValue(order,"ServiceOrd_NS_ID"),getIntegerValue(order,"ServiceOrd_CC_ID"));
                return false;
            }
            SysUser sysUser=sysUserService.selectUserByOaUserId(oauserId);
            Long taskCreatorId=sysUser==null?null:sysUser.getUserId();
            String createUserName=sysUser==null?"system":sysUser.getUserName();
            if(taskCreatorId==null || createUserName==null){
                log.error("创建任务时,获取创建人信息失败,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                return false;
            }
            SysDept dept=sysDeptService.selectDeptByServiceClass(serviceOrdClass);
            Long deptId=dept==null?null:dept.getDeptId();
            TaskUpdateVO updateTaskVo = new TaskUpdateVO();
            BeanUtils.copyProperties(createTaskVo, updateTaskVo);
            log.info("开始保存转运任务,serviceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
            int result = sysTaskService.updateTask(updateTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
@@ -294,12 +314,23 @@
            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");
            if(oauserId==null || oauserId==0) {
                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();
            if(sysUser==null){
                log.error("创建任务时,获取创建人信息失败,serviceOrdID={}, DispatchOrdID={} ServiceOrd_CC_ID:{},ServiceOrd_NS_ID:{}", serviceOrdID, dispatchOrdID, getIntegerValue(order,"ServiceOrd_CC_ID"),getIntegerValue(order,"ServiceOrd_NS_ID"));
                return false;
            }
            Long taskCreatorId= sysUser.getUserId();
            String createUserName= 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);
@@ -389,7 +420,7 @@
     */
    @Override
    public TaskCreateVO buildCreateTaskVo(String serviceOrdID, String dispatchOrdID, Map<String, Object> order) {
        log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
//        log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
        try {
            // 检查参数有效性
@@ -403,11 +434,11 @@
                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);
//            log.info("构造TaskCreateVO: ServiceOrdID={}, DispatchOrdID={},taskCode:{}", serviceOrdID, dispatchOrdID,serviceOrdCode);
            // 设置基本信息
            createTaskVo.setTaskType("EMERGENCY_TRANSFER"); // 急救转运任务
            
@@ -424,18 +455,10 @@
            
            // 设置区域类型
            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"));
@@ -503,9 +526,9 @@
                    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");
@@ -525,20 +548,21 @@
            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(!assignees.isEmpty()){
                createTaskVo.setAssigneeId(assignees.get(0).getUserId());
            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");
@@ -546,7 +570,8 @@
                String carLicense = legacyTransferSyncMapper.selectCarLicenseByCarID(carID);
                if (StringUtils.isNotEmpty(carLicense)) {
                    // 根据车牌号查询新系统中的车辆ID
                    log.debug("车辆车牌号: {}", carLicense);
                    log.info("转运任务,ServiceOrdID:{},车辆车牌:{}",serviceOrdID,carLicense);
//                    log.debug("车辆车牌号: {}", carLicense);
                    
                    // 首先尝试通过VehicleInfoMapper查询车辆信息
                    try {
@@ -558,7 +583,7 @@
                            List<Long> vehicleIds = new ArrayList<>();
                            vehicleIds.add(vehicleInfo.getVehicleId());
                            createTaskVo.setVehicleIds(vehicleIds);
                            log.debug("通过car_id找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
//                            log.debug("通过car_id找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                        } else {
                            // 如果通过car_id找不到,尝试通过车牌号查询
                            vehicleInfo = vehicleInfoMapper.selectVehicleInfoByVehicleNo(carLicense);
@@ -566,9 +591,9 @@
                                List<Long> vehicleIds = new ArrayList<>();
                                vehicleIds.add(vehicleInfo.getVehicleId());
                                createTaskVo.setVehicleIds(vehicleIds);
                                log.debug("通过车牌号找到车辆信息: vehicle_id={}, vehicle_no={}", vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                                log.debug("转运任务,ServiceOrdID:{} 通过车牌号找到车辆信息: vehicle_id={}, vehicle_no={}",serviceOrdID, vehicleInfo.getVehicleId(), vehicleInfo.getVehicleNo());
                            } else {
                                log.warn("未找到对应的车辆信息: car_id={}, vehicle_no={}", carID, carLicense);
                                log.warn("转运任务,ServiceOrdID:{} 未找到对应的车辆信息: car_id={}, vehicle_no={}",serviceOrdID, carID, carLicense);
                            }
                        }
                    } catch (NumberFormatException e) {
@@ -587,6 +612,7 @@
                }
            }
            
            // 设置其他信息
            createTaskVo.setTaskDescription("从旧系统同步的转运单");
@@ -637,8 +663,15 @@
                }
                createTaskVo.setDiseaseIds(diseaseIds);
            }
            Integer dispatchOrdStatus = getIntegerValue(order, "DispatchOrdStatus");
           TaskStatus status= TaskStatusConverter.convertFromLegacyStatus(dispatchOrdStatus);
           if(status!=null) {
               createTaskVo.setTaskStatus(status.getCode());
           }
            
            log.info("TaskCreateVO构造完成: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
//            log.info("TaskCreateVO构造完成: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
            return createTaskVo;
            
        } catch (Exception e) {
@@ -654,6 +687,7 @@
     * @return 执行人信息列表
     */
    private List<TaskCreateVO.AssigneeInfo> queryAssignees(String dispatchOrdID) {
        long startTime = System.currentTimeMillis();
        try {
            // 检查参数有效性
            if (StringUtils.isEmpty(dispatchOrdID)) {
@@ -661,8 +695,24 @@
                return new ArrayList<>();
            }
            
            // 从SQL Server查询执行人信息
            List<Map<String, Object>> assigneeList = legacyTransferSyncMapper.selectAssigneesByDispatchOrdID(dispatchOrdID);
            // 将String转换为Long,避免数据库类型不匹配导致的性能问题
            Long dispatchOrdIdLong;
            try {
                dispatchOrdIdLong = Long.valueOf(dispatchOrdID);
            } catch (NumberFormatException e) {
                log.error("调度单ID格式不正确: {}", dispatchOrdID, e);
                return new ArrayList<>();
            }
            // 从SQL Server查询执行人信息(使用Long类型,匹配BIGINT字段)
            List<Map<String, Object>> assigneeList = legacyTransferSyncMapper.selectAssigneesByDispatchOrdID(dispatchOrdIdLong);
            long queryTime = System.currentTimeMillis() - startTime;
            // 记录慢查询(超过500ms)
            if (queryTime > 500) {
                log.warn("查询执行人信息耗时过长: {}ms, 调度单ID: {}, 建议在 DispatchOrd_Entourage 表的 DispatchOrdIDDt 字段上创建索引",
                    queryTime, dispatchOrdID);
            }
            
            // 转换为TaskCreateVO.AssigneeInfo对象
            List<TaskCreateVO.AssigneeInfo> assignees = new ArrayList<>();
@@ -680,7 +730,7 @@
                            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)) {
@@ -704,10 +754,11 @@
                }
            }
            
            log.info("查询到{}个执行人,调度单ID: {}", assignees.size(), dispatchOrdID);
            log.debug("查询到{}个执行人,调度单ID: {}, 耗时: {}ms", assignees.size(), dispatchOrdID, System.currentTimeMillis() - startTime);
            return assignees;
        } catch (Exception e) {
            log.error("查询执行人信息异常,调度单ID: {}", dispatchOrdID, e);
            long totalTime = System.currentTimeMillis() - startTime;
            log.error("查询执行人信息异常,调度单ID: {}, 耗时: {}ms", dispatchOrdID, totalTime, e);
            return new ArrayList<>(); // 返回空列表而不是null
        }
    }