Skip to content
本页目录

主从表增删改查

1 案例需求

  • 实现会议接待单的增删改查,会议接待单包括基本信息、来宾人员、陪同人员和用车信息。会议接待单数据存储在t_reception表,人员信息的数据存储在t_reception_ry表(该表的c_reception_id关联到t_reception的主键),用车信息的数据存储在t_car_apply表(该表的c_reception_id关联到t_reception的主键)。

  • 新增会议接待单后可以保存或提交审批。(审批流转相关的服务配置放在后续的学习文档中讲述)

案例页面如下:

image

(说明:列表上的“主要来宾”取会议接待单上“来宾名单”的首位人员)

image

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

接口名称接口功能相关表
分页列表根据查询条件返回会议接待单数据,用于在列表分页展示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配置>-<数据源配置>中完成数据源的配置。

image

image

3 服务配置

3.1 分页列表

(1)添加接口

首先在目录下添加一个“分页列表”接口(GET方法)。

(2)添加服务部件

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

image

各部件说明如下:

部件类型备注文字任务说明
开始
脚本接收参数从前端页面获取输入参数
查询查询使用SOL查询数据库
结束

(3)配置脚本部件:接收参数

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

image

输入参数的脚本如下,它包括了查询条件、分页列表需要的分页条数和当前页。

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;

接下来定义输出参数并将输入参数的值赋给它。

image

(4)配置查询部件:“查询”

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

image

先选择数据源“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)添加服务部件

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

image

其中有两个事务部件,一个事务部件内包含了与新增操作相关的部件,另一个事务包含了与修改操作相关的部件。

另外还有三个网关,第一个网关用于判断是表单操作是修改还是新增(修改分支的条件表达式输入: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)配置脚本部件:“接收接待表参数”

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

image

输入参数的脚本如下。

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;

接着定义输出参数并将输入参数的值赋给它。

image

(4)配置脚本部件:“接收用车表参数”

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

image

输入参数的脚本如下。

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;

接着定义输出参数并将输入参数的值赋给它。

image

(5)配置JSON解析部件:“处理人员明细数据”

因为从前端获取的人员明细数据是一个JSON字符串,需要在此转换为数组后再在后续的数据库操作中使用。

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

image

接下来配置修改事务内部的部件:

(6)配置执行部件:“修改接待单”

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

image

先选择数据源“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)配置执行部件:“删除人员明细”

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

image

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

Google
DELETE FROM t_reception_ry WHERE c_reception_id = ${id}

(8)配置执行部件:“新增人员明细”

点击该部件,在右侧的部件配置面板上勾选[循环执行此任务],并在[循环数据集]输入“ryData”,这个“ryData”就是前面的JSON解析部件输出的参数。

image

接着选择数据源“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)配置执行部件:“删除用车信息”

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

image

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

Google
DELETE FROM t_car_apply WHERE c_reception_id = ${id}

(10)配置执行部件:“新增用车信息”

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

image

先选择数据源“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)配置执行部件:“新增接待单”

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

image

先选择数据源“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”

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

image

输入参数的脚本如下,用于从receptionList中取到新增记录的主键c_id。

Google
map=seq.get(receptionList,0);
rId=map.c_id;

接着在[自定义出参]添加输出参数rId并赋值(即新增记录的主键c_id)。

(13)配置执行部件:“新增人员明细”

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

image

接着填写输入参数,先选择数据源“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)配置执行部件:“新增用车信息”

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

image

先选择数据源“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)配置脚本部件:“输出调试结果”

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

该部件仅用于服务调试时输出提示文本,删除此部件并不影响服务接口的功能。

image

3.3 获取单条数据

(1)添加接口

首先在目录下添加一个“获取单条数据”接口(GET方法)。

(2)添加服务部件

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

image

其中网关用于判断是否在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

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

image

(4)配置查询部件:“查询接待单”

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

image

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

Google
select * from t_reception where c_id = ${id}

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

(5)配置查询部件:“查询用车信息”

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

image

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

Google
select * from t_car_apply where c_reception_id = ${id}

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

(6)配置查询部件:“查询人员明细”

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

image

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

Google
select * from t_reception_ry where c_reception_id = ${id}

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

(7)配置脚本部件:组装数据

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

image

其中输入参数的脚本如下:

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)添加服务部件

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

image

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”

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

image

(3)配置执行部件:“删除接待单”

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

image

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

Google
DELETE FROM t_reception WHERE c_id = ${id};

(3)配置执行部件:“删除人员”

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

image

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

Google
DELETE FROM t_reception_ry WHERE c_reception_id = ${id};

(4)配置执行部件:“删除用车信息”

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

image

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

Google
DELETE FROM t_car_apply WHERE c_reception_id = ${id};

内部资料,请勿外传