Appearance
基于单表的树形结构数据
1 案例需求
以树形结构展示组织机构数据,点击某个机构在列表中展示该机构的人员(包含子机构人员)。组织机构数据存储在t_org表,人员数据存储在t_user表。
新增组织机构,新增和删除人员。
(本案例使用已经配置的数据源test)
案例页面如下:
根据需求应提供的服务接口如下:
接口名称 | 接口功能 | 相关表 |
---|---|---|
获取机构树 | 查询组织机构数据并以树形展示 | t_org |
根据机构获取人员 | 根据机构查询人员(含子机构人员)并以分页列表展示 | t_user |
保存组织机构数据 | 保存一条新增的组织机构 | t_org |
保存人员数据 | 保存一条新增的人员数据 | t_user |
删除人员数据 | 根据主键删除删除一条人员数据 | t_user |
2 服务配置
2.1 获取机构树
(1)添加接口
首先在目录下添加一个“获取机构树”接口(GET方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
查询 | 查询组织机构 | 使用SOL查询全部组织机构数据 |
脚本 | 处理集合 | 处理上一个部件的输出结果,过滤出根节点集合、非根节点集合 |
子流程 | 输出组织机构树 | 从根节点开始,输出树形结构的组织机构数据 |
-开始 | “输出组织机构树”子流程的开始 | |
-子流程 | 获取子节点 | 遍历当前节点集合并获取每个节点的子节点,这是一个递归事件 |
--开始 | “获取子节点”子流程的开始 | |
--脚本 | 获取当前节点的children | 查找父节点id是当前节点id的数据,并将它们作为当前节点的children |
--网关 | 判断当前节点的children是否存在且非空值 | |
--递归 | 如果前节点的children存在且非空值,那么将再次调用递归 | |
--结束 | 如果当前节点的children不存在或是空值,那么结束本次递归 | |
--捕获递归 | 获取递归事件 | |
-脚本 | 传递children进入递归 | 将children传递给当前节点集合,继续调用递归事件遍历它们并分别获取它们的子节点 |
结束 |
(3)配置查询部件:“查询组织机构”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
select * from t_org
接着勾选[按参数动态过滤条件子句]、[分页获取查询结果],并输入[当前页码]和[每页数量]的值。
最后在[输出参数]的[查询结果]输入“list”。
(4)配置脚本部件:“处理集合”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
其中输入参数的[执行脚本]如下,它使用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)配置子流程部件:“输出树形数据”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
因为生成树形结构是从根节点开始的,添加一个输入参数data,将rootList赋值给它。这个data将通过执行递归逻辑最终成为一个树形结构的数据,将它赋值给输出参数data(从服务接口返回前端的参数名必须是data)
(6)配置子流程部件:“获取子节点”
在这个部件里针对当前节点集合data里的每个节点执行递归逻辑来获取它们的子节点。
点击该部件,在右侧的部件配置面板上先勾选[循环执行此任务],[循环数据集]输入“data”。
(7)配置脚本部件:“获取当前节点的children”
点击该部件,在右侧的部件配置面板上填写输入参数的[执行脚本]如下,脚本中使用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)配置判断部件(网关)的分支线
点击网关连接递归部件的分支线,在右侧的部件配置面板上输入[执行条件]:
Google
item.children != nil && count(item.children) > 0
再点击优先级按钮将该分支的优先级设置为最高。
(9)配置脚本部件:“传递children进入递归”
点击该部件,在输入参数的[执行脚本]输入如下,将当前节点的children赋值给data,并将它赋值给输出参数data,用于继续调用递归事件。
Google
data = item.children;
2.2 根据机构获取人员
(1)添加接口
首先在目录下添加一个“根据机构获取人”接口(POST方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
查询 | 根据机构查询人员 | 根据机构路径查询机构(含子机构)人员 |
结束 |
(3)配置查询部件:“根据机构查询人员”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“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)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
执行 | 保存机构 | 保存一条机构数据 |
脚本 | 拼接机构路径 | 获取该机构id并拼接机构路径 |
执行 | 修改机构路径 | 将原机构路径更新为拼接的机构路径 |
结束 |
(3)配置执行部件:“保存机构”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源,再在[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)配置脚本部件:“拼接机构路径”
点击该部件,在右侧的部件配置面板上填写输入参数的[执行脚本]如下,从上一部件输出的org里获取到机构id,再用上级机构的机构路径和这个机构id拼接成机构路径。
Google
map=seq.get(org,0);
id=map.c_id;
cascade = map.c_cascade + id +"/";
在输出参数的[自定义出参]添加两个参数id、cascade,并分别用机构id、机构路径赋值。
(5)配置执行部件:“修改机构路径”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源,再在[SQL语句]输入如下:
Google
update
t_org
set
c_cascade = ${cascade}
where
c_id = ${id}
这里就是将该机构的原机构路径值(即上级机构路径)变更为从上一部件输出的机构路径。
2.4 保存人员数据
(1)添加接口
首先在目录下添加一个“保存人员数据”接口(POST方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
执行 | 保存人员 | 保存一条人员数据 |
结束 |
(3)配置执行部件:“保存人员”
点击该部件,在右侧的部件配置面板上先选择数据源,再在[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)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
执行 | 删除人员 | 删除一条人员数据 |
结束 |
(3)配置执行部件:“保存人员”
点击该部件,在右侧的部件配置面板上先选择数据源,再在[SQL语句]输入如下:
Google
delete from
t_user
where
c_id = ${request.params.id}