From 86603282c0cc5f005b740112311d89e99b8fc570 Mon Sep 17 00:00:00 2001
From: 龚焕茏 <2842157468@qq.com>
Date: 星期一, 08 七月 2024 17:39:10 +0800
Subject: [PATCH] feat:部门树形结构

---
 src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java       |    4 +
 src/main/java/com/mindskip/xzs/utility/TreeUtils.java                  |   75 +++++++++++++++++++++++++
 src/main/java/com/mindskip/xzs/domain/Department.java                  |    4 
 src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java |    3 
 src/main/java/com/mindskip/xzs/vo/TreeNode.java                        |   54 ++++++++++++++++++
 src/main/resources/mapper/UserMapper.xml                               |    4 
 6 files changed, 138 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/mindskip/xzs/domain/Department.java b/src/main/java/com/mindskip/xzs/domain/Department.java
index 017ae39..73e060f 100644
--- a/src/main/java/com/mindskip/xzs/domain/Department.java
+++ b/src/main/java/com/mindskip/xzs/domain/Department.java
@@ -1,13 +1,13 @@
 package com.mindskip.xzs.domain;
 
+import com.mindskip.xzs.vo.TreeNode;
 import lombok.Data;
 
-import javax.sql.rowset.serial.SerialArray;
 import java.io.Serializable;
 import java.util.List;
 
 @Data
-public class Department implements Serializable {
+public class Department extends TreeNode implements Serializable {
 
     private Integer id;
 
diff --git a/src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java
index 0ad215c..6f296cb 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java
@@ -11,6 +11,7 @@
 import com.mindskip.xzs.repository.UserMapper;
 import com.mindskip.xzs.service.DepartmentService;
 import com.mindskip.xzs.utility.ModelMapperSingle;
+import com.mindskip.xzs.utility.TreeUtils;
 import com.mindskip.xzs.viewmodel.admin.department.DepartmentResponseVM;
 import org.modelmapper.ModelMapper;
 import org.springframework.stereotype.Service;
@@ -109,7 +110,7 @@
 
     @Override
     public List<Department> gets(List<Integer> deptId) {
-        return departmentMapper.gets(deptId);
+        return TreeUtils.build(departmentMapper.gets(deptId));
     }
 
     @Override
diff --git a/src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java
index 92a8b58..13d3696 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java
@@ -10,6 +10,7 @@
 import com.mindskip.xzs.exception.BusinessException;
 import com.mindskip.xzs.repository.UserMapper;
 import com.mindskip.xzs.service.UserService;
+import com.mindskip.xzs.utility.TreeUtils;
 import com.mindskip.xzs.viewmodel.admin.user.UserPageRequestVM;
 import com.mindskip.xzs.viewmodel.admin.user.UserResponseVM;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -192,7 +193,8 @@
 
     @Override
     public List<Department> getDeptAdmins(Integer id) {
-        return userMapper.getDeptAdmins(id);
+        List<Department> list = userMapper.getDeptAdmins(id);
+        return TreeUtils.build(list);
     }
 
     @Override
diff --git a/src/main/java/com/mindskip/xzs/utility/TreeUtils.java b/src/main/java/com/mindskip/xzs/utility/TreeUtils.java
new file mode 100644
index 0000000..e508f51
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/utility/TreeUtils.java
@@ -0,0 +1,75 @@
+package com.mindskip.xzs.utility;
+
+
+import com.mindskip.xzs.vo.TreeNode;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鏍戝舰缁撴瀯宸ュ叿绫伙紝濡傦細鑿滃崟銆侀儴闂ㄧ瓑
+ *
+ * @author gonghl
+ */
+public class TreeUtils {
+
+    /**
+     * 鏍规嵁pid锛屾瀯寤烘爲鑺傜偣
+     */
+    public static <T extends TreeNode> List<T> build(List<T> treeNodes, Integer pid) {
+        //pid涓嶈兘涓虹┖
+        if (ObjectUtils.isEmpty(pid)) {
+            return null;
+        }
+
+        List<T> treeList = new ArrayList<>();
+        for (T treeNode : treeNodes) {
+            if (pid.equals(treeNode.getParentId())) {
+                treeList.add(findChildren(treeNodes, treeNode));
+            }
+        }
+
+        return treeList;
+    }
+
+    /**
+     * 鏌ユ壘瀛愯妭鐐�
+     */
+    private static <T extends TreeNode> T findChildren(List<T> treeNodes, T rootNode) {
+        for (T treeNode : treeNodes) {
+            if (rootNode.getId().equals(treeNode.getParentId())) {
+                rootNode.getChildren().add(findChildren(treeNodes, treeNode));
+            }
+        }
+        return rootNode;
+    }
+
+    /**
+     * 鏋勫缓鏍戣妭鐐�
+     */
+    public static <T extends TreeNode> List<T> build(List<T> treeNodes) {
+        List<T> result = new ArrayList<>();
+
+        //list杞琺ap
+        Map<Integer, T> nodeMap = new LinkedHashMap<>(treeNodes.size());
+        for (T treeNode : treeNodes) {
+            nodeMap.put(treeNode.getId(), treeNode);
+        }
+
+        for (T node : nodeMap.values()) {
+            T parent = nodeMap.get(node.getParentId());
+            if (parent != null && !(node.getId().equals(parent.getId()))) {
+                parent.getChildren().add(node);
+                continue;
+            }
+
+            result.add(node);
+        }
+
+        return result;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/mindskip/xzs/vo/TreeNode.java b/src/main/java/com/mindskip/xzs/vo/TreeNode.java
new file mode 100644
index 0000000..069b16f
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/vo/TreeNode.java
@@ -0,0 +1,54 @@
+package com.mindskip.xzs.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鏍戣妭鐐癸紝鎵�鏈夐渶瑕佸疄鐜版爲鑺傜偣鐨勶紝閮介渶瑕佺户鎵胯绫�
+ *
+ * @author gonghl
+ */
+public class TreeNode<T> implements Serializable {
+    private static final Long serialVersionUID = 1L;
+    /**
+     * 涓婚敭
+     */
+    private Integer id;
+    /**
+     * 涓婄骇ID
+     */
+
+    private Integer parentId;
+    /**
+     * 瀛愯妭鐐瑰垪琛�
+     */
+    @TableField(exist = false)
+    private List<T> children = new ArrayList<>();
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer pid) {
+        this.parentId = pid;
+    }
+
+    public List<T> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<T> children) {
+        this.children = children;
+    }
+}
\ No newline at end of file
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
index c6f89ad..4d49779 100644
--- a/src/main/resources/mapper/UserMapper.xml
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -543,10 +543,10 @@
 
     <select id="getDeptAdmins" resultType="com.mindskip.xzs.domain.Department" parameterType="java.lang.Integer">
         <if test="id != null">
-        select a.id, a.name from t_department a inner join t_user_department b on a.id = b.department_id where a.deleted = 0 and b.dept_admin = 1 and b.user_id = #{id} order by a.id desc
+        select a.id, a.name, a.parent_id from t_department a inner join t_user_department b on a.id = b.department_id where a.deleted = 0 and b.dept_admin = 1 and b.user_id = #{id} order by a.id
         </if>
         <if test="id == null">
-        select a.id, a.name from t_department a where a.deleted = 0 order by a.id desc
+        select a.id, a.name, a.parent_id from t_department a where a.deleted = 0 order by a.id
         </if>
     </select>
 

--
Gitblit v1.8.0