From 089964a497c2528e88ddc610af5f88f631303431 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 18 五月 2026 15:28:16 +0800
Subject: [PATCH] feat: 设备保养新增任务状态,启动/停止与调度器关联

---
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java   |   19 ++++++---
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java |   41 +++++++++++++++-----
 src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java                    |    2 
 3 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
index 7c73f39..b74e8d7 100644
--- a/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
+++ b/src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java
@@ -56,7 +56,7 @@
     private LocalDateTime lastExecutionTime;
 
     @ApiModelProperty(value = "鏄惁婵�娲�")
-    private boolean isActive;
+    private Integer isActive;
 
     @ApiModelProperty(value = "澶囨敞")
     @Excel(name = "澶囨敞")
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..7c9c381 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java
@@ -45,21 +45,26 @@
        try{
            TriggerKey triggerKey = new TriggerKey("triggerMaintenanceTask_" + task.getId());
 
-           // 鑾峰彇鐜版湁瑙﹀彂鍣ㄥ苟杞崲涓� CronTrigger
+           // 鑾峰彇鐜版湁瑙﹀彂鍣�
            Trigger oldTrigger = scheduler.getTrigger(triggerKey);
+           // 涓嶅瓨鍦ㄥ垯娣诲姞
+           if (oldTrigger == null) {
+               scheduleMaintenanceTask(task);
+               return;
+           }
+
            if (!(oldTrigger instanceof CronTrigger)) {
                throw new SchedulerException("Existing trigger is not a CronTrigger");
            }
 
-           // 3. 鏋勫缓CronTrigger锛岀‘淇濇寔涔呭寲閰嶇疆
+           // 鏋勫缓鏂扮殑CronTrigger
            CronTrigger newTrigger = TriggerBuilder.newTrigger()
-                   .withIdentity(triggerKey)                // 鍞竴鏍囪瘑锛岀敤浜庢寔涔呭寲瀛樺偍
-                   .withDescription(task.getTaskName() + "_TRIGGER") // 瑙﹀彂鍣ㄦ弿杩�
-                   .forJob(oldTrigger.getJobKey())                       // 鍏宠仈瀵瑰簲鐨凧ob
+                   .withIdentity(triggerKey)
+                   .withDescription(task.getTaskName() + "_TRIGGER")
+                   .forJob(oldTrigger.getJobKey())
                    .withSchedule(CronScheduleBuilder
-                           .cronSchedule(convertToCronExpression(task)) // 閿欒繃鎵ц鏃剁殑绛栫暐锛堟牴鎹笟鍔¤皟鏁达級
+                           .cronSchedule(convertToCronExpression(task))
                    )
-                   // 4. 璁剧疆寮�濮嬫椂闂达紙鑻ヤ负null鍒欑珛鍗崇敓鏁堬級
                    .startAt(task.getNextExecutionTime() != null
                            ? Date.from(task.getNextExecutionTime().atZone(ZoneId.systemDefault()).toInstant())
                            : new Date())
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 951b13b..602eddc 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.device.mapper.MaintenanceTaskMapper;
@@ -47,8 +48,8 @@
             if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) {
                 queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName());
             }
-            if (StringUtils.isNotEmpty(maintenanceTask.getStatus())) {
-                queryWrapper.eq(MaintenanceTask::getStatus, maintenanceTask.getStatus());
+            if (maintenanceTask.getIsActive() != null) {
+                queryWrapper.eq(MaintenanceTask::getIsActive, maintenanceTask.getIsActive());
             }
         }
         queryWrapper.orderByDesc(MaintenanceTask::getCreateTime);
@@ -90,15 +91,20 @@
 
     @Override
     public AjaxResult add(MaintenanceTask maintenanceTask) {
-        maintenanceTask.setActive(true);
-        // 璁$畻棣栨鎵ц鏃堕棿
-        TimingTask task = new TimingTask();
-        task.setFrequencyType(maintenanceTask.getFrequencyType());
-        task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
-        LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
-        maintenanceTask.setNextExecutionTime(firstExecutionTime);
+        if (maintenanceTask == null){
+            throw new ServiceException("鏂板澶辫触,鏁版嵁涓嶈兘涓虹┖");
+        }
+        // 鍙湁鍚敤鐘舵�佹墠娣诲姞
+        if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
+            // 璁$畻棣栨鎵ц鏃堕棿
+            TimingTask task = new TimingTask();
+            task.setFrequencyType(maintenanceTask.getFrequencyType());
+            task.setFrequencyDetail(maintenanceTask.getFrequencyDetail());
+            LocalDateTime firstExecutionTime = timingTaskService.calculateFirstExecutionTime(task);
+            maintenanceTask.setNextExecutionTime(firstExecutionTime);
+        }
         int insert = maintenanceTaskMapper.insert(maintenanceTask);
-        if (insert > 0) {
+        if (insert > 0 && maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) {
             maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
         }
         return AjaxResult.success("娣诲姞鎴愬姛");
@@ -110,10 +116,23 @@
         if (maintenanceTask1 == null) {
             return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
         }
+
+        Integer oldIsActive = maintenanceTask1.getIsActive();
+        Integer newIsActive = maintenanceTask.getIsActive();
+
         BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
         int update = maintenanceTaskMapper.updateById(maintenanceTask1);
         if (update > 0) {
-            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            // 鏍规嵁isActive鐘舵�佸彉鍖栨潵澶勭悊浠诲姟
+            if (oldIsActive != null && oldIsActive == 1 && newIsActive != null && newIsActive == 0) {
+                // 浠庡惎鐢ㄥ彉涓哄仠鐢紝绉婚櫎浠诲姟
+                maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask.getId());
+            } else if ((oldIsActive == null || oldIsActive == 0) && newIsActive != null && newIsActive == 1) {
+                // 浠庡仠鐢ㄥ彉涓哄惎鐢紝娣诲姞
+                maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1);
+            } else {
+                maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            }
         }
         return AjaxResult.success("鏇存柊鎴愬姛");
     }

--
Gitblit v1.9.3