From f57b506af6132374b570bd9000e7a434510d0e5c Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Mon, 2 Feb 2026 06:24:29 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdm/project/common/TaskQryTypeEnum.java | 3 +- .../sdm/project/dao/SimulationTaskMapper.java | 2 + .../project/model/req/SpdmTaskListReq.java | 2 + .../project/service/impl/TaskServiceImpl.java | 157 +++++++++---- .../resources/mapper/SimulationTaskMapper.xml | 215 ++++++++++++++++++ 5 files changed, 330 insertions(+), 49 deletions(-) diff --git a/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java b/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java index 3a859b7a..adc9be77 100644 --- a/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java +++ b/project/src/main/java/com/sdm/project/common/TaskQryTypeEnum.java @@ -4,7 +4,8 @@ public enum TaskQryTypeEnum { EXEC(0, "我执行的"), ATTENTION(1, "我关注的"), ALL(2, "所有"), - ISSUE(3, "我分发的"); + ISSUE(3, "已分发的"), + UN_ISSUE(4, "未分发的"); private final Integer code; private final String desc; diff --git a/project/src/main/java/com/sdm/project/dao/SimulationTaskMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationTaskMapper.java index fb7d39dd..5bda087e 100644 --- a/project/src/main/java/com/sdm/project/dao/SimulationTaskMapper.java +++ b/project/src/main/java/com/sdm/project/dao/SimulationTaskMapper.java @@ -61,4 +61,6 @@ public interface SimulationTaskMapper extends BaseMapper { List getTaskListByIdList(@Param("taskIdList") List taskIdList); + List optimisedGtTaskList(@Param("tenantId") Long tenantId, @Param("req") SpdmTaskListReq req); + } diff --git a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java index cf81c1dd..6074a74e 100644 --- a/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java +++ b/project/src/main/java/com/sdm/project/model/req/SpdmTaskListReq.java @@ -141,4 +141,6 @@ public class SpdmTaskListReq { * */ private List nodeTypeMap; + private Long userId; + } 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 ee10592c..efb01f11 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 @@ -79,6 +79,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.StopWatch; import javax.annotation.Resource; import java.io.File; @@ -379,15 +380,46 @@ public class TaskServiceImpl implements ITaskService { } // 我分发的(仿真负责人) - if (type == 3) { + // 我分发的现在需要细化出未分发和已分发 + // 已分发任务(type=3)【执行人不为空】 + // 未分发任务(type=4)【执行人为空】 + if (type == 3 || type == 4) { if (CollectionUtils.isEmpty(taskMemberVoList)) { return new ArrayList<>(); } - List myTaskIdList = taskMemberVoList.stream() - .filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && userId.equals(member.getUserId())) + // 筛选出【我作为仿真负责人】的所有任务ID + Set myPrincipalTaskIdSet = taskMemberVoList.stream() + .filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) + && userId.equals(member.getUserId())) .map(SpdmTaskMemberVo::getTaskId) + .collect(Collectors.toSet()); // 用Set提升后续contains判断效率(大数据量更优) + if (CollectionUtils.isEmpty(myPrincipalTaskIdSet)) { + return new ArrayList<>(); + } + + // 筛选出【有执行人】的任务ID集合 + Set hasExecutorTaskIdSet = taskMemberVoList.stream() + .filter(member -> MemberTypeEnum.EXECUTOR.getCode().equals(member.getType())) + .map(SpdmTaskMemberVo::getTaskId) + .collect(Collectors.toSet()); + // 按类型过滤出最终需要的任务ID(我的分发任务 + 有/无执行人) + Set finalTaskIdSet; + if (type == 3) { + // 已分发(type=3):我的分发任务 且 有执行人 → 两个集合的交集 + finalTaskIdSet = myPrincipalTaskIdSet.stream() + .filter(hasExecutorTaskIdSet::contains) + .collect(Collectors.toSet()); + } else { // type == 4 + // 未分发(type=4):我的分发任务 且 无执行人 → 我的任务ID中排除有执行人的ID + finalTaskIdSet = myPrincipalTaskIdSet.stream() + .filter(taskId -> !hasExecutorTaskIdSet.contains(taskId)) + .collect(Collectors.toSet()); + } + + // 根据最终任务ID,从任务列表中匹配出具体的任务数据并返回 + return taskList.stream() + .filter(task -> finalTaskIdSet.contains(task.getUuid())) .collect(Collectors.toList()); - return taskList.stream().filter(task -> myTaskIdList.contains(task.getUuid())).collect(Collectors.toList()); } // 我关注的 @@ -436,45 +468,47 @@ public class TaskServiceImpl implements ITaskService { } // 维度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()) - )); +// 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); +// } +// } - 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); - } - } + returnTaskSet.addAll(taskList); return new ArrayList<>(returnTaskSet); } @@ -584,6 +618,15 @@ public class TaskServiceImpl implements ITaskService { * 分页处理任务列表 */ private List pageTaskList(List taskList, SpdmTaskListReq req) { + Integer sortOrder = req.getSortOrder(); + if (sortOrder != null) { + if (sortOrder == 0) { + taskList = taskList.stream().sorted(Comparator.comparing(SpdmTaskVo::getCreateTime)).toList(); + }else if (sortOrder == 1) { + taskList = taskList.stream().sorted(Comparator.comparing(SpdmTaskVo::getCreateTime).reversed()).toList(); + } + } + int current = req.getCurrent(); int size = req.getSize(); int start = (current - 1) * size; @@ -832,7 +875,11 @@ public class TaskServiceImpl implements ITaskService { preProcessReq(req); // 2. 基础任务列表查询 - List allTaskList = mapper.getTaskList(tenantId, req); + req.setUserId(userId); + StopWatch stopWatch = new StopWatch("所有任务方法计时"); + stopWatch.start("查所有任务"); + List allTaskList = mapper.optimisedGtTaskList(tenantId, req); + stopWatch.stop(); JSONObject jsonObject = buildEmptyJsonResp(req); if (CollectionUtils.isEmpty(allTaskList)) { log.info("根据tenantId:{},未查询到任务", tenantId); @@ -840,17 +887,23 @@ public class TaskServiceImpl implements ITaskService { } // 3. 节点标签过滤 + stopWatch.start("节点标签过滤"); List taskList = filterTaskByNodeTag(allTaskList, req); + stopWatch.stop(); if (CollectionUtils.isEmpty(taskList)) { log.info("节点标签过滤后无任务数据"); return SdmResponse.success(jsonObject); } // 4. 批量查询关联数据 + stopWatch.start("批量查询关联数据"); BatchAssociatedData batchData = batchQueryAssociatedData(taskList,req); + stopWatch.stop(); // 5. 按类型过滤任务(我执行的/我关注的/我分发的/所有) + stopWatch.start("按类型过滤任务"); taskList = filterTaskByType(taskList, req.getType(), userId, batchData.getTaskMemberVoList(), batchData.getAttentionMemberList()); + stopWatch.stop(); if (CollectionUtils.isEmpty(taskList)) { log.info("按类型过滤后无任务数据"); jsonObject.put("total", 0); @@ -858,33 +911,41 @@ public class TaskServiceImpl implements ITaskService { } // 6. 权限过滤(项目参与人/节点授权/任务成员) + stopWatch.start("权限过滤"); taskList = filterTaskByPermission(taskList, userId, batchData); if (CollectionUtils.isEmpty(taskList)) { log.info("权限过滤后无任务数据"); jsonObject.put("total", 0); return SdmResponse.success(jsonObject); } - + stopWatch.stop(); // 7. 负责人/执行人参数过滤 + stopWatch.start("负责人/执行人参数过滤"); taskList = filterTaskByMemberParam(taskList, req, batchData.getTaskMemberVoList()); if (CollectionUtils.isEmpty(taskList)) { log.info("负责人/执行人参数过滤后无任务数据"); jsonObject.put("total", 0); return SdmResponse.success(jsonObject); } - + stopWatch.stop(); // 8. 节点标签转换(批量处理) + stopWatch.start("节点标签转换"); handleNodeTagBatch(taskList, req, batchData.getNodeMap()); - + stopWatch.stop(); // 9. 分页 + stopWatch.start("分页"); int total = taskList.size(); - log.info("id:{}",taskList.stream().sorted(Comparator.comparing(SpdmTaskVo::getUuid)).map(SpdmTaskVo::getId).toList()); +// log.info("id:{}",taskList.stream().sorted(Comparator.comparing(SpdmTaskVo::getUuid)).map(SpdmTaskVo::getId).toList()); jsonObject.put("total", total); List pageTaskList = pageTaskList(taskList, req); - + stopWatch.stop(); // 10. 转换为返回VO + stopWatch.start("转换为返回VO"); List newTaskList = convertToNewVoBatch(pageTaskList, batchData); - + stopWatch.stop(); + // 输出计时结果(两种方式:格式化打印/自定义输出) + System.out.println("===== 格式化打印所有任务耗时(推荐日志输出) ====="); + System.out.println(stopWatch.prettyPrint()); // Spring内置格式化,含耗时百分比,直接打印日志即可 // 11. 最终返回 jsonObject.put("data", newTaskList); jsonObject.put("currentPage", req.getCurrent()); diff --git a/project/src/main/resources/mapper/SimulationTaskMapper.xml b/project/src/main/resources/mapper/SimulationTaskMapper.xml index 58f4657b..c527a58d 100644 --- a/project/src/main/resources/mapper/SimulationTaskMapper.xml +++ b/project/src/main/resources/mapper/SimulationTaskMapper.xml @@ -467,5 +467,220 @@ ) + + \ No newline at end of file