订单状态机

0 前言

电商平台所有模块中,订单系统作为比较核心的模块,它决定了整个流程能不能顺畅的执行,起着承上启下的作用(下单、支付、履约、售后、清结算、营销活动)。

订单系统的设计主要需要考虑订单字段、业务流程、状态机三大个方面,这些内容决定了订单系统稳定性与扩展性。

2 订单流程

订单流程指整个订单从产生到完成的整个流转过程,它包括正向流程和逆向的流程。

3 订单状态机

状态机表示了一笔订单的生命周期,按照一定的方向通过触发不同的事件产生数据流转的过程。

 

状态机v2.0

随着业务快速发展,我们的状态机也在逐步完善,在完善的过程中我们遇到两个问题

  1. 如何提供更多的订单状态来描述现实世界?
  2. 在提供更多的订单状态后,同时节省状态机维护成本?

为了解决这两个问题,我们采用大状态+小状态的设计。主、子订单上只维护大状态流转,抽象出物流、售后两个领域分别去维护各自的小状态。这样保证了主子订单上的状态不会特别多,同时又可以通过不同的领域中的小状态去满足业务需求。

主、子订单变更规则

  • 正向状态是当全部子订单向前流转时,主订单才会向前走;
  • 逆向状态是当子订单全部变成15(售后中) 主订单才变售后中.   子订单全部变成16(售后完成)主订单才变售后完成  子订单全部变成11(取消)主订单才变取消;

 

状态机在APP端的体现

团长C端提货界面

用户C端提货界面

 

思考与改进

1 目前物流领域的状态机只针对团长端开放,并没有针对C端用户开放。WMS和TMS作业都是按照团长+SKU纬度,团长收到货后承担这二次分拣的职责,由团长决定用户的货是否真的送达,所以WMS和TMS回传给订单的消息对用户是不准确的。

问题举例

小明在A团长下单5个苹果

小红在A团长下单5个苹果

23点仓库开始作业,发现一共只有5个苹果。

  1. WMS TMS 下发出库、配送指令 A团长+5个苹果
  2. OMS收到指令按照团长纬度更新订单状态,此时小明、小红的订单状态都被更新为司机送达
  3. 团长收到5个苹果后,选择把苹果全部给和他关系较好的小明。

此时小红没收到货、同时看到自己订单状态为司机送达就会很懵逼,这也是目前为什么履约状态只针对团长开放的原因。谁到货谁没到货团长线下决定的。

 

 

 

 

 

 

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是一个简单的订单状态机的Java代码实现: ```java public class OrderStateMachine { // 订单状态枚举 public enum State { CREATED, PAID, SHIPPED, DELIVERED, CANCELLED } // 订单事件枚举 public enum Event { PAYMENT_RECEIVED, ITEM_SHIPPED, ITEM_DELIVERED, ORDER_CANCELLED } // 状态转移函数 private static final Map<State, Map<Event, State>> TRANSITIONS = new HashMap<>(); static { TRANSITIONS.put(State.CREATED, new HashMap<>()); TRANSITIONS.get(State.CREATED).put(Event.PAYMENT_RECEIVED, State.PAID); TRANSITIONS.get(State.CREATED).put(Event.ORDER_CANCELLED, State.CANCELLED); TRANSITIONS.put(State.PAID, new HashMap<>()); TRANSITIONS.get(State.PAID).put(Event.ITEM_SHIPPED, State.SHIPPED); TRANSITIONS.get(State.PAID).put(Event.ORDER_CANCELLED, State.CANCELLED); TRANSITIONS.put(State.SHIPPED, new HashMap<>()); TRANSITIONS.get(State.SHIPPED).put(Event.ITEM_DELIVERED, State.DELIVERED); // DELIVERED 和 CANCELLED 状态没有转移函数 } private State currentState; public OrderStateMachine() { this.currentState = State.CREATED; } // 触发事件,更新状态 public void trigger(Event event) { State nextState = TRANSITIONS.get(currentState).get(event); if (nextState != null) { currentState = nextState; } } // 获取当前状态 public State getState() { return currentState; } } ``` 使用示例: ```java OrderStateMachine stateMachine = new OrderStateMachine(); System.out.println(stateMachine.getState()); // CREATED stateMachine.trigger(Event.PAYMENT_RECEIVED); System.out.println(stateMachine.getState()); // PAID stateMachine.trigger(Event.ITEM_SHIPPED); System.out.println(stateMachine.getState()); // SHIPPED stateMachine.trigger(Event.ITEM_DELIVERED); System.out.println(stateMachine.getState()); // DELIVERED stateMachine.trigger(Event.ORDER_CANCELLED); System.out.println(stateMachine.getState()); // CANCELLED ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值