实例生命周期
流程实例是用户基于已发布流程定义发起的一次申请。运行实例保存本轮提交时的定义快照、表单快照、业务编号、表单数据、当前节点、任务、执行 Token 和业务关联。正常流转使用实例快照,修改流程定义不会自动改变正在执行的实例。
状态流转
| 状态 | 说明 |
|---|---|
draft | 已保存但未进入流转 |
running | 正在执行 |
suspended | 管理员挂起:待办不可处理,自动推进作业暂停,恢复后按剩余时长续跑;结果不明的在途外呼进入死信 |
returned | 已退回:驳回策略为「退回发起人」时进入,发起人修改表单后在同一实例上重新提交,保留审计历史与业务编号 |
approved | 已通过 |
rejected | 已驳回 |
withdrawn | 已撤回 |
cancelled | 已取消 |
发起与草稿
用户在 工作流引擎 → 审批中心 → 发起工作台 选择已发布且有权限发起的流程,填写表单并提交。也可以保存草稿,再到 工作流引擎 → 审批中心 → 我的申请 继续编辑和提交。整页发起深链 /workflow/launch/:definitionId 与发起工作台同源读取「已发布定义」,普通发起人可直接收藏或分享该链接。
直接提交时系统会:
- 校验流程定义状态与发起人范围。
- 冻结定义快照和表单快照。
- 写入实例标题、优先级、表单数据、发起时抄送人和业务编号。
- 进入
running后创建首批执行 Token 与任务。 - 入队
event_dispatch作业,分发instance.created、task.created、task.assigned等事件。
保存草稿只保存当前表单与快照,不创建流转任务、不生成业务编号,也不分发创建事件。提交草稿和 returned 实例重提时,服务端重新读取当前仍已发布的流程定义和当前表单,重新校验结构、起始字段权限、必填字段与派生值,并冻结本轮定义 / 表单快照;定义已停用时拒绝提交。发起人自选审批人也在本轮提交时重新应用。
returned 重提保留同一实例、原业务编号和既有任务 / 审计记录,从入口建立新轮次;不重复发出 instance.created,本轮的新任务与终态仍发出相应事件。草稿保存时的快照用于编辑上下文,不能视为提交时的固定版本;进入运行后则使用本轮冻结快照,显式迁移版本另有管理员入口。
审批表单中的附件、图片字段统一通过 POST /api/workflows/attachments 上传,按工作流身份(可发起或可审批任一权限)放行,与文件中心的管理端上传接口权限隔离;上传仍执行统一的大小上限与 magic bytes 真实类型校验,并进入受管文件与审计。
激活轮次与运行不变量
同一节点每次被进入(首次流转、退回重审、退回发起人后重提、撤回已办重审)都会分配一个新的激活轮次 activationId,该轮生成的一批任务共享同一轮次标识。引擎在数据库层维护两条硬性不变量:
| 不变量 | 约束 |
|---|---|
| 活动任务唯一 | 同一实例、同一节点、同一激活轮次内,一个处理人最多持有一条 pending/waiting 任务(部分唯一索引强制) |
| 活动 Token 唯一 | 同一实例、同一节点、同一分支路径最多存在一个 active Token(部分唯一索引强制) |
协作动作(转办、委派、加签、改派、离职交接)在写入前对目标处理人做同轮预检,命中时返回带姓名的 409(如「张三 已是本节点待办处理人,无需重复指派」),不会击穿唯一索引。
全量清场语义
凡是让实例离开当前执行位置的动作,都会对「活动任务 + 活动 Token + 在途推进类作业」做一次全实例清场,保证不留任何可被旧轮消费的残骸:
| 动作 | 清场范围 | 任务留痕注释 |
|---|---|---|
| 驳回终止 | 全实例活动任务 skip、Token 终止、推进类作业取消 | [流程驳回] 流程已被驳回终止,本待办作废 |
| 退回发起人 | 全实例(含并行分支的跨节点待办)任务 skip、Token 终止、推进类作业取消,实例进入 returned | [退回发起人] 流程退回修改,本待办作废 |
| 发起人撤回 | 同上,实例进入 withdrawn | [发起人撤回] 流程已撤回,本待办作废 |
| 管理员取消 | 同上,实例进入 cancelled | [管理员取消] 流程已取消,本待办作废 |
| 自动拒绝终止 | 同上,实例进入 rejected | [自动拒绝] 流程被自动拒绝终止,本待办作废 |
| 流程正常完结 | 清理残余等待任务与在途推进作业 | [流程结束] 流程已结束,本待办作废 |
清场取消的推进作业由共享常量 WORKFLOW_ADVANCING_JOB_TYPES 定义:delay_wake、task_timeout、external_dispatch、subprocess_spawn、subprocess_join。触发器、事件分发、Webhook 投递与补偿动作不在该范围;已经发生的触发事实继续投递,仍在门控的触发器由任务与实例状态校验决定是否继续。作业自身完成实例时保留当前执行者,取消其它残留推进作业。
returned 实例重提时,引擎在物化新一轮任务前还会执行一次防御性清场(残留任务 skip、Token 终止、推进作业取消,注释 [重提清场] 上一轮残留待办作废),新一轮任务只使用本轮的活动执行位置。
任务与自动作业
节点任务写入 workflow_tasks,后台执行写入 workflow_jobs,逐次尝试与已提交步骤分别写入 workflow_job_executions、workflow_job_effects。审批、驳回、撤回、取消等关键事件随业务事务原子入队,提交后由 worker 分发。
作业的执行池、11 种类型、轮次 / 租约 / 截止时间、回执、暂停续跑、外部结果待确认和恢复扫描统一见作业执行与恢复。人工修复工单保留运行中实例及 catch 待办,其状态与管理员 suspended 挂起不同,见补偿与 Saga。
执行 Token
执行 Token 表示流程图中的活动路径。分支、汇聚、子流程、跳过和重放都基于 Token 记录。任务提交必须命中所在节点的 active Token,因此「任务在、Token 不在」属于必须修复的严重不一致——引擎诊断与健康巡检都会对其报 critical(见流程监控与分析),修复入口为监控页「强制跳转」。
监控诊断页展示活动 Token、已消费 Token、死亡 Token 和父子 Token 关系,用于解释实例为什么停在某个节点。
结束
当所有活动路径完成且没有后续节点时,实例进入 approved。实例通过、驳回、撤回都会触发对应 instance.* 事件,并驱动通知、业务桥接、自动化和 Webhook 订阅。
撤回与重新提交
发起人在流程允许撤回时可撤回运行实例。撤回执行全量清场(见上文),实例置为 withdrawn。被驳回或撤回的实例可重新提交,系统会基于原数据创建新的草稿;returned 实例则在原实例上修改重提,保留业务编号与审计历史。
重提后若命中定义的「审批人自动去重」设置,同一实例内已通过的审批人会按配置自动通过,流程直接推进到下一个需要人工处理的节点。
管理员操作
入口 工作流引擎 → 运维与集成 → 流程监控 → 实例监控 提供管理员运维操作:
| 操作 | 说明 |
|---|---|
| 取消流程 | 强制终止运行/挂起实例,全量清场后状态变为 cancelled |
| 挂起流程 | 冻结流转:待办不可处理、外部回调拒绝,延时、超时、触发器、外部审批与子流程作业暂停(记录剩余时长);结果不明的在途外呼进入死信 |
| 恢复流程 | 从挂起恢复为 running,已暂停的自动推进作业按挂起前剩余时长重排续跑 |
| 离职交接 | 把某人名下全部未处理待办批量改派给接手人(转办链留痕、逐条互不阻断,接手人已在同节点持有待办的条目自动跳过),可同时停用其审批代理规则,并提示将其写死为审批人的定义清单 |
| 删除实例 | 删除实例及关联任务 |
| 强制跳转 | 终止当前所有活动任务并跳转到指定节点重建执行路径。确认框列出将被终止的活动任务清单(任务号/节点/处理人/状态),跳转原因必填并写入审计与被终止任务的备注 |
| 改派处理人 | 将待办改派给其他用户;目标用户已在同节点持有待办时返回 409 |
| 迁移版本 | 将运行实例迁移到当前定义版本,迁移前检查活动节点是否仍存在 |
| Token 跳过 | 跳过卡死执行 Token |
| Token 重放 | 从执行 Token 所在节点重放流程 |
| 批量推进卡死实例 | 按定义、节点和卡住时长批量跳过活动 Token,恢复原因必填并留痕 |
详情视图
实例详情采用普通流程统一的两栏布局:左侧业务资料与协作页签,右侧审批链、当前处理状态,流程图从辅助入口展开。业务系统主导流程的业务表单入口也复用这套详情;提交前则展示审批链路预览,接入规范见 业务模块接入工作流。
| 页签 | 说明 |
|---|---|
| 表单 | 渲染发起时表单或业务查看组件 |
| 流转记录 | 任务记录,可选择审批环节、抄送或全部留痕范围 |
| 沟通 | 评论与提及 |
| 协办 | 协办请求和回复 |
| 子流程 | 父子实例关系与跳转 |
业务表单上的「审批轮次」可在当前审批/本次提审预览与过去实例之间切换;过去流程使用所选实例的定义快照和任务记录,业务表单仍展示当前业务资料,不作为历史业务快照。
管理端返回的实例快照会剥离外部审批 / 触发器回调密钥与出站凭证请求头等敏感配置;表单数据按查看者身份脱敏(见表单与远程数据源)。
运行时技术诊断见 流程监控与分析。
统一编号分配
所有正式发起入口(人工、业务模块、定时、自动化、子流程)调用平台编号服务。发布时将规则 ID、不可变版本 ID 和参数映射写入流程定义及版本快照;缺少固定引用的定义不能直接发起。事务内先创建实例,再以 instance:<实例 ID> 分配并关联编号,实例写入失败时编号计数同时回滚。作废或删除业务记录不回收已提交号码。
编号模板中的发起人、部门和租户参数来自实际发起人,后台作业不依赖请求会话。表单映射仅允许分类编码引用普通文本、数字、单选或日期字段,不能映射密码、签名、附件、布局及流水号字段,也不能覆盖租户或组织等系统身份参数。编号中心改变默认绑定或发布新版本,不会改变已经发布的流程引用。