From fffffbf5f498e2aff538fca3b4c2393d8716bdbd Mon Sep 17 00:00:00 2001
From: 陈昶聿 <chychen@nbjetron.com>
Date: 星期二, 01 九月 2026 17:59:24 +0800
Subject: [PATCH] 【丽水】人工无-3已领取状态(service_subtask_preachform.sendstate = 3)

---
 ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java |   88 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 88 insertions(+), 0 deletions(-)

diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java
new file mode 100644
index 0000000..873610d
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java
@@ -0,0 +1,88 @@
+package com.ruoyi.common.utils;
+
+import com.ruoyi.common.core.domain.entity.SysDept;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 鏍戠粨鏋勫伐鍏风被锛氭牴鎹� parentId 鏋勯�犳爲銆佷竴娆℃�ц幏鍙栨墍鏈夊彾瀛愯妭鐐广��
+ * 鏍稿績鏂规硶涓烘硾鍨嬪疄鐜帮紝id / parentId / children 閫氳繃鍑芥暟娉ㄥ叆锛屽彲澶嶇敤浜庝换浣曡妭鐐圭被鍨嬨��
+ */
+public class TreeUtils {
+
+    private TreeUtils() {
+    }
+
+    /* ================== 閫氱敤鏂规硶 ================== */
+
+    /**
+     * 鏍规嵁 parentId 鏋勯�犳爲锛孫(n) 涓�娆¢亶鍘嗐��
+     * 鏍硅妭鐐逛负銆岀埗Id涓嶅湪闆嗗悎涓�嶇殑鑺傜偣锛涜嫢涓嶅瓨鍦ㄦ牴鑺傜偣锛堝鍏ㄦ槸鑷紩鐢ㄧ殑鐜級鍒欏師鏍疯繑鍥炪��
+     *
+     * @param nodes          鑺傜偣鍒楄〃
+     * @param idGetter       鍙栬妭鐐筰d
+     * @param parentIdGetter 鍙栫埗鑺傜偣id
+     * @param childrenSetter 璁剧疆瀛愯妭鐐瑰垪琛�
+     */
+    public static <T, K> List<T> buildTree(
+            List<T> nodes,
+            Function<T, K> idGetter,
+            Function<T, K> parentIdGetter,
+            BiConsumer<T, List<T>> childrenSetter) {
+        if (nodes == null || nodes.isEmpty()) {
+            return new ArrayList<>();
+        }
+        // 鎸夌埗Id鍒嗙粍锛屼竴娆¢亶鍘嗘嬁鍒版瘡涓妭鐐圭殑瀛愬垪琛�
+        Map<K, List<T>> byParent = nodes.stream().collect(Collectors.groupingBy(parentIdGetter));
+        for (T node : nodes) {
+            childrenSetter.accept(node, byParent.getOrDefault(idGetter.apply(node), new ArrayList<>()));
+        }
+        Set<K> ids = nodes.stream().map(idGetter).filter(Objects::nonNull).collect(Collectors.toSet());
+        List<T> roots = nodes.stream()
+                .filter(n -> !ids.contains(parentIdGetter.apply(n)))
+                .collect(Collectors.toList());
+        return roots.isEmpty() ? nodes : roots;
+    }
+
+    /**
+     * 涓�娆℃�ц幏鍙栨墍鏈夊彾瀛愯妭鐐癸細鍗炽�宨d 涓嶅嚭鐜板湪浠讳綍鑺傜偣鐨� parentId 涓�嶇殑鑺傜偣锛孫(n) 涓�娆¢亶鍘嗐��
+     *
+     * @param nodes          鑺傜偣鍒楄〃
+     * @param idGetter       鍙栬妭鐐筰d
+     * @param parentIdGetter 鍙栫埗鑺傜偣id
+     */
+    public static <T, K> List<T> getLeafNodes(
+            List<T> nodes,
+            Function<T, K> idGetter,
+            Function<T, K> parentIdGetter) {
+        if (nodes == null || nodes.isEmpty()) {
+            return new ArrayList<>();
+        }
+        Set<K> parentIds = nodes.stream()
+                .map(parentIdGetter)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+        return nodes.stream()
+                .filter(n -> !parentIds.contains(idGetter.apply(n)))
+                .collect(Collectors.toList());
+    }
+
+    /* ================== SysDept 渚挎嵎鏂规硶 ================== */
+
+    /**
+     * 鏍规嵁 SysDept.parentId 鏋勯�犻儴闂ㄦ爲
+     */
+    public static List<SysDept> buildDeptTree(List<SysDept> depts) {
+        return buildTree(depts, SysDept::getDeptId, SysDept::getParentId, SysDept::setChildren);
+    }
+
+    /**
+     * 涓�娆℃�ц幏鍙栨墍鏈夐儴闂ㄥ彾瀛愯妭鐐�
+     */
+    public static List<SysDept> getLeafDepts(List<SysDept> depts) {
+        return getLeafNodes(depts, SysDept::getHisDeptId, SysDept::getHisParentId);
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3