本文主要对电商平台的订单系统相关库存逻辑进行了详细的阐述,一起来文中看看~
一、库存的概念
电商的业务场景中订单的流程常常伴随着库存的变化;对于erp来说,库存可能涉及入库、出库、分库等操作,这里暂且不讨论erp中库存的处理逻辑,主要就电商平台的订单系统相关库存逻辑进行说明。
冻结库存指:订单临时占用的库存,冻结库存可以根据订单取消或发货等情况进行释放;
可用库存指:即总库存-冻结库存,一般指在前端显示且用户可下单的最大数量。
库存的使用场景:
运营活动:特价商品活动需要占用一定的库存,以保证能有充足的库存支撑活动的进行;
赠品库存:如果把赠品当做一款SKU的情况下,即和正常下单路径一样,当把赠品单独出来的情况下,需要设置赠品库存(在我们的业务系统中,赠品由商家手动添加并设置库存),同时需要建立一套单独的库存处理体系。
二、常规订单流程中库存的处理
总库存的数量可以同步ERP或人工设置,人工设置的情况下,供应商点击“确认发货”后减少,退款时若订单已发货则供应商点击“同意退款”/系统自动同意退款则增加,退货时供应商点击“确认收货”/系统自动确认收货则增加。
同步ERP数据的条件下,总库存可以不受订单状态的影响(值得注意的是:如果在ERP系统中,确认发货的节点和扣减总库存的节点存在时间差的情况下,这个时间段,实际上会造成系统已扣减冻结库存了,但是ERP总库存不变,所以会造成可用库存短时间偏大),也可以先扣减/增加总库存,因为总库同步肯定会覆盖之前修改后的数量。
冻结库存在用户从app下单时增加,在供应商确认发货/取消订单时减少,“待发货”的订单申请退款成功则减少。
另外,取消退款和退款失败的情况下,对库存无影响。
结合订单流程的中各个节点进一步说明:
用户下单:下单时由于订单生成之后需要预定一定的库存,保证该订单能发货,所以需要增加对应商品的冻结库存;这里需要注意的是,不同的业务场景对于增加冻结库存的节点定义不一样。
一般来说在两个节点考虑增加冻结库存:一个是在生成订单时,一个是在付款成功时。
对于库存有限,时间紧迫的下单场景来说(比如:秒杀),在付款成功的时候增加冻结库存会比较合理,因为未付款的订单会影响到其他人购买这款商品。但对于常规场景来说,在生成订单时占用库存会比较好,否则会影响用户的下单体验(但是一定要有系统自动取消订单的功能以释放冻结库存)。
确认发货:确认发货的动作可以是ERP订单出库的时候自动确认发货,也可以是手动确认发货。无论哪种场景,只要触发发货动作的话,均需扣减总库存,同时扣减冻结库存。若ERP自动同步总库存的情况下,则ERP中会扣减总库存并自动同步至系统。
取消订单:首页,在我们系统中定义在付款成功之前可以取消订单,取消订单的时候需要扣减冻结库存(即去除库存的占用)。
申请退款:若系统定义为商品付款后,发货前可以申请退款的情况下,退款成功则需要扣减冻结库存(商家操作“同意退款”或系统超时自动审核)。
申请退货:若系统定义为商品发货后,可以进行申请退货的情况下,退款成功且供应商已收货的情况下需要增加总库存(商家操作“确认收货”或系统自动确认收货),若ERP自动同步库存的情况下,则ERP中会增加总库存并自动同步至系统。
附:下单流程图
实际做法:由于在数据库中没有活动库存这个字段,导致原公式:可用库存=总库存-冻结库存,无法统一修改;在实际开发中冻结库存=普通商品冻结库存+活动库存之和,另外活动库存仍将保留在活动表中,活动表中包括字段活动库存,活动已用库存。
特价商品在设置活动时,可设置活动库存,目的为限制本商品以特价销售的数量(设置的活动库存不能大于总库存),同时也保证参加活动的商品的数量,超出活动数量的商品(活动库存用光的时候)将以原价购买。
2. 数据库库存相关字段
商品表相关字段:总库存、冻结库存;活动表相关字段:活动库存、活动冻结库存。
(实际上在我们开发过程中,由于初期数据库设计未能考虑到后面的拓展性,页面取数据的时候,普通商品可用库存=总库存-冻结库存,到后面增加促销活动时,这个公式若需要变动则影响太大了。所以我们保持原来的公式不变,让冻结库存=普通商品冻结库存+活动库存之和,这个问题凸显了技术架构的重要性。)
3. 下单过程中的库存逻辑
活动创建成功,则对应的商品需将活动库存A件从总库存B件中间分出 ,此时普通商品可用库存为(B-A)件,特价商品活动可用库存为A件。
用户下单时,以活动价购买商品C件,则普通商品可用库存仍为(B-A)件,特价商品可用库存为(A-C)件,活动冻冻结库存为C件。
活动库存不足/超出限购数量时,下单D件,其中以特价购买的为D1件,以普通价购买的商品为D2件。则普通商品可用库存为(B-A-D2)件,普通商品冻结库存D2件,特价商品活动可用库存为(A-D1),活动冻结库存为D1件。
当特价商品可用库存不足时,特价商品售完,所有商品都以普通价购买。当活动期间若有订单取消或退款、退货,则活动库存重新>0时,可继续以剩余的数量按特价购买商品。
活动商品售出之后,增加活动冻结库存,活动有效期间取消订单/退款成功则减少活动冻结库存;普通商品的库存不受影响,但是特价商品的可购数量需要增加/减少。
活动中若ERP由于发货需要调整冻结库存和总库存,此时不管发货的是不是特价商品,都是直接扣减冻结库存和总库存(因为ERP没有分库而且库存自动同步的情况下,总库存一定会减少,那边此时也需要扣减冻结库存保证普通商品的可购数量保持不变,而活动商品的库存不需要处理)。
活动结束:如活动库存100件,卖了20件,则将该商品的活动库存清零,且活动冻结库存的数量合并到冻结库存后活动冻结库存也清零。最终冻结库存加20,此外由于活动库存变小,普通商品可用库存也变大(等于是把活动库存没用完的还回去)。
四、赠品库存的处理
赠品库存基于我当前的业务系统情况进行说明,我们目前的赠品总库存及赠品活动库存都是在后台手动设置的,所以是一套单独的逻辑。
赠品表相关字段:赠品总库存,赠品活动库存可用;活动表相关字段:赠品活动库存,赠品已用库存;
赠品总库存可人工设置,每个使用赠品的活动都会设置对应的赠品活动库存。赠品活动库存可用=赠品总库存-赠品活动库存之和。(注意这个赠品库存可用,是指在后台添加赠品活动时可以设置的最大活动库存数量)
购买商品时,所送的赠品不能大于赠品活动库存;赠品活动库存不够送的情况下,要友好提示客户。当提交订单后,若有送赠品,则自动扣减对应的赠品活动库存和赠品总库存。
活动有效期间,取消订单/退货,退款审核通过则自动增加赠品活动库存和赠品总库存;活动失效后,取消订单/退货,退款审核通过则自动增加赠品总库存。活动失效时,对应的赠品活动库存清零。
五、前端库存展示
按正常逻辑:如果商品不存在特价/秒杀活动的情况下,直接以普通价购买,显示普通商品可用库存即可;如果商品存在秒杀/特价活动的情况下,应该要显示活动商品的库存。
但是存在一种情况就是购买的一批商品中部分商品需要按照活动价算,剩余商品按照普通价算,那么这时候取普通商品可用库存/活动商品可用库存都是不对的。