package com.ruoyi.business.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.entity.StorageAttachment;
import com.ruoyi.basic.entity.StorageBlob;
import com.ruoyi.basic.entity.Supply;
import com.ruoyi.basic.entity.dto.StorageBlobDTO;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.basic.mapper.StorageBlobMapper;
import com.ruoyi.basic.service.StorageAttachmentService;
import com.ruoyi.business.dto.InspectionTaskDto;
import com.ruoyi.business.entity.InspectionTask;
import com.ruoyi.business.mapper.InspectionTaskMapper;
import com.ruoyi.business.service.InspectionTaskService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.file.MinioUtils;
import com.ruoyi.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
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 ld
* @since 2025-06-14
*/
@Service
@RequiredArgsConstructor
public class InspectionTaskServiceImpl extends ServiceImpl implements InspectionTaskService {
private final InspectionTaskMapper inspectionTaskMapper;
private final StorageAttachmentService storageAttachmentService;
private final StorageBlobMapper storageBlobMapper;
private final StorageAttachmentMapper storageAttachmentMapper;
private final MinioUtils minioUtils;
private final SysUserMapper sysUserMapper;
@Override
public IPage selectInspectionTaskList(Page page, InspectionTaskDto inspectionTaskDto) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(InspectionTask::getCreateTime);
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).toList();
//登记人ids
List registrantIds = entityPage.getRecords().stream().map(InspectionTask::getRegistrantId).toList();
// 批量查询登记人
Map sysUserMap;
if (!registrantIds.isEmpty()) {
List sysUsers = sysUserMapper.selectList(registrantIds);
sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
} else {
sysUserMap = new HashMap<>();
}
//巡检人ids
List inspectorIds = entityPage.getRecords().stream().map(InspectionTask::getInspectorId).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));
//处理附件
Map> attachmentsMap = storageAttachmentMapper.selectList(new LambdaQueryWrapper().in(StorageAttachment::getRecordId, ids)
.eq(StorageAttachment::getRecordType, InspectionTasks.ordinal()))
.stream()
.collect(Collectors.groupingBy(StorageAttachment::getRecordId));
// 批量查询所有需要的文件数据
Set blobIds = attachmentsMap.values()
.stream()
.flatMap(List::stream)
.map(StorageAttachment::getStorageBlobId)
.collect(Collectors.toSet());
Map blobMap = blobIds.isEmpty()
? Collections.emptyMap()
: storageBlobMapper.selectList(new LambdaQueryWrapper().in(StorageBlob::getId, blobIds))
.stream()
.collect(Collectors.toMap(StorageBlob::getId, Function.identity()));
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.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 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 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.deleteByIds(Arrays.asList(ids));
}
}