From 701d9f8372ccd789d1b3ca570ab82e485022c9d9 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Tue, 17 Mar 2026 10:40:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../req/data/GetSimulationTaskFileReq.java | 3 + .../entity/req/project/GetTaskDetailReq.java | 3 + .../com/sdm/common/entity/resp/BaseResp.java | 9 - .../SimulationTaskFeignClientImpl.java | 14 ++ .../project/ISimulationTaskFeignClient.java | 4 + .../common/service/FileBizTypeService.java | 98 ++++++++++ .../com/sdm/common/service/TagMapService.java | 2 +- .../model/req/SimulationParameterItem.java | 2 + .../service/impl/DataAnalysisServiceImpl.java | 78 +++++--- .../impl/DimensionTemplateServiceImpl.java | 13 +- .../impl/FileMetadataHierarchyHelper.java | 169 +++++++++++++----- .../controller/SimulationTaskController.java | 10 ++ .../com/sdm/project/service/ITaskService.java | 3 + .../project/service/impl/TaskServiceImpl.java | 11 ++ 14 files changed, 331 insertions(+), 88 deletions(-) create mode 100644 common/src/main/java/com/sdm/common/service/FileBizTypeService.java diff --git a/common/src/main/java/com/sdm/common/entity/req/data/GetSimulationTaskFileReq.java b/common/src/main/java/com/sdm/common/entity/req/data/GetSimulationTaskFileReq.java index fc86ee6b..040acb0f 100644 --- a/common/src/main/java/com/sdm/common/entity/req/data/GetSimulationTaskFileReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/data/GetSimulationTaskFileReq.java @@ -67,4 +67,7 @@ public class GetSimulationTaskFileReq extends BaseReq { @Schema(description = "排序类型:Asc/Desc") private String orderType; + + @Schema(description = "所属学科名称") + private String ownDisciplineName; } diff --git a/common/src/main/java/com/sdm/common/entity/req/project/GetTaskDetailReq.java b/common/src/main/java/com/sdm/common/entity/req/project/GetTaskDetailReq.java index 44d9139a..672b1ceb 100644 --- a/common/src/main/java/com/sdm/common/entity/req/project/GetTaskDetailReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/project/GetTaskDetailReq.java @@ -3,10 +3,13 @@ package com.sdm.common.entity.req.project; import jakarta.validation.constraints.NotNull; import lombok.Data; +import java.util.List; + @Data public class GetTaskDetailReq { @NotNull(message = "relatedResourceUuid不能为空") private String relatedResourceUuid; + private List relatedResourceUuidList; } diff --git a/common/src/main/java/com/sdm/common/entity/resp/BaseResp.java b/common/src/main/java/com/sdm/common/entity/resp/BaseResp.java index e81f22fd..e0ba4da3 100644 --- a/common/src/main/java/com/sdm/common/entity/resp/BaseResp.java +++ b/common/src/main/java/com/sdm/common/entity/resp/BaseResp.java @@ -14,15 +14,6 @@ public class BaseResp { @Schema(description = "所属学科") String ownDisciplineName; - @Schema(description = "所属学科id") - private String ownDisciplineId; - - @Schema(description = "所属工况任务") - String owntaskName; - - @Schema(description = "所属工况任务id") - private String owntaskId; - @Schema(description= "文件业务类型(1:模型文件 2:仿真报告、3:计算文件、4:曲线文件、5:云图文件,6:网格文件,7:计算过程文件)") @TableField("fileType") private Integer fileType; diff --git a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationTaskFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationTaskFeignClientImpl.java index 15a2cf79..43706ebd 100644 --- a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationTaskFeignClientImpl.java +++ b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationTaskFeignClientImpl.java @@ -57,6 +57,20 @@ public class SimulationTaskFeignClientImpl implements ISimulationTaskFeignClient } } + @Override + public SdmResponse> batchGetTaskDetailByUuids(GetTaskDetailReq req) { + try { + SdmResponse> response = simulationTaskFeignClient.batchGetTaskDetailByUuids(req); + if(!response.isSuccess() || ObjectUtils.isEmpty(response.getData())){ + return SdmResponse.failed("内部调用获取任务详情失败"); + } + return response; + }catch (Exception e){ + log.error("内部调用获取任务详情失败", e); + return SdmResponse.failed("内部调用获取任务详情失败"); + } + } + @Override public SdmResponse>> getAllTasksByDiscipline(GetAllTasksByDisciplineReq req) { try { diff --git a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationTaskFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationTaskFeignClient.java index de3a89f6..4d054e23 100644 --- a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationTaskFeignClient.java +++ b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationTaskFeignClient.java @@ -38,6 +38,10 @@ public interface ISimulationTaskFeignClient { @PostMapping("/task/getTaskDetail") SdmResponse getTaskDetail(@RequestBody GetTaskDetailReq req); + @PostMapping("/task/batchGetTaskDetailByUuids") + SdmResponse> batchGetTaskDetailByUuids(@RequestBody GetTaskDetailReq req); + + /** * 根据学科获取所有的任务 */ diff --git a/common/src/main/java/com/sdm/common/service/FileBizTypeService.java b/common/src/main/java/com/sdm/common/service/FileBizTypeService.java new file mode 100644 index 00000000..a71966ba --- /dev/null +++ b/common/src/main/java/com/sdm/common/service/FileBizTypeService.java @@ -0,0 +1,98 @@ +package com.sdm.common.service; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.bo.DataDictionary; +import com.sdm.common.entity.enums.FileDictTagEnum; +import com.sdm.common.feign.impl.system.SysConfigFeignClientImpl; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static java.util.Collections.emptyMap; + +/** + * @Description: 文件业务类型服务 + * @Date: 2021/12/27 16:07 + * @Version: 1.0 + **/ +@Service +@Slf4j +public class FileBizTypeService { + @Autowired + private SysConfigFeignClientImpl sysConfigFeignClient; + + /** + * 获取文件类型字典映射(value -> name) + * @return 映射表,key 为 dictValue=6,value 为 dictName=流程脚本 + */ + public Map getFileTypeMapName() { + return getDictMap(FileDictTagEnum.FILE_TYPE.getDictClass(), false); + } + + /** + * 获取文件类型字典映射(name -> value) + * @return 映射表,key 为 dictName=流程脚本,value 为 dictValue=6 + */ + public Map getFileNameMapValue() { + return getDictMap(FileDictTagEnum.FILE_TYPE.getDictClass(), true); + } + + /** + * 通用方法:根据 dictClass 获取字典映射 + * @param dictClass 字典分类 + * @param reverse 是否反转映射(true: name->value, false: value->name) + * @return 映射表 + */ + private Map getDictMap(String dictClass, boolean reverse) { + SdmResponse> dictList = sysConfigFeignClient.getDictionaryData(dictClass); + if (!dictList.isSuccess() || ObjectUtils.isEmpty(dictList.getData())) { + log.error("字典信息查询失败,dictClass: {}", dictClass); + return emptyMap(); + } + + if (reverse) { + // name -> value + return dictList.getData().stream() + .collect(Collectors.toMap(DataDictionary::getDictName, DataDictionary::getDictValue)); + } else { + // value -> name + return dictList.getData().stream() + .collect(Collectors.toMap(DataDictionary::getDictValue, DataDictionary::getDictName)); + } + } + + /** + * 是否为文件类型节点 + * @param fileType 文件类型值 + * @return 是否为配置的类型 + */ + public boolean isFileType(String fileType) { + Map typeMap = getFileTypeMapName(); + return typeMap.containsKey(fileType); + } + + /** + * 获取文件类型名称 + * @param fileType 文件字典表的dictValue: 1,2,3 + * @return 文件类型名称:脚本,流程,图片 + */ + public String getFileName(String fileType) { + Map typeMap = getFileTypeMapName(); + return typeMap.get(fileType); + } + + /** + * 获取文件类型值 + * @param fileName 文件类型名称 + * @return 文件类型值 + */ + public String getFileType(String fileName) { + Map fileNameMapValue = getFileNameMapValue(); + return fileNameMapValue.get(fileName); + } +} diff --git a/common/src/main/java/com/sdm/common/service/TagMapService.java b/common/src/main/java/com/sdm/common/service/TagMapService.java index 2a1e4661..6bd7e510 100644 --- a/common/src/main/java/com/sdm/common/service/TagMapService.java +++ b/common/src/main/java/com/sdm/common/service/TagMapService.java @@ -38,7 +38,7 @@ public class TagMapService { log.error("字典信息查询失败"); return emptyMap(); } - // project-->tag1 phase-->tag2 + // tag1 --> project tag2 --> phase return tagMapList.getData().stream().collect(Collectors.toMap(DataDictionary::getDictName, DataDictionary::getDictValue)); } diff --git a/data/src/main/java/com/sdm/data/model/req/SimulationParameterItem.java b/data/src/main/java/com/sdm/data/model/req/SimulationParameterItem.java index 08a816e9..141828dd 100644 --- a/data/src/main/java/com/sdm/data/model/req/SimulationParameterItem.java +++ b/data/src/main/java/com/sdm/data/model/req/SimulationParameterItem.java @@ -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; diff --git a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java index 2bbdbbf9..d12689c5 100644 --- a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java @@ -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>> getSimulationTaskFile(GetSimulationTaskFileReq req) { + // 传了学科字段,需要根据学科获取对应的任务,再和已传的学科做交集处理 + if(ObjectUtils.isNotEmpty(req.getOwnDisciplineName())) { + List 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 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 fileIdsByDictTags = null; @@ -148,6 +166,21 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { return PageUtils.getJsonObjectSdmResponse(finalResultList, pageInfo); } + private List getDisciplineToTaskUUID(List disciplines){ + // 调用feign获取每个学科对应的任务UUID列表 + GetAllTasksByDisciplineReq req = new GetAllTasksByDisciplineReq(); + req.setDisciplines(disciplines); + SdmResponse>> 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 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 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 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>> getTaskLevelFile(GetSimulationTaskFileReq req, QueryBigFileReq queryBigFileReq) { + private SdmResponse>> getTaskLevelFile(GetSimulationTaskFileReq req, Set dirIds ) { // level=task,查task下的交付物文件夹 再根据fileType查具体的云图文件、曲线文件夹下的文件 List 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 deliverableDirIds = deliverableFileInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet()); // 云图/曲线/文件夹名称 - String secondDirName = FileBizTypeEnum.getDirNameByValue(req.getFileBizType()); + List fileNames = Arrays.stream(req.getFileTypeDictValue().split(",")).map(fileType -> fileBizTypeService.getFileName(fileType)).toList(); List 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 secondDirIds = secondDirFileMetadataInfoList.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet()); // 最后查云图/曲线/文件夹底下的文件 PageHelper.startPage(req.getCurrent(), req.getSize()); List fileMetadataInfoList = fileMetadataInfoService.lambdaQuery() - .eq(FileMetadataInfo::getParentId, secondDirId) + .in(FileMetadataInfo::getParentId, secondDirIds) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .isNull(FileMetadataInfo::getDeletedAt) .eq(FileMetadataInfo::getIsLatest, true) diff --git a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java index b8b82db0..83f0525f 100644 --- a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java @@ -390,17 +390,6 @@ public class DimensionTemplateServiceImpl extends ServiceImpl 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 响应对象类型 */ public void setTagReqFromFileMetadataBatch(List respList, Function idGetter) { + setTagReqFromFileMetadataBatch(respList, idGetter, true); + } + + /** + * 批量为响应对象设置 tagReq 和学科属性(可控制是否设置学科信息) + * + * @param respList 响应对象列表 + * @param idGetter 获取文件 ID 的函数 + * @param enableDiscipline 是否设置学科信息 + * @param 响应对象类型 + */ + public void setTagReqFromFileMetadataBatch(List respList, Function idGetter, boolean enableDiscipline) { if (CollectionUtils.isEmpty(respList) || idGetter == null) { return; } @@ -265,6 +287,25 @@ public class FileMetadataHierarchyHelper { Map fileMap = files.stream() .collect(Collectors.toMap(FileMetadataInfo::getId, item -> item, (left, right) -> left)); + // 如果需要设置学科信息,先收集所有 taskId 并获取任务数据 + Map taskMap = null; + if (enableDiscipline) { + Set 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> mapSdmResponse = simulationTaskFeignClient.batchGetTaskDetailByUuids(req); + taskMap = mapSdmResponse.getData(); + if (taskMap == null) { + taskMap = new HashMap<>(); + } + } + } + Map 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 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 void setTagReqFromFileMetadata(FileMetadataInfo file, T resp, boolean enableDiscipline) { if (Objects.isNull(file) || Objects.isNull(resp)) { return; } + Map uuidNameMap = buildUuidNameMap(Collections.singletonList(file)); - setTagReqFromFileMetadataInternal(file, resp, uuidNameMap); + + // 如果需要设置学科信息,获取任务数据 + Map taskMap = null; + if (enableDiscipline && StringUtils.isNotBlank(file.getTaskId())) { + GetTaskDetailReq req = new GetTaskDetailReq(); + req.setRelatedResourceUuidList(Collections.singletonList(file.getTaskId())); + SdmResponse> mapSdmResponse = simulationTaskFeignClient.batchGetTaskDetailByUuids(req); + taskMap = mapSdmResponse.getData(); + if (taskMap == null) { + taskMap = new HashMap<>(); + } + } + + setTagReqFromFileMetadataInternal(file, resp, uuidNameMap, taskMap); } + private void setTagReqFromFileMetadataInternal(FileMetadataInfo file, T resp, Map uuidNameMap, Map taskMap) { + try { + Class tagReqClass = Class.forName("com.sdm.common.entity.req.data.TagReq"); + Object tagReq = tagReqClass.getDeclaredConstructor().newInstance(); + + List 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 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 buildUuidNameMap(List files) { Set relatedUuids = new HashSet<>(); for (FileMetadataInfo file : files) { @@ -334,42 +453,6 @@ public class FileMetadataHierarchyHelper { )); } - private void setTagReqFromFileMetadataInternal(FileMetadataInfo file, T resp, Map uuidNameMap) { - try { - Class tagReqClass = Class.forName("com.sdm.common.entity.req.data.TagReq"); - Object tagReq = tagReqClass.getDeclaredConstructor().newInstance(); - - List 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 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链 */ diff --git a/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java b/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java index 5230899b..0a951ddb 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationTaskController.java @@ -150,6 +150,16 @@ public class SimulationTaskController implements ISimulationTaskFeignClient { return taskService.getTaskDetail(req); } + /** + * 根据任务uuid 批量获取任务详情 + */ + @PostMapping("/batchGetTaskDetailByUuids") + @Operation(summary = "批量获取任务详情", description = "批量获取任务详情") + public SdmResponse> batchGetTaskDetailByUuids(@RequestBody GetTaskDetailReq req) { + return taskService.batchGetTaskDetailByUuids(req); + } + + /** * 根据学科获取所有的任务 */ diff --git a/project/src/main/java/com/sdm/project/service/ITaskService.java b/project/src/main/java/com/sdm/project/service/ITaskService.java index 05e3dabc..271aab7f 100644 --- a/project/src/main/java/com/sdm/project/service/ITaskService.java +++ b/project/src/main/java/com/sdm/project/service/ITaskService.java @@ -18,6 +18,7 @@ import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp; import com.sdm.common.entity.resp.project.SpdmTaskVo; import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -65,6 +66,8 @@ public interface ITaskService { SdmResponse getTaskDetail(GetTaskDetailReq req); + SdmResponse> batchGetTaskDetailByUuids(@RequestBody GetTaskDetailReq req); + SdmResponse>> getAllTasksByDiscipline(GetAllTasksByDisciplineReq req); BosimSaveProjectTaskRsp syncCidTask(SyncCidTaskReq req); diff --git a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java index 27058fba..2fd2ec58 100644 --- a/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/TaskServiceImpl.java @@ -3159,6 +3159,17 @@ public class TaskServiceImpl implements ITaskService { return SdmResponse.success(taskVo); } + @Override + public SdmResponse> batchGetTaskDetailByUuids(GetTaskDetailReq req) { + return SdmResponse.success( + simulationTaskService.lambdaQuery().in(SimulationTask::getUuid, req.getRelatedResourceUuidList()).list().stream().map(task -> { + SpdmTaskVo taskVo = new SpdmTaskVo(); + BeanUtils.copyProperties(task, taskVo); + return taskVo; + }).collect(Collectors.toMap(SpdmTaskVo::getUuid, taskVo -> taskVo)) + ); + } + @Override public SdmResponse>> getAllTasksByDiscipline(GetAllTasksByDisciplineReq req) { Map> discipline2TaskUUIDMap = simulationTaskService.lambdaQuery() From 15d58ef3bc18dca365c3c2d8ca90ffefb17f47c2 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Tue, 17 Mar 2026 11:41:14 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DataAnalysisServiceImpl.java | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java index d12689c5..c2309b34 100644 --- a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java @@ -82,15 +82,21 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { @Override public SdmResponse>> getSimulationTaskFile(GetSimulationTaskFileReq req) { - // 传了学科字段,需要根据学科获取对应的任务,再和已传的学科做交集处理 + // 传了学科字段,需要根据学科获取对应的任务uuid + List discipoTaskUUids = new ArrayList<>(); + Set discipoTaskDirIds = new HashSet<>(); if(ObjectUtils.isNotEmpty(req.getOwnDisciplineName())) { - List disciplineToTaskUUID = getDisciplineToTaskUUID(List.of(req.getOwnDisciplineName())); - if(ObjectUtils.isNotEmpty(req.getTagReq()) - && ObjectUtils.isNotEmpty(req.getTagReq().getTaskId())){ - disciplineToTaskUUID.retainAll(parseCsv(req.getTagReq().getTaskId())); + discipoTaskUUids = getDisciplineToTaskUUID(List.of(req.getOwnDisciplineName())); + if (CollectionUtils.isNotEmpty(discipoTaskUUids)) { + List discipoTaskDirFileMetaInfo = fileMetadataInfoService.lambdaQuery() + .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) + .in(FileMetadataInfo::getRelatedResourceUuid, discipoTaskUUids) + .isNull(FileMetadataInfo::getDeletedAt) + .list(); + if (CollectionUtils.isNotEmpty(discipoTaskDirFileMetaInfo)) { + discipoTaskDirIds = discipoTaskDirFileMetaInfo.stream().map(FileMetadataInfo::getId).collect(Collectors.toSet()); + } } - - req.getTagReq().setTaskId(String.join(",", disciplineToTaskUUID)); } @@ -105,7 +111,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { if (ObjectUtils.isEmpty(taskDirIds)) { return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>()); } - return getTaskLevelFile(req, taskDirIds); + return getTaskLevelFile(req, taskDirIds,discipoTaskDirIds); } List fileIdsByDictTags = null; @@ -140,7 +146,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { } // 所属项目、阶段、机台、工位、任务、算列 - applyTagFilters(wrapper, req.getTagReq()); + applyTagFilters(wrapper, req.getTagReq(),discipoTaskUUids); if (ObjectUtils.isEmpty(req.getOrderBy())) { wrapper.orderByDesc(FileMetadataInfo::getCreateTime); @@ -215,7 +221,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { .toList(); } - private void applyTagFilters(LambdaQueryChainWrapper wrapper, TagReq tagReq) { + private void applyTagFilters(LambdaQueryChainWrapper wrapper, TagReq tagReq, List discipoTaskDirIds) { if (ObjectUtils.isEmpty(tagReq)) { return; } @@ -234,6 +240,9 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { // task/run 按普通IN过滤 inByCsv(wrapper, FileMetadataInfo::getTaskId, tagReq.getTaskId()); inByCsv(wrapper, FileMetadataInfo::getRunId, tagReq.getRunId()); + + // 根据所属学科查询所属任务 + wrapper.in(FileMetadataInfo::getTaskId,discipoTaskDirIds); } /** @@ -359,10 +368,11 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { }; } - private SdmResponse>> getTaskLevelFile(GetSimulationTaskFileReq req, Set dirIds ) { + private SdmResponse>> getTaskLevelFile(GetSimulationTaskFileReq req, Set dirIds, Set discipoTaskDirIds) { // level=task,查task下的交付物文件夹 再根据fileType查具体的云图文件、曲线文件夹下的文件 List deliverableFileInfoList = fileMetadataInfoService.lambdaQuery() - .in(FileMetadataInfo::getParentId, dirIds) + .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()) @@ -415,25 +425,6 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { } } return PageUtils.getJsonObjectSdmResponse(new ArrayList<>(), new PageInfo<>()); - -// PageHelper.startPage(req.getCurrent(), req.getSize()); -// List fileMetadataInfoList = fileMetadataInfoService.lambdaQuery().eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId()) -// .eq(FileMetadataInfo::getFileType, req.getFileBizType()) -// .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) -// .list(); -// PageInfo page = new PageInfo<>(fileMetadataInfoList); -// long total = page.getTotal(); -// -// List fileIdList = fileMetadataInfoList.stream().map(FileMetadataInfo::getId).toList(); -// List finalResultList = hierarchyHelper.processFileHierarchy( -// fileIdList, -// SimulationTaskResultCurveResp.class, -// FileMetadataHierarchyHelper::setFileHierarchy -// ); -// -// PageInfo page1 = new PageInfo<>(finalResultList); -// page1.setTotal(total); -// return PageUtils.getJsonObjectSdmResponse(finalResultList, page1); } @Override