From 66d041ed14b3ed3ed7183a28a5c588e235fc21d0 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 26 五月 2026 11:14:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro_河南鹤壁' into dev_鹤壁_强信宇_pro

---
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java |   56 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
index 384862b..3913b8b 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -1,9 +1,9 @@
 package com.ruoyi.device.service.impl;
 
 import com.ruoyi.device.pojo.MaintenanceTask;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.quartz.*;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalTime;
@@ -19,19 +19,31 @@
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class MaintenanceTaskScheduler {
 
-    @Autowired
-    private Scheduler scheduler;
+    private final Scheduler scheduler;
 
     /**
-     * 娣诲姞鏂颁换鍔″埌璋冨害鍣�
+     * 娣诲姞鎴栨洿鏂颁换鍔″埌璋冨害鍣�
      */
     public void scheduleMaintenanceTask(MaintenanceTask task){
         try {
             JobDetail jobDetail = buildJobDetail(task);
             Trigger trigger = buildJobTrigger(task, jobDetail);
-            scheduler.scheduleJob(jobDetail, trigger);
+
+            // 妫�鏌ヨЕ鍙戝櫒鏄惁宸插瓨鍦�
+            TriggerKey triggerKey = trigger.getKey();
+            Trigger existingTrigger = scheduler.getTrigger(triggerKey);
+
+            if (existingTrigger != null) {
+                // 瑙﹀彂鍣ㄥ凡瀛樺湪锛屾洿鏂板畠
+                scheduler.rescheduleJob(triggerKey, trigger);
+            } else {
+                // 瑙﹀彂鍣ㄤ笉瀛樺湪锛屽厛纭繚 Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+                scheduler.addJob(jobDetail, true);
+                scheduler.scheduleJob(trigger);
+            }
         }catch (SchedulerException e){
             log.error("SchedulerException scheduleMaintenanceTask ERROR",e);
             throw new RuntimeException(e);
@@ -45,26 +57,41 @@
        try{
            TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
 
-           // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+           // 鑾峰彇鐜版湁瑙﹀彂鍣�
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+
+           // 鏋勫缓鏂扮殑 JobDetail 鍜� Trigger
+           JobDetail jobDetail = buildJobDetail(task);
+           Trigger newTrigger = buildJobTrigger(task, jobDetail);
+
+           if (oldTrigger == null) {
+               // 瑙﹀彂鍣ㄤ笉瀛樺湪锛岃鏄庝换鍔′箣鍓嶈鍒犻櫎杩�
+               // 鍏堢‘淇� Job 瀛樺湪锛岀劧鍚庤皟搴﹁Е鍙戝櫒
+               scheduler.addJob(jobDetail, true);
+               scheduler.scheduleJob(newTrigger);
+               return;
+           }
+
+           // 瑙﹀彂鍣ㄥ瓨鍦紝鐩存帴鏇存柊
            if (!(oldTrigger instanceof CronTrigger)) {
                throw new SchedulerException("Existing trigger is not a CronTrigger");
            }
 
-           // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
-           CronTrigger newTrigger = TriggerBuilder.newTrigger()
-                   .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                   .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
-                   .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
+           // 鏋勫缓鏂扮殑 CronTrigger
+           CronTrigger cronTrigger = TriggerBuilder.newTrigger()
+                   .withIdentity(triggerKey)
+                   .withDescription(task.getTaskName() + "_TRIGGER")
+                   .forJob(oldTrigger.getJobKey())
                    .withSchedule(CronScheduleBuilder
-                           .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                           .cronSchedule(convertToCronExpression(task))
+                           .withMisfireHandlingInstructionDoNothing()
                    )
-                   // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
                    .startAt(task.getNextExecutionTime() != null
                            ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                            : new Date())
                    .build();
-           scheduler.rescheduleJob(triggerKey, newTrigger);
+
+           scheduler.rescheduleJob(triggerKey, cronTrigger);
        }catch (SchedulerException e){
            log.error("SchedulerException rescheduleMaintenanceTask ERROR",e);
            throw new RuntimeException(e);
@@ -93,6 +120,7 @@
     public void unscheduleMaintenanceTask(Long taskId){
         try {
             JobKey jobKey = new JobKey("MaintenanceTask_" + taskId);
+            // 鍒犻櫎 Job 浼氳嚜鍔ㄥ垹闄ゅ叧鑱旂殑 Trigger
             scheduler.deleteJob(jobKey);
         }catch (SchedulerException e){
             log.error("SchedulerException unscheduleMaintenanceTask ERROR",e);

--
Gitblit v1.9.3