背景
之前做过的项目,都是一个用户就一个部门的,现在碰到个一个用户在多个部门的需求,而且需要可以切换不同部门查看不同数据
。
就比如说一个大公司下面有多个子公司,每个子公司有好多部门、子部门等等,然后有部分用户就和多个子公司/部门都有关联,有些数据就需要根据当前用户选择的部门进行过滤。
实现
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/开发部/开发一组
*/