# 6.4 部门管理 :::tip 概述 部门模块(goframe_dept,租户级表)管理组织架构:树形结构、删除有子级/用户守卫、租户内名称唯一。部门是数据权限(本部门及以下/本部门)的组织基础。 ::: ## 接口清单 ```text 七件套:sys:dept:{page|list|detail|add|update|delete|batchDelete} List 返回树形(IsTree + ParentOf) ``` ## 模块特征 | 特征 | 实现 | |------|------| | 树形 | IsTree + ParentOf,List 自动建树 | | 删除守卫 | 存在子部门拒绝(1011);存在用户引用拒绝(1014 语义) | | 唯一性 | 租户内部门名唯一(uk_tenant_name) | | 数据权限 | dept_id 是 data_scope 档 2/3 的过滤维度 | | 子树查询 | data_scope.go deptSubtreeIds:拉全租户部门行后 BFS | ## 与其他模块的关系 ```text user.dept_id → dept.id 用户归属部门(用户表单部门选择) data_scope 档 2/3 按部门维度过滤可见数据(见 5.9 数据权限) deptSubtreeIds(deptId) 档 2 "本部门及以下"的子孙部门集合计算 (每次全量拉部门表 BFS,树小无缓存; 部门表数百行内无感知,上万行需加短时缓存) ``` ## 唯一性说明 建表有 `uk_tenant_name (tenant_id, name, del_flag)` 唯一索引,但 dept 模块未声明 UniqueFields 预检——重复名称提交会收到数据库 1062 裸错误。修复方向:补 `UniqueFields{Field:"name", Group:"tenant_id"}`(预检范围=索引范围)。 ## 管理建议 + 部门层级建议控制在 5 层内(子树 BFS 与前端展示友好) + 删除部门前先处理子部门与挂载用户(守卫会拦截) + 未分配部门(dept_id=0)的用户挂数据权限档 2/3 时降级为"仅本人"(防可见面意外放大) + 部门调整后,受影响用户的数据权限即时生效(user.Update 清身份缓存路径覆盖 dept_id 变更)