From 396bf585bc43c16c944fdc03e9e5efc5a8432aad Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Sun, 23 Apr 2023 11:46:27 +0800
Subject: [PATCH] 新增组织机构人员树查询接口

---
 skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java         |    8 ++
 skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java                            |   17 ++++
 skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java            |   27 ++++++
 skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java                               |   41 ++++++++++
 skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java    |   15 +++
 skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java |   17 ++++
 skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml             |   75 ++++++++++++++++++
 7 files changed, 200 insertions(+), 0 deletions(-)

diff --git a/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java b/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java
new file mode 100644
index 0000000..b5bea1e
--- /dev/null
+++ b/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/node/DeptUserTreeNode.java
@@ -0,0 +1,17 @@
+package cn.gistack.common.node;
+
+import lombok.Data;
+
+/**
+ * 部门用户树node
+ * @author zhongrj
+ * @date 2023-04-23
+ */
+@Data
+public class DeptUserTreeNode extends TreeNode{
+
+	/**
+	 * 手机号
+	 */
+	private String phone;
+}
diff --git a/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java b/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java
index 082799b..ca9864a 100644
--- a/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java
+++ b/skjcmanager/skjcmanager-common/src/main/java/cn/gistack/common/utils/NodeTreeUtil.java
@@ -1,7 +1,9 @@
 package cn.gistack.common.utils;
 
+import cn.gistack.common.node.DeptUserTreeNode;
 import cn.gistack.common.node.TreeNode;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -32,6 +34,45 @@
 	}
 
 	/**
+	 * map 转 tree 组织机构(父子id不会重复的情况,数据查询来自同一个表)
+	 * @param treeMap
+	 * @return
+	 */
+	public  static List<TreeNode> getDeptAndUserNodeTree(Map<String, DeptUserTreeNode> treeMap){
+		List<TreeNode> tree = new ArrayList<>();
+		if (treeMap.size() > 1) {
+			treeMap.forEach((id, treeNode) -> {
+				if (!treeNode.getHasChildren()){
+					// 判断是否有绑定多个部门
+					List<String> asList = Arrays.asList(treeNode.getParentId().split(","));
+					if (asList.size()>1){
+						for (String parentId : asList) {
+							if (treeMap.containsKey(parentId)) {
+								treeMap.get(parentId).getChildren().add(treeNode);
+							} else {
+								tree.add(treeNode);
+							}
+						}
+					}else {
+						if (treeMap.containsKey(treeNode.getParentId())) {
+							treeMap.get(treeNode.getParentId()).getChildren().add(treeNode);
+						} else {
+							tree.add(treeNode);
+						}
+					}
+				}else {
+					if (treeMap.containsKey(treeNode.getParentId())) {
+						treeMap.get(treeNode.getParentId()).getChildren().add(treeNode);
+					} else {
+						tree.add(treeNode);
+					}
+				}
+			});
+		}
+		return tree;
+	}
+
+	/**
 	 * list 转 tree 组织机构
 	 * @param parentList
 	 * @param childrenList
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java
index fd8aab6..50a79de 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/controller/DeptController.java
@@ -16,6 +16,9 @@
  */
 package cn.gistack.system.controller;
 
+import cn.gistack.common.node.DeptUserTreeNode;
+import cn.gistack.common.node.TreeNode;
+import cn.gistack.common.utils.NodeTreeUtil;
 import cn.gistack.system.vo.DeptVO;
 import cn.gistack.system.wrapper.DeptWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -176,4 +179,16 @@
 	}
 
 
+	/**
+	 * 查询组织机构树数据(下级包含人员信息)
+	 * @param treeNode
+	 * @return
+	 */
+	@GetMapping("/getDeptAndUserTree")
+	@ApiOperation(value = "查询组织机构树数据(下级包含人员信息)")
+	public R getDeptAndUserTree(DeptUserTreeNode treeNode) {
+		return R.data(deptService.getDeptAndUserTree(treeNode));
+	}
+
+
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java
index 739575b..00d489d 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.java
@@ -16,9 +16,13 @@
  */
 package cn.gistack.system.mapper;
 
+import cn.gistack.common.node.DeptUserTreeNode;
+import cn.gistack.common.node.TreeNode;
 import cn.gistack.system.entity.Dept;
 import cn.gistack.system.vo.DeptVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -65,4 +69,27 @@
 	 */
 	List<String> getDeptNames(Long[] ids);
 
+	/**
+	 * 查询组织机构树数据(下级包含人员信息)
+	 * @param treeNode
+	 * @return
+	 */
+	@MapKey(value = "id")
+    Map<String, DeptUserTreeNode> getDeptAndUserTree(@Param("treeNode") DeptUserTreeNode treeNode);
+
+	/**
+	 * 查询组织机构树
+	 * @param treeNode
+	 * @return
+	 */
+	@MapKey(value = "id")
+	Map<String, DeptUserTreeNode> getDeptMap(@Param("treeNode") DeptUserTreeNode treeNode);
+
+	/**
+	 * 查询用户树
+	 * @param treeNode
+	 * @return
+	 */
+	@MapKey(value = "id")
+	Map<String, DeptUserTreeNode> getUserMap(@Param("treeNode") DeptUserTreeNode treeNode);
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml
index 654eb1d..2d88964 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/mapper/DeptMapper.xml
@@ -112,4 +112,79 @@
         and is_deleted = 0
     </select>
 
+    <!--查询组织机构树数据(下级包含人员信息)-->
+    <select id="getDeptAndUserTree" resultType="cn.gistack.common.node.DeptUserTreeNode">
+        (
+            SELECT
+            dept.id,
+            dept.parent_id parentId,
+            dept.dept_name AS name,
+            0 AS phone,
+            (
+                SELECT
+                CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+                FROM
+                blade_dept
+                WHERE
+                parent_id = dept.id and is_deleted = 0
+            ) AS hasChildren
+            FROM
+            blade_dept dept WHERE dept.is_deleted = 0
+            <if test="treeNode.id!=null and treeNode.id!=''">
+                and dept.id = #{treeNode.id}
+            </if>
+        )
+        union
+        (
+            select
+            bu.id,
+            bu.dept_id parentId,
+            bu.account AS name,
+            bu.phone,
+            0 as hasChildren
+            from blade_user bu left join blade_dept bd on bd.id = bu.dept_id
+            where 1=1 and bu.is_deleted = 0 and bu.status = 1
+            <if test="treeNode.id!=null and treeNode.id!=''">
+                and bu.dept_id like concat(concat('%',#{treeNode.id}),'%')
+            </if>
+        )
+    </select>
+
+    <!--查询组织机构树-->
+    <select id="getDeptMap" resultType="cn.gistack.common.node.DeptUserTreeNode">
+        SELECT
+        dept.id,
+        dept.parent_id parentId,
+        dept.dept_name AS name,
+        0 AS phone,
+        (
+            SELECT
+            CASE WHEN count(1) > 0 THEN 1 ELSE 0 END
+            FROM
+            blade_dept
+            WHERE
+            parent_id = dept.id and is_deleted = 0
+        ) AS hasChildren
+        FROM
+        blade_dept dept WHERE dept.is_deleted = 0
+        <if test="treeNode.id!=null and treeNode.id!=''">
+            and dept.id = #{treeNode.id}
+        </if>
+    </select>
+
+    <!--查询组织机构树数据(下级包含人员信息)-->
+    <select id="getUserMap" resultType="cn.gistack.common.node.DeptUserTreeNode">
+        select
+        bu.id,
+        bu.dept_id parentId,
+        bu.account AS name,
+        bu.phone,
+        0 as hasChildren
+        from blade_user bu left join blade_dept bd on bd.id = bu.dept_id
+        where 1=1 and bu.is_deleted = 0 and bu.status = 1
+        <if test="treeNode.id!=null and treeNode.id!=''">
+            and bu.dept_id like concat(concat('%',#{treeNode.id}),'%')
+        </if>
+    </select>
+
 </mapper>
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java
index c2c1312..8a04daf 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/IDeptService.java
@@ -16,6 +16,8 @@
  */
 package cn.gistack.system.service;
 
+import cn.gistack.common.node.DeptUserTreeNode;
+import cn.gistack.common.node.TreeNode;
 import cn.gistack.system.entity.Dept;
 import cn.gistack.system.vo.DeptVO;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -116,4 +118,10 @@
 	 */
 	List<DeptVO> search(String deptName, Long parentId);
 
+	/**
+	 * 查询组织机构树数据(下级包含人员信息)
+	 * @param treeNode
+	 * @return
+	 */
+	List<TreeNode> getDeptAndUserTree(DeptUserTreeNode treeNode);
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java
index e1b62e9..9817c4f 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-system/src/main/java/cn/gistack/system/service/impl/DeptServiceImpl.java
@@ -16,6 +16,9 @@
  */
 package cn.gistack.system.service.impl;
 
+import cn.gistack.common.node.DeptUserTreeNode;
+import cn.gistack.common.node.TreeNode;
+import cn.gistack.common.utils.NodeTreeUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -170,4 +173,18 @@
 		return DeptWrapper.build().listNodeVO(deptList);
 	}
 
+	/**
+	 * 查询组织机构树数据(下级包含人员信息)
+	 * @param treeNode
+	 * @return
+	 */
+	@Override
+	public List<TreeNode> getDeptAndUserTree(DeptUserTreeNode treeNode) {
+		// 查询数据
+		Map<String, DeptUserTreeNode> deptMap = baseMapper.getDeptMap(treeNode);
+		Map<String, DeptUserTreeNode> userMap = baseMapper.getUserMap(treeNode);
+		deptMap.putAll(userMap);
+		// 处理并返回
+		return NodeTreeUtil.getDeptAndUserNodeTree(deptMap);
+	}
 }

--
Gitblit v1.9.3