Skip to content
本页目录

基于单表的树形结构数据

1 案例需求

  • 以树形结构展示组织机构数据,点击某个机构在列表中展示该机构的人员(包含子机构人员)。组织机构数据存储在t_org表,人员数据存储在t_user表。

  • 新增组织机构,新增和删除人员。

(本案例使用已经配置的数据源test)

案例页面如下:

image

image

image

根据需求应提供的服务接口如下:

接口名称接口功能相关表
获取机构树查询组织机构数据并以树形展示t_org
根据机构获取人员根据机构查询人员(含子机构人员)并以分页列表展示t_user
保存组织机构数据保存一条新增的组织机构t_org
保存人员数据保存一条新增的人员数据t_user
删除人员数据根据主键删除删除一条人员数据t_user

2 服务配置

2.1 获取机构树

(1)添加接口

首先在目录下添加一个“获取机构树”接口(GET方法)。

(2)添加服务部件

在画布上添加以下服务部件,并连接部件。

image

各部件说明如下:

部件类型备注文字任务说明
开始
查询查询组织机构使用SOL查询全部组织机构数据
脚本处理集合处理上一个部件的输出结果,过滤出根节点集合、非根节点集合
子流程输出组织机构树从根节点开始,输出树形结构的组织机构数据
-开始“输出组织机构树”子流程的开始
-子流程获取子节点遍历当前节点集合并获取每个节点的子节点,这是一个递归事件
--开始“获取子节点”子流程的开始
--脚本获取当前节点的children查找父节点id是当前节点id的数据,并将它们作为当前节点的children
--网关判断当前节点的children是否存在且非空值
--递归如果前节点的children存在且非空值,那么将再次调用递归
--结束如果当前节点的children不存在或是空值,那么结束本次递归
--捕获递归获取递归事件
-脚本传递children进入递归将children传递给当前节点集合,继续调用递归事件遍历它们并分别获取它们的子节点
结束

(3)配置查询部件:“查询组织机构”

点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。

image

先选择数据源“test”,再在[SQL语句]输入如下:

Google
select * from t_org

接着勾选[按参数动态过滤条件子句]、[分页获取查询结果],并输入[当前页码]和[每页数量]的值。

最后在[输出参数]的[查询结果]输入“list”。

(4)配置脚本部件:“处理集合”

点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。

image

其中输入参数的[执行脚本]如下,它使用lambda表达式对前一个部件输出的list进行数据过滤,将父节点id为0的数据(根节点)放入rootList,父节点id不为0的数据(非根节点)放入childList。

Google
rootList = filter(list, lambda(obj) -> obj.c_parent_id == 0 end);
childList = filter(list, lambda(obj) -> obj.c_parent_id != 0 end);

(5)配置子流程部件:“输出树形数据”

点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。

image

因为生成树形结构是从根节点开始的,添加一个输入参数data,将rootList赋值给它。这个data将通过执行递归逻辑最终成为一个树形结构的数据,将它赋值给输出参数data(从服务接口返回前端的参数名必须是data)

(6)配置子流程部件:“获取子节点”

image

在这个部件里针对当前节点集合data里的每个节点执行递归逻辑来获取它们的子节点。

点击该部件,在右侧的部件配置面板上先勾选[循环执行此任务],[循环数据集]输入“data”。

(7)配置脚本部件:“获取当前节点的children”

image

点击该部件,在右侧的部件配置面板上填写输入参数的[执行脚本]如下,脚本中使用lambda表达式对childList进行数据过滤,筛选出父节点id是当前节点id的数据,并将这些数据赋值为当前节点的children。

Google
children = filter(childList, lambda(obj) -> obj.c_parent_id == item.c_id end);
seq.put(item, "children", children);

(8)配置判断部件(网关)的分支线

image

点击网关连接递归部件的分支线,在右侧的部件配置面板上输入[执行条件]:

Google
item.children != nil && count(item.children) > 0

再点击优先级按钮将该分支的优先级设置为最高。

(9)配置脚本部件:“传递children进入递归”

image

点击该部件,在输入参数的[执行脚本]输入如下,将当前节点的children赋值给data,并将它赋值给输出参数data,用于继续调用递归事件。

Google
data = item.children;

2.2 根据机构获取人员

(1)添加接口

首先在目录下添加一个“根据机构获取人”接口(POST方法)。

(2)添加服务部件

在画布上添加以下服务部件,并连接部件。

image

各部件说明如下:

部件类型备注文字任务说明
开始
查询根据机构查询人员根据机构路径查询机构(含子机构)人员
结束

(3)配置查询部件:“根据机构查询人员”

点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。

image

先选择数据源“test”,再在[SQL语句]输入如下:

Google
select
  *
from
  t_user
where
  c_cascade like ${cascade}

由于是分页展示列表数据,需要勾选[分页获取查询结果],并输入[当前页码]和[每页数量]。

接下来在[自定义入参]下添加一个参数cascade,对其赋值:request.body.cascade+"%"

说明:cascade获取的是t_org表和t_user表中存储的组织机构路径,它由机构id和“/”拼接而成。例如某财政局的机构id是1,它的机构路径就是“/0/1/”,其中0是根节点id;该财政局办公室的机构id是30,它的机构路径就是“/0/1/30/”。

最后在[输出参数]的[查询结果]输入“data”。

2.3 保存机构数据

(1)添加接口

首先在目录下添加一个“保存机构数据”接口(POST方法)。

(2)添加服务部件

在画布上添加以下服务部件,并连接部件。

image

各部件说明如下:

部件类型备注文字任务说明
开始
执行保存机构保存一条机构数据
脚本拼接机构路径获取该机构id并拼接机构路径
执行修改机构路径将原机构路径更新为拼接的机构路径
结束

(3)配置执行部件:“保存机构”

点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。

image

先选择数据源,再在[SQL语句]输入如下:

Google
insert into
  t_org(c_parent_id, c_name,c_cascade)
values(${request.body.c_parent_id},${request.body.c_name},${request.body.c_cascade})

注意这里从前端取到的机构路径${request.body.c_cascade}其实是上级机构的机构路径,还要和本机构id拼接才能生成本机构的机构路径。

在输出参数的[返回的主键]输入“org”,本机构id就包含在这个“org”里。

(4)配置脚本部件:“拼接机构路径”

image

点击该部件,在右侧的部件配置面板上填写输入参数的[执行脚本]如下,从上一部件输出的org里获取到机构id,再用上级机构的机构路径和这个机构id拼接成机构路径。

Google
map=seq.get(org,0);
id=map.c_id;
cascade = map.c_cascade + id +"/";

在输出参数的[自定义出参]添加两个参数id、cascade,并分别用机构id、机构路径赋值。

(5)配置执行部件:“修改机构路径”

点击该部件,在右侧的部件配置面板上填写输入参数。

image

先选择数据源,再在[SQL语句]输入如下:

Google
update
  t_org
set
  c_cascade = ${cascade}
where
  c_id = ${id}

这里就是将该机构的原机构路径值(即上级机构路径)变更为从上一部件输出的机构路径。

2.4 保存人员数据

(1)添加接口

首先在目录下添加一个“保存人员数据”接口(POST方法)。

(2)添加服务部件

在画布上添加以下服务部件,并连接部件。

image

各部件说明如下:

部件类型备注文字任务说明
开始
执行保存人员保存一条人员数据
结束

(3)配置执行部件:“保存人员”

image

点击该部件,在右侧的部件配置面板上先选择数据源,再在[SQL语句]输入如下:

Google
insert into
  t_user(c_org_id, c_zw, c_zj, c_name,c_cascade)
values(${request.body.c_org_id},${request.body.c_zw},${request.body.c_zj},${request.body.c_name},${request.body.c_cascade})

2.5 删除人员数据

(1)添加接口

首先在目录下添加一个“删除人员数据”接口(GET方法)。

(2)添加服务部件

在画布上添加以下服务部件,并连接部件。

image

各部件说明如下:

部件类型备注文字任务说明
开始
执行删除人员删除一条人员数据
结束

(3)配置执行部件:“保存人员”

image

点击该部件,在右侧的部件配置面板上先选择数据源,再在[SQL语句]输入如下:

Google
delete from
  t_user
where
  c_id = ${request.params.id}

内部资料,请勿外传