对于‘支付’失败,则要看需求,如果需求要求用户可以继续支付,则订单需要保留,并且状态仍然为‘等待买家付款’,如果不允许再支付,则理论上可以将BizState置为‘支付失败’终态,所以,‘支付失败’的BizState终态也应当记录到OrderState字段中。
对于‘发货’失败、‘收货’失败的情况,通常是不会发生的,即使发生也不属于系统能够控制的范畴,系统记录并无意义,更具建设性的做法是通过线下手段尽快解决问题,重新发货等等,所以对于这些状态系统的OrderState字段不予记录。
这样下来我们的OrderState字典值增加到6个,加粗项为新增:
目前的订单状态流转:
‘action行为’进行中的情况对于action的SubState是‘1进行中’的处理,同样需要具体场景具体分析。‘付款’行为是用户发起的,但是并不是和订单系统之间的交互,涉及到支付系统的处理,这个领域也不是订单系统可控的,但关系到钱,用户比较关系,所以对于这样一个中间态,我们需要记录,以便用户通过订单系统查询订单状态,为便于用户理解,将此状态在OrderState中记为‘付款确认中’;‘发货’‘收货’进行中的情况,不是订单系统可以控制的领域,我们可以把他们当着行为‘未开始’处理,比如‘发货进行中’,订单系统的OrderState值为‘买家已付款’,但给用户看到的提示信息是‘买家已付款,等待卖家发货’,实际上这时候卖家可能正在发货中,但是用户不会去关心到底有没有打包好货物什么的,所以这类‘进行中’状态可以舍弃。这样下来订单系统的OrderState字段又多了一个字典值:‘付款确认中’:
目前的订单状态流转:
‘action行为’未开始的情况忽略所有action的‘0未开始’SubState状态。因为这类SubState对于BizState不会带来变化。
‘评论comment’的处理最后,再来看看‘评论comment’这个action。如果需求上要求:只有买家收货后才能发起‘评论’操作,则可以任务‘评论comment’单向依赖于‘receive收货’行为,那么可以将这个action的subState对应的少量BizState(应当只有‘买家已评论’、‘卖家已评论’状态)纳入OrderState字段统一记录;但是如果需求是:买家在下单后就可以开始评论,比如如果卖家发货慢了,买家可以上去吐槽,那么‘评论comment’就不是单向依赖于‘receive收货’行为了,而是多向依赖于‘pay付款’、‘deliver发货’、‘receive收货’,那么这些actions的subState组合可能性就暴增,BizState的字典取值也会暴增,显然,不应当将这么多的BizState交给OrderState来记录,而应当由一个独立的数据库字段负责记录‘评论comment’的SubState,我们可以将这个字段取名为‘CommentState’(评论状态),它的字典值不多,只有:‘未评论’、‘买家已评论’、‘卖家已评论’;其实,对于前一种需求,也可以不讲‘评论comment’对应的SubState产生的BizState纳入OrderState,因为用户对于评论与否其实并不是那么关心的,也就是说‘评论comment’并不是核心业务流程,为了降低核心业务流程的系统处理复杂度,将其从核心业务流程中剥离出来较好。
综上,我们应当将‘评论comment’对应的BizState独立到一个字段中记录。
‘退货rereturn’的处理再来看看‘退货rereturn’行为对应的BizState的处理。‘退货rereturn’并不是所有订单都会经历的,但是一旦涉及,则‘退货rereturn’在业务流程上必定是单向依赖于单向依赖于‘receive收货’,所以应当将‘退货rereturn’产生的BizState(‘退货中’、‘退货成功’,‘退款失败’和‘未退货’被忽略,见上面解释)纳入OrderState一并记录;这样我们的OrderState有多了两种字典值,这里我们不考虑一个订单中有多种商品的情况,故把‘退货成功'当着终态处理,如果是一个订单多种货物的情况,需要重新仔细分析。加粗项为新增:
目前的订单状态流转:
‘退款refund’的处理
最后来看下‘退款refund’行为对应的BizState的处理。首先,我们需要知道‘退货’和‘退款’是两种不同的业务行为,他们的关系是:通常意义上,‘退货’必然导致‘退款’,但是‘退款’可以没有‘退货’的参与(这里不讨论特殊情况,比如对于虚拟货物来讲,付款成功通常以为着收货成功,这时候就只能是在由‘退货’导致‘退款’),比如电商允许用户付款成功后收到货物前发起‘退款’。也就是说‘退款refund’并不单向依赖于‘退货rereturn’,和‘评论comment’一样是多项依赖,所以,我们可以参考‘评论comment’的处理方式,单独建立一个字段‘RefundState退款状态’记录‘退款refund’产生的BizState,这个状态字段的字典值有:退款中,退款成功。
其他情况考虑