package com.ruoyi.inspectiontask.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; 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.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.inspectiontask.dto.InspectionTaskDto; import com.ruoyi.inspectiontask.mapper.InspectionTaskMapper; import com.ruoyi.inspectiontask.pojo.InspectionTask; import com.ruoyi.inspectiontask.service.InspectionTaskService; 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 org.springframework.transaction.annotation.Transactional; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; /** * @author :yys * @date : 2025/9/19 10:54 */ @Service @Slf4j @RequiredArgsConstructor public class InspectionTaskServiceImpl extends ServiceImpl implements InspectionTaskService { private final InspectionTaskMapper inspectionTaskMapper; private final SysUserMapper sysUserMapper; private final FileUtil fileUtil; @Override public IPage selectInspectionTaskList(Page page, InspectionTaskDto inspectionTaskDto) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(InspectionTask::getCreateTime); if (StringUtils.isNotBlank(inspectionTaskDto.getTaskName())) { queryWrapper.like(InspectionTask::getTaskName, inspectionTaskDto.getTaskName()); } IPage entityPage = inspectionTaskMapper.selectPage(page, queryWrapper); // 无数据提前返回 if (CollectionUtils.isEmpty(entityPage.getRecords())) { return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); } // 获取id集合 List ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList()); //登记人ids List registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList()); // 批量查询登记人 Map sysUserMap; if (!registrantIds.isEmpty()) { List sysUsers = sysUserMapper.selectUsersByIds(registrantIds); sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); } else { sysUserMap = new HashMap<>(); } //巡检人ids List inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList()); //获取所有不重复的用户ID Set allUserIds = entityPage.getRecords().stream() .map(InspectionTask::getInspectorId) // 获取"2,3"这样的字符串 .filter(StringUtils::isNotBlank) .flatMap(idsStr -> Arrays.stream(idsStr.split(","))) .map(idStr -> { try { return Long.parseLong(idStr.trim()); } catch (NumberFormatException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toSet()); // 使用SQL批量查询用户信息 Map userIdToNameMap = allUserIds.isEmpty() ? Collections.emptyMap() : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)) .stream() .collect(Collectors.toMap( SysUser::getUserId, SysUser::getNickName, (existing, replacement) -> existing)); List dtoList = entityPage.getRecords().stream().map(inspectionTask -> { InspectionTaskDto dto = new InspectionTaskDto(); BeanUtils.copyProperties(inspectionTask, dto); // 复制主对象属性 // 设置登记人 SysUser sysUser = sysUserMap.get(inspectionTask.getRegistrantId()); if (sysUser != null) { dto.setRegistrant(sysUser.getNickName()); } // 处理巡检人名称 if (StringUtils.isNotBlank(inspectionTask.getInspectorId())) { String inspectorNames = Arrays.stream(inspectionTask.getInspectorId().split(",")) .map(String::trim) .map(idStr -> { try { Long userId = Long.parseLong(idStr); return userIdToNameMap.getOrDefault(userId, "未知用户(" + idStr + ")"); } catch (NumberFormatException e) { return "无效ID(" + idStr + ")"; } }) .collect(Collectors.joining(",")); dto.setInspector(inspectorNames); } dto.setDateStr(inspectionTask.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); // 初始化三个附件列表 dto.setCommonFileListVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListAfterVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); dto.setCommonFileListBeforeVO(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId())); return dto; }).collect(Collectors.toList()); // 7. 构建返回分页对象 IPage resultPage = new Page<>(); BeanUtils.copyProperties(entityPage, resultPage); resultPage.setRecords(dtoList); return resultPage; } @Override @Transactional(rollbackFor = Exception.class) public int addOrEditInspectionTask(InspectionTaskDto inspectionTaskDto) { InspectionTask inspectionTask = new InspectionTask(); BeanUtils.copyProperties(inspectionTaskDto, inspectionTask); inspectionTask.setRegistrantId(SecurityUtils.getLoginUser().getUserId()); inspectionTask.setRegistrant(SecurityUtils.getLoginUser().getUsername()); int i; if (Objects.isNull(inspectionTaskDto.getId())) { i = inspectionTaskMapper.insert(inspectionTask); } else { i = inspectionTaskMapper.updateById(inspectionTask); } // 保存文件 fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListDTO()); fileUtil.saveStorageAttachment(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListAfterDTO()); fileUtil.saveStorageAttachment(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, inspectionTask.getId(), inspectionTaskDto.getCommonFileListBeforeDTO()); return i; } @Override @Transactional(rollbackFor = Exception.class) public int delByIds(Long[] ids) { // 检查参数 if (ids == null || ids.length == 0) { return 0; } // 删除文件 fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.AFTER_FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds(ApplicationTypeEnum.BEFORE_FILE, RecordTypeEnum.INSPECTION_TASK, Arrays.asList(ids)); return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids)); } }