| New file |
| | |
| | | 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 com.ruoyi.system.event.TaskCreatedEvent; |
| | | import com.ruoyi.system.event.TaskAssignedEvent; |
| | | import com.ruoyi.system.event.TaskStatusChangedEvent; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.ApplicationEventPublisher; |
| | | |
| | | /** |
| | | * 任务管理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; |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | /** |
| | | * 查询任务管理 |
| | | * |
| | | * @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<SysTask> 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) { |
| | | eventPublisher.publishEvent(new TaskCreatedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | task.getTaskType(), |
| | | task.getCreatorId(), |
| | | SecurityUtils.getUsername() |
| | | )); |
| | | } |
| | | |
| | | // 发布任务分配事件 |
| | | if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) { |
| | | List<Long> assigneeIds = createVO.getAssignees().stream() |
| | | .map(assignee -> assignee.getUserId()) |
| | | .collect(Collectors.toList()); |
| | | List<String> assigneeNames = createVO.getAssignees().stream() |
| | | .map(assignee -> assignee.getUserName()) |
| | | .collect(Collectors.toList()); |
| | | |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | assigneeIds, |
| | | assigneeNames, |
| | | 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 = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task == null) { |
| | | throw new RuntimeException("任务不存在"); |
| | | } |
| | | |
| | | SysTask updateTask = new SysTask(); |
| | | updateTask.setTaskId(taskId); |
| | | updateTask.setAssigneeId(assigneeId); |
| | | updateTask.setUpdateBy(SecurityUtils.getUsername()); |
| | | updateTask.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | int result = sysTaskMapper.assignTask(updateTask); |
| | | |
| | | // 记录操作日志 |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "分配任务", null, |
| | | "分配给用户ID:" + assigneeId + ",备注:" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | // 发布任务分配事件 |
| | | if (result > 0) { |
| | | List<Long> assigneeIds = new ArrayList<>(); |
| | | assigneeIds.add(assigneeId); |
| | | |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | assigneeIds, |
| | | null, // 姓名列表在监听器中查询 |
| | | 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); |
| | | } |
| | | |
| | | // 发布任务状态变更事件 |
| | | if (result > 0) { |
| | | // 查询任务的所有执行人 |
| | | List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); |
| | | List<Long> assigneeIds = null; |
| | | if (assignees != null && !assignees.isEmpty()) { |
| | | assigneeIds = assignees.stream() |
| | | .map(SysTaskAssignee::getUserId) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | eventPublisher.publishEvent(new TaskStatusChangedEvent( |
| | | this, |
| | | oldTask.getTaskId(), |
| | | oldTask.getTaskCode(), |
| | | oldTaskStatus.getCode(), |
| | | newStatus.getCode(), |
| | | oldTaskStatus.getInfo(), |
| | | newStatus.getInfo(), |
| | | assigneeIds, |
| | | oldTask.getCreatorId() |
| | | )); |
| | | } |
| | | |
| | | 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<Long> vehicleIds, String remark) { |
| | | List<SysTaskVehicle> 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<SysTaskVehicle> getTaskVehicles(Long taskId) { |
| | | return sysTaskVehicleMapper.selectSysTaskVehicleByTaskId(taskId); |
| | | } |
| | | |
| | | /** |
| | | * 查询可用车辆 |
| | | * |
| | | * @param deptId 部门ID |
| | | * @param taskType 任务类型 |
| | | * @return 可用车辆列表 |
| | | */ |
| | | @Override |
| | | public List<SysTaskVehicle> getAvailableVehicles(Long deptId, String taskType) { |
| | | List<SysTaskVehicle> availableVehicles = new ArrayList<>(); |
| | | |
| | | try { |
| | | // 查询所有状态为正常的车辆(不限制部门) |
| | | VehicleInfo queryParam = new VehicleInfo(); |
| | | queryParam.setStatus("0"); // 0表示正常状态 |
| | | // 不设置deptId,查询所有部门的车辆 |
| | | queryParam.setDeptId(deptId); |
| | | |
| | | List<VehicleInfo> 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<SysTask> selectOverdueTasks() { |
| | | return sysTaskMapper.selectOverdueTasks(); |
| | | } |
| | | |
| | | /** |
| | | * 查询我的任务列表 |
| | | * |
| | | * @param userId 用户ID |
| | | * @return 我的任务列表 |
| | | */ |
| | | @Override |
| | | public List<SysTask> 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<TaskCreateVO.AssigneeInfo> assignees) { |
| | | if (assignees == null || assignees.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | java.util.List<SysTaskAssignee> 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<Long>转换为逗号分隔的字符串) |
| | | 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); |
| | | } |
| | | } |