4. 库存分配与锁定:库存实时查询、库存预占与锁定策略、缺货场景下的分配逻辑

库存分配这事儿,说白了就是「谁先抢到,谁先得」的博弈。但现实远比这个复杂。我做了这么多年供应链,见过太多因为库存分配不合理导致的订单超卖、客户投诉、甚至仓库打起来的场面。嗯,今天咱们就聊聊这块硬骨头。

4.1 库存实时查询:别让数据骗了你

很多系统查库存,查的是「账面库存」。但账面库存和实际可卖库存,往往差着十万八千里。我个人习惯,在查询库存时一定要区分三个概念:

  • 物理库存:仓库里真实存在的货。这个数一般不准,因为盘点总有差异。
  • 可售库存:物理库存减去已经被预占、锁定、以及次品、预留的货。这才是你能卖的数。
  • 在途库存:采购了还没到、调拨了还没入库的货。这个能不能卖?我建议谨慎。

核心原则:实时查询时,永远用「可售库存」作为决策依据。账面库存只是参考。

我在项目中遇到过,某电商大促时,系统查出来库存还有500件,结果用户下单后全部超卖。为什么?因为那500件里有300件已经被其他渠道预占了,但查询接口没过滤掉。你想想看,这锅谁来背?

4.2 库存预占与锁定策略:先下手为强

库存预占,就是用户下单后,系统先把货「占住」,防止别人抢走。但什么时候预占?预占多久?这里面门道很多。

我建议分两种场景:

  1. 下单即预占:用户提交订单,立刻锁定库存。适合现货充足、履约确定性高的场景。缺点是如果用户不付款,库存就白白锁着。
  2. 付款才预占:用户付款后,才真正锁定库存。适合预售、高价值商品。缺点是可能用户付了款,库存却被别人抢走了。

我曾经在做一个跨境项目时,采用了「下单预占+30分钟自动释放」的策略。为什么是30分钟?因为统计下来,90%的用户会在30分钟内完成支付。超过30分钟未支付的订单,库存自动释放给其他人。这样既保证了用户体验,又避免了库存浪费。

小技巧:预占库存时,建议在数据库里加一个「预占过期时间」字段。定时任务扫一遍,过期自动释放。别问我为什么知道——我曾经因为忘了加这个,导致一批库存被锁了整整三天。

4.3 缺货场景下的分配逻辑:谁先谁后?

缺货是常态,不缺货才是意外。当库存不够分时,怎么分配?这里我总结了几种常见策略:

策略名称 核心逻辑 适用场景 缺点
先到先得 谁先下单,谁先拿货 通用场景,公平 大客户可能不满
优先级分配 按客户等级、订单金额等分配 VIP客户、大客户优先 小客户体验差
比例分配 按渠道、区域比例分配库存 多渠道、多仓库场景 计算复杂
动态分配 结合预测、库存周转率动态调整 高波动、快消品 需要算法支持

我个人比较推荐「优先级+先到先得」的混合策略。举个例子:

  • 先按客户等级分:VIP客户优先分配,普通客户次之。
  • 同等级内,按下单时间先到先得。
  • 如果VIP客户没抢到,自动降级为普通客户排队。

这样做的好处是,既照顾了核心客户,又保持了基本的公平性。我在一个日化品项目里用过这套逻辑,缺货投诉率下降了40%。

注意:缺货分配逻辑一定要在系统里写死,不能人工干预。否则一旦出现缺货,销售、运营、仓库三方互相扯皮,最后全推到系统头上。我曾经见过一个公司,因为缺货分配规则不明确,三个部门经理在会议室吵了一下午。

4.4 核心逻辑流程图

下面这张图,是我自己总结的库存分配与锁定的核心流程。你看一遍,基本就能理解整个链路了。

库存分配与锁定核心流程 用户下单 查询可售库存 库存充足 预占库存 等待支付 支付成功 锁定库存 库存不足 缺货处理 分配逻辑 先到先得 优先级分配 比例分配

4.5 实战中的避坑指南

最后,分享几个我踩过的坑,希望能帮你少走弯路:

  • 不要依赖缓存查库存:Redis里的库存数据可能延迟,导致超卖。我建议核心库存查询走数据库,缓存只做展示用。
  • 预占和锁定要分开:预占是临时占位,锁定是最终确认。混在一起,一旦订单取消,库存释放逻辑会乱成一锅粥。
  • 缺货时要有「兜底」逻辑:比如自动生成采购单、通知客服、或者给用户发优惠券。别让用户干等着。
  • 日志一定要全:谁、什么时间、预占了哪个SKU、多少数量、订单号是什么。出了问题,查日志是唯一的救命稻草。

我的习惯:每次上线库存分配逻辑前,我都会手动模拟几个极端场景:比如同一秒100个用户抢最后1件库存、比如用户下单后立刻取消再下单。这些边界情况,往往能暴露最隐蔽的bug。

好了,库存分配与锁定这块,核心就是「查得准、占得住、分得清」。你把这三点想透了,系统就不会出大乱子。

专注资料整理