From a217dbfc7378ff9cf5b6d3ca8b229a2b9d932e51 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 02 六月 2026 11:52:19 +0800
Subject: [PATCH] feat(device): 添加设备保养验收功能和年度定时任务支持

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java
index 5c488d2..1200c31 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduleUtils.java
+++ b/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);

--
Gitblit v1.9.3