可按“主状态机 + 子状态机”设计,避免状态爆炸。
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:延时任务(关单、催付、自动收货)网友回复
如何破解绕开seedance2.0真人照片生成视频 限制?
python有哪些算法可以将视频中的每个帧图片去除指定区域水印合成新的视频?
iphone的激光雷达数据能否实时传输到three三维空间中?
豆包sora等ai视频生成大模型生成的视频水印如何去除?
python如何实现在电脑上拨号打电话给手机?
具身机器人与人形机器人区别?
nodejs如何将一个完整的js代码文件切割成不同的部分混淆后动态加载进入html运行?
为啥windows.onerror捕获js错误是这样的{"message":"Script error.","source":"","lineno":0,"colno":0,"stack":null,
2026年ai将全面接管编程?
WebMCP是干啥的?


