审批流程设计画布
审批流程设计画布定义审批怎么开始、怎么流转:记录触发方式、审批规则、数据变更、人工任务、条件路由、服务调用、消息通知、外部回调和结束路径。
进入 审批流程管理,在目标流程上点击 打开审批流程设计画布。
画布上的内容分成四部分:
| 部分 | 位置 | 负责 |
|---|---|---|
| 顶部操作 | 画布顶部 | 返回、触发方式、复制、保存、发布、保存并发布,以及当前版本 |
| 节点库 | 左侧 | 添加审批、数据处理、人工处理、条件、消息、服务调用和等待回调节点 |
| 画布 | 中间 | 编排节点并连接处理路径 |
| 配置面板 | 右侧 | 编辑当前节点、连线或触发方式 |
一、顶部操作
| 操作 | 说明 |
|---|---|
| 返回 | 返回审批流程管理;存在未保存修改时会要求确认 |
| 当前版本 | 展示设计器当前加载的版本 |
| 触发方式 | 在未选择节点的状态下打开流程触发配置 |
| 复制 | 校验当前画布,并据此创建一条独立的草稿审批流程 |
| 保存 | 使用当前画布创建新的草稿版本 |
| 保存并发布 | 创建并立即发布新版本 |
| 发布 | 当前没有未保存修改时,发布选中的已保存草稿或归档版本 |
二、触发方式
保存审批流程前,必须至少启用一种触发方式。
| 触发方式 | 行为 |
|---|---|
| 新建时触发 | 关联表单新增记录时启动流程 |
| 编辑时触发 | 关联表单记录被编辑时启动流程 |
| 删除时触发 | 关联表单记录被删除时启动流程 |
| 表单按钮触发 | 对关联表单记录点击指定自定义按钮时启动流程 |
编辑触发支持三种模式:
| 模式 | 行为 |
|---|---|
| 每次编辑都触发 | 每次编辑都可以启动审批流程 |
| 仅指定字段变更时触发 | 至少一个监听字段发生变化时启动;必须选择至少一个字段 |
| 仅满足条件时触发 | 关联表单数据满足配置的条件时启动 |
表单按钮触发
需要把审批作为明确的业务操作时,可以使用按钮触发,例如“提交合同”“申请复核”或“申请发布”。
- 打开审批流程关联表单的按钮设计,新建并启用一个自定义按钮。
- 按钮位置选择 查看页-顶部、列表页-行内操作、列表页-批量操作、查看页列表-行内操作 或 查看页列表-批量操作。适用页面由按钮位置决定:查看页位置使用 查看页,列表页位置使用 列表页。
- 返回审批流程设计画布,打开 触发方式。
- 启用 表单按钮触发,选择自定义按钮,然后保存并发布审批流程。
- 在按钮配置的位置点击按钮;批量操作前先勾选需要提交的记录。
按钮位置决定本次提交审批的记录:
| 按钮位置 | 审批对象 |
|---|---|
| 查看页-顶部 | 查看页当前记录 |
| 查看页列表-行内操作 | 查看页列表中按钮所在行的记录 |
| 查看页列表-批量操作 | 仅本次在查看页列表中勾选的记录 |
| 列表页-行内操作 | 列表页中按钮所在行的记录 |
| 列表页-批量操作 | 仅本次在列表页中勾选的记录 |
查看页列表包括查看页中的从表列表和关联表单列表。该位置的按钮属于列表对应的表单,因此会启动为该表单发布的审批流程;审批对象是按钮所在行或本次勾选的列表记录,不是查看页主记录。批量触发时,每条满足触发条件的选中记录都会创建独立的审批提交和审批实例。
按钮选择器只显示已启用、位置与适用页面有效的自定义按钮。选中的按钮被删除、停用,或改到不兼容的位置/适用页面后,必须重新选择有效按钮,流程才能保存或发布。
重复打开触发方式面板时,同一关联表单的自定义按钮列表会复用已加载的数据。
按钮触发会记录实际点击按钮的成员。启用按钮触发后,后续节点可以使用 变量 → 按钮点击人;关闭按钮触发会清除画布中已经选择的该变量,其他人员和字段配置保留。
按钮审批由后端提交。同一次点击还匹配按钮自动化时,审批提交、自动化执行及其后台执行指令会在同一个事务中写入;任一选中记录未通过提交校验,本次点击不会提交其中任何流程。提交成功后由后台继续运行,关闭页面不会中断。自动化会独立开始,不会等待审批结果。
三、节点库
| 节点 | 用途 |
|---|---|
| 开始 | 审批流程入口;画布只能保留一个开始节点 |
| 审批 | 为一个或多个审批人创建审批任务 |
| 数据处理 | 新建记录,或更新当前记录及其关联数据 |
| 人工处理 | 由指定处理人完成表单数据任务 |
| 分支 | 将数据路由到满足和不满足路径 |
| 服务调用 | 执行 Studio 脚本或已发布的服务调用型 OpenLink 集成流 |
| 消息 | 通过审批中心消息通道发送通知 |
| 等待回调 | 暂停流程,直到外部回调与当前审批实例完成关联 |
| 结束 | 标记正常结束点;画布只能保留一个结束节点 |
画布需要保留一个开始节点和一个结束节点;消息节点可以作为通知终点不再连出。
四、节点配置
审批节点
审批节点用于配置任务分配和决策规则。
| 配置 | 说明 |
|---|---|
| 审批人 | 从审批人目录中选择成员或其他可用主体,至少配置一位 |
| 审批人可用性策略 | 审批人无法解析时,可以阻塞流程,或转交给兜底审批人 |
| 兜底审批人 | 选择异常转交策略时必填 |
| 审批模式 | 并行审批会同时创建任务;串行审批会按审批人顺序处理 |
| 串行审批顺序 | 仅串行审批使用;拖拽调整审批顺序,由表单字段解析出的审批人排在固定成员之后 |
| 审批策略 | 并行模式支持任意一人、全部人或至少 N 人通过;串行模式要求所有人依次通过 |
| 允许同意 | 允许审批人同意当前实例 |
| 允许拒绝 | 允许审批人拒绝当前实例 |
| 允许退回 | 允许审批人退回当前实例 |
| 允许撤回 | 允许发起人在流程等待当前审批步骤时撤回 |
| 审批意见 | 控制同意、拒绝或退回时是否必须填写意见 |
| 处理时限 | 使用分钟、小时或天配置任务截止时间,需要配合 审批中心 > 超时策略 中已启用的策略才会生效 |
审批节点只能有一条继续流转的出口,且该出口必须是「同意」结果。拒绝和退回会用对应结果直接结束当前审批实例。
按钮触发时,主审批人和兜底审批人的 配置人员 弹窗中可从 变量 选择 按钮点击人;没有可选成员字段时不显示 数据字段 分类。
数据处理节点
数据处理节点在流程运行过程中写入表单数据。
| 配置 | 说明 |
|---|---|
| 操作类型 | 数据新增 新建一条记录;数据更新 更新当前关联表单记录及其关联数据 |
| 目标表单 | 数据新增 时必填;只能选择已启用的表单,字段赋值列表跟随所选表单 |
| 新增后提交审批 | 新建记录后同时发起该记录的表单审批 |
| 字段赋值 | 节点要写入的字段;每条赋值选择一个字段和一个取值来源:指定值、空值、触发记录字段,或上游节点的输出;必填字段会自动加入,不能删除 |
数据新增必须赋值 创建人,数据更新必须赋值 更新人;数据更新时不能赋值创建人。
按钮触发时,字段赋值的 触发源 可以选择 按钮点击人,写入点击成员的 ID。
人工处理节点
人工处理节点会先给指定处理人创建表单数据任务,处理完成后再继续流程。
| 配置 | 说明 |
|---|---|
| 办理人 | 必填;可以选择固定成员、由关联表单字段解析出的办理人,或按钮触发时的按钮点击人 |
| 处理对象 | 处理人要做的事情:编辑当前数据、创建新数据、编辑关联表单数据,或选择已有数据并关联 |
| 目标表单 | 创建新数据、编辑关联表单数据、选择已有数据并关联时必填 |
| 是否必填 | 要求处理人必须创建该数据 |
| 关联字段 | 编辑关联表单数据或选择已有数据并关联时必填,用于把当前记录和目标表单关联起来 |
| 待处理字段 | 需要处理人填写的字段;编辑当前数据和编辑关联表单数据时必填 |
| 创建数据默认值 | 处理人创建数据时使用的默认值 |
| 提交后触发表单审批 | 节点创建数据或编辑关联表单数据时可用 |
按钮触发时,办理人的 配置人员 弹窗在 变量 分类中显示 按钮点击人;没有可选的成员字段时不显示 数据字段 分类。
分支节点
分支节点读取关联表单字段,并通过两个必需出口路由流程:满足(Y) 和 不满足(N)。
条件支持嵌套 AND/OR 条件组,以及等于、不等于、包含、比较、包含于、为空和不为空等操作符。比较值编辑器会根据字段类型变化。
分支节点必须至少包含一条有效条件,并且满足和不满足出口都只能连接一条路径。如果上游已经经过等待回调节点,后续分支还可以使用回调结果进行判断。
服务调用节点
服务调用节点用于在审批运行过程中执行内部能力或调用外部系统,按目标类型选择模式:
| 模式 | 要求 |
|---|---|
| Studio 脚本 | 调用租户能力,例如 context.form.*、context.http.*;脚本必须已存在于当前空间并处于发布状态才能被选中 |
| 集成流 | 选择已发布、触发方式为服务调用、且本地表单与审批流程关联表单一致的入站或出站 OpenLink 流程 |
配置 Studio 脚本调用
- 先在 Soln Studio 中创建脚本并发布;审批节点只能选择已发布的资产
- 在画布上添加 服务调用 节点,模式选择 Studio 脚本
- 选择脚本资产和入口文件
- 看配置面板里的执行载荷预览,确认脚本读取的每个字段 API 名称都存在于
record.data - 连接一条连入线和一条连出线,保存并发布流程
配置集成流调用
- 在 OpenLink 中创建入站或出站流,触发方式设为 服务调用,并绑定与审批流程相同的本地表单
- 保存、发布并启用该流
- 在画布上添加 服务调用 节点,模式选择 集成流
- 选择已发布的流;选择器只会列出已发布、触发方式为服务调用、且关联表单一致的流
- 连接一条连入线和一条连出线,保存并发布流程
被调用目标收到什么
节点会把同一份 soln.runtime-context/v1 上下文交给 Studio 脚本和 OpenLink 流,配置面板里可以复制当前流程的预览。
| 字段 | 用途 |
|---|---|
record.id | 本次审批关联的记录 |
record.data | 节点运行时的关联表单字段值,按字段 API 名称取值 |
form.apiName | 关联表单的 API 名称 |
source.instanceId、source.nodeKey | 当前审批实例和节点 |
source.trigger | 启动审批的记录动作和变更字段 |
source.callback | 上游等待回调完成后的最新回调结果 |
runtime.traceId | 该节点执行的稳定追踪 ID,可作为外部请求的幂等键 |
运行规则
| 结果 | 效果 |
|---|---|
| 脚本或流执行成功 | 节点通过,流程沿连出线继续 |
脚本返回失败(ok: false、success: false,或 status 为 failed、failure、error、rejected)、抛异常,或入口文件不可用 | 节点阻塞,实例停在该节点 |
| 流执行失败 | 同样阻塞;修好原因后重试,重试会重新执行同一个实例和节点 |
服务调用节点必须有一条连入线和一条连出线。未选择脚本或集成流时不能保存和发布。
常见问题
| 现象 | 检查方向 |
|---|---|
| 选择器里找不到脚本或流 | 资产必须已发布;流必须使用服务调用触发方式,且本地表单与流程关联表单一致 |
| 发布后节点就阻塞 | 看执行日志:脚本报错、返回失败值、流执行失败都会阻塞节点 |
| 脚本读不到字段 | 字段 API 名称要与预览一致;record.data 是节点运行时的快照 |
| 外部调用重复执行 | 用 runtime.traceId 作为外部请求的幂等键 |
消息节点
消息节点使用 审批中心 消息通道,并选择一条已启用且支持站内信的消息模板。发送方式固定为 站内消息,消息通道固定为审批中心。
接收人来源包括:
- 流程上下文:发起人、提交人或当前审批人
- 固定成员
- 关联表单中兼容的接收人字段
- 按钮触发时的 变量 → 按钮点击人
消息节点必须配置消息模板和完整接收目标。消息发送后可以继续连接其他节点,也可以不再连出,作为通知终点。
接收人的 配置人员 弹窗没有可选成员字段时会隐藏 数据字段 分类。消息模板输入映射也可读取 source.trigger.buttonClickerId。
等待回调节点
外部系统先受理任务、稍后才返回结果时使用等待回调节点:流程先把外部任务发出去,等待回调到达后再继续。
服务调用 → 等待回调 → 后续节点
服务调用和等待回调之间不能插入条件、消息或审批节点。
准备回调流
- 在 OpenLink 中创建 入站 流,触发方式设为 Webhook
- 绑定与审批流程相同的本地表单
- 目标动作设为 完成工作流回调
- 保存、发布并启用该流
- 复制该流暴露的 Webhook 地址,等待回调节点展示的是同一个地址
服务调用型流程不能作为回调入口使用。
配置节点
- 把 等待回调 直接连接在发起外部任务的服务调用节点之后
- 选择已发布的入站 Webhook 流
- 配置关联键模板,默认值为
{{data.record.id}} - 把渲染后的关联键交给外部系统,并要求它原样回传
- 连接一条连出线,保存并发布流程
关联键必须能在同一租户和同一个回调流里唯一定位一个等待中的回调。同一条记录可能同时存在多个等待中的审批时,关联键要带上审批实例或外部任务标识,而不是只用记录 ID。
外部系统要发送什么
外部系统把回调 POST 到面板展示的 Webhook 地址:
{
"callbackId": "review-result-8f1d31",
"correlationKey": "record-7c831b",
"status": "succeeded",
"result": { "decision": "approved", "comment": "Risk review passed" },
"error": null,
"completedAt": "2026-09-10T08:30:00.000Z"
}
| 字段 | 必填 | 说明 |
|---|---|---|
callbackId | 是 | 外部系统为本次回调生成的唯一标识 |
correlationKey | 是 | 必须与渲染出的关联键完全一致 |
status | 是 | 审批回调必须是 succeeded,不接受 failed 或 canceled |
result | 是 | 回调结果对象 |
result.decision | 否 | approved、rejected 或 returned,决定流程怎么继续 |
error | 是 | 成功时必须为 null |
completedAt | 否 | ISO 时间或 null |
匹配成功的回调会完成等待节点并恢复审批实例。外部任务失败时,要么保留它以便重试,要么在成功的回调里用 result 带回一个可路由的业务结果。
按回调结果分支
在等待回调之后放一个分支节点,用 回调结果 字段按 approved/rejected/returned 分支。该字段只有在分支节点的上游经过等待回调时才可用;后续的服务调用、消息节点也可以从 source.callback 读取最近一次回调结果。
常见问题
| 现象 | 检查方向 |
|---|---|
| 实例一直停在等待节点 | 外部系统必须向 Webhook 地址发送完全一致的 correlationKey;回调流必须已发布并启用 |
报 WORKFLOW_CALLBACK_WAIT_NOT_FOUND | 关联键在当前租户和该回调流里没有对应的等待,或模板渲染出来的值和发给外部的值不一致 |
报 WORKFLOW_CALLBACK_WAIT_NOT_UNIQUE | 多个等待共用了同一个关联键,需要在关联键里带上审批实例或外部任务标识 |
| 回调被拒绝 | status 必须为 succeeded、error 必须为 null,且回调要对应一个审批等待 |
| 分支节点里没有「回调结果」字段 | 该分支节点的上游没有经过等待回调节点 |
完整的载荷结构、回调协议和脚本示例见工作流集成。
五、校验、保存与发布
画布校验
复制、保存或发布前,画布必须通过校验。主要规则包括:
- 只能有一个开始节点和一个结束节点
- 至少启用新建、编辑、删除或表单按钮触发中的一种
- 启用表单按钮触发时,必须选择关联表单中已启用且位置、适用页面有效的自定义按钮
- 开始节点不能有连入线,并且必须只有一条连出线
- 除开始节点外,所有节点都必须从开始节点可达
- 除开始节点外,每个节点只能有一条连入线
- 审批、数据处理、人工处理、条件、服务调用和等待回调节点必须有一条连出线,并且要从另一个方位连出
- 审批节点只能有一条连出线,且必须是「同意」结果
- 每个条件至少有一条规则,并具备完整的满足和不满足路径
- 数据处理节点必须配置操作类型、数据新增时的目标表单、至少一条字段赋值,以及必填的创建人或更新人
- 人工处理节点必须配置办理人、处理对象、对应的目标表单和关联字段,以及编辑数据时的待处理字段
- 等待回调必须直接位于服务调用之后
- 消息模板、接收人、脚本、集成流和关联键必须完整
- 每条路径都能到达结束节点或作为终点的消息节点
保存与发布
| 操作 | 说明 |
|---|---|
| 保存 | 使用当前画布创建新的草稿版本 |
| 保存并发布 | 创建并立即发布新版本 |
| 发布 | 当前没有未保存修改时,发布选中的已保存草稿或归档版本 |
发布后流程才有可运行的版本,流程状态在 审批流程管理 里维护。
复制当前审批流程
点击顶部 复制,可以使用当前通过校验的流程图和触发配置新建审批流程。复制弹窗只需要填写新名称和可选描述;系统会生成新编码,并继续使用来源流程的关联表单。
当前尚未保存但已通过校验的修改也会复制。新流程是独立草稿,不会复制发布状态、审批实例、审批任务和执行日志。
六、推荐设计顺序
- 配置新建、编辑、删除或表单按钮触发方式
- 添加审批节点,并设置审批人、可用性策略、审批策略、允许动作和处理时限
- 需要新建或更新表单数据时添加数据处理节点
- 需要人工填写表单数据时添加人工处理节点
- 需要按数据路由时添加分支节点
- 需要调用脚本或集成流时添加服务调用节点
- 只有外部异步结果需要返回后再继续时,才添加等待回调
- 需要通知时添加消息节点
- 连接所有必需路径,并处理配置面板中的校验提示
- 保存草稿,或在确认无误后保存并发布
- 使用关联表单记录或配置的表单按钮测试,并查看执行日志