fix:任务层面数据查询统一处理

This commit is contained in:
2026-03-17 14:00:10 +08:00
parent 15d58ef3bc
commit c4bfa8b20a

View File

@@ -16,7 +16,6 @@ import com.sdm.common.entity.req.export.FileAnalysisExportExcelFormat;
import com.sdm.common.entity.req.export.FileAnalysisExportExcelParam;
import com.sdm.common.entity.req.project.GetAllTasksByDisciplineReq;
import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.feign.inter.project.ISimulationTaskFeignClient;
import com.sdm.common.service.FileBizTypeService;
import com.sdm.common.utils.*;
@@ -24,7 +23,6 @@ import com.sdm.data.bo.ExportOperate;
import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.model.entity.FileTagRel;
import com.sdm.common.entity.req.data.GetSimulationTaskFileReq;
import com.sdm.data.model.req.QueryBigFileReq;
import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp;
import com.sdm.data.service.*;
import jakarta.servlet.http.HttpServletResponse;
@@ -41,14 +39,11 @@ import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static com.sdm.common.entity.enums.FileBizTypeEnum.*;
@Service
@Slf4j
public class DataAnalysisServiceImpl implements IDataAnalysisService {
@@ -101,17 +96,16 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
// level=task,或者tagReq不为空且tagReq.taskId不为空且tagReq.runId为空查询工况下的文件
if (NodeTypeEnum.TASK.getValue().equals(req.getLevel()) ||
(
ObjectUtils.isNotEmpty(req.getTagReq())
&& ObjectUtils.isNotEmpty(req.getTagReq().getTaskId())
&& ObjectUtils.isEmpty(req.getTagReq().getRunId())
)) {
Set<Long> taskLevelParentDirIds = null;
if (isOnlyTaskLevel(req)) {
Set<Long> taskDirIds = resolveTaskDirId(req);
if (ObjectUtils.isEmpty(taskDirIds)) {
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>());
}
return getTaskLevelFile(req, taskDirIds,discipoTaskDirIds);
taskLevelParentDirIds = getTaskLevelFile(req, taskDirIds, discipoTaskDirIds);
if (CollectionUtils.isEmpty(taskLevelParentDirIds)) {
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>());
}
}
List<Long> fileIdsByDictTags = null;
@@ -148,6 +142,10 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
// 所属项目、阶段、机台、工位、任务、算列
applyTagFilters(wrapper, req.getTagReq(),discipoTaskUUids);
if (ObjectUtils.isNotEmpty(taskLevelParentDirIds)) {
wrapper.in(FileMetadataInfo::getParentId, taskLevelParentDirIds);
}
if (ObjectUtils.isEmpty(req.getOrderBy())) {
wrapper.orderByDesc(FileMetadataInfo::getCreateTime);
}
@@ -164,7 +162,21 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
sortByTagFieldInCurrentPage(finalResultList, req.getOrderBy(), req.getOrderType());
PageInfo<SimulationTaskResultCurveResp> pageInfo = new PageInfo<>(finalResultList);
PageInfo<SimulationTaskResultCurveResp> pageInfo = null;
if (isOnlyTaskLevel(req)) {
List<SimulationTaskResultCurveResp> sortedList = finalResultList.stream()
.sorted(
// 第一步:按 createTime 排序null 排最后)
Comparator.comparing(SimulationTaskResultCurveResp::getCreateTime, Comparator.nullsLast(LocalDateTime::compareTo))
// 第二步createTime 相同时,按 sortOrder 排序null 排最后)
.thenComparing(SimulationTaskResultCurveResp::getSortOrder, Comparator.nullsLast(Integer::compare))
).toList();
pageInfo = new PageInfo<>(sortedList);
}else {
pageInfo = new PageInfo<>(finalResultList);
}
pageInfo.setTotal(page.getTotal());
pageInfo.setPageNum(page.getPageNum());
pageInfo.setPageSize(page.getPageSize());
@@ -172,6 +184,17 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
return PageUtils.getJsonObjectSdmResponse(finalResultList, pageInfo);
}
// 是否只到任务级别,不到算列层
// 因为任务级别的文件,需要再任务下的交付物归档文件夹查询,需要特殊处理,不能下探到算列文件夹下去搜索文件
private static boolean isOnlyTaskLevel(GetSimulationTaskFileReq req) {
return NodeTypeEnum.TASK.getValue().equals(req.getLevel()) ||
(
ObjectUtils.isNotEmpty(req.getTagReq())
&& ObjectUtils.isNotEmpty(req.getTagReq().getTaskId())
&& ObjectUtils.isEmpty(req.getTagReq().getRunId())
);
}
private List<String> getDisciplineToTaskUUID(List<String> disciplines){
// 调用feign获取每个学科对应的任务UUID列表
GetAllTasksByDisciplineReq req = new GetAllTasksByDisciplineReq();
@@ -242,7 +265,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
inByCsv(wrapper, FileMetadataInfo::getRunId, tagReq.getRunId());
// 根据所属学科查询所属任务
wrapper.in(FileMetadataInfo::getTaskId,discipoTaskDirIds);
wrapper.in(CollectionUtils.isNotEmpty(discipoTaskDirIds),FileMetadataInfo::getTaskId,discipoTaskDirIds);
}
/**
@@ -368,63 +391,37 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
};
}
private SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getTaskLevelFile(GetSimulationTaskFileReq req, Set<Long> dirIds, Set<Long> discipoTaskDirIds) {
private Set<Long> getTaskLevelFile(GetSimulationTaskFileReq req, Set<Long> dirIds, Set<Long> discipoTaskDirIds) {
// level=task查task下的交付物文件夹 再根据fileType查具体的云图文件、曲线文件夹下的文件
List<FileMetadataInfo> deliverableFileInfoList = fileMetadataInfoService.lambdaQuery()
.in(CollectionUtils.isNotEmpty(dirIds),FileMetadataInfo::getParentId, dirIds)
.in(CollectionUtils.isNotEmpty(discipoTaskDirIds),FileMetadataInfo::getParentId, discipoTaskDirIds)
.in(CollectionUtils.isNotEmpty(dirIds), FileMetadataInfo::getParentId, dirIds)
.in(CollectionUtils.isNotEmpty(discipoTaskDirIds), FileMetadataInfo::getParentId, discipoTaskDirIds)
.eq(FileMetadataInfo::getOriginalName, CommonConstants.DELIVERABLE_DIR_NAME)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
if (CollectionUtils.isNotEmpty(deliverableFileInfoList)) {
// 交付物文件夹id
Set<Long> deliverableDirIds = deliverableFileInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
// 云图/曲线/文件夹名称
List<String> fileNames = Arrays.stream(req.getFileTypeDictValue().split(",")).map(fileType -> fileBizTypeService.getFileName(fileType)).toList();
List<FileMetadataInfo> secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.in(FileMetadataInfo::getParentId, deliverableDirIds)
.in(FileMetadataInfo::getOriginalName, fileNames)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
if (CollectionUtils.isNotEmpty(secondDirFileMetadataInfoList)) {
// 云图/曲线/文件夹id
Set<Long> secondDirIds = secondDirFileMetadataInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
// 最后查云图/曲线/文件夹底下的文件
PageHelper.startPage(req.getCurrent(), req.getSize());
List<FileMetadataInfo> fileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.in(FileMetadataInfo::getParentId, secondDirIds)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getIsLatest, true)
.list();
PageInfo<FileMetadataInfo> page = new PageInfo<>(fileMetadataInfoList);
long total = page.getTotal();
// 设置tag1-tag10
List<SimulationTaskResultCurveResp> finalResultList = hierarchyHelper.processFileHierarchyFromFileMetadata(fileMetadataInfoList, SimulationTaskResultCurveResp.class);
hierarchyHelper.setTagReqFromFileMetadataBatch(finalResultList, SimulationTaskResultCurveResp::getId);
// 填充的文件类型标签信息
fileDictTagQueryService.fillFileTagsForRespList(finalResultList, SimulationTaskResultCurveResp::getId);
sortByTagFieldInCurrentPage(finalResultList, req.getOrderBy(), req.getOrderType());
List<SimulationTaskResultCurveResp> sortedList = finalResultList.stream()
.sorted(
// 第一步:按 createTime 排序null 排最后)
Comparator.comparing(SimulationTaskResultCurveResp::getCreateTime, Comparator.nullsLast(LocalDateTime::compareTo))
// 第二步createTime 相同时,按 sortOrder 排序null 排最后)
.thenComparing(SimulationTaskResultCurveResp::getSortOrder, Comparator.nullsLast(Integer::compare))
).toList();
PageInfo<SimulationTaskResultCurveResp> page1 = new PageInfo<>(sortedList);
page1.setTotal(total);
return PageUtils.getJsonObjectSdmResponse(sortedList, page1);
}
if (CollectionUtils.isEmpty(deliverableFileInfoList)) {
return Collections.emptySet();
}
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>());
// 交付物文件夹id
Set<Long> deliverableDirIds = deliverableFileInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
// 云图/曲线/文件夹名称
List<String> fileNames = Arrays.stream(req.getFileTypeDictValue().split(","))
.map(fileType -> fileBizTypeService.getFileName(fileType))
.toList();
List<FileMetadataInfo> secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.in(FileMetadataInfo::getParentId, deliverableDirIds)
.in(FileMetadataInfo::getOriginalName, fileNames)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
if (CollectionUtils.isEmpty(secondDirFileMetadataInfoList)) {
return Collections.emptySet();
}
// 云图/曲线/文件夹id
return secondDirFileMetadataInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
}
@Override