From 9e840230dae902d0c84c6cf56cb0c75d2f35ba82 Mon Sep 17 00:00:00 2001 From: lidongyang <506508008@qq.com> Date: Fri, 20 Mar 2026 07:57:02 +0800 Subject: [PATCH] =?UTF-8?q?fix[project]:=20=E4=BB=BF=E7=9C=9F=E7=AD=96?= =?UTF-8?q?=E5=88=92=E6=97=B6=EF=BC=8C=E5=8F=AF=E4=BB=A5=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?3D=E8=B4=9F=E8=B4=A3=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sdm/project/model/bo/TaskNode.java | 6 + .../service/impl/ProjectServiceImpl.java | 278 ++++++++++++++++++ 2 files changed, 284 insertions(+) diff --git a/project/src/main/java/com/sdm/project/model/bo/TaskNode.java b/project/src/main/java/com/sdm/project/model/bo/TaskNode.java index 514cb1b8..06e09075 100644 --- a/project/src/main/java/com/sdm/project/model/bo/TaskNode.java +++ b/project/src/main/java/com/sdm/project/model/bo/TaskNode.java @@ -197,6 +197,12 @@ public class TaskNode extends BaseEntity { @JsonProperty(value = "payAttentionMemberList") private String payAttentionMemberList; + /** + * 3D负责人 + */ + @JsonProperty(value = "tMemberList") + private String tMemberList; + /** * 任务名称 */ diff --git a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java index 7c53b72e..29976da0 100644 --- a/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/ProjectServiceImpl.java @@ -19,6 +19,7 @@ import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.task.TaskTreeExportExcelFormat; import com.sdm.common.entity.req.task.TaskTreeExportExcelParam; import com.sdm.common.entity.resp.capability.FlowTemplateResp; +import com.sdm.common.entity.resp.data.BatchCreateNormalDirResp; import com.sdm.common.entity.resp.data.FileMetadataInfoResp; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.data.SimulationTaskResultCurveResp; @@ -46,6 +47,7 @@ import com.sdm.project.common.MemberTypeEnum; import com.sdm.project.common.NodeMemberTypeEnum; import com.sdm.project.common.TaskExeStatusEnum; import com.sdm.project.common.VersionEnum; +import com.sdm.project.dao.SimulationDemandMapper; import com.sdm.project.dao.SimulationNodeMapper; import com.sdm.project.dao.SimulationProjectMapper; import com.sdm.project.dao.SimulationTaskMapper; @@ -54,6 +56,7 @@ import com.sdm.project.model.entity.*; import com.sdm.project.model.po.*; import com.sdm.project.model.req.*; import com.sdm.project.model.resp.WorkspaceReportListResp; +import com.sdm.project.model.vo.SpdmDemandVo; import com.sdm.project.model.vo.SpdmNodeExtraVo; import com.sdm.project.model.vo.SpdmNodeMemberVo; import com.sdm.project.model.vo.SpdmNodeVo; @@ -206,6 +209,9 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { @Autowired private CacheManager cacheManager; + @Autowired + private SimulationDemandMapper demandMapper; + // @Override // @Transactional @@ -1758,6 +1764,13 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { simulationTaskMemberService.saveTaskMemberList(projectNode.getUuid(), MemberTypeEnum.ATTENTION.getCode(), longUserIdList); } + // 设置3D负责人人 + if(StringUtils.isNotBlank(projectNode.getTMemberList())){ + String[] userIdArr = projectNode.getTMemberList().split(","); + List longUserIdList = Arrays.stream(userIdArr).filter(s -> !s.isEmpty()).map(Long::valueOf).collect(Collectors.toList()); + simulationTaskMemberService.saveTaskMemberList(projectNode.getUuid(), MemberTypeEnum.THREED.getCode(), longUserIdList); + } + List extraList = projectNode.getExtras(); if (CollectionUtils.isNotEmpty(extraList)) { for (TaskExtraNode extra : extraList) { @@ -2344,6 +2357,12 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { for (TaskNode taskNode : taskNodeList) { updatePermission(userId,taskNode.getUuid(),FilePermissionEnum.READ.getValue()); } + // 20260320 新增任务时,同步新增一个需求 + try { + addDemandByTask(taskNodeList); + }catch (Exception ex) { + log.error("新增任务时,同步新增一个需求时异常:{}",ex.getMessage()); + } } if (CollectionUtils.isNotEmpty(taskNodeExtraList)) { taskNodeExtraList.forEach(projectNode -> projectNode.setCreateTime(createTime)); @@ -2420,6 +2439,265 @@ public class ProjectServiceImpl extends BaseService implements IProjectService { return response; } + public void addDemandByTask(List taskNodeList) { + log.info("策划任务时,新增需求"); +// Long tenantId = ThreadLocalContext.getTenantId(); +// Long jobNumber = ThreadLocalContext.getUserId(); +// for (TaskNode taskNode : taskNodeList) { +// SpdmDemandVo demandByName = demandMapper.getDemandByNameNoPermission(tenantId,String.join(",", taskNode.getTag10())); +// if (ObjectUtils.isNotEmpty(demandByName)) { +// log.error("需求名称:{},已存在",demandByName.getDemandName()); +// continue; +// } +// SpdmAddDemandReq req = new SpdmAddDemandReq(); +// req.setCreator(jobNumber); +// // 获取仿真负责人 +// String pMemberList = taskNode.getPMemberList(); +// // 获取仿真执行人 +// String eMemberList = taskNode.getEMemberList(); +// // 3D负责人 +// String threeDMemberList = taskNode.getTMemberList(); +// // 关注人 +// String attentionMemberList = taskNode.getAMemberList(); +// +// +// +//// if (demandMapper.addDemand(req, tenantId, jobNumber) <= 0) { +//// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +//// return SdmResponse.failed("新增需求失败!"); +//// } +// } +// +// +// +// +// // 获取需求额外属性 +// List demandExtraList = req.getExtras(); +// String curDateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); +// req.setCreateTime(curDateStr); +// req.setUuid(RandomUtil.generateString(32)); +// +// +// if (mapper.addDemand(req, tenantId, jobNumber) <= 0) { +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// return SdmResponse.failed("新增需求失败!"); +// } +// long demandId = req.getId(); +// log.info("需求主键id为(无权限校验):{}", demandId); +// List allMemberList = new ArrayList<>(); +// String uuid = req.getUuid(); +// if (StringUtils.isNotBlank(pMemberList)) { +// String[] pMemberArray = pMemberList.split(","); +// for (String userId : pMemberArray) { +// SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq(); +// spdmDemandRelateMemberReq.setDemandId(uuid); +// spdmDemandRelateMemberReq.setType(0); +// spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId)); +// spdmDemandRelateMemberReq.setCreateTime(curDateStr); +// spdmDemandRelateMemberReq.setCreator(jobNumber); +// allMemberList.add(spdmDemandRelateMemberReq); +// } +// } +// +// if (StringUtils.isNotBlank(eMemberList)) { +// String[] eMemberArray = eMemberList.split(","); +// for (String userId : eMemberArray) { +// SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq(); +// spdmDemandRelateMemberReq.setDemandId(uuid); +// spdmDemandRelateMemberReq.setType(1); +// spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId)); +// spdmDemandRelateMemberReq.setCreateTime(curDateStr); +// spdmDemandRelateMemberReq.setCreator(jobNumber); +// allMemberList.add(spdmDemandRelateMemberReq); +// } +// } +// +// if (StringUtils.isNotBlank(threeDMemberList)) { +// String[] threeDMemberArray = threeDMemberList.split(","); +// for (String userId : threeDMemberArray) { +// SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq(); +// spdmDemandRelateMemberReq.setDemandId(uuid); +// spdmDemandRelateMemberReq.setType(2); +// spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId)); +// spdmDemandRelateMemberReq.setCreateTime(curDateStr); +// spdmDemandRelateMemberReq.setCreator(jobNumber); +// allMemberList.add(spdmDemandRelateMemberReq); +// } +// } +// +// if (StringUtils.isNotBlank(attentionMemberList)) { +// String[] attentionMemberArray = attentionMemberList.split(","); +// for (String userId : attentionMemberArray) { +// SpdmDemandRelateMemberReq spdmDemandRelateMemberReq = new SpdmDemandRelateMemberReq(); +// spdmDemandRelateMemberReq.setDemandId(uuid); +// spdmDemandRelateMemberReq.setType(3); +// spdmDemandRelateMemberReq.setUserId(Long.valueOf(userId)); +// spdmDemandRelateMemberReq.setCreateTime(curDateStr); +// spdmDemandRelateMemberReq.setCreator(jobNumber); +// allMemberList.add(spdmDemandRelateMemberReq); +// } +// } +// +// if (CollectionUtils.isNotEmpty(allMemberList)) { +// if (mapper.addDemandMember(allMemberList) <= 0) { +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// return SdmResponse.failed("新增需求关联成员失败!"); +// } +// } +// if (CollectionUtils.isNotEmpty(demandExtraList)) { +// demandExtraList.forEach(demandExtra -> { +// demandExtra.setDemandId(req.getUuid()); +// demandExtra.setCreateTime(curDateStr); +// demandExtra.setCreator(jobNumber); +// }); +// if (mapper.addDemandExtra(demandExtraList) <= 0) { +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// return SdmResponse.failed("新增需求额外属性失败!"); +// } +// } +// +// +// // 项目层级文件夹和需求文件夹中,新增一层【需求附件】文件夹 +// String projectNodeId = req.getProjectId(); +// BatchCreateNormalDirReq batchCreateNormalDirReq = new BatchCreateNormalDirReq(); +// SdmResponse fileMetadataInfoResp = dataFeignClient.queryFileMetadataInfo(projectNodeId, NodeTypeEnum.PROJECT.getValue(), 0L); +// if (fileMetadataInfoResp.getData() == null) { +// log.error("fileMetadataInfoResp为空,projectNodeId为:{}",projectNodeId); +// return SdmResponse.failed("新增需求失败!"); +// } +// // 查询需求附件的uuid,元数据表中【parentId是project的元数据主键id且originalName为:需求附件】 +// FileMetadataInfoResp projectMetadataInfo = fileMetadataInfoResp.getData(); +// SdmResponse> listSdmResponse = dataFeignClient.listDir(DirTypeEnum.PROJECT_NODE_DIR.getValue(), projectMetadataInfo.getId()); +// if (!listSdmResponse.isSuccess() || CollectionUtils.isEmpty(listSdmResponse.getData())) { +// log.error("listSdmResponse为空,project的元数据主键id为:{}",projectMetadataInfo.getId()); +// return SdmResponse.failed("新增需求失败!"); +// } +// List childrenMetadataInfoList = listSdmResponse.getData(); +// FileMetadataInfoResp demandAttachFileMetadataInfoResp = childrenMetadataInfoList.stream().filter(metadataInfo -> AttachFileTypeEnum.DEMAND_FILE.getValue().equals(metadataInfo.getOriginalName())).findFirst().orElse(null); +// Long demandAttachFileMetadataInfoId; +// if (ObjectUtils.isEmpty(demandAttachFileMetadataInfoResp)) { +// log.info("未查询到需求附件文件夹,当前项目下的子文件夹为:{}",childrenMetadataInfoList); +// // 项目层级文件夹和需求文件夹中,新增一层【需求附件】文件夹 +// List demandAttachFolderItemReqList = new ArrayList<>(); +// BatchCreateNormalDirReq demandAttachBatchCreateNormalDirReq = new BatchCreateNormalDirReq(); +// demandAttachBatchCreateNormalDirReq.setParentUUId(projectNodeId); +// FolderItemReq demandAttachFolderItemReq = new FolderItemReq(); +// demandAttachFolderItemReq.setFolderName(AttachFileTypeEnum.DEMAND_FILE.getValue()); +// demandAttachFolderItemReq.setFolderUuid(RandomUtil.generateString(32)); +// // 利元亨定制 +// TagReq tagReq = new TagReq(); +// String projectId = req.getProjectId(); +// String phaseId = req.getPhaseId(); +// String machineId = req.getMachineId(); +// String workspaceId = req.getWorkspaceId(); +// tagReq.setTag1(projectId); +// tagReq.setTag2(phaseId); +// tagReq.setTag4(machineId); +// tagReq.setTag5(workspaceId); +// demandAttachFolderItemReq.setTagReq(tagReq); +// demandAttachFolderItemReqList.add(demandAttachFolderItemReq); +// demandAttachBatchCreateNormalDirReq.setFolderItems(demandAttachFolderItemReqList); +// demandAttachBatchCreateNormalDirReq.setSkipPermissionCheck(true); +// log.info("创建需求附件文件夹请求参数:{}", demandAttachBatchCreateNormalDirReq); +// BatchCreateNormalDirResp batchCreateNormalDirResp; +// try { +// SdmResponse response = dataFeignClient.batchCreateNormalDirs(demandAttachBatchCreateNormalDirReq); +// log.info("创建需求附件文件夹响应:{}", response); +// if (!response.isSuccess() || ObjectUtils.isEmpty(response.getData())) { +// log.error("调用创建需求附件文件夹接口失败,原因为:{}", response.getMessage()); +// return SdmResponse.failed("创建需求附件文件夹失败:,原因为:" + response.getMessage()); +// } +// batchCreateNormalDirResp = response.getData(); +// } catch (Exception e) { +// log.error("调用创建需求附件文件夹接口失败", e); +// return SdmResponse.failed("创建需求附件文件夹失败:" + e.getMessage()); +// } +// +// if (ObjectUtils.isEmpty(batchCreateNormalDirResp)) { +// log.error("batchCreateNormalDirResp为空"); +// return SdmResponse.failed("创建需求附件文件夹失败"); +// } +// List successList = batchCreateNormalDirResp.getSuccessList(); +// if (CollectionUtils.isEmpty(successList)) { +// log.error("successList为空"); +// return SdmResponse.failed("创建需求附件文件夹失败"); +// } +// // 需求附件文件夹的元数据主键id +// demandAttachFileMetadataInfoId = successList.get(0).getId(); +// }else { +// demandAttachFileMetadataInfoId = demandAttachFileMetadataInfoResp.getId(); +// } +// batchCreateNormalDirReq.setParentId(demandAttachFileMetadataInfoId); +// FolderItemReq folderItemReq = new FolderItemReq(); +// folderItemReq.setFolderName(req.getDemandName()); +// folderItemReq.setFolderUuid(req.getUuid()); +// // 利元亨定制 +// TagReq tagReq = new TagReq(); +// String projectId = req.getProjectId(); +// String phaseId = req.getPhaseId(); +// String machineId = req.getMachineId(); +// String workspaceId = req.getWorkspaceId(); +// tagReq.setTag1(projectId); +// tagReq.setTag2(phaseId); +// tagReq.setTag4(machineId); +// tagReq.setTag5(workspaceId); +// folderItemReq.setTagReq(tagReq); +// batchCreateNormalDirReq.setFolderItems(Collections.singletonList(folderItemReq)); +// batchCreateNormalDirReq.setSkipPermissionCheck(true); +// log.info("创建需求文件夹参数(无权限校验): {}", batchCreateNormalDirReq); +// SdmResponse dirCreateResp = dataFeignClient.batchCreateNormalDirs(batchCreateNormalDirReq); +// if (ObjectUtils.isEmpty(dirCreateResp) || dirCreateResp.getCode() != ResultCode.SUCCESS.getCode()) { +// log.error("创建项目:{}下的{}需求文件夹(无权限校验)时,创建文件夹失败,原因为:{}", req.getProjectId(),req.getDemandName(), dirCreateResp.getMessage()); +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// return SdmResponse.failed("您没有选择项目的相应权限,请更换其他项目进行创建"); +// } +// log.info("创建需求文件夹响应(无权限校验): {}", dirCreateResp); +// +// // 更新需求创建人对需求文件夹的权限 & 更新需求仿真负责人(确认人)对需求文件夹的权限(预览、下载) +// Long userId = ThreadLocalContext.getUserId(); +// UpdatePermissionReq updatePermissionReq = new UpdatePermissionReq(); +// updatePermissionReq.setUuid(uuid); +// Map userPermissions = new HashMap<>(); +// // 创建人 +// userPermissions.put(userId, FilePermissionEnum.ALL.getValue()); +// // 仿真负责人 +// if (CollectionUtils.isNotEmpty(allMemberList)) { +// // 兼容创建人和负责人是同一个人的情况 +// allMemberList.stream().filter(member -> MemberTypeEnum.PRINCIPAL.getCode().equals(member.getType()) && !Objects.equals(userId, member.getUserId())).forEach(member -> { +// userPermissions.put(member.getUserId(), FilePermissionEnum.BASE.getValue()); +// }); +// } +// +// // 仿真负责人还需要对选择的节点有创建和预览权限 +// UpdatePermissionReq updateNodePermissionReq = new UpdatePermissionReq(); +// updateNodePermissionReq.setUuid(req.getWorkspaceId()); +// Map userForNodePermissions = new HashMap<>(); +// if (StringUtils.isNotBlank(pMemberList)) { +// String[] pMemberArray = pMemberList.split(","); +// for (String pUserId : pMemberArray) { +// userForNodePermissions.put(Long.valueOf(pUserId), FilePermissionEnum.ALL_EXCLUDE_DELETE.getValue()); +// } +// updateNodePermissionReq.setUserPermissions(userForNodePermissions); +// log.info("创建需求时,更新需求仿真负责人(确认人)工位节点权限的参数为:{}",updateNodePermissionReq); +// SdmResponse updateNodePermissionResponse = dataFeignClient.updatePermission(updateNodePermissionReq); +// log.info("创建需求时,更新需求仿真负责人(确认人)工位节点权限的返回值为:{}",updateNodePermissionResponse); +// } +// +// updatePermissionReq.setUserPermissions(userPermissions); +// log.info("创建需求时(无权限校验),更新需求创建人和需求仿真负责人(确认人)权限的参数为:{}",updatePermissionReq); +// SdmResponse updatePermissionResponse = dataFeignClient.updatePermission(updatePermissionReq); +// log.info("创建需求时(无权限校验),更新需求创建人和需求仿真负责人(确认人)权限的返回值为:{}",updatePermissionResponse); +// +// // 只有利元亨需要在创建需求的同时创建任务 +// if (req.getIsLyric()) { +// SimulationDemand demand = new SimulationDemand(); +// BeanUtils.copyProperties(req, demand); +// simulationTaskService.batchCreateTaskFromDemand(Collections.singletonList(demand)); +// } +// +// return SdmResponse.success(req.getUuid()); + } + // private SdmResponse realAddSimulationTaskItems(TaskNodeTree taskNodeTree, String parentId, Long tenantId,HashMap> idMap,HashMap> taskIdMap) { // Long jobNumber = ThreadLocalContext.getUserId(); // SdmResponse response = SdmResponse.success();