package com.ruoyi.device.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.DeviceLedgerMapper; import com.ruoyi.device.mapper.MaintenanceTaskMapper; import com.ruoyi.device.pojo.DeviceLedger; 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.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/12/22 14:57 */ @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 DeviceLedgerMapper deviceLedgerMapper; @Override public AjaxResult listPage(Page page, MaintenanceTask maintenanceTask) { // 查询 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (maintenanceTask.getTaskName() != null) { queryWrapper.like(MaintenanceTask::getTaskName, maintenanceTask.getTaskName()); } Page taskPage = maintenanceTaskMapper.selectPage(page, queryWrapper); if (taskPage.getRecords().isEmpty()) { return AjaxResult.success(taskPage); } //收集所有需要查询的ID Set userIds = new HashSet<>(); Set allDeviceIds = new HashSet<>(); //设备ID列表 Map> taskDeviceIdMap = new HashMap<>(); // 遍历任务,收集登记人ID和设备ID for (MaintenanceTask task : taskPage.getRecords()) { // 收集登记人ID if (task.getRegistrantId() != null) { userIds.add(task.getRegistrantId()); } // 收集设备ID并解析 if (StringUtils.isNotEmpty(task.getDeviceIds())) { try { List deviceIds = JSON.parseArray(task.getDeviceIds(), Long.class); if (CollectionUtils.isNotEmpty(deviceIds)) { allDeviceIds.addAll(deviceIds); taskDeviceIdMap.put(task.getId(), deviceIds); } } catch (Exception e) { log.error("解析设备ID列表失败: taskId={}, deviceIds={}", task.getId(), task.getDeviceIds(), e); } } } // 4. 批量查询用户信息 Map userNickNameMap = new HashMap<>(); if (!userIds.isEmpty()) { List users = sysUserMapper.selectUserByIds(new ArrayList<>(userIds)); if (CollectionUtils.isNotEmpty(users)) { users.forEach(user -> userNickNameMap.put(user.getUserId(), user.getNickName())); } } // 5. 批量查询设备信息 Map deviceNameMap = new HashMap<>(); if (!allDeviceIds.isEmpty()) { List devices = deviceLedgerMapper.selectBatchIds(new ArrayList<>(allDeviceIds)); if (CollectionUtils.isNotEmpty(devices)) { devices.forEach(device -> deviceNameMap.put(device.getId(), device.getDeviceName())); } } // 6. 设置返回结果 for (MaintenanceTask task : taskPage.getRecords()) { // 设置登记人昵称 if (task.getRegistrantId() != null) { task.setRegistrant(userNickNameMap.getOrDefault(task.getRegistrantId(), "未知用户")); } // 设置设备名称 List deviceIds = taskDeviceIdMap.get(task.getId()); if (CollectionUtils.isNotEmpty(deviceIds)) { List deviceNames = deviceIds.stream() .map(id -> deviceNameMap.getOrDefault(id, "未知设备")) .collect(Collectors.toList()); task.setDeviceName(String.join(", ", deviceNames)); } else { task.setDeviceName("无设备"); } } 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("没有此数据"); } BeanUtils.copyProperties(maintenanceTask, maintenanceTask1); 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("删除成功"); } }