package com.ruoyi.system.service.impl; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.ArrayList; import java.util.stream.Collectors; import java.io.File; import java.io.IOException; import com.ruoyi.system.utils.TaskCodeGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.GpsDistanceUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskVehicle; import com.ruoyi.system.domain.SysTaskAttachment; import com.ruoyi.system.domain.SysTaskLog; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.SysTaskWelfare; import com.ruoyi.system.domain.SysTaskAssignee; import com.ruoyi.system.domain.vo.TaskQueryVO; import com.ruoyi.system.domain.vo.TaskCreateVO; import com.ruoyi.system.domain.vo.TaskUpdateVO; import com.ruoyi.system.domain.vo.TaskStatisticsVO; import com.ruoyi.system.domain.enums.TaskStatus; import com.ruoyi.system.mapper.SysTaskMapper; import com.ruoyi.system.mapper.SysTaskVehicleMapper; import com.ruoyi.system.mapper.SysTaskAttachmentMapper; import com.ruoyi.system.mapper.SysTaskLogMapper; import com.ruoyi.system.mapper.SysTaskEmergencyMapper; import com.ruoyi.system.mapper.SysTaskWelfareMapper; import com.ruoyi.system.mapper.SysTaskAssigneeMapper; import com.ruoyi.system.mapper.VehicleInfoMapper; import com.ruoyi.system.domain.VehicleInfo; import com.ruoyi.system.service.ISysTaskService; import com.ruoyi.system.service.ILegacySystemSyncService; import org.springframework.beans.factory.annotation.Autowired; /** * 任务管理Service业务层处理 * * @author ruoyi * @date 2024-01-15 */ @Service public class SysTaskServiceImpl implements ISysTaskService { @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskVehicleMapper sysTaskVehicleMapper; @Autowired private SysTaskAttachmentMapper sysTaskAttachmentMapper; @Autowired private SysTaskLogMapper sysTaskLogMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private SysTaskWelfareMapper sysTaskWelfareMapper; @Autowired private SysTaskAssigneeMapper sysTaskAssigneeMapper; @Autowired private VehicleInfoMapper vehicleInfoMapper; @Autowired(required = false) private ILegacySystemSyncService legacySystemSyncService; /** * 查询任务管理 * * @param taskId 任务管理主键 * @return 任务管理 */ @Override public SysTask selectSysTaskByTaskId(Long taskId) { SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task != null) { // 加载急救转运扩展信息 if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) { SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId); task.setEmergencyInfo(emergencyInfo); } // 加载福祉车扩展信息 else if ("WELFARE".equals(task.getTaskType())) { SysTaskWelfare welfareInfo = sysTaskWelfareMapper.selectSysTaskWelfareByTaskId(taskId); task.setWelfareInfo(welfareInfo); } } return task; } /** * 查询任务管理列表 * * @param queryVO 任务查询对象 * @return 任务管理 */ @Override public List selectSysTaskList(TaskQueryVO queryVO) { return sysTaskMapper.selectSysTaskList(queryVO); } /** * 新增任务管理 * * @param createVO 任务创建对象 * @return 结果 */ @Override @Transactional public int insertSysTask(TaskCreateVO createVO) { SysTask task = new SysTask(); task.setTaskCode(generateTaskCode()); task.setTaskType(createVO.getTaskType()); task.setTaskStatus(TaskStatus.PENDING.getCode()); task.setTaskDescription(createVO.getTaskDescription()); task.setPlannedStartTime(createVO.getPlannedStartTime()); task.setPlannedEndTime(createVO.getPlannedEndTime()); task.setAssigneeId(createVO.getAssigneeId()); task.setCreatorId(SecurityUtils.getUserId()); // 优先使用前端传入的部门ID,如果没有则使用当前用户的部门ID task.setDeptId(createVO.getDeptId() != null ? createVO.getDeptId() : SecurityUtils.getDeptId()); task.setCreateBy(SecurityUtils.getUsername()); task.setCreateTime(DateUtils.getNowDate()); task.setUpdateBy(SecurityUtils.getUsername()); task.setUpdateTime(DateUtils.getNowDate()); task.setRemark(createVO.getRemark()); task.setDelFlag("0"); // 设置通用地址和坐标信息 if (createVO.getDepartureAddress() != null) { task.setDepartureAddress(createVO.getDepartureAddress()); } if (createVO.getDestinationAddress() != null) { task.setDestinationAddress(createVO.getDestinationAddress()); } if (createVO.getDepartureLongitude() != null) { task.setDepartureLongitude(createVO.getDepartureLongitude()); } if (createVO.getDepartureLatitude() != null) { task.setDepartureLatitude(createVO.getDepartureLatitude()); } if (createVO.getDestinationLongitude() != null) { task.setDestinationLongitude(createVO.getDestinationLongitude()); } if (createVO.getDestinationLatitude() != null) { task.setDestinationLatitude(createVO.getDestinationLatitude()); } if (createVO.getEstimatedDistance() != null) { task.setEstimatedDistance(createVO.getEstimatedDistance()); } // 设置急救转运特定信息 if (createVO.getTransferTime() != null) { task.setPlannedStartTime(createVO.getTransferTime()); } if (createVO.getTransferDistance() != null) { task.setEstimatedDistance(createVO.getTransferDistance()); } // 设置福祉车特定信息 if (createVO.getServiceTime() != null) { task.setPlannedStartTime(createVO.getServiceTime()); } if (createVO.getStartAddress() != null) { task.setDepartureAddress(createVO.getStartAddress()); } if (createVO.getEndAddress() != null) { task.setDestinationAddress(createVO.getEndAddress()); } // 设置福祉车公里数 if (createVO.getDistance() != null) { task.setEstimatedDistance(createVO.getDistance()); } int result = sysTaskMapper.insertSysTask(task); // 保存车辆关联信息 if (result > 0 && createVO.getVehicleIds() != null && !createVO.getVehicleIds().isEmpty()) { for (Long vehicleId : createVO.getVehicleIds()) { SysTaskVehicle taskVehicle = new SysTaskVehicle(); taskVehicle.setTaskId(task.getTaskId()); taskVehicle.setVehicleId(vehicleId); taskVehicle.setAssignTime(DateUtils.getNowDate()); taskVehicle.setAssignBy(SecurityUtils.getUsername()); taskVehicle.setStatus("ASSIGNED"); taskVehicle.setCreateBy(SecurityUtils.getUsername()); taskVehicle.setCreateTime(DateUtils.getNowDate()); taskVehicle.setUpdateBy(SecurityUtils.getUsername()); taskVehicle.setUpdateTime(DateUtils.getNowDate()); sysTaskVehicleMapper.insertSysTaskVehicle(taskVehicle); } } // 保存执行人员信息(包含角色类型) if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) { saveTaskAssignees(task.getTaskId(), createVO.getAssignees()); } // 保存急救转运扩展信息 if (result > 0 && "EMERGENCY_TRANSFER".equals(createVO.getTaskType())) { saveEmergencyInfo(task.getTaskId(), createVO); } // 保存福祉车扩展信息 if (result > 0 && "WELFARE".equals(createVO.getTaskType())) { saveWelfareInfo(task.getTaskId(), createVO); } // 记录操作日志 if (result > 0) { recordTaskLog(task.getTaskId(), "CREATE", "创建任务", null, "任务类型:" + createVO.getTaskType(), SecurityUtils.getUserId(), SecurityUtils.getUsername()); } // 异步同步急救转运任务到旧系统 if (result > 0 && "EMERGENCY_TRANSFER".equals(createVO.getTaskType()) && legacySystemSyncService != null) { final Long finalTaskId = task.getTaskId(); new Thread(() -> { try { Thread.sleep(2000); // 等待2秒,确保事务已提交 legacySystemSyncService.syncEmergencyTaskToLegacy(finalTaskId); } catch (Exception e) { // 同步失败不影响主流程,仅记录日志 } }).start(); } return result; } /** * 修改任务管理 * * @param updateVO 任务更新对象 * @return 结果 */ @Override @Transactional public int updateSysTask(TaskUpdateVO updateVO) { SysTask oldTask = sysTaskMapper.selectSysTaskByTaskId(updateVO.getTaskId()); if (oldTask == null) { throw new RuntimeException("任务不存在"); } SysTask task = new SysTask(); task.setTaskId(updateVO.getTaskId()); task.setTaskDescription(updateVO.getTaskDescription()); task.setDepartureAddress(updateVO.getDepartureAddress()); task.setDestinationAddress(updateVO.getDestinationAddress()); task.setDepartureLongitude(updateVO.getDepartureLongitude()); task.setDepartureLatitude(updateVO.getDepartureLatitude()); task.setDestinationLongitude(updateVO.getDestinationLongitude()); task.setDestinationLatitude(updateVO.getDestinationLatitude()); task.setPlannedStartTime(updateVO.getPlannedStartTime()); task.setPlannedEndTime(updateVO.getPlannedEndTime()); task.setAssigneeId(updateVO.getAssigneeId()); task.setUpdateBy(SecurityUtils.getUsername()); task.setUpdateTime(DateUtils.getNowDate()); task.setRemark(updateVO.getRemark()); // 重新计算预计公里数 calculateEstimatedDistance(task); int result = sysTaskMapper.updateSysTask(task); // 记录操作日志 if (result > 0) { recordTaskLog(updateVO.getTaskId(), "UPDATE", "更新任务", buildTaskDescription(oldTask), buildTaskDescription(task), SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 批量删除任务管理 * * @param taskIds 需要删除的任务管理主键 * @return 结果 */ @Override @Transactional public int deleteSysTaskByTaskIds(Long[] taskIds) { int result = 0; for (Long taskId : taskIds) { // 记录删除日志 recordTaskLog(taskId, "DELETE", "删除任务", null, null, SecurityUtils.getUserId(), SecurityUtils.getUsername()); result += sysTaskMapper.deleteSysTaskByTaskId(taskId); } return result; } /** * 分配任务 * * @param taskId 任务ID * @param assigneeId 执行人ID * @param remark 备注 * @return 结果 */ @Override @Transactional public int assignTask(Long taskId, Long assigneeId, String remark) { SysTask task = new SysTask(); task.setTaskId(taskId); task.setAssigneeId(assigneeId); task.setUpdateBy(SecurityUtils.getUsername()); task.setUpdateTime(DateUtils.getNowDate()); int result = sysTaskMapper.assignTask(task); // 记录操作日志 if (result > 0) { recordTaskLog(taskId, "ASSIGN", "分配任务", null, "分配给用户ID:" + assigneeId + ",备注:" + remark, SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 变更任务状态 * * @param taskId 任务ID * @param newStatus 新状态 * @param remark 备注 * @return 结果 */ @Override @Transactional public int changeTaskStatus(Long taskId, TaskStatus newStatus, String remark) { return changeTaskStatusWithLocation(taskId, newStatus, remark, null); } /** * 变更任务状态(含GPS位置信息) * * @param taskId 任务ID * @param newStatus 新状态 * @param remark 备注 * @param locationLog GPS位置信息日志对象 * @return 结果 */ @Override @Transactional public int changeTaskStatusWithLocation(Long taskId, TaskStatus newStatus, String remark, SysTaskLog locationLog) { SysTask oldTask = sysTaskMapper.selectSysTaskByTaskId(taskId); if (oldTask == null) { throw new RuntimeException("任务不存在"); } // 验证状态流转是否合法 TaskStatus oldTaskStatus = TaskStatus.getByCode(oldTask.getTaskStatus()); if (!oldTask.canChangeStatus(newStatus)) { throw new RuntimeException("状态流转不合法:从 " + oldTaskStatus.getInfo() + " 到 " + newStatus.getInfo()); } SysTask task = new SysTask(); task.setTaskId(taskId); task.setTaskStatus(newStatus.getCode()); task.setUpdateBy(SecurityUtils.getUsername()); task.setUpdateTime(DateUtils.getNowDate()); // 根据状态设置相应的时间 if (newStatus == TaskStatus.DEPARTING && oldTask.getActualStartTime() == null) { // 出发中:设置实际开始时间 task.setActualStartTime(DateUtils.getNowDate()); } else if (newStatus == TaskStatus.IN_PROGRESS && oldTask.getActualStartTime() == null) { // 兼容旧数据:任务中状态也设置实际开始时间 task.setActualStartTime(DateUtils.getNowDate()); } else if (newStatus == TaskStatus.COMPLETED) { // 已完成:设置实际结束时间 task.setActualEndTime(DateUtils.getNowDate()); } int result = sysTaskMapper.updateTaskStatus(task); // 记录操作日志(含GPS位置信息) if (result > 0) { recordTaskLog(taskId, "STATUS_CHANGE", "状态变更", "状态:" + oldTaskStatus.getInfo(), "状态:" + newStatus.getInfo() + ",备注:" + remark, SecurityUtils.getUserId(), SecurityUtils.getUsername(), locationLog); } return result; } /** * 上传任务附件 * * @param taskId 任务ID * @param file 文件 * @return 结果 */ @Override @Transactional public int uploadAttachment(Long taskId, MultipartFile file) { try { // 上传文件 String fileName = FileUploadUtils.upload("/task", file); String filePath = FileUploadUtils.getDefaultBaseDir() + fileName; SysTaskAttachment attachment = new SysTaskAttachment(); attachment.setTaskId(taskId); attachment.setFileName(file.getOriginalFilename()); attachment.setFilePath(filePath); attachment.setFileSize(file.getSize()); attachment.setFileType(getFileType(file.getOriginalFilename())); attachment.setUploadTime(DateUtils.getNowDate()); attachment.setUploadBy(SecurityUtils.getUsername()); int result = sysTaskAttachmentMapper.insertSysTaskAttachment(attachment); // 记录操作日志 if (result > 0) { recordTaskLog(taskId, "UPDATE", "上传附件", null, "上传文件:" + file.getOriginalFilename(), SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } catch (IOException e) { throw new RuntimeException("文件上传失败:" + e.getMessage()); } } /** * 删除任务附件 * * @param attachmentId 附件ID * @return 结果 */ @Override @Transactional public int deleteAttachment(Long attachmentId) { SysTaskAttachment attachment = sysTaskAttachmentMapper.selectSysTaskAttachmentByAttachmentId(attachmentId); if (attachment == null) { throw new RuntimeException("附件不存在"); } // 删除物理文件 try { FileUtils.deleteFile(attachment.getFilePath()); } catch (Exception e) { // 忽略文件删除失败 } int result = sysTaskAttachmentMapper.deleteSysTaskAttachmentByAttachmentId(attachmentId); // 记录操作日志 if (result > 0) { recordTaskLog(attachment.getTaskId(), "UPDATE", "删除附件", "删除文件:" + attachment.getFileName(), null, SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 分配车辆给任务 * * @param taskId 任务ID * @param vehicleId 车辆ID * @param remark 备注 * @return 结果 */ @Override @Transactional public int assignVehicleToTask(Long taskId, Long vehicleId, String remark) { // 检查是否已经分配 int exists = sysTaskVehicleMapper.checkTaskVehicleExists(taskId, vehicleId); if (exists > 0) { throw new RuntimeException("车辆已经分配给该任务"); } SysTaskVehicle taskVehicle = new SysTaskVehicle(); taskVehicle.setTaskId(taskId); taskVehicle.setVehicleId(vehicleId); taskVehicle.setAssignTime(DateUtils.getNowDate()); taskVehicle.setAssignBy(SecurityUtils.getUsername()); taskVehicle.setStatus("ASSIGNED"); taskVehicle.setRemark(remark); int result = sysTaskVehicleMapper.insertSysTaskVehicle(taskVehicle); // 记录操作日志 if (result > 0) { recordTaskLog(taskId, "ASSIGN", "分配车辆", null, "分配车辆ID:" + vehicleId + ",备注:" + remark, SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 取消任务车辆分配 * * @param taskId 任务ID * @param vehicleId 车辆ID * @return 结果 */ @Override @Transactional public int unassignVehicleFromTask(Long taskId, Long vehicleId) { int result = sysTaskVehicleMapper.deleteSysTaskVehicleByTaskIdAndVehicleId(taskId, vehicleId); // 记录操作日志 if (result > 0) { recordTaskLog(taskId, "ASSIGN", "取消车辆分配", "取消车辆ID:" + vehicleId, null, SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 批量分配车辆给任务 * * @param taskId 任务ID * @param vehicleIds 车辆ID列表 * @param remark 备注 * @return 结果 */ @Override @Transactional public int assignMultipleVehiclesToTask(Long taskId, List vehicleIds, String remark) { List taskVehicles = new ArrayList<>(); Date now = DateUtils.getNowDate(); String assignBy = SecurityUtils.getUsername(); for (Long vehicleId : vehicleIds) { // 检查是否已经分配 int exists = sysTaskVehicleMapper.checkTaskVehicleExists(taskId, vehicleId); if (exists == 0) { SysTaskVehicle taskVehicle = new SysTaskVehicle(); taskVehicle.setTaskId(taskId); taskVehicle.setVehicleId(vehicleId); taskVehicle.setAssignTime(now); taskVehicle.setAssignBy(assignBy); taskVehicle.setStatus("ASSIGNED"); taskVehicle.setRemark(remark); taskVehicles.add(taskVehicle); } } int result = 0; if (!taskVehicles.isEmpty()) { result = sysTaskVehicleMapper.batchInsertSysTaskVehicle(taskVehicles); } // 记录操作日志 if (result > 0) { recordTaskLog(taskId, "ASSIGN", "批量分配车辆", null, "分配车辆数量:" + result + ",备注:" + remark, SecurityUtils.getUserId(), SecurityUtils.getUsername()); } return result; } /** * 查询任务关联的车辆 * * @param taskId 任务ID * @return 任务车辆关联列表 */ @Override public List getTaskVehicles(Long taskId) { return sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); } /** * 查询可用车辆 * * @param deptId 部门ID * @param taskType 任务类型 * @return 可用车辆列表 */ @Override public List getAvailableVehicles(Long deptId, String taskType) { List availableVehicles = new ArrayList<>(); try { // 查询所有状态为正常的车辆(不限制部门) VehicleInfo queryParam = new VehicleInfo(); queryParam.setStatus("0"); // 0表示正常状态 // 不设置deptId,查询所有部门的车辆 List vehicles = vehicleInfoMapper.selectVehicleInfoList(queryParam); // 转换为SysTaskVehicle对象 for (VehicleInfo vehicle : vehicles) { SysTaskVehicle taskVehicle = new SysTaskVehicle(); taskVehicle.setVehicleId(vehicle.getVehicleId()); taskVehicle.setVehicleNo(vehicle.getVehicleNo()); taskVehicle.setVehicleType(vehicle.getVehicleType()); taskVehicle.setVehicleBrand(vehicle.getVehicleBrand()); taskVehicle.setVehicleModel(vehicle.getVehicleModel()); taskVehicle.setDeptName(vehicle.getDeptName()); // 添加部门名称 availableVehicles.add(taskVehicle); } } catch (Exception e) { // 如果查询失败,记录日志并返回空列表 System.err.println("查询可用车辆失败: " + e.getMessage()); } return availableVehicles; } /** * 查询任务统计信息 * * @return 任务统计信息 */ @Override public TaskStatisticsVO getTaskStatistics() { return sysTaskMapper.selectTaskStatistics(); } /** * 查询超时任务列表 * * @return 超时任务列表 */ @Override public List selectOverdueTasks() { return sysTaskMapper.selectOverdueTasks(); } /** * 查询我的任务列表 * * @param userId 用户ID * @return 我的任务列表 */ @Override public List selectMyTasks(Long userId) { return sysTaskMapper.selectMyTasks(userId); } /** * 获取任务详情(包含关联数据) * * @param taskId 任务ID * @return 任务详情 */ @Override public SysTask getTaskDetail(Long taskId) { SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); if (task != null) { // 查询关联车辆 task.setAssignedVehicles(sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId)); // 查询附件 task.setAttachments(sysTaskAttachmentMapper.selectSysTaskAttachmentByTaskId(taskId)); // 查询操作日志 task.setOperationLogs(sysTaskLogMapper.selectSysTaskLogByTaskId(taskId)); // 加载急救转运扩展信息 if ("EMERGENCY_TRANSFER".equals(task.getTaskType())) { SysTaskEmergency emergencyInfo = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId); task.setEmergencyInfo(emergencyInfo); } // 加载福祉车扩展信息 else if ("WELFARE".equals(task.getTaskType())) { SysTaskWelfare welfareInfo = sysTaskWelfareMapper.selectSysTaskWelfareByTaskId(taskId); task.setWelfareInfo(welfareInfo); } } return task; } @Autowired private TaskCodeGenerator taskCodeGenerator; /** * 生成任务编号 * * @return 任务编号 */ private String generateTaskCode() { return taskCodeGenerator.generateTaskCode(); } /** * 记录任务操作日志 * * @param taskId 任务ID * @param operationType 操作类型 * @param operationDesc 操作描述 * @param oldValue 操作前值 * @param newValue 操作后值 * @param operatorId 操作人ID * @param operatorName 操作人姓名 */ private void recordTaskLog(Long taskId, String operationType, String operationDesc, String oldValue, String newValue, Long operatorId, String operatorName) { recordTaskLog(taskId, operationType, operationDesc, oldValue, newValue, operatorId, operatorName, null); } /** * 记录任务操作日志(含GPS位置信息) * * @param taskId 任务ID * @param operationType 操作类型 * @param operationDesc 操作描述 * @param oldValue 操作前值 * @param newValue 操作后值 * @param operatorId 操作人ID * @param operatorName 操作人姓名 * @param log GPS位置信息日志对象(可为null) */ private void recordTaskLog(Long taskId, String operationType, String operationDesc, String oldValue, String newValue, Long operatorId, String operatorName, SysTaskLog log) { if (log == null) { log = new SysTaskLog(); } log.setTaskId(taskId); log.setOperationType(operationType); log.setOperationDesc(operationDesc); log.setOldValue(oldValue); log.setNewValue(newValue); log.setOperatorId(operatorId); log.setOperatorName(operatorName); log.setOperationTime(DateUtils.getNowDate()); // 这里可以获取IP地址 log.setIpAddress("127.0.0.1"); sysTaskLogMapper.insertSysTaskLog(log); } /** * 构建任务描述 * * @param task 任务对象 * @return 任务描述 */ private String buildTaskDescription(SysTask task) { StringBuilder sb = new StringBuilder(); sb.append("任务编号:").append(task.getTaskCode()).append(","); sb.append("任务类型:").append(task.getTaskType()).append(","); sb.append("任务状态:").append(task.getTaskStatus()).append(","); if (StringUtils.isNotEmpty(task.getTaskDescription())) { sb.append("任务描述:").append(task.getTaskDescription()).append(","); } return sb.toString(); } /** * 获取文件类型 * * @param fileName 文件名 * @return 文件类型 */ private String getFileType(String fileName) { if (StringUtils.isEmpty(fileName)) { return ""; } int lastDotIndex = fileName.lastIndexOf("."); if (lastDotIndex > 0 && lastDotIndex < fileName.length() - 1) { return fileName.substring(lastDotIndex + 1).toLowerCase(); } return ""; } /** * 计算预计公里数 * * @param task 任务对象 */ private void calculateEstimatedDistance(SysTask task) { if (task.getDepartureLongitude() != null && task.getDepartureLatitude() != null && task.getDestinationLongitude() != null && task.getDestinationLatitude() != null) { // 验证GPS坐标是否有效 if (GpsDistanceUtils.isValidCoordinate(task.getDepartureLatitude(), task.getDepartureLongitude()) && GpsDistanceUtils.isValidCoordinate(task.getDestinationLatitude(), task.getDestinationLongitude())) { // 计算距离 java.math.BigDecimal distance = GpsDistanceUtils.calculateDistance( task.getDepartureLatitude(), task.getDepartureLongitude(), task.getDestinationLatitude(), task.getDestinationLongitude() ); task.setEstimatedDistance(distance); } else { // 坐标无效,设置为0 task.setEstimatedDistance(java.math.BigDecimal.ZERO); } } else { // 坐标不完整,设置为0 task.setEstimatedDistance(java.math.BigDecimal.ZERO); } } /** * 保存任务执行人员信息(包含角色类型) * * @param taskId 任务ID * @param assignees 执行人员信息列表 */ private void saveTaskAssignees(Long taskId, java.util.List assignees) { if (assignees == null || assignees.isEmpty()) { return; } java.util.List taskAssignees = new java.util.ArrayList<>(); Date now = DateUtils.getNowDate(); String currentUser = SecurityUtils.getUsername(); for (int i = 0; i < assignees.size(); i++) { TaskCreateVO.AssigneeInfo assigneeInfo = assignees.get(i); SysTaskAssignee taskAssignee = new SysTaskAssignee(); taskAssignee.setTaskId(taskId); taskAssignee.setUserId(assigneeInfo.getUserId()); taskAssignee.setUserName(assigneeInfo.getUserName()); taskAssignee.setUserType(assigneeInfo.getUserType()); // 第一个执行人员为主要执行人 taskAssignee.setIsPrimary(i == 0 ? "1" : "0"); taskAssignee.setSortOrder(i); taskAssignee.setCreateTime(now); taskAssignee.setCreateBy(currentUser); taskAssignee.setUpdateTime(now); taskAssignee.setUpdateBy(currentUser); taskAssignees.add(taskAssignee); } // 批量保存 if (!taskAssignees.isEmpty()) { sysTaskAssigneeMapper.batchInsertSysTaskAssignee(taskAssignees); } } /** * 保存急救转运任务扩展信息 * * @param taskId 任务ID * @param createVO 任务创建对象 */ private void saveEmergencyInfo(Long taskId, TaskCreateVO createVO) { SysTaskEmergency emergencyInfo = new SysTaskEmergency(); emergencyInfo.setTaskId(taskId); // 设置患者信息 if (createVO.getPatient() != null) { emergencyInfo.setPatientContact(createVO.getPatient().getContact()); emergencyInfo.setPatientPhone(createVO.getPatient().getPhone()); emergencyInfo.setPatientName(createVO.getPatient().getName()); emergencyInfo.setPatientGender(createVO.getPatient().getGender()); emergencyInfo.setPatientIdCard(createVO.getPatient().getIdCard()); emergencyInfo.setPatientCondition(createVO.getPatient().getCondition()); } // 设置转出医院信息 if (createVO.getHospitalOut() != null) { emergencyInfo.setHospitalOutId(createVO.getHospitalOut().getId()); emergencyInfo.setHospitalOutName(createVO.getHospitalOut().getName()); emergencyInfo.setHospitalOutDepartment(createVO.getHospitalOut().getDepartment()); emergencyInfo.setHospitalOutDepartmentId(createVO.getHospitalOut().getDepartmentId()); emergencyInfo.setHospitalOutBedNumber(createVO.getHospitalOut().getBedNumber()); emergencyInfo.setHospitalOutAddress(createVO.getHospitalOut().getAddress()); emergencyInfo.setHospitalOutLongitude(createVO.getHospitalOut().getLongitude()); emergencyInfo.setHospitalOutLatitude(createVO.getHospitalOut().getLatitude()); } // 设置转入医院信息 if (createVO.getHospitalIn() != null) { emergencyInfo.setHospitalInId(createVO.getHospitalIn().getId()); emergencyInfo.setHospitalInName(createVO.getHospitalIn().getName()); emergencyInfo.setHospitalInDepartment(createVO.getHospitalIn().getDepartment()); emergencyInfo.setHospitalInDepartmentId(createVO.getHospitalIn().getDepartmentId()); emergencyInfo.setHospitalInBedNumber(createVO.getHospitalIn().getBedNumber()); emergencyInfo.setHospitalInAddress(createVO.getHospitalIn().getAddress()); emergencyInfo.setHospitalInLongitude(createVO.getHospitalIn().getLongitude()); emergencyInfo.setHospitalInLatitude(createVO.getHospitalIn().getLatitude()); } // 设置费用信息 emergencyInfo.setTransferDistance(createVO.getTransferDistance()); emergencyInfo.setTransferPrice(createVO.getPrice()); // 设置单据类型ID emergencyInfo.setDocumentTypeId(createVO.getDocumentTypeId()); // 设置任务类型ID emergencyInfo.setTaskTypeId(createVO.getTaskTypeId()); // 设置病情ID列表(将List转换为逗号分隔的字符串) if (createVO.getDiseaseIds() != null && !createVO.getDiseaseIds().isEmpty()) { String diseaseIdsStr = createVO.getDiseaseIds().stream() .map(String::valueOf) .collect(Collectors.joining(",")); emergencyInfo.setDiseaseIds(diseaseIdsStr); } // 系统字段 emergencyInfo.setCreateTime(DateUtils.getNowDate()); emergencyInfo.setUpdateTime(DateUtils.getNowDate()); emergencyInfo.setCreateBy(SecurityUtils.getUsername()); emergencyInfo.setUpdateBy(SecurityUtils.getUsername()); sysTaskEmergencyMapper.insertSysTaskEmergency(emergencyInfo); } /** * 保存福祉车任务扩展信息 * * @param taskId 任务ID * @param createVO 任务创建对象 */ private void saveWelfareInfo(Long taskId, TaskCreateVO createVO) { SysTaskWelfare welfareInfo = new SysTaskWelfare(); welfareInfo.setTaskId(taskId); // 设置乘客信息 if (createVO.getPassenger() != null) { welfareInfo.setPassengerContact(createVO.getPassenger().getContact()); welfareInfo.setPassengerPhone(createVO.getPassenger().getPhone()); } // 设置地址信息 welfareInfo.setPickupAddress(createVO.getStartAddress()); welfareInfo.setDestinationAddress(createVO.getEndAddress()); // 设置GPS坐标 welfareInfo.setPickupLongitude(createVO.getDepartureLongitude()); welfareInfo.setPickupLatitude(createVO.getDepartureLatitude()); welfareInfo.setDestinationLongitude(createVO.getDestinationLongitude()); welfareInfo.setDestinationLatitude(createVO.getDestinationLatitude()); // 设置距离和费用 // 优先使用福祉车专用的distance字段,如果没有则使用通用的estimatedDistance BigDecimal serviceDistance = createVO.getDistance() != null ? createVO.getDistance() : createVO.getEstimatedDistance(); welfareInfo.setServiceDistance(serviceDistance); welfareInfo.setServicePrice(createVO.getPrice()); // 系统字段 welfareInfo.setCreateTime(DateUtils.getNowDate()); welfareInfo.setUpdateTime(DateUtils.getNowDate()); welfareInfo.setCreateBy(SecurityUtils.getUsername()); welfareInfo.setUpdateBy(SecurityUtils.getUsername()); sysTaskWelfareMapper.insertSysTaskWelfare(welfareInfo); } }