用户多部门切换部门,MySQL根据多个部门id递归获取所有上级(祖级)、获取部门的全路径(全结构名称)

背景

之前做过的项目,都是一个用户就一个部门的,现在碰到个一个用户在多个部门的需求,而且需要可以切换不同部门查看不同数据

就比如说一个大公司下面有多个子公司,每个子公司有好多部门、子部门等等,然后有部分用户就和多个子公司/部门都有关联,有些数据就需要根据当前用户选择的部门进行过滤。

实现

1、用户部门关联

首先就是用户和多部门关联,数据库要怎么保存。之前不是单部门的嘛,用户表和部门表关联就是用的一个dept_id字段;现在多部门我也不打算新建表存储关联关系,而是在原有的dept_id字段上,改个数据类型,比如由varchar改为longtext,然后多个部门之间用逗号隔开。

2、切换部门

其次就是切换部门,用户登录的时候查询用户信息,拿到了用户的部门id,根据部门id去递归获取所有上级。

因为我们切换部门的时候每次只能选中一个部门,而且这个部门需要显示全路径(比如:A公司/子公司1/开发部A公司/子公司1/办公室),所以为了后续好获取全路径,我们需要加一个checked属性,用户的部门id checked值为1,也就是true,其他的上级则为0,也就是false。

递归上级

根据多个部门id,递归所有上级,sql查询如下:

<select id="parentDeptList" resultType="com.entity.sys.vo.DeptVo">
    SELECT id,GROUP_CONCAT(DISTINCT `name`) `name`,GROUP_CONCAT(DISTINCT parent_id) parent_id,MAX(checked) checked
    FROM(
        WITH RECURSIVE temp_dept(id,name,parent_id,checked) AS (
            <!--查询指定部门-->
            SELECT id,name,parent_id,1 checked
            FROM sys_dept
            WHERE FIND_IN_SET(id,#{deptId})
            UNION ALL
            <!--递归查询父部门-->
            SELECT d.id,d.name,d.parent_id,0 checked
            FROM sys_dept d
            JOIN temp_dept c ON d.id = c.parent_id
        )
        SELECT id,name,parent_id,checked
        FROM temp_dept
        <!--不加条件则获取它的所有父节点,包括它本身-->
        <!--WHERE parent_id IN (SELECT id FROM sys_dept WHERE parent_id = 'ROOT')-->
    ) a
    GROUP BY id
</select>

查询结果用一个实体类接收:

@Data
public class DeptVo {
   
   
    private String id;
    private String parentId;
    private String name;

    /**
     * 部门id全称:1/2/5/13
     */
    private String fullId;

    /**
     * 部门名称全称:A公司/子公司1/开发部/开发一组
     */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值