一个基于 Spring StateMachine 实现的订单全生命周期状态管理方案,通过状态机模式规范订单状态流转,支持单机和分布式部署,适用于电商、新零售等业务场景。
在传统订单系统开发中,订单状态的流转逻辑(如“待支付→待发货”“待发货→待收货”)往往分散在业务代码中,导致:
- 状态判断条件冗余(大量
if-else或switch语句) - 状态流转规则不透明,新开发者难以理解
- 新增状态或流转规则时,需修改多处代码,易出错
本项目通过 Spring StateMachine 框架,将订单状态和转换规则集中管理,通过事件驱动状态变更,解决上述问题,提升代码可维护性和扩展性。
- 状态集中管控:所有订单状态(如「待支付」「待发货」)和转换规则在配置类中统一定义,避免状态判断逻辑散落在业务代码中。
- 事件驱动设计:通过「支付」「发货」「收货」等事件触发状态变更,业务操作与状态转换解耦,便于扩展新场景。
- 多环境兼容:支持单机部署(内存存储状态)和分布式部署(Redis 存储状态),满足不同规模业务需求。
- 可扩展性强:新增状态或事件只需扩展枚举和配置,无需修改核心逻辑,降低迭代成本。
- 电商平台订单管理(从创建到完成的全生命周期)
- 零售系统交易流程控制
- 任何需要严格管控状态流转的业务场景(如工单系统、审批流程等)
| 组件 | 技术/版本 | 作用说明 |
|---|---|---|
| 基础框架 | Spring Boot 2.7.18 | 快速开发Spring应用 |
| 状态机核心 | Spring StateMachine 3.2.0 | 实现状态管理和事件驱动 |
| 数据访问 | MyBatis 3.0.2 | 数据库交互 |
| 数据库 | MySQL 8.0+ | 存储订单业务数据 |
| 分布式存储 | Redis 6.0+ | 状态机上下文分布式存储(可选) |
| 构建工具 | Maven 3.6+ | 项目构建和依赖管理 |
| 运行环境 | JDK 17+ | 代码运行环境 |
- JDK 17+:配置
JAVA_HOME环境变量,验证java -version输出正确版本 - MySQL 8.0+:启动服务并创建数据库
statemachine_demo(编码utf8mb4) - Redis 6.0+(可选):分布式部署时需启动,默认端口 6379
- Maven 3.9+:验证
mvn -version输出正确版本
执行以下 SQL 脚本创建订单表:
-- 创建数据库(若不存在)
CREATE DATABASE IF NOT EXISTS statemachine_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE statemachine_demo;
-- 订单表
CREATE TABLE IF NOT EXISTS tb_order (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
order_code VARCHAR(64) NOT NULL COMMENT '订单编号(唯一)',
status INT NOT NULL COMMENT '订单状态:1=待支付,2=待发货,3=待收货,4=已完成',
name VARCHAR(128) NOT NULL COMMENT '商品名称',
price DECIMAL(10,2) NOT NULL COMMENT '商品单价',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
UNIQUE KEY uk_order_code (order_code) COMMENT '订单编号唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '订单主表';