1、优化getTaskTree

This commit is contained in:
2026-02-10 21:46:01 +08:00
parent 1faedb97dc
commit 2b9d7d4ea7
2 changed files with 244 additions and 163 deletions

View File

@@ -19,6 +19,8 @@ public class ProjectTreeTagReq {
private List<String> filterDiscipline;
private Integer queryTaskFlag = 0;
/**
* 根据projectNodeId和phaseNodeId构建

View File

@@ -61,6 +61,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.sdm.project.service.impl.NodeServiceImpl.getTagProperty;
@@ -457,8 +458,12 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
log.error("未查询到顶级节点");
return SdmResponse.success(new ArrayList<>());
}
// queryTaskFlag为1待办不查询任务只查询节点
Integer queryTaskFlag = req.getQueryTaskFlag();
log.info("查询到的节点为:{}", taskTreeNodeList.stream().map(ProjectNodePo::getId).toList());
taskTreeReq.setFilterDiscipline(req.getFilterDiscipline());
if (queryTaskFlag != 1) {
taskTreeTaskList = mapper.getTaskListByTag(taskTreeReq);
if (CollectionUtils.isNotEmpty(taskTreeTaskList)) {
log.info("查询到的任务为:{}", taskTreeTaskList.stream().map(TaskNodePo::getId).toList());
@@ -469,6 +474,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
taskTreePerformanceList.forEach(performance -> performance.setNodeType("performance"));
}
}
}
taskTreeTagMap = req.getTagMap();
firstNodeTag = taskTreeTagMap.get(0).getValue();
lastNodeTag = taskTreeTagMap.get(taskTreeTagMap.size()-1).getValue();
@@ -495,8 +502,81 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
List<ProjectNodePo> realTopProjectNodeList = taskTreeNodeList.stream().filter(node -> node.getNodeType().equals(realFirstTaskNodeType)).toList();
List<String> addedIdList = new ArrayList<>();
List<String> currentAddedIdList = new ArrayList<>();
Map<String,List<SimulationTaskMember>> taskMemberMap = new HashMap<>();
Map<Long,CIDUserResp> cidUserMap = new HashMap<>();
Map<Long,String> dataMap = new HashMap<>();
Map<String,List<TaskNodeExtraPo>> taskExtraMap = new HashMap<>();
List<SimulationPerformanceExtra> performanceExtraList = new ArrayList<>();
List<SpdmNodeExtraVo> nodeExtraList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(taskTreeTaskList)) {
List<SimulationTaskMember> memberList = simulationTaskMemberService.lambdaQuery().in(SimulationTaskMember::getTaskId, taskTreeTaskList.stream().map(TaskNodePo::getUuid).collect(Collectors.toSet())).list();
if (CollectionUtils.isNotEmpty(memberList)) {
taskMemberMap = memberList.stream().collect(Collectors.groupingBy(SimulationTaskMember::getTaskId));
List<Long> allUserIdList = memberList.stream().map(SimulationTaskMember::getUserId).distinct().toList();
SdmResponse<List<CIDUserResp>> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(allUserIdList).build());
List<CIDUserResp> cidUserRespList = cidUserResp.getData();
if (CollectionUtils.isNotEmpty(cidUserRespList)) {
cidUserMap = cidUserRespList.stream().collect(Collectors.toMap(CIDUserResp::getUserId, Function.identity()));
}
}
// 转换执行规范的文件id为文件名称
List<String> standardList = taskTreeTaskList.stream().map(TaskNodePo::getStandard).toList();
if (CollectionUtils.isNotEmpty(standardList)) {
List<Long> fileIdList = new ArrayList<>();
standardList = standardList.stream().filter(StringUtils::isNotBlank).toList();
if (CollectionUtils.isNotEmpty(standardList)) {
for (String standard : standardList) {
if (standard.contains(";")) {
// 4883,4556;
List<String> fileDirIdList = Arrays.stream(standard.split(";")).toList();
for (String fileDirId : fileDirIdList) {
if (!isConvertibleToLong(fileDirId.split(",")[1])) {
continue;
}
fileIdList.add(Long.valueOf(fileDirId.split(",")[1]));
}
}else {
List<String> normalFileIdList = Arrays.stream(standard.split(",")).toList().stream().filter(ProjectServiceImpl::isConvertibleToLong).toList();
if (CollectionUtils.isEmpty(normalFileIdList)) {
continue;
}
fileIdList.addAll(normalFileIdList.stream().map(Long::valueOf).toList());
}
}
QueryFileReq queryFileReq = new QueryFileReq();
queryFileReq.setFileIdList(fileIdList);
SdmResponse<List<FileMetadataInfoResp>> listSdmResponse = dataClientFeignClient.queryFileListByIdList(queryFileReq);
if (listSdmResponse.isSuccess()) {
List<FileMetadataInfoResp> dataList = listSdmResponse.getData();
if (CollectionUtils.isNotEmpty(dataList)) {
dataList = dataList.stream().filter(data -> data.getDataType() == DataTypeEnum.FILE.getValue()).toList();
if (CollectionUtils.isNotEmpty(dataList)) {
dataMap = dataList.stream().collect(Collectors.toMap(FileMetadataInfoResp::getId, FileMetadataInfoResp::getOriginalName));
}
}
}
}
}
taskExtraMap = Optional.ofNullable(taskMapper.getTaskExtraList(
taskTreeTaskList.stream().map(TaskNodePo::getUuid).toList()
)).orElse(Collections.emptyList()).stream().collect(Collectors.groupingBy(TaskNodeExtraPo::getTaskId));
if (CollectionUtils.isNotEmpty(taskTreePerformanceList)) {
performanceExtraList = performanceExtraService.lambdaQuery().in(SimulationPerformanceExtra::getPerformanceId,
taskTreePerformanceList.stream().map(PerformanceNodePo::getUuid).toList()).list();
}
nodeExtraList = nodeMapper.getNodeExtraListByNodeIdList(realTopProjectNodeList.stream().map(ProjectNodePo::getUuid).toList());
}
for (ProjectNodePo projectNodePo : realTopProjectNodeList) {
generateTaskTree(projectNodePo,addedIdList,currentAddedIdList);
generateTaskTree(projectNodePo,addedIdList,currentAddedIdList,queryTaskFlag,taskMemberMap,cidUserMap,
dataMap,taskExtraMap,performanceExtraList,nodeExtraList);
addedIdList.clear();
}
// 汇总任务进度、仿真负责人、执行人
@@ -658,7 +738,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}
}
private void generateTaskTree(ProjectNodePo projectNodePo,List<String> addedIdList,List<String> currentAddedIdList) {
private void generateTaskTree(ProjectNodePo projectNodePo,List<String> addedIdList,List<String> currentAddedIdList,Integer queryTaskFlag,Map<String,List<SimulationTaskMember>> taskMemberMap,Map<Long,CIDUserResp> cidUserMap,Map<Long,String> dataMap,Map<String,List<TaskNodeExtraPo>> taskExtraMap,
List<SimulationPerformanceExtra> performanceExtraList,List<SpdmNodeExtraVo> nodeExtraList) {
currentAddedIdList.add(projectNodePo.getUuid());
String currentNodeType = projectNodePo.getNodeType();
String currentTag = taskTreeNodeTypeTagMap.get(currentNodeType);
@@ -702,6 +783,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
String realTagId = realTagObj.getValue();
// 查询当前节点下任务
List<TaskNodePo> currentNodeAssociatedTaskList = new ArrayList<>();
if (queryTaskFlag != 1) {
int currentNodeDepth = getCurrentNodeDepth(projectNodePo);
if (CollectionUtils.isNotEmpty(taskTreeTaskList)) {
currentNodeAssociatedTaskList = taskTreeTaskList.stream().filter(node -> {
@@ -718,53 +800,6 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(currentNodeAssociatedTaskList)) {
// 转换执行规范的文件id为文件名称
List<String> standardList = currentNodeAssociatedTaskList.stream().map(TaskNodePo::getStandard).toList();
Map<Long, String> dataMap = Map.of();
if (CollectionUtils.isNotEmpty(standardList)) {
List<Long> fileIdList = new ArrayList<>();
standardList = standardList.stream().filter(StringUtils::isNotBlank).toList();
if (CollectionUtils.isNotEmpty(standardList)) {
for (String standard : standardList) {
if (standard.contains(";")) {
// 4883,4556;
List<String> fileDirIdList = Arrays.stream(standard.split(";")).toList();
for (String fileDirId : fileDirIdList) {
if (!isConvertibleToLong(fileDirId.split(",")[1])) {
continue;
}
fileIdList.add(Long.valueOf(fileDirId.split(",")[1]));
}
}else {
List<String> normalFileIdList = Arrays.stream(standard.split(",")).toList().stream().filter(ProjectServiceImpl::isConvertibleToLong).toList();
if (CollectionUtils.isEmpty(normalFileIdList)) {
continue;
}
fileIdList.addAll(normalFileIdList.stream().map(Long::valueOf).toList());
}
}
QueryFileReq queryFileReq = new QueryFileReq();
queryFileReq.setFileIdList(fileIdList);
SdmResponse<List<FileMetadataInfoResp>> listSdmResponse = dataClientFeignClient.queryFileListByIdList(queryFileReq);
if (listSdmResponse.isSuccess()) {
List<FileMetadataInfoResp> dataList = listSdmResponse.getData();
if (CollectionUtils.isNotEmpty(dataList)) {
dataList = dataList.stream().filter(data -> data.getDataType() == DataTypeEnum.FILE.getValue()).toList();
if (CollectionUtils.isNotEmpty(dataList)) {
dataMap = dataList.stream().collect(Collectors.toMap(FileMetadataInfoResp::getId, FileMetadataInfoResp::getOriginalName));
}
}
}
}
}
// 查询当前任务的所有拓展属性
Map<String, List<TaskNodeExtraPo>> taskExtraMap = Optional.ofNullable(
taskMapper.getTaskExtraList(
currentNodeAssociatedTaskList.stream()
.map(TaskNodePo::getUuid)
.toList()
)
).orElse(Collections.emptyList()).stream().collect(Collectors.groupingBy(TaskNodeExtraPo::getTaskId));
for (TaskNodePo taskNodePo : currentNodeAssociatedTaskList) {
List<Long> fileIdList = new ArrayList<>();
List<String> fileNameList = new ArrayList<>();
@@ -826,8 +861,6 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
List<PerformanceNodePo> currentTaskAssociatedPerformanceList = taskTreePerformanceList.stream().filter(performance -> ObjectUtils.isNotEmpty(taskMap.get(performance.getTaskId())) && performance.getRunId() == null).toList();
if (CollectionUtils.isNotEmpty(currentTaskAssociatedPerformanceList)) {
// 设置拓展属性
List<String> performanceIdList = currentTaskAssociatedPerformanceList.stream().map(PerformanceNodePo::getUuid).toList();
List<SimulationPerformanceExtra> performanceExtraList = performanceExtraService.lambdaQuery().in(SimulationPerformanceExtra::getPerformanceId, performanceIdList).list();
Map<String, List<SimulationPerformanceExtra>> performanceExtraMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(performanceExtraList)) {
performanceExtraMap = performanceExtraList.stream().collect(Collectors.groupingBy(SimulationPerformanceExtra::getPerformanceId));
@@ -850,7 +883,7 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}
// 查询当前任务的负责人和执行人
for (TaskNodePo taskNodePo : currentNodeAssociatedTaskList) {
List<SimulationTaskMember> memberList = simulationTaskMemberService.lambdaQuery().eq(SimulationTaskMember::getTaskId, taskNodePo.getUuid()).list();
List<SimulationTaskMember> memberList = taskMemberMap.get(taskNodePo.getUuid());
if (CollectionUtils.isNotEmpty(memberList)) {
List<Long> eUserIdList = memberList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).map(SimulationTaskMember::getUserId).distinct().toList();
List<Long> pUserIdList = memberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).map(SimulationTaskMember::getUserId).distinct().toList();
@@ -858,12 +891,51 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
List<Long> attionUserIdList = memberList.stream().filter(member -> MemberTypeEnum.ATTENTION.getCode().equals(member.getType())).map(SimulationTaskMember::getUserId).distinct().toList();
if (CollectionUtils.isNotEmpty(eUserIdList)) {
SdmResponse<List<CIDUserResp>> cidUserResp= sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(eUserIdList).build());
taskNodePo.setEMemberList(cidUserResp.getData());
List<CIDUserResp> eMemberList = new ArrayList<>();
for (Long eUserId : eUserIdList) {
CIDUserResp cidUserResp = cidUserMap.get(eUserId);
if (ObjectUtils.isEmpty(cidUserResp)) {
continue;
}
eMemberList.add(cidUserResp);
}
taskNodePo.setEMemberList(eMemberList);
if (CollectionUtils.isNotEmpty(taskNodePo.getEMemberList())) {
taskNodePo.setEMembers(taskNodePo.getEMemberList().stream().map(CIDUserResp::getNickname).collect(Collectors.joining(",")));
}
}
if (CollectionUtils.isNotEmpty(pUserIdList)) {
List<CIDUserResp> pMemberList = new ArrayList<>();
for (Long pUserId : pUserIdList) {
CIDUserResp cidUserResp = cidUserMap.get(pUserId);
if (ObjectUtils.isEmpty(cidUserResp)) {
continue;
}
pMemberList.add(cidUserResp);
}
taskNodePo.setPMemberList(pMemberList);
if (CollectionUtils.isNotEmpty(taskNodePo.getPMemberList())) {
taskNodePo.setPMembers(taskNodePo.getPMemberList().stream().map(CIDUserResp::getNickname).collect(Collectors.joining(",")));
}
}
if (CollectionUtils.isNotEmpty(attionUserIdList)) {
List<CIDUserResp> aMemberList = new ArrayList<>();
for (Long aUserId : attionUserIdList) {
CIDUserResp cidUserResp = cidUserMap.get(aUserId);
if (ObjectUtils.isEmpty(cidUserResp)) {
continue;
}
aMemberList.add(cidUserResp);
}
taskNodePo.setPayAttentionMemberList(aMemberList);
if (CollectionUtils.isNotEmpty(taskNodePo.getPayAttentionMemberList())) {
taskNodePo.setAttionMembers(taskNodePo.getPayAttentionMemberList().stream().map(CIDUserResp::getNickname).collect(Collectors.joining(",")));
}
}
if (CollectionUtils.isNotEmpty(pUserIdList)) {
SdmResponse<List<CIDUserResp>> cidUserResp= sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(pUserIdList).build());
taskNodePo.setPMemberList(cidUserResp.getData());
@@ -884,6 +956,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}
}
}
}
// 查询子节点,可能是同类型节点也可能是不同类型节点
// 先查同类型节点当前标签下包含currentNodeTagId且深度+1
int depth = getCurrentNodeDepth(projectNodePo);
@@ -905,7 +979,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
if (CollectionUtils.isNotEmpty(sameTypeNodeList)) {
// 递归
for (ProjectNodePo nodePo : sameTypeNodeList) {
generateTaskTree(nodePo,addedIdList,currentAddedIdList);
generateTaskTree(nodePo,addedIdList,currentAddedIdList,queryTaskFlag,taskMemberMap,cidUserMap,
dataMap,taskExtraMap,performanceExtraList,nodeExtraList);
}
if (CollectionUtils.isNotEmpty(sameTypeNodeList)) {
addedIdList.addAll(sameTypeNodeList.stream().map(ProjectNodePo::getUuid).toList());
@@ -933,7 +1008,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
if (CollectionUtils.isNotEmpty(childrenTypeNodeList)) {
// 递归
for (ProjectNodePo nodePo : childrenTypeNodeList) {
generateTaskTree(nodePo,addedIdList,currentAddedIdList);
generateTaskTree(nodePo,addedIdList,currentAddedIdList,queryTaskFlag,taskMemberMap,cidUserMap,
dataMap,taskExtraMap,performanceExtraList,nodeExtraList);
}
addedIdList.addAll(childrenTypeNodeList.stream().map(ProjectNodePo::getUuid).toList());
for (ProjectNodePo nodePo : childrenTypeNodeList) {
@@ -965,7 +1041,8 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
if (CollectionUtils.isNotEmpty(otherChildrenNodeList)) {
// 递归
for (ProjectNodePo nodePo : otherChildrenNodeList) {
generateTaskTree(nodePo,addedIdList,currentAddedIdList);
generateTaskTree(nodePo,addedIdList,currentAddedIdList,queryTaskFlag,taskMemberMap,cidUserMap,
dataMap,taskExtraMap,performanceExtraList,nodeExtraList);
}
addedIdList.addAll(otherChildrenNodeList.stream().map(ProjectNodePo::getUuid).toList());
for (ProjectNodePo nodePo : otherChildrenNodeList) {
@@ -991,7 +1068,9 @@ public class ProjectServiceImpl extends BaseService implements IProjectService {
}
projectNodePo.setChildren(children);
// 设置拓展属性
projectNodePo.setExtras(nodeMapper.getNodeExtraListByNodeIdList(Collections.singletonList(projectNodePo.getUuid())));
if (queryTaskFlag != 1) {
projectNodePo.setExtras(nodeExtraList.stream().filter(nodeExtra -> projectNodePo.getUuid().equals(nodeExtra.getNodeId())).toList());
}
}
private TaskNodeTag getRealTagId(ProjectNodePo projectNodePo) {