From b40f421abbb3394d12d438a7e6df806a6e7b42aa Mon Sep 17 00:00:00 2001 From: xudawei Date: Mon, 10 Feb 2025 11:35:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20(REQ-3300)=20=E5=8F=98=E6=9B=B4?= =?UTF-8?q?=E5=8D=95=E8=AF=A6=E6=83=85-=E4=B8=93=E4=B8=9A=E4=B8=8E?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/response/VisaDetailByIdResponse.java | 72 +++++++++++++--- .../visa/server/dto/VisaConfirmDto.java | 25 +++++- .../rpc/ApolloConstructionAreaGateway.java | 21 +++++ .../visa/server/service/VisaHelper.java | 86 +++++++++++++++++++ .../impl/ChangeRecordConfirmServiceImpl.java | 1 + .../service/impl/ChangeRecordServiceImpl.java | 59 +------------ .../nanopart/visa/server/utils/Constants.java | 5 ++ 7 files changed, 200 insertions(+), 69 deletions(-) diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java index 61a523bf..11fed6b8 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java @@ -5,17 +5,22 @@ import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum; import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum; import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum; import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; /** * @author xudawei @@ -114,6 +119,11 @@ public class VisaDetailByIdResponse { */ private List relationAreaList; + /** + * 区域集合名称 + */ + private String relationAreaName; + /** * 提出时间 */ @@ -130,6 +140,11 @@ public class VisaDetailByIdResponse { */ private List relationProfessionalList; + /** + * 专业集合名称 + */ + private String relationProfessionalName; + /** * 相关单位及人员 */ @@ -291,21 +306,40 @@ public class VisaDetailByIdResponse { @NoArgsConstructor @AllArgsConstructor public static class RelationProfessionalDetail { - /** - * id - */ - private Long id; - /** * code */ private String code; /** - * 名称 + * 构建专业集合-对象集合 */ - private String name; + public static List buildProfessionWithObject(JSONArray relationProfessional) { + if (CollectionUtils.isEmpty(relationProfessional)) { + return Lists.newArrayList(); + } + List professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessionalDetail.class); + + if (CollectionUtils.isEmpty(professionalList)) { + return Lists.newArrayList(); + } + return professionalList; + } + + /** + * 构建专业集合-code集合 + */ + public static Set buildProfessionWithCode(JSONArray relationProfessional) { + List relationProfessionalDetails = RelationProfessionalDetail.buildProfessionWithObject(relationProfessional); + if (CollectionUtils.isEmpty(relationProfessionalDetails)) { + return Sets.newHashSet(); + } + + return relationProfessionalDetails.stream() + .filter(item -> Objects.nonNull(item) && StringUtils.isNotBlank(item.getCode())) + .map(RelationProfessionalDetail::getCode).collect(Collectors.toSet()); + } } @@ -331,10 +365,26 @@ public class VisaDetailByIdResponse { */ private Long id; - /** - * 名称 - */ - private String name; + + public static List buildAreaWithObject(JSONArray relationArea) { + if (CollectionUtils.isEmpty(relationArea)) { + return Lists.newArrayList(); + } + List relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationAreaDetail.class); + if (CollectionUtils.isEmpty(relationAreaList)) { + return Lists.newArrayList(); + } + return relationAreaList; + } + + public static List buildAreaWithId(JSONArray relationArea) { + List areaDetailList = RelationAreaDetail.buildAreaWithObject(relationArea); + + if (CollectionUtils.isEmpty(areaDetailList)) { + return Lists.newArrayList(); + } + return areaDetailList.stream().map(VisaDetailByIdResponse.RelationAreaDetail::getId).collect(Collectors.toList()); + } } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaConfirmDto.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaConfirmDto.java index df73f25c..23edf2f1 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaConfirmDto.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/dto/VisaConfirmDto.java @@ -13,6 +13,7 @@ import org.apache.commons.collections.CollectionUtils; import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -79,6 +80,11 @@ public class VisaConfirmDto { */ private Long projectId; + /** + * 确认工程集合 + */ + private Collection projectIds; + /** * 确认节点 */ @@ -115,20 +121,33 @@ public class VisaConfirmDto { dto.setPersonIds(personIds); } - Collection ouIds = dataItems.stream().map(item -> item.getOuId()).collect(Collectors.toSet()); + Collection ouIds = dataItems.stream() + .filter(item -> Objects.nonNull(item.getOuId())) + .map(item -> item.getOuId()).collect(Collectors.toSet()); if (CollectionUtils.isNotEmpty(ouIds)) { dto.setOuIds(ouIds); } - Collection workspaceIds = dataItems.stream().map(item -> item.getWorkspaceId()).collect(Collectors.toSet()); + Collection workspaceIds = dataItems.stream() + .filter(item -> Objects.nonNull(item.getWorkspaceId())) + .map(item -> item.getWorkspaceId()).collect(Collectors.toSet()); if (CollectionUtils.isNotEmpty(workspaceIds)) { dto.setWorkspaceIds(workspaceIds); } - Set nodeIds = dataItems.stream().map(item -> item.getNodeId()).collect(Collectors.toSet()); + Set nodeIds = dataItems.stream() + .filter(item -> Objects.nonNull(item.getNodeId())) + .map(item -> item.getNodeId()).collect(Collectors.toSet()); if (CollectionUtils.isNotEmpty(nodeIds)) { dto.setNodeIds(nodeIds); } + + Collection projectIds = dataItems.stream() + .filter(item -> CollectionUtils.isNotEmpty(item.getProjectIds())) + .flatMap(item -> item.getProjectIds().stream()).collect(Collectors.toSet()); + if (CollectionUtils.isNotEmpty(projectIds)) { + dto.setProjectIds(projectIds); + } } dto.setVisaTypes(visaTypes); return dto; diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/ApolloConstructionAreaGateway.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/ApolloConstructionAreaGateway.java index c42f5d4d..d3fc01ba 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/ApolloConstructionAreaGateway.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/rpc/ApolloConstructionAreaGateway.java @@ -6,6 +6,8 @@ import cn.axzo.apollo.core.web.Result; import com.alibaba.fastjson.JSON; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.compress.utils.Lists; import org.springframework.stereotype.Service; import java.util.List; @@ -23,6 +25,9 @@ public class ApolloConstructionAreaGateway { public List getAllConstructionAreaByIds(List areaIds) { try { + if (CollectionUtils.isEmpty(areaIds)) { + return Lists.newArrayList(); + } log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,params:{}", JSON.toJSONString(areaIds)); Result> result = apolloConstructionAreaApi.getAllConstructionAreaByIds(areaIds); log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,result:{}", JSON.toJSONString(result)); @@ -34,4 +39,20 @@ public class ApolloConstructionAreaGateway { } + public String generateAreaFullNameByAreaIds(List areaIds) { + try { + if (CollectionUtils.isEmpty(areaIds)) { + return ""; + } + log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,params:{}", JSON.toJSONString(areaIds)); + Result result = apolloConstructionAreaApi.generateAreaFullNameByAreaIds(areaIds); + log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,result:{}", JSON.toJSONString(result)); + return result.getData(); + } catch (Exception e) { + log.warn("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds exception", e); + throw e; + } + + } + } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java index 56fa8151..42906bff 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/VisaHelper.java @@ -2,14 +2,27 @@ package cn.axzo.nanopart.visa.server.service; import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum; import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest; +import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse; import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext; import cn.axzo.nanopart.visa.server.dto.VisaLogParam; +import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway; +import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway; +import cn.axzo.nanopart.visa.server.utils.Constants; +import cn.axzo.thor.client.model.DrawingMajorResp; import com.alibaba.fastjson.JSONArray; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; /** * @author xudawei @@ -26,6 +39,12 @@ public class VisaHelper { @Resource private ChangeRecordService changeRecordService; + @Resource + private DrawingMajorGateway drawingMajorGateway; + + @Resource + private ApolloConstructionAreaGateway apolloConstructionAreaGateway; + /** * 状态更新与添加日志,此时新增记录时状态没有维护 */ @@ -58,4 +77,71 @@ public class VisaHelper { } + /** + * 构建详情的专业回显 + */ + public String buildProfessionalName(Long projectId, JSONArray professionals) { + if (Objects.isNull(projectId) || CollectionUtils.isEmpty(professionals)) { + return ""; + } + Set majorCodes = VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithCode(professionals); + if (CollectionUtils.isEmpty(majorCodes)) { + return ""; + } + List majorRespList = drawingMajorGateway.list(projectId, majorCodes, true); + + // 构建专业集合 key:叶子结点code,value:父节点+子节点的名字 + Map codeNameMap = this.buildProfessionalLeafName(majorRespList); + + if (CollectionUtils.isEmpty(majorCodes)) { + return ""; + } + + return codeNameMap.values().stream().filter(item -> StringUtils.hasText(item)).collect(Collectors.joining(",")); + } + + /** + * 构建区域名称 + */ + public String buildAreaName(JSONArray areas) { + if (CollectionUtils.isEmpty(areas)) { + return ""; + } + return apolloConstructionAreaGateway.generateAreaFullNameByAreaIds(VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithId(areas)); + } + + /** + * @param list 专业集合 + * @return key:叶子结点code,value:父节点+子节点的名字 + */ + private Map buildProfessionalLeafName(List list) { + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyMap(); + } + + Map codeNameMap = new HashMap<>(); + for (DrawingMajorResp resp : list) { + recursionProfessional(resp, resp.getName(), codeNameMap); + } + return codeNameMap; + } + + /** + * 递归专业 + * codeNameMap,key:叶子结点code,value:父节点+子节点的名字 + */ + private void recursionProfessional(DrawingMajorResp drawingMajorResp, String name, Map codeNameMap) { + if (Objects.isNull(drawingMajorResp) || CollectionUtils.isEmpty(drawingMajorResp.getChildren())) { + return; + } + for (DrawingMajorResp resp : drawingMajorResp.getChildren()) { + + if (CollectionUtils.isNotEmpty(resp.getChildren())) { + recursionProfessional(resp, name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName(), codeNameMap); + } else { + codeNameMap.put(resp.getCode(), name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName()); + } + } + } + } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordConfirmServiceImpl.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordConfirmServiceImpl.java index 57e08f49..2fc034b7 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordConfirmServiceImpl.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordConfirmServiceImpl.java @@ -303,6 +303,7 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl buildArea(JSONArray relationArea) { - if (CollectionUtils.isEmpty(relationArea)) { - return Lists.newArrayList(); - } - List relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationArea.class); - if (CollectionUtils.isEmpty(relationAreaList)) { - return Lists.newArrayList(); - } - List areaIds = relationAreaList.stream() - .filter(item -> Objects.nonNull(item.getId())) - .map(VisaDetailByIdResponse.RelationArea::getId).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(areaIds)) { - return Lists.newArrayList(); - } - List list = apolloConstructionAreaGateway.getAllConstructionAreaByIds(areaIds); - if (CollectionUtils.isEmpty(list)) { - return Lists.newArrayList(); - } - return list.stream().map(item -> VisaDetailByIdResponse.RelationAreaDetail.builder() - .id(item.getId()) - .name(item.getName()).build()) - .collect(Collectors.toList()); - } - /** - * 构建专业集合 - */ - private List buildProfession(Long projectId, JSONArray relationProfessional) { - if (Objects.isNull(projectId) || CollectionUtils.isEmpty(relationProfessional)) { - return Lists.newArrayList(); - } - List professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessional.class); - if (CollectionUtils.isEmpty(professionalList)) { - return Lists.newArrayList(); - } - Set majorCodes = professionalList.stream() - .filter(item -> StringUtils.hasText(item.getCode())) - .map(VisaDetailByIdResponse.RelationProfessional::getCode).collect(Collectors.toSet()); - if (CollectionUtils.isEmpty(majorCodes)) { - return Lists.newArrayList(); - } - - List majorRespList = drawingMajorGateway.list(projectId, majorCodes, true); - if (CollectionUtils.isEmpty(majorCodes)) { - return Lists.newArrayList(); - } - return majorRespList.stream() - .map(item -> VisaDetailByIdResponse.RelationProfessionalDetail.builder().id(item.getId()).code(item.getCode()).name(item.getName()).build()) - .collect(Collectors.toList()); - } /** * 通过变更签证Id获取Entity diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/utils/Constants.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/utils/Constants.java index 89862049..a77727a6 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/utils/Constants.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/utils/Constants.java @@ -45,4 +45,9 @@ public class Constants { * 工程签证数据权限的code */ public static final String PROJECT_VISA_DATA_OBJECT = "project_visa"; + + /** + * 工程签证数据权限的code + */ + public static final String SPLIT_TREE_NODE_CHAT = "-"; }