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 999cb7f..4066856 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 @@ -101,8 +101,26 @@ public class OrgNodeDTO implements Serializable { private Long updateBy; private Long isDelete = 0L; + /** + * 父级节点 + */ private OrgNodeDTO parentNode; + /** + * 祖父节点 + */ + private List ancestorNodes; + + /** + * 子节点 + */ + private List childrenNode; + + /** + * 子孙节点 + */ + private List descendantNodes; + /** * 协同关系信息 */ diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/NodeFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/NodeFoundationService.java index 44bb9e4..db1dfce 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/NodeFoundationService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/NodeFoundationService.java @@ -60,5 +60,4 @@ public interface NodeFoundationService { * @return */ Set extract(List currentNodeList, Function function); - } 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 ca9d213..70529cf 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 @@ -14,13 +14,15 @@ import cn.axzo.orgmanax.server.node.foundation.NodeFoundationService; import cn.axzo.orgmanax.server.node.foundation.req.NodeCreate; import cn.axzo.orgmanax.server.node.foundation.req.NodeUpdate; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; 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 3bcbfb7..2f37f5c 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 @@ -13,6 +13,7 @@ import cn.axzo.orgmanax.infra.client.tyr.dto.BatchSuperAdminListResp; import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; 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; @@ -29,6 +30,7 @@ import cn.hutool.core.util.BooleanUtil; import com.google.common.collect.ImmutableMap; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -119,7 +121,7 @@ public class NodeServiceImpl implements NodeService { // 根据项目ID获取topNodeId进行组织节点过滤 if (CollUtil.isNotEmpty(req.getWorkspaceIds())) { - List topNodeIds = CollUtil.map(cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder() + List topNodeIds = CollUtil.map(cooperateShipQueryRepository.list(CooperateShipQueryRepository.ListReq.builder() .workspaceIds(req.getWorkspaceIds()) .workspaceOuPairs(BeanUtil.copyToList(req.getWorkspaceOuPairs(), CooperateShipQueryRepository.WorkspaceOuPair.class)) .build()), SaasCooperateShip::getOrganizationalNodeId, true); @@ -135,23 +137,29 @@ public class NodeServiceImpl implements NodeService { return emptyPageResp; } + // 转换为DTO + List records = page.getData().stream().map(e -> BeanUtil.toBean(e, OrgNodeDTO.class)).collect(Collectors.toList()); + // 是否查询父级节点 if (BooleanUtil.isTrue(req.getIncludeParent())) { Set parentIds = nodeFoundationService.extractParentIds(page.getData()); List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(parentIds).build()); - page.getData().addAll(parentNodes); + assembleParentNodes(records, parentNodes); } // 是否查询祖父节点 if (BooleanUtil.isTrue(req.getIncludeAncestors())) { Set ancestorIds = nodeFoundationService.extractAncestorIds(page.getData()); List parentNodes = nodeQueryRepository.list(NodeQueryRepository.ListReq.builder().ids(ancestorIds).build()); - page.getData().addAll(parentNodes); + if (CollUtil.isNotEmpty(parentNodes)) { + assembleParentNodes(records, parentNodes); + assembleAncestorNodes(records, parentNodes); + } } // 是否查询子孙节点 if (BooleanUtil.isTrue(req.getIncludeDescendants())) { - Set paths = nodeFoundationService.extractPaths(page.getData(), ","); + Set paths = nodeFoundationService.extractPaths(page.getData(), ","); List descendantsNodes = nodeQueryRepository.list( NodeQueryRepository.ListReq.builder() .pathsRight(paths).build()); @@ -164,11 +172,97 @@ public class NodeServiceImpl implements NodeService { List descendantShipNodes = nodeQueryRepository.list( NodeQueryRepository.ListReq.builder() .parentIds(ids).build()); - page.getData().addAll(descendantShipNodes); + assembleChildrenNodes(records, descendantShipNodes); } - List records = page.getData().stream().map(e -> BeanUtil.toBean(e, OrgNodeDTO.class)).collect(Collectors.toList()); + return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records); } + /** + * 聚合祖父节点 + * + * @param nodes + * @param 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())); + nodes.forEach(e -> { + String[] parentIds = e.getPath().split(","); + e.setAncestorNodes(Arrays.stream(parentIds) + .map(Long::valueOf) + .map(parentNodeMap::get) + .map(t -> BeanUtil.copyProperties(t, OrgNodeDTO.class)) + .filter(Objects::nonNull) + .collect(Collectors.toList())); + }); + } + + /** + * 聚合祖父节点 + * + * @param nodes + * @param 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())); + nodes.forEach(e -> { + Long parentId = e.getParentId(); + if (Objects.isNull(parentId) || parentId == 0) { + return; + } + NodeQueryRepository.NodeResp nodeResp = parentNodeMap.get(parentId); + e.setParentNode(BeanUtil.copyProperties(nodeResp, OrgNodeDTO.class)); + }); + } + + /** + * 聚合祖父节点 + * + * @param nodes + * @param childrenNodes + */ + public void assembleChildrenNodes(List nodes, List childrenNodes) { + if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(childrenNodes)) { + return; + } + Map childrenNodeMap = childrenNodes.stream() + .filter(t -> t.getParentId() != null && t.getParentId() != 0) + .collect(Collectors.toMap(NodeQueryRepository.NodeResp::getParentId, Function.identity())); + nodes.forEach(e -> { + NodeQueryRepository.NodeResp nodeResp = childrenNodeMap.get(e.getId()); + e.setParentNode(BeanUtil.copyProperties(nodeResp, OrgNodeDTO.class)); + }); + } + + /** + * 聚合祖父节点 + * + * @param nodes + * @param descendantNodes + */ +// public void assembleDescendantNodes(List nodes, List descendantNodes) { +// if (CollUtil.isEmpty(nodes) || CollUtil.isEmpty(descendantNodes)) { +// return; +// } +// Map childrenNodeMap = descendantNodes.stream() +// .filter(t -> t.getParentId() != null && t.getParentId() != 0) +// .collect(Collectors.toMap(NodeQueryRepository.NodeResp::getParentId, Function.identity())); +// nodes.forEach(e -> { +// NodeQueryRepository.NodeResp nodeResp = childrenNodeMap.get(e.getId()); +// e.setDescendantNodes(Arrays.stream(parentIds) +// .map(Long::valueOf) +// .map(parentNodeMap::get) +// .map(t -> BeanUtil.copyProperties(t, OrgNodeDTO.class)) +// .filter(Objects::nonNull) +// .collect(Collectors.toList())); +// }); +// } + }