2026-03-05 17:14:10 +08:00
|
|
|
|
package com.ruoyi.task.service.impl;
|
|
|
|
|
|
|
2026-03-06 09:19:18 +08:00
|
|
|
|
import com.ruoyi.task.api.enums.StatusEnum;
|
2026-03-05 17:14:10 +08:00
|
|
|
|
import com.ruoyi.task.domain.api.ITaskDomain;
|
2026-03-09 17:20:57 +08:00
|
|
|
|
import com.ruoyi.task.domain.api.ITaskPlanDomain;
|
2026-03-05 17:14:10 +08:00
|
|
|
|
import com.ruoyi.task.domain.model.Task;
|
2026-03-09 17:20:57 +08:00
|
|
|
|
import com.ruoyi.task.domain.model.TaskPlan;
|
2026-03-05 17:15:01 +08:00
|
|
|
|
import com.ruoyi.task.service.api.ITaskService;
|
2026-03-05 17:14:10 +08:00
|
|
|
|
import com.ruoyi.task.service.convert.TaskDTOConvert;
|
|
|
|
|
|
import com.ruoyi.task.service.dto.TaskDTO;
|
|
|
|
|
|
import com.ruoyi.task.service.dto.TaskQueryDTO;
|
2026-03-09 16:36:47 +08:00
|
|
|
|
import com.ruoyi.task.service.dto.TaskStatQueryServiceDTO;
|
|
|
|
|
|
import com.ruoyi.task.service.dto.TaskStatByYearServiceDTO;
|
|
|
|
|
|
import com.ruoyi.task.service.dto.TaskStatByMonthServiceDTO;
|
2026-03-09 17:20:57 +08:00
|
|
|
|
import com.ruoyi.task.service.dto.TaskStatItemServiceDTO;
|
2026-03-05 17:14:10 +08:00
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
2026-03-10 15:25:41 +08:00
|
|
|
|
import java.util.*;
|
2026-03-05 17:14:10 +08:00
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
|
|
public class TaskServiceImpl implements ITaskService {
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
|
private ITaskDomain taskDomain;
|
|
|
|
|
|
|
2026-03-09 17:20:57 +08:00
|
|
|
|
@Autowired
|
|
|
|
|
|
private ITaskPlanDomain taskPlanDomain;
|
|
|
|
|
|
|
2026-03-05 17:14:10 +08:00
|
|
|
|
@Override
|
|
|
|
|
|
public Long createTaskWithoutPlan(TaskDTO taskDTO) {
|
|
|
|
|
|
Task task = TaskDTOConvert.toDomain(taskDTO);
|
2026-03-09 14:50:47 +08:00
|
|
|
|
task.setPlanId(null);
|
2026-03-09 15:35:51 +08:00
|
|
|
|
task.setStatus(StatusEnum.PENDING);
|
2026-03-09 14:50:47 +08:00
|
|
|
|
Task result = taskDomain.createTask(task);
|
2026-03-05 17:14:10 +08:00
|
|
|
|
return result != null ? result.getId() : null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public TaskDTO getTaskById(Long taskId) {
|
|
|
|
|
|
Task task = taskDomain.getTaskById(taskId);
|
|
|
|
|
|
return TaskDTOConvert.toDTO(task);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public List<TaskDTO> getTaskList(TaskQueryDTO queryDTO) {
|
2026-03-06 10:52:23 +08:00
|
|
|
|
// 如果传递了id,功能就等同于用ID去获取值
|
|
|
|
|
|
if (queryDTO.getId() != null) {
|
|
|
|
|
|
TaskDTO taskDTO = getTaskById(queryDTO.getId());
|
|
|
|
|
|
return taskDTO != null ? java.util.Collections.singletonList(taskDTO) : java.util.Collections.emptyList();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-05 17:14:10 +08:00
|
|
|
|
// 创建Task对象作为查询条件
|
|
|
|
|
|
Task task = new Task();
|
|
|
|
|
|
task.setRouteId(queryDTO.getRouteId());
|
2026-03-06 10:52:23 +08:00
|
|
|
|
task.setUavId(queryDTO.getUavId());
|
2026-03-06 10:28:00 +08:00
|
|
|
|
task.setStatus(queryDTO.getStatus());
|
|
|
|
|
|
task.setTaskCategory(queryDTO.getTaskCategory());
|
|
|
|
|
|
task.setTaskType(queryDTO.getTaskType());
|
2026-03-06 10:52:23 +08:00
|
|
|
|
task.setExecuteType(queryDTO.getExecuteType());
|
|
|
|
|
|
|
|
|
|
|
|
// 这里需要注意:Task类中没有airportCode、PlanTypeEnum和CycleTypeEnum字段,
|
|
|
|
|
|
// 这些字段可能需要通过关联查询来实现过滤,
|
|
|
|
|
|
// 但目前我们先按照现有的结构实现基本过滤
|
2026-03-05 17:14:10 +08:00
|
|
|
|
|
|
|
|
|
|
List<Task> tasks = taskDomain.getTaskList(task);
|
2026-03-06 10:52:23 +08:00
|
|
|
|
|
|
|
|
|
|
// 过滤时间范围(只有当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());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-05 17:14:10 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2026-03-06 11:25:26 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
2026-03-09 09:51:54 +08:00
|
|
|
|
public List<TaskDTO> getTaskByUavId(String uavId) {
|
2026-03-06 11:25:26 +08:00
|
|
|
|
// 创建Task对象作为查询条件
|
|
|
|
|
|
Task task = new Task();
|
|
|
|
|
|
task.setUavId(uavId);
|
|
|
|
|
|
|
|
|
|
|
|
List<Task> tasks = taskDomain.getTaskList(task);
|
|
|
|
|
|
return TaskDTOConvert.toDTOList(tasks);
|
|
|
|
|
|
}
|
2026-03-06 11:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
2026-03-09 09:51:54 +08:00
|
|
|
|
public TaskDTO getCurrentTaskByUavId(String uavId) {
|
2026-03-06 11:29:41 +08:00
|
|
|
|
// 创建Task对象作为查询条件
|
|
|
|
|
|
Task task = new Task();
|
|
|
|
|
|
task.setUavId(uavId);
|
|
|
|
|
|
|
|
|
|
|
|
List<Task> tasks = taskDomain.getTaskList(task);
|
2026-03-10 15:25:41 +08:00
|
|
|
|
|
|
|
|
|
|
// 只取状态为RUNNING的任务
|
2026-03-10 10:56:19 +08:00
|
|
|
|
tasks = tasks.stream()
|
2026-03-10 15:25:41 +08:00
|
|
|
|
.filter(t -> t.getStatus() == StatusEnum.RUNNING)
|
2026-03-10 10:56:19 +08:00
|
|
|
|
.collect(java.util.stream.Collectors.toList());
|
|
|
|
|
|
|
2026-03-10 15:25:41 +08:00
|
|
|
|
// 按照实际执行时间降序排序,取最新的一条
|
2026-03-06 11:29:41 +08:00
|
|
|
|
if (!tasks.isEmpty()) {
|
|
|
|
|
|
tasks.sort((t1, t2) -> {
|
2026-03-10 15:25:41 +08:00
|
|
|
|
if (t1.getActualStartTime() == null && t2.getActualStartTime() == null) {
|
2026-03-06 11:29:41 +08:00
|
|
|
|
return 0;
|
2026-03-10 15:25:41 +08:00
|
|
|
|
} else if (t1.getActualStartTime() == null) {
|
2026-03-06 11:29:41 +08:00
|
|
|
|
return 1;
|
2026-03-10 15:25:41 +08:00
|
|
|
|
} else if (t2.getActualStartTime() == null) {
|
2026-03-06 11:29:41 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
} else {
|
2026-03-10 15:25:41 +08:00
|
|
|
|
return t2.getActualStartTime().compareTo(t1.getActualStartTime());
|
2026-03-06 11:29:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
return TaskDTOConvert.toDTO(tasks.get(0));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
2026-03-06 13:56:26 +08:00
|
|
|
|
//
|
|
|
|
|
|
// @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;
|
|
|
|
|
|
// }
|
2026-03-06 13:54:58 +08:00
|
|
|
|
|
|
|
|
|
|
@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());
|
2026-03-10 15:25:41 +08:00
|
|
|
|
|
|
|
|
|
|
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 {
|
2026-03-06 13:54:58 +08:00
|
|
|
|
task.setActualEndTime(new java.util.Date());
|
2026-03-10 15:25:41 +08:00
|
|
|
|
|
|
|
|
|
|
if(Objects.isNull(task.getEndTime())){
|
|
|
|
|
|
task.setEndTime(new java.util.Date());
|
|
|
|
|
|
}
|
2026-03-06 13:54:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
Task result = taskDomain.updateTask(task);
|
|
|
|
|
|
return result != null;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
2026-03-09 16:36:47 +08:00
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public TaskStatByYearServiceDTO getTaskStatByYear(TaskStatQueryServiceDTO queryDTO) {
|
|
|
|
|
|
Task task = new Task();
|
|
|
|
|
|
task.setTaskCategory(queryDTO.getTaskCategory());
|
|
|
|
|
|
task.setTaskType(queryDTO.getTaskType());
|
|
|
|
|
|
|
|
|
|
|
|
List<Task> tasks = taskDomain.getTaskList(task);
|
|
|
|
|
|
|
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
|
Map<Integer, Integer> months = new HashMap<>();
|
|
|
|
|
|
int total = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (Task t : tasks) {
|
|
|
|
|
|
if (t.getStartTime() != null) {
|
2026-03-13 09:16:36 +08:00
|
|
|
|
// 如果指定了状态列表,则过滤状态
|
|
|
|
|
|
if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getStatusList().contains(t.getStatus())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 10:28:13 +08:00
|
|
|
|
// 如果指定了航线ID列表,则过滤航线
|
|
|
|
|
|
if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getRouteIdList().contains(t.getRouteId())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 10:52:55 +08:00
|
|
|
|
// 如果指定了无人机ID列表,则过滤无人机
|
|
|
|
|
|
if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getUavIdList().contains(t.getUavId())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 11:44:39 +08:00
|
|
|
|
// 如果指定了日期范围,则使用日期范围过滤;否则使用年份过滤
|
|
|
|
|
|
if (queryDTO.getStartDate() != null && queryDTO.getEndDate() != null) {
|
|
|
|
|
|
if (t.getStartTime().before(queryDTO.getStartDate()) || t.getStartTime().after(queryDTO.getEndDate())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (queryDTO.getYear() != null) {
|
|
|
|
|
|
calendar.setTime(t.getStartTime());
|
|
|
|
|
|
int year = calendar.get(Calendar.YEAR);
|
|
|
|
|
|
if (year != queryDTO.getYear()) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
2026-03-09 16:36:47 +08:00
|
|
|
|
}
|
2026-03-13 11:44:39 +08:00
|
|
|
|
|
|
|
|
|
|
calendar.setTime(t.getStartTime());
|
|
|
|
|
|
int month = calendar.get(Calendar.MONTH) + 1;
|
|
|
|
|
|
months.put(month, months.getOrDefault(month, 0) + 1);
|
|
|
|
|
|
total++;
|
2026-03-09 16:36:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
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<Task> tasks = taskDomain.getTaskList(task);
|
|
|
|
|
|
|
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
2026-03-09 17:20:57 +08:00
|
|
|
|
Map<Integer, List<TaskStatItemServiceDTO>> days = new HashMap<>();
|
2026-03-09 16:36:47 +08:00
|
|
|
|
int total = 0;
|
|
|
|
|
|
|
|
|
|
|
|
for (Task t : tasks) {
|
|
|
|
|
|
if (t.getStartTime() != null) {
|
2026-03-13 09:16:36 +08:00
|
|
|
|
// 如果指定了状态列表,则过滤状态
|
|
|
|
|
|
if (queryDTO.getStatusList() != null && !queryDTO.getStatusList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getStatusList().contains(t.getStatus())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 10:28:13 +08:00
|
|
|
|
// 如果指定了航线ID列表,则过滤航线
|
|
|
|
|
|
if (queryDTO.getRouteIdList() != null && !queryDTO.getRouteIdList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getRouteIdList().contains(t.getRouteId())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-13 10:52:55 +08:00
|
|
|
|
// 如果指定了无人机ID列表,则过滤无人机
|
|
|
|
|
|
if (queryDTO.getUavIdList() != null && !queryDTO.getUavIdList().isEmpty()
|
|
|
|
|
|
&& !queryDTO.getUavIdList().contains(t.getUavId())) {
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-09 16:36:47 +08:00
|
|
|
|
calendar.setTime(t.getStartTime());
|
|
|
|
|
|
int year = calendar.get(Calendar.YEAR);
|
|
|
|
|
|
int month = calendar.get(Calendar.MONTH) + 1;
|
2026-03-13 11:44:39 +08:00
|
|
|
|
|
|
|
|
|
|
// 如果指定了日期范围,则使用日期范围过滤;否则使用年月过滤
|
|
|
|
|
|
boolean matchDate = false;
|
|
|
|
|
|
if (queryDTO.getStartDate() != null && queryDTO.getEndDate() != null) {
|
|
|
|
|
|
if (!t.getStartTime().before(queryDTO.getStartDate()) && !t.getStartTime().after(queryDTO.getEndDate())) {
|
|
|
|
|
|
matchDate = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (queryDTO.getYear() != null && queryDTO.getMonth() != null) {
|
|
|
|
|
|
if (year == queryDTO.getYear() && month == queryDTO.getMonth()) {
|
|
|
|
|
|
matchDate = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (matchDate) {
|
2026-03-09 16:36:47 +08:00
|
|
|
|
int day = calendar.get(Calendar.DAY_OF_MONTH);
|
2026-03-09 17:20:57 +08:00
|
|
|
|
|
|
|
|
|
|
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);
|
2026-03-09 16:36:47 +08:00
|
|
|
|
total++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TaskStatByMonthServiceDTO result = new TaskStatByMonthServiceDTO();
|
|
|
|
|
|
result.setTotal(total);
|
|
|
|
|
|
result.setDays(days);
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
2026-03-05 17:14:10 +08:00
|
|
|
|
}
|