页面树结构
转至元数据结尾
转至元数据起始

背景说明

现客户的业务系统中,需要实现不同机构的用户查看报表时,只能查看所属机构以及下级机构的数据。

1.其中,机构相关的层级如下:

省联社(第一级)-》 市联社(第二级) -》区支行(第三级)

 

机构表为perm_inst,表结构如下:

 

数据如下:

 

2.数据表为perm_data,表数据如下:

以上数据在本示例中都存储于MySQL数据库中,接下来我们来实现数据权限控制。

 

实现步骤

一、创建用户

在smartbi中,创建用户组和用户,其中用户组的名称与业务数据中的机构信息一致。如下:

二、设置数据权限

接下来在进行数据权限的设置,有三种方式进行设置。如下:

方式一:简单参数实现方式

在所有报表上增加“选择机构_ALL”参数,该参数为多选参数,根据当前登录用户的机构信息,可下拉选择该用户的机构及下属机构进行数据的查看。

优点:实现较简单

缺点:机构参数中不存在层级的关系,并且机构的显示顺序有可能是无序的

 

设置步骤如下:

1.创建参数

(1)创建一个下拉框参数,参数名称为“选择机构_ALL”,数据类型为“字符串”,控件类型为下拉框

 

(2)勾选“允许多选”

 

(3)备选值设置为

select INST_NAME from perm_inst where INST_NAME=CurrentUserDefaultDepartmengName() or INST_NAME1=CurrentUserDefaultDepartmentName() or INST_NAME2=CurrentUserDefaultDepartmentName() or INST_NAME3=CurrentUserDefaultDepartmentName()

(本sql仅为示例参考,实际sql需要根据自己的机构逻辑进行设置)

其中 为系统函数,获取当前用户默认所属组的名称,然后与INST_NAME、INST_NAME1、INST_NAME2、INST_NAME3几个字段进行过滤,查询出当前用户默认所属组的机构及所有下级机构

 

以“广州联社”机构下的用户登录为例,备选值结果如下:

 

(4)默认值设置为:select INST_NAME from perm_inst where INST_NAME=CurrentUserDefaultDepartmentName()

该语句获取当前登录用户的所属机构

(也可以根据实际需要编辑sql,获取当前登录用户的所属机构和所有下级机构)

 

2.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下:

 

方式二:级联方式实现(推荐)

使用一个“选择层级”参数,选择用户可查看的机构层级,比如市联社、区支行,选择后,在后面的“选择机构_级联”参数中,可以选择用户权限内的对应层级机构进行数据的查看。

优点:可以先选择层级,再选择机构,不同层级的机构不会掺杂在一起

缺点:不可同时查看不同层级的机构数据

 

设置步骤如下:

1.新建用户属性

在资源定制->公共设置->用户属性节点下,新建用户属性“用户机构层级”,通过当前登录用户的默认所属组,从业务库的机构表中,获取该用户组(也即用户的所属机构)的层级。定义如下:

根据用户所属机构信息,从机构表中查询该字段,返回的结果包含0,1,2

 

2.创建“选择层级”参数

(1)创建一个下拉框参数,名称为“选择层级”,控件为下拉框,如下:

 

(2)备选值设置为:

select T.name as name, T.alias as alias from (select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst)T where T.name >=用户机构层级

(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置)

该sql语句通过select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst,将用户的三个层级查询出来

 

然后再通过外套的一层sql语句,select T.name as name, T.alias as alias from (XXX XXX) T where T.name >=用户机构层级,查询出用户的机构和下级机构的层级。比如用户的机构是“广州联社”,则根据这段sql查询出来的机构层级有1和2

 

(3)默认值设置为:

select T.name as name, T.alias as alias from (select distinct 0 as name, "省联社" as alias from perm_inst union select distinct 1 as name, "市联社" as alias from perm_instunion select distinct 2 as name,"区支行" as alias from perm_inst)T where T.name =用户机构层级

该sql与备选值的sql是一致的,只是将最后的T.name>=用户机构层级修改为T.name=用户机构层级,只查询出用户的机构的层级,而不查询其下级机构的层级

 

(4)点击下一步,设置备选值和默认值的真实值为“name”字段,备选值和默认值的显示值为“alias”字段

 

3.创建“选择机构_级联”参数

(1)创建一个下拉框参数,名称为“选择机构_级联”,控件类型为下拉框

(2)勾选‘允许多选’

 

(3)备选值设置为:

select INST_NAME  from perm_inst where INST_level= 选择层级(参数) and (INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName() )

(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置

通过上述的SQL,结合实际业务的机构表,先将“选择层级”中对应的INST_LEVEL的INST_NAME查询出来,并且根据后面的INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName()条件,将用户所属机构所选层级的机构或下级机构查询出来

 

(4)默认值设置为:

select INST_NAME  from perm_inst where INST_level= 选择层级(参数) and (INST_NAME= CurrentUserDefaultDepartmentName() or INST_NAME1= CurrentUserDefaultDepartmentName() or INST_NAME2= CurrentUserDefaultDepartmentName() or INST_NAME3= CurrentUserDefaultDepartmentName() ) limit 1

此SQL与备选值的SQL是一致的,只是增加一个limit 1,限制默认值只查询1个机构。

 

4.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下:

 

方式三:使用下拉树参数实现

通过将机构信息构成树的形式,并控制根节点为用户所属即可,可以实现数据权限的控制。

优点:机构层级选择清晰,接受度高

缺点:数据需要能够构造父子结构,实现较复杂

设置步骤如下:

 

1.新建用户属性

在资源定制->公共设置->用户属性节点下,新建用户属性“用户机构层级”,通过当前登录用户的默认所属组,从业务库的机构表中,获取该用户组(也即用户的所属机构)的层级。定义如下:

根据用户所属机构信息,从机构表中查询该字段,返回的结果包含0,1,2

 

2.创建下拉树参数

(1)在创建下拉树参数之前,请先参考演示下拉树参数示例,了解下拉树参数控件设置

(2)创建下拉树参数,名称为“选择机构_下拉树”,控件类型为“下拉树”

 

(3)勾选“允许多选”

 

(4)结合perm_inst表,先设置根节点为:

select distinct INST_NAME from  perm_inst where INST_NAME= CurrentUserDefaultDepartmentName()

使用该sql,查询出用户的机构

 

 

(5)再设置默认值为:

select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName()

该sql语句,查询出用户的机构。由于下拉树参数需要构成父子结构,并且不可以存在子节点和父节点值相同(会造成死循环)的情况,所以需要增加'0' 作为父节点数据

 

(6)设置备选值为:

select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName()
union
select inst_name,inst_name1 as inst_name_P from perm_inst where 用户机构层级(用户属性)=0 and inst_level=1 and inst_name1= CurrentUserDefaultDepartmentName()
union
select inst_name,inst_name2 as inst_name_P from perm_inst where ( 用户机构层级(用户属性) =0 and inst_level=2 and inst_name1= CurrentUserDefaultDepartmentName()) or ( 用户机构层级 =1 and inst_level=2 and inst_name2=CurrentUserDefaultDepartmentName())

(此SQL仅供示例参考,实际sql需要根据自己的机构逻辑进行设置

该sql通过3个select语句 union到一起,查询出用户的所有机构,并找到其父机构。以构造成父子关系,形成下拉树

其中,

select inst_name ,'0' as inst_name_P from perm_inst where inst_name= CurrentUserDefaultDepartmentName(),获取当前机构,并为了不造成死循环,设置'0'为父机构

select inst_name,inst_name1 as inst_name_P from perm_inst where 用户机构层级(用户属性)=0 and inst_level=1 and inst_name1= CurrentUserDefaultDepartmentName(),当用户机构所属层级为0(即省联社)时,获取下级机构

select inst_name,inst_name2 as inst_name_P from perm_inst where ( 用户机构层级(用户属性) =0 and inst_level=2 and inst_name1= CurrentUserDefaultDepartmentName()) or ( 用户机构层级 =1 and inst_level=2 and inst_name2=CurrentUserDefaultDepartmentName()),当用户机构所属机构为1(即市联社)时,获取下级机构

由于第三级机构为区机构,没有下级机构,并且通过第一个select语句已经能够查询出区机构,因此不必再设置

 

(7)设置备选值、默认值、根节点等设置如下:

 

3.参考数据权限设置中,在报表的数据集、业务主题过滤器等相关资源中,使用该参数即可。以数据集为例,使用该参数如下:

  • 无标签