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