From f1208474f771a1c233d7425c8ed13fbaa0d521ac Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期三, 12 三月 2025 09:35:13 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/5.X' into 5.X --- ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java | 65 +++++++++++++++++++++++++++++++- 1 files changed, 63 insertions(+), 2 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java index d0163e6..2ab42cb 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/TreeBuildUtils.java @@ -5,11 +5,13 @@ import cn.hutool.core.lang.tree.TreeNodeConfig; import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.lang.tree.parser.NodeParser; -import org.dromara.common.core.utils.reflect.ReflectUtils; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 鎵╁睍 hutool TreeUtil 灏佽绯荤粺鏍戞瀯寤� @@ -24,12 +26,71 @@ */ public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); + /** + * 鏋勫缓鏍戝舰缁撴瀯 + * + * @param <T> 杈撳叆鑺傜偣鐨勭被鍨� + * @param <K> 鑺傜偣ID鐨勭被鍨� + * @param list 鑺傜偣鍒楄〃锛屽叾涓寘鍚簡瑕佹瀯寤烘爲褰㈢粨鏋勭殑鎵�鏈夎妭鐐� + * @param nodeParser 瑙f瀽鍣紝鐢ㄤ簬灏嗚緭鍏ヨ妭鐐硅浆鎹负鏍戣妭鐐� + * @return 鏋勫缓濂界殑鏍戝舰缁撴瀯鍒楄〃 + */ public static <T, K> List<Tree<K>> build(List<T> list, NodeParser<T, K> nodeParser) { if (CollUtil.isEmpty(list)) { - return null; + return CollUtil.newArrayList(); } K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); } + /** + * 鏋勫缓鏍戝舰缁撴瀯 + * + * @param <T> 杈撳叆鑺傜偣鐨勭被鍨� + * @param <K> 鑺傜偣ID鐨勭被鍨� + * @param parentId 椤剁骇鑺傜偣 + * @param list 鑺傜偣鍒楄〃锛屽叾涓寘鍚簡瑕佹瀯寤烘爲褰㈢粨鏋勭殑鎵�鏈夎妭鐐� + * @param nodeParser 瑙f瀽鍣紝鐢ㄤ簬灏嗚緭鍏ヨ妭鐐硅浆鎹负鏍戣妭鐐� + * @return 鏋勫缓濂界殑鏍戝舰缁撴瀯鍒楄〃 + */ + public static <T, K> List<Tree<K>> build(List<T> list, K parentId, NodeParser<T, K> nodeParser) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + return TreeUtil.build(list, parentId, DEFAULT_CONFIG, nodeParser); + } + + /** + * 鑾峰彇鑺傜偣鍒楄〃涓墍鏈夎妭鐐圭殑鍙跺瓙鑺傜偣 + * + * @param <K> 鑺傜偣ID鐨勭被鍨� + * @param nodes 鑺傜偣鍒楄〃 + * @return 鍖呭惈鎵�鏈夊彾瀛愯妭鐐圭殑鍒楄〃 + */ + public static <K> List<Tree<K>> getLeafNodes(List<Tree<K>> nodes) { + if (CollUtil.isEmpty(nodes)) { + return CollUtil.newArrayList(); + } + return nodes.stream() + .flatMap(TreeBuildUtils::extractLeafNodes) + .collect(Collectors.toList()); + } + + /** + * 鑾峰彇鎸囧畾鑺傜偣涓嬬殑鎵�鏈夊彾瀛愯妭鐐� + * + * @param <K> 鑺傜偣ID鐨勭被鍨� + * @param node 瑕佹煡鎵惧彾瀛愯妭鐐圭殑鏍硅妭鐐� + * @return 鍖呭惈鎵�鏈夊彾瀛愯妭鐐圭殑鍒楄〃 + */ + private static <K> Stream<Tree<K>> extractLeafNodes(Tree<K> node) { + if (!node.hasChild()) { + return Stream.of(node); + } else { + // 閫掑綊璋冪敤锛岃幏鍙栨墍鏈夊瓙鑺傜偣鐨勫彾瀛愯妭鐐� + return node.getChildren().stream() + .flatMap(TreeBuildUtils::extractLeafNodes); + } + } + } -- Gitblit v1.9.3