今天来跟大家聊下电商平台里的库存系统,相信大家对库存系统最直观的感受就是商详页上是否显示“加入购物车”或者是“到货通知”。只要能加入购物车就表示有库存,显示到货通知就表示没有库存了,并没有觉得这里面有多么的复杂。今天来跟大家一起解密下库存系统,来看一看是不是真的如大家想象中那么的简单。
库存系统的作用是什么?
最重要的作用就是管理好各个商品的实时库存数据,及时告诉用户当前商品是否可以购买?还可以购买几件。
为了能够更清楚的介绍库存系统是如何管理商品库存数据的,这里需要先简单给大家介绍另外一个系统,叫做仓库系统。估计很多人分不清仓库系统跟库存系统之间的关系是什么?
仓库系统实际真正管理的是物理仓库里面的库存的数量。我们经常听说的京东亚洲一号仓等等这些大型的仓库,由于面积非常大,里面的商品数量也很多,所以需要有一套系统来帮助管理实体仓里面的库存的数量。
简单来说就是管理这个仓库一天有多少商品进入到这个仓库里面来,每个商品的数量有多少?每天从这个仓库发出去多少个商品?仓库里面每个商品还剩下多少?剩下的这些商品分别存储是仓库的哪个储位上等等。
那么有了仓库系统就可以管理商品的数量,那么为什么还要有库存系统呢?
下面给大家举个例子,让大家了解下仓库系统和库存系统之间的区别是什么?当某个商品A在仓库里面有10个数量的时候,仓库系统负责管理这个商品A的数量,以及它的位置信息。那么仓库里面这个商品A在网站上是不是一定可以允许卖10个呢?这是不一定的。因为仓库里面有10个商品A,可能网站上已经有3个被用户买掉了,只不过这3个商品还没有出库,所以在仓库系统里面看这个商品A目前还有10个在仓库,但实际上已经卖掉3个,网站上其实只能卖7个,这种可卖的数量仓库系统是区分不出来的,它只是负责管理在当前时刻仓库里面一共有多少库存,并不区分商品的状态信息。所以库存系统主要是用来解决这个问题,经过一系列的计算告诉用户当前时刻商品A一共还可以买几个。仓库系统管理的是仓库里面商品的实际数量,库存系统管理的是商品的可销售数量,这就是库存系统和仓库系统主要的区别。
在电商网站的商详页上展示当前商品可售卖数量对库存系统来说是相对比较简单的,有货的时候显示当前商品的数量,没货的时候告诉前端此商品库存为0,前端展示到货通知,如下图:
![4e76d30a027e758fad143d69a5e85bd4.png](https://i-blog.csdnimg.cn/blog_migrate/b576ae0288f95124f08165dd2bd2f6e9.jpeg)
库存跟仓库系统之间的交互
比较复杂的是如何对接仓库的各种出入库事件来管理商品的数量。下面来跟你介绍一下库存跟仓库系统之间交互的几个比较重要的事件。
采购入库
当B2C电商网站类似京东、当当这种想卖一个商品的时候首选要发起采购计划,这时候需要在仓库系统里面建立一个采购单。目的是记录哪个商品采购了多少数量,将会把这批货采购到哪个仓库里面去。
采购单发起之后过一段时间实际的商品会入库。这时候仓库系统会把相应的商品数量进行更改。这个时候仓库系统同时会通知库存系统,告诉库存系统某个商品入库了,数量是多少,库存系统会把相应的数量加上。
![608be21a05bebb4682cf69d2ced4a64b.png](https://i-blog.csdnimg.cn/blog_migrate/be4b9d20dae9619b9a47627c40df89f5.jpeg)
采购入库时序图
下单锁库存
商品采购入库之后库存系统就会增加相应的数量,这时候在网站端这个商品就可以开始卖了。当有人购买这个商品的时候,库存系统会将这个商品数量先锁定。然后等待仓库出货。当仓库真正出货的时候,库存系统才会将相应的数量减掉。这里解释下库存系统为什么要有一个锁定的状态?
还是举个例子来说。当一个手机A采购入库10个的时候,库存系统也会显示这个手机在库存系统里面有10个数量。也就是说网站上可以销售的数量为10。
![f40588c51878bcde9a3d7210f4cfbbb1.png](https://i-blog.csdnimg.cn/blog_migrate/59b98b669c53b59c13ec665cb4b9bf93.jpeg)
当一个用户买了一个手机A的时候。库存系统会将这个商品先锁定一件。表示有一个商品已经有人付钱要进行购买了,这个时候库存系统会告诉网站端此商品目前能购买的数量为9个。
![b8e1a97a8bc3bab56c2eadd72bb9cacc.png](https://i-blog.csdnimg.cn/blog_migrate/bb8c31ba7427a5d3d30772c609a93c8b.jpeg)
订单取消解锁库存
当用户下了单买了手机A之后,过了一会可能由于种种原因后悔了,或者是不想买了或者是想换一个更好的手机,这个时候用户会将这个订单取消掉。在仓库没有将这个手机发出去之前用户是可以取消的,这个时候我们需要将刚刚锁定的数量解锁掉,变化后的库存数量如下:
![f40588c51878bcde9a3d7210f4cfbbb1.png](https://i-blog.csdnimg.cn/blog_migrate/59b98b669c53b59c13ec665cb4b9bf93.jpeg)
出库扣库存
如果上面用户没有取消订单,那么仓库里面的工作人员将这个商品找到、打好包裹、寄出去之后,仓库系统会通知库存系统这个手机已经出库,这个时候库存系统需要将数量减少,具体变化如下:
![95592e142f8d6d544f6431272a3fd4f7.png](https://i-blog.csdnimg.cn/blog_migrate/c61526acac385c772948ec3e044df907.jpeg)
仓库的实际数量变为9,锁定数量变为0,可售卖的数量仍然为9。
仓库间调拨
这个纯属电商仓库管理的后台流程,普通用户是感知不到的,稍微大一点的商家或者自营平台,类似京东、苏宁这种自建仓库的平台商家都会有很多个仓库分布式在全国各地,商品也是有一定规则的分布在各个仓库一定的数量,当用户下单的时候尽量从离用户最近的仓库发货,这样速度比较快并且距离也比较短,物流成本也比较低。但实际上会由于各种原因导致某些商品库存数量分配的并不是很合理,可能南方的仓库已经卖没了,北方的仓库还积压很多没卖出去,这个时候为了让商品尽快的卖出去,需要将这个商品从北方的仓库调拨到南方的仓库,这就是调拨的业务场景。
可以看到调拨是一个商品在两个仓之间的周转,这就为管理增加了难度,完成一次调拨有三个步骤:发起调拨申请、调拨出库、调拨入库。
发起调拨申请:当决定把商品A从北方仓调拨到南方仓的时候,首选需要发起一个申请,表示哪个商品从哪个仓调拨到哪个仓,调拨的数量是多少。
为了方便大家理解,我们举个例子,将商品A从北方仓调拨到南方仓100个。当发起调拨申请的时候,库存系统会先在北方仓锁定100个商品A的数量。库存的变化如下:
![3435d59c3d050edea4d58258560d2c44.png](https://i-blog.csdnimg.cn/blog_migrate/723584f1309adc2515c0e5eff0955a0c.jpeg)
发起调拨前
![64cfec37b4dc3a68ee439e097e232a90.png](https://i-blog.csdnimg.cn/blog_migrate/2b15ad56d80894427d70890139d71412.jpeg)
发起调拨后
看到这里有同学会奇怪为什么发起调拨的时候也要先将调拨数量进行锁定,因为如果不进行锁定的话极端情况下北方仓的这个商品可能突然就卖掉了950件,这时候仓库只剩下了50个,仓库就没有办法进行100个商品的调拨,会影响商家的整体统筹安排,所以需要在发起调拨的时候预先锁下,保证调拨可以正常进行。
调拨出库:即当A商品从北方仓出库的时候,这个时候我们需要将库存数量进行相应的调整,调整后数量如下:
![2fcdbeb9f348b2c8edc4259e028f477e.png](https://i-blog.csdnimg.cn/blog_migrate/700b1deabd11842b27411ba0696586cd.jpeg)
将北方仓的实际库存数量和锁定数量都减掉100,可销售的数量仍然是900。
调拨入南方仓
在这100个商品进入到南方仓之前,我们看下南方仓的库存数量,如下:
![adba843c760eaaa41236bdbb88f86466.png](https://i-blog.csdnimg.cn/blog_migrate/c3bd13abb3daf60b7b87008797fad58c.jpeg)
当这个100个单品进入到南方仓之后,南方仓这个商品的数量会进行调整,如下:
![1ae1b0f588c23c4ab6e5aabbfaf2d606.png](https://i-blog.csdnimg.cn/blog_migrate/4349f16c398f3b7368e2f022cc312d89.jpeg)
实际数量和可售卖数量都变成了100。
至此我们完成了一次完成的调拨流程。这里面大家可以看到,其实库存与仓库之间交互的事件比较多,逻辑也比较复杂。上面只是简单列举了几个比较核心的流程。实际生产中还有很多更细节的事件需要管理。例如,退货的流程、换货的流程、损益的流程等等。如果任何一个地方出现误差,就会导致仓库的数量与库存的数量不一致。
如果出现不一致,那就是库存系统的最大失败,库存系统就是用来管理库存的,这就是它的职责。但是实际业务中由于复杂的逻辑会出现一部分商品库存管理出现错误,这时候会导致两种后果,一种是仓库系统明明只有5个商品,库存那边计算成了10个。这样可能会有10个用户来购买,但是仓库只有5个,会导致有5个用户的商品不能发货,这就是我们所谓的超卖。这种是比较严重的后果,用户的体验非常不友好。另外一种情况是仓库里面还有10个商品,但是库存系统计算成只有5个,这样会导致商品少卖会造成商品在仓库的积压。所以仓库跟库存还有一个比较重要的逻辑就是对账每天都要核对一下两边的库存数量是否一致。
上面跟大家介绍了下库存系统的大体业务逻辑,相信已经有不少人已经看晕了,后面再找时间跟大家介绍下如此复杂的库存系统是如何实现的?这里需要解决的问题是如何保数据一致性?跨库的事务如何解决?采用什么样的策略进行补偿?对账如何做?商详的请求量比较大,如何保证库存的性能?等等。有好的方案欢迎留言讨论。