From dff44ba17d1fbee619b51eecb1f65b07e158c9b1 Mon Sep 17 00:00:00 2001 From: liuyang Date: Wed, 25 Dec 2024 10:34:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:[REQ-3282]=20=E5=88=A0=E9=99=A4=E5=86=85?= =?UTF-8?q?=E9=83=A8=E7=B1=BB=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=B1=BB=E8=BF=9B=E8=A1=8C=E4=BC=A0=E9=80=92=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orgmanax/dto/node/dto/OrgNodeDTO.java | 5 ++ .../orgmanax/dto/node/req/ListNodeReq.java | 13 +---- .../node/repository/NodeQueryRepository.java | 43 +++++++-------- .../impl/NodeQueryRepositoryImpl.java | 29 ++++------- .../impl/CooperateShipServiceImpl.java | 3 +- .../impl/NodeFoundationServiceImpl.java | 2 +- .../node/service/impl/NodeServiceImpl.java | 52 ++++++++++++++----- .../node/service/processor/NodeProcessor.java | 3 +- .../impl/NodeUserFoundationServiceImpl.java | 5 +- 9 files changed, 80 insertions(+), 75 deletions(-) diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/dto/OrgNodeDTO.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/dto/OrgNodeDTO.java index 5b0a372..106456e 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/dto/OrgNodeDTO.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/dto/OrgNodeDTO.java @@ -116,6 +116,11 @@ public class OrgNodeDTO implements Serializable { */ private List descendantNodes; + /** + * 子节点 + */ + private List childrenNodes; + /** * 协同关系信息 */ diff --git a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java index fff71cb..7a50a73 100644 --- a/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java +++ b/orgmanax-dto/src/main/java/cn/axzo/orgmanax/dto/node/req/ListNodeReq.java @@ -31,7 +31,7 @@ public class ListNodeReq extends PageReqV2 { /** * 节点名称查询(模糊) */ - private Set nodeName; + private String nodeName; /** * 指定部门类型 @@ -71,22 +71,11 @@ public class ListNodeReq extends PageReqV2 { @Builder.Default private Boolean includeChildren = false; - - /** - * 是否查询节点用户 - */ - private Boolean isSelectNodeUser; - /** * 是否查询删除的 */ private Boolean includeDelete; - /** - * 数据权限缓存数据key - */ - private String dataPermissionCacheKey; - /** * 只返回topNode */ diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java index 1d044f8..eba30b4 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeQueryRepository.java @@ -21,17 +21,17 @@ import java.util.*; */ public interface NodeQueryRepository { - PageResp page(ListReq req); + PageResp page(ListReq req); - default List list(ListReq req) { + default List list(ListReq req) { return page(req).getData(); } - default NodeResp one(OneReq req) { + default OrganizationalNode one(OneReq req) { return oneOpt(req).orElse(null); } - default Optional oneOpt(OneReq req) { + default Optional oneOpt(OneReq req) { req.check(); ListReq page = BeanUtil.toBean(req, ListReq.class); page.setPage(1); @@ -52,26 +52,6 @@ public interface NodeQueryRepository { } } - @EqualsAndHashCode(callSuper = true) - @NoArgsConstructor - @AllArgsConstructor - @Data - @SuperBuilder - class NodeResp extends OrganizationalNode { - /** - * 查询参数指定 needParent = true,才会返回 - * - * @see ListNodeReq#getNeedParent() - */ - private NodeResp parentNode; - - /** - * 项目ID - */ - private Long workspaceId; - } - - @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @AllArgsConstructor @@ -90,9 +70,22 @@ public interface NodeQueryRepository { * 组织单位ids */ @Builder.Default - @CriteriaField(field = "ouId", operator = Operator.IN) + @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) private Collection ouIds = Collections.emptySet(); + /** + * 节点名称 + */ + @CriteriaField(field = "nodeName", operator = Operator.SW) + private String nodeName; + + /** + * 节点名称 + */ + @Builder.Default + @CriteriaField(field = "nodeName", operator = Operator.IN) + private Collection nodeNames = Collections.emptySet(); + /** * 指定部门类型 */ diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java index c48090f..7ab124b 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeQueryRepositoryImpl.java @@ -6,6 +6,7 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.infra.dao.node.dao.NodeDao; import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.orgjob.repository.OrgJobQueryRepository; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.BooleanUtil; @@ -34,7 +35,7 @@ public class NodeQueryRepositoryImpl implements NodeQueryRepository { private final NodeDao nodeDao; @Override - public PageResp page(ListReq req) { + public PageResp page(ListReq req) { IPage page = PageConverter.toMybatis(req, OrganizationalNode.class); QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrganizationalNode.class); @@ -52,29 +53,17 @@ public class NodeQueryRepositoryImpl implements NodeQueryRepository { }); } - IPage results = nodeDao.page(page, wrapper) - .convert(e -> BeanUtil.toBean(e, NodeResp.class)); - PageResp resp = PageConverter.toResp(results); - List records = resp.getData(); + if (wrapper.isEmptyOfWhere()) { + return PageResp.builder().build(); + } + + IPage results = nodeDao.page(page, wrapper); + PageResp resp = PageConverter.toResp(results); + List records = resp.getData(); if (CollUtil.isEmpty(records)) { return resp; } return resp; } - private void assembleParentNode(ListReq req, List records) { -// if (!BooleanUtil.isTrue(req.getIncludeAncestors())) { -// return; -// } -// Map nodesById = records.stream().collect(Collectors.toMap(NodeResp::getId, Function.identity())); -// // assemble parentNode -// Set parentNodeIds = records.stream().map(OrganizationalNode::getParentId).collect(Collectors.toSet()); -// Set needQueryDbParentNodeIds = Sets.difference(nodesById.keySet(), parentNodeIds); -// Stream queryDbParentNodes = needQueryDbParentNodeIds.isEmpty() ? Stream.of() -// : nodeDao.listByIds(needQueryDbParentNodeIds).stream().map(e -> BeanUtil.toBean(e, NodeResp.class)); -// Map parentNodeByParentId = Stream.concat(records.stream().filter(s -> parentNodeIds.contains(s.getId())), queryDbParentNodes) -// .collect(Collectors.toMap(OrganizationalNode::getId, Function.identity())); -// records.forEach(r -> r.setParentNode(parentNodeByParentId.get(r.getParentId()))); - } - } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java index 4e42626..71764c1 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java @@ -14,6 +14,7 @@ import cn.axzo.orgmanax.infra.client.workspace.WorkspaceGateway; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository; @@ -59,7 +60,7 @@ public class CooperateShipServiceImpl implements CooperateShipService { @Override public SaasCooperateShip create(CreateReq req) { // node check - NodeQueryRepository.NodeResp node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build()) + OrganizationalNode node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build()) .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId())); Axssert.check(node.isTopNode(), BizResultCode.INVALID_PARAM, "只有顶级节点才能添加协同关系"); // workspace check diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java index 70529cf..a2ba09e 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java @@ -73,7 +73,7 @@ public class NodeFoundationServiceImpl implements NodeFoundationService { .topNodeId(savedNode.getTopNodeId()) .path(savedNode.getPath()) .build()); - NodeQueryRepository.NodeResp saved = nodeQueryRepository.one(NodeQueryRepository.OneReq.builder().id(organizationalNode.getId()).build()); + OrganizationalNode saved = nodeQueryRepository.one(NodeQueryRepository.OneReq.builder().id(organizationalNode.getId()).build()); // 发送数据变更基础MQ eventProducer.send(Event.builder() diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java index fe6057e..8fa0378 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java @@ -10,6 +10,7 @@ import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; @@ -57,7 +58,7 @@ public class NodeServiceImpl implements NodeService { Axssert.notNull(req.getAction(), BizResultCode.INVALID_PARAM, "执行行为不能为空"); Axssert.notNull(req.getOperatorId(), BizResultCode.INVALID_PARAM, "操作人不能为空"); // 如果指定了id,校验部门是否存在,并加载出node,以便后续使用 - NodeQueryRepository.NodeResp current = req.getId() == null ? null + OrganizationalNode current = req.getId() == null ? null : nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getId()).build()) .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("要操作的部门不存在,{}", req.getId())); @@ -83,6 +84,9 @@ public class NodeServiceImpl implements NodeService { .pageSize(req.getPageSize()) .ids(req.getIds()) .ouIds(req.getOuIds()) + .topNodeIds(req.getTopNodeIds()) + .nodeName(req.getNodeName()) + .nodeNames(req.getNodeNames()) .includeOrgNodeTypes(req.getIncludeOrgNodeTypes()) .excludeOrgNodeTypes(req.getExcludeOrgNodeTypes()) .includeDelete(req.getIncludeDelete()) @@ -130,7 +134,7 @@ public class NodeServiceImpl implements NodeService { } // 查询组织节点 - PageResp page = nodeQueryRepository.page(reqListBuilder.build()); + PageResp page = nodeQueryRepository.page(reqListBuilder.build()); if (CollUtil.isEmpty(page.getData())) { return emptyPageResp; } @@ -141,14 +145,14 @@ public class NodeServiceImpl implements NodeService { // 是否查询父级节点 if (BooleanUtil.isTrue(req.getIncludeParent())) { Set parentIds = nodeFoundationService.extractParentIds(page.getData()); - List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(parentIds).build()); + List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(parentIds).build()); assembleParentNodes(records, parentNodes); } // 是否查询祖父节点 if (BooleanUtil.isTrue(req.getIncludeAncestors())) { Set ancestorIds = nodeFoundationService.extractAncestorIds(page.getData()); - List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(ancestorIds).build()); + List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(ancestorIds).build()); if (CollUtil.isNotEmpty(parentNodes)) { assembleParentNodes(records, parentNodes); assembleAncestorNodes(records, parentNodes); @@ -158,18 +162,20 @@ public class NodeServiceImpl implements NodeService { // 是否查询子孙节点 if (BooleanUtil.isTrue(req.getIncludeDescendants())) { Set paths = nodeFoundationService.extractPaths(page.getData(), ","); - List descendantsNodes = nodeQueryRepository.list( + List descendantsNodes = nodeQueryRepository.list( NodeQueryRepository.ListReq.builder() .pathsRight(paths).build()); + assembleChildrenNodes(records, descendantsNodes); assembleDescendantNodes(records, descendantsNodes); } // 是否查询子节点 if (BooleanUtil.isTrue(req.getIncludeChildren())) { - Set ids = nodeFoundationService.extract(page.getData(), NodeQueryRepository.NodeResp::getId); - List childrenNodes = nodeQueryRepository.list( + Set ids = nodeFoundationService.extract(page.getData(), OrganizationalNode::getId); + List childrenNodes = nodeQueryRepository.list( NodeQueryRepository.ListReq.builder() .parentIds(ids).build()); + assembleChildrenNodes(records, childrenNodes); } return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records); @@ -181,11 +187,11 @@ public class NodeServiceImpl implements NodeService { * @param nodes * @param ancestorNodes */ - public void assembleAncestorNodes(List nodes, List ancestorNodes) { + public void assembleAncestorNodes(List nodes, List ancestorNodes) { if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(ancestorNodes)) { return; } - Map parentNodeMap = ancestorNodes.stream().collect(Collectors.toMap(NodeQueryRepository.NodeResp::getId, Function.identity())); + Map parentNodeMap = ancestorNodes.stream().collect(Collectors.toMap(OrganizationalNode::getId, Function.identity())); nodes.forEach(e -> { String[] parentIds = e.getPath().split(","); e.setAncestorNodes(Arrays.stream(parentIds) @@ -203,17 +209,17 @@ public class NodeServiceImpl implements NodeService { * @param nodes * @param parentNodes */ - public void assembleParentNodes(List nodes, List parentNodes) { + public void assembleParentNodes(List nodes, List parentNodes) { if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(parentNodes)) { return; } - Map parentNodeMap = parentNodes.stream().collect(Collectors.toMap(NodeQueryRepository.NodeResp::getId, Function.identity())); + Map parentNodeMap = parentNodes.stream().collect(Collectors.toMap(OrganizationalNode::getId, Function.identity())); nodes.forEach(e -> { Long parentId = e.getParentId(); if (Objects.isNull(parentId) || parentId == 0) { return; } - NodeQueryRepository.NodeResp nodeResp = parentNodeMap.get(parentId); + OrganizationalNode nodeResp = parentNodeMap.get(parentId); e.setParentNode(BeanUtil.copyProperties(nodeResp, OrgNodeDTO.class)); }); } @@ -224,7 +230,7 @@ public class NodeServiceImpl implements NodeService { * @param nodes * @param descendantNodes */ - public void assembleDescendantNodes(List nodes, List descendantNodes) { + public void assembleDescendantNodes(List nodes, List descendantNodes) { if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(descendantNodes)) { return; } @@ -236,4 +242,24 @@ public class NodeServiceImpl implements NodeService { .collect(Collectors.toList())); }); } + + /** + * 聚合祖父节点 + * + * @param nodes + * @param childrenNodes + */ + public void assembleChildrenNodes(List nodes, List childrenNodes) { + if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(childrenNodes)) { + return; + } + Map> childrenNodeMap = childrenNodes + .stream() + .map(t -> BeanUtil.copyProperties(t, OrgNodeDTO.class)) + .collect(Collectors.groupingBy(OrgNodeDTO::getParentId)); + nodes.forEach(e -> { + List orgNodeDTOS = childrenNodeMap.get(e.getId()); + e.setChildrenNodes(CollUtil.emptyIfNull(orgNodeDTOS)); + }); + } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java index 8c8e92e..5480f34 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java @@ -1,6 +1,7 @@ package cn.axzo.orgmanax.server.node.service.processor; import cn.axzo.orgmanax.dto.node.req.ProcessNodeReq; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import com.alibaba.fastjson.JSONObject; import lombok.AccessLevel; @@ -23,7 +24,7 @@ public interface NodeProcessor { @NoArgsConstructor @AllArgsConstructor class ProcessContext { - NodeQueryRepository.NodeResp node; + OrganizationalNode node; ProcessNodeReq.Action action; JSONObject params; diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java index c2097ef..c0c99e2 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java @@ -11,6 +11,7 @@ import cn.axzo.orgmanax.infra.client.profile.dto.ProfileIdentityResp; import cn.axzo.orgmanax.infra.client.profile.dto.ProfilePersonResp; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; @@ -60,7 +61,7 @@ public class NodeUserFoundationServiceImpl implements NodeUserFoundationService param.check(); // 部门是否存在 - NodeQueryRepository.NodeResp node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(param.getNodeId()).build()) + OrganizationalNode node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(param.getNodeId()).build()) .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", param.getNodeId())); // 人是否存在 @@ -141,7 +142,7 @@ public class NodeUserFoundationServiceImpl implements NodeUserFoundationService nodeUsers.removeIf(e -> !jobIds.contains(e.getOrganizationalJobId())); } - private Long resolveWorkspaceId(NodeQueryRepository.NodeResp node) { + private Long resolveWorkspaceId(OrganizationalNode node) { if (Objects.equals(node.getNodeType(), NodeUserTypeEnum.TEAM.getValue())) { return 0L; }