陈昶聿
7 天以前 74d740bb065e5806748b1ab8ca95d20984c7eace
【丽水】1、system/user/getInfo 中的belongDepts和belongWards树形结构只获取子节点
已修改5个文件
已添加1个文件
149 ■■■■■ 文件已修改
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/TreeUtils.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -64,6 +64,9 @@
    @Qualifier("sysUserDeptSystemMapper")
    private SysUserDeptMapper sysUserDeptMapper;
    @Autowired
    private ISysDeptService sysDeptService;
    @Value("${isAdmin}")
    private List<Long> isAdmin;
@@ -147,17 +150,19 @@
        }
        List<SysUserDept> sysUserDeptKSs = null;
        List<SysUserDept> sysUserDeptBQs = null;
        List<SysDept> sysDeptKSs = null;
        List<SysDept> sysDeptBQs = null;
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(userId);
        sysUserDept.setDeptType("1");
        sysUserDept.setOrgid(user.getOrgid());
        sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        ajax.put("belongDepts", sysUserDeptKSs);
        sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongDepts", sysDeptKSs);
        sysUserDept.setDeptType("2");
        sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        ajax.put("belongWards", sysUserDeptBQs);
        sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongWards", sysDeptBQs);
        return ajax;
    }
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 æž„造树,O(n) ä¸€æ¬¡éåŽ†ã€‚
     * æ ¹èŠ‚ç‚¹ä¸ºã€Œçˆ¶Id不在集合中」的节点;若不存在根节点(如全是自引用的环)则原样返回。
     *
     * @param nodes          èŠ‚ç‚¹åˆ—è¡¨
     * @param idGetter       å–节点id
     * @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;
    }
    /**
     * ä¸€æ¬¡æ€§èŽ·å–æ‰€æœ‰å¶å­èŠ‚ç‚¹ï¼šå³ã€Œid ä¸å‡ºçŽ°åœ¨ä»»ä½•èŠ‚ç‚¹çš„ parentId ä¸­ã€çš„节点,O(n) ä¸€æ¬¡éåŽ†ã€‚
     *
     * @param nodes          èŠ‚ç‚¹åˆ—è¡¨
     * @param idGetter       å–节点id
     * @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);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysDept;
@@ -120,4 +121,12 @@
     * @return ç»“æžœ
     */
    public int deleteDeptById(Long deptId);
    /**
     * æ ¹æ®UserID查询所有子部门
     *
     * @param sysUserDept éƒ¨é—¨g关系
     * @return éƒ¨é—¨åˆ—表
     */
    public List<SysDept> selectSysDeptListBySysUserDept(SysUserDept sysUserDept);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
@@ -5,6 +5,7 @@
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysUserDept;
/**
 * éƒ¨é—¨ç®¡ç† æœåС层
@@ -129,4 +130,13 @@
     * @return ç»“æžœ
     */
    public int deleteDeptById(Long deptId);
    /**
     * èŽ·å–å¶å­ç§‘å®¤
     *
     * @param sysUserDept
     * @return ç»“æžœ
     */
    public List<SysDept> selectLeafSysDeptListBySysUserDept(SysUserDept sysUserDept);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -3,6 +3,10 @@
import java.util.*;
import java.util.stream.Collectors;
import cn.hutool.core.lang.tree.TreeUtil;
import com.ruoyi.common.core.domain.entity.SysUserDept;
import com.ruoyi.common.utils.TreeUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -315,4 +319,14 @@
    private boolean hasChild(List<SysDept> list, SysDept t) {
        return getChildList(list, t).size() > 0;
    }
    public List<SysDept> selectLeafSysDeptListBySysUserDept(SysUserDept sysUserDept){
        List<SysDept> list =  deptMapper.selectSysDeptListBySysUserDept(sysUserDept);
        if(CollectionUtils.isNotEmpty(list)){
            List<SysDept> tree = TreeUtils.buildDeptTree(list);
            list = TreeUtils.getLeafDepts(tree);
        }
        return list;
    }
}
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -178,6 +178,8 @@
        where find_in_set(#{deptId}, ancestors)
    </select>
    <select id="selectNormalChildrenDeptById" parameterType="Long" resultType="int">
        select count(*)
        from sys_dept
@@ -280,4 +282,17 @@
        where dept_id = #{deptId}
    </delete>
    <select id="selectSysDeptListBySysUserDept" parameterType="com.ruoyi.common.core.domain.entity.SysUserDept"
            resultMap="SysDeptResult">
        <include refid="selectDeptVo"/>
        inner join sys_user_dept ud
        on d.dept_code = ud.dept_code
        where 1=1
        and d.del_flag = 0
        and ud.del_flag = 0
        <if test="orgid != null">and d.orgid = #{orgid} and ud.orgid = #{orgid}</if>
        <if test="campusid != null">and d.campusid = #{campusid} and ud.campusid = #{campusid}</if>
        <if test="userId != null">and ud.user_id = #{userId}</if>
        <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if>
    </select>
</mapper>