diff --git a/src/main/java/com/ruoyi/task/service/impl/TaskPlanServiceImpl.java b/src/main/java/com/ruoyi/task/service/impl/TaskPlanServiceImpl.java index 54408b7..85eab8c 100644 --- a/src/main/java/com/ruoyi/task/service/impl/TaskPlanServiceImpl.java +++ b/src/main/java/com/ruoyi/task/service/impl/TaskPlanServiceImpl.java @@ -133,91 +133,99 @@ public class TaskPlanServiceImpl implements ITaskPlanService { * 生成周期任务记录 */ 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 cycleValues = new java.util.HashSet<>(); - if (cycleValue != null && !cycleValue.isEmpty()) { - String[] values = cycleValue.split(","); - for (String value : values) { + + if (taskPlan.getCycleType() == CycleTypeEnum.DAILY) { + // 日周期:cycleValue 表示每几天执行一次 + int dayInterval = 1; + if (taskPlan.getCycleValue() != null && !taskPlan.getCycleValue().isEmpty()) { try { - cycleValues.add(Integer.parseInt(value.trim())); + dayInterval = Integer.parseInt(taskPlan.getCycleValue().trim()); + if (dayInterval < 1) dayInterval = 1; } catch (NumberFormatException e) { - // 忽略无效值 + dayInterval = 1; } } - } - - // 根据周期类型生成任务 - while (!calendar.after(endCalendar)) { - boolean shouldCreateTask = false; - - if (taskPlan.getCycleType() == CycleTypeEnum.DAILY) { - // 日周期:每天都创建任务 - shouldCreateTask = true; - } else if (taskPlan.getCycleType() == CycleTypeEnum.WEEKLY) { - // 周周期:在指定的星期几创建任务(1-7,1表示周日) - 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); + + while (!calendar.after(endCalendar)) { + createTaskForDate(taskPlan, calendar); + calendar.add(java.util.Calendar.DAY_OF_YEAR, dayInterval); } - - 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()); - - // 设置任务开始时间:使用日历日期 + 计划的执行时间 - if (taskPlan.getExecuteTime() != null) { - java.util.Calendar taskCalendar = java.util.Calendar.getInstance(); - taskCalendar.setTime(calendar.getTime()); - java.util.Calendar executeTimeCalendar = java.util.Calendar.getInstance(); - executeTimeCalendar.setTime(taskPlan.getExecuteTime()); - taskCalendar.set(java.util.Calendar.HOUR_OF_DAY, executeTimeCalendar.get(java.util.Calendar.HOUR_OF_DAY)); - taskCalendar.set(java.util.Calendar.MINUTE, executeTimeCalendar.get(java.util.Calendar.MINUTE)); - taskCalendar.set(java.util.Calendar.SECOND, executeTimeCalendar.get(java.util.Calendar.SECOND)); - task.setStartTime(taskCalendar.getTime()); - - // 设置结束时间:开始时间 + 执行时长 - java.util.Calendar endTaskCalendar = (java.util.Calendar) taskCalendar.clone(); - if (taskPlan.getDuration() != null) { - endTaskCalendar.add(java.util.Calendar.SECOND, taskPlan.getDuration()); - } else { - // 如果没有设置执行时长,默认1小时 - endTaskCalendar.add(java.util.Calendar.HOUR_OF_DAY, 1); + } else { + // 周周期和月周期:解析 cycleValue 为集合 + java.util.Set cycleValues = new java.util.HashSet<>(); + if (taskPlan.getCycleValue() != null && !taskPlan.getCycleValue().isEmpty()) { + String[] values = taskPlan.getCycleValue().split(","); + for (String value : values) { + try { + cycleValues.add(Integer.parseInt(value.trim())); + } catch (NumberFormatException e) { + // 忽略无效值 } - task.setEndTime(endTaskCalendar.getTime()); - } else { - // 如果没有设置执行时间,使用日历时间作为开始和结束时间 - task.setStartTime(calendar.getTime()); - task.setEndTime(calendar.getTime()); } - - task.setStatus(StatusEnum.PENDING); // 待执行 - task.setDescription("由任务计划自动创建"); - - // 创建任务 - taskDomain.createTask(task); } - - // 增加一天 - calendar.add(java.util.Calendar.DAY_OF_YEAR, 1); + + while (!calendar.after(endCalendar)) { + boolean shouldCreateTask = false; + + if (taskPlan.getCycleType() == CycleTypeEnum.WEEKLY) { + int dayOfWeek = calendar.get(java.util.Calendar.DAY_OF_WEEK); + shouldCreateTask = cycleValues.contains(dayOfWeek); + } else if (taskPlan.getCycleType() == CycleTypeEnum.MONTHLY) { + int dayOfMonth = calendar.get(java.util.Calendar.DAY_OF_MONTH); + shouldCreateTask = cycleValues.contains(dayOfMonth); + } + + if (shouldCreateTask) { + createTaskForDate(taskPlan, calendar); + } + + calendar.add(java.util.Calendar.DAY_OF_YEAR, 1); + } } } + + private void createTaskForDate(TaskPlan taskPlan, java.util.Calendar calendar) { + 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()); + + if (taskPlan.getExecuteTime() != null) { + java.util.Calendar taskCalendar = java.util.Calendar.getInstance(); + taskCalendar.setTime(calendar.getTime()); + java.util.Calendar executeTimeCalendar = java.util.Calendar.getInstance(); + executeTimeCalendar.setTime(taskPlan.getExecuteTime()); + taskCalendar.set(java.util.Calendar.HOUR_OF_DAY, executeTimeCalendar.get(java.util.Calendar.HOUR_OF_DAY)); + taskCalendar.set(java.util.Calendar.MINUTE, executeTimeCalendar.get(java.util.Calendar.MINUTE)); + taskCalendar.set(java.util.Calendar.SECOND, executeTimeCalendar.get(java.util.Calendar.SECOND)); + task.setStartTime(taskCalendar.getTime()); + + java.util.Calendar endTaskCalendar = (java.util.Calendar) taskCalendar.clone(); + if (taskPlan.getDuration() != null) { + endTaskCalendar.add(java.util.Calendar.SECOND, taskPlan.getDuration()); + } else { + endTaskCalendar.add(java.util.Calendar.SECOND, 3600); + } + task.setEndTime(endTaskCalendar.getTime()); + } else { + task.setStartTime(calendar.getTime()); + task.setEndTime(calendar.getTime()); + } + + task.setStatus(StatusEnum.PENDING); + task.setDescription("由任务计划自动创建"); + + taskDomain.createTask(task); + } /** * 格式化日期为字符串