From 48752f5dd13a42c92f210d0be16424e396c9047b Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Sat, 31 Jan 2026 12:31:49 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=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=EF=BC=88?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=88=90=E5=91=98=E4=BF=A1=E6=81=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/resp/project/SpdmTaskVo.java | 6 + .../sdm/project/model/vo/SpdmNewTaskVo.java | 6 + .../service/ISimulationTaskMemberService.java | 7 + .../impl/SimulationTaskMemberServiceImpl.java | 14 ++ .../project/service/impl/TaskServiceImpl.java | 166 ++++++++++++++---- 5 files changed, 160 insertions(+), 39 deletions(-) diff --git a/common/src/main/java/com/sdm/common/entity/resp/project/SpdmTaskVo.java b/common/src/main/java/com/sdm/common/entity/resp/project/SpdmTaskVo.java index 1169c767..22671385 100644 --- a/common/src/main/java/com/sdm/common/entity/resp/project/SpdmTaskVo.java +++ b/common/src/main/java/com/sdm/common/entity/resp/project/SpdmTaskVo.java @@ -213,4 +213,10 @@ public class SpdmTaskVo extends BaseEntity { private String tag9Code; private String tag10Code; + /** + * 仿真关注人 + */ + @JsonProperty(value = "payAttentionMemberList") + private List payAttentionMemberList; + } diff --git a/project/src/main/java/com/sdm/project/model/vo/SpdmNewTaskVo.java b/project/src/main/java/com/sdm/project/model/vo/SpdmNewTaskVo.java index b6a18d8f..ea0c8934 100644 --- a/project/src/main/java/com/sdm/project/model/vo/SpdmNewTaskVo.java +++ b/project/src/main/java/com/sdm/project/model/vo/SpdmNewTaskVo.java @@ -258,4 +258,10 @@ public class SpdmNewTaskVo extends BaseEntity { private String tag9Code; private String tag10Code; + /** + * 仿真关注人 + */ + @JsonProperty(value = "payAttentionMemberList") + private List payAttentionMemberList; + } diff --git a/project/src/main/java/com/sdm/project/service/ISimulationTaskMemberService.java b/project/src/main/java/com/sdm/project/service/ISimulationTaskMemberService.java index 0d42c95c..d813b109 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationTaskMemberService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationTaskMemberService.java @@ -11,4 +11,11 @@ public interface ISimulationTaskMemberService extends IService userIds); + /** + * 根据任务uuid、成员类型、用户id删除某一类型的成员信息 + * @param taskId 任务uuid + * @param type 成员类型(0:仿真负责人,1:仿真执行人,2:3D负责人,3:关注人) + * @param userIds 用户id + */ + void deleteTaskMemberListByIdList(String taskId, Integer type,List userIds); } diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskMemberServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskMemberServiceImpl.java index d48a61fe..c5deb02f 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationTaskMemberServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationTaskMemberServiceImpl.java @@ -36,4 +36,18 @@ public class SimulationTaskMemberServiceImpl extends ServiceImpl userIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SimulationTaskMember::getTaskId, taskId).eq(SimulationTaskMember::getType, type) + .in(SimulationTaskMember::getUserId, userIds); + this.remove(wrapper); + } + } 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 28fdad4d..ee10592c 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 @@ -595,67 +595,144 @@ public class TaskServiceImpl implements ITaskService { return taskList.subList(start, end); } + /** + * 根据用户ID列表获取用户信息列表( + * @param userIdList 用户ID列表(可为空) + * @param cidUserMap 用户ID->用户信息的映射 + * @return 匹配到的用户信息列表 + */ + private List getCidUserListByUserId(List userIdList, Map cidUserMap) { + if (CollectionUtils.isEmpty(userIdList)) { + return new ArrayList<>(); + } + return userIdList.stream() + .map(cidUserMap::get) + .filter(Objects::nonNull) // 过滤掉未匹配到的用户 + .collect(Collectors.toList()); + } + + /** + * 设置任务成员信息(负责人/执行人/关注人) + * @param newTaskVo 目标VO + * @param taskMemberList 该任务的成员列表 + * @param cidUserMap 用户ID->用户信息的映射 + */ + private void setTaskMemberInfo(SpdmNewTaskVo newTaskVo, + List taskMemberList, + Map cidUserMap) { + // 成员列表为空或用户映射为空,直接返回 + if (CollectionUtils.isEmpty(taskMemberList) || cidUserMap.isEmpty()) { + return; + } + // 按成员类型分组,减少多次流式过滤(一次分组,多次使用) + Map> memberType2UserIdMap = taskMemberList.stream() + .collect(Collectors.groupingBy( + SpdmTaskMemberVo::getType, + Collectors.mapping(SpdmTaskMemberVo::getUserId, Collectors.toList()) + )); + // 设置负责人 + newTaskVo.setPMemberList(getCidUserListByUserId(memberType2UserIdMap.get(MemberTypeEnum.PRINCIPAL.getCode()), cidUserMap)); + // 设置执行人 + newTaskVo.setEMemberList(getCidUserListByUserId(memberType2UserIdMap.get(MemberTypeEnum.EXECUTOR.getCode()), cidUserMap)); + // 设置关注人 + newTaskVo.setPayAttentionMemberList(getCidUserListByUserId(memberType2UserIdMap.get(MemberTypeEnum.ATTENTION.getCode()), cidUserMap)); + } + + /** + * 设置需求相关信息(需求名称/提出人/提出人名称) + * @param newTaskVo 目标VO + * @param demandId 需求ID + * @param demandMap 需求ID->需求VO的映射 + * @param demandSubmitMap 需求ID->提出人用户ID的映射 + */ + private void setDemandRelatedInfo(SpdmNewTaskVo newTaskVo, + String demandId, + Map demandMap, + Map demandSubmitMap) { + if (StringUtils.isBlank(demandId)) { + return; + } + // 设置需求名称(没有就返回空字符串) + SpdmDemandVo demandVo = demandMap.getOrDefault(demandId, new SpdmDemandVo()); + newTaskVo.setDemandName(Optional.ofNullable(demandVo.getDemandName()).orElse("")); + // 设置提出人ID + Long submitterId = demandSubmitMap.get(demandId); + newTaskVo.setSubmitter(submitterId); + // 设置提出人名称(提出人ID不为空时查询) + if (submitterId != null) { + SdmResponse userResp = sysUserFeignClient.queryUserDetail( + UserQueryReq.builder().userId(submitterId).build() + ); + if (ObjectUtils.isNotEmpty(userResp) && ObjectUtils.isNotEmpty(userResp.getData())) { + newTaskVo.setSubmitterName(userResp.getData().getNickname()); + } + } + } + + /** * 批量转换为返回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(); + List newTaskList = new ArrayList<>(taskList.size()); + // 1. 处理任务成员&用户信息 + Map> taskMemberMap = Collections.emptyMap(); + Map cidUserMap = Collections.emptyMap(); + List allTaskMemberVoList = batchData.getTaskMemberVoList(); + if (CollectionUtils.isNotEmpty(allTaskMemberVoList)) { + // 过滤当前批次任务的成员 + Set taskIdSet = taskList.stream().map(SpdmTaskVo::getUuid).collect(Collectors.toSet()); + List currentTaskMemberList = allTaskMemberVoList.stream() + .filter(member -> taskIdSet.contains(member.getTaskId())) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(currentTaskMemberList)) { + // 任务ID -> 成员列表的映射 + taskMemberMap = currentTaskMemberList.stream() + .collect(Collectors.groupingBy(SpdmTaskMemberVo::getTaskId)); + // 获取去重的用户ID,查询用户并转为Map(userId -> CIDUserResp) + Set userIdSet = currentTaskMemberList.stream() + .map(SpdmTaskMemberVo::getUserId) + .collect(Collectors.toSet()); + cidUserMap = getCidUserList(new ArrayList<>(userIdSet)).stream() + .collect(Collectors.toMap(CIDUserResp::getUserId, user -> user, (k1, k2) -> k1)); // 处理重复用户ID,保留第一个 + } + } + + // 2. 批量转换每个任务VO for (SpdmTaskVo taskVo : taskList) { - SpdmNewTaskVo spdmNewTaskVo = new SpdmNewTaskVo(); + SpdmNewTaskVo newTaskVo = new SpdmNewTaskVo(); try { - BeanUtils.copyProperties(taskVo, spdmNewTaskVo); + BeanUtils.copyProperties(taskVo, newTaskVo); + String taskId = taskVo.getUuid(); - // 设置标签字段 - 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()); + // 3. 设置任务扩展信息(没有就返回空集合) + newTaskVo.setExtras(taskExtraMap.getOrDefault(taskId, new ArrayList<>())); - // 设置成员列表 - spdmNewTaskVo.setPMemberList(taskVo.getPMemberList()); - spdmNewTaskVo.setEMemberList(taskVo.getEMemberList()); + // 4. 设置任务成员信息(负责人/执行人/关注人) + setTaskMemberInfo(newTaskVo, taskMemberMap.get(taskId), cidUserMap); - // 设置扩展信息 - spdmNewTaskVo.setExtras(taskExtraMap.getOrDefault(taskVo.getUuid(), new ArrayList<>())); + // 5. 设置需求相关信息(提出人/提出人名称) + setDemandRelatedInfo(newTaskVo, taskVo.getDemandId(), demandMap, demandSubmitMap); - // 设置需求信息 - if (StringUtils.isNotBlank(taskVo.getDemandId())) { - spdmNewTaskVo.setDemandName(demandMap.getOrDefault(taskVo.getDemandId(), new SpdmDemandVo()).getDemandName()); - spdmNewTaskVo.setSubmitter(demandSubmitMap.get(taskVo.getDemandId())); + // 6. 设置工位号信息 + setWorkSpaceNodeCode(newTaskVo, taskVo, workSpaceNodeMap, taskNodeTag); - // 查询提出人名称 - 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); + newTaskList.add(newTaskVo); } catch (Exception e) { - log.error("VO转换异常,taskId:{}", taskVo.getUuid(), e); + // 单个任务转换失败不影响整体查询 + log.error("任务VO转换异常,taskId:{}", taskVo.getUuid(), e); } } @@ -862,6 +939,13 @@ public class TaskServiceImpl implements ITaskService { )); } + List getCidUserList(List userIdList) { + if (CollectionUtils.isEmpty(userIdList)) return new ArrayList<>(); + SdmResponse> cidUserResp = sysUserFeignClient.listUserByIds(UserQueryReq.builder().userIds(userIdList).build()); + if (!cidUserResp.isSuccess() || CollectionUtils.isEmpty(cidUserResp.getData())) return new ArrayList<>(); + return cidUserResp.getData(); + } + private void setPMemberList(SpdmTaskVo task, List eachMemberList) { // 由于我分发的、我执行的、我关注的、所有任务,都需要展示仿真负责人,故将负责人抽成方法调用 List pUserIdList = eachMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && StringUtils.equals(task.getUuid(), member.getTaskId())).map(SpdmTaskMemberVo::getUserId).distinct().toList(); @@ -1614,8 +1698,12 @@ public class TaskServiceImpl implements ITaskService { attentionList.add(spdmTaskAttentionReq); } mapper.saveAttentionList(attentionList); + // task_member也新增下,兼容新逻辑 + simulationTaskMemberService.saveTaskMemberList(taskId, MemberTypeEnum.ATTENTION.getCode(), addUserIdList); } else { mapper.deleteAttentionByUserIdList(taskId, cancelUserIdList); + // task_member也删除下,兼容新逻辑 + simulationTaskMemberService.deleteTaskMemberListByIdList(taskId, MemberTypeEnum.ATTENTION.getCode(), addUserIdList); } return SdmResponse.success(); }