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.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; import java.time.LocalDateTime; import java.util.*; /** * @author :yys * @date : 2025/12/22 14:57 */ @Service @Slf4j @RequiredArgsConstructor public class MaintenanceTaskServiceImpl extends ServiceImpl implements MaintenanceTaskService { private final MaintenanceTaskMapper maintenanceTaskMapper; private final SysUserMapper sysUserMapper; private final TimingTaskServiceImpl timingTaskService; private final MaintenanceTaskScheduler maintenanceTaskScheduler; /** * 启动时把已启用但未注册到 Quartz 的保养任务补注册, * 避免调度记录丢失后定时任务静默不执行 */ @PostConstruct public void restoreScheduledTasks() { try { List tasks = maintenanceTaskMapper.selectList(new QueryWrapper() .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 taskPage = maintenanceTaskMapper.selectPage(page, new QueryWrapper().orderByDesc("create_time")); // 2. 如果没有数据,直接返回空分页 if (taskPage.getRecords().isEmpty()) { return AjaxResult.success(taskPage); } // 3. 收集所有需要查询的用户ID Set userIds = new HashSet<>(); // 收集登记人ID taskPage.getRecords().forEach(task -> { if (task.getRegistrantId() != null) { userIds.add(task.getRegistrantId()); } }); // 4. 批量查询用户信息 Map userNickNameMap = new HashMap<>(); if (!userIds.isEmpty()) { List users = sysUserMapper.selectUserByIds((new ArrayList<>(userIds))); users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); } taskPage.getRecords().forEach(task -> { // 设置登记人昵称 if (task.getRegistrantId() != null) { task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "未知用户")); } }); return AjaxResult.success(taskPage); } @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); int insert = maintenanceTaskMapper.insert(maintenanceTask); if (insert > 0) { maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask); } return AjaxResult.success("添加成功"); } @Override public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) { MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId()); 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("更新成功"); } @Override public AjaxResult delete(List ids) { int delete = maintenanceTaskMapper.deleteBatchIds(ids); if (delete > 0) { ids.forEach(id -> { maintenanceTaskScheduler.unscheduleMaintenanceTask(id); }); } return AjaxResult.success("删除成功"); } }