package com.ruoyi.device.service.impl; 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 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; @Override public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { Page taskPage = maintenanceTaskMapper.selectPage(page, null); // 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) { // 计算首次执行时间 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) { // 只有当 isActive 为 1 时才添加到定时任务调度器 if (maintenanceTask.getIsActive() != null && maintenanceTask.getIsActive() == 1) { maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask); } } return AjaxResult.success("添加成功"); } @Override public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) { MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId()); if (maintenanceTask1 == null) { return AjaxResult.warn("没有此数据"); } // 保存旧的 isActive 状态 Integer oldIsActive = maintenanceTask1.getIsActive(); Integer newIsActive = maintenanceTask.getIsActive(); BeanUtils.copyProperties(maintenanceTask, maintenanceTask1); int update = maintenanceTaskMapper.updateById(maintenanceTask1); if (update > 0) { // 处理 isActive 状态变化 if (newIsActive != null && newIsActive == 1) { // 新状态为启用:添加到定时任务调度器 if (oldIsActive == null || oldIsActive != 1) { // 从未启用变为启用,添加到调度器 maintenanceTaskScheduler.scheduleMaintenanceTask(maintenanceTask1); } else { // 已经启用,更新调度器中的任务 maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1); } } else { // 新状态为停用:从定时任务调度器中移除 if (oldIsActive != null && oldIsActive == 1) { maintenanceTaskScheduler.unscheduleMaintenanceTask(maintenanceTask1.getId()); } } } return AjaxResult.success("更新成功"); } @Override public AjaxResult delete(List ids) { // 先从定时任务调度器中移除所有待删除的任务 ids.forEach(id -> { try { maintenanceTaskScheduler.unscheduleMaintenanceTask(id); } catch (Exception e) { log.error("删除定时任务调度失败, id: {}", id, e); } }); // 再从数据库中删除记录 int delete = maintenanceTaskMapper.deleteBatchIds(ids); if (delete > 0) { return AjaxResult.success("删除成功"); } return AjaxResult.error("删除失败"); } }