wlzboy
2026-03-31 61c4c3f45e4257e2e7662f033e2719e62366c632
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -27,6 +27,7 @@
import com.ruoyi.system.domain.SysTaskVehicle;
import com.ruoyi.system.domain.SysTaskAttachment;
import com.ruoyi.system.domain.SysTaskLog;
import com.ruoyi.system.domain.SysTaskStatusHistory;
import com.ruoyi.system.domain.SysTaskEmergency;
import com.ruoyi.system.domain.SysTaskWelfare;
import com.ruoyi.system.domain.SysTaskAssignee;
@@ -56,6 +57,9 @@
    
    @Autowired
    private SysTaskLogMapper sysTaskLogMapper;
    @Autowired
    private SysTaskStatusHistoryMapper sysTaskStatusHistoryMapper;
    
    @Autowired
    private SysTaskEmergencyMapper sysTaskEmergencyMapper;
@@ -189,7 +193,7 @@
    }
    /**
     * 根据任务编号、调度单编号或服务单编号查询任务列表
     *根据任务编号、调度单编号或服务单编号查询任务列表(SQL算法下推优化版本)
     * 
     * @param queryVO 任务查询对象
     * @param taskCode 任务编号
@@ -197,52 +201,34 @@
     */
    @Override
    public List<SysTask> selectSysTaskListByMultiCode(TaskQueryVO queryVO, String taskCode) {
        // Create a new query object without the taskCode filter
        TaskQueryVO newQuery = new TaskQueryVO();
        // Copy all properties except taskCode
        try {
            org.springframework.beans.BeanUtils.copyProperties(queryVO, newQuery, "taskCode");
        } catch (Exception e) {
            // If copy fails, manually copy the important fields
            newQuery.setTaskType(queryVO.getTaskType());
            newQuery.setTaskStatus(queryVO.getTaskStatus());
            newQuery.setVehicleNo(queryVO.getVehicleNo());
            newQuery.setCreatorId(queryVO.getCreatorId());
            newQuery.setAssigneeId(queryVO.getAssigneeId());
            newQuery.setDeptId(queryVO.getDeptId());
            newQuery.setDeptIds(queryVO.getDeptIds());
            newQuery.setPlannedStartTimeBegin(queryVO.getPlannedStartTimeBegin());
            newQuery.setPlannedStartTimeEnd(queryVO.getPlannedStartTimeEnd());
            newQuery.setPlannedEndTimeBegin(queryVO.getPlannedEndTimeBegin());
            newQuery.setPlannedEndTimeEnd(queryVO.getPlannedEndTimeEnd());
            newQuery.setOverdue(queryVO.getOverdue());
        }
        // Get all tasks matching the other criteria
        List<SysTask> allTasks = sysTaskMapper.selectSysTaskList(newQuery);
        allTasks.stream().forEach(task -> {
        // 设置任务码用于SQL查询
        queryVO.setTaskCode(taskCode);
        // 使用优化的查询方法,直接在SQL中关联sys_task_emergency表并计算匹配的dispatchCode和serviceCode
        List<SysTask> tasks = sysTaskMapper.selectSysTaskListByMultiCodeOptimized(queryVO);
        // 处理任务分配信息和急救转运扩展信息
        tasks.forEach(task -> {
            bindTaskAssign(task);
            // 对于急救转运任务,使用SQL查询中已计算并匹配好的dispatchCode和serviceCode
            if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) {
                SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(task.getTaskId());
                task.setEmergencyInfo(emergencyInfo);
                // 创建一个临时的emergencyInfo对象,包含从SQL查询结果中获取的计算后的代码
//                SysTaskEmergency emergencyInfo = new SysTaskEmergency();
//                emergencyInfo.setDispatchCode(task.getDispatchCode());
//                emergencyInfo.setServiceCode(task.getServiceCode());
                // 加载完整的扩展信息
                SysTaskEmergency fullEmergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(task.getTaskId());
                if (fullEmergencyInfo != null) {
                    // 保留完整信息,但确保dispatchCode和serviceCode是计算后的值
                    task.setEmergencyInfo(fullEmergencyInfo);
                }
            }
        });
        return allTasks.stream().filter(task -> {
            if (task.getTaskCode() != null && task.getTaskCode().contains(taskCode)) {
                return true;
            }
            bindTaskAssign(task);
            if ("EMERGENCY_TRANSFER".equals(task.getTaskType()) && task.getEmergencyInfo() != null) {
                String dispatchCode = task.getEmergencyInfo().getDispatchCode();
                String serviceCode = task.getEmergencyInfo().getServiceCode();
                return (dispatchCode != null && dispatchCode.contains(taskCode)) ||
                        (serviceCode != null && serviceCode.contains(taskCode));
            }
            return false;
        }).collect(Collectors.toList());
        return tasks;
    }
    /**
@@ -700,6 +686,7 @@
        }
//        task.setAssigneeId(updateVO.getAssigneeId());
        task.setUpdateBy(userName);
        task.setUpdateTime(DateUtils.getNowDate());
@@ -968,6 +955,15 @@
            recordTaskLog(task.getTaskId(), "FORCE_COMPLETE", "强制完成任务", 
                         oldStatus, task.getTaskStatus(), 
                         SecurityUtils.getUserId(), SecurityUtils.getUsername());
            // 写入状态变更历史记录
            recordStatusHistory(oldTask, oldStatus,
                    oldTaskStatus != null ? oldTaskStatus.getInfo() : oldStatus,
                    task.getTaskStatus(),
                    TaskStatus.getByCode(task.getTaskStatus()) != null ? TaskStatus.getByCode(task.getTaskStatus()).getInfo() : task.getTaskStatus(),
                    task.getRemark(),
                    SysTaskStatusHistory.SOURCE_APP,
                    SecurityUtils.getUserId(), SecurityUtils.getUsername(),
                    null);
            
            // 发布任务状态变更事件
            TaskStatus newTaskStatus = TaskStatus.getByCode(task.getTaskStatus());
@@ -1040,6 +1036,12 @@
                         "状态:" + newStatus.getInfo() + ",备注:" + remark, 
                         SecurityUtils.getUserId(), SecurityUtils.getUsername(),
                         locationLog);
            // 写入状态变更历史记录
            recordStatusHistory(oldTask, oldTaskStatus.getCode(), oldTaskStatus.getInfo(),
                    newStatus.getCode(), newStatus.getInfo(), remark,
                    SysTaskStatusHistory.SOURCE_APP,
                    SecurityUtils.getUserId(), SecurityUtils.getUsername(),
                    locationLog);
        }
        
        // 发布任务状态变更事件
@@ -1503,6 +1505,51 @@
    }
    /**
     * 记录任务状态变更历史
     *
     * @param task            任务对象(取 task_id / task_code)
     * @param fromStatus      变更前状态码
     * @param fromStatusName  变更前状态名称
     * @param toStatus        变更后状态码
     * @param toStatusName    变更后状态名称
     * @param changeReason    变更原因/备注
     * @param changeSource    触发来源(APP / ADMIN / SYSTEM / LEGACY)
     * @param operatorId      操作人 ID
     * @param operatorName    操作人姓名
     * @param locationLog     GPS 位置信息(可为 null)
     */
    private void recordStatusHistory(SysTask task,
                                     String fromStatus, String fromStatusName,
                                     String toStatus, String toStatusName,
                                     String changeReason, String changeSource,
                                     Long operatorId, String operatorName,
                                     SysTaskLog locationLog) {
        try {
            SysTaskStatusHistory history = new SysTaskStatusHistory();
            history.setTaskId(task.getTaskId());
            history.setTaskCode(task.getTaskCode());
            history.setFromStatus(fromStatus);
            history.setFromStatusName(fromStatusName);
            history.setToStatus(toStatus);
            history.setToStatusName(toStatusName);
            history.setChangeReason(changeReason);
            history.setChangeSource(changeSource != null ? changeSource : SysTaskStatusHistory.SOURCE_APP);
            history.setOperatorId(operatorId);
            history.setOperatorName(operatorName);
            history.setChangeTime(DateUtils.getNowDate());
            history.setIpAddress("127.0.0.1");
            if (locationLog != null) {
                history.setLongitude(locationLog.getLongitude());
                history.setLatitude(locationLog.getLatitude());
                history.setLocationAddress(locationLog.getLocationAddress());
            }
            sysTaskStatusHistoryMapper.insert(history);
        } catch (Exception e) {
            log.error("记录任务状态变更历史失败, taskId={}", task.getTaskId(), e);
        }
    }
    /**
     * 构建任务描述
     * 
     * @param task 任务对象
@@ -1652,6 +1699,13 @@
        }
    }
    private AjaxResult getCheckCanSuccess(){
        List<Map<String, Object>> conflicts = new ArrayList<>();
        Map<String, Object> result = new HashMap<>();
        result.put("valid", conflicts.isEmpty());
        result.put("conflicts", conflicts);
        return AjaxResult.success(result);
    }
    /**
     * 检查任务是否可以出发
     * 检查:
@@ -1663,13 +1717,18 @@
     */
    @Override
    public AjaxResult checkTaskCanDepart(Long taskId) {
        return getCheckCanSuccess();
    }
    public AjaxResult checkTaskCanDepartOld(Long taskId) {
        List<Map<String, Object>> conflicts = new ArrayList<>();
        Map<String, Object> result = new HashMap<>();
        // 获取任务详情
        SysTask task = this.getTaskDetail(taskId);
        if (task == null) {
            return AjaxResult.error("任务不存在");
        }
        List<Map<String, Object>> conflicts = new ArrayList<>();
        
        // 1. 检查车辆是否有未完成的任务
        List<SysTaskVehicle> taskVehicles = task.getAssignedVehicles();
@@ -1745,8 +1804,7 @@
            }
        }
        
        // 返回结果
        Map<String, Object> result = new HashMap<>();
        result.put("valid", conflicts.isEmpty());
        result.put("conflicts", conflicts);