Skip to content

流程自动化 ​

流程自动化按实例事件可靠登记动作链,执行流程发起、消息、Webhook 和字段回写。按 Cron 创建申请见定时发起。

规则配置 ​

页面入口为 工作流引擎 → 流程管理 → 流程自动化。自动化规则绑定某个流程定义,在实例创建或结束时执行动作。

新增规则的「所属流程」可选择所有已发布流程,包括业务系统主导(external)流程。 「发起流程」动作的目标仅可选择已发布且非 external 的流程;业务系统主导流程必须由对应业务模块发起。

流程定义的查询按用途区分:GET /api/workflows/definitions/published 只返回当前用户可发起的普通流程; GET /api/workflows/definitions/all 返回租户范围内的轻量选项(ID、名称、状态、表单类型),供监控筛选、关联审批单和业务绑定使用,包含业务系统主导和历史状态。 填报模板绑定在轻量选项中选择已发布的 external 流程。待我审批使用 GET /api/workflows/instances/pending-mine/definitions, 按当前用户的运行中待办生成去重选项,与待办列表共用归属和租户条件,不要求发起或流程定义管理权限。

触发时机 ​

触发器说明
created实例创建
approved实例通过
rejected实例驳回
withdrawn实例撤回

同一流程同一触发器下,规则按 sort、id 升序排列,规则内按动作顺序执行首次尝试。每个动作使用独立的 automation_action 作业,统一落在 workflow_jobs;尝试明细和已提交步骤分别落在 workflow_job_executions、workflow_job_effects。

event_dispatch 为匹配规则可靠登记动作链,入队失败会使事件作业重试;自动化并非进程内 best-effort 订阅者。规则配置、动作顺序、实例快照和初始表单输入在事件派发建立动作链时冻结,后来修改或删除规则不会改变已排队的动作。重复投递同一事件不会建立第二条动作链。某个动作首次尝试结束后,后继动作独立入队;字段回写成功时,后继输入包含该次回写结果。首次尝试失败也会继续后继,本动作按统一退避重试,后继不会随它再次执行。

首次结束回执与后继入队在同一事务提交。worker 在这之前中断时,账本租约回收会补登记后继;回执存在时不重复登记。明确取消作业会停止其未登记的后继,不按失败自动继续。

动作类型 ​

动作说明
startWorkflow发起另一个流程,可用模板生成标题和表单数据
sendMessage发送站内信给发起人或指定用户
webhook发起 HTTP 请求
updateField回写当前实例 formData 字段

模板变量 ​

自动化动作支持 {{var}} 占位符:

变量说明
{{system.instanceId}}当前实例 ID;短名 {{instanceId}} 含义相同
{{system.title}}当前实例标题;短名 {{title}} 含义相同
{{system.status}}当前实例状态;短名 {{status}} 含义相同
{{system.initiator}}发起人显示名;短名 {{initiator}} 含义相同
{{system.initiatorId}}发起人用户 ID;短名 {{initiatorId}} 含义相同
{{formData.amount}}表单字段 amount
{{formData.vendor.contact.name}}表单对象的自有属性点路径;数组项可使用数字段如 {{formData.items.0.name}}

表单字段使用 formData 命名空间。系统命名空间及五个明确短名不会被同名业务字段覆盖,例如表单自身的 title 通过 {{formData.title}} 读取。缺失变量、非法路径或不完整占位符明确失败。模板只读取自有数据属性,不调用 getter、读取原型链或执行表达式。

字段映射和字段回写中,完整变量引用保留数值、布尔、null、数组、对象和日期范围的原始类型,并复制对象值;嵌入普通文字时才转换成文本。静态字串仍为字串。例如金额 "{{formData.amount}}" 保留数值、人员 "{{formData.reviewers}}" 保留 ID 数组,而 "来自 {{system.title}}" 是普通文本。

Webhook 的请求体模板可以使用 JSON 或纯文本。JSON 先解析,再渲染各个字符串节点:完整变量字符串替换为原类型,嵌入文本仍为字符串,因此字段内容的引号和换行不会破坏 JSON,人员数组也不会变成 JSON 字符串。JSON 中占位符必须作为字符串节点编写,例如 {"amount":"{{formData.amount}}","reviewers":"{{formData.reviewers}}"};未加引号的占位符不是合法 JSON,会明确报错。整个请求体也可引用 {{formData.payload}}。JSON 请求体使用 application/json,非 JSON 纯文本保持文本。

URL 使用同一变量解析器,并继续对替换值做百分号编码,表单值不能改变 URL 的路径层级或追加查询参数。请求头的值、消息标题 / 正文和按钮文本使用文本渲染;按钮 URL 同样编码。引用值中自带的模板文字作为普通数据,不进行第二次执行。模板语法在 Server 与 Demo 使用同一 Shared 边界检查,冻结输入中缺少的变量在动作执行时明确留痕。

执行记录与恢复 ​

GET /api/workflows/automations/runs 直接读取动作作业及最近执行尝试,可按规则、来源实例和真实作业状态筛选。每行 ID 即动作作业 ID,显示 pending / running / paused / succeeded / failed / dead / canceled、尝试次数、最大次数、下一次重试时间和错误。pending 且已有失败尝试表示正在等待自动重试,不提供竞争性的手动重试。历史尝试保留在流程监控的对应作业详情中。

发起流程的动作还返回 targetInstanceId / targetTitle,执行记录可直接打开目标审批详情,查看映射后的字段、审批人和实际业务状态。动作“成功创建”与目标审批的通过 / 拒绝是不同结果;目标被拒绝不改写创建动作的成功状态。

每个动作的总尝试上限为 5 次,耗尽后进入死信。具有流程定义编辑权限的管理员可在执行记录中独立重试,或调用 POST /api/workflows/automations/runs/{id}/retry;重试仍使用该次冻结配置和输入,已经成功的动作不会再运行。该接口核对租户和动作作业类型,拒绝成功、执行中、等待自动重试及已取消的动作。

内部发起流程、字段回写和通知入队通过事务步骤回执与业务写入一起提交,重试复用已提交结果。Webhook 使用稳定的幂等请求键;明确收到成功响应后保存成功回执,后续账本完成重试不会再发送。外部写入超时、连接中断或租约过期时可能已经在下游生效,统一账本将其收敛为“外部操作结果待确认”,不自动重发,自动化页面也拒绝直接重发。作业恢复与外部结果确认见作业执行与恢复。管理员应先核对下游结果,再使用流程监控的显式运维恢复路径;幂等键不能代替下游结果核对。

API 摘要 ​

能力路径
自动化规则GET/POST /api/workflows/automations、GET/PUT/DELETE /api/workflows/automations/{id}、POST /api/workflows/automations/batch-delete
自动化运行记录GET /api/workflows/automations/runs

与事件订阅的区别 ​

能力触发粒度执行动作
节点监听器单个节点节点级 Webhook
事件订阅标准事件流外部 Webhook 投递
流程自动化实例创建/结束内部发起流程、站内信、Webhook、回写字段
定时发起Cron 时间按周期创建流程实例

Built with VitePress for local documentation preview.