| | |
| | | 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; |
| | |
| | | |
| | | @Autowired |
| | | private MaintenanceTaskMapper maintenanceTaskMapper; |
| | | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | @Autowired |
| | | private TimingTaskServiceImpl timingTaskService; |
| | | |
| | | @Autowired |
| | | private MaintenanceTaskScheduler maintenanceTaskScheduler; |
| | | |
| | | @Autowired |
| | | private IDeviceLedgerService deviceLedgerService; |
| | | |
| | | @Autowired |
| | | private DeviceAreaMapper deviceAreaMapper; |
| | | |
| | |
| | | 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); |
| | |
| | | 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) |
| | |
| | | .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(), "未知用户")); |
| | |
| | | } |
| | | |
| | | @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("更新成功"); |
| | | } |
| | |
| | | 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) { |
| | |
| | | if (validIds.isEmpty()) { |
| | | return false; |
| | | } |
| | | |
| | | List<DeviceLedger> devices = validIds.stream() |
| | | .map(deviceLedgerService::getById) |
| | | .filter(device -> device != null) |
| | |
| | | if (devices.isEmpty()) { |
| | | return false; |
| | | } |
| | | |
| | | task.setTaskId(devices.get(0).getId()); |
| | | if (task.getAreaId() == null) { |
| | | task.setAreaId(devices.get(0).getAreaId()); |