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.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.device.mapper.DeviceAreaMapper; import com.ruoyi.device.mapper.MaintenanceTaskMapper; import com.ruoyi.device.pojo.DeviceArea; import com.ruoyi.device.pojo.DeviceLedger; import com.ruoyi.device.pojo.MaintenanceTask; import com.ruoyi.device.service.IDeviceLedgerService; 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.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @Service @Slf4j public class MaintenanceTaskServiceImpl extends ServiceImpl implements MaintenanceTaskService { @Autowired private MaintenanceTaskMapper maintenanceTaskMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private TimingTaskServiceImpl timingTaskService; @Autowired private MaintenanceTaskScheduler maintenanceTaskScheduler; @Autowired private IDeviceLedgerService deviceLedgerService; @Autowired private DeviceAreaMapper deviceAreaMapper; @Override public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper queryWrapper = new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<>(); if (StringUtils.isNotEmpty(maintenanceTask.getTaskName())) { queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName()); } if (maintenanceTask.getAreaId() != null) { queryWrapper.eq(MaintenanceTask::getAreaId, maintenanceTask.getAreaId()); } Page taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper); if (taskPage.getRecords().isEmpty()) { return AjaxResult.success(taskPage); } Set userIds = new HashSet<>(); taskPage.getRecords().forEach(task -> { if (task.getRegistrantId() != null) { userIds.add(task.getRegistrantId()); } }); Map userNickNameMap = new HashMap<>(); if (!userIds.isEmpty()) { List users = sysUserMapper.selectUserByIds(new ArrayList<>(userIds)); users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); } Map areaNameMap = deviceAreaMapper.selectBatchIds(taskPage.getRecords().stream() .map(MaintenanceTask::getAreaId) .filter(java.util.Objects::nonNull) .distinct() .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(), "未知用户")); } task.setAreaName(areaNameMap.get(task.getAreaId())); }); return AjaxResult.success(taskPage); } @Override public AjaxResult add(MaintenanceTask maintenanceTask) { if (!prepareMaintenanceTask(maintenanceTask)) { return AjaxResult.error("请选择设备"); } 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("没有此数据"); } BeanUtils.copyProperties(maintenanceTask, maintenanceTask1); if (!prepareMaintenanceTask(maintenanceTask1)) { return AjaxResult.error("请选择设备"); } maintenanceTask1.setDeviceLedgerIds(null); int update = maintenanceTaskMapper.updateById(maintenanceTask1); if (update > 0) { maintenanceTaskScheduler.rescheduleMaintenanceTask(maintenanceTask1); } 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("删除成功"); } private boolean prepareMaintenanceTask(MaintenanceTask task) { Long[] deviceIds = task.getDeviceLedgerIds(); if ((deviceIds == null || deviceIds.length == 0) && StringUtils.isNotEmpty(task.getDeviceLedgerIdsStr())) { deviceIds = Arrays.stream(task.getDeviceLedgerIdsStr().split(",")) .filter(StringUtils::isNotEmpty) .map(Long::valueOf) .toArray(Long[]::new); } if (deviceIds == null || deviceIds.length == 0) { deviceIds = task.getTaskId() == null ? new Long[0] : new Long[]{task.getTaskId()}; } List validIds = Arrays.stream(deviceIds).distinct().collect(Collectors.toList()); if (validIds.isEmpty()) { return false; } List devices = validIds.stream() .map(deviceLedgerService::getById) .filter(device -> device != null) .collect(Collectors.toList()); if (devices.isEmpty()) { return false; } task.setTaskId(devices.get(0).getId()); if (task.getAreaId() == null) { task.setAreaId(devices.get(0).getAreaId()); } task.setDeviceLedgerIdsStr(devices.stream().map(item -> String.valueOf(item.getId())).collect(Collectors.joining(","))); task.setTaskName(devices.stream().map(DeviceLedger::getDeviceName).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(","))); task.setDeviceModel(devices.stream().map(DeviceLedger::getDeviceModel).filter(StringUtils::isNotEmpty).distinct().collect(Collectors.joining(","))); return true; } }