2026-06-02 a217dbfc7378ff9cf5b6d3ca8b229a2b9d932e51
src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java
@@ -33,6 +33,8 @@
                return calculateMonthlyNextTime(frequencyDetail, currentTime);
            case "QUARTERLY":
                return calculateQuarterlyNextTime(frequencyDetail, currentTime);
            case "YEARLY":
                return calculateYearlyNextTime(frequencyDetail, currentTime);
            default:
                throw new IllegalArgumentException("不支持的频率类型: " + frequencyType);
        }
@@ -105,6 +107,30 @@
        throw new IllegalArgumentException("无法找到下一次执行时间");
    }
    private static LocalDateTime calculateYearlyNextTime(String detail, LocalDateTime current) {
        String[] parts = validateAndSplit(detail, ",", 3);
        int month = validateMonth(parts[0]);
        int dayOfMonth = validateDayOfMonth(parts[1]);
        LocalTime time = parseTime(parts[2]);
        for (int i = 0; i < 5; i++) {
            int year = current.getYear() + i;
            YearMonth targetYearMonth = YearMonth.of(year, month);
            int adjustedDay = Math.min(dayOfMonth, targetYearMonth.lengthOfMonth());
            LocalDateTime target = LocalDateTime.of(
                    year,
                    month,
                    adjustedDay,
                    time.getHour(),
                    time.getMinute()
            );
            if (target.isAfter(current)) {
                return target;
            }
        }
        throw new IllegalArgumentException("无法找到下一次执行时间");
    }
    private static LocalTime parseTime(String timeStr) {
        try {
            return LocalTime.parse(timeStr, TIME_FORMATTER);