2026-05-16 a2d3c6f8d43fbf9daa372fea53acf50642094de4
src/main/java/com/ruoyi/device/service/impl/MaintenanceTaskServiceImpl.java
@@ -17,8 +17,10 @@
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
@@ -36,14 +38,19 @@
    @Autowired
    private MaintenanceTaskMapper maintenanceTaskMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TimingTaskServiceImpl timingTaskService;
    @Autowired
    private MaintenanceTaskScheduler maintenanceTaskScheduler;
    @Autowired
    private IDeviceLedgerService deviceLedgerService;
    @Autowired
    private DeviceAreaMapper deviceAreaMapper;
@@ -57,6 +64,10 @@
        if (maintenanceTask.getAreaId() != null) {
            queryWrapper.eq(MaintenanceTask::getAreaId, maintenanceTask.getAreaId());
        }
        if (maintenanceTask.getIsEnabled() != null) {
            queryWrapper.eq(MaintenanceTask::getIsEnabled, maintenanceTask.getIsEnabled());
        }
        Page<MaintenanceTask> taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper);
        if (taskPage.getRecords().isEmpty()) {
            return AjaxResult.success(taskPage);
@@ -74,6 +85,7 @@
            List<SysUser> users = sysUserMapper.selectUserByIds(new ArrayList<>(userIds));
            users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName()));
        }
        Map<Long, String> areaNameMap = deviceAreaMapper.selectBatchIds(taskPage.getRecords().stream()
                        .map(MaintenanceTask::getAreaId)
                        .filter(java.util.Objects::nonNull)
@@ -81,6 +93,7 @@
                        .collect(Collectors.toList()))
                .stream()
                .collect(Collectors.toMap(DeviceArea::getId, DeviceArea::getAreaName, (left, right) -> left, HashMap::new));
        taskPage.getRecords().forEach(task -> {
            if (task.getRegistrantId() != null) {
                task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "未知用户"));
@@ -91,37 +104,70 @@
    }
    @Override
    @Transactional
    public AjaxResult add(MaintenanceTask maintenanceTask) {
        if (!prepareMaintenanceTask(maintenanceTask)) {
            return AjaxResult.error("请选择设备");
        }
        maintenanceTask.setActive(true);
        if (maintenanceTask.getIsEnabled() == null) {
            maintenanceTask.setIsEnabled(1);
        }
        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);
            AjaxResult schedulerResult = resetSchedulerStatus(maintenanceTask);
            if (schedulerResult.isError()) {
                return schedulerResult;
            }
        }
        return AjaxResult.success("添加成功");
    }
    @Override
    @Transactional
    public AjaxResult updateByMaintenanceTaskId(MaintenanceTask maintenanceTask) {
        MaintenanceTask maintenanceTask1 = maintenanceTaskMapper.selectById(maintenanceTask.getId());
        if (maintenanceTask1 == null) {
        if (maintenanceTask.getId() == null) {
            return AjaxResult.error("id不能为空");
        }
        MaintenanceTask currentTask = maintenanceTaskMapper.selectById(maintenanceTask.getId());
        if (currentTask == null) {
            return AjaxResult.warn("没有此数据");
        }
        BeanUtils.copyProperties(maintenanceTask, maintenanceTask1);
        if (!prepareMaintenanceTask(maintenanceTask1)) {
        Integer oldEnabled = currentTask.getIsEnabled();
        LocalDateTime oldNextExecutionTime = currentTask.getNextExecutionTime();
        BeanUtils.copyProperties(maintenanceTask, currentTask);
        if (maintenanceTask.getIsEnabled() == null) {
            currentTask.setIsEnabled(oldEnabled);
        }
        if (maintenanceTask.getNextExecutionTime() == null) {
            currentTask.setNextExecutionTime(oldNextExecutionTime);
        }
        if (!prepareMaintenanceTask(currentTask)) {
            return AjaxResult.error("请选择设备");
        }
        maintenanceTask1.setDeviceLedgerIds(null);
        int update = maintenanceTaskMapper.updateById(maintenanceTask1);
        currentTask.setDeviceLedgerIds(null);
        if (currentTask.getNextExecutionTime() == null) {
            TimingTask task = new TimingTask();
            task.setFrequencyType(currentTask.getFrequencyType());
            task.setFrequencyDetail(currentTask.getFrequencyDetail());
            currentTask.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(task));
        }
        int update = maintenanceTaskMapper.updateById(currentTask);
        if (update > 0) {
            maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1);
            AjaxResult schedulerResult = resetSchedulerStatus(currentTask);
            if (schedulerResult.isError()) {
                return schedulerResult;
            }
        }
        return AjaxResult.success("更新成功");
    }
@@ -133,6 +179,57 @@
            ids.forEach(id -> maintenanceTaskScheduler.unscheduleMaintenanceTask(id));
        }
        return AjaxResult.success("删除成功");
    }
    @Override
    @Transactional
    public AjaxResult changeEnable(Long taskId, Integer isEnabled) {
        if (taskId == null || isEnabled == null) {
            return AjaxResult.error("id和isEnabled不能为空");
        }
        MaintenanceTask task = maintenanceTaskMapper.selectById(taskId);
        if (task == null) {
            return AjaxResult.warn("没有此数据");
        }
        task.setIsEnabled(isEnabled);
        if (task.getNextExecutionTime() == null) {
            TimingTask timingTask = new TimingTask();
            timingTask.setFrequencyType(task.getFrequencyType());
            timingTask.setFrequencyDetail(task.getFrequencyDetail());
            task.setNextExecutionTime(timingTaskService.calculateFirstExecutionTime(timingTask));
        }
        int update = maintenanceTaskMapper.updateById(task);
        if (update > 0) {
            AjaxResult schedulerResult = resetSchedulerStatus(task);
            if (schedulerResult.isError()) {
                return schedulerResult;
            }
        }
        return AjaxResult.success("更新成功");
    }
    private AjaxResult resetSchedulerStatus(MaintenanceTask task) {
        try {
            maintenanceTaskScheduler.rescheduleMaintenanceTask(task);
            if (isTaskEnabled(task.getIsEnabled())) {
                maintenanceTaskScheduler.resumeMaintenanceTask(task.getId());
            } else {
                maintenanceTaskScheduler.pauseMaintenanceTask(task.getId());
            }
            return AjaxResult.success();
        } catch (SchedulerException e) {
            log.error("resetSchedulerStatus error, taskId={}", task.getId(), e);
            return AjaxResult.error("更新调度状态失败");
        } catch (RuntimeException e) {
            log.error("resetSchedulerStatus runtime error, taskId={}", task.getId(), e);
            return AjaxResult.error("更新调度状态失败");
        }
    }
    private boolean isTaskEnabled(Integer isEnabled) {
        return isEnabled == null || isEnabled == 1;
    }
    private boolean prepareMaintenanceTask(MaintenanceTask task) {
@@ -150,6 +247,7 @@
        if (validIds.isEmpty()) {
            return false;
        }
        List<DeviceLedger> devices = validIds.stream()
                .map(deviceLedgerService::getById)
                .filter(device -> device != null)
@@ -157,6 +255,7 @@
        if (devices.isEmpty()) {
            return false;
        }
        task.setTaskId(devices.get(0).getId());
        if (task.getAreaId() == null) {
            task.setAreaId(devices.get(0).getAreaId());