云
2026-10-27 0a4d548b6bf9cfef252400fb6d6612e45cf5b602
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -1,5 +1,6 @@
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;
@@ -11,8 +12,9 @@
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
@@ -24,23 +26,47 @@
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class MaintenanceTaskServiceImpl extends ServiceImpl<MaintenanceTaskMapper, MaintenanceTask> implements MaintenanceTaskService {
    @Autowired
    private MaintenanceTaskMapper maintenanceTaskMapper;
    private final MaintenanceTaskMapper maintenanceTaskMapper;
    private final SysUserMapper sysUserMapper;
    private final TimingTaskServiceImpl timingTaskService;
    private final MaintenanceTaskScheduler maintenanceTaskScheduler;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TimingTaskServiceImpl timingTaskService;
    @Autowired
    private 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 AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, null);
        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, new QueryWrapper<MaintenanceTask>().orderByDesc("create_time"));
        // 2. 如果没有数据,直接返回空分页
        if (taskPage.getRecords().isEmpty()) {
            return AjaxResult.success(taskPage);
@@ -93,10 +119,23 @@
        if (maintenanceTask1 == null) {
            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 AjaxResult.success("更新成功");
    }