
这阵子连续帮三个客户排查库存数量异常发现一个特别普遍的现象同一颗物料仓库、销售、采购、客服四个岗位拉出来的数字全不一样。仓库说“库里还有300件”销售说“能卖的只有60件”采购说“有500件在路上”客服系统里还挂着“欠客户40件”。谁都没看错因为大家看的是NetSuite物料记录上不同的字段在手量、可用量、在途量、拖欠量。这四个字段是NetSuite库存模块最核心、也是被误解最多的概念凡是做过库存上线、做过多仓调拨、或者跟销售订单履行打过交道的人几乎都在这上面踩过坑。这篇文章我把这四个量的业务含义、系统计算公式、排查思路一次讲透。不绕弯子直接对着NetSuite的实际数据逻辑讲最后再附一份常见问题速查表。无论是刚接手NetSuite的库存顾问、供应链计划还是被销售天天追问“到底有没有货”的运营同学都可以直接拿去做参考。1. 四个数量的业务含义与系统定位很多人一开始就搞混是因为把“库存数量”当成一个数。实际上NetSuite把库存拆成了四顶帽子每顶帽子回答一个不同的问题。搞清楚这个问题后面的公式就顺了。1.1 在手量仓库里能点得清的实物数量在手量On Hand回答的是最原始的问题这个物料现在有多少实物在仓库里。它的口径是“已经入库、且还没出库”的数量。这里有两个容易被忽略的边界条件是按“库存地点”拆分的。同样一个物料上海仓和深圳库分开记合并报表才看总数。多仓业务里不谈地点谈在手量等于耍流氓。是按“库存状态”过滤的。NetSuite里物料可以设置库存状态比如“可用”“质检中”“冻结”。默认情况下只有状态为“可用”的才计入在手量处于“质检中”的物料在账面里是单独的。很多新手上线时最懵的就是系统在手量明明显示0但“非可用库存”里有一大堆因为收货时默认进了质检状态没做状态转移。在手量是其他三个量的地基。它不准可用量、在途量、拖欠量全部跟着歪。1.2 可用量真正能承诺给客户的数量可用量Available回答的问题是现在能告诉客户“有货可以发”的数量到底是多少。为什么不能直接拿在手量去回复销售因为仓库里那300件里可能有120件已经被其他销售订单预定了只是还没出库。这120件就是“已承诺量Committed”。真正还能再卖给新客户的只剩下180件。所以可用量这个字段本质上是给“接单承诺”用的。销售订单录入时系统会按可用量检查能不能分配。如果你开了“允许负库存”超卖确实能录进去但代价就是拖欠量越滚越大这是后话。1.3 在途量已经发货、还没入库的流动库存在途量In Transit回答的是钱已经花了或者货已经发出了但是这批货还没到我们仓库账上在哪它最典型的来源是“转移单Transfer Order”。比如总部仓给上海仓调拨100件总部仓发货确认后这100件就从总部仓的在手量里扣掉了但上海仓还没收到那它挂在哪儿就挂在“在途”。等到上海仓做收货确认在途归零上海仓在手量增加100。采购场景里也有类似概念。NetSuite对采购订单有“在订量On Order”的说法意思是“采购单已批准、但货还没到库”的预期到货量。很多人口语里把PO的在订量和转移单的在途量混成一个“在路上”但系统里是两个字段计算口径完全不同下文公式部分会拆开讲。1.4 拖欠量欠客户的承诺拖欠量Backordered回答的是已经接了客户的单但没按承诺发出还欠客户多少。典型场景客户下单100件仓库只有60件现货你先发了60件剩下40件跟客户说“货到了再补”。这40件在销售订单行上就会标记为“拖欠Backorder”。另一种情况是约定发货日期过了还没发货整单100件全部算拖欠。拖欠量是最能反映供应链健康度的指标之一。它长期居高不下说明库存计划、采购补货、订单履行之间有缺口。这类问题光靠改字段是治不好的得从补货策略和承诺逻辑下手。2. 计算公式拆解NetSuite到底怎么算这节是核心。我直接给出我在客户现场验证过、跟官方口径一致的计算逻辑。需要说明的是NetSuite的库存数量不是在物料主数据里静态存储的“一个数”而是基于库存事务Inventory Transaction实时汇总出来的。理解这一点你就理解为什么筛选日期、筛选地点、筛选状态会导致数字变化。2.1 在手量逐笔事务累计的净结果NetSuite里每一笔库存变动都是一张事务记录。简单说所有让库存增加的记录记为正数所有让库存减少的记为负数在手量就是这些事务的累加。地点L在手量 Σ(该地点的入库类事务数量) − Σ(该地点的出库类事务数量)常见的入库类事务包括采购收货Item Receipt、销售退货Return Authorization / Item Receipt、组装成品入库Assembly Build、库存调整正向Inventory Adjustment 、库存转移到本地点Transfer Order Receive。出库类事务包括销售发货Item Fulfillment、采购退货Vendor Return、组装拆解出库Assembly Unbuild / Wip Issue、库存调整负向Inventory Adjustment −、从本地点发出的转移单Transfer Order Ship。这里有两个细节要留意。第一库存调整Inventory Adjustment既可以正向也可以负向做盘点差异调整时它最常被用到第二转移单在发出方扣减、在接收方增加中间过程不参与任何一方的在手量而是计入在途。2.2 可用量在手量扣掉已承诺可用量的核心公式非常短可用量 在手量 − 已承诺量Committed这里的已承诺量指所有有效销售订单行中已经分配到该地点的数量。比如在手量300件已有销售订单分配了120件那么可用量就是180件。但是生产环境里会复杂不少因为NetSuite支持“替代地点分配”。也就是说默认发货地点仓库没货系统允许从其他地点分配。这种情况下某个地点的可用量可能显示为“在手量−本地点承诺量−被其他地点占用的量”所以同一个物料在不同地点查出来的可用量加起来可能不等于该公司整体的可用量。这是很多人对不上账的第一个原因。还有“承诺方式”的区别。订单行可以自动承诺Auto Commit也可以手动承诺Manual Commit还有“不承诺”的状态。只有进入承诺状态的量才会扣减可用量。有些团队把所有订单都设成自动承诺超卖风险就大有些团队习惯先录单不承诺统一到月底手动分配那库存记录上的可用量就会虚高。另外还要注意负库存开关。一旦允许负库存可用量可能变成负数。公式本身不变但是负数的出现说明你在用手量不足的情况下强行接单了。2.3 在途量转移单与采购订单两种口径NetSuite的“在途”严格来说分两类别混淆。转移单在途量的计算逻辑是转移在途量 已从发出地点shipment但尚未在接收地点receipt的数量转移在途量 转移单发货数量 − 转移单收货数量举个实际例子A仓向B仓调拨100件A仓“发运”60件后系统里A仓在手量减60同时这笔交易的60件进入在途。B仓收到60件并做收货确认在途减60B仓在手量加60。如果B仓只收了40件那还有20件留在在途通常意味着货物还在路上或者到货有短装差异。采购订单的在订量计算逻辑则不同采购在订量 采购订单已批准数量 − 已收货数量它代表的是“供应商还没交付、但我们预期会到”的数量。严格说NetSuite里“在订On Order”和“在途In Transit”是两个字段但业务讨论时大家经常混着说。做补货计划时在订量必须纳入考虑否则你看到可用量低就急着下采购单结果原来那批PO到货之后库存直接爆仓。2.4 拖欠量订单行级别的欠交数量拖欠量的计算以销售订单行为单位订单行拖欠量 订单行订购数量 − 该行累计发货数量 − 该行取消数量只要订单行还没“完成Fulfilled”或“关闭Closed”这个差值就会一直存在。全单汇总后就是整个客户维度的拖欠总量。这里要区分“拖欠量”和“已承诺量”。拖欠量是承诺了但没交付的已承诺量是已经分配但没有出库的。两者在系统里是独立字段但业务上经常联动一个物料如果拖欠量大通常它的已承诺量也很高因为系统把有限库存优先分配给了早先的订单新订单能分到的就少。NetSuite还有一个更高级的概念叫“可承诺量ATPAvailable to Promise”。它跟简单可用量的区别是ATP会把未来的预计入库在订量、在途量和未来的预计出库一起考虑算出来的是“未来某个时间点能承诺给客户的数量”。公式大致为ATP 当前在手量 预期入库量PO在订 转移在途 在制 − 预期出库量已承诺 已拖欠 安全库存预留很多制造业客户最终都会走到ATP这条路因为单纯看当前可用量做承诺交期完全不可控。3. 实操排查数字对不上时怎么定位再漂亮的公式落不到数据核查上都是空谈。我在客户现场最常见的开场白是“你先别急着改数把日期、地点、状态三个维度筛清楚80%的异常当场就解释了。”3.1 在手量与实物盘点对不上先检查盘点日之后有没有未过账事务。NetSuite里事务有“已过账”和“未过账”之分未过账的采购收货、发货单不会影响在手量但实物已经动了。很多公司的库管员先做实物移动、后补系统单据盘点日自然会对不上。再检查有没有漏掉组装和拆解事务。制造业客户特别容易漏这个组装成品时只建了BOM但实际生产入库没做Assembly Build导致组件库存只减不加成品库存虚低。第三个高频原因是库存状态卡住了。收货时默认进了“质检中”一直没人做状态转移实物早就发到产线上了系统在手量还是0。这种情况不是数量错了是“状态流转”没跑通。建议多做几个“库存状态转移”的审批流程让库管员在手机端就能操作。3.2 可用量为负、超卖严重可用量为负直接原因就是开了负库存。先看主开关位置NetSuite里“允许负库存”有两个层级一个是公司级偏好一个是物料级设置。物料级的开关会覆盖公司级排查时两个都要看。再看承诺策略。如果订单行设置为自动承诺并且不检查可用量就会一路超卖到负数。我的建议是对成品和热销品开“承诺时检查可用量”对原材料可以考虑负库存因为原材料常有到货批次差异为了一点差异卡住生产发货得不偿失。还有一种情况是“替代地点分配”导致本地点可用量虚高。比如B仓的在手量为0但因为它被设成了A仓的替代发货地点系统在算B仓可用量时会把A仓的库存也算进去。销售一看B仓有货就下单实际发货时B仓根本没货又变成拖欠。这句话一定要转告给销售团队可用量永远是“在当前配送设置下的可承诺量”不是“仓库里一定有的量”。3.3 在途量长期挂账不结清在途量长期不为0九成是转移单的收货环节没人处理。总部发了货目的地仓库却一直没做收货确认在途就一直挂着。这种问题纯粹是流程断点解决方案不是改数据而是设置“转移单逾期未收提醒”每周自动把超过N天未收货的转移单拉列表发给对应仓库主管。还有一种情况是收货数量跟发货数量不一致。供应商少发或者运输破损目的地仓库做收货时只能收到部分数量剩余部分如果没人处理“接收例外Receiving Exception”那差额会永远留在在途。这里要给操作同学一个明确动作但凡收货数量跟转移单数量不一致必须当天建例外记录并让采购或计划人员跟进差异不要让差量烂在系统里。3.4 拖欠量与订单履行确认找拖欠单最直接的方法是保存搜索筛选销售订单行条件是“订购数量 已发货数量”并且订单状态不是已关闭、不是已取消再加上“主履行日期早于今天”拉出来的就是逾期拖欠清单。按客户、按物料、按仓库分组看问题源头一目了然。如果拖欠量集中在少数物料上那是补货问题如果拖欠扩散到几乎所有SKU那是承诺逻辑问题比如销售团队不看可用量就乱承诺或者订单履行规则Fulfillment Rule设置不对导致明明有库存却不自动分配。排查时还有一个容易踩的坑日期口径。NetSuite报表里“拖欠量”默认按当前日期算但客户问“上个月拖欠多少”时必须把销售订单的承诺日期和发货日期都纳入筛选范围。否则上个月拖欠、这个月已经补发的订单也会被误算进去数字直接翻倍。4. 常见问题速查表与绕坑经验4.1 问题-原因-解决速查表我把这几年遇到的高频问题整理成一张表遇到症状直接查就不用从头翻日志了。现象可能原因排查方向在手量远低于实物未过账收货、漏做盘点调整查看未过账事务、库存调整记录在手量远高于实物发货未过账、退货重复收货核对销售发货单、退货处理状态在手量为0但实物有货库存状态卡在质检/冻结检查库存状态、状态转移流程可用量为负允许负库存、超卖检查公司级/物料级负库存开关可用量虚高替代地点分配逻辑查看地点组的发货规则在途量长期挂账转移单未收货拉转移单未收列表、设置提醒在途量有负数收货数量超发货、做错冲销核对收货例外、冲销事务拖欠量异常偏大订单行未及时关闭检查订单状态、履行规则拖欠量重复计算日期口径不对明确承诺日期和发货日期筛选报表与保存搜索数字不一致一个按事务汇总、一个按余额过滤统一过滤条件后对比4.2 几个实用技巧和最后提醒第一给物料建档时就把“默认库存状态”和“是否允许负库存”定清楚。很多项目上线时赶进度库存字段全是默认值上线三个月后开始爆雷再回头改数据远比改设置痛苦。第二多仓业务务必启用“库存地点”维度的权限控制。让上海仓的库管员只能看上海仓的数据既防止误操作也避免他们被其他仓的数据干扰。权限越清晰库存数据越干净。第三所有说法里最坑的一句是“系统帮我算好的库存一定是准的”。NetSuite的库存计算逻辑本身很严谨但它依赖前端的单据操作规范。仓库收货后不及时过账、销售订单关闭条件设得太松或太紧、盘点差异不做调整单任何一个环节脱节四个量都会跟着失真。系统是镜子不是化妆师。最后分享一个我在项目里常用的验证办法找一个有完整业务周期的物料从采购收货、转移调拨、销售发货、退货到盘点调整把它的所有库存事务按时间线拉出来手工按公式算一遍在手量、可用量和在途量再跟系统对比。只要这条链路能对平你对NetSuite库存的理解就过关了以后遇到任何数字异常都能快速定位到具体事务而不是坐在那边猜。这就算是我长期跟库存数字打交道的一点体会公式背得再熟不如亲手验一次。下一篇如果大家有兴趣我再拆一下可用量里的承诺分配Committed Allocation和订单履行规则Order Fulfillment Rule的实际配置案例那块才是真正决定“有没有货可以卖”的幕后推手。