新增:仿真任务列表中显示 工位号

This commit is contained in:
yangyang01000846
2026-01-26 20:27:07 +08:00
parent 3091890bf2
commit 72b28ebc63
4 changed files with 154 additions and 7 deletions

View File

@@ -114,4 +114,31 @@ public class SpdmTaskListReq {
private String approvalStatus;
private List<String> approvalStatusList;
// key - value 查询字段的 tag的值
/*
* [
{
"key": "project",
"value": "tag1"
},
{
"key": "phase",
"value": "tag2"
},
{
"key": "machine",
"value": "tag4"
},
{
"key": "workspace",
"value": "tag5"
},
{
"key": "discipline",
"value": "tag6"
}
]
* */
private List<TaskNodeTag> nodeTypeMap;
}

View File

@@ -232,4 +232,8 @@ public class SpdmNewTaskVo extends BaseEntity {
private String discipline;
// 新增工位号的列
private String nodeCode;
}

View File

@@ -8,15 +8,15 @@ import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.ExportExcelFormat;
import com.sdm.common.entity.constants.ProjectConstants;
import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.FilePermissionEnum;
import com.sdm.common.entity.enums.MessageTemplateEnum;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.enums.*;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.DelDirReq;
import com.sdm.common.entity.req.data.QueryFileReq;
import com.sdm.common.entity.req.data.UpdatePermissionReq;
import com.sdm.common.entity.req.export.*;
import com.sdm.common.entity.req.export.PerformanceAnalysisExportExcelFormat;
import com.sdm.common.entity.req.export.RunAnalysisExportExcelFormat;
import com.sdm.common.entity.req.export.TaskAnalysisExportExcelFormat;
import com.sdm.common.entity.req.export.TaskAnalysisExportExcelParam;
import com.sdm.common.entity.req.project.GetAllTasksByDisciplineReq;
import com.sdm.common.entity.req.project.GetTaskDetailReq;
import com.sdm.common.entity.req.project.SimulationPerformance;
@@ -43,7 +43,6 @@ import com.sdm.common.utils.SystemOperate;
import com.sdm.common.utils.excel.ExcelUtil;
import com.sdm.project.bo.ExportOperate;
import com.sdm.project.common.MemberTypeEnum;
import com.sdm.common.entity.enums.PerformanceStatusEnum;
import com.sdm.project.common.TaskExeStatusEnum;
import com.sdm.project.dao.SimulationDemandMapper;
import com.sdm.project.dao.SimulationNodeMapper;
@@ -51,7 +50,10 @@ import com.sdm.project.dao.SimulationProjectMapper;
import com.sdm.project.dao.SimulationTaskMapper;
import com.sdm.project.model.bo.*;
import com.sdm.project.model.entity.*;
import com.sdm.project.model.po.*;
import com.sdm.project.model.po.PerformanceNodePo;
import com.sdm.project.model.po.ProjectNodePo;
import com.sdm.project.model.po.TaskNodeMemberPo;
import com.sdm.project.model.po.TaskRunPo;
import com.sdm.project.model.req.*;
import com.sdm.project.model.req.YA.ProjectTaskInfo;
import com.sdm.project.model.req.YA.SyncCidTaskReq;
@@ -59,6 +61,7 @@ import com.sdm.project.model.resp.*;
import com.sdm.project.model.resp.YA.BosimSaveProjectTaskRsp;
import com.sdm.project.model.vo.*;
import com.sdm.project.service.*;
import com.sdm.project.util.TaskNodeTagUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -584,6 +587,13 @@ public class TaskServiceImpl implements ITaskService {
}
List<SpdmTaskMemberVo> eachTaskMemberList;
String newTag;
// 处理工位号,所有的tag标签
List<TaskNodeTag> nodeTypes = req.getNodeTypeMap();
log.info("查询任务列表 nodeTypeMap:{}",JSONObject.toJSONString(nodeTypes));
// 工位对应的对象, value就是哪一个标签
TaskNodeTag taskNodeTag = TaskNodeTagUtils.getTaskNodeTagByKey(nodeTypes, "workspace");
List<String> allWorkSpaceUuid = new ArrayList<>();
for (SpdmTaskVo task : taskList) {
for (String tag : tagList) {
newTag = "new" + tag.replace("t", "T");
@@ -624,8 +634,28 @@ public class TaskServiceImpl implements ITaskService {
// 设置仿真负责人和执行人
setPMemberList(task, copyTaskMemberList);
setEMemberList(task, copyTaskMemberList);
// 汇总工位信息
if(taskNodeTag!=null&&StringUtils.isNotBlank(taskNodeTag.getValue())){
String workSpaceUuid = "";
try {
workSpaceUuid = getTagProperty(task, taskNodeTag.getValue());
} catch (Exception e) {
log.warn("get workspace uuid error:{}",e.getMessage());
}
if(StringUtils.isNotBlank(workSpaceUuid)){
allWorkSpaceUuid.add(workSpaceUuid);
}
}
}
List<SpdmNewTaskVo> newTaskList = new ArrayList<>();
// 查询工位信息,然后封装返回
Map<String, SimulationNode> allNodeMap=new HashMap<>();
if(CollectionUtils.isNotEmpty(allWorkSpaceUuid)){
List<SimulationNode> listSimulationNodes = nodeService.lambdaQuery().in(SimulationNode::getUuid, allWorkSpaceUuid).list();
allNodeMap = convertToUuidMapByStream(listSimulationNodes);
}
for (SpdmTaskVo taskVo : taskList) {
SpdmNewTaskVo spdmNewTaskVo = new SpdmNewTaskVo();
BeanUtils.copyProperties(taskVo, spdmNewTaskVo);
@@ -645,12 +675,57 @@ public class TaskServiceImpl implements ITaskService {
if (StringUtils.isNotBlank(spdmNewTaskVo.getDemandId())) {
spdmNewTaskVo.setDemandName(demandMap.get(spdmNewTaskVo.getDemandId()));
}
// 设置工位号
setWorkSpaceNodeCode(spdmNewTaskVo,taskVo,allNodeMap,taskNodeTag);
newTaskList.add(spdmNewTaskVo);
}
jsonObject.put("data", newTaskList);
return SdmResponse.success(jsonObject);
}
// 设置工位号
private void setWorkSpaceNodeCode(SpdmNewTaskVo spdmNewTaskVo, SpdmTaskVo taskVo,
Map<String, SimulationNode> allNodeMap, TaskNodeTag taskNodeTag) {
// 校验Map非空
if (MapUtils.isNotEmpty(allNodeMap)) {
// 当前工位的uuid
String workSpaceUuid = "";
try {
// 获取工位UUID假设getTagProperty是当前类的方法或已导入的工具方法
workSpaceUuid = getTagProperty(taskVo, taskNodeTag.getValue());
} catch (Exception e) {
log.warn("get taskVo uuid error:{}", e.getMessage());
}
// 设置工位号(节点编码)
if (StringUtils.isNotBlank(workSpaceUuid)) {
SimulationNode simulationNode = allNodeMap.get(workSpaceUuid);
// 新增空指针防护避免simulationNode为null时调用getNodeCode()
if (simulationNode != null) {
spdmNewTaskVo.setNodeCode(simulationNode.getNodeCode());
} else {
log.warn("simulationNode is null for workSpaceUuid:{}", workSpaceUuid);
}
}
}
}
//工位数据转换成Map<uuid,SimulationNode>
private Map<String, SimulationNode> convertToUuidMapByStream(List<SimulationNode> simulationNodes) {
if (simulationNodes == null || simulationNodes.isEmpty()) {
return Collections.emptyMap();
}
return simulationNodes.stream()
// 过滤掉null对象和uuid为空的对象
.filter(node -> node != null && node.getUuid() != null)
// toMap(取key, 取value, 重复key时的合并规则)
.collect(Collectors.toMap(
SimulationNode::getUuid,
node -> node,
(oldValue, newValue) -> newValue
));
}
private void setPMemberList(SpdmTaskVo task, List<SpdmTaskMemberVo> eachMemberList) {
// 由于我分发的、我执行的、我关注的、所有任务,都需要展示仿真负责人,故将负责人抽成方法调用
List<Long> pUserIdList = eachMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && StringUtils.equals(task.getUuid(), member.getTaskId())).map(SpdmTaskMemberVo::getUserId).distinct().toList();

View File

@@ -0,0 +1,41 @@
package com.sdm.project.util;
import com.sdm.project.model.bo.TaskNodeTag;
import java.util.List;
import java.util.Objects;
public class TaskNodeTagUtils {
// 私有构造方法,防止工具类被实例化
private TaskNodeTagUtils() {
throw new UnsupportedOperationException("工具类不能被实例化");
}
/**
* 根据key值从TaskNodeTag列表中获取对应的对象
*
* @param nodeTagList TaskNodeTag列表允许为null
* @param key 要匹配的key值允许为null
* @return 匹配的TaskNodeTag对象无匹配则返回null
*/
public static TaskNodeTag getTaskNodeTagByKey(List<TaskNodeTag> nodeTagList, String key) {
// 1. 空值校验:列表为空/key为空时直接返回null避免空指针
if (nodeTagList == null || nodeTagList.isEmpty() || key == null) {
return null;
}
// 2. 遍历列表匹配key值
for (TaskNodeTag nodeTag : nodeTagList) {
// 安全的key匹配先判断nodeTag和其key不为null再比较
if (nodeTag != null && Objects.equals(key, nodeTag.getKey())) {
// 找到匹配项,立即返回
return nodeTag;
}
}
// 3. 无匹配项时返回null
return null;
}
}