电商技术解密之库存系统
今天来跟大家聊下电商平台里的库存系统,相信大家对库存系统最直观的感受就是商详页上是否显示“加入购物车”或者是“到货通知”。只要能加入购物车就表示有库存,显示到货通知就表示没有库存了,并没有觉得这里面有多么的复杂。今天来跟大家一起解密下库存系统,来看一看是不是真的如大家想象中那么的简单。
库存系统的作用是什么?
最重要的作用就是管理好各个商品的实时库存数据,及时告诉用户当前商品是否可以购买?还可以购买几件。
为了能够更清楚的介绍库存系统是如何管理商品库存数据的,这里需要先简单给大家介绍另外一个系统,叫做仓库系统。估计很多人分不清仓库系统跟库存系统之间的关系是什么?
仓库系统实际真正管理的是物理仓库里面的库存的数量。我们经常听说的京东亚洲一号仓等等这些大型的仓库,由于面积非常大,里面的商品数量也很多,所以需要有一套系统来帮助管理实体仓里面的库存的数量。
简单来说就是管理这个仓库一天有多少商品进入到这个仓库里面来,每个商品的数量有多少?每天从这个仓库发出去多少个商品?仓库里面每个商品还剩下多少?剩下的这些商品分别存储是仓库的哪个储位上等等。
那么有了仓库系统就可以管理商品的数量,那么为什么还要有库存系统呢?
下面给大家举个例子,让大家了解下仓库系统和库存系统之间的区别是什么?当某个商品A在仓库里面有10个数量的时候,仓库系统负责管理这个商品A的数量,以及它的位置信息。那么仓库里面这个商品A在网站上是不是一定可以允许卖10个呢?这是不一定的。因为仓库里面有10个商品A,可能网站上已经有3个被用户买掉了,只不过这3个商品还没有出库,所以在仓库系统里面看这个商品A目前还有10个在仓库,但实际上已经卖掉3个,网站上其实只能卖7个,这种可卖的数量仓库系统是区分不出来的,它只是负责管理在当前时刻仓库里面一共有多少库存,并不区分商品的状态信息。所以库存系统主要是用来解决这个问题,经过一系列的计算告诉用户当前时刻商品A一共还可以买几个。仓库系统管理的是仓库里面商品的实际数量,库存系统管理的是商品的可销售数量,这就是库存系统和仓库系统主要的区别。
在电商网站的商详页上展示当前商品可售卖数量对库存系统来说是相对比较简单的,有货的时候显示当前商品的数量,没货的时候告诉前端此商品库存为0,前端展示到货通知,如下图:
库存跟仓库系统之间的交互
比较复杂的是如何对接仓库的各种出入库事件来管理商品的数量。下面来跟你介绍一下库存跟仓库系统之间交互的几个比较重要的事件。
采购入库
当B2C电商网站类似京东、当当这种想卖一个商品的时候首选要发起采购计划,这时候需要在仓库系统里面建立一个采购单。目的是记录哪个商品采购了多少数量,将会把这批货采购到哪个仓库里面去。
采购单发起之后过一段时间实际的商品会入库。这时候仓库系统会把相应的商品数量进行更改。这个时候仓库系统同时会通知库存系统,告诉库存系统某个商品入库了,数量是多少,库存系统会把相应的数量加上。
采购入库时序图
下单锁库存
商品采购入库之后库存系统就会增加相应的数量,这时候在网站端这个商品就可以开始卖了。当有人购买这个商品的时候,库存系统会将这个商品数量先锁定。然后等待仓库出货。当仓库真正出货的时候,库存系统才会将相应的数量减掉。这里解释下库存系统为什么要有一个锁定的状态?
还是举个例子来说。当一个手机A采购入库10个的时候,库存系统也会显示这个手机在库存系统里面有10个数量。也就是说网站上可以销售的数量为10。
当一个用户买了一个手机A的时候。库存系统会将这个商品先锁定一件。表示有一个商品已经有人付钱要进行购买了,这个时候库存系统会告诉网站端此商品目前能购买的数量为9个。
订单取消解锁库存
当用户下了单买了手机A之后,过了一会可能由于种种原因后悔了,或者是不想买了或者是想换一个更好的手机,这个时候用户会将这个订单取消掉。在仓库没有将这个手机发出去之前用户是可以取消的,这个时候我们需要将刚刚锁定的数量解锁掉,变化后的库存数量如下:
出库扣库存
如果上面用户没有取消订单,那么仓库里面的工作人员将这个商品找到、打好包裹、寄出去之后,仓库系统会通知库存系统这个手机已经出库,这个时候库存系统需要将数量减少,具体变化如下:
仓库的实际数量变为9,锁定数量变为0,可售卖的数量仍然为9。
仓库间调拨
这个纯属电商仓库管理的后台流程,普通用户是感知不到的,稍微大一点的商家或者自营平台,类似京东、苏宁这种自建仓库的平台商家都会有很多个仓库分布式在全国各地,商品也是有一定规则的分布在各个仓库一定的数量,当用户下单的时候尽量从离用户最近的仓库发货,这样速度比较快并且距离也比较短,物流成本也比较低。但实际上会由于各种原因导致某些商品库存数量分配的并不是很合理,可能南方的仓库已经卖没了,北方的仓库还积压很多没卖出去,这个时候为了让商品尽快的卖出去,需要将这个商品从北方的仓库调拨到南方的仓库,这就是调拨的业务场景。
可以看到调拨是一个商品在两个仓之间的周转,这就为管理增加了难度,完成一次调拨有三个步骤:发起调拨申请、调拨出库、调拨入库。
发起调拨申请:当决定把商品A从北方仓调拨到南方仓的时候,首选需要发起一个申请,表示哪个商品从哪个仓调拨到哪个仓,调拨的数量是多少。
为了方便大家理解,我们举个例子,将商品A从北方仓调拨到南方仓100个。当发起调拨申请的时候,库存系统会先在北方仓锁定100个商品A的数量。库存的变化如下:
发起调拨前
发起调拨后
看到这里有同学会奇怪为什么发起调拨的时候也要先将调拨数量进行锁定,因为如果不进行锁定的话极端情况下北方仓的这个商品可能突然就卖掉了950件,这时候仓库只剩下了50个,仓库就没有办法进行100个商品的调拨,会影响商家的整体统筹安排,所以需要在发起调拨的时候预先锁下,保证调拨可以正常进行。
调拨出库:即当A商品从北方仓出库的时候,这个时候我们需要将库存数量进行相应的调整,调整后数量如下:
将北方仓的实际库存数量和锁定数量都减掉100,可销售的数量仍然是900。
调拨入南方仓
在这100个商品进入到南方仓之前,我们看下南方仓的库存数量,如下:
当这个100个单品进入到南方仓之后,南方仓这个商品的数量会进行调整,如下:
实际数量和可售卖数量都变成了100。
至此我们完成了一次完成的调拨流程。这里面大家可以看到,其实库存与仓库之间交互的事件比较多,逻辑也比较复杂。上面只是简单列举了几个比较核心的流程。实际生产中还有很多更细节的事件需要管理。例如,退货的流程、换货的流程、损益的流程等等。如果任何一个地方出现误差,就会导致仓库的数量与库存的数量不一致。
如果出现不一致,那就是库存系统的最大失败,库存系统就是用来管理库存的,这就是它的职责。但是实际业务中由于复杂的逻辑会出现一部分商品库存管理出现错误,这时候会导致两种后果,一种是仓库系统明明只有5个商品,库存那边计算成了10个。这样可能会有10个用户来购买,但是仓库只有5个,会导致有5个用户的商品不能发货,这就是我们所谓的超卖。这种是比较严重的后果,用户的体验非常不友好。另外一种情况是仓库里面还有10个商品,但是库存系统计算成只有5个,这样会导致商品少卖会造成商品在仓库的积压。所以仓库跟库存还有一个比较重要的逻辑就是对账每天都要核对一下两边的库存数量是否一致。
上面跟大家介绍了下库存系统的大体业务逻辑,相信已经有不少人已经看晕了,后面再找时间跟大家介绍下如此复杂的库存系统是如何实现的?这里需要解决的问题是如何保数据一致性?跨库的事务如何解决?采用什么样的策略进行补偿?对账如何做?商详的请求量比较大,如何保证库存的性能?等等。有好的方案欢迎留言讨论。
相关阅读
本文由 @Nicole 原创发布于人人都是产品经理。未经许可,禁止转载。
在库存调拨的时候有一个漏洞,在商品调拨入库前,货品的跟踪处于系统监控的真空状态。在北方仓出库后,在南方仓入库前这批货物在两个仓库系统之间都没有数据可以查阅到这批货物,这对商品的盘点是不利的。所以个人认为在库存系统中需要有在途库存这个状态。
在南方入库前,北方的锁定的100货就是这批货物;当南方入库后,锁定的100件或释放为0,南方的库存为100;每个过程,肯定是能查阅到这批货的。
你没仔细看文章和我的回复哦~
我明白你的回复,是我想的有问题 😆 对于北方已经出库了,南方还未入库的货物在途过程是必须要监控的。
哈哈,研发库存和采购系统时的一点经验。欢迎交流,互相学习。
我们应该是同一行业的 🙂
这些应该属于WMS的范畴了吧
请问下下面这些问题有相应的介绍吗:复杂的库存系统是如何实现的?这里需要解决的问题是如何保数据一致性?跨库的事务如何解决?采用什么样的策略进行补偿?对账如何做?表示帮助很大,希望老师能发更多的讲解
还好做过ERP的实施
还好自己开过天猫,能理解 😐
还好有基础,提到的这些都能够理解看明白。 😐
写的很棒,知道商品库存是怎么减的,又是什么时候锁的了,这几个问题好想知道,希望作者慷慨发表哦!“复杂的库存系统是如何实现的?这里需要解决的问题是如何保数据一致性?跨库的事务如何解决?采用什么样的策略进行补偿?对账如何做?商详的请求量比较大,如何保证库存的性能?”
退货是否需要退回库存呢?
退货一般分很多种情况,在不影响二次销售(也就是七天无理由退换货)这种情况,是直接入库操作的,下次正常销售,但是如果影响二次销售的,存在质量问题的情况,又会有很多种处理方式,例如返厂维修、转二手商品出售…….
产品小白,能否解答下赠品出库这一块的逻辑呢?
作者什么时候能再来一篇库存管理如何实现的文章。这篇文章收获颇丰,但是意犹未尽。另外 有个问题,下面有个朋友说 出库减库存是个坑,他们采用下架减库存。请问下,为什么出库减库存是坑呢?具体的场景能帮忙介绍下吗?
实际上库存锁也是有 A 锁,B 锁,也就是预锁/正式锁的区分的,当然就是对锁的状态进行细分,这样的话可以更详细区分业务场景,和数据统计分析的有效性,当然这个也增加了系统和流程的复杂性,双刃剑也是没办法的。
出库减库存也是一个坑,我们设计的是上架加库存,下架减库存
出库减库存为什么是坑,能详细解释下吗 谢谢
这个是什么逻辑,上架加库存,下架减库存?你这样真的是实际库存吗?你这个最多只是可卖商品数;
下架减库存不合理,实际下架的商品还在仓库内,处于出库中状态,如果遇到取消订单或者其他需要调用这批货的情况就很难处理了
两个系统有点类似会计上的权责发生制与收付实现制
建议建立电商产品经理微信群,我也是电商产品经理,最近做erp
有联系方式吗?
群有了吗?这个真的可以有,涉及到仓储、库存,学问太大,大家可以相互交流各自经验。
喜欢这种介绍实质业务处理的文章,想入门想了解,就是要通过这些才行。
在调拨那块必须加上在途这么一种状态,不然你在货物从北仓到南仓的这段时间岂不是消失了。影响整体库存不说,对财务也是一种误导,一般库存都是和财务有直接关联的,这种仓库之间的调拨也不是常规出库。
恩,看来你是行家,实际是有调拨在途,包括采购在途的。我为了让大家更好理解,没写这块,加上在途的话逻辑更复杂了。
感谢查漏补缺
在途本身来说不算消失,整体计算的时候可以计算为在库,因为不会发生库存移动单价变化。
库存最重要的功能就在于管理货物状态,通过货物的状态去控制前台商品是否可以销售(在途一般情况下是不可销售,单库存可见),同时货物状态的改变也会触发财务系统对接的部分功能(应收、应付),库存不单单是用来做货物数量统计作用。
不错。
商品的状态是需要定义的,不同的操作状态也会自动变更,并与其它系统如财务、采购、物流等产生交互,不仅仅是入库、出库等状态。