gaoluyang
5 天以前 cf330c6a6c2ae7ec86d20de465d5af27a4684cf6
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.device.pojo.DeviceLedger;
import com.ruoyi.inspectiontask.dto.TimingTaskDto;
import com.ruoyi.inspectiontask.mapper.TimingTaskMapper;
import com.ruoyi.inspectiontask.pojo.TimingTask;
@@ -191,8 +192,13 @@
        if (taskId == null || taskId <= 0) {
            return;
        }
        if (deviceLedgerMapper.selectById(taskId.longValue()) == null) {
        DeviceLedger deviceLedger = deviceLedgerMapper.selectById(taskId.longValue());
        if (deviceLedger == null) {
            throw new IllegalArgumentException("所选设备不存在,请重新选择");
        }
        boolean deviceChanged = oldTimingTask == null || !Objects.equals(oldTimingTask.getTaskId(), taskId);
        if (deviceChanged && Integer.valueOf(0).equals(deviceLedger.getIsEnabled())) {
            throw new IllegalArgumentException("所选设备已停用,不能安排巡检");
        }
    }
@@ -216,6 +222,9 @@
            throw new IllegalArgumentException("不支持的频率类型: " + task.getFrequencyType());
        }
    }
    /** 每年巡检默认执行时间:07:00(页面上不精确到时分) */
    private static final LocalTime DEFAULT_EXECUTION_TIME = LocalTime.of(7, 0);
    private LocalDateTime calculateDailyFirstExecution(String frequencyDetail) {
        // frequencyDetail可能是具体时间,如 "14:30"
@@ -332,8 +341,9 @@
    private LocalDateTime calculateAnnualFirstExecution(String frequencyDetail) {
        String[] parts = frequencyDetail.split(",");
        if (parts.length != 3) {
            throw new IllegalArgumentException("参数格式错误,应为'12,31,09:00'格式");
        // 每年频率不需要精确到时分:默认格式为 "月,日",兼容旧的 "月,日,HH:mm"
        if (parts.length != 2 && parts.length != 3) {
            throw new IllegalArgumentException("参数格式错误,应为'12,31'格式");
        }
        int month;
@@ -348,7 +358,9 @@
            throw new IllegalArgumentException("月份必须在1-12之间,日期必须在1-31之间");
        }
        LocalTime time = LocalTime.parse(parts[2].trim(), DateTimeFormatter.ofPattern("HH:mm"));
        LocalTime time = parts.length == 3
                ? LocalTime.parse(parts[2].trim(), DateTimeFormatter.ofPattern("HH:mm"))
                : DEFAULT_EXECUTION_TIME;
        LocalDateTime now = LocalDateTime.now();
        int year = now.getYear();
        LocalDateTime target = LocalDateTime.of(LocalDate.of(year, month, Math.min(day, YearMonth.of(year, month).lengthOfMonth())), time);
@@ -391,6 +403,8 @@
                                                     LocalDateTime currentTime) {
        try {
            switch (frequencyType) {
                case "YEARLY":
                    return calculateYearlyNextTime(frequencyDetail, currentTime);
                case "DAILY":
                    return calculateDailyNextTime(frequencyDetail, currentTime);
                case "WEEKLY":
@@ -408,6 +422,27 @@
    }
    /**
     * 计算每年任务的下次执行时间
     * frequencyDetail 格式为 "月,日",兼容 "月,日,HH:mm"(默认 07:00)
     */
    private LocalDateTime calculateYearlyNextTime(String detail, LocalDateTime current) {
        String[] parts = detail.split(",");
        int month = Integer.parseInt(parts[0].trim());
        int day = Integer.parseInt(parts[1].trim());
        LocalTime time = parts.length >= 3 ? LocalTime.parse(parts[2].trim()) : DEFAULT_EXECUTION_TIME;
        int year = current.getYear();
        LocalDateTime target = LocalDateTime.of(
                year, month, Math.min(day, YearMonth.of(year, month).lengthOfMonth()), time.getHour(), time.getMinute());
        if (!current.isBefore(target)) {
            year++;
            target = LocalDateTime.of(
                    year, month, Math.min(day, YearMonth.of(year, month).lengthOfMonth()), time.getHour(), time.getMinute());
        }
        return target;
    }
    /**
     * 计算每日任务的下次执行时间
     */
    private LocalDateTime calculateDailyNextTime(String timeStr, LocalDateTime current) {