云
2026-10-27 0a4d548b6bf9cfef252400fb6d6612e45cf5b602
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("删除成功");
    }
}