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

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

js
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 语句]输入如下:

sql
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

输入参数的脚本如下。

js
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

输入参数的脚本如下。

js
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 语句]输入如下:

sql
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 语句]输入如下:

sql
DELETE FROM t_reception_ry WHERE c_reception_id = ${id}

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

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

image

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

sql
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 语句]输入如下:

sql
DELETE FROM t_car_apply WHERE c_reception_id = ${id}

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

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

image

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

sql
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 语句]输入如下:

sql
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。

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

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

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

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

image

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

sql
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 语句]输入如下:

sql
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 语句]输入如下:

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

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

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

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

image

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

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

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

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

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

image

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

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

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

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

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

image

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

js
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 语句]输入如下:

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

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

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

image

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

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

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

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

image

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

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

内部资料,请勿外传