在业务系统中,经常需要通过用户的所属机构控制用户所能查看到的数据。
下面我们演示如何实现数据权限,控制不同机构用户只能查看所属机构及其所有子机构的数据。
机构架构如下:
- 当总部用户查看报表时,能够查看到所有机构的数据
- 当华南业务员查看报表时,能够查看到"华南"机构及其所有下级机构的数据。
- 当华北业务员查看报表时,能够查看到"华北"机构及其所有下级机构的数据。
前提
数据库中存在机构表,包含机构编号字段、机构名称字段和上级机构编号字段。如org表;其中c_id为机构编号,c_name为机构名称,c_parentid字段为上级机构编号。
实现步骤
使用下拉树参数和用户所属默认组名称相结合,控制用户登录之后,下拉树参数的根节点的值为用户所属机构的编号,则用户进行参数切换,只能够选择其所属机构或者下级机构,不能够选择上级机构或者其他机构。
通过参数过滤数据实现用户只能查看其所属机构及下级机构的数据。
1. 在用户管理中建立用户组,如下:包括总部、华北、华南三个用户组。
2. 设置"总部管理员"默认组为"总部","华南业务员"默认组为"华南"、"华北业务员"默认组为"华北"。
3. 在“系统导航栏”选择 公共设置,点击 参数定义,新建参数,数据格式选择"字符串",控件类型选择下拉树。
4. 备选值、默认值和根节点设置如下:
备选值、根节点和默认值中,使用系统函数“CurrentUserDefaultDepartmentName”与“c_name”字段进行过滤,则当用户选择参数时根节点为对应的机构编号。
- 备选值:
代码块 | ||||
---|---|---|---|---|
| ||||
select c_id as c_id, c_name as c_name, c_parentid as c_parentid from org where c_name = CurrentUserDefaultDepartmentName() /*获取当前用户所属机构名称。实际是获取下拉树的第一层,如使用华南用户登录,则可以查看“华南用户”这一条数据*/ or ( /*获取父节点,父节点等于当前用户ID的数据,实际是获取下拉数的第二层。如使用华南用户登录,则父节点为“华南”的就是华南一区、二区了,可以看到华南一区、华南二区的数据*/ c_parentid = ( select c_id from org where c_name = CurrentUserDefaultDepartmentName() ) ) /*获取以华南一区、二区为父节点的数据, 即获取到用户组第三层的数据*/ or ( /*父节点等于当前用户ID的数据,比如华南登录,父节点是华南的数据,即华南一区、二区这里就会获得华南一区、二区的数据*/ /*获取华南一区、二区的节点ID*/ c_parentid in ( select c_id from org where ( /*再获取华南一区、二区的节点ID*/ c_parentid = ( select c_id from org where c_name = CurrentUserDefaultDepartmentName() ) ) ) ) |
- 默认值:
代码块 | ||||
---|---|---|---|---|
| ||||
select c_id as c_id, c_name as c_name,c_parentid as c_parentid from org where c_name = CurrentUserDefaultDepartmentName() |
- 根节点:
代码块 | ||||
---|---|---|---|---|
| ||||
select c_id as c_id, c_name as c_name from org where c_name = CurrentUserDefaultDepartmentName() |
5. 在参数定义中勾选"允许多选"。
6. 参数真实值,实际值设置如下:
7. 在数据集中使用上述步骤中建立的参数,如:
8. 建立报表。使用不同用户组用户登录,效果如下:
- 总部管理员:
- 华南业务员:
- 华北业务员: