From 74dfb82a264f1b779e50058145953caca907f6f2 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期四, 18 十二月 2025 16:57:12 +0800
Subject: [PATCH] yys  巡检管理修改

---
 src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java |  105 ++++++++++++++++++++++++++++++++++------------------
 1 files changed, 69 insertions(+), 36 deletions(-)

diff --git a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
index cb63d96..e76e62e 100644
--- a/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
+++ b/src/main/java/com/ruoyi/inspectiontask/service/impl/TimingTaskScheduler.java
@@ -31,7 +31,7 @@
      * 鏇存柊宸叉湁浠诲姟
      */
     public void rescheduleTimingTask(TimingTask task) throws SchedulerException {
-        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId());
+        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP");
 
         // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
         Trigger oldTrigger = scheduler.getTrigger(triggerKey);
@@ -39,14 +39,28 @@
             throw new SchedulerException("Existing trigger is not a CronTrigger");
         }
 
-        // 鏋勫缓鏂拌Е鍙戝櫒
-        Trigger newTrigger = TriggerBuilder.newTrigger()
-                .withIdentity(triggerKey)
-                .withDescription(task.getTaskName())
-                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
-                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
-                .forJob(oldTrigger.getJobKey())
+        // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+        CronTrigger newTrigger = TriggerBuilder.newTrigger()
+                .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+                .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
+                .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
+                .withSchedule(CronScheduleBuilder
+                        .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                )
+                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+                .startAt(task.getNextExecutionTime() != null
+                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
+                        : new Date())
                 .build();
+
+        // 鏋勫缓鏂拌Е鍙戝櫒
+//        Trigger newTrigger = TriggerBuilder.newTrigger()
+//                .withIdentity(triggerKey)
+//                .withDescription(task.getTaskName())
+//                .withSchedule(CronScheduleBuilder.cronSchedule(convertToCronExpression(task)))
+//                .startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()))
+//                .forJob(oldTrigger.getJobKey())
+//                .build();
 
         scheduler.rescheduleJob(triggerKey, newTrigger);
     }
@@ -76,36 +90,49 @@
     }
 
     private JobDetail buildJobDetail(TimingTask task) {
-        JobDataMap jobDataMap = new JobDataMap();
-        jobDataMap.put("taskId", task.getId());
+        // 1. 鏋勫缓鍞竴JobKey锛堝熀浜庝换鍔D锛岀‘淇濋噸鍚悗鑳借瘑鍒級
+        JobKey jobKey = new JobKey("timingTask_" + task.getId(), "TIMING_TASK_GROUP");
 
+        // 2. 灏佽浠诲姟鏁版嵁锛堜粎浣跨敤鍩烘湰绫诲瀷锛岀‘淇濆彲搴忓垪鍖栵級
+        JobDataMap jobDataMap = new JobDataMap();
+        jobDataMap.put("taskId", task.getId());           // 浠诲姟ID锛圠ong锛屽彲搴忓垪鍖栵級
+        jobDataMap.put("taskName", task.getTaskName());   // 浠诲姟鍚嶇О锛圫tring锛屽彲搴忓垪鍖栵級
+        jobDataMap.put("taskType", task.getFrequencyType()); // 浠诲姟绫诲瀷锛圫tring锛�
+        // 鎸夐渶娣诲姞鍏朵粬蹇呰鐨勫熀鏈被鍨嬪弬鏁�
+
+        // 3. 鏋勫缓JobDetail锛岃缃寔涔呭寲鐩稿叧灞炴��
         return JobBuilder.newJob(TimingTaskJob.class)
-                .withIdentity("timingTask_" + task.getId())
-                .withDescription(task.getTaskName())
-                .usingJobData(jobDataMap)
-                .storeDurably()
+                .withIdentity(jobKey)                    // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+                .withDescription(task.getTaskName())     // 浠诲姟鎻忚堪锛屽瓨鍏ユ暟鎹簱
+                .usingJobData(jobDataMap)                // 缁戝畾浠诲姟鏁版嵁
+                .storeDurably()                          // 鍗充娇娌℃湁瑙﹀彂鍣ㄥ叧鑱斾篃鎸佷箙鍖栦繚瀛�
+                .requestRecovery(true)                   // 褰撹皟搴﹀櫒宕╂簝鍚庢仮澶嶆椂锛岄噸鏂版墽琛屾湭瀹屾垚鐨勪换鍔�
                 .build();
     }
 
     private Trigger buildJobTrigger(TimingTask task, JobDetail jobDetail) {
+        // 1. 鏋勫缓鍞竴TriggerKey锛堝熀浜庝换鍔D锛�
+        TriggerKey triggerKey = new TriggerKey("trigger_" + task.getId(), "TIMING_TASK_TRIGGER_GROUP");
+
+        // 2. 鐢熸垚Cron琛ㄨ揪寮忥紙鍘熼�昏緫涓嶅彉锛�
         String cronExpression = convertToCronExpression(task);
 
-            TriggerBuilder<CronTrigger> triggerBuilder = TriggerBuilder.newTrigger()
-                .withIdentity("trigger_" + task.getId())
-                .withDescription(task.getTaskName())
-                .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression));
-
-        if (jobDetail != null) {
-            triggerBuilder.forJob(jobDetail);
-        }
-
-        if (task.getNextExecutionTime() != null) {
-            triggerBuilder.startAt(Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant()));
-        }
-
-        return triggerBuilder.build();
+        // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+        CronTrigger trigger = TriggerBuilder.newTrigger()
+                .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
+                .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
+                .forJob(jobDetail)                       // 鍏宠仈瀵瑰簲鐨凧ob
+                .withSchedule(CronScheduleBuilder
+                        .cronSchedule(cronExpression)
+                        .withMisfireHandlingInstructionDoNothing() // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                )
+                // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
+                .startAt(task.getNextExecutionTime() != null
+                        ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
+                        : new Date())
+                .build();
+        return trigger;
     }
-
     private String convertToCronExpression(TimingTask task) {
         // 鍙傛暟鏍¢獙
         if (task == null || task.getFrequencyType() == null || task.getFrequencyDetail() == null) {
@@ -113,13 +140,19 @@
         }
 
         // 浣跨敤switch纭繚鏉′欢浜掓枼
-        return switch (task.getFrequencyType().toUpperCase()) { // 缁熶竴杞负澶у啓姣旇緝
-            case "DAILY" -> convertDailyToCron(task.getFrequencyDetail());
-            case "WEEKLY" -> convertWeeklyToCron(task.getFrequencyDetail());
-            case "MONTHLY" -> convertMonthlyToCron(task.getFrequencyDetail());
-            case "QUARTERLY" -> convertQuarterlyToCron(task.getFrequencyDetail());
-            default -> throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
-        };
+        String frequencyType = task.getFrequencyType().toUpperCase(); // 缁熶竴杞负澶у啓姣旇緝
+        switch (frequencyType) {
+            case "DAILY":
+                return convertDailyToCron(task.getFrequencyDetail());
+            case "WEEKLY":
+                return convertWeeklyToCron(task.getFrequencyDetail());
+            case "MONTHLY":
+                return convertMonthlyToCron(task.getFrequencyDetail());
+            case "QUARTERLY":
+                return convertQuarterlyToCron(task.getFrequencyDetail());
+            default:
+                throw new IllegalArgumentException("涓嶆敮鎸佺殑棰戠巼绫诲瀷: " + task.getFrequencyType());
+        }
     }
 
     // 姣忔棩浠诲姟杞崲

--
Gitblit v1.9.3