From 17cbb860d1c408e238ac5f08a3113f322275479f Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Fri, 30 Jan 2026 14:34:42 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E3=80=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=88=97=E8=A1=A8=E3=80=91=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/service/impl/TaskServiceImpl.java | 1370 +++++++++-------- .../main/resources/application-dev-190.yml | 6 +- .../src/main/resources/application-dev-65.yml | 5 +- .../src/main/resources/application-local.yml | 7 +- .../src/main/resources/application-lyric.yml | 6 +- .../src/main/resources/application-prod.yml | 5 +- .../src/main/resources/application-test.yml | 5 +- .../src/main/resources/application-yian.yml | 6 +- 8 files changed, 762 insertions(+), 648 deletions(-) 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 2a8c5cb7..301a8c77 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 @@ -74,6 +74,7 @@ import org.apache.commons.lang3.StringUtils; import org.mybatis.spring.MyBatisSystemException; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; @@ -147,665 +148,669 @@ public class TaskServiceImpl implements ITaskService { @Autowired private LyricVProjectResourcePlanDMService lyricVProjectResourcePlanDMService; + // 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) + @Value("${lyricFlag:1}") + private int lyricFlag; + + + /** + * 预处理请求参数 + */ + private void preProcessReq(SpdmTaskListReq req) { + // 状态参数拆分 + if (StringUtils.isNotBlank(req.getExeStatus())) { + req.setExeStatusList(Arrays.stream(req.getExeStatus().split(",")).collect(Collectors.toList())); + } + if (StringUtils.isNotBlank(req.getAchieveStatus())) { + req.setAchieveStatusList(Arrays.stream(req.getAchieveStatus().split(",")).collect(Collectors.toList())); + } + if (StringUtils.isNotBlank(req.getApprovalStatus())) { + req.setApprovalStatusList(Arrays.stream(req.getApprovalStatus().split(",")).collect(Collectors.toList())); + } + + // 时间参数拆分 + List beginTime = req.getBeginTime(); + if (CollectionUtils.isNotEmpty(beginTime) && beginTime.size() >= 2) { + req.setBeginSTime(beginTime.get(0)); + req.setBeginETime(beginTime.get(1)); + } + List endTime = req.getEndTime(); + if (CollectionUtils.isNotEmpty(endTime) && endTime.size() >= 2) { + req.setEndSTime(endTime.get(0)); + req.setEndETime(endTime.get(1)); + } + List finishTime = req.getFinishTime(); + if (CollectionUtils.isNotEmpty(finishTime) && finishTime.size() >= 2) { + req.setFinishSTime(finishTime.get(0)); + req.setFinishETime(finishTime.get(1)); + } + + // 分页参数默认值 + if (req.getCurrent() == null || req.getCurrent() <= 0) { + req.setCurrent(1); + } + if (req.getSize() == null || req.getSize() <= 0) { + req.setSize(10); + } + + // 转换标签默认值 + if (req.getConvertTag() == null) { + req.setConvertTag(true); + } + } + + /** + * 构建空响应JSON + */ + private JSONObject buildEmptyJsonResp(SpdmTaskListReq req) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("data", new ArrayList<>()); + jsonObject.put("total", 0); + jsonObject.put("currentPage", req.getCurrent() == null ? 1 : req.getCurrent()); + jsonObject.put("pageSize", req.getSize() == null ? 10 : req.getSize()); + return jsonObject; + } + + /** + * 按节点标签过滤任务 + */ + private List filterTaskByNodeTag(List allTaskList, SpdmTaskListReq req) { + List idMapList = req.getIdMap(); + if (CollectionUtils.isEmpty(idMapList)) { + log.error("任务列表中的idMap不能为空"); + return new ArrayList<>(); + } + + // 过滤非空key的标签 + List realIdMapList = idMapList.stream() + .filter(idMap -> StringUtils.isNotBlank(idMap.getKey())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(realIdMapList)) { + return allTaskList; + } + + TaskNodeTag realTaskNodeTag = realIdMapList.get(realIdMapList.size() - 1); + log.info("实际查询节点类型为:{}", JSON.toJSONString(realTaskNodeTag)); + + List filteredList = new ArrayList<>(); + for (SpdmTaskVo spdmTaskVo : allTaskList) { + try { + String currentNodeTagId = getTagProperty(spdmTaskVo, realTaskNodeTag.getValue()); + if (StringUtils.isNotBlank(currentNodeTagId) && currentNodeTagId.contains(realTaskNodeTag.getKey())) { + filteredList.add(spdmTaskVo); + } + } catch (Exception e) { + log.error("节点标签过滤异常,taskId:{}", spdmTaskVo.getUuid(), e); + } + } + return filteredList; + } + + /** + * 批量查询所有关联数据 + */ + private BatchAssociatedData batchQueryAssociatedData(List taskList,SpdmTaskListReq req) { + List taskIdList = taskList.stream().map(SpdmTaskVo::getUuid).collect(Collectors.toList()); + + // 1. 批量查询任务成员 + List taskMemberVoList = mapper.getMemberList(taskIdList, null); + + // 2. 批量查询关注成员 + List attentionMemberList = mapper.getAttentionMemberList(taskIdList); + + // 3. 批量查询任务扩展信息 + List taskExtraList = mapper.getTaskExtraList(taskIdList); + Map> taskExtraMap = taskExtraList.stream() + .collect(Collectors.groupingBy(TaskNodeExtraPo::getTaskId)); + + // 4. 批量查询节点信息 + List tagList = req.getIdMap().stream().map(TaskNodeTag::getValue).toList(); + Set nodeIdSet = new HashSet<>(); + for (SpdmTaskVo task : taskList) { + for (String tag : tagList) { + try { + String eachNodeId = getTagProperty(task, tag); + if (StringUtils.isNotBlank(eachNodeId)) { + nodeIdSet.addAll(Arrays.stream(eachNodeId.split(",")) + .filter(nodeId -> !nodeId.equals("null")) + .toList()); + } + } catch (Exception e) { + log.error("收集节点ID异常,taskId:{}", task.getUuid(), e); + } + } + } + Map nodeMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(nodeIdSet)) { + List nodeList = nodeMapper.getNodeListByIds(new ArrayList<>(nodeIdSet)); + nodeMap = nodeList.stream() + .collect(Collectors.toMap(SpdmNodeVo::getUuid, Function.identity())); + } + + // 5. 批量查询需求信息 + List demandIdList = taskList.stream() + .map(SpdmTaskVo::getDemandId) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + Map demandMap = new HashMap<>(); + Map demandSubmitMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(demandIdList)) { + List demandVoList = demandMapper.getDemandListById(demandIdList); + demandMap = demandVoList.stream() + .collect(Collectors.toMap(SpdmDemandVo::getUuid, Function.identity())); + demandSubmitMap = demandVoList.stream() + .collect(Collectors.toMap(SpdmDemandVo::getUuid, SpdmDemandVo::getCreator)); + } + + // 6. 批量查询工位节点信息 + TaskNodeTag taskNodeTag = TaskNodeTagUtils.getTaskNodeTagByKey(req.getNodeTypeMap(), "workspace"); + Set workSpaceUuidSet = new HashSet<>(); + if (taskNodeTag != null && StringUtils.isNotBlank(taskNodeTag.getValue())) { + for (SpdmTaskVo task : taskList) { + try { + String workSpaceUuid = getTagProperty(task, taskNodeTag.getValue()); + if (StringUtils.isNotBlank(workSpaceUuid)) { + workSpaceUuidSet.add(workSpaceUuid); + } + } catch (Exception e) { + log.warn("获取工位UUID异常,taskId:{}", task.getUuid(), e); + } + } + } + Map workSpaceNodeMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(workSpaceUuidSet)) { + List listSimulationNodes = nodeService.lambdaQuery() + .in(SimulationNode::getUuid, workSpaceUuidSet) + .list(); + workSpaceNodeMap = convertToUuidMapByStream(listSimulationNodes); + } + + // 封装返回 + BatchAssociatedData batchData = new BatchAssociatedData(); + batchData.setTaskMemberVoList(taskMemberVoList); + batchData.setAttentionMemberList(attentionMemberList); + batchData.setTaskExtraMap(taskExtraMap); + batchData.setNodeMap(nodeMap); + batchData.setDemandMap(demandMap); + batchData.setDemandSubmitMap(demandSubmitMap); + batchData.setWorkSpaceNodeMap(workSpaceNodeMap); + batchData.setTaskNodeTag(taskNodeTag); + + return batchData; + } + + /** + * 按任务类型过滤(我执行的/我关注的/我分发的/所有) + */ + private List filterTaskByType(List taskList, Integer type, Long userId, + List taskMemberVoList, + List attentionMemberList) { + // 默认查所有 + if (type == null || type == 2) { + // 为所有任务设置关注标记 + Map> attentionMap = attentionMemberList.stream() + .collect(Collectors.groupingBy(SpdmTaskAttentionMemberVo::getTaskId)); + for (SpdmTaskVo task : taskList) { + List eachAttention = attentionMap.get(task.getUuid()); + task.setAttentionFlag(CollectionUtils.isEmpty(eachAttention) ? 0 : + (eachAttention.stream().map(SpdmTaskAttentionMemberVo::getUserId).collect(Collectors.toList()).contains(userId) ? 1 : 0)); + } + return taskList; + } + + // 我执行的(仿真执行人) + if (type == 0) { + if (CollectionUtils.isEmpty(taskMemberVoList)) { + return new ArrayList<>(); + } + List executorIds = taskMemberVoList.stream() + .filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())) + .map(SpdmTaskMemberVo::getUserId) + .collect(Collectors.toList()); + if (!executorIds.contains(userId)) { + return new ArrayList<>(); + } + List myTaskIdList = taskMemberVoList.stream() + .filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType()) && userId.equals(member.getUserId())) + .map(SpdmTaskMemberVo::getTaskId) + .collect(Collectors.toList()); + return taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).collect(Collectors.toList()); + } + + // 我分发的(仿真负责人) + if (type == 3) { + if (CollectionUtils.isEmpty(taskMemberVoList)) { + return new ArrayList<>(); + } + List myTaskIdList = taskMemberVoList.stream() + .filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && userId.equals(member.getUserId())) + .map(SpdmTaskMemberVo::getTaskId) + .collect(Collectors.toList()); + return taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).collect(Collectors.toList()); + } + + // 我关注的 + if (type == 1) { + if (CollectionUtils.isEmpty(attentionMemberList)) { + return new ArrayList<>(); + } + List myTaskIdList = attentionMemberList.stream() + .filter(member -> userId.equals(member.getUserId())) + .map(SpdmTaskAttentionMemberVo::getTaskId) + .collect(Collectors.toList()); + return taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).collect(Collectors.toList()); + } + + return new ArrayList<>(); + } + + /** + * 权限过滤(项目参与人/节点授权/任务成员) + */ + private List filterTaskByPermission(List taskList, Long userId, BatchAssociatedData batchData) { + Set returnTaskSet = new LinkedHashSet<>(); + String jobNumber = ThreadLocalContext.getJobNumber(); + + // 维度1:项目参与人员(根据工号匹配任务名称) + log.info("lyricFlag为:{}",lyricFlag); + if (StringUtils.isNotBlank(jobNumber) && lyricFlag == 1) { + try { + Set userJoinTaskNameSet = lyricVProjectResourcePlanDMService.lambdaQuery() + .eq(LyricVProjectResourcePlanDM::getUser, jobNumber) + .eq(LyricVProjectResourcePlanDM::getDelFlag, DelFlagTypeEnum.NORMAL.getValue()) + .list() + .stream() + .map(LyricVProjectResourcePlanDM::getJobname) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()); + + if (CollectionUtils.isNotEmpty(userJoinTaskNameSet)) { + taskList.stream() + .filter(task -> userJoinTaskNameSet.contains(task.getTaskName())) + .forEach(returnTaskSet::add); + } + } catch (MyBatisSystemException ex) { + log.warn("查询项目参与人员异常(测试环境可能为预期异常),用户工号:{}", jobNumber, ex); + } + } + + // 维度2:项目节点授权人员 + Set projectNodeIdSet = taskList.stream() + .map(SpdmTaskVo::getTag1) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()); + if (CollectionUtils.isNotEmpty(projectNodeIdSet)) { + Map> nodeAuthUserIdMap = nodeMapper.getNodeMemberListByNodeIdList(new ArrayList<>(projectNodeIdSet)) + .stream() + .filter(member -> member != null && StringUtils.isNotBlank(member.getNodeId()) && member.getUserId() != null) + .collect(Collectors.groupingBy( + SpdmNodeMemberVo::getNodeId, + Collectors.mapping(SpdmNodeMemberVo::getUserId, Collectors.toSet()) + )); + + if (MapUtils.isNotEmpty(nodeAuthUserIdMap)) { + taskList.stream() + .filter(task -> StringUtils.isNotBlank(task.getTag1())) + .filter(task -> nodeAuthUserIdMap.getOrDefault(task.getTag1(), Collections.emptySet()).contains(userId)) + .forEach(returnTaskSet::add); + } + } + + // 维度3:任务成员 + List taskMemberVoList = batchData.getTaskMemberVoList(); + if (CollectionUtils.isNotEmpty(taskMemberVoList)) { + Map> taskAuthUserIdMap = taskMemberVoList.stream() + .filter(member -> member != null && StringUtils.isNotBlank(member.getTaskId()) && member.getUserId() != null) + .collect(Collectors.groupingBy( + SpdmTaskMemberVo::getTaskId, + Collectors.mapping(SpdmTaskMemberVo::getUserId, Collectors.toSet()) + )); + + if (MapUtils.isNotEmpty(taskAuthUserIdMap)) { + taskList.stream() + .filter(task -> StringUtils.isNotBlank(task.getUuid())) + .filter(task -> taskAuthUserIdMap.getOrDefault(task.getUuid(), Collections.emptySet()).contains(userId)) + .forEach(returnTaskSet::add); + } + } + + return new ArrayList<>(returnTaskSet); + } + + /** + * 按负责人/执行人参数过滤 + */ + private List filterTaskByMemberParam(List taskList, SpdmTaskListReq req, List taskMemberVoList) { + if (CollectionUtils.isEmpty(taskMemberVoList)) { + return new ArrayList<>(); + } + + if (StringUtils.isBlank(req.getPMemberList()) && StringUtils.isBlank(req.getEMemberList())) { + return taskList; + } + + List filteredMemberList = new ArrayList<>(taskMemberVoList); + + // 负责人过滤 + if (StringUtils.isNotBlank(req.getPMemberList())) { + try { + List pMemberIdList = Stream.of(req.getPMemberList().split(",")) + .map(Long::valueOf) + .collect(Collectors.toList()); + filteredMemberList = filteredMemberList.stream() + .filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && pMemberIdList.contains(member.getUserId())) + .collect(Collectors.toList()); + } catch (Exception e) { + log.error("负责人参数解析异常", e); + return new ArrayList<>(); + } + } + + // 执行人过滤 + if (StringUtils.isNotBlank(req.getEMemberList())) { + try { + List eMemberIdList = Stream.of(req.getEMemberList().split(",")) + .map(Long::valueOf) + .collect(Collectors.toList()); + filteredMemberList = filteredMemberList.stream() + .filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType()) && eMemberIdList.contains(member.getUserId())) + .collect(Collectors.toList()); + } catch (Exception e) { + log.error("执行人参数解析异常", e); + return new ArrayList<>(); + } + } + + if (CollectionUtils.isEmpty(filteredMemberList)) { + return new ArrayList<>(); + } + + // 按过滤后的成员列表筛选任务 + List realTaskIdList = filteredMemberList.stream() + .map(SpdmTaskMemberVo::getTaskId) + .distinct() + .collect(Collectors.toList()); + return taskList.stream() + .filter(task -> realTaskIdList.contains(task.getUuid())) + .collect(Collectors.toList()); + } + + /** + * 批量处理节点标签转换 + */ + private void handleNodeTagBatch(List taskList, SpdmTaskListReq req, Map nodeMap) { + List tagList = req.getIdMap().stream().map(TaskNodeTag::getValue).collect(Collectors.toList()); + Boolean convertTag = req.getConvertTag(); + + for (SpdmTaskVo task : taskList) { + for (String tag : tagList) { + try { + String newTag = "new" + tag.replace("t", "T"); + String lowerTag = tag.replace("T", "t"); + String tagCode = lowerTag + "Code"; + + String eachNodeId = getTagProperty(task, lowerTag); + if (StringUtils.isNotBlank(eachNodeId)) { + List eachNodeIdList = Arrays.stream(eachNodeId.split(",")) + .filter(nodeId -> !nodeId.equals("null")) + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(eachNodeIdList) && convertTag) { + List eachNodeList = eachNodeIdList.stream() + .map(nodeMap::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + if (CollectionUtils.isNotEmpty(eachNodeList)) { + setTagProperty(task, newTag, getTagProperty(task, lowerTag)); + setTagProperty(task, lowerTag, eachNodeList.stream() + .map(SpdmNodeVo::getNodeName) + .collect(Collectors.joining(","))); + setTagProperty(task, tagCode, eachNodeList.stream() + .map(SpdmNodeVo::getNodeCode) + .collect(Collectors.joining(","))); + } + } + } + } catch (Exception e) { + log.error("节点标签转换异常,taskId:{}, tag:{}", task.getUuid(), tag, e); + } + } + } + } + + /** + * 分页处理任务列表 + */ + private List pageTaskList(List taskList, SpdmTaskListReq req) { + int current = req.getCurrent(); + int size = req.getSize(); + int start = (current - 1) * size; + + if (start >= taskList.size()) { + return new ArrayList<>(); + } + int end = Math.min(start + size, taskList.size()); + return taskList.subList(start, end); + } + + /** + * 批量转换为返回VO + */ + private List convertToNewVoBatch(List taskList, BatchAssociatedData batchData) { + if (CollectionUtils.isEmpty(taskList)) { + return new ArrayList<>(); + } + + List newTaskList = new ArrayList<>(); + Map> taskExtraMap = batchData.getTaskExtraMap(); + Map demandMap = batchData.getDemandMap(); + Map demandSubmitMap = batchData.getDemandSubmitMap(); + Map workSpaceNodeMap = batchData.getWorkSpaceNodeMap(); + TaskNodeTag taskNodeTag = batchData.getTaskNodeTag(); + + for (SpdmTaskVo taskVo : taskList) { + SpdmNewTaskVo spdmNewTaskVo = new SpdmNewTaskVo(); + try { + BeanUtils.copyProperties(taskVo, spdmNewTaskVo); + + // 设置标签字段 + spdmNewTaskVo.setTag1(taskVo.getTag1()); + spdmNewTaskVo.setTag2(taskVo.getTag2()); + spdmNewTaskVo.setTag3(taskVo.getTag3()); + spdmNewTaskVo.setTag4(taskVo.getTag4()); + spdmNewTaskVo.setTag5(taskVo.getTag5()); + spdmNewTaskVo.setTag6(taskVo.getTag6()); + spdmNewTaskVo.setTag7(taskVo.getTag7()); + spdmNewTaskVo.setTag8(taskVo.getTag8()); + spdmNewTaskVo.setTag9(taskVo.getTag9()); + spdmNewTaskVo.setTag10(taskVo.getTag10()); + + // 设置成员列表 + spdmNewTaskVo.setPMemberList(taskVo.getPMemberList()); + spdmNewTaskVo.setEMemberList(taskVo.getEMemberList()); + + // 设置扩展信息 + spdmNewTaskVo.setExtras(taskExtraMap.getOrDefault(taskVo.getUuid(), new ArrayList<>())); + + // 设置需求信息 + if (StringUtils.isNotBlank(taskVo.getDemandId())) { + spdmNewTaskVo.setDemandName(demandMap.getOrDefault(taskVo.getDemandId(), new SpdmDemandVo()).getDemandName()); + spdmNewTaskVo.setSubmitter(demandSubmitMap.get(taskVo.getDemandId())); + + // 查询提出人名称 + if (spdmNewTaskVo.getSubmitter() != null) { + SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail( + UserQueryReq.builder().userId(spdmNewTaskVo.getSubmitter()).build() + ); + if (ObjectUtils.isNotEmpty(cidUserResp.getData())) { + spdmNewTaskVo.setSubmitterName(cidUserResp.getData().getNickname()); + } + } + } + + // 设置工位号 + setWorkSpaceNodeCode(spdmNewTaskVo, taskVo, workSpaceNodeMap, taskNodeTag); + + newTaskList.add(spdmNewTaskVo); + } catch (Exception e) { + log.error("VO转换异常,taskId:{}", taskVo.getUuid(), e); + } + } + + return newTaskList; + } + + /** + * 关联数据封装类 + */ + private static class BatchAssociatedData { + private List taskMemberVoList; + private List attentionMemberList; + private Map> taskExtraMap; + private Map nodeMap; + private Map demandMap; + private Map demandSubmitMap; + private Map workSpaceNodeMap; + private TaskNodeTag taskNodeTag; + + // Getter & Setter + public List getTaskMemberVoList() { + return taskMemberVoList; + } + + public void setTaskMemberVoList(List taskMemberVoList) { + this.taskMemberVoList = taskMemberVoList; + } + + public List getAttentionMemberList() { + return attentionMemberList; + } + + public void setAttentionMemberList(List attentionMemberList) { + this.attentionMemberList = attentionMemberList; + } + + public Map> getTaskExtraMap() { + return taskExtraMap; + } + + public void setTaskExtraMap(Map> taskExtraMap) { + this.taskExtraMap = taskExtraMap; + } + + public Map getNodeMap() { + return nodeMap; + } + + public void setNodeMap(Map nodeMap) { + this.nodeMap = nodeMap; + } + + public Map getDemandMap() { + return demandMap; + } + + public void setDemandMap(Map demandMap) { + this.demandMap = demandMap; + } + + public Map getDemandSubmitMap() { + return demandSubmitMap; + } + + public void setDemandSubmitMap(Map demandSubmitMap) { + this.demandSubmitMap = demandSubmitMap; + } + + public Map getWorkSpaceNodeMap() { + return workSpaceNodeMap; + } + + public void setWorkSpaceNodeMap(Map workSpaceNodeMap) { + this.workSpaceNodeMap = workSpaceNodeMap; + } + + public TaskNodeTag getTaskNodeTag() { + return taskNodeTag; + } + + public void setTaskNodeTag(TaskNodeTag taskNodeTag) { + this.taskNodeTag = taskNodeTag; + } + } + @Override public SdmResponse list(SpdmTaskListReq req) { Long tenantId = ThreadLocalContext.getTenantId(); Long userId = ThreadLocalContext.getUserId(); if (Objects.isNull(tenantId) || Objects.isNull(userId)) { - log.error("公司和工号都不能为空"); + log.error("公司和工号都不能为空,tenantId:{}, userId:{}", tenantId, userId); return SdmResponse.failed("公司和工号都不能为空"); } - // 0:我执行的 1:我关注的 2:所有 3:我分发的 - Integer type = req.getType(); - if (StringUtils.isNotBlank(req.getExeStatus())) { - req.setExeStatusList(Arrays.stream(req.getExeStatus().split(",")).toList()); - } - if (StringUtils.isNotBlank(req.getAchieveStatus())) { - req.setAchieveStatusList(Arrays.stream(req.getAchieveStatus().split(",")).toList()); - } - if (StringUtils.isNotBlank(req.getApprovalStatus())) { - req.setApprovalStatusList(Arrays.stream(req.getApprovalStatus().split(",")).toList()); - } - List beginTime = req.getBeginTime(); - if (CollectionUtils.isNotEmpty(beginTime)) { - req.setBeginSTime(beginTime.get(0)); - req.setBeginETime(beginTime.get(1)); - } - List endTime = req.getEndTime(); - if (CollectionUtils.isNotEmpty(endTime)) { - req.setEndSTime(endTime.get(0)); - req.setEndETime(endTime.get(1)); - } - List finishTime = req.getFinishTime(); - if (CollectionUtils.isNotEmpty(finishTime)) { - req.setFinishSTime(finishTime.get(0)); - req.setFinishETime(finishTime.get(1)); - } + // 1. 请求参数预处理 + preProcessReq(req); + + // 2. 基础任务列表查询 List allTaskList = mapper.getTaskList(tenantId, req); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("data", new ArrayList<>()); + JSONObject jsonObject = buildEmptyJsonResp(req); if (CollectionUtils.isEmpty(allTaskList)) { - log.error("根据tenantId:{},未查询到任务", tenantId); + log.info("根据tenantId:{},未查询到任务", tenantId); return SdmResponse.success(jsonObject); } - List taskList = new ArrayList<>(); - List idMapList = req.getIdMap(); - if (CollectionUtils.isEmpty(idMapList)) { - log.error("任务列表中的idMap不能为空"); - return SdmResponse.failed("任务列表中的idMap不能为空"); - } - if (idMapList.stream().anyMatch(idMap -> StringUtils.isNotBlank(idMap.getKey()))) { - List realIdMapList = idMapList.stream().filter(idMap -> StringUtils.isNotBlank(idMap.getKey())).toList(); - TaskNodeTag realTaskNodeTag = realIdMapList.get(realIdMapList.size() - 1); - log.info("实际查询节点类型为:{}", realTaskNodeTag); - String currentNodeTagId = ""; - for (SpdmTaskVo spdmTaskVo : allTaskList) { - try { - currentNodeTagId = getTagProperty(spdmTaskVo, realTaskNodeTag.getValue()); - if (StringUtils.isNotBlank(currentNodeTagId) && currentNodeTagId.contains(realTaskNodeTag.getKey())) { - taskList.add(spdmTaskVo); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } else { - taskList = allTaskList; - } + + // 3. 节点标签过滤 + List taskList = filterTaskByNodeTag(allTaskList, req); if (CollectionUtils.isEmpty(taskList)) { - log.info("未查询到任务"); + log.info("节点标签过滤后无任务数据"); return SdmResponse.success(jsonObject); } + + // 4. 批量查询关联数据 + BatchAssociatedData batchData = batchQueryAssociatedData(taskList,req); + + // 5. 按类型过滤任务(我执行的/我关注的/我分发的/所有) + taskList = filterTaskByType(taskList, req.getType(), userId, batchData.getTaskMemberVoList(), batchData.getAttentionMemberList()); + if (CollectionUtils.isEmpty(taskList)) { + log.info("按类型过滤后无任务数据"); + jsonObject.put("total", 0); + return SdmResponse.success(jsonObject); + } + + // 6. 权限过滤(项目参与人/节点授权/任务成员) + taskList = filterTaskByPermission(taskList, userId, batchData); + if (CollectionUtils.isEmpty(taskList)) { + log.info("权限过滤后无任务数据"); + jsonObject.put("total", 0); + return SdmResponse.success(jsonObject); + } + + // 7. 负责人/执行人参数过滤 + taskList = filterTaskByMemberParam(taskList, req, batchData.getTaskMemberVoList()); + if (CollectionUtils.isEmpty(taskList)) { + log.info("负责人/执行人参数过滤后无任务数据"); + jsonObject.put("total", 0); + return SdmResponse.success(jsonObject); + } + + // 8. 节点标签转换(批量处理) + handleNodeTagBatch(taskList, req, batchData.getNodeMap()); + + // 9. 分页 + int total = taskList.size(); + log.info("id:{}",taskList.stream().sorted(Comparator.comparing(SpdmTaskVo::getUuid)).map(SpdmTaskVo::getId).toList()); + jsonObject.put("total", total); + List pageTaskList = pageTaskList(taskList, req); + + // 10. 转换为返回VO + List newTaskList = convertToNewVoBatch(pageTaskList, batchData); + + // 11. 最终返回 + jsonObject.put("data", newTaskList); jsonObject.put("currentPage", req.getCurrent()); jsonObject.put("pageSize", req.getSize()); - List taskIdList = taskList.stream().map(SpdmTaskVo::getUuid).toList(); - List taskMemberVoList = mapper.getMemberList(taskIdList, null); - List copyTaskMemberList = taskMemberVoList.stream().map(i -> { - SpdmTaskMemberVo o = new SpdmTaskMemberVo(); - o.setTaskId(i.getTaskId()); - o.setType(i.getType()); - o.setUserId(i.getUserId()); - return o; - }).collect(Collectors.toList()); - - Map> memberMap = Map.of(); - if (CollectionUtils.isNotEmpty(taskMemberVoList)) { - memberMap = taskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - } - -// yangyang - // 处理工位号,所有的tag标签 - List nodeTypes = req.getNodeTypeMap(); - log.info("查询任务列表 nodeTypeMap:{}",JSONObject.toJSONString(nodeTypes)); - // 工位对应的对象, value就是哪一个标签 - TaskNodeTag taskNodeTag = TaskNodeTagUtils.getTaskNodeTagByKey(nodeTypes, "workspace"); - List allWorkSpaceUuid = new ArrayList<>(); -// yangyang - - List eachMemberList; - List tagList = idMapList.stream().map(TaskNodeTag::getValue).toList(); - List nodeIdList = new ArrayList<>(); - List eachNodeIdList; - String eachNodeId; - SpdmNodeVo eachNodeVo; - List taskExtraList = mapper.getTaskExtraList(taskIdList); - Map> taskExtraMap = Map.of(); - if (CollectionUtils.isNotEmpty(taskExtraList)) { - taskExtraMap = taskExtraList.stream().collect(Collectors.groupingBy(TaskNodeExtraPo::getTaskId)); - } - Boolean convertTag = req.getConvertTag(); - - // 所有任务 - if (type == 2) { - if (CollectionUtils.isEmpty(taskList)) { - return SdmResponse.success(jsonObject); - } - List attentionMemberList = mapper.getAttentionMemberList(taskList.stream().map(SpdmTaskVo::getUuid).toList()); - Map> attentionMap = Map.of(); - List eachAttentionMemberList; - if (CollectionUtils.isNotEmpty(attentionMemberList)) { - attentionMap = attentionMemberList.stream().collect(Collectors.groupingBy(SpdmTaskAttentionMemberVo::getTaskId)); - } - for (SpdmTaskVo spdmTaskVo : taskList) { - for (String tag : tagList) { - try { - eachNodeId = getTagProperty(spdmTaskVo, tag); - if (StringUtils.isNotBlank(eachNodeId)) { - eachNodeIdList = Arrays.stream(eachNodeId.split(",")).filter(nodeId -> !nodeId.equals("null")).toList(); - if (CollectionUtils.isNotEmpty(eachNodeIdList)) { - nodeIdList.addAll(eachNodeIdList); - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - Map nodeMap = Map.of(); - if (CollectionUtils.isNotEmpty(nodeIdList)) { - List nodeList = nodeMapper.getNodeListByIds(nodeIdList.stream().distinct().toList()); - nodeMap = nodeList.stream().collect(Collectors.groupingBy( - SpdmNodeVo::getUuid, - Collectors.collectingAndThen( - Collectors.toList(), - list -> list.get(0) - ) - )); - } - String newTag; - for (SpdmTaskVo task : taskList) { - - // 汇总工位信息 yangyang - 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); - } - } - // yangyang - String tagCode; - for (String tag : tagList) { - newTag = "new" + tag.replace("t", "T"); - tag = tag.replace("T", "t"); - // 2026-01-28新增需求,前端需要tagCode进行页面展示 - tagCode = tag.replace("T", "t") + "Code"; - try { - eachNodeId = getTagProperty(task, tag); - } catch (Exception e) { - throw new RuntimeException(e); - } - if (StringUtils.isNotBlank(eachNodeId)) { - eachNodeIdList = Arrays.stream(eachNodeId.split(",")).filter(nodeId -> !nodeId.equals("null")).toList(); - if (CollectionUtils.isNotEmpty(eachNodeIdList)) { - List eachNodeList = new ArrayList<>(); - for (String nodeId : eachNodeIdList) { - eachNodeVo = nodeMap.get(nodeId); - if (ObjectUtils.isNotEmpty(eachNodeVo)) { - eachNodeList.add(eachNodeVo); - } - } - if (CollectionUtils.isNotEmpty(eachNodeList) && convertTag) { - try { - setTagProperty(task, newTag, getTagProperty(task,tag)); - setTagProperty(task, tag, eachNodeList.stream().map(SpdmNodeVo::getNodeName).collect(Collectors.joining(","))); - setTagProperty(task, tagCode, eachNodeList.stream().map(SpdmNodeVo::getNodeCode).collect(Collectors.joining(","))); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - } - } - Map> pMemberMap = Map.of(); - Map> eMemberMap = Map.of(); - if (ObjectUtils.isNotEmpty(req.getPMemberList())) { - List pMemberIdList = Stream.of(req.getPMemberList().split(",")).map(Long::valueOf).toList(); - // 通过仿真负责人过滤 - List pTaskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && pMemberIdList.contains(member.getUserId())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(pTaskMemberVoList)) { - log.error("pTaskMemberVoList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - pMemberMap = pTaskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - List realTaskIdList = pTaskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).distinct().toList(); - // 根据负责人信息过滤任务 - taskList = taskList.stream().filter(eachTask -> realTaskIdList.contains(eachTask.getUuid())).toList(); - if (CollectionUtils.isEmpty(taskList)) { - log.error("taskList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - }else { - List pTaskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(pTaskMemberVoList)) { - pMemberMap = pTaskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - } - } - - if (ObjectUtils.isNotEmpty(req.getEMemberList())) { - List eMemberIdList = Stream.of(req.getEMemberList().split(",")).map(Long::valueOf).toList(); - // 通过仿真执行人人过滤 - List eTaskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType()) && eMemberIdList.contains(member.getUserId())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(eTaskMemberVoList)) { - log.error("eTaskMemberVoList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - eMemberMap = eTaskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - List realTaskIdList = eTaskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).distinct().toList(); - // 根据负责人信息过滤任务 - taskList = taskList.stream().filter(eachTask -> realTaskIdList.contains(eachTask.getUuid())).toList(); - if (CollectionUtils.isEmpty(taskList)) { - log.error("taskList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - }else { - List eTaskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())).collect(Collectors.toList()); - if (CollectionUtils.isNotEmpty(eTaskMemberVoList)) { - eMemberMap = eTaskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - } - } - if (CollectionUtils.isNotEmpty(pMemberMap.get(task.getUuid()))) { - setPMemberList(task, pMemberMap.get(task.getUuid())); - } - if (CollectionUtils.isNotEmpty(eMemberMap.get(task.getUuid()))) { - setEMemberList(task, eMemberMap.get(task.getUuid())); - } - eachAttentionMemberList = attentionMap.get(task.getUuid()); - task.setAttentionFlag(CollectionUtils.isEmpty(eachAttentionMemberList) ? 0 : - (eachAttentionMemberList.stream().map(SpdmTaskAttentionMemberVo::getUserId).toList().contains(userId) ? 1 : 0)); - } - // 查询工位信息,然后封装返回 yangyang - Map allNodeMap=new HashMap<>(); - if(CollectionUtils.isNotEmpty(allWorkSpaceUuid)){ - List listSimulationNodes = nodeService.lambdaQuery().in(SimulationNode::getUuid, allWorkSpaceUuid).list(); - allNodeMap = convertToUuidMapByStream(listSimulationNodes); - } - // yangyang - - // TODO 先注释,待完成测试后发布 -// // 最终返回的有权限任务列表(用LinkedHashSet保证有序+去重,避免同一任务多次添加) -// Set returnTaskSet = new LinkedHashSet<>(); -// // 当前用户工号 -// String jobNumber = ThreadLocalContext.getJobNumber(); -// // 维度1:项目参与人员(根据工号匹配任务名称) -// if (StringUtils.isNotBlank(jobNumber)) { -// try { -// // 直接查询并收集用户参与的唯一任务名称 -// Set userJoinTaskNameSet = lyricVProjectResourcePlanDMService.lambdaQuery() -// .eq(LyricVProjectResourcePlanDM::getUser, jobNumber) -// .eq(LyricVProjectResourcePlanDM::getDelFlag, DelFlagTypeEnum.NORMAL.getValue()) -// .list() -// .stream() -// .map(LyricVProjectResourcePlanDM::getJobname) -// .filter(StringUtils::isNotBlank) // 过滤空的任务名称,避免无效匹配 -// .collect(Collectors.toSet()); -// -// // 匹配任务:任务名称在用户参与的任务名称集合中 -// if (CollectionUtils.isNotEmpty(userJoinTaskNameSet)) { -// taskList.stream() -// .filter(task -> userJoinTaskNameSet.contains(task.getTaskName())) -// .forEach(returnTaskSet::add); -// } -// } catch (MyBatisSystemException ex) { -// log.warn("查询项目参与人员异常(测试环境可能为预期异常),用户工号:{},异常信息:{}", jobNumber, ex.getMessage()); -// } -// } -// -// // 项目节点授权人员(根据tag1=项目节点ID匹配用户ID) -// // 提取原始任务中的非空项目节点ID,去重 -// Set projectNodeIdSet = taskList.stream() -// .map(SpdmTaskVo::getTag1) -// .filter(StringUtils::isNotBlank) -// .collect(Collectors.toSet()); -// if (CollectionUtils.isNotEmpty(projectNodeIdSet)) { -// // 查询节点授权人员,并构建【节点ID -> 授权用户ID】集合的Map做快速匹配 -// Map> nodeAuthUserIdMap = nodeMapper.getNodeMemberListByNodeIdList(new ArrayList<>(projectNodeIdSet)) -// .stream() -// // 过滤无效数据:节点ID/用户ID非空 -// .filter(member -> member != null -// && StringUtils.isNotBlank(member.getNodeId()) -// && member.getUserId() != null) -// // 分组:节点ID为key,用户ID去重为value,用Set避免重复 -// .collect(Collectors.groupingBy( -// SpdmNodeMemberVo::getNodeId, -// Collectors.mapping(SpdmNodeMemberVo::getUserId, Collectors.toSet()) -// )); -// -// // 匹配任务:当前用户ID在任务对应节点的有权限查询的用户集合中 -// if (MapUtils.isNotEmpty(nodeAuthUserIdMap) && userId != null) { -// taskList.stream() -// .filter(task -> StringUtils.isNotBlank(task.getTag1())) -// .filter(task -> nodeAuthUserIdMap.getOrDefault(task.getTag1(), Collections.emptySet()).contains(userId)) -// .forEach(returnTaskSet::add); -// } -// } -// -// // 任务成员(根据任务UUID匹配用户ID) -// if (CollectionUtils.isNotEmpty(taskMemberVoList) && userId != null) { -// // 构建【任务ID -> 任务成员用户ID集合】的Map -// Map> taskAuthUserIdMap = taskMemberVoList.stream() -// // 过滤无效数据:任务ID/用户ID非空 -// .filter(member -> member != null -// && StringUtils.isNotBlank(member.getTaskId()) -// && member.getUserId() != null) -// // 分组:任务ID为key,用户ID去重为value -// .collect(Collectors.groupingBy( -// SpdmTaskMemberVo::getTaskId, -// Collectors.mapping(SpdmTaskMemberVo::getUserId, Collectors.toSet()) -// )); -// -// // 匹配任务:当前用户ID在任务的成员用户集合中 -// if (MapUtils.isNotEmpty(taskAuthUserIdMap)) { -// taskList.stream() -// .filter(task -> StringUtils.isNotBlank(task.getUuid())) -// .filter(task -> taskAuthUserIdMap.getOrDefault(task.getUuid(), Collections.emptySet()).contains(userId)) -// .forEach(returnTaskSet::add); -// } -// } -// -// // 去重后的Set转List,赋值回任务列表 -// taskList = new ArrayList<>(returnTaskSet); - - - - jsonObject.put("total", taskList.size()); - taskList = taskList.stream().skip((long) (req.getCurrent() - 1) * req.getSize()).limit(req.getSize()).toList(); - List newTaskList = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(taskList)) { - List demandIdList = taskList.stream().map(SpdmTaskVo::getDemandId).toList(); - Map demandMap = Map.of(); - Map demandSubmitMap = Map.of(); - if (CollectionUtils.isNotEmpty(demandIdList)) { - // 根据demandId查询demandName - List demandVoList = demandMapper.getDemandListById(demandIdList); - if (CollectionUtils.isNotEmpty(demandVoList)) { - demandMap = demandVoList.stream().collect(Collectors.toMap(SpdmDemandVo::getUuid, SpdmDemandVo::getDemandName)); - demandSubmitMap = demandVoList.stream().collect(Collectors.toMap(SpdmDemandVo::getUuid, SpdmDemandVo::getCreator)); - } - } - for (SpdmTaskVo taskVo : taskList) { - SpdmNewTaskVo spdmNewTaskVo = new SpdmNewTaskVo(); - BeanUtils.copyProperties(taskVo, spdmNewTaskVo); - spdmNewTaskVo.setTag1(taskVo.getTag1()); - spdmNewTaskVo.setTag2(taskVo.getTag2()); - spdmNewTaskVo.setTag3(taskVo.getTag3()); - spdmNewTaskVo.setTag4(taskVo.getTag4()); - spdmNewTaskVo.setTag5(taskVo.getTag5()); - spdmNewTaskVo.setTag6(taskVo.getTag6()); - spdmNewTaskVo.setTag7(taskVo.getTag7()); - spdmNewTaskVo.setTag8(taskVo.getTag8()); - spdmNewTaskVo.setTag9(taskVo.getTag9()); - spdmNewTaskVo.setTag10(taskVo.getTag10()); - spdmNewTaskVo.setPMemberList(taskVo.getPMemberList()); - spdmNewTaskVo.setEMemberList(taskVo.getEMemberList()); - spdmNewTaskVo.setExtras(taskExtraMap.get(taskVo.getUuid())); - if (StringUtils.isNotBlank(spdmNewTaskVo.getDemandId())) { - spdmNewTaskVo.setDemandName(demandMap.get(spdmNewTaskVo.getDemandId())); - // 任务列表新增提出人(关联的需求创建人) - spdmNewTaskVo.setSubmitter(demandSubmitMap.get(spdmNewTaskVo.getDemandId())); - SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(spdmNewTaskVo.getSubmitter()).build()); - if (ObjectUtils.isNotEmpty(cidUserResp.getData())) { - spdmNewTaskVo.setSubmitterName(cidUserResp.getData().getNickname()); - } - } - // 设置工位号 yangyang - setWorkSpaceNodeCode(spdmNewTaskVo,taskVo,allNodeMap,taskNodeTag); - // yangyang - newTaskList.add(spdmNewTaskVo); - } - } - jsonObject.put("data", newTaskList); - return SdmResponse.success(jsonObject); - } - - // 所有任务结束 - - - if (type == 0) { - // 仿真执行人是当前用户 - if (CollectionUtils.isEmpty(taskMemberVoList)) { - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); - if (ObjectUtils.isEmpty(cidUserResp.getData())) { - log.error("根据jobNumber:{},未查询到用户", userId); - return SdmResponse.success(new ArrayList<>()); - } - CIDUserResp cidUser = cidUserResp.getData(); - taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.EXECUTOR.getCode().equals(taskMember.getType())).toList(); - if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("任务列表中未查询到仿真执行人1"); - return SdmResponse.success(new ArrayList<>()); - } - Long curUserId = cidUser.getUserId(); - taskMemberVoList = taskMemberVoList.stream().filter(member -> curUserId.equals(member.getUserId())).toList(); - if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("任务列表中未查询到仿真执行人2"); - return SdmResponse.success(new ArrayList<>()); - } - List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); - taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); - } else if (type == 3) { - // 仿真负责人是当前用户 - if (CollectionUtils.isEmpty(taskMemberVoList)) { - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); - if (ObjectUtils.isEmpty(cidUserResp.getData())) { - log.error("根据jobNumber:{},未查询到用户", userId); - return SdmResponse.success(new ArrayList<>()); - } - taskMemberVoList = taskMemberVoList.stream().filter(taskMember -> MemberTypeEnum.PRINCIPAL.getCode().equals(taskMember.getType()) && userId.equals(taskMember.getUserId())).toList(); - if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("任务列表中未查询到仿真负责人"); - return SdmResponse.success(new ArrayList<>()); - } - List myTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).toList(); - taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); - } else { - SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(userId).build()); - if (ObjectUtils.isEmpty(cidUserResp.getData())) { - log.error("根据jobNumber:{},未查询到用户", userId); - return SdmResponse.success(new ArrayList<>()); - } - CIDUserResp cidUser = cidUserResp.getData(); - List taskAttentionMemberVoList = mapper.getAttentionMemberList(taskIdList); - if (CollectionUtils.isEmpty(taskAttentionMemberVoList)) { - log.error("未查询到关注人"); - return SdmResponse.success(new ArrayList<>()); - } - // 当前用户的主键id - Long curUserId = cidUser.getUserId(); - taskAttentionMemberVoList = taskAttentionMemberVoList.stream().filter(member -> curUserId.equals(member.getUserId())).toList(); - if (CollectionUtils.isEmpty(taskAttentionMemberVoList)) { - log.error("任务列表中未查询到仿真执行人3"); - return SdmResponse.success(new ArrayList<>()); - } - List myTaskIdList = taskAttentionMemberVoList.stream().map(SpdmTaskAttentionMemberVo::getTaskId).toList(); - taskList = taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).toList(); - } - if (CollectionUtils.isEmpty(taskList)) { - log.error("taskList为空"); - return SdmResponse.success(new ArrayList<>()); - } - - taskMemberVoList = mapper.getMemberList(taskList.stream().map(SpdmTaskVo::getUuid).toList(), null); - - if (type != 1 && CollectionUtils.isNotEmpty(taskMemberVoList)) { - if (ObjectUtils.isNotEmpty(req.getPMemberList())) { - List pMemberIdList = Stream.of(req.getPMemberList().split(",")).map(Long::valueOf).toList(); - // 通过仿真负责人过滤 - taskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && pMemberIdList.contains(member.getUserId())).collect(Collectors.toList()); - } - if (StringUtils.isNotBlank(req.getEMemberList())) { - // 通过仿真执行人过滤 - List eMemberIdList = Stream.of(req.getEMemberList().split(",")).map(Long::valueOf).toList(); - // 通过仿真负责人过滤 - taskMemberVoList = taskMemberVoList.stream().filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType()) && eMemberIdList.contains(member.getUserId())).collect(Collectors.toList()); - } - if (CollectionUtils.isEmpty(taskMemberVoList)) { - log.error("taskMemberVoList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - memberMap = taskMemberVoList.stream().collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); - List realTaskIdList = taskMemberVoList.stream().map(SpdmTaskMemberVo::getTaskId).distinct().toList(); - // 根据负责人信息过滤任务 - taskList = taskList.stream().filter(task -> realTaskIdList.contains(task.getUuid())).toList(); - if (CollectionUtils.isEmpty(taskList)) { - log.error("taskList为空"); - jsonObject.put("total", 0); - return SdmResponse.success(jsonObject); - } - } - - jsonObject.put("total", taskList.size()); - taskList = taskList.stream().skip((long) (req.getCurrent() - 1) * req.getSize()).limit(req.getSize()).toList(); - - if (CollectionUtils.isEmpty(taskList)) { - jsonObject.put("data", taskList); - return SdmResponse.success(jsonObject); - } - List demandIdList = taskList.stream().map(SpdmTaskVo::getDemandId).toList(); - Map demandMap = Map.of(); - Map demandSubmitMap = Map.of(); - if (CollectionUtils.isNotEmpty(demandIdList)) { - // 根据demandId查询demandName - List demandVoList = demandMapper.getDemandListById(demandIdList); - if (CollectionUtils.isNotEmpty(demandVoList)) { - demandMap = demandVoList.stream().collect(Collectors.toMap(SpdmDemandVo::getUuid, SpdmDemandVo::getDemandName)); - demandSubmitMap = demandVoList.stream().collect(Collectors.toMap(SpdmDemandVo::getUuid, SpdmDemandVo::getCreator)); - } - } - for (SpdmTaskVo spdmTaskVo : taskList) { - for (String tag : tagList) { - try { - eachNodeId = getTagProperty(spdmTaskVo, tag.replace("T", "t")); - if (StringUtils.isNotBlank(eachNodeId)) { - eachNodeIdList = Arrays.stream(eachNodeId.split(",")).filter(nodeId -> !nodeId.equals("null")).toList(); - if (CollectionUtils.isNotEmpty(eachNodeIdList)) { - nodeIdList.addAll(eachNodeIdList); - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - Map nodeMap = Map.of(); - if (CollectionUtils.isNotEmpty(nodeIdList)) { - List nodeList = nodeMapper.getNodeListByIds(nodeIdList.stream().distinct().toList()); - nodeMap = nodeList.stream().collect(Collectors.groupingBy( - SpdmNodeVo::getUuid, - Collectors.collectingAndThen( - Collectors.toList(), - list -> list.get(0) - ) - )); - } - - - List attentionMemberList = mapper.getAttentionMemberList(taskList.stream().map(SpdmTaskVo::getUuid).toList()); - Map> attentionMap = Map.of(); - List eachAttentionMemberList; - if (CollectionUtils.isNotEmpty(attentionMemberList)) { - attentionMap = attentionMemberList.stream().collect(Collectors.groupingBy(SpdmTaskAttentionMemberVo::getTaskId)); - } - List eachTaskMemberList; - String newTag; - String tagCode; - for (SpdmTaskVo task : taskList) { - for (String tag : tagList) { - newTag = "new" + tag.replace("t", "T"); - tag = tag.replace("T", "t"); - // 2026-01-28新增需求,前端需要tagCode进行页面展示 - tagCode = tag.replace("T", "t") + "Code"; - try { - eachNodeId = getTagProperty(task, tag); - } catch (Exception e) { - throw new RuntimeException(e); - } - if (StringUtils.isNotBlank(eachNodeId)) { - eachNodeIdList = Arrays.stream(eachNodeId.split(",")).filter(nodeId -> !nodeId.equals("null")).toList(); - if (CollectionUtils.isNotEmpty(eachNodeIdList)) { - List eachNodeList = new ArrayList<>(); - for (String nodeId : eachNodeIdList) { - eachNodeVo = nodeMap.get(nodeId); - if (ObjectUtils.isNotEmpty(eachNodeVo)) { - eachNodeList.add(eachNodeVo); - } - } - if (CollectionUtils.isNotEmpty(eachNodeList)) { - try { - setTagProperty(task, newTag, getTagProperty(task,tag)); - setTagProperty(task, tag, eachNodeList.stream().map(SpdmNodeVo::getNodeName).collect(Collectors.joining(","))); - setTagProperty(task, tagCode, eachNodeList.stream().map(SpdmNodeVo::getNodeCode).collect(Collectors.joining(","))); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - } - } - eachAttentionMemberList = attentionMap.get(task.getUuid()); - task.setAttentionFlag(CollectionUtils.isEmpty(eachAttentionMemberList) ? 0 : - (eachAttentionMemberList.stream().map(SpdmTaskAttentionMemberVo::getUserId).toList().contains(userId) ? 1 : 0)); - eachTaskMemberList = memberMap.get(task.getUuid()); - if (CollectionUtils.isEmpty(eachTaskMemberList)) { - continue; - } - // 设置仿真负责人和执行人 - setPMemberList(task, copyTaskMemberList); - setEMemberList(task, copyTaskMemberList); - // 汇总工位信息 - if(taskNodeTag!=null&&StringUtils.isNotBlank(taskNodeTag.getValue())){ - String workSpaceUuid = ""; - try { - // yangyang - String value = taskNodeTag.getValue(); - // tag5---> newTag5 - String newValue = "new"+StringUtils.capitalize(value); - workSpaceUuid = getTagProperty(task, newValue); - // yangyang - } catch (Exception e) { - log.warn("get workspace uuid error:{}",e.getMessage()); - } - if(StringUtils.isNotBlank(workSpaceUuid)){ - allWorkSpaceUuid.add(workSpaceUuid); - } - } - - } - List newTaskList = new ArrayList<>(); - // 查询工位信息,然后封装返回 - Map allNodeMap=new HashMap<>(); - if(CollectionUtils.isNotEmpty(allWorkSpaceUuid)){ - List listSimulationNodes = nodeService.lambdaQuery().in(SimulationNode::getUuid, allWorkSpaceUuid).list(); - allNodeMap = convertToUuidMapByStream(listSimulationNodes); - } - - for (SpdmTaskVo taskVo : taskList) { - SpdmNewTaskVo spdmNewTaskVo = new SpdmNewTaskVo(); - BeanUtils.copyProperties(taskVo, spdmNewTaskVo); - spdmNewTaskVo.setTag1(taskVo.getTag1()); - spdmNewTaskVo.setTag2(taskVo.getTag2()); - spdmNewTaskVo.setTag3(taskVo.getTag3()); - spdmNewTaskVo.setTag4(taskVo.getTag4()); - spdmNewTaskVo.setTag5(taskVo.getTag5()); - spdmNewTaskVo.setTag6(taskVo.getTag6()); - spdmNewTaskVo.setTag7(taskVo.getTag7()); - spdmNewTaskVo.setTag8(taskVo.getTag8()); - spdmNewTaskVo.setTag9(taskVo.getTag9()); - spdmNewTaskVo.setTag10(taskVo.getTag10()); - spdmNewTaskVo.setPMemberList(taskVo.getPMemberList()); - spdmNewTaskVo.setEMemberList(taskVo.getEMemberList()); - spdmNewTaskVo.setExtras(taskExtraMap.get(taskVo.getUuid())); - if (StringUtils.isNotBlank(spdmNewTaskVo.getDemandId())) { - spdmNewTaskVo.setDemandName(demandMap.get(spdmNewTaskVo.getDemandId())); - // 任务列表新增提出人(关联的需求创建人) - spdmNewTaskVo.setSubmitter(demandSubmitMap.get(spdmNewTaskVo.getDemandId())); - SdmResponse cidUserResp = sysUserFeignClient.queryUserDetail(UserQueryReq.builder().userId(spdmNewTaskVo.getSubmitter()).build()); - if (ObjectUtils.isNotEmpty(cidUserResp.getData())) { - spdmNewTaskVo.setSubmitterName(cidUserResp.getData().getNickname()); - } - } - // 设置工位号 - setWorkSpaceNodeCode(spdmNewTaskVo,taskVo,allNodeMap,taskNodeTag); - newTaskList.add(spdmNewTaskVo); - } - jsonObject.put("data", newTaskList); return SdmResponse.success(jsonObject); } @@ -932,6 +937,89 @@ public class TaskServiceImpl implements ITaskService { // taskList = taskList.stream().filter(task -> realTaskIdList.contains(task.getUuid())).toList(); if (type == 2) { + // 最终返回的有权限任务列表(用LinkedHashSet保证有序+去重,避免同一任务多次添加) + Set returnTaskSet = new LinkedHashSet<>(); + // 当前用户工号 + String jobNumber = ThreadLocalContext.getJobNumber(); + // 维度1:项目参与人员(根据工号匹配任务名称) + if (StringUtils.isNotBlank(jobNumber) && lyricFlag == 1) { + try { + // 直接查询并收集用户参与的唯一任务名称 + Set userJoinTaskNameSet = lyricVProjectResourcePlanDMService.lambdaQuery() + .eq(LyricVProjectResourcePlanDM::getUser, jobNumber) + .eq(LyricVProjectResourcePlanDM::getDelFlag, DelFlagTypeEnum.NORMAL.getValue()) + .list() + .stream() + .map(LyricVProjectResourcePlanDM::getJobname) + .filter(StringUtils::isNotBlank) // 过滤空的任务名称,避免无效匹配 + .collect(Collectors.toSet()); + + // 匹配任务:任务名称在用户参与的任务名称集合中 + if (CollectionUtils.isNotEmpty(userJoinTaskNameSet)) { + taskList.stream() + .filter(task -> userJoinTaskNameSet.contains(task.getTaskName())) + .forEach(returnTaskSet::add); + } + } catch (MyBatisSystemException ex) { + log.warn("查询项目参与人员异常(测试环境可能为预期异常),用户工号:{},异常信息:{}", jobNumber, ex.getMessage()); + } + } + + // 项目节点授权人员(根据tag1=项目节点ID匹配用户ID) + // 提取原始任务中的非空项目节点ID,去重 + Set projectNodeIdSet = taskList.stream() + .map(SpdmTaskVo::getTag1) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toSet()); + if (CollectionUtils.isNotEmpty(projectNodeIdSet)) { + // 查询节点授权人员,并构建【节点ID -> 授权用户ID】集合的Map做快速匹配 + Map> nodeAuthUserIdMap = nodeMapper.getNodeMemberListByNodeIdList(new ArrayList<>(projectNodeIdSet)) + .stream() + // 过滤无效数据:节点ID/用户ID非空 + .filter(member -> member != null + && StringUtils.isNotBlank(member.getNodeId()) + && member.getUserId() != null) + // 分组:节点ID为key,用户ID去重为value,用Set避免重复 + .collect(Collectors.groupingBy( + SpdmNodeMemberVo::getNodeId, + Collectors.mapping(SpdmNodeMemberVo::getUserId, Collectors.toSet()) + )); + + // 匹配任务:当前用户ID在任务对应节点的有权限查询的用户集合中 + if (MapUtils.isNotEmpty(nodeAuthUserIdMap) && userId != null) { + taskList.stream() + .filter(task -> StringUtils.isNotBlank(task.getTag1())) + .filter(task -> nodeAuthUserIdMap.getOrDefault(task.getTag1(), Collections.emptySet()).contains(userId)) + .forEach(returnTaskSet::add); + } + } + + // 任务成员(根据任务UUID匹配用户ID) + if (CollectionUtils.isNotEmpty(taskMemberVoList) && userId != null) { + // 构建【任务ID -> 任务成员用户ID集合】的Map + Map> taskAuthUserIdMap = taskMemberVoList.stream() + // 过滤无效数据:任务ID/用户ID非空 + .filter(member -> member != null + && StringUtils.isNotBlank(member.getTaskId()) + && member.getUserId() != null) + // 分组:任务ID为key,用户ID去重为value + .collect(Collectors.groupingBy( + SpdmTaskMemberVo::getTaskId, + Collectors.mapping(SpdmTaskMemberVo::getUserId, Collectors.toSet()) + )); + + // 匹配任务:当前用户ID在任务的成员用户集合中 + if (MapUtils.isNotEmpty(taskAuthUserIdMap)) { + taskList.stream() + .filter(task -> StringUtils.isNotBlank(task.getUuid())) + .filter(task -> taskAuthUserIdMap.getOrDefault(task.getUuid(), Collections.emptySet()).contains(userId)) + .forEach(returnTaskSet::add); + } + } + + // 去重后的Set转List,赋值回任务列表 + taskList = new ArrayList<>(returnTaskSet); + // 所有任务 countTask(taskList, todayTmrTaskList, taskCountResp); } else { diff --git a/project/src/main/resources/application-dev-190.yml b/project/src/main/resources/application-dev-190.yml index b0363964..f297c27f 100644 --- a/project/src/main/resources/application-dev-190.yml +++ b/project/src/main/resources/application-dev-190.yml @@ -179,4 +179,8 @@ xxl: logretentiondays: 14 # 执行器排除扫描的包,多个用逗号分隔,如 "org.package01" 或 "org.package01,org.package02" excludedpackage: -# xxljob 配置结束 \ No newline at end of file +# xxljob 配置结束 + + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 0 \ No newline at end of file diff --git a/project/src/main/resources/application-dev-65.yml b/project/src/main/resources/application-dev-65.yml index d434ef02..2c939914 100644 --- a/project/src/main/resources/application-dev-65.yml +++ b/project/src/main/resources/application-dev-65.yml @@ -179,4 +179,7 @@ xxl: logretentiondays: 14 # 执行器排除扫描的包,多个用逗号分隔,如 "org.package01" 或 "org.package01,org.package02" excludedpackage: -# xxljob 配置结束 \ No newline at end of file +# xxljob 配置结束 + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 0 \ No newline at end of file diff --git a/project/src/main/resources/application-local.yml b/project/src/main/resources/application-local.yml index fd2b7da9..07e068ec 100644 --- a/project/src/main/resources/application-local.yml +++ b/project/src/main/resources/application-local.yml @@ -183,4 +183,9 @@ xxl: logretentiondays: 14 # 执行器排除扫描的包,多个用逗号分隔,如 "org.package01" 或 "org.package01,org.package02" excludedpackage: -# xxljob 配置结束 \ No newline at end of file +# xxljob 配置结束 + + + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 0 \ No newline at end of file diff --git a/project/src/main/resources/application-lyric.yml b/project/src/main/resources/application-lyric.yml index 37d7aaa1..fe3e7134 100644 --- a/project/src/main/resources/application-lyric.yml +++ b/project/src/main/resources/application-lyric.yml @@ -180,4 +180,8 @@ xxl: logretentiondays: 14 # 执行器排除扫描的包,多个用逗号分隔,如 "org.package01" 或 "org.package01,org.package02" excludedpackage: -# xxljob 配置结束 \ No newline at end of file +# xxljob 配置结束 + + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 1 \ No newline at end of file diff --git a/project/src/main/resources/application-prod.yml b/project/src/main/resources/application-prod.yml index 3b865f38..712f2ca1 100644 --- a/project/src/main/resources/application-prod.yml +++ b/project/src/main/resources/application-prod.yml @@ -141,4 +141,7 @@ YA: scheduler: todo: 10.10.00 - project: 10.11.00 \ No newline at end of file + project: 10.11.00 + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 1 \ No newline at end of file diff --git a/project/src/main/resources/application-test.yml b/project/src/main/resources/application-test.yml index e5f5ea69..3cef6a89 100644 --- a/project/src/main/resources/application-test.yml +++ b/project/src/main/resources/application-test.yml @@ -134,4 +134,7 @@ scheduled: scheduler: todo: 10.10.00 - project: 10.11.00 \ No newline at end of file + project: 10.11.00 + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 0 \ No newline at end of file diff --git a/project/src/main/resources/application-yian.yml b/project/src/main/resources/application-yian.yml index 9249486a..f3ca10f2 100644 --- a/project/src/main/resources/application-yian.yml +++ b/project/src/main/resources/application-yian.yml @@ -149,4 +149,8 @@ project: basic: enabled: true lyric: - enabled: false \ No newline at end of file + enabled: false + + +# 通过标识判断是否走查询现场视图逻辑(0不查询,1查询) +lyricFlag : 0 \ No newline at end of file