关于订单管理中的拆单一直以来都想写一下,但每次计划写的时候却感觉拆单更多的是在其程序处理逻辑上,想描述清楚或者说其具体的实现还是挺难的,要不就是画个程序处理流程图,与我想表述的又不太一样。 但总是止步不前,永远也弄不出来,利用两天时间整出来这一篇,希望您看过能够清楚拆单是什么,在拆单的流程中系统都做了哪些工作,它的一些规则有哪些等等! 什么是拆单? 在网上购买商品下单成功后,过一段时间再次浏览时,有时会发现你的订单会变成两个或多个,这就是系统做了拆单而导致的。 拆单,就是将一个大的订单依据某些规则的集合,将其分解成两个或多个子订单的过程,原来的订单称之为父订单。 拆单的重要性 通常我们所说的拆单一般情况下是指用户的销售订单,但在实际业务中,拆单情况随处可见,如采购订单的拆分、调拨单的拆分等等。本篇后续都是以销售订单的拆单讲述的,请知悉! 在互联网电商系统中销售订单是与C端用户关联最紧密的,单据量是最大的,是影响用户体验的,且拆单的规则相对来说是比较复杂的。 折单要求数据准确、及时,因为拆单后的子订单是需要流入到仓储进行生产作业的,它会进行拣货、出库、配送等一系统的流程,它也是后续财务系统对账或结算、数据分析的重要数据来源。 拆单的场景 用户在APP等平台下单后,由于商品的库存数量不满足,可能在前端进行拆单,即用户自己选择是否需要拆单,可以按最快送达或最小拆单的规则进行。 看到这里您可能会有点疑惑,库存不足时还能下单吗?现在很多网站上当商品不足时用户需要自行修改数量,然后才能下单。 确实如此,现在这种场景少了,但是有的商家为了提升客户体验,对于商品可以多仓发货时。因为单仓缺货而需要拆单时,由用户来选择决定是否购买,这应该也是为了提高转化率的一种方式。 还有一种场景,订单涉及多商家,需要单独付款的情况下,前端会直接进行拆单,但现在基本上都是合单支付了,这种拆单会使用户体验降低。 此外,有的商家既卖国内商品,也卖海淘商品,如果都混在一块,那么在支付前是需要进行拆单的,因为海淘商品要求用户的身份认证等信息的检验。 在多数情况下,都是用户下单完成后,由系统进行在后台进行拆单,拆单是要结合公司业务场景去考虑的。 用户购买涉及几种拆单 拆单除了以上几种场景,对于用户下单时系统上还会有什么操作吗? 有一种情况即用户下单时系统要根据用户选择的收货地址、商品等信息,判断是否有库存,订单应该归属哪个仓库,是否可以购买等,这个服务严格来讲应该归属于商品库存服务,但是也可以将其称为预拆单。 预拆单一般是调用仓储服务进行库存的判断,同时还要根据促销活动进行一些优惠计算,所有的这些都需要前端系统在处理时对订单商品进行一些标识,以便当用户支付成功后,订单流转到OMS系统进行物理拆单。 前端用户下单成功后,订单经过OMS的拉单服务快速流转到订单中心,便开始订单的再生成过程,订单拆分后的子订单会展示给用户,原订单一般不需要再展示,便于用户跟踪和查看。 所以在从用户角度来看,一种是可以直接看到结果的拆单和一种无感知的预拆单过程。 拆单的时点与地点 预拆单是伴随着购物流程进行的,这里不多讨论,因为这个究竟是否属于拆单也是要看我们如何定义。正常情况下用户选购商品完成后,系统不会拆单,因为用户有可能取消订单或未支付成功。 拆单的时点是要在 "订单支付成功" 后进行,且需要前端订单已经流转到后端生产库,在订单中心进行处理。 在前面有一种场景,如果购物中心不能合并支付时,在购物车中便拆分为几个订单,这时的拆单可以定义为一次拆单,也可以归属于购物流程,因为用户不提交就不会生成订单号,不会保存各个订单的数据。 在用户支付成功后,各个订单同样是要向后台流转,经过拆单服务的处理才可以继续进行下面的生产。 在前面讨论拆单场景时提到一种缺货拆单,这种场景的拆单是在用户下单支付成功后,订单有可能已经拆分为不同的子订单,但因某种原因仓库无货而导致的拆单。 这时拆单的时点是灵活的,一般是在客服系统中,根据用户的反馈确定是否拆单的。 缺货是影响用户体验的,但是缺货是始终客观存在的。 拆单分几级 从上图看,拆单应该为三级,即用户创建的订单为父订单,然后经过拆单服务正常的分为多个子订单为第二级,后续因为缺货等原因子订单再次拆分为子(孙)订单。 在数据设计上,一般情况子订单与父订单的关联都通过ParentID来进行关联,但三级以上时,涉及原始订单的查询较麻烦。 具体看数据结构如何设计了,可以再增加一个原始订单号来记录最初的订单号,方便统计查询等,负责拆单服务的同学可以详细讨论下。 为了避免订单的复杂度及系统的查询、统计、分析等数据处理的难度,订单最好最多到三级,不宜过多。 拆单状态 以前专门梳理过订单状态的文章,详见《订单信息与状态流转看这个应该足够了!》,在拆单过程中也涉及订单状态的变换。 当父订单拆分为子订单后,子订单生效,父订单应该置为无效。 子订单或父订单经过缺货拆单后,原订单状态是无效还是其它? 订单拆单后状态应该置为"待下发"即需要通过下发服务,将订单推送给仓库发货。 如果订单已经下发到仓库后需要缺货拆单,单据状态应保留原状态。 这些都属于细节,但不得不考虑,因为订单的状态涉及到其他业务系统的计算和统计。 如:财务系统在应付报表时是根据支付订单进行统计和对账的,如果订单状态是无效的,那么系统如何获取此部分数据。 BI有些统计分析是按状态和订单数量等进行统计的,如客单价、有效订单数等等。 所以针对拆单而导致的订单状态是否应该区分原有的订单状态分别标识,是需要综合考虑的。 拆单原则 拆单的原因我们已经清楚,拆单的目的是为了保证履单,拆单的原则是什么? 首先是最小拆单原则,即能拆两单,不能拆成三单,因为多拆一单不仅是单据数量的增加,它会增加系统的复杂度,降低用户体验,加大仓库作业量,增加运费费用等。 最快送达原则,拆出的子订单要快速生产,快速送达,这个是增加用户体验的最好办法。但是快速送达,依赖于仓储物流的布局,这个在多仓可以发送到一个城市时尤为重要。 一般情况下,拆单要遵循这两条原则,同时我们也看到拆单服务,是依赖于基础信息配置的,电商系统最复杂的是很多地方都有关联。 拆单规则 拆单的规则因每个公司的业务不同而不同,这里罗列一些常见的规则供参考。 (1)不同商家的订单需要进行拆分 这个主要应用于平台型的电商,一般情况用户购买商品都进入不同的店铺,创建的订单也是归属这个商家的。但有的平台采用合单支付,即用户选购不同商家的商品,但支付是一次的。 这个和淘宝有些不同,淘宝上每个商家的收款账号是不同的,所以不能一次支付,但平台商家是平台代收款的,所以可以一次支付后再拆单分摊金额。 (2)不同仓或不同供应商的商品需要进行拆单 仓库不同订单需要分开,对于不同的供应商订单主要是指由供应商直接发货的订单即商品不存储在仓库,由供应商直送到用户,这个和平台商家类似。但是区别是签署的合同不同,一个是购销合同,一个是佣金扣点合同,细节不展开了,有兴趣可以留言交流。 (3)商品类型不同需要拆单 一般区分奢侈品或有特殊要求的商品,这个需要业务根据商品要求进行设置。因为商品要求不同,后续在物流环节采用的物流产品类型也不同,物流费用也不同。这部分也可以根据商品信息,在仓储进行处理,但最后在上位能够提前区分。 (4)商品温控属性不同要进行拆单 此部分一般是指生鲜电商而言,同一个仓库有常温仓、冷藏仓、冷冻仓,存储着不同的商品,商品的拣货、包装等都有不同的要求,所以需要进行拆单。 (5)大件商品拆单 大件商品与普通商品不同,它在仓库的存储位置、拣货方式、包装、运输都有所区别,所以大件商品需要每一件都拆单,大件商品一般遵循最快送达,不需要最少拆单原因的限制。 (6)根据库存拆单 这个是针对缺货商品进行的拆单,即有库存的一单,无库存的一单,如果是二级订单,则父订单相同,子订单衍生出子订单,子订单1的过程。 (7)线下门店商品不拆单 如果是线下门店购买商品,则不需要拆单。 (8)组合商品不能拆单 在促销活动中,有时会有一些大礼包等商品的组合销售,即A,B,C等商品经过仓库的组合包装后出库,所以针对此类商品不能拆单。 在拆单服务中需要调用物料单信息,进行判断,具体的要看系统如何设计了。 拆单的规则很多,在系统处理时,要依赖于规则设置的优先级来进行。 拆单算法 (1)稀缺商品算法 找所有商品在所有库房最稀缺的商品,获取该商品的阶数。 (2)降阶 找稀缺商品的都需要仓库组合,这些仓库是必须发货的,把这些仓库计入发货列表,这样就降阶了,剩余仓库再计算组合,减少运算数量。 (3)抽屉原理算法 找第一阶的仓库列表(发货量最大的仓库),这个库房的库存是必须要发的,然后再找次发货量最大的仓库,以此类推,用于后面的组合计算。 (4)找组合 按照仓库顺序逐渐增加仓库个数找组合。 算法也只是拆单过程中的一个路径参考,且算法依赖于拆单的规则而制定,无论如何要保证拆单的结果准确,拆单的速度要快。 拆单服务两步重要工作 以上一直在讨论拆单是由1变2,由2变4的一些内容,在具体的拆单服务系统中要考虑哪些内容,又有哪些工作? 前面所说的都应该在设计时考虑,而且最重要的是要依赖规则进行设计,数据的流转,时序等等。 金额分摊是拆单中最重要的一部分工作,也是最复杂的。 父订单的拆分,商品的重新组合,生成新的订单是第一步,第二步就是要将父订单的金额合理的,正确的分摊到各个子订单上。 订单一般分为订单主表和订单商品表、订单支付明细表和订单活动表。 订单金额有几个主要的部分:订单商品金额、折扣金额、礼品卡支付金额、积分支付金额、优惠券支付金额、订单支付金额等几个部分。 运费是订单表中一个特殊字段,运费如何分摊是要特殊考虑的,一般情况是按金额占比进行。所以生成的子订单中各部分金额,也要保证与父订单金额一致。 订单商品表、支付明细表、活动表属于明细信息,要根据原始订单明细表的数据和标识进行计算分摊。 子订单的金额要保证横向、纵向都正确才行,横向是指子单的合与父单金额一致,纵向是指子单订单主表与明细表金额一致。 此外,在金额分摊计算过程有一项重要规则不可避免,即开票金额的考虑。 这部分金额的分摊与公司缴税息息相关,单据与发票要一致,要考虑商品信息、活动规则等等,非常复杂。 有的拆单服务将金额分摊独立出来,以降低对拆单的影响,提高订单流转速度。 拆单的速度要求 由于拆单后订单才会下发到仓储或商家进行生产,所以对于速度要求就是快。 在系统设计时可以依据规则等综合考虑,多线程是最常用的方法,但多线程需要考虑资源竞争和安全性。一般情况,如果下单后已经确定了仓库,那么可以按仓库启动多个服务,这样可以避免程序的难度。 对于拆单和下发在系统上也要有数据监控,不能出现积压的情况。如果拆单有异常时,在定时任务中,很多情况都是依赖一个信息字段的状态来进行循环处理,在服务中要有容错处理,不能一直停滞不前。 拆单的影响 什么是拆单?为什么拆单?如何拆单?前面说了很多,但对于拆单有什么影响呢? 先说一个场景,公司搞促销活动,买A赠B,但A与B商品的温控属性不同,所以用户下单后一定会拆单。 拆单后仓储拣货、发货是根据子订单进行的,很有可能赠品B先发货了,A后发货。用户先收到B签收了,然后A进行拒收或取消。此时,如果在拒收或取消A时不判断关联子订单,那么公司就会损失B。 如果判断关联子订单的状态,那么系统的复杂度将会非常之大,因为实际场景中一个父单拆为多单时是很常见的。 拆单后,子订单数量增加,对于客单价、统计分析等报表需要考虑其影响,维度和统计口径不同,数据结果必然不同,从而会影响到经营分析及决策。 影响,对于不同的业务有不同的理解,作为产品研发应该在拆单设计时还是需要要将利害与业务说清楚,尤其是运营人员(活动方面重点考虑),虽然这属于一个后台服务。 总结 拆单是复杂的,合理的拆单会加快订单的流转,友好的用户体验,过度拆单则会产生冗余的数据,增加订单的复杂关系,统计、计算、售后等各个环节。 以上是我对拆单的一次梳理与总结,感谢您的阅读!