gongchunyi
2026-05-18 089964a497c2528e88ddc610af5f88f631303431
feat: 设备保养新增任务状态,启动/停止与调度器关联
已修改3个文件
62 ■■■■■ 文件已修改
src/main/java/com/ruoyi/device/pojo/MaintenanceTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskScheduler.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 = "备注")
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())                       // 关联对应的Job
                   .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())
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("更新成功");
    }