fix:数据查询,优化文件类型数据字典

This commit is contained in:
2026-03-17 10:40:56 +08:00
parent 5d8cfd70be
commit 701d9f8372
14 changed files with 331 additions and 88 deletions

View File

@@ -1,9 +1,11 @@
package com.sdm.data.model.req;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class SimulationParameterItem {
@Schema(description = "参数名")
private String parameterName;

View File

@@ -14,8 +14,11 @@ import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.req.data.TagReq;
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.*;
import com.sdm.data.bo.ExportOperate;
import com.sdm.data.model.entity.FileMetadataInfo;
@@ -70,9 +73,26 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
@Resource
private DictTagHelper dictTagHelper;
@Autowired
ISimulationTaskFeignClient simulationTaskFeignClient;
@Autowired
FileBizTypeService fileBizTypeService;
@Override
public SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getSimulationTaskFile(GetSimulationTaskFileReq req) {
// 传了学科字段,需要根据学科获取对应的任务,再和已传的学科做交集处理
if(ObjectUtils.isNotEmpty(req.getOwnDisciplineName())) {
List<String> disciplineToTaskUUID = getDisciplineToTaskUUID(List.of(req.getOwnDisciplineName()));
if(ObjectUtils.isNotEmpty(req.getTagReq())
&& ObjectUtils.isNotEmpty(req.getTagReq().getTaskId())){
disciplineToTaskUUID.retainAll(parseCsv(req.getTagReq().getTaskId()));
}
req.getTagReq().setTaskId(String.join(",", disciplineToTaskUUID));
}
// level=task,或者tagReq不为空且tagReq.taskId不为空且tagReq.runId为空查询工况下的文件
if (NodeTypeEnum.TASK.getValue().equals(req.getLevel()) ||
@@ -81,13 +101,11 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
&& ObjectUtils.isNotEmpty(req.getTagReq().getTaskId())
&& ObjectUtils.isEmpty(req.getTagReq().getRunId())
)) {
Long taskDirId = resolveTaskDirId(req);
if (ObjectUtils.isEmpty(taskDirId)) {
Set<Long> taskDirIds = resolveTaskDirId(req);
if (ObjectUtils.isEmpty(taskDirIds)) {
return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>());
}
QueryBigFileReq queryBigFileReq = new QueryBigFileReq();
queryBigFileReq.setDirId(taskDirId);
return getTaskLevelFile(req, queryBigFileReq);
return getTaskLevelFile(req, taskDirIds);
}
List<Long> fileIdsByDictTags = null;
@@ -148,6 +166,21 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
return PageUtils.getJsonObjectSdmResponse(finalResultList, pageInfo);
}
private List<String> getDisciplineToTaskUUID(List<String> disciplines){
// 调用feign获取每个学科对应的任务UUID列表
GetAllTasksByDisciplineReq req = new GetAllTasksByDisciplineReq();
req.setDisciplines(disciplines);
SdmResponse<Map<String, List<String>>> disciplineTasksResponse = simulationTaskFeignClient.getAllTasksByDiscipline(req);
if (!disciplineTasksResponse.isSuccess() || com.baomidou.mybatisplus.core.toolkit.ObjectUtils.isEmpty(disciplineTasksResponse.getData())) {
log.warn("获取学科对应的任务列表失败");
return Collections.emptyList();
}
// 获取所有学科对应的任务UUID列表
return disciplineTasksResponse.getData().values().stream().flatMap(Collection::stream).collect(Collectors.toList());
}
/**
* 复用listBigFile的逻辑在目录范围内根据dictTags筛出文件ID
@@ -249,26 +282,25 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
.toList();
}
private Long resolveTaskDirId(GetSimulationTaskFileReq req) {
private Set<Long> resolveTaskDirId(GetSimulationTaskFileReq req) {
if (ObjectUtils.isNotEmpty(req.getDirId())) {
return req.getDirId();
return Set.of(req.getDirId());
}
TagReq tagReq = req.getTagReq();
if (ObjectUtils.isNotEmpty(tagReq) && StringUtils.isNotBlank(tagReq.getTaskId())) {
List<String> taskIds = parseCsv(tagReq.getTaskId());
String targetTaskId = CollectionUtils.isNotEmpty(taskIds) ? taskIds.get(taskIds.size() - 1) : null;
if (StringUtils.isNotBlank(targetTaskId)) {
FileMetadataInfo fileMetadataInfo = fileMetadataInfoService.lambdaQuery()
if (CollectionUtils.isNotEmpty(taskIds)) {
List<FileMetadataInfo> taskDirs = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.eq(FileMetadataInfo::getRelatedResourceUuid, targetTaskId)
.in(FileMetadataInfo::getRelatedResourceUuid, taskIds)
.isNull(FileMetadataInfo::getDeletedAt)
.one();
if (ObjectUtils.isNotEmpty(fileMetadataInfo)) {
return fileMetadataInfo.getId();
.list();
if (CollectionUtils.isNotEmpty(taskDirs)) {
return taskDirs.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
}
}
}
return null;
return Collections.emptySet();
}
@@ -327,33 +359,33 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
};
}
private SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getTaskLevelFile(GetSimulationTaskFileReq req, QueryBigFileReq queryBigFileReq) {
private SdmResponse<PageDataResp<List<SimulationTaskResultCurveResp>>> getTaskLevelFile(GetSimulationTaskFileReq req, Set<Long> dirIds ) {
// level=task查task下的交付物文件夹 再根据fileType查具体的云图文件、曲线文件夹下的文件
List<FileMetadataInfo> deliverableFileInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId())
.in(FileMetadataInfo::getParentId, dirIds)
.eq(FileMetadataInfo::getOriginalName, CommonConstants.DELIVERABLE_DIR_NAME)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
if (CollectionUtils.isNotEmpty(deliverableFileInfoList)) {
// 交付物文件夹id
Long deliverableDirId = deliverableFileInfoList.get(0).getId();
Set<Long> deliverableDirIds = deliverableFileInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
// 云图/曲线/文件夹名称
String secondDirName = FileBizTypeEnum.getDirNameByValue(req.getFileBizType());
List<String> fileNames = Arrays.stream(req.getFileTypeDictValue().split(",")).map(fileType -> fileBizTypeService.getFileName(fileType)).toList();
List<FileMetadataInfo> secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, deliverableDirId)
.eq(FileMetadataInfo::getOriginalName, secondDirName)
.in(FileMetadataInfo::getParentId, deliverableDirIds)
.in(FileMetadataInfo::getOriginalName, fileNames)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list();
if (CollectionUtils.isNotEmpty(secondDirFileMetadataInfoList)) {
// 云图/曲线/文件夹id
Long secondDirId = secondDirFileMetadataInfoList.get(0).getId();
Set<Long> secondDirIds = secondDirFileMetadataInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet());
// 最后查云图/曲线/文件夹底下的文件
PageHelper.startPage(req.getCurrent(), req.getSize());
List<FileMetadataInfo> fileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, secondDirId)
.in(FileMetadataInfo::getParentId, secondDirIds)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getIsLatest, true)

View File

@@ -390,17 +390,6 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
childDto.setTotalName(totalName);
}
// 目前已经移除了学科节点学科信息作为task节点的字段附属信息
if (ObjectUtils.isNotEmpty(childDto.getOwntaskId()) ||
(NodeTypeEnum.TASK.getValue().equalsIgnoreCase(childDto.getRelatedResourceUuidOwnType()) && ObjectUtils.isNotEmpty(childDto.getRelatedResourceUuid()))) {
GetTaskDetailReq getTaskDetailReq = new GetTaskDetailReq();
getTaskDetailReq.setRelatedResourceUuid(ObjectUtils.isNotEmpty(childDto.getOwntaskId()) ? childDto.getOwntaskId() : childDto.getRelatedResourceUuid());
SdmResponse<SpdmTaskVo> taskDetail = simulationTaskFeignClient.getTaskDetail(getTaskDetailReq);
if (taskDetail.isSuccess()) {
childDto.setOwnDisciplineName(taskDetail.getData().getDiscipline());
}
}
allChildren.add(childDto);
groupedChildren.computeIfAbsent(fileInfo.getOriginalName(), key -> new ArrayList<>()).add(childDto);
}
@@ -421,7 +410,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
}
long start4= System.currentTimeMillis();
// 批量设置文件的节点信息tag1-tag10
// 批量设置文件的节点信息tag1-tag10,学科信息
hierarchyHelper.setTagReqFromFileMetadataBatch(allChildren, FileMetadataInfoResp::getId);
long start5 = System.currentTimeMillis();
// 批量填充文件类型标签信息

View File

@@ -1,8 +1,12 @@
package com.sdm.data.service.impl;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.resp.data.FileMetadataInfoResp;
import com.sdm.common.entity.req.project.GetTaskDetailReq;
import com.sdm.common.entity.resp.project.SpdmTaskVo;
import com.sdm.common.feign.inter.project.ISimulationTaskFeignClient;
import com.sdm.common.service.TagMapService;
import com.sdm.common.utils.FileSizeUtils;
import com.sdm.data.model.entity.FileMetadataInfo;
import com.sdm.data.service.IFileMetadataInfoService;
@@ -29,6 +33,12 @@ public class FileMetadataHierarchyHelper {
@Autowired
private IFileMetadataInfoService fileMetadataInfoService;
@Autowired
private ISimulationTaskFeignClient simulationTaskFeignClient;
@Autowired
private TagMapService tagMapService;
/**
* 默认递归深度限制
*/
@@ -236,13 +246,25 @@ public class FileMetadataHierarchyHelper {
}
/**
* 批量为响应对象设置tagReq合并单条逻辑避免重复查询
* 批量为响应对象设置 tagReq合并单条逻辑避免重复查询
*
* @param respList 响应对象列表
* @param idGetter 获取文件ID的函数
* @param idGetter 获取文件 ID 的函数
* @param <T> 响应对象类型
*/
public <T> void setTagReqFromFileMetadataBatch(List<T> respList, Function<T, Long> idGetter) {
setTagReqFromFileMetadataBatch(respList, idGetter, true);
}
/**
* 批量为响应对象设置 tagReq 和学科属性(可控制是否设置学科信息)
*
* @param respList 响应对象列表
* @param idGetter 获取文件 ID 的函数
* @param enableDiscipline 是否设置学科信息
* @param <T> 响应对象类型
*/
public <T> void setTagReqFromFileMetadataBatch(List<T> respList, Function<T, Long> idGetter, boolean enableDiscipline) {
if (CollectionUtils.isEmpty(respList) || idGetter == null) {
return;
}
@@ -265,6 +287,25 @@ public class FileMetadataHierarchyHelper {
Map<Long, FileMetadataInfo> fileMap = files.stream()
.collect(Collectors.toMap(FileMetadataInfo::getId, item -> item, (left, right) -> left));
// 如果需要设置学科信息,先收集所有 taskId 并获取任务数据
Map<String, SpdmTaskVo> taskMap = null;
if (enableDiscipline) {
Set<String> taskUuidSet = files.stream()
.map(FileMetadataInfo::getTaskId)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(taskUuidSet)) {
GetTaskDetailReq req = new GetTaskDetailReq();
req.setRelatedResourceUuidList(new ArrayList<>(taskUuidSet));
SdmResponse<Map<String, SpdmTaskVo>> mapSdmResponse = simulationTaskFeignClient.batchGetTaskDetailByUuids(req);
taskMap = mapSdmResponse.getData();
if (taskMap == null) {
taskMap = new HashMap<>();
}
}
}
Map<String, String> uuidNameMap = buildUuidNameMap(files);
for (T resp : respList) {
@@ -274,23 +315,101 @@ public class FileMetadataHierarchyHelper {
}
FileMetadataInfo file = fileMap.get(fileId);
if (file != null) {
setTagReqFromFileMetadataInternal(file, resp, uuidNameMap);
setTagReqFromFileMetadataInternal(file, resp, uuidNameMap, taskMap);
}
}
}
/**
* 直接使用FileMetadataInfo中已存储的tag1~tag10、taskId、runId构建并设置tagReq
* 并基于relatedResourceUuid查询对应originalName填充tagName/taskName/runName
* 直接使用 FileMetadataInfo 中已存储的 tag1~tag10、taskId、runId 构建并设置 tagReq
* 并基于 relatedResourceUuid 查询对应 originalName 填充 tagName/taskName/runName
*/
public <T> void setTagReqFromFileMetadata(FileMetadataInfo file, T resp) {
setTagReqFromFileMetadata(file, resp, true);
}
/**
* 直接使用 FileMetadataInfo 中已存储的 tag1~tag10、taskId、runId 构建并设置 tagReq 和学科属性
* 并基于 relatedResourceUuid 查询对应 originalName 填充 tagName/taskName/runName
*
* @param file 文件元数据
* @param resp 响应对象
* @param enableDiscipline 是否设置学科信息
*/
public <T> void setTagReqFromFileMetadata(FileMetadataInfo file, T resp, boolean enableDiscipline) {
if (Objects.isNull(file) || Objects.isNull(resp)) {
return;
}
Map<String, String> uuidNameMap = buildUuidNameMap(Collections.singletonList(file));
setTagReqFromFileMetadataInternal(file, resp, uuidNameMap);
// 如果需要设置学科信息,获取任务数据
Map<String, SpdmTaskVo> taskMap = null;
if (enableDiscipline && StringUtils.isNotBlank(file.getTaskId())) {
GetTaskDetailReq req = new GetTaskDetailReq();
req.setRelatedResourceUuidList(Collections.singletonList(file.getTaskId()));
SdmResponse<Map<String, SpdmTaskVo>> mapSdmResponse = simulationTaskFeignClient.batchGetTaskDetailByUuids(req);
taskMap = mapSdmResponse.getData();
if (taskMap == null) {
taskMap = new HashMap<>();
}
}
setTagReqFromFileMetadataInternal(file, resp, uuidNameMap, taskMap);
}
private <T> void setTagReqFromFileMetadataInternal(FileMetadataInfo file, T resp, Map<String, String> uuidNameMap, Map<String, SpdmTaskVo> taskMap) {
try {
Class<?> tagReqClass = Class.forName("com.sdm.common.entity.req.data.TagReq");
Object tagReq = tagReqClass.getDeclaredConstructor().newInstance();
List<String> tagValues = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Object tagValue = FileMetadataInfo.class.getMethod("getTag" + i).invoke(file);
String value = Objects.toString(tagValue, null);
tagValues.add(value);
tagReqClass.getMethod("setTag" + i, String.class).invoke(tagReq, value);
}
String taskId = file.getTaskId();
String runId = file.getRunId();
tagReqClass.getMethod("setTaskId", String.class).invoke(tagReq, taskId);
tagReqClass.getMethod("setRunId", String.class).invoke(tagReq, runId);
for (int i = 1; i <= 10; i++) {
String tagValue = tagValues.get(i - 1);
List<String> uuidChain = parseUuidChain(tagValue);
String tagName = uuidChain.stream()
.map(uuidNameMap::get)
.filter(StringUtils::isNotBlank)
.collect(Collectors.joining("/"));
tagReqClass.getMethod("setTag" + i + "Name", String.class).invoke(tagReq, tagName);
}
tagReqClass.getMethod("setTaskName", String.class).invoke(tagReq, uuidNameMap.get(taskId));
tagReqClass.getMethod("setRunName", String.class).invoke(tagReq, uuidNameMap.get(runId));
resp.getClass().getMethod("setTagReq", tagReqClass).invoke(resp, tagReq);
// 设置学科信息
if (taskMap != null && StringUtils.isNotBlank(taskId)) {
SpdmTaskVo taskVo = taskMap.get(taskId);
if (taskVo != null) {
String disciplineName = taskVo.getDiscipline();
if (StringUtils.isNotBlank(disciplineName)) {
resp.getClass().getMethod("setOwnDisciplineName", String.class).invoke(resp, disciplineName);
}
}
}
} catch (Exception e) {
log.warn("设置 tagReq 失败", e);
}
}
/**
* 构建 uuidNameMap: key=tag1UUid ,value=项目名称
* @param files
* @return
*/
private Map<String, String> buildUuidNameMap(List<FileMetadataInfo> files) {
Set<String> relatedUuids = new HashSet<>();
for (FileMetadataInfo file : files) {
@@ -334,42 +453,6 @@ public class FileMetadataHierarchyHelper {
));
}
private <T> void setTagReqFromFileMetadataInternal(FileMetadataInfo file, T resp, Map<String, String> uuidNameMap) {
try {
Class<?> tagReqClass = Class.forName("com.sdm.common.entity.req.data.TagReq");
Object tagReq = tagReqClass.getDeclaredConstructor().newInstance();
List<String> tagValues = new ArrayList<>();
for (int i = 1; i <= 10; i++) {
Object tagValue = FileMetadataInfo.class.getMethod("getTag" + i).invoke(file);
String value = Objects.toString(tagValue, null);
tagValues.add(value);
tagReqClass.getMethod("setTag" + i, String.class).invoke(tagReq, value);
}
String taskId = file.getTaskId();
String runId = file.getRunId();
tagReqClass.getMethod("setTaskId", String.class).invoke(tagReq, taskId);
tagReqClass.getMethod("setRunId", String.class).invoke(tagReq, runId);
for (int i = 1; i <= 10; i++) {
String tagValue = tagValues.get(i - 1);
List<String> uuidChain = parseUuidChain(tagValue);
String tagName = uuidChain.stream()
.map(uuidNameMap::get)
.filter(StringUtils::isNotBlank)
.collect(Collectors.joining("/"));
tagReqClass.getMethod("setTag" + i + "Name", String.class).invoke(tagReq, tagName);
}
tagReqClass.getMethod("setTaskName", String.class).invoke(tagReq, uuidNameMap.get(taskId));
tagReqClass.getMethod("setRunName", String.class).invoke(tagReq, uuidNameMap.get(runId));
resp.getClass().getMethod("setTagReq", tagReqClass).invoke(resp, tagReq);
} catch (Exception e) {
log.warn("设置tagReq失败", e);
}
}
/**
* 解析逗号拼接的uuid链
*/