文档导航
工作流基础:表单背后的自动化
表单的四个执行点位、节点与流程怎么搭、内置函数与表达式语言要注意什么。
最后更新 2026年9月24日
一句话
工作流就是挂在表单上的「自动做什么」:在提交前、保存前、保存后这些点位里,按顺序跑一串节点。
在哪打开
在表单编辑器顶部切到「工作流」标签。它上面一排是「执行点位」标签:提交前校验 / 保存前 / 保存后 / 保存后(异步)。
主要动作
- 选执行点位:点某个点位标签→ 结果:切到该点位的图;限制(切换会重置画布上的钻取和选中状态)。
- 添加节点:工具条点「添加节点」,再选类型→ 结果:节点加入画布。
- 改节点:画布提示「拖拽横向重排;双击容器进入;单击节点编辑。」→ 结果:右栏出现该节点的属性表单,改完即时生效。
- 测试运行:工具条点「测试运行」→ 结果:返回输入、输出和日志;限制(走的是沙箱引擎,只在服务端可用的函数在沙箱里跑不了,所以测试通过不等于线上可用;定义里有错误时这个按钮是禁用的)。
- 调运行设置:工具条点「设置」→ 改「超时(秒)」「最大深度」「最大循环」「启用日志」。
- 自定义函数:工具条点「函数」,在这份定义里声明只有它自己能用到的函数。
- 保存:点右下角的「保存」。
字段 / 状态说明
| 名称 | 含义 | 什么时候用 |
|---|---|---|
| 执行点位 | 提交前校验 / 保存前 / 保存后 / 保存后(异步) | 「提交前校验」是唯一能在提交前拦住人的点位 |
| 节点类型 | 赋值 / 函数调用 / 条件 / 循环 / 并行 / 子流程 / 返回,循环体里另有跳出 / 继续 | 按要表达的逻辑选 |
| 循环变量 | 元素变量默认叫 item,序号变量恒为 item_index | 循环里引用当前元素 |
| 问题面板 | 分成「错误」和「警告」,有错误时不能测试运行 | 保存前先看一眼 |
| 超时 / 最大深度 / 最大循环 | 这张定义的运行限制 | 防止跑飞 |
与其它功能的关系
- 函数目录来自后端的函数注册表,客户端不自己复制一份清单。
- 表达式输入框带一个可折叠的辅助面板,分「表单字段 / 元数据 / 变量 / 函数 / 运算符 / 字面量」,点一下就插入。
- 刷 CDN、校验支付这类能力本身就是工作流函数:
refreshCdn、checkPayment都标了只在服务端可用。
限制与注意
- 内置函数一律是裸的小驼峰写法(
refreshCdn,不是cdn.refresh),分组只是目录里的元数据,不靠函数名前缀。 - 表达式里环境变量优先于内置函数名:同名变量会把内置函数「抢走」,调用时就报不可调用。
- 有 15 个数组与谓词内置函数是解析器硬编码的、覆盖不掉:all / any / one / none / filter / map / count / sum / find / findIndex / findLast / findLastIndex / groupBy / sortBy / reduce。
- 表达式语言没有位运算符,位运算只能用函数:bitand / bitor / bitxor / bitnot / bitshl / bitshr / bitnand / bitushr。
- 一批函数标了「只在服务端执行」(如 httpGet、findRows、refreshCdn、checkPayment),试运行时它们跑不了、发布后才正常。
- 工作流的输出只会被折进提交数据当展示用;想真正拒绝一次提交,得靠服务端函数(如
checkPayment)。
常见问题
Q:工作流和侧边栏里的「Loop」是一回事吗? A:不是。工作流挂在表单上、由表单提交触发;Loop 是 Agent,在侧边栏「Agent」组里单独运行。
Q:测试运行通过了,线上就一定对吗? A:不一定。测试走沙箱,只在服务端可用的函数在沙箱里没有绑定。
Q:为什么我调用的函数报未定义? A:先确认名字是裸小驼峰、且没有跟内置函数重名——表达式里同名变量会遮蔽内置函数。
Q:怎么让不满足条件的提交被拦住? A:用「提交前校验」点位;注意工作流的输出拦不住提交,要拦截得用服务端函数。