From 0a4d548b6bf9cfef252400fb6d6612e45cf5b602 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 27 十月 2026 13:21:23 +0800
Subject: [PATCH] fix(scheduler): 修复定时任务调度问题并增强系统稳定性

---
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java |   72 +++++++++++++++++++++++++++++-------
 1 files changed, 58 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
index 8d0caee..b8abe83 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -1,17 +1,18 @@
 package com.ruoyi.device.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.device.mapper.MaintenanceTaskMapper;
 import com.ruoyi.device.pojo.MaintenanceTask;
 import com.ruoyi.device.service.MaintenanceTaskService;
-import com.ruoyi.common.constant.HttpStatus;
-import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
 import com.ruoyi.inspectiontask.service.impl.TimingTaskServiceImpl;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import jakarta.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -33,12 +34,42 @@
     private final TimingTaskServiceImpl timingTaskService;
     private final MaintenanceTaskScheduler maintenanceTaskScheduler;
 
+    /**
+     * 鍚姩鏃舵妸宸插惎鐢ㄤ絾鏈敞鍐屽埌 Quartz 鐨勪繚鍏讳换鍔¤ˉ娉ㄥ唽锛�
+     * 閬垮厤璋冨害璁板綍涓㈠け鍚庡畾鏃朵换鍔¢潤榛樹笉鎵ц
+     */
+    @PostConstruct
+    public void restoreScheduledTasks() {
+        try {
+            List<MaintenanceTask> tasks = maintenanceTaskMapper.selectList(new QueryWrapper<MaintenanceTask>()
+                    .eq("is_active", 1)
+                    .eq("deleted", 0));
+            for (MaintenanceTask task : tasks) {
+                try {
+                    TimingTask timingTask = new TimingTask();
+                    timingTask.setFrequencyType(task.getFrequencyType());
+                    timingTask.setFrequencyDetail(task.getFrequencyDetail());
+                    LocalDateTime nextTime = timingTaskService.calculateFirstExecutionTime(timingTask);
+                    if (!Objects.equals(task.getNextExecutionTime(), nextTime)) {
+                        task.setNextExecutionTime(nextTime);
+                        maintenanceTaskMapper.updateById(task);
+                    }
+                    maintenanceTaskScheduler.ensureScheduled(task);
+                } catch (Exception e) {
+                    log.error("鎭㈠淇濆吇瀹氭椂浠诲姟澶辫触: id={}, name={}", task.getId(), task.getTaskName(), e);
+                }
+            }
+        } catch (Exception e) {
+            log.error("鎭㈠淇濆吇瀹氭椂浠诲姟寮傚父", e);
+        }
+    }
+
     @Override
-    public R<?> listPage(Page page, MaintenanceTask maintenanceTask) {
-        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
+    public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
+        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, new QueryWrapper<MaintenanceTask>().orderByDesc("create_time"));
         // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
         if (taskPage.getRecords().isEmpty()) {
-            return R.ok(taskPage);
+            return AjaxResult.success(taskPage);
         }
 
         // 3. 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鐢ㄦ埛ID
@@ -63,11 +94,11 @@
                 task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
             }
         });
-        return R.ok(taskPage);
+        return AjaxResult.success(taskPage);
     }
 
     @Override
-    public R<?> add(MaintenanceTask maintenanceTask) {
+    public AjaxResult add(MaintenanceTask maintenanceTask) {
         maintenanceTask.setActive(true);
         // 璁$畻棣栨鎵ц鏃堕棿
         TimingTask task = new TimingTask();
@@ -79,31 +110,44 @@
         if (insert > 0) {
             maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
         }
-        return R.ok(null, "娣诲姞鎴愬姛");
+        return AjaxResult.success("娣诲姞鎴愬姛");
     }
 
     @Override
-    public R<?> updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
+    public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
         MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
         if (maintenanceTask1 == null) {
-            return R.fail(HttpStatus.WARN, "娌℃湁姝ゆ暟鎹�");
+            return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
         }
+        // 棰戠巼鍙樺寲鏃堕噸绠椾笅娆℃墽琛屾椂闂达紝閬垮厤椤甸潰鏄剧ず涓庡疄闄呰皟搴︿笉涓�鑷�
+        boolean frequencyChanged = !Objects.equals(maintenanceTask.getFrequencyType(), maintenanceTask1.getFrequencyType())
+                || !Objects.equals(maintenanceTask.getFrequencyDetail(), maintenanceTask1.getFrequencyDetail());
         BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
+        if (frequencyChanged) {
+            TimingTask task = new TimingTask();
+            task.setFrequencyType(maintenanceTask1.getFrequencyType());
+            task.setFrequencyDetail(maintenanceTask1.getFrequencyDetail());
+            maintenanceTask1.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(task));
+        }
         int update = maintenanceTaskMapper.updateById(maintenanceTask1);
         if (update > 0) {
-            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            if (maintenanceTask1.isActive()) {
+                maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            } else {
+                maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
+            }
         }
-        return R.ok(null, "鏇存柊鎴愬姛");
+        return AjaxResult.success("鏇存柊鎴愬姛");
     }
 
     @Override
-    public R<?> delete(List<Long> ids) {
+    public AjaxResult delete(List<Long> ids) {
         int delete = maintenanceTaskMapper.deleteBatchIds(ids);
         if (delete > 0) {
             ids.forEach(id -> {
                 maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
             });
         }
-        return R.ok(null, "鍒犻櫎鎴愬姛");
+        return AjaxResult.success("鍒犻櫎鎴愬姛");
     }
 }

--
Gitblit v1.9.3