可按“主状态机 + 子状态机”设计,避免状态爆炸。
1. 主状态机(订单生命周期)- CREATED:已创建待支付
- CONFIRMED:支付成功待履约
- FULFILLING:拣货/出库中
- SHIPPED:已发货
- COMPLETED:已签收/完成
- CANCELLED:已取消
- CLOSED:已关闭(超时未支付、售后完结等)2. 子状态机解耦
- 支付:UNPAID -> PAYING -> PAID -> REFUNDING -> REFUNDED
- 履约:PENDING -> PICKING -> PACKED -> SHIPPED -> DELIVERED
- 售后:NONE -> APPLYING -> APPROVED/REJECTED -> RETURNING -> DONE
- 主状态由子状态聚合计算,别把所有组合塞进一个大状态机。 3. 迁移规则(核心)- 只允许白名单迁移(例如 CREATED -> CONFIRMED/CANCELLED/CLOSED)
- 每次迁移记录 event、from、to、operator、reason
- 不允许逆向跳转(除非定义补偿事件)
- 终态(COMPLETED/CANCELLED/CLOSED)默认不可再迁移4. 关键事件
- OrderCreated
- PaymentSucceeded/Failed/Timeout
- StockReserved/Insufficient
- ShipmentCreated/Delivered
- CancelRequested/Approved
- RefundSucceeded/Failed
- 用事件驱动(消息队列)串联库存、支付、物流、营销。 5. 工程要点- 幂等:按 event_id 或 biz_id 去重,防止重复回调
- 并发控制:版本号 version(乐观锁)或 SELECT ... FOR UPDATE
- 超时机制:未支付超时关单、未发货超时预警
- 补偿机制:支付成功但库存失败 => 自动退款
- 状态机配置化:迁移表可配置,便于运营策略调整 6. 表设计- orders:当前聚合状态(主状态+子状态)
- order_state_log:状态流转审计日志(不可变)
- order_event:领域事件表(可做 outbox)
- order_timeout_task:延时任务(关单、催付、自动收货)网友回复


