Skip to content

实例生命周期

流程实例是用户基于已发布流程定义发起的一次申请。实例保存发起时的定义快照、表单快照、业务编号、表单数据、当前节点、任务、执行 Token 和业务关联。

状态流转

状态说明
draft已保存但未进入流转
running正在执行
suspended管理员挂起:待办不可处理,SLA 超时与延迟计时冻结,恢复后按剩余时长续跑
returned已退回:驳回策略为「退回发起人」时进入,发起人修改表单后在同一实例上重新提交,保留审计历史与业务编号
approved已通过
rejected已驳回
withdrawn已撤回
cancelled已取消

发起与草稿

用户在「发起工作台」选择已发布且有权限发起的流程,填写表单并提交。也可以保存草稿,再到「我的申请」继续编辑和提交。整页发起深链 /workflow/launch/:definitionId 与发起工作台同源读取「已发布定义」,普通发起人可直接收藏或分享该链接。

发起时系统会:

  1. 校验流程定义状态与发起人范围。
  2. 冻结定义快照和表单快照。
  3. 写入实例标题、优先级、表单数据、发起时抄送人和业务编号。
  4. 进入 running 后创建首批执行 Token 与任务。
  5. 入队 event_dispatch 作业,分发 instance.createdtask.createdtask.assigned 等事件。

审批表单中的附件、图片字段统一通过 POST /api/workflows/attachments 上传,按工作流身份(可发起或可审批任一权限)放行,与文件中心的管理端上传接口权限隔离;上传仍执行统一的大小上限与 magic bytes 真实类型校验,并进入受管文件与审计。

激活轮次与运行不变量

同一节点每次被进入(首次流转、退回重审、退回发起人后重提、撤回已办重审)都会分配一个新的激活轮次 activationId,该轮生成的一批任务共享同一轮次标识。引擎在数据库层维护两条硬性不变量:

不变量约束
活动任务唯一同一实例、同一节点、同一激活轮次内,一个处理人最多持有一条 pending/waiting 任务(部分唯一索引强制)
活动 Token 唯一同一实例、同一节点、同一分支路径最多存在一个 active Token(部分唯一索引强制)

协作动作(转办、委派、加签、改派、离职交接)在写入前对目标处理人做同轮预检,命中时返回带姓名的 409(如「张三 已是本节点待办处理人,无需重复指派」),不会击穿唯一索引。

全量清场语义

凡是让实例离开当前执行位置的动作,都会对「活动任务 + 活动 Token + 在途推进类作业」做一次全实例清场,保证不留任何可被旧轮消费的残骸:

动作清场范围任务留痕注释
驳回终止全实例活动任务 skip、Token 终止、推进类作业取消[流程驳回] 流程已被驳回终止,本待办作废
退回发起人全实例(含并行分支的跨节点待办)任务 skip、Token 终止、推进类作业取消,实例进入 returned[退回发起人] 流程退回修改,本待办作废
发起人撤回同上,实例进入 withdrawn[发起人撤回] 流程已撤回,本待办作废
管理员取消同上,实例进入 cancelled[管理员取消] 流程已取消,本待办作废
自动拒绝终止同上,实例进入 rejected[自动拒绝] 流程被自动拒绝终止,本待办作废
流程正常完结清理残余等待任务与在途推进作业[流程结束] 流程已结束,本待办作废

推进类作业指 delay_waketask_timeouttrigger_dispatchexternal_dispatchsubprocess_spawnsubprocess_join 六类会改变实例执行位置的作业;事件分发、Webhook 投递与补偿动作等通知类作业不在取消范围内,保证已发生事实的通知照常送达。

returned 实例重提时,引擎在物化新一轮任务前还会执行一次防御性清场(残留任务 skip、Token 终止、推进作业取消,注释 [重提清场] 上一轮残留待办作废),即使退回后有旧作业迟到推进也不会产生并存轮次。

任务与自动作业

人工任务写入 workflow_tasks,自动副作用写入 workflow_jobs

作业类型说明
delay_wake延迟节点唤醒
task_timeout审批/办理节点超时处理
trigger_dispatch触发器节点派发
external_dispatch外部审批派发
subprocess_spawn子流程发起
subprocess_join子流程汇聚
event_dispatch工作流事件可靠分发
webhook_delivery事件订阅 Webhook 投递
compensation_action失败策略的反向 / 兜底补偿动作(见补偿 / Saga

每个作业都有状态、尝试次数、幂等键、traceId、下次执行时间和执行结果;每次尝试写入 workflow_job_executions。审批、驳回、撤回、取消等动作产生的事件在业务事务内以 outbox 方式原子入队,保证状态变更与事件分发不脱节。

执行 Token

执行 Token 表示流程图中的活动路径。分支、汇聚、子流程、跳过和重放都基于 Token 记录。任务提交必须命中所在节点的 active Token,因此「任务在、Token 不在」属于必须修复的严重不一致——引擎诊断与健康巡检都会对其报 critical(见监控、诊断与运维),修复入口为监控页「强制跳转」。

监控诊断页展示活动 Token、已消费 Token、死亡 Token 和父子 Token 关系,用于解释实例为什么停在某个节点。

结束

当所有活动路径完成且没有后续节点时,实例进入 approved。实例通过、驳回、撤回都会触发对应 instance.* 事件,并驱动通知、业务桥接、自动化和 Webhook 订阅。

撤回与重新提交

发起人在流程允许撤回时可撤回运行实例。撤回执行全量清场(见上文),实例置为 withdrawn。被驳回或撤回的实例可重新提交,系统会基于原数据创建新的草稿;returned 实例则在原实例上修改重提,保留业务编号与审计历史。

重提后若命中定义的「审批人自动去重」设置,同一实例内已通过的审批人会按配置自动通过,流程直接推进到下一个需要人工处理的节点。

管理员操作

流程监控页提供管理员运维操作:

操作说明
取消流程强制终止运行/挂起实例,全量清场后状态变为 cancelled
挂起流程冻结流转:待办不可处理、外部回调拒绝、task_timeout/delay_wake 计时作业暂停计时(记录剩余时长)
恢复流程从挂起恢复为 running,计时作业按挂起前剩余时长重排续跑
离职交接把某人名下全部未处理待办批量改派给接手人(转办链留痕、逐条互不阻断,接手人已在同节点持有待办的条目自动跳过),可同时停用其审批代理规则,并提示将其写死为审批人的定义清单
删除实例删除实例及关联任务
强制跳转终止当前所有活动任务并跳转到指定节点重建执行路径。确认框列出将被终止的活动任务清单(任务号/节点/处理人/状态),跳转原因必填并写入审计与被终止任务的备注
改派处理人将待办改派给其他用户;目标用户已在同节点持有待办时返回 409
迁移版本将运行实例迁移到当前定义版本,迁移前检查活动节点是否仍存在
Token 跳过跳过卡死执行 Token
Token 重放从执行 Token 所在节点重放流程
批量推进卡死实例按定义、节点和卡住时长批量跳过活动 Token,恢复原因必填并留痕

详情视图

实例详情包含:

页签说明
表单渲染发起时表单或业务查看组件
审批流程任务时间线(含跳过任务的来源注释)
流程图结合任务状态显示流程节点
沟通评论与提及
协办协办请求和回复
子流程父子实例关系与跳转

管理端返回的实例快照会剥离外部审批 / 触发器回调密钥与出站凭证请求头等敏感配置;表单数据按查看者身份脱敏(见表单与远程数据源)。

运行时技术诊断见 监控、诊断与运维

Built with VitePress for local documentation preview.