做供应链和库存管理的人,大概都经历过这种时刻:系统里明明显示有库存,销售却说没货可卖;采购说货已经订了,计划却还在催料;财务问月底库存金额,几套报表数字却对不上。这些混乱,很大程度上不是数据出了问题,而是对“在手量、可用量、在途量、拖欠量”这几个基本概念的理解不一致。在NetSuite里,这几个量各有各的来源和计算逻辑,搞不清楚它们,后续做需求计划、承诺交期、跑MRP,都会踩坑。这篇就把这几个量的定义、公式和实操中的关键判断一次讲透,给做计划、采购、库存和供应链顾问的同学做个参考。
1. 先把手头这几个“量”的概念掰扯清楚
1.1 在手量:仓库里“此时此刻”真实躺着的数
在手量(On Hand)是库存管理的地基,其他所有计算都从这里出发。它表示在当前这个时间点,某个物料在某一个库存地点(Location)里实际存在的数量。我习惯把它理解成“你钱包里现在有多少现金”,不是工资卡里的数,不是信用卡额度,就是此时此刻攥在手里的钱。仓库里物理存在的、能盘点到的,都算在手量。
在NetSuite里,在手量还会被库存状态(Inventory Status)切分。比如同一批货,一部分放在“可用”状态,可以随时发运;一部分放在“质检中”,要等检验结果;还有一部分放在“冻结”,可能是残次品或等待处理。这些都是在手量的组成部分,但并非都能马上拿去卖。所以只看“在手量”一个数字,往往会高估可发货能力。实操中,我建议计划员每天关注的第一张报表,就是按状态展开的库存快照,而不是笼统的总数。
还有一个容易忽略的点:NetSuite是分地点(Location)管理库存的。总部看到的是所有仓库的总和,但华东仓的在手量和华南仓的在手量是各自独立的。跨地点调拨没有完成之前,每个地点的在手量不会自动合并。这点在做多仓业务时特别重要,后面章节会展开讲。
1.2 可用量:能拿出来“拍胸脯”答应的数
可用量(Available to Promise,ATP)比在手量更贴近业务实际。它回答的问题是:“现在如果来一个客户订单,你能承诺多少?”它不是简单等于在手量,因为你需要同时考虑两件事:一是已经答应给别的客户的量(拖欠量/已承诺量),二是已经在路上马上就能补进来的量(在途量)。
还是用钱包做类比:你钱包里有1000元现金(在手量),但你已经答应朋友下周二借他300元(已承诺),同时你老婆说今晚回家给你500元(在途量)。那你现在能拍胸脯答应别人“明天能给的钱”是多少?既不是1000,也不是700,而是大约1200。这个数,才是可用量。NetSuite在销售订单的“可用量”字段,以及物料需求计划(MRP)里运行的计算,核心逻辑就是这么来的。
需要注意的是,可用量的计算方式在NetSuite里是可配置的。是只看在手量减去已承诺,还是再加上在途量,甚至要不要预留安全库存,都取决于“按可用量承诺”的设置。所以在不同公司,同一个物料可能有不同的ATP结果,这不是系统算错了,而是业务规则选择不同。理解这一点,比背公式更重要。
1.3 在途量:已经下单但还没落袋的量
在途量(On Order / In Transit)指的是你已经向供应商下了采购订单、但货还没到仓库的数量,也包括从其他仓库调拨过来、已经发出但还没签收的数量。这个量代表的是“未来会到达的供给”,是一个正方向的增量。
我经常跟业务同事说,在途量就像你在电商平台下了单、正在快递路上的货。钱已经付了,订单状态显示“已发货”,但东西还没拿到手里。在计算库存可用量的时候,这笔货是应该被算进去的,因为它是确定性的未来供应,不像需求预测那种不确定的东西。
NetSuite里,在途量在单据层面会体现在两个地方:采购订单的“已批准未收货”数量,以及转移订单的“已发运未接收”数量。对制造型的物料,在制品(Work in Process)的未完工数量,某种程度上也是“在途量”的一种形态——原料已经领出去了,产线还在加工,成品还没入库。但严格来说,在NetSuite的标准计算里,WIP和常规的在途量是分开记录的,跑MRP时会分别处理。
1.4 拖欠量:欠客户的,还是欠供应商的?
拖欠量(Backlog)在中文语境里稍微有点歧义。从销售角度,它指的是已经接单、承诺了交期、但还没发货给客户的数量。这部分库存已经在“物理上”被划走了,虽然货还在仓库里,但实际上已经属于别人的订单,不能再拿来承诺新客户。从采购角度,拖欠量也可以指供应商欠你的、逾期未交的采购数量。
NetSuite标准功能里,销售订单上的“已承诺数量”(Committed)字段,就是销售拖欠量的核心来源。而供应商的采购拖欠,通常体现在采购订单行上“计划收货日期已过但尚未收货”的记录里。搞混这两个口径,会导致同一个“拖欠量”的词在不同部门嘴里代表完全相反的意思:销售说的拖欠量是“别人欠客户的”,采购说的拖欠量是“供应商欠我们的”。
所以在企业内部,我强烈建议统一术语。说Backlog的时候,加一个前缀:销售拖欠量还是采购拖欠量。否则开会的时候各说各话,统计出来的报表也永远对不上。
2. NetSuite里这些“量”藏在哪,怎么查
2.1 页面和字段分布
如果你用的是NetSuite标准界面,打开物料(Item)记录,切到“Location”子页签,就能看到每个地点下的一排关键数量字段:在手量(On Hand)、已承诺量(Committed)、在途量(On Order)、可用量(Available)等等。这些字段是系统实时汇总出来的,你不需要手工维护,但你必须知道它们各自的取数来源。
还有一个经常被忽视的入口是“Inventory Snapshot”报表。这张报表能按物料、地点、库存状态,把所有数量维度铺开。我通常会在每天早上让系统定时把这报表发到邮箱,用一屏快速扫一遍异常物料:在手量为负的、可用量为负的、在途量长期挂账没变动的,都从这里一眼定位。
Bin管理也是同样的逻辑。如果一个物料启用了Bin(库位),在手量会被进一步拆到每一个Bin,甚至同一个Location的不同Bin之间,还可以设置不同的库存状态。查看数量时如果不带Bin维度,有些差异就藏在细节里让你找不到原因。
2.2 用保存搜索把数量拉出来
在系统里点来点去看单张物料效率太低,遇到要对账、要分析的时候,我更习惯直接建保存搜索(Saved Search)。有几个关键字段值得记下来:
location.quantityonhand:指定地点在手量location.quantityavailable:指定地点可用量location.quantitycommitted:指定地点已承诺量location.quantityonorder:指定地点在途量(采购在途)location.quantityintransit:转移在途数量
举个例子,如果我想找出“在手量大于0但可用量小于0”的所有物料和地点,就建一个物料搜索,汇总维度选地点和库存状态,在条件里加一个Formula Numeric:NVL({location.quantityonhand},0) > 0 AND NVL({location.quantityavailable},0) < 0。这个逻辑很简单,但实际上非常有用:它能暴露那些“有货但发不了”的尴尬物料——要么是被订单全占满了,要么是库存状态被冻结了。
做这种搜索的时候,有个小坑要注意:如果用汇总(Summary)类型,一定要把“汇总依据”设置对。按物料汇总和按物料+地点汇总,得到的数量逻辑完全不同。我见过一个同事建了一张搜索,总部看没问题,一筛选到具体门店就数字错乱,就是因为漏了地点这个维度。
2.3 库存状态对数字的影响有多隐蔽
NetSuite的库存状态(Inventory Status)是一个很容易被忽略、但影响巨大的功能。同一个物料、同一个地点,放在“默认可用”状态和“质检中”状态,在手量上都是计入总在手量的,但可用量只会算那些可以发货的状态。
我曾经帮一家公司排查差异。他们的可用量报表显示有200个,仓库却说一件货都发不出来。找了一圈,发现那200个全部处于“待报废”状态——系统从总量上把它们算在了在手量里,但因为状态不允许负库存发运,它们永远参加不了可用量计算。从那以后,我给他们的建议是:看可用量,永远要把库存状态作为第一筛选条件,不要直接看总量。
另一个常见场景是Bin和状态联动。一批货进入仓库后,如果收货的时候没有指定Bin状态,默认可能是“可收货”或“可用”。但如果质量部门在Bin上后来改了状态,数量并不会自动跟着动,需要做一次库存调整或状态变更单。这种数据不一致极难排查,因为报表上所有字段看起来都正常,但业务就是用不了。
3. 计算公式逐条拆解,到底怎么算
3.1 在手量的来源公式
在手量不是凭空出现的一个字段,它是所有库存事务(Inventory Transaction)的结果。NetSuite里影响在手量的单据包括:采购收货、销售发货、库存转移、库存调整、组装/拆解、工单完工入库、退货入库等等。用公式来表达就是:
在手量 = 期初数量 + 所有入库事务数量 - 所有出库事务数量 + 调整净额
这个公式看起来简单,实操中要注意的是“期初”怎么选。如果你查的是系统今天显示的On Hand,那它是系统上线或最后一次盘点后所有事务累计的结果。如果上线前的期初导入错了,或者中途做过没有单据支撑的手工调整,后面所有基于在手量的计划都会失真。
另外,NetSuite保留了事务历史,你可以通过“库存工作簿(Inventory Worksheet)”或“库存明细报表”反查任何地在手量的构成。遇到账实不符时,我的建议永远是:先截图当前的手量,再跑一张明细报表,逐笔核对时间段内的收、发、调整,和实际仓库卡片的流水做比对,差异点通常就是漏单或者重复过账的位置。
3.2 可用量的经典公式与NetSuite实现
手写公式的话,可用量可以这样表达:
可用量 = 在手量 - 已承诺给销售订单的数量 + 在途量(采购在途 + 转移在途)
为什么是这种结构?因为你要回答的是“现在还能答应客户多少新订单”的问题。已承诺的数量虽然还在仓库里,但已经是别人的了,必须从在手量里扣掉;在途的数量虽然不在仓库,但它是确定的未来供给,可以向客户承诺“货一到就发”,所以加回来。
NetSuite在具体计算时,允许你在“Item → Planning”里设置可用量的计算方式。有几种常见选项:
- 只考虑在手量和已承诺量:最保守,适用于现货销售且供应商补货极不可靠的场景。
- 在手量 + 在途量 - 已承诺量:适用于大多数标准电商和分销场景。
- 在手量 + 在途量 - 已承诺量 - 安全库存:最稳健,适用于关键物料或客户服务要求极高的场景。
安全库存在这里起的是“缓冲垫”的作用。你可以把安全库存理解为:就算手头数字上够卖,但这部分量你永远不希望动它,留在手里防止意外波动。把它纳入扣减项后,ATP会更保守,但会极大减少超卖风险。
3.3 自定义“在途量”口径公式
NetSuite的在途量至少要拆成两个来源:
在途量 = 采购在途(PO On Order)+ 转移在途(Transfer In Transit)
采购在途指的是采购订单行项目已经批准、但还没有收货完成的数量。这个数相对好理解,只要供应商送货单据没做最终匹配,它就一直在账上挂着。要特别注意的是分批收货的情况:一张PO订了100个,仓库已经收了30个,那在途量算的是剩下的70个,而不是原始订单的100个。
转移在途对应的是转移订单(Transfer Order):从一个仓库发出、已经被“发运”但没有被“接收”的数量。这个过程在NetSuite里分为“货运(Fulfill)”和“入库(Receive)”两步。货从A仓发出去的那一刻,A仓在手量就减少了,B仓既不显示在手量也不显示在途量,只有在途量增加。直到B仓做接收,这笔数量才变成B仓的到手量。中间这段时间,“货在车上”,就是转移在途最直观的体现。
如果你做的是组装件或制造件,在制品(WIP)里的未完工数量,在某种程度上也是“在途量”的变体。但NetSuite里WIP的核算和库存账是分开的。处理工单时,你看到原料被领走、成品未入库,这时候原料的库存少了,但成品的“在订单量”不会像采购那样直接体现在On Order里。这一点跑MRP的时候特别要注意,否则很容易低估需求,导致重复下达工单。
3.4 拖欠量(已承诺 + 未发运)的算法
销售拖欠量(Sales Backlog)最准确的口径,是所有销售订单上“已承诺但尚未履行/发运”的行项目数量之和。NetSuite在履行(Fulfillment)之前,销售订单行上的数量都会被记录为“已承诺”(Committed)。一旦做了发运,这个承诺量就会被“释放”,同时库存出库。
用公式表达:
销售拖欠量 = Σ(未发运销售订单行项目的数量 - 已发运数量 - 已取消数量)
这里的“承诺”可能是自动的,也可能是手动的。NetSuite里销售订单可以设置“自动承诺库存”(Auto-Promise),也可以用手工“承诺库存”按钮。自动承诺模式下,系统会根据当前的ATP来决定是否全部满足。如果ATP不够,订单行可能被部分承诺甚至不承诺。这些状态直接决定了拖欠量的口径,所以做超卖分析时,务必把“承诺状态”和“数量”一起看。
另一种“拖欠量”来自采购侧:你向供应商下的采购订单,交期已过但还没到货。这个量在系统里没有专门一个叫“采购拖欠量”的字段,但可以通过保存搜索轻松拉出来,条件是:PO Status = Pending Approval/Approved,行项目的“计划收货日期 < 当前日期”,且“已收货数量 < 订购数量”。这个数是评估供应商交付表现的重要依据,也是跑MRP时判断需求要不要提前或延后的关键输入。
4. 特殊场景下,这些“量”是怎么联动的
4.1 多地点库存:地点隔离下的计算差异
NetSuite里,默认库存是分地点(Location)独立核算的。A仓的在手量、可用量、在途量,和B仓完全无关,除非你启用了“跨地点可用量查询”或“全球库存可用量”之类的功能。这意味着,即使全公司总的在手量有1000个,但在某个客户要货的地点可用量是0,那这张订单还是不能接。
放在实操里,多地点带来的经典问题是:计划员按总部汇总跑了一次MRP,算出需求是500个,但实际库存分布在三个仓,每个仓都不足。这时候就要考虑是手工做转移订单调拨,还是启用NetSuite的“库存再平衡”功能。如果启用了采购建议或补货计划,系统会把地点维度考虑进去,为每个地点独立计算补货建议。地点隔离本身不是坏事,它保证了账实一致;但如果你不加说明地给多个地点共享一个库存池,就会导致计划错误和超卖。
4.2 组装与制造件的特殊计算
对于组装件(Assembly Item),在手量的概念对成品和组件是不同的。成品的在手量,是完工入库的数量减去发货的数量;组件的在手量,则要考虑已经被“领料”出去的部分。跑MRP时,如果只看成品在手量而忽略组件在途量和已分配量,备料就会出大问题。
我举一个真实的例子:某公司做设备组装,一台设备需要2块控制板。控制板的在手量系统显示有100块,看起来够做50台设备。但实际上,已经有30台设备的工单下达了,还没有领料,系统里那60块控制板已经被这些工单“预占”了,只是没有在库存数量上直接显示出来。如果这时计划员直接按50台设备去下采购单,就会导致重复采购。正确的做法是,在计算可用量时,把“已下达工单的组件需求”也算进已承诺(Committed)扣减项。NetSuite中通过工单的“已分配数量”就能看到这个预占,只是你必须有意识地去查它。
4.3 负库存、安全库存和预测对可用量的扰动
负库存(Negative Inventory)是NetSuite应用中最普遍的“数据污染源”。库存被允许发出超过在手量的数量后,在手量就会变成负数。负库存不影响你在系统里继续做单据,但它会把所有基于在手量的计算都搞乱:可用量可能虚高,拖欠量和在途量对不上,MRP计算出的补货建议也失去了参考意义。
从根上治理负库存,有几个手段:设置库存编码规则禁止负库存,或者用“存货充足度提示”让用户知道库存不够。但更现实的场景是很多公司因为业务灵活性的考虑,允许负库存发生。那就要制定一个每周对账机制:把手量为负的物料清单拉出来,逐一分析是漏收货、漏发运、还是采购订单还没到但销售已经先发货了。很多时候,负库存只是一个单据时序问题,并不是真的账错了,需要靠规范的月末结账流程来及时校正。
安全库存和预测则会影响可用量的“余量判定”。在做需求计划和库存补货时,如果你的ATP只是简单的手量+在途-拖欠,那安全库存实际上没有被体现。只有把安全库存纳入可用量公式,或者用NetSuite补货计划里的“安全库存”和“再订购点”设置,系统才会自动在库存跌到警戒线时生成补货建议。顺带提一个我的习惯:定期检查再订购点和安全库存参数是否还适配当前业务量。很多公司业务翻了几倍,参数却几年没动,要么库存积压,要么频繁断货,其实问题不在算法,在维护。
4.4 时间维度:计划日期和预期日期的坑
最后,还要提醒一个很多人忽略的维度:这些“量”不一定是按“今天”算的,MRP和可用量运算可以按未来日期展开。比如采购在途,你要区分它是“今天能到”还是“30天后才能到”。如果销售订单承诺今天发货,你只能看今天能到的在途;如果客户给了一个宽松交期,比如一个月后发货,那当前在途确实可以参与ATP计算,但要按到达日期折算。
NetSuite物料需求计划会把“计划收货日期”作为关键字段,用它来计算未来每一天的预计可用量。在“Item”页面的“Supply Planning”子页签,你可以看到按时间推移的预计库存。不过这种计算依赖计划日历、提前期和订单截止日期,任何一环设置不准确,都会导致未来某一天的可用量虚高或虚低。我习惯每个月和计划团队过一遍所有主要物料的提前期,特别是海外采购的提前期。现实中提前期一变,整个ATP曲线都会跟着变,不更新就必然出错。
5. 常见问题与排查技巧实录
5.1 在手量看着有货,却不能发运
这个问题我之前提到过,核心是库存状态在作祟。排查步骤,我建议按顺序来:
- 打开Item页面的Location子页签,先确认“在手量”是不是大于0。
- 查看同一物料的库存状态是否有“质检”“冻结”等非可用状态。
- 在Bin视图下按Bin状态筛选,看看是否有Bin被设置成了不可发运。
- 查看是否有关联的销售订单已经部分履行,剩余数量被另一个订单承诺。
前两年我配合过一个公司排查,最后发现是仓库人员在做“库存调整”时,误把一批货的状态从“可用”改成了“待处理”。单据一切正常,但就是发不了货。这个排查过程虽然简单,但没有按“状态→地点→Bin→订单”的逻辑顺序的话,很容易绕圈子。
5.2 可用量变负数了怎么办
可用量是负数,通俗地说就是“超卖”了。排查时先区分两种情况:一种是在手量本身是正的但所有货都被承诺出去了,另一种是在手量已经是负的。第一种好办,等补货或通知客户延期即可;第二种就要往前追查业务流程的哪个环节把库存发超了。
NetSuite里查看“负库存”历史,可以进入库存调整或发运单据,找出产生负值的具体事务。如果一个物料长期处于负在手量,我会建议完全清空这个物料的历史问题:关掉现有订单的承诺状态,做一次库存盘点,用库存调整把账调到“0”,再重新建立正常的补货循环。虽然这看起来是个操作干预,但它能把数据基线重新拉回正确,否则带着负数跑MRP,系统永远会给你一个无法落地的补货建议。
5.3 报表里的在途量与采购部门口径对不上
这是一个高频冲突:采购看PO说“还有500在途”,计划员看系统却说“在途是300”。为什么?因为两者对“在途”的定义不同。采购说的500是PO的未收货总数,计划员看的300可能是按计划到货日期在当前日期之前的那部分,另外200可能计划日期在30天后。
排查办法:在保存搜索里把PO行项目的“订购数量”“已收货数量”“剩余数量”“计划到达日期”全部拉出来,按日期分段汇总。分清“逾期未交”和“未来在途”两个概念。口径一致后,再和采购沟通,大家才在一个频道上。说到底,这不是系统问题,是定义问题。
5.4 结账后发现期初库存被自动调整了
NetSuite在做库存结账(Inventory Close)时,可能会产生与数量相关的差异调整,尤其是启用了加权平均成本或平均成本法的情况下。这些调整有时会被记录为“成本调整”而非“库存调整”,所以你在数量报表里看不到变化,但金额变了;有时候也会因负库存被系统自动生成调整单,导致库存数量跟着变。
碰到这种“自己动了”的数量,不要急着改单,先把“库存审计线索”和相关期间的事务列表导出。如果确认是结账程序自动产生的调整,保留一份审计记录,并在下次盘点时纳入差异处理。最怕的是有人直接删调整单,这样成本账和数量账都会被破坏,后患无穷。
6. 配置和日常维护里值得注意的几个细节
6.1 关于“承诺方式”的系统选项
NetSuite销售订单上,承诺库存有三种常见方式:自动承诺、手动承诺、不承诺。自动承诺适合标准化产品、库存数据准确的公司,能减少人工判断。手动承诺则适合按单生产、定制类业务,销售下单时并不立即占库存,等生产好了再手动分配。不承诺模式更极端,适用于完全按单采购的业务,系统里库存根本不会为这张订单预留。
日常业务中,自动承诺的“承诺顺序”是可以配置的,比如“按订单日期先后”“按发货日期先后”“按创建日期先后”。这里的优先级设置会直接影响谁先拿到库存、谁被拖欠。我见过一家公司在促销季忘了改承诺顺序,结果老客户的补货订单一直被新的大额促销订单挤掉,客服压力巨大。配置不难,但每个季度业务策略调整时,要和运营一起重新确认。
6.2 预测与计划参数设置
启用NetSuite的“需求计划”(Demand Planning)时,它会基于历史数据生成预测。预测数量会进入“预计可用量”的计算。如果你的业务波动比较大,预测参数设置不当,会让MRP生成非常激进的采购建议。我个人的经验是:初期先用保守的预测模型,比如按历史平均加一个安全库存系数,跑两个周期后,再根据准确率反馈调整模型。一切自动化的前提都是数据有规律,数据没规律的行业,人工计划仍然是主力。
6.3 月度/周期盘点的配合
不管系统算得多漂亮,周期盘点永远不能省略。NetSuite里可以设置库存盘点单(Count Worksheet),按地点、Bin、物料状态生成待盘清单。盘点差异会被记录为库存调整,同时影响在手量和库存金额。盘点的频率我认为至少对A类高价值物料每周盘一次,B类和C类按月度或季度滚动。数据准确度只有上去了,前面讲的所有公式和报表才有意义;数据不准,任何高级算法都是空中楼阁。
6.4 日常监控的看板和提醒
建一套数量健康度的监控,是保证库存系统长期可靠的关键。我建议至少做这样几个看板:
- 在手量为负的物料清单(数据污染源)。
- 可用量为负但库存状态显示可用的物料清单(超卖风险)。
- 逾期未交的采购订单行(供应商拖延)。
- 长期未发运的销售订单行(客户需求变更或库存不足)。
- 超过X天没有数量变动的慢周转物料(呆滞信号)。
把这五个清单做成保存搜索后,挂到仪表板(Dashboard)。每周花20分钟过一遍,就能规避掉大部分库存数据问题。做这些看板不复杂,难的只是坚持看、坚持跟进处理。系统健全是团队的习惯和责任机制撑起来的,不是某个字段或公式能替代的。
写在最后
做了这么多年供应链系统,我最大的体会是:NetSuite的库存数量字段都是“时点快照”,它只反映截止到当前这一秒的数据,不包含趋势,也不替你决策。真正让这些数字起作用的,是一套围绕它们的业务规则、盘点纪律和跨部门共识。你不需要背下所有字段名,但你必须理解每个数字背后的单据来源和业务前提。遇到数据对不上的时候,先别急着改数,回到事务流里去找原因,才是稳妥的做法。这套逻辑理清楚了,无论是做计划、跟采购还是对上财务,你都胸有成竹。