云
2026-10-27 0a4d548b6bf9cfef252400fb6d6612e45cf5b602
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -12,6 +12,7 @@
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;
@@ -32,6 +33,36 @@
    private final SysUserMapper sysUserMapper;
    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 AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) {
@@ -88,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) {
            if (maintenanceTask1.isActive()) {
            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
            } else {
                maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId());
            }
        }
        return AjaxResult.success("更新成功");
    }