后处理脚本与计算字段
SQL 与 API 数据集的「后处理脚本」(查询后用脚本处理结果集)和「计算字段」(按行表达式,最多 10 个)。
概述
数据集查询得到结果后,可以再做两类加工:
| 能力 | 作用 | 适用类型 |
|---|---|---|
| 后处理脚本 | 对整个结果集做过滤、排序、改写 | SQL、API |
| 计算字段 | 按行增加新字段 | SQL、API、内置、派生、运行时注入 |
平台没有独立的「脚本数据集」类型;脚本能力由这两项、派生数据集的「脚本处理生成」(见 派生数据集)以及 SQL 中的 #{}、${} 承担。执行顺序是:查询,后处理脚本,计算字段,之后才是报表中的过滤。
功能入口
「编辑数据集」或「编辑API数据集」对话框中的「后处理脚本」「计算字段」标签页。
操作步骤
后处理脚本
- 打开「后处理脚本」标签页。
- 编写脚本。
$$data是原始结果(List<Map>),$参数名是报表参数。 - 脚本必须
return处理后的列表。 - 点击「数据预览」验证,预览会依次应用后处理脚本和计算字段。
计算字段
- 打开「计算字段」标签页,点击「添加计算字段」,填写字段名、类型、表达式。
- 点击「校验」检查表达式,「校验全部」检查全部。
- 每个字段可「编辑」「删除」。
属性说明
后处理脚本约定
| 项 | 说明 |
|---|---|
$$data |
原始结果,List<Map> |
$参数名 |
报表参数 |
| 返回值 | 必须是 List<Map>;返回其他类型会被忽略 |
| 超时 | 配置项 script.postScript.timeoutSeconds,默认 30 秒 |
计算字段
| 属性 | 说明 | 取值 |
|---|---|---|
| 数量 | 每个数据集最多 10 个,超过时提示「最多添加 10 个计算字段」 | 上限 10 |
| 字段名 | 新字段名 | 文本 |
| 类型 | 字段类型 | 字符串、数值、整数、浮点数、日期、日期时间、布尔 |
| 表达式 | 当前行字段写作 $$record['字段名'],报表参数写作 $参数名 |
受限表达式 |
表达式中只允许下列函数(括号内为参数个数):
| 类别 | 函数 |
|---|---|
| 数值 | round(1-2)、ceil(1)、floor(1)、abs(1)、min(2 个以上)、max(2 个以上)、formatNumber(2) |
| 空值 | ifNull(2)、ifEmpty(2)、coalesce(2 个以上) |
| 文本 | concat(1 个以上)、upper、lower、trim、substring(2-3)、replace(3)、left(2)、right(2)、length |
| 日期 | formatDate(1-3)、formatDateTime(1)、year、month、day |
示例
后处理脚本:只保留费用大于 0 的记录,并按费用降序(假设结果含 fee 字段):
return $$data.filter(item => item.fee > 0).sort((a, b) => b.fee - a.fee);
计算字段:门诊费用含税价,fee 为数据集字段,rate 为报表参数:
round($$record['fee'] * (1 + $rate), 2)
姓名为空时显示占位:
ifNull($$record['patient_name'], '未登记')
注意事项
注意:脚本返回的不是
List<Map>时结果被忽略,看起来就像脚本没有生效,遇到这种情况先检查返回值。
提示:能在 SQL 里完成的过滤和计算,优先写在 SQL 中,由数据库完成。脚本只用于 SQL 难以表达的逻辑。