龚焕茏
2024-07-08 86603282c0cc5f005b740112311d89e99b8fc570
feat:部门树形结构
4个文件已修改
2个文件已添加
144 ■■■■■ 已修改文件
src/main/java/com/mindskip/xzs/domain/Department.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/DepartmentServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/service/impl/UserServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/utility/TreeUtils.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/mindskip/xzs/vo/TreeNode.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/UserMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
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
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
src/main/java/com/mindskip/xzs/utility/TreeUtils.java
New file
@@ -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转map
        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;
    }
}
src/main/java/com/mindskip/xzs/vo/TreeNode.java
New file
@@ -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;
    }
}
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>