package com.ruoyi.task.service.impl; import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.domain.api.ITaskDomain; import com.ruoyi.task.domain.api.ITaskPlanDomain; import com.ruoyi.task.domain.model.Task; import com.ruoyi.task.domain.model.TaskPlan; import com.ruoyi.task.service.api.ITaskService; import com.ruoyi.task.service.convert.TaskDTOConvert; import com.ruoyi.task.service.dto.TaskDTO; import com.ruoyi.task.service.dto.TaskQueryDTO; import com.ruoyi.task.service.dto.TaskStatQueryServiceDTO; import com.ruoyi.task.service.dto.TaskStatByYearServiceDTO; import com.ruoyi.task.service.dto.TaskStatByMonthServiceDTO; import com.ruoyi.task.service.dto.TaskStatItemServiceDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @Service public class TaskServiceImpl implements ITaskService { @Autowired private ITaskDomain taskDomain; @Autowired private ITaskPlanDomain taskPlanDomain; @Override public Long createTaskWithoutPlan(TaskDTO taskDTO) { Task task = TaskDTOConvert.toDomain(taskDTO); task.setPlanId(null); task.setStatus(StatusEnum.PENDING); Task result = taskDomain.createTask(task); return result != null ? result.getId() : null; } @Override public TaskDTO getTaskById(Long taskId) { Task task = taskDomain.getTaskById(taskId); return TaskDTOConvert.toDTO(task); } @Override public List getTaskList(TaskQueryDTO queryDTO) { // 如果传递了id,功能就等同于用ID去获取值 if (queryDTO.getId() != null) { TaskDTO taskDTO = getTaskById(queryDTO.getId()); return taskDTO != null ? java.util.Collections.singletonList(taskDTO) : java.util.Collections.emptyList(); } // 创建Task对象作为查询条件 Task task = new Task(); task.setRouteId(queryDTO.getRouteId()); task.setUavId(queryDTO.getUavId()); task.setStatus(queryDTO.getStatus()); task.setTaskCategory(queryDTO.getTaskCategory()); task.setTaskType(queryDTO.getTaskType()); task.setExecuteType(queryDTO.getExecuteType()); // 这里需要注意:Task类中没有airportCode、PlanTypeEnum和CycleTypeEnum字段, // 这些字段可能需要通过关联查询来实现过滤, // 但目前我们先按照现有的结构实现基本过滤 List tasks = taskDomain.getTaskList(task); // 过滤时间范围(只有当startTimeStart和startTimeEnd都传时才使用) if (queryDTO.getStartTimeStart() != null && queryDTO.getStartTimeEnd() != null) { java.util.Date startTimeStart = queryDTO.getStartTimeStart(); java.util.Date startTimeEnd = queryDTO.getStartTimeEnd(); tasks = tasks.stream() .filter(t -> { java.util.Date taskStartTime = t.getStartTime(); return taskStartTime != null && !taskStartTime.before(startTimeStart) && !taskStartTime.after(startTimeEnd); }) .collect(java.util.stream.Collectors.toList()); } return TaskDTOConvert.toDTOList(tasks); } @Override public boolean updateTask(TaskDTO taskDTO) { Task task = TaskDTOConvert.toDomain(taskDTO); Task result = taskDomain.updateTask(task); return result != null; } @Override public boolean deleteTask(Long taskId) { return taskDomain.deleteTask(taskId); } @Override public List getTaskByUavId(String uavId) { // 创建Task对象作为查询条件 Task task = new Task(); task.setUavId(uavId); List tasks = taskDomain.getTaskList(task); return TaskDTOConvert.toDTOList(tasks); } @Override public TaskDTO getCurrentTaskByUavId(String uavId) { // 创建Task对象作为查询条件 Task task = new Task(); task.setUavId(uavId); List tasks = taskDomain.getTaskList(task); // 只取状态为RUNNING的任务 tasks = tasks.stream() .filter(t -> t.getStatus() == StatusEnum.RUNNING) .collect(java.util.stream.Collectors.toList()); // 按照实际执行时间降序排序,取最新的一条 if (!tasks.isEmpty()) { tasks.sort((t1, t2) -> { if (t1.getActualStartTime() == null && t2.getActualStartTime() == null) { return 0; } else if (t1.getActualStartTime() == null) { return 1; } else if (t2.getActualStartTime() == null) { return -1; } else { return t2.getActualStartTime().compareTo(t1.getActualStartTime()); } }); return TaskDTOConvert.toDTO(tasks.get(0)); } return null; } // // @Override // public boolean updateActualStartTime(Long taskId) { // Task task = taskDomain.getTaskById(taskId); // if (task != null) { // task.setActualStartTime(new java.util.Date()); // Task result = taskDomain.updateTask(task); // return result != null; // } // return false; // } // // @Override // public boolean updateActualEndTime(Long taskId) { // Task task = taskDomain.getTaskById(taskId); // if (task != null) { // task.setActualEndTime(new java.util.Date()); // Task result = taskDomain.updateTask(task); // return result != null; // } // return false; // } @Override public boolean updateTaskStatus(Long taskId, StatusEnum status) { Task task = taskDomain.getTaskById(taskId); if (task != null) { task.setStatus(status); // 如果状态变为执行中,设置实际开始时间 if (status == StatusEnum.RUNNING) { task.setActualStartTime(new java.util.Date()); if(Objects.isNull(task.getStartTime())){ task.setStartTime(new java.util.Date()); } } else if(status == StatusEnum.PENDING) { if(Objects.isNull(task.getStartTime())){ task.setStartTime(new java.util.Date()); } } else { task.setActualEndTime(new java.util.Date()); if(Objects.isNull(task.getEndTime())){ task.setEndTime(new java.util.Date()); } } Task result = taskDomain.updateTask(task); return result != null; } return false; } @Override public TaskStatByYearServiceDTO getTaskStatByYear(TaskStatQueryServiceDTO queryDTO) { Task task = new Task(); task.setTaskCategory(queryDTO.getTaskCategory()); task.setTaskType(queryDTO.getTaskType()); List tasks = taskDomain.getTaskList(task); Calendar calendar = Calendar.getInstance(); Map months = new HashMap<>(); int total = 0; for (Task t : tasks) { if (t.getStartTime() != null) { // 如果指定了状态列表,则过滤状态 if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty() && !queryDTO.getStatusList().contains(t.getStatus())) { continue; } // 如果指定了航线ID列表,则过滤航线 if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty() && !queryDTO.getRouteIdList().contains(t.getRouteId())) { continue; } // 如果指定了无人机ID列表,则过滤无人机 if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty() && !queryDTO.getUavIdList().contains(t.getUavId())) { continue; } calendar.setTime(t.getStartTime()); int year = calendar.get(Calendar.YEAR); if (year == queryDTO.getYear()) { int month = calendar.get(Calendar.MONTH) + 1; months.put(month, months.getOrDefault(month, 0) + 1); total++; } } } TaskStatByYearServiceDTO result = new TaskStatByYearServiceDTO(); result.setTotal(total); result.setMonths(months); return result; } @Override public TaskStatByMonthServiceDTO getTaskStatByMonth(TaskStatQueryServiceDTO queryDTO) { Task task = new Task(); task.setTaskCategory(queryDTO.getTaskCategory()); task.setTaskType(queryDTO.getTaskType()); List tasks = taskDomain.getTaskList(task); Calendar calendar = Calendar.getInstance(); Map> days = new HashMap<>(); int total = 0; for (Task t : tasks) { if (t.getStartTime() != null) { // 如果指定了状态列表,则过滤状态 if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty() && !queryDTO.getStatusList().contains(t.getStatus())) { continue; } // 如果指定了航线ID列表,则过滤航线 if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty() && !queryDTO.getRouteIdList().contains(t.getRouteId())) { continue; } // 如果指定了无人机ID列表,则过滤无人机 if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty() && !queryDTO.getUavIdList().contains(t.getUavId())) { continue; } calendar.setTime(t.getStartTime()); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH) + 1; if (year == queryDTO.getYear() && month == queryDTO.getMonth()) { int day = calendar.get(Calendar.DAY_OF_MONTH); TaskStatItemServiceDTO item = new TaskStatItemServiceDTO(); item.setTaskId(t.getId()); item.setPlanId(t.getPlanId()); item.setTaskName(t.getTaskName()); item.setStartTime(t.getStartTime()); item.setEndTime(t.getEndTime()); item.setActualStartTime(t.getActualStartTime()); item.setActualEndTime(t.getActualEndTime()); item.setStatus(t.getStatus()); if (t.getPlanId() != null) { TaskPlan plan = taskPlanDomain.getTaskPlanById(t.getPlanId()); if (plan != null) { item.setPlanName(plan.getPlanName()); } } days.computeIfAbsent(day, k -> new ArrayList<>()).add(item); total++; } } } TaskStatByMonthServiceDTO result = new TaskStatByMonthServiceDTO(); result.setTotal(total); result.setDays(days); return result; } }