在 MES、WMS、设备管理、工艺执行等工业系统中,很多项目在早期都能快速开发,但随着业务复杂度增加,系统往往会逐渐失控:

  • 状态字段越来越多
  • if-else 越来越长
  • 流程越来越难维护
  • 插单、返工、暂停逻辑混乱
  • 状态跳转不可追溯
  • 系统出现大量“非法状态”

最终:

系统不再是“流程驱动”,而变成了“代码堆叠”。

其根本原因通常只有一个:

缺少真正的“工业级状态机设计”。

在这里插入图片描述

本文从工业 MES 场景出发,系统介绍:

  • 为什么工业系统必须使用状态机
  • 如何设计可扩展状态机
  • 如何构建生产流程引擎
  • Java中的典型实现思路

一、为什么工业系统天然适合状态机?

工业系统最大的特点是:

一切都在“状态变化”。

例如:


工单状态

待生产 → 生产中 → 暂停 → 完成

工序状态

未开始 → 执行中 → 已完成

设备状态

运行 → 故障 → 维修 → 恢复

物料状态

待入库 → 已入库 → 已领料 → 已消耗

工业系统本质上不是 CRUD 系统,而是:

“状态流转系统”。


二、传统流程代码为什么一定会崩?

很多 MES 系统最初都会这样写:

if(order.getStatus().equals("CREATED")) {
    order.setStatus("RUNNING");
}

后面增加:

if(machineFault) {
    order.setStatus("SUSPENDED");
}

再后来:

if(rework) {
    order.setStatus("REWORK");
}

最终变成:

  • 巨量 if-else
  • 状态跳转失控
  • 无法审计
  • 无法回放
  • 无法扩展

三、工业级状态机的核心思想

工业级状态机并不是:

“一个状态字段”。

而是:

“状态 + 事件 + 规则”


四、状态机核心模型

标准模型包含四部分:

模型作用
State(状态)当前阶段
Event(事件)驱动变化
Transition(迁移)状态切换规则
Action(动作)状态切换后执行逻辑

在这里插入图片描述

五、一个标准工单状态机

例如:

CREATED
↓
PLANNED
↓
RELEASED
↓
RUNNING
↓
COMPLETED
↓
CLOSED

同时允许:

RUNNING → SUSPENDED
SUSPENDED → RUNNING
RUNNING → REWORK

六、工业系统为什么一定要“事件驱动”?

因为现实世界并不是线性的。

生产过程会受到:

  • 设备故障
  • 缺料
  • 插单
  • 人工干预
  • 网络异常

影响。

因此:

状态变化必须由“事件”触发。


七、事件模型设计(关键)

在这里插入图片描述

事件不是日志。

而是:

“现实世界发生的事实”。


常见事件类型

工单事件

OrderCreated
OrderReleased
OrderStarted
OrderCompleted

工序事件

OperationStarted
OperationFinished

设备事件

MachineStarted
MachineStopped
MachineFault

人工事件

PauseRequested
ResumeRequested

八、Transition(状态迁移)设计

在这里插入图片描述

这是状态机真正的核心。


标准结构

当前状态事件下一个状态
CREATEDRELEASERELEASED
RELEASEDSTARTRUNNING
RUNNINGCOMPLETECOMPLETED
RUNNINGPAUSESUSPENDED

九、为什么“状态迁移表”非常重要?

因为它解决了:

“状态是否合法”

例如:

❌ 非法:

CREATED → COMPLETED

必须禁止。


十、工业级状态机的关键能力

真正的工业级状态机,必须支持:


1. 可回退

例如:

RUNNING → REWORK

2. 可暂停

RUNNING → SUSPENDED

3. 可恢复

SUSPENDED → RUNNING

4. 可追溯

必须知道:

  • 谁触发
  • 为什么触发
  • 什么时候触发

5. 可审计

所有状态变化必须保留历史。


十一、生产流程引擎的核心设计

在这里插入图片描述

状态机再往上,就是:

生产流程引擎(Workflow Engine)


核心职责

流程引擎负责:

  • 驱动状态流转
  • 执行动作
  • 调度资源
  • 处理异常
  • 记录历史

十二、一个标准流程引擎结构

Event
  ↓
StateMachine
  ↓
Transition Resolver
  ↓
Action Executor
  ↓
Persistence
  ↓
Event Bus

十三、各模块职责


1. Event Bus(事件总线)

负责:

  • 接收事件
  • 分发事件

例如:

MachineFault
OrderCompleted

2. StateMachine(状态机核心)

负责:

  • 判断状态是否合法
  • 计算下一状态

3. Transition Resolver

负责:

  • 查找迁移规则

例如:

RUNNING + PAUSE
→ SUSPENDED

4. Action Executor

负责:

  • 执行业务动作

例如:

  • 发送通知
  • 更新库存
  • 记录日志

5. Persistence

负责:

  • 状态持久化
  • 历史记录

十四、工业级状态机的 Java 实现思路

在这里插入图片描述


1. 状态定义

推荐使用枚举:

public enum OrderStatus {
    CREATED,
    RELEASED,
    RUNNING,
    SUSPENDED,
    COMPLETED
}

2. 事件定义

public enum OrderEvent {
    RELEASE,
    START,
    PAUSE,
    RESUME,
    COMPLETE
}

3. Transition 模型

public class Transition {

    private OrderStatus from;

    private OrderEvent event;

    private OrderStatus to;

}

4. Transition 注册

Map<Key, Transition> transitions;

Key:

(fromState + event)

5. 状态流转核心逻辑

public OrderStatus transit(
    OrderStatus current,
    OrderEvent event
) {

    Transition transition =
        transitions.get(
            new Key(current, event)
        );

    if (transition == null) {
        throw new IllegalStateException(
            "非法状态流转"
        );
    }

    return transition.getTo();
}

十五、Action 机制(非常关键)

工业系统不能只有状态变化。

还必须支持:

“状态变化后的动作”。


示例

RUNNING → COMPLETED

触发:

  • 更新产量
  • 更新库存
  • 推送 ERP
  • 写入追溯记录

Java 实现

public interface Action {

    void execute(Context context);

}

十六、为什么推荐“配置化状态机”?

工业流程会频繁变化。

例如:

  • 新增返工流程
  • 新增审批节点
  • 新增暂停逻辑

如果写死代码:

系统会迅速失控。


推荐做法

将:

  • 状态
  • 事件
  • Transition

配置化。

例如:

{
  "from": "RUNNING",
  "event": "PAUSE",
  "to": "SUSPENDED"
}

十七、工业状态机与工作流的区别

很多人会混淆:

类型特点
工作流面向审批
状态机面向生产状态

MES 更适合:

状态机模型。


十八、工业系统真正高级的设计

真正成熟的工业系统:

不是:

“功能驱动”

而是:

“状态 + 事件驱动”


十九、一个汽车零部件工厂示例

下面以“汽车刹车盘加工”为例,说明状态机在离散制造中的实际运行。


1. ERP下发生产订单

订单:生产 5000 件刹车盘

MES 创建工单:

WO-20260501
状态:CREATED

2. 工艺路线拆解

系统生成工序:

毛坯入库
→ 粗车加工
→ 精车加工
→ 动平衡检测
→ 清洗
→ 包装

3. 工单释放

事件:

RELEASE

状态流转:

CREATED → RELEASED

4. 开始加工

CNC车床开始执行:

START

状态变化:

RELEASED → RUNNING

同时:

Operation-粗车 → RUNNING

5. 设备故障

加工过程中:

某台 CNC 主轴报警。

设备系统发送事件:

MachineFault

流程引擎触发:

RUNNING → SUSPENDED

并自动执行:

  • 暂停后续上料
  • 通知维修人员
  • 记录停机时间
  • 更新 OEE

6. 故障恢复

维修完成后:

ResumeRequested

状态恢复:

SUSPENDED → RUNNING

7. 质检不合格

动平衡检测发现部分产品超差。

系统触发:

QualityFailed

状态进入:

RUNNING → REWORK

系统自动:

  • 创建返工工序
  • 记录不良原因
  • 更新质量追溯链

8. 工单完成

全部工序结束:

COMPLETE

状态:

RUNNING → COMPLETED

随后:

  • 更新库存
  • 回传 ERP
  • 生成生产报表
  • 归档追溯数据

二十、总结

工业级状态机设计的核心,不是:

  • 状态字段
  • if-else
  • 流程图

而是:

将现实世界的生产过程,抽象为:

  • 状态(State)
  • 事件(Event)
  • 迁移(Transition)
  • 动作(Action)

组成的可计算系统。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐