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.dto.StorageBlobDTO; 
 | 
import com.ruoyi.basic.mapper.StorageAttachmentMapper; 
 | 
import com.ruoyi.basic.mapper.StorageBlobMapper; 
 | 
import com.ruoyi.basic.pojo.StorageAttachment; 
 | 
import com.ruoyi.basic.pojo.StorageBlob; 
 | 
import com.ruoyi.basic.service.StorageAttachmentService; 
 | 
import com.ruoyi.common.utils.MinioUtils; 
 | 
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.extern.slf4j.Slf4j; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
  
 | 
import java.util.*; 
 | 
import java.util.function.Function; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
import static com.ruoyi.common.constant.StorageAttachmentConstants.StorageAttachmentFile; 
 | 
import static com.ruoyi.common.enums.StorageAttachmentRecordType.InspectionTasks; 
 | 
  
 | 
/** 
 | 
 * @author :yys 
 | 
 * @date : 2025/9/19 10:54 
 | 
 */ 
 | 
@Service 
 | 
@Slf4j 
 | 
public class InspectionTaskServiceImpl extends ServiceImpl<InspectionTaskMapper, InspectionTask> implements InspectionTaskService { 
 | 
  
 | 
  
 | 
    @Autowired 
 | 
    private InspectionTaskMapper inspectionTaskMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private StorageAttachmentService storageAttachmentService; 
 | 
  
 | 
    @Autowired 
 | 
    private StorageBlobMapper storageBlobMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private StorageAttachmentMapper storageAttachmentMapper; 
 | 
  
 | 
    @Autowired 
 | 
    private MinioUtils minioUtils; 
 | 
  
 | 
    @Autowired 
 | 
    private SysUserMapper sysUserMapper; 
 | 
  
 | 
    @Override 
 | 
    public IPage<InspectionTaskDto> selectInspectionTaskList(Page<InspectionTask> page, InspectionTaskDto inspectionTaskDto) { 
 | 
        LambdaQueryWrapper<InspectionTask> queryWrapper = new LambdaQueryWrapper<>(); 
 | 
        queryWrapper.orderByDesc(InspectionTask::getCreateTime); 
 | 
        IPage<InspectionTask> entityPage = inspectionTaskMapper.selectPage(page, queryWrapper); 
 | 
  
 | 
        //  无数据提前返回 
 | 
        if (CollectionUtils.isEmpty(entityPage.getRecords())) { 
 | 
            return new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); 
 | 
        } 
 | 
        // 获取id集合 
 | 
        List<Long> ids = entityPage.getRecords().stream().map(InspectionTask::getId).collect(Collectors.toList()); 
 | 
        //登记人ids 
 | 
        List<Long> registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).collect(Collectors.toList()); 
 | 
        // 批量查询登记人 
 | 
        Map<Long, SysUser> sysUserMap; 
 | 
        if (!registrantIds.isEmpty()) { 
 | 
            List<SysUser> sysUsers = sysUserMapper.selectList(registrantIds); 
 | 
            sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity())); 
 | 
        } else { 
 | 
            sysUserMap = new HashMap<>(); 
 | 
        } 
 | 
        //巡检人ids 
 | 
        List<String> inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).collect(Collectors.toList()); 
 | 
  
 | 
        //获取所有不重复的用户ID 
 | 
        Set<Long> 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<Long, String> userIdToNameMap = allUserIds.isEmpty() 
 | 
                ? Collections.emptyMap() 
 | 
                : sysUserMapper.selectUsersByIds(new ArrayList<>(allUserIds)) 
 | 
                .stream() 
 | 
                .collect(Collectors.toMap( 
 | 
                        SysUser::getUserId, 
 | 
                        SysUser::getNickName, 
 | 
                        (existing, replacement) -> existing)); 
 | 
  
 | 
        //处理附件 
 | 
        Map<Long, List<StorageAttachment>> attachmentsMap = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>().in(StorageAttachment::getRecordId, ids) 
 | 
                        .eq(StorageAttachment::getRecordType, InspectionTasks.ordinal())) 
 | 
                .stream() 
 | 
                .collect(Collectors.groupingBy(StorageAttachment::getRecordId)); 
 | 
        //  批量查询所有需要的文件数据 
 | 
        Set<Long> blobIds = attachmentsMap.values() 
 | 
                .stream() 
 | 
                .flatMap(List::stream) 
 | 
                .map(StorageAttachment::getStorageBlobId) 
 | 
                .collect(Collectors.toSet()); 
 | 
        Map<Long, StorageBlob> blobMap = blobIds.isEmpty() 
 | 
                ? Collections.emptyMap() 
 | 
                : storageBlobMapper.selectList(new LambdaQueryWrapper<StorageBlob>().in(StorageBlob::getId, blobIds)) 
 | 
                .stream() 
 | 
                .collect(Collectors.toMap(StorageBlob::getId, Function.identity())); 
 | 
  
 | 
        List<InspectionTaskDto> 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.setBeforeProduction(new ArrayList<>()); 
 | 
            dto.setAfterProduction(new ArrayList<>()); 
 | 
            dto.setProductionIssues(new ArrayList<>()); 
 | 
  
 | 
            // 处理附件分类 
 | 
            Optional.ofNullable(attachmentsMap.get(inspectionTask.getId())) 
 | 
                    .orElse(Collections.emptyList()) 
 | 
                    .forEach(attachment -> { 
 | 
                        StorageBlob blob = blobMap.get(attachment.getStorageBlobId()); 
 | 
                        if (blob != null) { 
 | 
                            // 创建附件DTO 
 | 
                            StorageBlobDTO blobDto = createBlobDto(blob); 
 | 
  
 | 
                            // 根据type分类 
 | 
                            switch ((int) blob.getType().longValue()) { 
 | 
                                case 0: 
 | 
                                    dto.getBeforeProduction().add(blobDto); 
 | 
                                    break; 
 | 
                                case 1: 
 | 
                                    dto.getAfterProduction().add(blobDto); 
 | 
                                    break; 
 | 
                                case 2: 
 | 
                                    dto.getProductionIssues().add(blobDto); 
 | 
                                    break; 
 | 
                                default: 
 | 
                                    // 可选:记录未分类类型 
 | 
                                    break; 
 | 
                            } 
 | 
                        } 
 | 
                    }); 
 | 
  
 | 
            return dto; 
 | 
        }).collect(Collectors.toList()); 
 | 
  
 | 
        // 7. 构建返回分页对象 
 | 
        IPage<InspectionTaskDto> resultPage = new Page<>(); 
 | 
        BeanUtils.copyProperties(entityPage, resultPage); 
 | 
        resultPage.setRecords(dtoList); 
 | 
        return resultPage; 
 | 
    } 
 | 
  
 | 
    // 提取创建BlobDTO的公共方法 
 | 
    private StorageBlobDTO createBlobDto(StorageBlob blob) { 
 | 
        StorageBlobDTO dto = new StorageBlobDTO(); 
 | 
        BeanUtils.copyProperties(blob, dto); 
 | 
  
 | 
        // 设置URL 
 | 
        dto.setUrl(minioUtils.getPreviewUrls( 
 | 
                blob.getBucketFilename(), 
 | 
                blob.getBucketName(), 
 | 
                true 
 | 
        )); 
 | 
  
 | 
        // 设置下载URL 
 | 
        dto.setDownloadUrl(minioUtils.getDownloadUrls( 
 | 
                blob.getBucketFilename(), 
 | 
                blob.getBucketName(), 
 | 
                blob.getOriginalFilename(), 
 | 
                true 
 | 
        )); 
 | 
        return dto; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    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); 
 | 
        } 
 | 
  
 | 
        if (inspectionTaskDto.getStorageBlobDTO() != null && !inspectionTaskDto.getStorageBlobDTO().isEmpty()) { 
 | 
            List<StorageAttachment> attachments = new ArrayList<>(); 
 | 
  
 | 
            for (StorageBlobDTO storageBlobDTO : inspectionTaskDto.getStorageBlobDTO()) { 
 | 
                StorageAttachment storageAttachment = new StorageAttachment( 
 | 
                        StorageAttachmentFile, 
 | 
                        (long) InspectionTasks.ordinal(), 
 | 
                        inspectionTask.getId() 
 | 
                ); 
 | 
                storageAttachment.setStorageBlobDTO(storageBlobDTO); 
 | 
                attachments.add(storageAttachment); 
 | 
            } 
 | 
            storageAttachmentService.saveStorageAttachment(attachments, inspectionTask.getId(), InspectionTasks, StorageAttachmentFile); 
 | 
        } 
 | 
        return i; 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public int delByIds(Long[] ids) { 
 | 
        // 检查参数 
 | 
        if (ids == null || ids.length == 0) { 
 | 
            return 0; 
 | 
        } 
 | 
        return inspectionTaskMapper.deleteBatchIds(Arrays.asList(ids)); 
 | 
    } 
 | 
  
 | 
} 
 |