From a2d3c6f8d43fbf9daa372fea53acf50642094de4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 16 五月 2026 10:49:06 +0800
Subject: [PATCH] feat(task): 添加定时任务启用禁用功能

---
 src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java |  202 ++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 178 insertions(+), 24 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 0c00da7..30122c3 100644
--- a/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -2,9 +2,14 @@
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.device.mapper.DeviceAreaMapper;
 import com.ruoyi.device.mapper.MaintenanceTaskMapper;
+import com.ruoyi.device.pojo.DeviceArea;
+import com.ruoyi.device.pojo.DeviceLedger;
 import com.ruoyi.device.pojo.MaintenanceTask;
+import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.MaintenanceTaskService;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.inspectiontask.pojo.TimingTask;
@@ -12,16 +17,21 @@
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
-/**
- * @author :yys
- * @date : 2025/12/22 14:57
- */
 @Service
 @Slf4j
 public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService {
@@ -38,65 +48,126 @@
     @Autowired
     private MaintenanceTaskScheduler maintenanceTaskScheduler;
 
+    @Autowired
+    private IDeviceLedgerService deviceLedgerService;
+
+    @Autowired
+    private DeviceAreaMapper deviceAreaMapper;
+
     @Override
     public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
-        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
-        // 2. 濡傛灉娌℃湁鏁版嵁锛岀洿鎺ヨ繑鍥炵┖鍒嗛〉
+        com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<MaintenanceTask> queryWrapper =
+                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>();
+        if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) {
+            queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName());
+        }
+        if (maintenanceTask.getAreaId() != null) {
+            queryWrapper.eq(MaintenanceTask::getAreaId, maintenanceTask.getAreaId());
+        }
+        if (maintenanceTask.getIsEnabled() != null) {
+            queryWrapper.eq(MaintenanceTask::getIsEnabled, maintenanceTask.getIsEnabled());
+        }
+
+        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper);
         if (taskPage.getRecords().isEmpty()) {
             return AjaxResult.success(taskPage);
         }
 
-        // 3. 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑鐢ㄦ埛ID
         Set<Long> userIds = new HashSet<>();
-
-        // 鏀堕泦鐧昏浜篒D
         taskPage.getRecords().forEach(task -> {
             if (task.getRegistrantId() != null) {
                 userIds.add(task.getRegistrantId());
             }
         });
 
-        // 4. 鎵归噺鏌ヨ鐢ㄦ埛淇℃伅
         Map<Long, String> userNickNameMap = new HashMap<>();
         if (!userIds.isEmpty()) {
-            List<SysUser> users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds)));
+            List<SysUser> users = sysUserMapper.selectUserByIds(new ArrayList<>(userIds));
             users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
         }
+
+        Map<Long, String> areaNameMap = deviceAreaMapper.selectBatchIds(taskPage.getRecords().stream()
+                        .map(MaintenanceTask::getAreaId)
+                        .filter(java.util.Objects::nonNull)
+                        .distinct()
+                        .collect(Collectors.toList()))
+                .stream()
+                .collect(Collectors.toMap(DeviceArea::getId, DeviceArea::getAreaName, (left, right) -> left, HashMap::new));
+
         taskPage.getRecords().forEach(task -> {
-            // 璁剧疆鐧昏浜烘樀绉�
             if (task.getRegistrantId() != null) {
                 task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "鏈煡鐢ㄦ埛"));
             }
+            task.setAreaName(areaNameMap.get(task.getAreaId()));
         });
         return AjaxResult.success(taskPage);
     }
 
     @Override
+    @Transactional
     public AjaxResult add(MaintenanceTask maintenanceTask) {
-        maintenanceTask.setActive(true);
-        // 璁$畻棣栨鎵ц鏃堕棿
+        if (!prepareMaintenanceTask(maintenanceTask)) {
+            return AjaxResult.error("璇烽�夋嫨璁惧");
+        }
+        if (maintenanceTask.getIsEnabled() == null) {
+            maintenanceTask.setIsEnabled(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) {
-            maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask);
+            AjaxResult schedulerResult = resetSchedulerStatus(maintenanceTask);
+            if (schedulerResult.isError()) {
+                return schedulerResult;
+            }
         }
         return AjaxResult.success("娣诲姞鎴愬姛");
     }
 
     @Override
+    @Transactional
     public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
-        MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
-        if (maintenanceTask1 == null) {
+        if (maintenanceTask.getId() == null) {
+            return AjaxResult.error("id涓嶈兘涓虹┖");
+        }
+
+        MaintenanceTask currentTask = maintenanceTaskMapper.selectById(maintenanceTask.getId());
+        if (currentTask == null) {
             return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
         }
-        BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
-        int update = maintenanceTaskMapper.updateById(maintenanceTask1);
+
+        Integer oldEnabled = currentTask.getIsEnabled();
+        LocalDateTime oldNextExecutionTime = currentTask.getNextExecutionTime();
+        BeanUtils.copyProperties(maintenanceTask, currentTask);
+        if (maintenanceTask.getIsEnabled() == null) {
+            currentTask.setIsEnabled(oldEnabled);
+        }
+        if (maintenanceTask.getNextExecutionTime() == null) {
+            currentTask.setNextExecutionTime(oldNextExecutionTime);
+        }
+        if (!prepareMaintenanceTask(currentTask)) {
+            return AjaxResult.error("璇烽�夋嫨璁惧");
+        }
+
+        currentTask.setDeviceLedgerIds(null);
+        if (currentTask.getNextExecutionTime() == null) {
+            TimingTask task = new TimingTask();
+            task.setFrequencyType(currentTask.getFrequencyType());
+            task.setFrequencyDetail(currentTask.getFrequencyDetail());
+            currentTask.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(task));
+        }
+
+        int update = maintenanceTaskMapper.updateById(currentTask);
         if (update > 0) {
-            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
+            AjaxResult schedulerResult = resetSchedulerStatus(currentTask);
+            if (schedulerResult.isError()) {
+                return schedulerResult;
+            }
         }
         return AjaxResult.success("鏇存柊鎴愬姛");
     }
@@ -105,10 +176,93 @@
     public AjaxResult delete(List<Long> ids) {
         int delete = maintenanceTaskMapper.deleteBatchIds(ids);
         if (delete > 0) {
-            ids.forEach(id -> {
-                maintenanceTaskScheduler.unscheduleMaintenanceTask(id);
-            });
+            ids.forEach(id -> maintenanceTaskScheduler.unscheduleMaintenanceTask(id));
         }
         return AjaxResult.success("鍒犻櫎鎴愬姛");
     }
+
+    @Override
+    @Transactional
+    public AjaxResult changeEnable(Long taskId, Integer isEnabled) {
+        if (taskId == null || isEnabled == null) {
+            return AjaxResult.error("id鍜宨sEnabled涓嶈兘涓虹┖");
+        }
+
+        MaintenanceTask task = maintenanceTaskMapper.selectById(taskId);
+        if (task == null) {
+            return AjaxResult.warn("娌℃湁姝ゆ暟鎹�");
+        }
+        task.setIsEnabled(isEnabled);
+        if (task.getNextExecutionTime() == null) {
+            TimingTask timingTask = new TimingTask();
+            timingTask.setFrequencyType(task.getFrequencyType());
+            timingTask.setFrequencyDetail(task.getFrequencyDetail());
+            task.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(timingTask));
+        }
+
+        int update = maintenanceTaskMapper.updateById(task);
+        if (update > 0) {
+            AjaxResult schedulerResult = resetSchedulerStatus(task);
+            if (schedulerResult.isError()) {
+                return schedulerResult;
+            }
+        }
+        return AjaxResult.success("鏇存柊鎴愬姛");
+    }
+
+    private AjaxResult resetSchedulerStatus(MaintenanceTask task) {
+        try {
+            maintenanceTaskScheduler.rescheduleMaintenanceTask(task);
+            if (isTaskEnabled(task.getIsEnabled())) {
+                maintenanceTaskScheduler.resumeMaintenanceTask(task.getId());
+            } else {
+                maintenanceTaskScheduler.pauseMaintenanceTask(task.getId());
+            }
+            return AjaxResult.success();
+        } catch (SchedulerException e) {
+            log.error("resetSchedulerStatus error, taskId={}", task.getId(), e);
+            return AjaxResult.error("鏇存柊璋冨害鐘舵�佸け璐�");
+        } catch (RuntimeException e) {
+            log.error("resetSchedulerStatus runtime error, taskId={}", task.getId(), e);
+            return AjaxResult.error("鏇存柊璋冨害鐘舵�佸け璐�");
+        }
+    }
+
+    private boolean isTaskEnabled(Integer isEnabled) {
+        return isEnabled == null || isEnabled == 1;
+    }
+
+    private boolean prepareMaintenanceTask(MaintenanceTask task) {
+        Long[] deviceIds = task.getDeviceLedgerIds();
+        if ((deviceIds == null || deviceIds.length == 0) && StringUtils.isNotEmpty(task.getDeviceLedgerIdsStr())) {
+            deviceIds = Arrays.stream(task.getDeviceLedgerIdsStr().split(","))
+                    .filter(StringUtils::isNotEmpty)
+                    .map(Long::valueOf)
+                    .toArray(Long[]::new);
+        }
+        if (deviceIds == null || deviceIds.length == 0) {
+            deviceIds = task.getTaskId() == null ? new Long[0] : new Long[]{task.getTaskId()};
+        }
+        List<Long> validIds = Arrays.stream(deviceIds).distinct().collect(Collectors.toList());
+        if (validIds.isEmpty()) {
+            return false;
+        }
+
+        List<DeviceLedger> devices = validIds.stream()
+                .map(deviceLedgerService::getById)
+                .filter(device -> device != null)
+                .collect(Collectors.toList());
+        if (devices.isEmpty()) {
+            return false;
+        }
+
+        task.setTaskId(devices.get(0).getId());
+        if (task.getAreaId() == null) {
+            task.setAreaId(devices.get(0).getAreaId());
+        }
+        task.setDeviceLedgerIdsStr(devices.stream().map(item -> String.valueOf(item.getId())).collect(Collectors.joining(",")));
+        task.setTaskName(devices.stream().map(DeviceLedger::getDeviceName).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(",")));
+        task.setDeviceModel(devices.stream().map(DeviceLedger::getDeviceModel).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(",")));
+        return true;
+    }
 }

--
Gitblit v1.9.3