From 136c16307649b973f1bbbd5783b8047562988230 Mon Sep 17 00:00:00 2001 From: luofu Date: Wed, 15 Nov 2023 14:15:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-1507):=20=E6=96=B0=E5=A2=9E=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=A0=91=E7=9A=84=E5=89=AA=E6=9E=9D=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 背景: https://jira.axzo.cn/browse/REQ-1507?goToView=1 修改: 1、新增查询树的剪枝接口; 影响: 无 --- .../controller/MessageGroupController.java | 45 ++++++++++ .../MessageGroupTreeNodeCacheServiceImpl.java | 25 ++---- .../axzo/msg/center/utils/TreeHelperUtil.java | 84 +++++++++++++------ .../center/service/dto/GroupTreeNodeDTO.java | 23 ++++- .../group/client/MessageGroupClient.java | 8 ++ .../fallback/MessageGroupClientFallback.java | 6 ++ .../MessageGroupTreeNodeResponse.java | 10 +++ .../pending/client/PendingMessageClient.java | 4 +- 8 files changed, 154 insertions(+), 51 deletions(-) diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageGroupController.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageGroupController.java index 35991d8b..ffeb4d93 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageGroupController.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/controller/MessageGroupController.java @@ -10,11 +10,16 @@ import cn.axzo.msg.center.service.group.request.MessageGroupNodeUpdateRequest; import cn.axzo.msg.center.service.group.request.MessageGroupQueryRequest; import cn.axzo.msg.center.service.group.response.MessageGroupNodeBriefResponse; import cn.axzo.msg.center.service.group.response.MessageGroupTreeNodeResponse; +import cn.axzo.msg.center.utils.TreeHelperUtil; import cn.azxo.framework.common.model.CommonResponse; +import com.google.common.collect.Maps; import lombok.RequiredArgsConstructor; +import org.apache.commons.collections.CollectionUtils; import org.springframework.web.bind.annotation.RestController; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -57,6 +62,16 @@ public class MessageGroupController implements MessageGroupClient { return CommonResponse.success(groupTreeNodes); } + @Override + public CommonResponse> listCutTree(MessageGroupQueryRequest request) { + List groupTreeNodes = messageGroupNodeService + .listGroupTree(request.getCategory(), request.getNodeName()).stream() + .map(this::convertCutTree) + .filter(e -> CollectionUtils.isNotEmpty(e.getChildren())) + .collect(Collectors.toList()); + return CommonResponse.success(groupTreeNodes); + } + @Override public CommonResponse> listNodeBriefInfo(MessageGroupNodeListRequest request) { List groupTreeNodes = messageGroupNodeService @@ -65,4 +80,34 @@ public class MessageGroupController implements MessageGroupClient { .collect(Collectors.toList()); return CommonResponse.success(groupTreeNodes); } + + private MessageGroupTreeNodeResponse convertCutTree(GroupTreeNodeDTO srcRootNode) { + MessageGroupTreeNodeResponse tgtRootNode = convert(srcRootNode); + if (CollectionUtils.isEmpty(srcRootNode.getNodeChildren())) { + return tgtRootNode; + } + Map map = Maps.newHashMap(); + map.put(srcRootNode, tgtRootNode); + LinkedList stack = new LinkedList<>(srcRootNode.getNodeChildren()); + while (!stack.isEmpty()) { + GroupTreeNodeDTO node = stack.pop(); + if (TreeHelperUtil.containsMountTemplateChild(node)) { + MessageGroupTreeNodeResponse child = convert(node); + map.get(node.getParentNode()).addChild(child); + map.put(node, child); + stack.addAll(node.getNodeChildren()); + } + } + return tgtRootNode; + } + + private MessageGroupTreeNodeResponse convert(GroupTreeNodeDTO node) { + return MessageGroupTreeNodeResponse.builder() + .category(node.getCategory()) + .nodeName(node.getNodeName()) + .nodeCode(node.getNodeCode()) + .nodeIcon(node.getNodeIcon()) + .parentNodeCode(node.getParentNodeCode()) + .build(); + } } diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java index f2eb24c5..54eed3c4 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/message/service/impl/MessageGroupTreeNodeCacheServiceImpl.java @@ -1,6 +1,5 @@ package cn.axzo.msg.center.message.service.impl; -import cn.axzo.basics.common.util.TreeUtil; import cn.axzo.msg.center.common.enums.TableIsDeleteEnum; import cn.axzo.msg.center.common.redis.RedisUtil; import cn.axzo.msg.center.dal.MessageGroupNodeDao; @@ -8,6 +7,7 @@ import cn.axzo.msg.center.domain.entity.MessageGroupNode; import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO; import cn.axzo.msg.center.message.service.MessageGroupTreeNodeCacheService; import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; +import cn.axzo.msg.center.utils.TreeHelperUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; @@ -145,8 +145,8 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod } private synchronized void initialize(boolean refreshCache) { - List groupNodes = listAllValidNodesFromDB(); - allGroupTreesCache = TreeUtil.buildTree(groupNodes); + List groupNodes = listAllValidNodesFromDB(); + allGroupTreesCache = TreeHelperUtil.buildTrees(groupNodes); leafTreeNodePathsCache = allGroupTreesCache.stream() .flatMap(e -> parseRootNode(e).stream()) .collect(Collectors.toList()); @@ -155,25 +155,10 @@ public class MessageGroupTreeNodeCacheServiceImpl implements MessageGroupTreeNod } } - private List listAllValidNodesFromDB() { + private List listAllValidNodesFromDB() { return messageGroupNodeDao.lambdaQuery() .eq(MessageGroupNode::getIsDelete, TableIsDeleteEnum.NORMAL.value) - .list().stream() - .map(this::convert) - .collect(Collectors.toList()); - } - - private GroupTreeNodeDTO convert(MessageGroupNode groupNode) { - return GroupTreeNodeDTO.builder() - .nodeId(groupNode.getId()) - .nodeName(groupNode.getName()) - .nodeCode(groupNode.getCode()) - .nodeIcon(groupNode.getIcon()) - .category(groupNode.getCategory()) - .parentNodeCode(groupNode.getParentCode()) - .isLeaf(groupNode.getIsLeaf()) - .status(groupNode.getStatus()) - .build(); + .list(); } private List parseRootNode(GroupTreeNodeDTO root) { diff --git a/inside-notices/src/main/java/cn/axzo/msg/center/utils/TreeHelperUtil.java b/inside-notices/src/main/java/cn/axzo/msg/center/utils/TreeHelperUtil.java index 4a890a6e..af750cfe 100644 --- a/inside-notices/src/main/java/cn/axzo/msg/center/utils/TreeHelperUtil.java +++ b/inside-notices/src/main/java/cn/axzo/msg/center/utils/TreeHelperUtil.java @@ -1,17 +1,17 @@ package cn.axzo.msg.center.utils; -import cn.axzo.basics.common.model.IBaseTree; -import cn.axzo.basics.common.util.AssertUtil; +import cn.axzo.msg.center.domain.entity.MessageGroupNode; import cn.axzo.msg.center.service.dto.GroupTreeNodeDTO; import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum; -import com.google.common.collect.Maps; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.function.Function; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -22,32 +22,64 @@ import java.util.stream.Collectors; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class TreeHelperUtil { - public static , O> T wrapper(GroupTreeNodeDTO treeNode, - Function wrapperFunc) { - AssertUtil.notNull(treeNode, "treeNode is null"); - AssertUtil.notNull(wrapperFunc, "wrapperFunc is null"); - - final Map convertMap = Maps.newHashMap(); - T root = wrapperFunc.apply(treeNode); - convertMap.put(treeNode, root); - LinkedList treeNodeStack = new LinkedList<>(); - treeNodeStack.push(treeNode); - while (!treeNodeStack.isEmpty()) { - treeNode = treeNodeStack.pop(); - List children = treeNode.getNodeChildren(); - convertMap.get(treeNode).setNodeChildren(children.stream() - .map(e -> { - T wrapper = wrapperFunc.apply(e); - convertMap.put(e, wrapper); - return wrapper; - }).collect(Collectors.toList())); - treeNodeStack.addAll(children); + public static List buildTrees(List nodes) { + if (CollectionUtils.isEmpty(nodes)) { + return Collections.emptyList(); } - return root; + List rootNodes = nodes.stream() + .filter(e -> StringUtils.isBlank(e.getParentCode())) + .map(TreeHelperUtil::convert) + .collect(Collectors.toList()); + rootNodes.forEach(e -> buildTree(e, nodes)); + return rootNodes; } public static boolean isLeafNodeCategory(MessageGroupNodeCategoryEnum category) { return MessageGroupNodeCategoryEnum.GENERAL_MESSAGE_CATEGORY.equals(category) || MessageGroupNodeCategoryEnum.PENDING_MESSAGE_CATEGORY.equals(category); } + + public static boolean containsMountTemplateChild(GroupTreeNodeDTO treeNode) { + if (Objects.isNull(treeNode)) { + return false; + } + if (CollectionUtils.isEmpty(treeNode.getNodeChildren())) { + return treeNode.canMountTemplate(); + } + LinkedList stack = new LinkedList<>(treeNode.getNodeChildren()); + while (!stack.isEmpty()) { + GroupTreeNodeDTO node = stack.pop(); + if (node.canMountTemplate()) { + return true; + } + stack.addAll(node.getNodeChildren()); + } + return false; + } + + private static void buildTree(GroupTreeNodeDTO parentNode, List nodes) { + List children = nodes.stream() + .filter(e -> Objects.equals(e.getParentCode(), parentNode.getNodeCode())) + .collect(Collectors.toList()); + if (children.isEmpty()) { + return; + } + children.forEach(e -> { + GroupTreeNodeDTO child = convert(e); + parentNode.addChild(child); + buildTree(child, nodes); + }); + } + + private static GroupTreeNodeDTO convert(MessageGroupNode groupNode) { + return GroupTreeNodeDTO.builder() + .nodeId(groupNode.getId()) + .nodeName(groupNode.getName()) + .nodeCode(groupNode.getCode()) + .nodeIcon(groupNode.getIcon()) + .category(groupNode.getCategory()) + .isLeaf(groupNode.getIsLeaf()) + .status(groupNode.getStatus()) + .build(); + } } diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/GroupTreeNodeDTO.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/GroupTreeNodeDTO.java index b55645e6..a6963cd0 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/GroupTreeNodeDTO.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/dto/GroupTreeNodeDTO.java @@ -16,6 +16,7 @@ import java.io.Serializable; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -56,7 +57,7 @@ public class GroupTreeNodeDTO implements IBaseTree, Se /** * 父节点 */ - private String parentNodeCode; + private GroupTreeNodeDTO parentNode; /** * 是否为叶节点 */ @@ -69,7 +70,23 @@ public class GroupTreeNodeDTO implements IBaseTree, Se * 子节点列表 */ @Builder.Default - private List nodeChildren = Collections.emptyList(); + private List nodeChildren = Lists.newArrayList(); + + public void addChild(GroupTreeNodeDTO child) { + if (Objects.isNull(child)) { + return; + } + if (Objects.isNull(nodeChildren)) { + nodeChildren = Lists.newArrayList(); + } + nodeChildren.add(child); + child.setParentNode(this); + } + + @Override + public String getParentNodeCode() { + return Optional.ofNullable(parentNode).map(GroupTreeNodeDTO::getNodeCode).orElse(null); + } public void setNodeChildren(List nodeChildren) { this.nodeChildren = Optional.ofNullable(nodeChildren).orElseGet(Collections::emptyList); @@ -83,7 +100,7 @@ public class GroupTreeNodeDTO implements IBaseTree, Se .category(category) .nodeName(nodeName) .nodeCode(nodeCode) - .parentNodeCode(parentNodeCode) + .parentNodeCode(getParentNodeCode()) .nodeIcon(nodeIcon) .children(children) .build(); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/MessageGroupClient.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/MessageGroupClient.java index fc7bc0f5..90922f40 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/MessageGroupClient.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/MessageGroupClient.java @@ -64,6 +64,14 @@ public interface MessageGroupClient { @PostMapping(value = "/message/group/node/list", produces = {MediaType.APPLICATION_JSON_VALUE}) CommonResponse> list(@RequestBody MessageGroupQueryRequest request); + /** + * 查询通知/待办的分类信息 + * + * @param request 分页查询相关参数 + */ + @PostMapping(value = "/message/group/cutTree/list", produces = {MediaType.APPLICATION_JSON_VALUE}) + CommonResponse> listCutTree(@RequestBody MessageGroupQueryRequest request); + /** * 查询通知/待办的分类信息 * diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/fallback/MessageGroupClientFallback.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/fallback/MessageGroupClientFallback.java index d89f35bc..6a77ac07 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/fallback/MessageGroupClientFallback.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/client/fallback/MessageGroupClientFallback.java @@ -47,6 +47,12 @@ public class MessageGroupClientFallback implements MessageGroupClient { return CommonResponse.error("fall back while listing message group node"); } + @Override + public CommonResponse> listCutTree(MessageGroupQueryRequest request) { + log.error("fall back while listing message group cutTree. request:{}", request); + return CommonResponse.error("fall back while listing message group cutTree"); + } + @Override public CommonResponse> listNodeBriefInfo(MessageGroupNodeListRequest request) { log.error("fall back while listing message group node brief info. request:{}", request); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/response/MessageGroupTreeNodeResponse.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/response/MessageGroupTreeNodeResponse.java index dd265a71..98a128c4 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/response/MessageGroupTreeNodeResponse.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/group/response/MessageGroupTreeNodeResponse.java @@ -2,11 +2,13 @@ package cn.axzo.msg.center.service.group.response; import cn.axzo.msg.center.service.enums.MessageGroupNodeCategoryEnum; import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.collections.CollectionUtils; import java.io.Serializable; import java.util.List; @@ -56,6 +58,14 @@ public class MessageGroupTreeNodeResponse implements Serializable { */ private List children; + public void addChild(MessageGroupTreeNodeResponse treeNode) { + if (CollectionUtils.isEmpty(children)) { + children = Lists.newArrayList(); + } + children.add(treeNode); + treeNode.setParentNodeCode(this.nodeCode); + } + @Override public String toString() { return JSON.toJSONString(this); diff --git a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java index f2c7a577..d762987e 100644 --- a/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java +++ b/msg-center-api/src/main/java/cn/axzo/msg/center/service/pending/client/PendingMessageClient.java @@ -63,10 +63,10 @@ public interface PendingMessageClient { CommonResponse> pageQuery(@RequestBody @Valid PendingMessagePageRequest request); /** - * 代办列表指定item查询 + * 代办列表指定待办的查询 * * @param request 查询相关参数 - * @return 指定的item数据 + * @return 指定待办 */ @PostMapping(value = "/pending-message/record/query", produces = {MediaType.APPLICATION_JSON_VALUE}) CommonResponse query(@RequestBody @Valid PendingMessageQueryRequest request);