a-tuoheng-task/src/main/java/com/ruoyi/task/service/impl/TaskServiceImpl.java

278 lines
10 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<TaskDTO> 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<Task> 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<TaskDTO> getTaskByUavId(String uavId) {
// 创建Task对象作为查询条件
Task task = new Task();
task.setUavId(uavId);
List<Task> tasks = taskDomain.getTaskList(task);
return TaskDTOConvert.toDTOList(tasks);
}
@Override
public TaskDTO getCurrentTaskByUavId(String uavId) {
// 创建Task对象作为查询条件
Task task = new Task();
task.setUavId(uavId);
List<Task> 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.setRouteId(queryDTO.getRouteId());
task.setUavId(queryDTO.getUavId());
task.setStatus(queryDTO.getStatus());
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) {
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.setRouteId(queryDTO.getRouteId());
task.setUavId(queryDTO.getUavId());
task.setStatus(queryDTO.getStatus());
task.setTaskCategory(queryDTO.getTaskCategory());
task.setTaskType(queryDTO.getTaskType());
List<Task> tasks = taskDomain.getTaskList(task);
Calendar calendar = Calendar.getInstance();
Map<Integer, List<TaskStatItemServiceDTO>> days = new HashMap<>();
int total = 0;
for (Task t : tasks) {
if (t.getStartTime() != null) {
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;
}
}