Appearance
主从表增删改查
1 案例需求
实现会议接待单的增删改查,会议接待单包括基本信息、来宾人员、陪同人员和用车信息。会议接待单数据存储在t_reception表,人员信息的数据存储在t_reception_ry表(该表的c_reception_id关联到t_reception的主键),用车信息的数据存储在t_car_apply表(该表的c_reception_id关联到t_reception的主键)。
新增会议接待单后可以保存或提交审批。(审批流转相关的服务配置放在后续的学习文档中讲述)
案例页面如下:
(说明:列表上的“主要来宾”取会议接待单上“来宾名单”的首位人员)
根据需求应提供的服务接口如下:
接口名称 | 接口功能 | 相关表 |
---|---|---|
分页列表 | 根据查询条件返回会议接待单数据,用于在列表分页展示 | t_reception、t_reception_ry |
保存或修改单条数据 | 保存新增的会议接待单,或者保存已修改的会议接待单,限单条数据 | t_reception、t_reception_ry、t_car_apply |
获取单条数据 | 根据主键返回单条会议接待单数据,用于在表单展示 | t_reception、t_reception_ry、t_car_apply |
删除单条数据 | 根据主键删除单条会议接待单 | t_reception、t_reception_ry、t_car_apply |
2 数据源配置
在配置服务接口前,先要在<DSC管理>-<数据源管理>和<项目空间>-<配置项>-<DSC配置>-<数据源配置>中完成数据源的配置。
3 服务配置
3.1 分页列表
(1)添加接口
首先在目录下添加一个“分页列表”接口(GET方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
脚本 | 接收参数 | 从前端页面获取输入参数 |
查询 | 查询 | 使用SOL查询数据库 |
结束 |
(3)配置脚本部件:接收参数
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
输入参数的脚本如下,它包括了查询条件、分页列表需要的分页条数和当前页。
Google
currentPage=request.params.currentPage;
pageSize=request.params.pageSize;
keyword=count(request.params.keyword)>0?"%"+request.params.keyword+"%":"";
status = request.params.status;
zj = request.params.zj;
接下来定义输出参数并将输入参数的值赋给它。
(4)配置查询部件:“查询”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
SELECT t1.c_id as id, t1.c_name AS sqr, t1.c_car_apply AS ycsq, t1.c_status as status, t1.c_main_content AS zyhd, TO_CHAR( t1.c_start_date, 'YYYY-MM-DD' ) || '至' || TO_CHAR( t1.c_end_date, 'YYYY-MM-DD' ) AS dlrq, t1.c_people_count as rs,t2.zylb, t2.zw, t2.zj FROM t_reception t1 LEFT JOIN ( SELECT b.* FROM ( SELECT y.c_reception_id, y.c_name AS zylb, y.c_zw AS zw, y.c_zj AS zj, ROW_NUMBER ( ) OVER ( PARTITION BY y.c_reception_id ORDER BY y.c_id ASC ) AS group_idx FROM t_reception_ry y WHERE y.c_type = '来宾' ) b WHERE b.group_idx = '1' ) t2 ON t1.c_id = t2.c_reception_id where (t2.zylb like ${keyword} or t2.zw like ${keyword}) and t1.c_status = ${status} and t2.zj= ${zj}
接着勾选[按参数动态过滤条件子句]、[分页获取查询结果],并输入[当前页码]和[每页数量]的值。
最后在[输出参数]的[查询结果]输入“data”。
3.2 保存或修改单条数据
(1)添加接口
首先在目录下添加一个“保存或修改单条数据”接口(POST方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
其中有两个事务部件,一个事务部件内包含了与新增操作相关的部件,另一个事务包含了与修改操作相关的部件。
另外还有三个网关,第一个网关用于判断是表单操作是修改还是新增(修改分支的条件表达式输入:id != nil && count(str(id))>0 ,新增分支的条件表达式输入:id==nil || count(str(id)) == 0 ),另两个网关都用于判断表单上是否启用了“用车需求”选项(条件表达式输入:carApply == "1")。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
脚本 | 接收接待表参数 | 从前端页面获取与t_reception表字段有关的输入参数 |
脚本 | 接收用车表参数 | 从前端页面获取与t_car_apply表字段有关的输入参数 |
JSON解析 | 处理人员明细数据 | 将人员明细数据从JSON转换为数组 |
网关 | 判断表单操作类型是修改还是新增 | |
事务 | ||
开始 | ||
执行 | 修改接待单 | 使用SOL操作数据库,根据c_id更新t_reception的一条记录 |
执行 | 删除人员明细 | 使用SOL操作数据库:根据c_reception_id从t_reception_ry删除记录 |
执行 | 新增人员明细 | 使用SOL操作数据库:根据已解析的人员明细数据在t_reception_ry插入记录,c_reception关联t_reception.c_id |
执行 | 删除用车信息 | 使用SOL操作数据库:根据c_reception_id从t_car_apply删除记录 |
网关 | 判断是否有“用车需求” | |
执行 | 新增用车信息 | 使用SOL操作数据库:在t_car_apply插入一条记录,c_reception关联t_reception.c_id |
结束 | ||
事务 | ||
开始 | ||
执行 | 新增接待单 | 使用SOL操作数据库:在t_reception插入一条记录 |
脚本 | 获取返回的接待单id | 从上一个部件的返回值中获取接待单id |
执行 | 新增人员明细 | 使用SOL操作数据库:根据已解析的人员明细数据在t_reception_ry插入记录,c_reception关联t_reception.c_id |
网关 | 判断是否有“用车需求” | |
执行 | 新增用车信息 | 使用SOL操作数据库:在t_car_apply插入一条记录,c_reception关联t_reception.c_id |
结束 | ||
脚本 | 输出调试结果 | 用于服务调试输出提示信息 |
结束 |
(3)配置脚本部件:“接收接待表参数”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
输入参数的脚本如下。
Google
id = request.body.c_id;
name = request.body.c_name;
dept =request.body.c_dept;
mobile = request.body.c_mobile;
unit = request.body.c_unit;
tenantId = request.body.c_tenant_id;
mainContent = request.body.c_main_content;
peopleCount = request.body.c_people_count;
startDate = request.body.c_start_date;
endDate = request.body.c_end_date;
status = request.body.c_status;
stateId = request.body.c_state_id;
carApply = request.body.c_car_apply;
ryJson = request.body.ryJson;
fjJson = request.body.c_fj;
接着定义输出参数并将输入参数的值赋给它。
(4)配置脚本部件:“接收用车表参数”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
输入参数的脚本如下。
Google
rs = request.body.ycForm.c_rs;
cfd = request.body.ycForm.c_cfd;
mdd = request.body.ycForm.c_mdd;
cstartDate = request.body.ycForm.c_start_date;
cendDate = request.body.ycForm.c_end_date;
ycsy = request.body.ycForm.c_ycsy;
接着定义输出参数并将输入参数的值赋给它。
(5)配置JSON解析部件:“处理人员明细数据”
因为从前端获取的人员明细数据是一个JSON字符串,需要在此转换为数组后再在后续的数据库操作中使用。
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
接下来配置修改事务内部的部件:
(6)配置执行部件:“修改接待单”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
UPDATE t_reception SET c_name = ${name}, c_dept = ${dept}, c_mobile = ${mobile}, c_unit = ${unit}, c_main_content = ${mainContent}, c_people_count=${peopleCount}, c_start_date=${startDate}, c_end_date = ${endDate}, c_status = ${status},c_state_id = ${stateId},c_car_apply=${carApply},c_fj=${fjJson} where c_id = ${id}
(7)配置执行部件:“删除人员明细”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
DELETE FROM t_reception_ry WHERE c_reception_id = ${id}
(8)配置执行部件:“新增人员明细”
点击该部件,在右侧的部件配置面板上勾选[循环执行此任务],并在[循环数据集]输入“ryData”,这个“ryData”就是前面的JSON解析部件输出的参数。
接着选择数据源“test”,再在[SQL语句]输入如下:
Google
INSERT INTO t_reception_ry(c_name, c_type,c_zw, c_zj, c_reception_id) VALUES(${item.c_name}, ${item.c_type},${item.c_zw}, ${item.c_zj}, ${id});
(9)配置执行部件:“删除用车信息”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
DELETE FROM t_car_apply WHERE c_reception_id = ${id}
(10)配置执行部件:“新增用车信息”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
INSERT INTO t_car_apply(c_rs,c_cfd,c_mdd,c_start_date,c_end_date,c_ycsy,c_reception_id) VALUES(${rs},${cfd},${mdd},${cstartDate},${cendDate},${ycsy},${id});
接下来配置新增事务内部的部件:
(11)配置执行部件:“新增接待单”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
INSERT INTO t_reception(c_name, c_dept, c_mobile, c_unit, c_tenant_id, c_main_content, c_people_count, c_start_date, c_end_date, c_status,c_state_id,c_car_apply,c_fj) VALUES(${name}, ${dept}, ${mobile}, ${unit}, ${tenantId}, ${mainContent}, ${peopleCount}, ${startDate}, ${endDate}, ${status},${stateId},${carApply},${fjJson});
最后在[输出参数]的[返回主键]输入“receptionList”。这里返回的是单条数据的集合list所以下一步从list中拿到c_id。
(12)配置脚本部件:“获取返回的接待单id”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
输入参数的脚本如下,用于从receptionList中取到新增记录的主键c_id。
Google
map=seq.get(receptionList,0);
rId=map.c_id;
接着在[自定义出参]添加输出参数rId并赋值(即新增记录的主键c_id)。
(13)配置执行部件:“新增人员明细”
点击该部件,在右侧的部件配置面板上勾选[循环执行此任务],并在[循环数据集]输入“ryData”。
接着填写输入参数,先选择数据源“test”,再在[SQL语句]输入如下:
Google
INSERT INTO t_reception_ry(c_name, c_type,c_zw, c_zj, c_reception_id) VALUES(${item.c_name}, ${item.c_type},${item.c_zw}, ${item.c_zj}, ${rId});
(14)配置执行部件:“新增用车信息”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
INSERT INTO t_car_apply(c_rs,c_cfd,c_mdd,c_start_date,c_end_date,c_clxq,c_ycsy,c_reception_id,c_tenant_id) VALUES(${rs},${cfd},${mdd},${cstartDate},${cendDate},${clxq},${ycsy},${rId},${tenantId});
(15)配置脚本部件:“输出调试结果”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
该部件仅用于服务调试时输出提示文本,删除此部件并不影响服务接口的功能。
3.3 获取单条数据
(1)添加接口
首先在目录下添加一个“获取单条数据”接口(GET方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
其中网关用于判断是否在t_reception表中查询到结果。有结果的分支,条件表达式输入“count(data)>0”,无结果的分支,条件表达式输入“count(data) == 0”。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
脚本 | 接收id | 从前端页面获取数据主键c_id |
查询 | 查询接待单 | 使用SOL查询数据库:根据c_id查询t_reception表 |
网关 | 判断是否在t_reception表中查询到结果 | |
查询 | 查询用车信息 | 使用SOL查询数据库:根据c_reception_id查询t_car_apply表 |
查询 | 查询人员明细 | 使用SOL查询数据库:根据c_reception_id查询t_reception_ry表 |
脚本 | 组装数据 | 按照前端表单页面的数据结构对接待单、用车信息、人员明细的查询结果进行组装 |
结束 |
(3)配置脚本部件:接收id
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
(4)配置查询部件:“查询接待单”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
select * from t_reception where c_id = ${id}
最后在[输出参数]的[查询结果]输入“data”。
(5)配置查询部件:“查询用车信息”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
select * from t_car_apply where c_reception_id = ${id}
最后在[输出参数]的[查询结果]输入“ycList”。
(6)配置查询部件:“查询人员明细”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
select * from t_reception_ry where c_reception_id = ${id}
最后在[输出参数]的[查询结果]输入“pList”。
(7)配置脚本部件:组装数据
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
其中输入参数的脚本如下:
Google
rMap = count(data)>0?seq.get(data,0):seq.map();
seq.put(rMap,"ryList",pList);
yMap = count(ycList)>0?seq.get(ycList,0):seq.map();
seq.put(rMap,"ycForm",yMap);
seq.put(data,0,rMap);
3.4 删除单条数据
(1)添加接口
首先在目录下添加一个“删除单条数据”接口(GET方法)。
(2)添加服务部件
在画布上添加以下服务部件,并连接部件。
t_reception_ry表和t_car_apply表都是t_reception表的从表,所以删除接待单和与之关联的人员、用车信息是属于一个事务。
各部件说明如下:
部件类型 | 备注文字 | 任务说明 |
---|---|---|
开始 | ||
事务 | 接受id | 从前端页面获取一条接待单的主键c_id |
开始 | ||
执行 | 删除接待单 | 使用SOL操作数据库:根据c_id从t_reception表删除一条记录 |
执行 | 删除人员 | 使用SOL操作数据库:根据c_reception_id从t_reception_ry表删除记录 |
执行 | 删除用车信息 | 使用SOL操作数据库:根据c_reception_id从t_car_apply表删除记录 |
结束 |
(2)配置脚本部件:“接收id”
点击该部件,在右侧的部件配置面板上填写输入参数和输出参数。
(3)配置执行部件:“删除接待单”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
DELETE FROM t_reception WHERE c_id = ${id};
(3)配置执行部件:“删除人员”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
DELETE FROM t_reception_ry WHERE c_reception_id = ${id};
(4)配置执行部件:“删除用车信息”
点击该部件,在右侧的部件配置面板上填写输入参数。
先选择数据源“test”,再在[SQL语句]输入如下:
Google
DELETE FROM t_car_apply WHERE c_reception_id = ${id};