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

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

1152
2025-12-16 08:07
2025-12-16 08:07
1152

4.9厦门亚马逊大会,OpenClaw助力亚马逊广告运营提效,点击报名>>>

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

在之前做海外仓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里设计库存流水和单据体系,希望这篇笔记能给你一点启发和参考。供应链模块中还会有很多类似的小设计细节,值得我们细细揣摩、探究更优的方案。

3.31 义乌东南亚-文章页底部图片
TikTok、Facebook、谷歌、Twitter广告服务,0门槛抢占全球流量!
极速开户+优化投流+风险保障+效果跟踪,仅需4步,轻松撬动亿万海外流量,让品牌销量翻倍增长!
已成功开通5000+账户
二维码
免责声明
本文链接:
本文经作者许可发布在AMZ123跨境头条,如有疑问,请联系客服。
最新热门报告作者标签
宠物电商平台Chewy发布25财年财报,营收增至126亿美元
AMZ123获悉,近日,宠物电商平台Chewy发布截至2026年2月1日2025财年第四季度及全年财报,公司实现稳健增长,继续保持盈利能力,为2026年可持续发展奠定基础。以下为Q4财务亮点:①净销售额为32.6亿美元,同比增长0.5%,按标准化13周计算增长8.1%。②毛利率为29.4%,较去年提升0.9%。③净利润为3,920万美元;调整后净利润为1.148亿美元,同比下降520万美元。④净利率为1.2%,较去年提升0.5%。⑤调整后EBITDA为1.623亿美元,同比增长3,780万美元。⑥调整后EBITDA利润率为5.0%,较去年提升1.2%。
跨境消费占比达47%,阿根廷电商报告出炉!
AMZ123获悉,近日,阿根廷电子商务商会(CACE)《阿根廷人与电子商务:我们如何进行线上买卖?》。报告基于对阿根廷全国范围内消费者、企业及市场数据的深度解析,全面勾勒出2025年阿根廷电商市场的发展图景。核心发现如下:一、电商市场概况(一)整体市场1、消费端和供给端同步发力2025年,阿根廷电商市场展现出强劲的增长韧性。尽管国家年度通胀率高达31.5%,但电商行业通过灵活的策略调整,实现了远超通胀率的扩张。从消费端看,阿根廷线上消费者群体持续扩大。根据阿根廷国家统计与人口普查研究所(INDEC)的数据,2025年全国新增线上消费者达134万人,使线上消费者总数攀升至2512万人。
电商增速全球领先,26年拉美市场将趋向精细化运营
AMZ123获悉,近日,Endeavor和拉美电商平台美客多联合发布了《2025年拉美电商市场趋势报告》,报告从市场规模、消费者行为趋势、物流、支付趋势等方面,系统分析了拉美电商市场的发展特征。一、市场规模1. 拉美市场发展现状拉丁美洲电商市场正从高速发展迈向成熟与精细化运营阶段,并逐步成为全球数字经济增长的重要引擎。整体来看,该地区电商增速达到全球平均水平的1.5倍,预计到2026年市场规模将达到2153.1亿美元。在全球范围内,2025年电商市场规模预计为5万亿美元,这意味着拉美正在成为推动全球电商增长的核心区域之一。
月销数十万美元!盘点亚马逊10款收纳好物
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1.衣柜收纳篮预计销售额:36万美元/月销量:10000+星级评分:4.5好评数量:3743+图源:亚马逊产品介绍:这款产品可堆叠起来,便于节省空间。单个衣柜收纳盒的尺寸为 16.73*13.11*7.2 英寸,提供充足的存储空间。安装简便,只需几个简单的步骤即可轻松安装。这款衣柜收纳盒采用优质防水PP塑料制成,加固的侧缝设计增强了整体结构。此外,该产品底部装有导轨,方便存放和取用物品。
泰国出台电商新规,规范平台定价
AMZ123获悉,近日,据外媒报道,泰国竞争委员会(TCCT)正式发布针对电商平台的行为规范指南,自3月25日起生效。Priceza预计,到2026年,泰国电商市场规模将突破1.15万亿泰铢。该指南旨在规范数字平台经营行为,遏制不公平竞争、垄断及限制竞争问题,同时为电商平台、卖家及相关服务方提供更明确的合规框架。
欧盟黑五网一抽查:三成商家折扣造假
AMZ123获悉,近日,据外媒报道,欧洲消费者保护机构对在线零售商进行了一次大规模抽查,共检查了314家在线商店和应用程序。调查发现:在去年的黑五网一期间,几乎所有被检查的零售商都在大力宣传降价,但在至少30%的案例中,降价信息并不合规。根据欧盟《价格标示指令》,任何降价促销都必须以过去30天内的最低价格作为参考基准。这一规定旨在防止商家在促销前人为抬高价格。然而实际执行情况并不乐观:在所有被检查的案例中,仅有不到40%的商家使用了正确的参考价格。不少所谓的正常价格实际上是虚构的,有些促销活动持续时间过长,导致更高的原价几乎从未真正被收取过。除价格标示问题外,调查还发现多种操纵消费者决策的销售手段。
2月日本电商热销榜:游戏机与数码产品主导
AMZ123获悉,近日,根据Nint ECommerce发布的数据,2026年2月日本三大电商平台——亚马逊、乐天市场和雅虎购物(Yahoo!Shopping)的销售情况显示,不同品类在销售金额、销量和增长速度上的表现出现明显分化,消费结构与季节性需求共同影响平台整体表现。从销售金额来看,榜单前十呈现出高度集中的特征。排名前两位均为头部游戏机厂商A推出的次世代游戏机本体及其不同型号,第3至第6位和第10位则被头部IT企业A的产品占据,包括最新款无线耳机、256GB智能手机、11英寸平板电脑。
【侵权快讯】26-cv-481 Ference&Keith 代理一张驼鹿标志图发案!跨境卖家迅速排查避雷!
本案涉及的版权信息如下,未经授权将涉案作品使用在产品本身、包装、宣传图、社交媒体等任何商业场景的行为,均有侵权风险。
亚马逊大扫号!WOOT刷单成重灾区
经过长达十日的紧张预热,2026年亚马逊北美站春促于当地时间3月25日正式打响但随之而来的,是“每逢旺季事倍多”的定律再度上演。AMZ123获悉,自3月初起,业内陆续有卖家反映收到了亚马逊的扫号邮件。从通知邮件及申诉页面来看,亚马逊停用账户给出的理由是:相关卖家的一个或多个账户尝试通过请求评论或反馈来操作销售,违反了亚马逊卖家行为准则中的“公平行事”和“评分、反馈和评论”条例部分,因此账户遭到了停用。时至3月下旬,这一扫号风波仍在持续,且据业内反馈似乎有愈演愈烈的趋势。部分卖家已从此前仅违规小号被封,到如今主账号也受到了牵连,甚至还有部分卖家的资金因此遭到了冻结。“之前只是小号被停用,现在主账号也被连坐了。
夏季需求爆发!亚马逊10款月销过万户外产品拆解
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1. 儿童泳镜预计销售额:49.01万美元/月销量:31,900+星级评分:4.4好评数量:7,346+图源:亚马逊产品描述:该儿童泳镜采用柔软硅胶贴合框架设计,不含乳胶材质,能够有效减轻面部压迫并形成良好的防水密封;镜片经过防紫外线处理,可有效阻隔高能紫外线,保护儿童眼睛;内层采用防雾涂层,减少起雾对视线的影响,提升水下清晰度;人体工学和可调节头带设计,可适配不同脸型,方便儿童独立佩戴与摘取。
月销数十万美元!盘点亚马逊10款收纳好物
AMZ123获悉,近日,亚马逊各类产品搜索量增长显著,以下10款产品在亚马逊上销量表现突出,深受消费者欢迎。1.衣柜收纳篮预计销售额:36万美元/月销量:10000+星级评分:4.5好评数量:3743+图源:亚马逊产品介绍:这款产品可堆叠起来,便于节省空间。单个衣柜收纳盒的尺寸为 16.73*13.11*7.2 英寸,提供充足的存储空间。安装简便,只需几个简单的步骤即可轻松安装。这款衣柜收纳盒采用优质防水PP塑料制成,加固的侧缝设计增强了整体结构。此外,该产品底部装有导轨,方便存放和取用物品。
关税迷雾下,海外仓正在成为卖家的避风港
当霍尔木兹海峡在美以联军的炮火声中被锁喉,连接亚欧的供应链大动脉被拦腰切断,无论是否出海中东的跨境卖家,都不约而同地感受到了这场物流风暴所传递的寒意。从疫情迷雾到关税大棒再至中东战乱,在这个“黑天鹅”频发,充满不确定性的时代,物流是出海生意最脆弱而又最关键的一环,牵一发而动全身。一个很明显的趋势是,行业正在经历一场深刻的价值迁移——企业的核心竞争力,从谁能把东西卖出去,转变为谁能把东西安全、稳定、高效地送到需要的人手里。在这场供应链韧性的生存游戏中,海外仓开始成为那个决定胜负的关键变量。
电商增速全球领先,26年拉美市场将趋向精细化运营
AMZ123获悉,近日,Endeavor和拉美电商平台美客多联合发布了《2025年拉美电商市场趋势报告》,报告从市场规模、消费者行为趋势、物流、支付趋势等方面,系统分析了拉美电商市场的发展特征。一、市场规模1. 拉美市场发展现状拉丁美洲电商市场正从高速发展迈向成熟与精细化运营阶段,并逐步成为全球数字经济增长的重要引擎。整体来看,该地区电商增速达到全球平均水平的1.5倍,预计到2026年市场规模将达到2153.1亿美元。在全球范围内,2025年电商市场规模预计为5万亿美元,这意味着拉美正在成为推动全球电商增长的核心区域之一。
宠物电商平台Chewy发布25财年财报,营收增至126亿美元
AMZ123获悉,近日,宠物电商平台Chewy发布截至2026年2月1日2025财年第四季度及全年财报,公司实现稳健增长,继续保持盈利能力,为2026年可持续发展奠定基础。以下为Q4财务亮点:①净销售额为32.6亿美元,同比增长0.5%,按标准化13周计算增长8.1%。②毛利率为29.4%,较去年提升0.9%。③净利润为3,920万美元;调整后净利润为1.148亿美元,同比下降520万美元。④净利率为1.2%,较去年提升0.5%。⑤调整后EBITDA为1.623亿美元,同比增长3,780万美元。⑥调整后EBITDA利润率为5.0%,较去年提升1.2%。
欧盟黑五网一抽查:三成商家折扣造假
AMZ123获悉,近日,据外媒报道,欧洲消费者保护机构对在线零售商进行了一次大规模抽查,共检查了314家在线商店和应用程序。调查发现:在去年的黑五网一期间,几乎所有被检查的零售商都在大力宣传降价,但在至少30%的案例中,降价信息并不合规。根据欧盟《价格标示指令》,任何降价促销都必须以过去30天内的最低价格作为参考基准。这一规定旨在防止商家在促销前人为抬高价格。然而实际执行情况并不乐观:在所有被检查的案例中,仅有不到40%的商家使用了正确的参考价格。不少所谓的正常价格实际上是虚构的,有些促销活动持续时间过长,导致更高的原价几乎从未真正被收取过。除价格标示问题外,调查还发现多种操纵消费者决策的销售手段。
25年连连扭亏为盈,营收达17亿元
Fin123获悉,3月26日,连连数字科技股份有限公司(以下简称“连连”)发布2025年度业绩报告。业绩报告显示,2025年,连连全年总收入达17.34亿元,同比增长31.9%,创历史新高。净利润为16.62亿元,较上年同期亏损1.67亿元实现扭亏为盈。经调整经营利润为8226万元,同比增长105.9%。截至2025年12月31日,连连数字累计服务客户数量达1040万家,客户规模与质量同步提升。毛利同比增长50.4%至8.7亿元。销售及营销开支为2.7亿元,一般及行政开支为6.54亿元,研发费用为3.61亿元。从收入结构看,数字支付服务贡献收入14.5亿元,同比增长26%,其中全球支付业务表现突出。
《2026美妆健康与保健创新报告》PDF下载
每年,我们都会分析美妆与个护以及健康与家居类目的动态变化。但2026 年呈现了一个意外的新现象:这两个类目不再孤立运营。美妆和健康正与食品杂货融合,形成由配方创新、成分病毒式传播和消费者行为演变所驱动的强大三方生态系统。
《中国宠物食品行业出海国别机会洞察报告》PDF下载
本报告旨在深入分析中国宠物食品的全球出口机遇与国别差异,通过对行业发展现状、出口趋势及各国政策环境的研究,揭示中国宠物食品企业在国际市场中的竞争优势与面临的潜在挑战。
《市场洞察:2025中国汽车出海英国市场动态追踪》PDF下载
根据英国汽车制造商与贸易商协会数据显示,2025年1-9月中国汽车出海英国累计销量142,684辆,同比增长91%,远超英国整体市场4.2%增速。中国汽车出海英国市场份额从年初5%升至9月12.4%,成为英国第二大汽车来源国,仅次于德国。
《2026取暖电器行业简析报告》PDF下载
系统梳理了行业发展脉络、市场格局与未来趋势。取暖电器按能源类型与产品形态可分为电取暖、燃气取暖、辅助本报告为 2026 年中国取暖电器行业专业简析,集成类三大核心品类,行业发展历经萌芽起步、快速成长、加速升级、高质量发展四大阶段,完成了从单一功能向智能化、节能化、场景化的全面演进。
《2026年玩具品类选品指南》PDF下载
玩具品类市场基本概况 玩具品类细分类目介绍 玩具品类认证及平台规则
《TikTok Shop美区ACE商家经营方法论白皮书》PDF下载
自2025年《TikTok Shop美区跨境POP PEAKS出海经营方法论白皮书》发布以来,PEAKS方法论已支持大量商家理解 TikTok Shop 的生意经营逻辑,收获生意增长。伴随着业务发展与市场变化,我们进一步研究 TikTok Shop 商家成功案例和经营模式,将PEAKS系统化升级为面向全体美区商家的ACE经营方法论
《扫地机器人美国市场年度研报》PDF下载
近一年(MAT2025)行业总销售额达24.49亿美元,同比增长39.67%;总销量达820万台,同比增长45.83%。销售额增长主要由销量驱动,而市场平均售价从312.73美元下降至299.53美元,同比降低4.22%,表明市场在快速扩张的同时,价格竞争日趋激烈。
亚马逊公告
AMZ123旗下亚马逊公告发布平台,实时更新亚马逊最新公告,致力打造最及时和有态度的亚马逊公告栏目!
跨境数据中心
聚合海量跨境数据,输出跨境研究智慧。
亚马逊资讯
AMZ123旗下亚马逊资讯发布平台,专注亚马逊全球热点事件,为广大卖家提供亚马逊最新动态、最热新闻。
跨境电商干货集结
跨境电商干货集结,是结合亚马逊跨境电商卖家交流群内大家在交流过程中最常遇到的问题,进行收集整理,汇总解答,将会持续更新大家当前最常遇见的问题。欢迎大家加入跨境电商干货集结卖家交流群一起探讨。
AMZ123跨境电商
专注跨境行业热点事件报道,每日坚持推送原创深度热文
跨境科普达人
科普各种跨境小知识,科普那些你不知道的事...
AMZ123卖家导航
这个人很懒,还没有自我介绍
亚马逊全球开店
亚马逊全球开店官方公众号,致力于为中国跨境卖家提供最新,最全亚马逊全球开店资讯,运营干货分享及开店支持。
首页
跨境头条
文章详情
从销售订单到销售出库单:库存锁定、释放与扣减的那点事
PM维他命
2025-12-16 08:07
1152

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

在之前做海外仓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% 亚马逊卖家都在关注的微信公众号

二维码

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

回顶部