1. 状态机基础:有限状态机(FSM)核心概念

有限状态机(Finite State Machine, FSM)是描述系统在有限个状态之间迁移行为的数学模型。在企业审批流中,每一笔单据(如采购订单、报销单)都遵循明确的状态流转规则,FSM 正是构建这种规则骨架的最优工具。

1.1 核心四要素

FSM 由四个基本元素构成,它们共同定义了系统的全部行为边界:

要素 英文 定义 审批流示例
状态 State 系统在某一时刻所处的稳定局面 待审批、审批中、已通过、已驳回
事件 Event 触发状态转移的外部或内部信号 提交申请、审批通过、驳回操作
转移 Transition 从当前状态到下一个状态的路径 待审批 → 审批中(提交事件)
动作 Action 转移发生时执行的业务逻辑 发送通知、更新数据库、记录日志

1.2 四要素的关系模型

状态、事件、转移、动作之间遵循严格的组合规则:当前状态 + 事件 → 转移 → 新状态 + 动作。这种关系可以用以下公式表达:

FSM = (S, E, T, A)
其中:
  S = {s₁, s₂, ..., sₙ}   // 有限状态集合
  E = {e₁, e₂, ..., eₘ}   // 有限事件集合
  T: S × E → S            // 转移函数,定义从当前状态经事件到达目标状态
  A: S × E → Action       // 动作函数,定义转移时执行的业务逻辑

关键约束:在经典 FSM 中,同一状态对同一事件只能有一条确定的转移路径。这意味着“待审批”状态下收到“提交”事件,系统必须唯一确定下一个状态,不存在二义性。

1.3 状态机核心结构图

下图展示了 FSM 四要素之间的静态关系与动态流转路径:

FSM 四要素关系结构图 当前状态 新状态 事件 触发 转移 动作(业务逻辑) 执行 核心公式 当前状态 + 事件 → 转移 → 新状态 + 动作 示例:待审批 + 提交 → 转移 → 审批中 + 发送通知 确定性:同一状态 + 同一事件 → 唯一目标状态

1.4 状态:系统的稳定锚点

状态是 FSM 中最核心的概念,它代表系统在某个时间点的稳定快照。在审批流中,状态必须满足以下特征:

  • 有限性:状态数量是确定的、可枚举的。例如审批流通常包含 4~8 个状态,不会无限增长。
  • 互斥性:同一时刻系统只能处于一个状态。一张单据不能同时是“待审批”和“已通过”。
  • 可观测性:外部系统可以通过查询明确获知当前状态。
  • 持久性:状态在数据库中有对应的字段记录,即使系统重启也能恢复。

实践建议:设计状态时,每个状态名称应使用动词+名词或形容词+名词的格式,如“待审批”、“审批中”、“已通过”。避免使用模糊的“处理中”或“进行中”,这类命名无法准确表达业务含义。

1.5 事件:状态转移的触发器

事件是推动状态机前进的外部驱动力。在审批流中,事件通常来自用户操作或系统回调:

事件类型 来源 示例 触发条件
用户事件 前端操作 提交申请、审批通过、驳回 用户点击按钮
系统事件 定时器/回调 超时自动审批、第三方回调 时间到达/外部响应
内部事件 状态机自身 进入状态、离开状态 转移完成时自动触发

1.6 转移:状态之间的合法路径

转移定义了状态机允许的演化路径。不是所有状态之间都可以任意跳转,转移必须满足:

  • 合法性:转移必须在状态转移表中预先定义,未定义的转移会被拒绝。
  • 原子性:转移要么完整执行(新状态+动作),要么完全不执行,不允许中间状态。
  • 有向性:转移是单向的,从状态 A 到状态 B 的转移不意味着可以反向。

1.7 动作:转移时的业务逻辑

动作是状态机产生业务价值的环节。当转移发生时,动作按以下顺序执行:

  1. 离开动作:离开当前状态前执行(如释放资源)
  2. 转移动作:转移过程中执行(如校验数据、更新字段)
  3. 进入动作:进入新状态后执行(如发送通知、触发后续流程)

常见错误:初学者常把业务逻辑写在事件处理函数中,而不是写在动作中。正确的做法是:事件只负责“触发”,动作负责“执行”。这样当状态机需要复用同一转移路径时,动作逻辑可以保持一致,避免重复代码。

1.8 四要素在审批流中的完整示例

以采购订单审批为例,展示四要素如何协同工作:

状态集合 S = {草稿, 待审批, 审批中, 已通过, 已驳回, 已撤销}
事件集合 E = {提交, 审批通过, 驳回, 撤销, 重新提交}

转移规则示例:
  草稿    + 提交     → 待审批   + 动作:锁定单据、发送审批通知
  待审批  + 审批通过 → 已通过   + 动作:更新库存、生成采购单
  待审批  + 驳回     → 已驳回   + 动作:记录驳回原因、通知申请人
  已驳回  + 重新提交 → 待审批   + 动作:清除驳回记录、重新锁定
  待审批  + 撤销     → 已撤销   + 动作:释放锁定、记录撤销日志
采购订单审批 FSM 状态转移图 草稿 待审批 审批中 已通过 已驳回 已撤销 提交 提交 通过 驳回 撤销 重新提交

1.9 状态机设计原则

在企业审批流中应用 FSM 时,应遵循以下设计原则:

  • 完备性:每个状态都必须定义所有可能事件的响应,未定义的事件应被明确拒绝。
  • 可达性:每个状态都应有至少一条从初始状态到达的路径,避免出现“死状态”。
  • 可退出性:每个非终态都应有至少一条离开的转移路径,避免系统卡死。
  • 无歧义性:同一状态对同一事件只能有一个转移目标,避免运行时冲突。

总结:FSM 的四要素——状态、事件、转移、动作——构成了企业审批流的骨架。状态定义“是什么”,事件定义“发生了什么”,转移定义“去哪里”,动作定义“做什么”。掌握这四者的关系,是构建可靠审批流系统的第一步。