AMZ123跨境卖家导航
拖动LOGO到书签栏,立即收藏AMZ123
首页跨境头条文章详情

从销售订单到销售出库单:库存锁定、释放与扣减的那点事

21
2025-12-16 08:07
2025-12-16 08:07
21

想系统掌握亚马逊广告的投放逻辑与底层闭环?点击免费学习《亚马逊广告基础逻辑》

最近在做库存模块重构的时候,我遇到了一个之前想当然认为"就应该那样做"的问题。仔细琢磨之后,发现自己可能把事情想得太简单了。

在之前做海外仓OMS和WMS的时候,我们通常会采用"一张单走到底"的方式——这张单在创建或审核时先锁定库存,等到确认出库时再扣减库存。在库存流水的处理上,一般会这样做:锁定库存时写一条流水;真正扣减库存前,先写一条释放库存的流水;最后再写一条扣减库存的流水。整体下来就是三条流水。

这种模式比较好理解:我先占用库存,用完之后释放,再正式扣减,整个流程虽然会有些冗余,但逻辑是自洽的,而且所有动作都围绕同一张单据。

但这次刚好要在ERP中新增一个组织间交易、触发自动转卖的业务,我突然发现如果采用这种设计方式,库存流水数据会虚增很多,后续对库存流水排查、对账的时候就会麻烦很多。

于是我开始思考:之前的想法是不是有问题?

我把这个前因后果和纠结的点一起发给了AI,得到了一些解答,对这个问题的理解也有了不一样的视角。接下来,就跟大家分享一下这件小事背后容易被忽略的业务知识,以及我最终更倾向的方案是哪个。

一、库存数量类型的拆分

大多数供应链类系统在设计库存模块的时候,会基于库存的不同用途对库存数量进行拆分,通常会拆分成3类:

字段
含义
举个例子
在库数量
仓库里真实存在的货,On-hand
仓A里某SKU现在有100件
锁定数量
已经被某张单据"占住"但还没出仓的数量
其中30件被某张销售订单锁定了
可用数量
还能分配给新订单的数量
当前还能再接70件新订单

背后的数量计算公式是:可用数量 = 在库数量 - 锁定数量

二、我纠结的问题

业务在ERP里下了一张销售订单(SO),然后ERP会把SO推给WMS执行出库作业。仓库可能会基于不同的发货要求多次回传结果,此时一张SO可能被拆成好几次发货,在ERP中生成多个销售出库单。

一般来说,在SO创建的时候会对库存进行锁定,以防止库存被其他单据占用。当后面ERP收到了仓库出库回传的数据之后,会生成对应的销售出库单去扣减库存。

此时,我们就会面临一个问题:销售出库单出库扣减库存的时候,是先把SO的锁定释放掉、再重新扣一遍可用库存,还是直接消耗掉SO已经锁定好的那部分?也就是应该选择写入3条库存流水,还是写入2条库存流水?

这个问题听起来好像很简单,就是一个二选一的问题。但仔细琢磨一下,库存流水随着单据的日积月累会逐步变得庞大,如果这里不仔细想清楚背后的细节,后面可能就会欠下一些没必要的技术债务。

三、市面上常见的三种做法

我把这个问题丢给了几个AI,也翻了一些主流ERP的帮助手册和产品介绍,发现大概的做法有这么三种。

第一种:SO不锁定,出库时才扣

这是最"乐观"的做法。销售订单只是记录客户需求,不在库存层面做任何动作,等到仓库真正发货、出库单过账时,才一次性把在库和可用都扣掉。这种做法实现最简单,很多早期的小系统都是这么干的。但问题也很明显:在稍微有点并发或者业务单量的时候就会出现问题——前面的订单还没发货,后面的订单已经把货"抢"走了。系统层面显示有货,业务现场却"无货可发"。本质上就是没有"占坑"机制,谁先发货谁拿货,先下单的反而可能被后下单的截胡。

第二种:SO锁定,出库时"先释放再扣减"

这种做法在创建SO的时候需要锁库存。SO创建时,先做一笔锁定(锁定+N、可用-N、在库不变);等到出库单发货时,先把这笔锁定释放掉(锁定-N、可用+N),然后再从可用里扣减一次(在库-N、可用-N)。表面上看,账还是能算平的。但这里有一个隐蔽的风险:在"释放"和"扣减"这两个动作之间,可用库存会被短暂放大。在单机小系统里,这个时间窗口可能只有几毫秒;但在多服务、多线程的环境下,就有机会被别的请求插队,去占用那一瞬间"看上去多出来的可用库存"。这是一种隐蔽的超卖风险

第三种:SO锁定,出库时"直接消耗锁定"

这是我更建议选择的方案。SO在创建或审核时就锁定库存,只影响锁定和可用,不动在库(锁定+N、可用-N、在库不变)。后续出库单发货过账时,不把这部分库存"放回公共池",而是直接去消耗SO阶段形成的锁定——在同一个事务里同时减少在库和锁定(在库-N、锁定-N,可用不变)。换句话说,这部分货从一开始就被SO"认领"了,出库单只是把它从"锁定"状态变成"已发货"状态,中间不会再回到可用库存里兜一圈。

四、简单的案例推演说明

光讲概念可能还是有点抽象,我们用一个具体的数字例子来推演。在开始之前,先用一个流程图把整条链路串起来:

这个图展示的是上面提到的第三种方案(直接消耗锁定)的核心逻辑。SO锁定库存时,只影响锁定和可用,不动在库;出库单发货时,同时减少在库和锁定,可用通过公式自然维持;如果订单取消,就把锁定释放回可用池。

假设某个SKU在仓库A的初始状态是:在库100、锁定0、可用100。现在有一张SO要占用30件,最终会拆成两张出库单分别发20和10。

第一步:SO审核通过,锁定库存30件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
SO锁定30
100→100
0→30
100→70

这一步的本质是:把未来一定要发的30件从可用池里"挑"出来,打上"订单锁定"的标签。仓库地面上什么都没发生,所以在库不变;但从此以后,新订单进来时只能看到70件可用库存了。

第二步:第一张出库单发货20件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
出库20
100→80
30→10
70→70

注意看,可用库存是没有发生变更的。这是因为可用在SO锁定那一步就已经被用掉了,发货只是把锁定变成已出库,不再额外影响可用。

第三步:第二张出库单再发10件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
出库10
80→70
10→0
70→70

到这里,SO的30件锁定被两张出库单全部消耗掉,锁定归零。整条链路从"承诺给谁"到"实际发给谁",在流水上都能一条条对上号。

特殊情况:如果订单被取消了呢?

比如SO发完20件之后,剩下的10件被客户取消了。这时候我们需要通过一条"释放锁定"的流水把它还回可用池:

操作
在库(前→后)
锁定(前→后)
可用(前→后)
取消锁定10
80→80
10→0
70→80

在这个模型里,**"取消锁定"和"发货扣减"是一对对称操作**:前者把锁定退回可用,后者把锁定变成已出库。库存流水只要记录好"变更前、变更量、变更后",后续无论是业务追溯还是财务对账,都能顺着流水一步步还原。

五、为什么建议选择"直接消耗锁定"

从上面的分析和推演可以看到,这两种方案表面上账都能算平,但我最终还是建议选择"出库单直接消耗锁定"的方案,主要有三个原因:

  • 并发安全:"先释放再扣减"在两个动作之间会短暂放大可用库存,给并发请求留下可乘之机。虽然可以通过事务和锁来规避,但这就增加了实现复杂度,而且在跨系统场景下(比如ERP和WMS分属两个服务)更难控制。
  • 业务语义清晰:从业务视角看,SO一旦锁定库存,那部分货就已经"许配"给这个订单了,后面自然应该由这张订单对应的出库单来消耗。如果发货前还要先放回公共池再扣一次,哪怕账面能解释通,语义上也绕了一圈,跟业务同学沟通的成本会变高。
  • 流水种类少,对账简单:采用"直接消耗锁定"的设计,整条链路只有三种核心动作:锁定库存、释放锁定、消耗锁定。既能覆盖绝大部分业务场景,又不会让流水种类爆炸。多一步"释放再扣减",就意味着流水上会多一类动作类型,跨系统对账时要额外理解这一层语义。

六、总结

把上面的推演收一收,可以用三句话总结SO、销售出库单和库存流水各自的职责:

  • 销售订单(SO):负责"承诺"。它决定哪些货应该被锁定给哪些客户,对应的库存动作是增加锁定、减少可用,不动在库。
  • 销售出库单:负责"兑现"。它把之前SO锁定的库存真正发出去,对应的库存动作是减少在库、减少锁定,可用通过公式自然维持。
  • 库存流水:负责"讲故事"。每一条流水都要说清楚变更前是多少、这次变了多少、变完之后是多少,让后来的人可以沿着流水把当时发生的事情还原出来。

当这三者的角色被讲清楚之后,哪怕以后再叠加出入库原因、批次维度、多仓、跨组织等复杂因素,你也会有一套可以反复复用的底层逻辑,不至于每遇到一种新业务就重新造轮子。

这件事情如果只站在技术实现的角度看,可能就是几张配置表、几条SQL语句的事,只是一个很简单的Case。但站在产品的视角,我认为更重要的是:这套设计能不能在未来三五年里,经得住业务变化和新人接手?能不能在财务对账、业务追溯、系统扩展时都说得通?

如果你以后也需要在业务型ERP里设计库存流水和单据体系,希望这篇笔记能给你一点启发和参考。供应链模块中还会有很多类似的小设计细节,值得我们细细揣摩、探究更优的方案。

TikTok、Facebook、谷歌、Twitter广告服务,0门槛抢占全球流量!
极速开户+优化投流+风险保障+效果跟踪,仅需4步,轻松撬动亿万海外流量,让品牌销量翻倍增长!
已成功开通5000+账户
二维码
免责声明
本文链接:
本文经作者许可发布在AMZ123跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
中国卖家争夺美区新阵地,出海游戏规则变了
从卖货到做品牌,中国卖家抢夺出海新主场!
Temu签署澳洲设备安全承诺,禁止销售非法通信设备
AMZ123获悉,近日,Temu宣布,加入澳大利亚通信与媒体管理局(ACMA)发起的“设备安全承诺”,该承诺是一项自愿性倡议,旨在加强消费者保护,减少在线平台销售不安全或非法通信设备的情况。Temu与其他主要电商平台共同签署此承诺,体现了其在澳大利亚市场对消费者安全和合规经营的承诺。ACMA表示,该承诺列明了一系列自愿性义务,旨在防止非法和不合规无线通信设备的销售。这些设备包括低质量对讲机、非法干扰器、手机信号增强器、未经授权的手机中继器以及各类“灰色市场”手机,这类产品可能对公共安全构成风险或干扰重要通信服务。通过签署承诺,电商平台主动阻止非法设备在其平台上销售,并承诺不成为不合规产品的入口。
巴西电商2025年访问量达339亿次,美客多排名第一
AMZ123获悉,近日,根据Conversion发布的《巴西电商行业报告》,巴西电商流量结构正加速向移动端倾斜。截至2025年11月,巴西电商在过去12个月累计访问量达339亿次。11月单月总访问量较10月下降1.3%,主要原因是通过浏览器访问量下降,其中网页端流量下滑4.8%,而应用端流量则同比增长10.6%。这一趋势表明,消费者购物行为正加速向移动端迁移,同时对仍以桌面端为主的平台产生了市场份额压力。报告显示,巴西电商市场集中度较高,前十电商平台占据总访问量的57.5%。
存火灾风险!美国CPSC紧急召回1.12万亚马逊在售插座
AMZ123获悉,近日,美国消费品安全委员会(CPSC)发布了一则紧急召回公告,宣布召回在亚马逊平台销售的ANNQUAN品牌插线板,原因是产品存在火灾风险,可能导致严重人身伤害甚至死亡。本次召回涉及型号为EX-D112-05和EX-D106-25的ANNQUAN插线板,召回数量约为11,200件。公告显示,ANNQUAN品牌插线板未配备补充过流保护装置,在超负荷使用时存在起火风险。一旦发生火灾,可能引发烟雾吸入或烧伤,对消费者人身安全构成严重威胁。此次召回的补救措施为全额退款。
TikTok又现义乌爆款!“香烟盒泡泡”28天营收百万
溢价超30倍,这款“解压神器”在TikTok已卖180万+
泰国将对低价跨境包裹征收最高30%关税和增值税
AMZ123获悉,近日,泰国海关部门宣布,自2026年1月1日起,对所有跨境进口商品征收关税和增值税,并正式取消价值低于1,500泰铢跨境包裹的免税政策。该政策调整旨在缩小税收漏洞,改善国内中小企业在电商领域面临的竞争环境。根据泰国海关部门的说明,原有的低价跨境包裹免税制度在过去几年推动了跨境电商的快速增长,但也导致大量低价商品以免税或低税方式进入市场,对本土中小企业形成明显压力。数据显示,上一个财政年度内,低价免税包裹进口总值已超过300亿泰铢。为确保新规顺利实施,泰国海关已与Lazada、Shopee、TikTok Shop、Temu和Shein等五大跨境电商平台签署合作备忘录。
从“卖限定”到“卖感受”,喜茶把联名做慢了
文 | Wen最近,喜茶又出大招了,这次牵手泡泡玛特新锐IP星星人,直接让大家陷入“星星追星潮”。根据潮新闻报道,产品开售当日,杭州多家门店订单队列排起长龙,部分门店的等待时长达到112分钟。这次联名的核心产品除了全球门店原本有售的烤黑糖波波牛乳、烤黑糖波波牛乳茶外,喜茶还围绕联名推出了冬日新品提拉米苏·英红(部分地区用不同茶底命名为提拉米苏·嫣红),这是喜茶首个全球同步上新的新品。国内有售挞类产品的门店,还推出了联名AOP提拉米苏可颂挞,用可颂挞呈现茶饮灵感,洒满可可粉的提拉米苏内馅上,还点缀了星星人形象。
传抖音母公司今年净赚500亿美元
据彭博社等多家外媒报道,抖音与TikTok母公司字节跳动在2025年有望实现约500亿美元净利润,这一数字将创下公司历史新高,这一利润表现接近美国科技巨头Meta预计的盈利水平。报道引述接近公司内部人士透露,截至今年前三季度,字节跳动已实现约400亿美元净利润,提前完成了年初内部设定的盈利目标;若按这一速度推算,公司全年净利润有望达到约500亿美元。分析认为,这一利润增长得益于字节跳动在全球短视频、社交媒体、电商与直播业务的强劲表现。旗下抖音及其海外版TikTok在广告收入、电商流量变现等方面表现突出,同时公司在海外市场特别是东南亚等区域的业务扩张也显著拉动盈利增长。
圣诞季单量骤跌,一批卖家广告费狂飙!
作者 | 林含@AMZ123声明 | 此文章版权归AMZ123所有,未经允许不得转载当圣诞钟声临近,亚马逊卖家们期盼的订单“圣诞老人”却并未如期而至。一边是少数卖家爆单的喜悦,另一边则是更多卖家面对提前“冻结”的销量曲线,陷入困惑与焦虑。AMZ123获悉,为了迎接即将到来的圣诞旺季,亚马逊于12月16日9点启动"圣诞限时特卖",活动将持续至12月25日23:59分,涵盖多品类商品优惠。数以万计的跨境卖家原本期待着一场持续至25日深夜的销售盛宴。然而,预期中的单量狂潮并未均匀降临,取而代之的是一场急剧分化的市场“压力测试”,并在活动后期演变为大范围的销量下跌。活动伊始,市场的分野便已清晰可见。
深圳又发钱!这些跨境企业瓜分超3000万
在中国跨境电商的版图上,深圳是一座无法被忽略的“灯塔”。这里不仅聚集了全国近半的跨境电商主体,更以其完整的产业链、活跃的创新氛围和敏锐的市场嗅觉,持续引领着行业的趋势与变革。近日,深圳再度“遥遥领先”,给跨境企业“发钱”了。AMZ123获悉,12月16日,深圳商务局发布了2025年度中央资金(跨境电子商务企业市场开拓扶持事项)拟奖励项目公示的通知,拟发放奖励超3000万元。▲图片来源于:深圳市商务局网站通知显示,专项资金申报对象为具备海外独立站业务的跨境企业。最终,共有21家企业的36个独立站项目获得支持,涵盖智能家居、新能源、消费电子、运动科技等领域大卖。
销量腰斩!Temu卖家陷入流量寒冬
系统崩了、单量没了、广告爆了——2025年12月的跨境卖家社群,这类吐槽已成为高频词汇。从平台系统突发宕机导致订单处理停滞,到大批商品链接无预警下架,叠加年末本应爆发的消费需求迟迟未现,跨境电商行业正经历一场意料之外的震荡,而Temu卖家群体的体感尤为强烈。AMZ123获悉,自12月以来,不少卖家均反映Temu店铺流量、销量十分低迷。而到了12月中下旬,这种低迷情况更是进一步加剧,多个产品甚至出现了“销量连续多日下滑”的极端情况。“最近猛跌,真的是淡得不行了。”“Temu销量掉完了,看这情况都懒得上品了。”“天塌了Temu流量怎么能下降那么多,说好的圣诞旺季呢。
美国41%美妆销售已转向线上渠道,消费者购物行为转变
AMZ123获悉,近日,根据NielsenIQ的最新数据,消费者购买行为正在发生结构性变化。全球美妆行业在2024年实现了7.3%的同比价值增长,电商渠道成为推动行业增长的核心力量。其中,美国市场约41%的美妆及个人护理产品销售通过线上渠道完成。全球美妆市场规模在2025年预计达到1万亿美元,美国贡献约1050亿美元,线上销售正在持续削弱传统实体零售的主导地位。从区域表现来看,拉丁美洲和非洲———中东地区成为全球美妆市场增长最快的区域,增速分别达到19.1%和27.1%。北美和西欧市场同样保持稳健增长,增幅分别为7.8%和7.7%。
跨境人必看!DDP、DDU、DAP、LDP到底有何区别?
DDP、DDU、DAP、LDP在跨境电商领域容易弄混淆。这次铭志会对每个术语的定义、买卖双方的责任划分、潜在风险以及适合的卖家画像等多个维度进行阐述,旨在为跨境电商卖家,提供一份清晰、实用且专业的行动指南。 一、DDP-完税后交货1、定义DDP是指卖方需要承担将货物从发货地运送到买方指定的目的地国家内某个具体地点的一切责任、风险和费用。 2、买卖双方责任(1)卖方责任· 全程物流: 负责从起运地到最终目的地的所有运输安排 。· 出口清关: 办理货物在出口国的所有海关手续。· 进口清关: 办理货物在进口国的所有海关手续,这是DDP与许多其他术语的关键区别 。
字节25年利润预计将达500亿美元,TikTok带动增长
AMZ123获悉,近日,据彭博社报道,字节跳动有限公司预计在2025年实现约500亿美元利润,创下公司历史新高。这一表现主要得益于旗下TikTok在电商、直播购物以及海外市场的快速发展。知情人士透露,字节跳动在今年前三季度已实现约400亿美元净利润,超出公司内部对2025年的利润预期,其盈利规模接近美国竞争对手Meta的预期水平(约600亿美元)。尽管TikTok在美国面临严格监管和国家安全审查压力,并促使美方推动对其所有权结构进行重组,字节跳动仍保持快速扩张。
90%抽检玩具不合规!法国加强电商平台玩具的监管力度
AMZ123获悉,近日,法国竞争、消费与反欺诈总局(DGCCRF)发布了2025年度玩具安全调查结果。调查显示,在电商平台销售的玩具中,存在高度集中的合规与安全风险。被抽检的玩具中,90%存在不合规问题,超过60%被认定为危险产品。相比之下,线下及自营电商等传统玩具销售渠道整体合规水平明显更高。本次调查共覆盖近2000家玩具相关经营主体以及5家大型电商平台,其中4家为境外平台。相关平台单个平台的月度独立访客量介于700万至2200万之间。调查显示,电商平台市场在2024年已占法国玩具零售分销总营业额的20%以上,成为监管部门重点关注对象。
圣诞旺季TRO预警! 988家跨境店版权踩坑,上百张侵权高危图案速避!AUDI、SPRUNKI、UGG等品牌反复维权!
上周(12.15-12.19)美国多地法院密集新增一批 TRO 案件,覆盖商标、专利、版权三大核心知识产权类型,涉及品类横跨家居、服饰、美妆、汽配等多个跨境热门赛道。如果不幸被TRO,被告卖家需要尽快和解或者应诉解决此案!
《TikTok Shop 2025年全站点Q3季报》PDF下载
2025年前三季度,TikTok Shop在全球市场继续保持强劲增长势头。截至第三季度结束,累计GMV已突破414亿美元。美国站依旧稳居全球第一,前三季度GMV达112亿美元:东南亚仍是总体增长最具韧性的板块,印尼站以83.4亿美元位列第二,增速较上季度保持稳定,与泰国(69亿美元)、越南(52亿美元)继续构成区域主力。马来西亚(40亿美元)与菲律宾(37亿美元)表现同样稳健。
《2026掘金指南:全球全品类20大消费趋势报告》PDF下载
生活百货类关键趋势解读 消费电子类关键趋势解读 消费品类关键趋势解读 时尚品类关键趋势解读
《亚马逊生活日用品类攻略手册》PDF下载
作为日常生活不可或缺的重要组成,生活百货品类覆盖范围广泛,包括家居用品、家具、车用配件、户外装备、园艺 工具、运动器材、家装用品、厨房、玩具以及宠物用品等众多领域。这类产品不仅是满足基本生活所需,更体现了人们对美好生活的向往和追求。
《掘金泰国-市场洞察与战略机遇报告2025》PDF下载
随着全球经济一体化的加速,泰国作为东盟的核心枢纽,凭借其独特的地缘优势庞大的消费市场以及持续优化的营商环境,成为众多企业战略布局的重要目标。本报告深入剖析泰国市场的政策红利、消费趋势、产业机遇以及合规挑战,旨在为有志于开拓泰国市场的中国企业提供行动指南,助力企业在东盟这片充满活力的土地上把握机遇、应对挑战、!实现可持续发展。
《2025欧美假日购物季营销指南》PDF下载
2025年美国假日购物季零售额预计同比仅增长1.2%,总销售额约1.359万亿美元,虽仍保持正增长,但为2009年以来最低增速,市场正在步入低增长的新常态。
《2025年跨境电商东南亚市场进入战略白皮书》PDF下载
东南亚电商,正以惊人的速度复刻中国电商高速增长的黄金时代。2024年东南亚电商GMV达到1284亿美元,短短5年涨幅超过3倍。全球电商2024年GMV增幅最快的十大市场中,东南亚独占四席。东南亚是拥有约6.7亿人口的广阔市场,在现今全球关税的不确定性大格局下,因其电商基建完善,利好的贸易政策,和更高的年轻人口占比,成为跨境卖家生意拓张焦点之一。
《2025年TikTok Shop玩具品类行业报告(欧美站)》PDF下载
分析TikTok Shop美国市场、英国市场、西班牙市场、墨西哥市场等主流市场点短视频及直播电商数据,选取TikTok与玩具爱好品类相关的内容进行分析报告。
《2025 洗护品类趋势与创新洞察》PDF下载
本报告独特价值:将消费者的“行为结果”据),揭示消费者深层心理动机、并能精准预判未来增长机会
亚马逊公告
AMZ123旗下亚马逊公告发布平台,实时更新亚马逊最新公告,致力打造最及时和有态度的亚马逊公告栏目!
侃侃跨境那些事儿
不侃废话,挣钱要紧!
跨境电商干货集结
跨境电商干货集结,是结合亚马逊跨境电商卖家交流群内大家在交流过程中最常遇到的问题,进行收集整理,汇总解答,将会持续更新大家当前最常遇见的问题。欢迎大家加入跨境电商干货集结卖家交流群一起探讨。
跨境学院
跨境电商大小事,尽在跨境学院。
AMZ123卖家导航
这个人很懒,还没有自我介绍
AMZ123会员
「AMZ123会员」为出海者推出的一站式私享服务
亿邦动力网
消除一切电商知识鸿沟,每日发布独家重磅新闻。
亚马逊资讯
AMZ123旗下亚马逊资讯发布平台,专注亚马逊全球热点事件,为广大卖家提供亚马逊最新动态、最热新闻。
首页
跨境头条
文章详情
从销售订单到销售出库单:库存锁定、释放与扣减的那点事
PM维他命
2025-12-16 08:07
21

最近在做库存模块重构的时候,我遇到了一个之前想当然认为"就应该那样做"的问题。仔细琢磨之后,发现自己可能把事情想得太简单了。

在之前做海外仓OMS和WMS的时候,我们通常会采用"一张单走到底"的方式——这张单在创建或审核时先锁定库存,等到确认出库时再扣减库存。在库存流水的处理上,一般会这样做:锁定库存时写一条流水;真正扣减库存前,先写一条释放库存的流水;最后再写一条扣减库存的流水。整体下来就是三条流水。

这种模式比较好理解:我先占用库存,用完之后释放,再正式扣减,整个流程虽然会有些冗余,但逻辑是自洽的,而且所有动作都围绕同一张单据。

但这次刚好要在ERP中新增一个组织间交易、触发自动转卖的业务,我突然发现如果采用这种设计方式,库存流水数据会虚增很多,后续对库存流水排查、对账的时候就会麻烦很多。

于是我开始思考:之前的想法是不是有问题?

我把这个前因后果和纠结的点一起发给了AI,得到了一些解答,对这个问题的理解也有了不一样的视角。接下来,就跟大家分享一下这件小事背后容易被忽略的业务知识,以及我最终更倾向的方案是哪个。

一、库存数量类型的拆分

大多数供应链类系统在设计库存模块的时候,会基于库存的不同用途对库存数量进行拆分,通常会拆分成3类:

字段
含义
举个例子
在库数量
仓库里真实存在的货,On-hand
仓A里某SKU现在有100件
锁定数量
已经被某张单据"占住"但还没出仓的数量
其中30件被某张销售订单锁定了
可用数量
还能分配给新订单的数量
当前还能再接70件新订单

背后的数量计算公式是:可用数量 = 在库数量 - 锁定数量

二、我纠结的问题

业务在ERP里下了一张销售订单(SO),然后ERP会把SO推给WMS执行出库作业。仓库可能会基于不同的发货要求多次回传结果,此时一张SO可能被拆成好几次发货,在ERP中生成多个销售出库单。

一般来说,在SO创建的时候会对库存进行锁定,以防止库存被其他单据占用。当后面ERP收到了仓库出库回传的数据之后,会生成对应的销售出库单去扣减库存。

此时,我们就会面临一个问题:销售出库单出库扣减库存的时候,是先把SO的锁定释放掉、再重新扣一遍可用库存,还是直接消耗掉SO已经锁定好的那部分?也就是应该选择写入3条库存流水,还是写入2条库存流水?

这个问题听起来好像很简单,就是一个二选一的问题。但仔细琢磨一下,库存流水随着单据的日积月累会逐步变得庞大,如果这里不仔细想清楚背后的细节,后面可能就会欠下一些没必要的技术债务。

三、市面上常见的三种做法

我把这个问题丢给了几个AI,也翻了一些主流ERP的帮助手册和产品介绍,发现大概的做法有这么三种。

第一种:SO不锁定,出库时才扣

这是最"乐观"的做法。销售订单只是记录客户需求,不在库存层面做任何动作,等到仓库真正发货、出库单过账时,才一次性把在库和可用都扣掉。这种做法实现最简单,很多早期的小系统都是这么干的。但问题也很明显:在稍微有点并发或者业务单量的时候就会出现问题——前面的订单还没发货,后面的订单已经把货"抢"走了。系统层面显示有货,业务现场却"无货可发"。本质上就是没有"占坑"机制,谁先发货谁拿货,先下单的反而可能被后下单的截胡。

第二种:SO锁定,出库时"先释放再扣减"

这种做法在创建SO的时候需要锁库存。SO创建时,先做一笔锁定(锁定+N、可用-N、在库不变);等到出库单发货时,先把这笔锁定释放掉(锁定-N、可用+N),然后再从可用里扣减一次(在库-N、可用-N)。表面上看,账还是能算平的。但这里有一个隐蔽的风险:在"释放"和"扣减"这两个动作之间,可用库存会被短暂放大。在单机小系统里,这个时间窗口可能只有几毫秒;但在多服务、多线程的环境下,就有机会被别的请求插队,去占用那一瞬间"看上去多出来的可用库存"。这是一种隐蔽的超卖风险

第三种:SO锁定,出库时"直接消耗锁定"

这是我更建议选择的方案。SO在创建或审核时就锁定库存,只影响锁定和可用,不动在库(锁定+N、可用-N、在库不变)。后续出库单发货过账时,不把这部分库存"放回公共池",而是直接去消耗SO阶段形成的锁定——在同一个事务里同时减少在库和锁定(在库-N、锁定-N,可用不变)。换句话说,这部分货从一开始就被SO"认领"了,出库单只是把它从"锁定"状态变成"已发货"状态,中间不会再回到可用库存里兜一圈。

四、简单的案例推演说明

光讲概念可能还是有点抽象,我们用一个具体的数字例子来推演。在开始之前,先用一个流程图把整条链路串起来:

这个图展示的是上面提到的第三种方案(直接消耗锁定)的核心逻辑。SO锁定库存时,只影响锁定和可用,不动在库;出库单发货时,同时减少在库和锁定,可用通过公式自然维持;如果订单取消,就把锁定释放回可用池。

假设某个SKU在仓库A的初始状态是:在库100、锁定0、可用100。现在有一张SO要占用30件,最终会拆成两张出库单分别发20和10。

第一步:SO审核通过,锁定库存30件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
SO锁定30
100→100
0→30
100→70

这一步的本质是:把未来一定要发的30件从可用池里"挑"出来,打上"订单锁定"的标签。仓库地面上什么都没发生,所以在库不变;但从此以后,新订单进来时只能看到70件可用库存了。

第二步:第一张出库单发货20件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
出库20
100→80
30→10
70→70

注意看,可用库存是没有发生变更的。这是因为可用在SO锁定那一步就已经被用掉了,发货只是把锁定变成已出库,不再额外影响可用。

第三步:第二张出库单再发10件

操作
在库(前→后)
锁定(前→后)
可用(前→后)
出库10
80→70
10→0
70→70

到这里,SO的30件锁定被两张出库单全部消耗掉,锁定归零。整条链路从"承诺给谁"到"实际发给谁",在流水上都能一条条对上号。

特殊情况:如果订单被取消了呢?

比如SO发完20件之后,剩下的10件被客户取消了。这时候我们需要通过一条"释放锁定"的流水把它还回可用池:

操作
在库(前→后)
锁定(前→后)
可用(前→后)
取消锁定10
80→80
10→0
70→80

在这个模型里,**"取消锁定"和"发货扣减"是一对对称操作**:前者把锁定退回可用,后者把锁定变成已出库。库存流水只要记录好"变更前、变更量、变更后",后续无论是业务追溯还是财务对账,都能顺着流水一步步还原。

五、为什么建议选择"直接消耗锁定"

从上面的分析和推演可以看到,这两种方案表面上账都能算平,但我最终还是建议选择"出库单直接消耗锁定"的方案,主要有三个原因:

  • 并发安全:"先释放再扣减"在两个动作之间会短暂放大可用库存,给并发请求留下可乘之机。虽然可以通过事务和锁来规避,但这就增加了实现复杂度,而且在跨系统场景下(比如ERP和WMS分属两个服务)更难控制。
  • 业务语义清晰:从业务视角看,SO一旦锁定库存,那部分货就已经"许配"给这个订单了,后面自然应该由这张订单对应的出库单来消耗。如果发货前还要先放回公共池再扣一次,哪怕账面能解释通,语义上也绕了一圈,跟业务同学沟通的成本会变高。
  • 流水种类少,对账简单:采用"直接消耗锁定"的设计,整条链路只有三种核心动作:锁定库存、释放锁定、消耗锁定。既能覆盖绝大部分业务场景,又不会让流水种类爆炸。多一步"释放再扣减",就意味着流水上会多一类动作类型,跨系统对账时要额外理解这一层语义。

六、总结

把上面的推演收一收,可以用三句话总结SO、销售出库单和库存流水各自的职责:

  • 销售订单(SO):负责"承诺"。它决定哪些货应该被锁定给哪些客户,对应的库存动作是增加锁定、减少可用,不动在库。
  • 销售出库单:负责"兑现"。它把之前SO锁定的库存真正发出去,对应的库存动作是减少在库、减少锁定,可用通过公式自然维持。
  • 库存流水:负责"讲故事"。每一条流水都要说清楚变更前是多少、这次变了多少、变完之后是多少,让后来的人可以沿着流水把当时发生的事情还原出来。

当这三者的角色被讲清楚之后,哪怕以后再叠加出入库原因、批次维度、多仓、跨组织等复杂因素,你也会有一套可以反复复用的底层逻辑,不至于每遇到一种新业务就重新造轮子。

这件事情如果只站在技术实现的角度看,可能就是几张配置表、几条SQL语句的事,只是一个很简单的Case。但站在产品的视角,我认为更重要的是:这套设计能不能在未来三五年里,经得住业务变化和新人接手?能不能在财务对账、业务追溯、系统扩展时都说得通?

如果你以后也需要在业务型ERP里设计库存流水和单据体系,希望这篇笔记能给你一点启发和参考。供应链模块中还会有很多类似的小设计细节,值得我们细细揣摩、探究更优的方案。

咨询
官方微信群
官方客服

扫码添加,立即咨询

加群
官方微信群
官方微信群

扫码添加,拉你进群

更多
订阅号服务号跨境资讯
二维码

为你推送和解读最前沿、最有料的跨境电商资讯

二维码

90% 亚马逊卖家都在关注的微信公众号

二维码

精选今日跨境电商头条资讯

回顶部