+
78
-

回答

可按“主状态机 + 子状态机”设计,避免状态爆炸。

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:延时任务(关单、催付、自动收货)

网友回复

我知道答案,我要回答