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

262 lines
9.9 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.*;
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.ITaskPlanService;
import com.ruoyi.task.service.convert.TaskPlanDTOConvert;
import com.ruoyi.task.service.convert.TaskDTOConvert;
import com.ruoyi.task.service.dto.TaskPlanDTO;
import com.ruoyi.task.service.dto.TaskPlanQueryDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class TaskPlanServiceImpl implements ITaskPlanService {
@Autowired
private ITaskPlanDomain taskPlanDomain;
@Autowired
private ITaskDomain taskDomain;
@Override
public Long createTimedTaskPlan(TaskPlanDTO taskPlanDTO) {
TaskPlan taskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
// 校验PlanTypeEnum
if (taskPlan.getPlanType() != null && taskPlan.getPlanType() == PlanTypeEnum.CYCLE) {
throw new IllegalArgumentException("定时任务计划不能设置为周期类型");
}
// 如果PlanTypeEnum为空设置为定时类型
if (taskPlan.getPlanType() == null) {
taskPlan.setPlanType(PlanTypeEnum.TIMED);
}
TaskPlan result = taskPlanDomain.createTimedTaskPlan(taskPlan);
// 创建对应的任务记录
createTaskFromPlan(result);
return result.getId();
}
@Override
public Long createCycleTaskPlan(TaskPlanDTO taskPlanDTO) {
TaskPlan taskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
// 校验PlanTypeEnum
if (taskPlan.getPlanType() != null && taskPlan.getPlanType() == PlanTypeEnum.TIMED) {
throw new IllegalArgumentException("周期任务计划不能设置为定时类型");
}
// 如果PlanTypeEnum为空设置为周期类型
if (taskPlan.getPlanType() == null) {
taskPlan.setPlanType(PlanTypeEnum.CYCLE);
}
TaskPlan result = taskPlanDomain.createCycleTaskPlan(taskPlan);
// 创建对应的任务记录
createTaskFromPlan(result);
return result.getId();
}
/**
* 根据任务计划创建任务记录
*/
private void createTaskFromPlan(TaskPlan taskPlan) {
// 检查是否为周期任务计划
if (taskPlan.getPlanType() == PlanTypeEnum.CYCLE) {
// 生成周期任务记录
generateCycleTasks(taskPlan);
} else {
// 生成单次任务记录
generateSingleTask(taskPlan);
}
}
/**
* 生成单次任务记录
*/
private void generateSingleTask(TaskPlan taskPlan) {
Task task = new Task();
task.setTaskName(taskPlan.getPlanName() + "_任务");
task.setPlanId(taskPlan.getId());
task.setTaskCategory(TaskCategoryEnum.PLAN_TASK);
task.setTaskType(TaskTypeEnum.PLAN_TASK);
task.setExecuteType(taskPlan.getExecuteType());
task.setRouteId(taskPlan.getRouteId());
task.setUavId(taskPlan.getUavId());
task.setStartTime(taskPlan.getStartDate());
task.setEndTime(taskPlan.getEndDate());
task.setStatus(StatusEnum.PENDING); // 待执行
task.setDescription("由任务计划自动创建");
// 创建任务
taskDomain.createTaskWithoutPlan(task);
}
/**
* 生成周期任务记录
*/
private void generateCycleTasks(TaskPlan taskPlan) {
// 从开始日期到结束日期,根据周期类型和周期值生成任务
java.util.Calendar calendar = java.util.Calendar.getInstance();
calendar.setTime(taskPlan.getStartDate());
java.util.Calendar endCalendar = java.util.Calendar.getInstance();
endCalendar.setTime(taskPlan.getEndDate());
// 解析周期值
String cycleValue = taskPlan.getCycleValue();
java.util.Set<Integer> cycleValues = new java.util.HashSet<>();
if (cycleValue != null && !cycleValue.isEmpty()) {
String[] values = cycleValue.split(",");
for (String value : values) {
try {
cycleValues.add(Integer.parseInt(value.trim()));
} catch (NumberFormatException e) {
// 忽略无效值
}
}
}
// 根据周期类型生成任务
while (!calendar.after(endCalendar)) {
boolean shouldCreateTask = false;
if (taskPlan.getCycleType() == CycleTypeEnum.DAILY) {
// 日周期:每天都创建任务
shouldCreateTask = true;
} else if (taskPlan.getCycleType() == CycleTypeEnum.WEEKLY) {
// 周周期在指定的星期几创建任务1-71表示周日
int dayOfWeek = calendar.get(java.util.Calendar.DAY_OF_WEEK);
shouldCreateTask = cycleValues.contains(dayOfWeek);
} else if (taskPlan.getCycleType() == CycleTypeEnum.MONTHLY) {
// 月周期在指定的日期创建任务1-31
int dayOfMonth = calendar.get(java.util.Calendar.DAY_OF_MONTH);
shouldCreateTask = cycleValues.contains(dayOfMonth);
}
if (shouldCreateTask) {
Task task = new Task();
task.setTaskName(taskPlan.getPlanName() + "_任务_" + formatDate(calendar.getTime()));
task.setPlanId(taskPlan.getId());
task.setTaskCategory(TaskCategoryEnum.PLAN_TASK);
task.setTaskType(TaskTypeEnum.PLAN_TASK);
task.setExecuteType(taskPlan.getExecuteType());
task.setRouteId(taskPlan.getRouteId());
task.setUavId(taskPlan.getUavId());
task.setStartTime(calendar.getTime());
task.setEndTime(calendar.getTime());
task.setStatus(StatusEnum.PENDING); // 待执行
task.setDescription("由任务计划自动创建");
// 创建任务
taskDomain.createTaskWithoutPlan(task);
}
// 增加一天
calendar.add(java.util.Calendar.DAY_OF_YEAR, 1);
}
}
/**
* 格式化日期为字符串
*/
private String formatDate(java.util.Date date) {
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
return sdf.format(date);
}
@Override
public TaskPlanDTO getTaskPlanById(Long planId) {
TaskPlan taskPlan = taskPlanDomain.getTaskPlanById(planId);
return TaskPlanDTOConvert.toDTO(taskPlan);
}
@Override
public List<TaskPlanDTO> getTaskPlanList(TaskPlanQueryDTO queryDTO) {
// 如果传递了id功能就等同于getTaskPlanById
if (queryDTO.getId() != null) {
TaskPlanDTO taskPlanDTO = getTaskPlanById(queryDTO.getId());
return taskPlanDTO != null ? java.util.Collections.singletonList(taskPlanDTO) : java.util.Collections.emptyList();
}
// 创建TaskPlan对象作为查询条件
TaskPlan taskPlan = new TaskPlan();
taskPlan.setRouteId(queryDTO.getRouteId());
taskPlan.setUavId(queryDTO.getUavId());
taskPlan.setStatus(queryDTO.getStatus());
taskPlan.setPlanType(queryDTO.getPlanType());
taskPlan.setCycleType(queryDTO.getCycleType());
// 这里需要注意TaskPlan类中没有airportCode和routeName字段
// 这些字段可能需要通过关联查询来实现过滤,
// 但目前我们先按照现有的结构实现基本过滤
List<TaskPlan> taskPlans = taskPlanDomain.getTaskPlanList(taskPlan);
// 过滤时间范围只有当startDateStart和startDateEnd都传时才使用
if (queryDTO.getStartDateStart() != null && queryDTO.getStartDateEnd() != null) {
java.util.Date startDateStart = queryDTO.getStartDateStart();
java.util.Date startDateEnd = queryDTO.getStartDateEnd();
taskPlans = taskPlans.stream()
.filter(plan -> {
java.util.Date planStartDate = plan.getStartDate();
return planStartDate != null &&
!planStartDate.before(startDateStart) &&
!planStartDate.after(startDateEnd);
})
.collect(java.util.stream.Collectors.toList());
}
return TaskPlanDTOConvert.toDTOList(taskPlans);
}
@Override
public boolean updateTaskPlan(TaskPlanDTO taskPlanDTO) {
TaskPlan taskPlan = TaskPlanDTOConvert.toDomain(taskPlanDTO);
TaskPlan result = taskPlanDomain.updateTaskPlan(taskPlan);
if (result != null) {
// 先删除该计划下的所有未执行任务
List<Task> tasks = taskDomain.getTaskByPlanId(result.getId());
for (Task task : tasks) {
if (task.getStatus() == StatusEnum.PENDING) {
taskDomain.deleteTask(task.getId());
}
}
// 重新创建任务
createTaskFromPlan(result);
}
return result != null;
}
@Override
public boolean deleteTaskPlan(Long planId) {
// 先获取该计划下的所有任务
List<Task> tasks = taskDomain.getTaskByPlanId(planId);
// 删除所有状态为待执行的任务
for (Task task : tasks) {
if (task.getStatus() == StatusEnum.PENDING) {
taskDomain.deleteTask(task.getId());
}
}
// 最后删除任务计划
return taskPlanDomain.deleteTaskPlan(planId);
}
}