MRP物料需求计划:BOM展开、净需求与提前期倒推
简介:这份PPT面向生产管理、库存控制与MRP入门学习者,围绕物料需求计划的核心逻辑展开,帮助理解传统库存管理在高库存与低服务水平之间的矛盾,以及最终产品连续需求同相关物料块状需求的冲突。内容从主生产计划、物料清单和库存记录三项输入切入,串联采购指令单与生产指令单的输出关系,并讲解粗需求量、预计入库量、现有库存量、净需求量、计划订货量与计划投入量的计算口径;BOM分层编码、物料需求倒推及电表案例也有涉及,可用于课堂讲解或自学梳理。包内共1个PPT文件,约458KB,便于快速浏览和重点复习。目前已有676人学习,适合希望用较短时间建立MRP整体框架、理清BOM与期量标准关系的读者。
1. 物料需求计划:为什么“不缺料”反而比“零库存”更难做到
一家做电表的工厂,最怕的不是订单少,而是生产线停在那里等一颗螺丝。仓库里堆着三十万的成品库存,车间却因为某个型号的塑料外壳没到货而停了三天,这种事在制造业里并不稀奇。反直觉的地方在于:库存总量很高,服务水平却依然很低,两者并不矛盾,因为传统库存管理把每一种物料当成独立项目来管,用经济订货批量独立补货,最终产品的连续需求和相关物料的块状需求被混在一起算,结果就是该来的没来、不该囤的囤了一堆。物料需求计划(MRP)要解决的正是这个错位:它不预测零件,而是从最终产品的主生产计划出发,顺着产品结构一层层往下推,把“生产什么、用到什么、已有什么、还缺什么、何时订货”这五个问题用一个公式串起来——(生产什么 × 用到什么)− 已有什么 = 还缺什么。搞懂这套推导顺序,就搞懂了制造业信息系统的骨架。
1.1 传统库存管理到底错在哪:独立需求与相关需求的混淆
要理解 MRP 的设计动机,得先看清楚它替换掉的那套方法为什么失效。传统做法对原材料、零部件、毛坯、辅助工具乃至办公用品一律当作独立需求处理,也就是假设每种物料的需求相互无关,各自按历史消耗做预测、按 EOQ 订货。问题在于,除最终产品之外的绝大多数物料其实是相关需求——它们的消耗量完全由上层产品的产量决定,自己并没有独立的市场。
把相关需求当独立需求管,第一层代价是盲目性。举个原文里的例子:某企业对某零件的需求在九个周期内呈现块状分布,需求集中在前几个周期,后续几个周期几乎为零。按 EOQ 算出的经济订货批量是 80 件,于是系统每隔一段时间就补 80 件,哪怕当期实际装配只需要 30 件,多出来的 50 件就变成了躺在库房里的资金占用。更麻烦的是,这种补货节奏和真正的装配节奏不同步,需求高峰那几周可能反而缺料。
第二层代价是低库存与高服务水平无法兼得。原文点得很直白:传统方法使得低库存与高服务水平不能兼得,最终产品的连续需求与相关物料的块状需求之间存在矛盾。成品面对的是市场,需求相对平滑连续;而零件面对的是装配节拍,需求是一批一批的块状脉冲。用一套平滑的补货逻辑去应对脉冲式的消耗,要么库存堆高保平安,要么压低库存承担断料风险,中间没有第三条路。
提示:判断一种物料该用哪种方法,看它的需求来源。直接面向市场销售的是独立需求件,用预测和 EOQ;被上层产品消耗的是相关需求件,用量由 BOM 展开决定,不该独立预测。
1.2 MRP 的两个基本原理和一个通用公式
MRP 的基本原理只有两条,但这两条决定了整个系统的计算方向。第一条:从最终产品的主生产计划(MPS)推导出对相关物料的需求量和需求时间。第二条:根据物料的需求时间和生产(订货)周期,倒推出其开始生产(订货)的时间。第一条解决“要多少”,第二条解决“什么时候动手”,两者合起来才是完整的物料需求计划——只算量不算期,等于把库存问题从“太多”换成“太晚”。
这里的核心思路是倒推。传统补货是看到库存见底再补,MRP 是知道第 12 周要交 100 台成品,装配提前期 1 周,就推出第 11 周必须开始装配;外壳采购提前期 3 周,就推出第 8 周必须下采购单。时间轴从右往左推,这叫反工艺顺序。这条倒推链条之所以能成立,前提是每种物料都有确定的提前期,以及产品结构能被准确分解——这两个前提恰好对应 MRP 的两大输入:BOM 和库存记录。
通用公式写得再简洁些:(生产什么 × 用到什么)− 已有什么 = 还缺什么。生产什么来自 MPS,用到什么来自 BOM 的展开系数,已有什么来自库存记录里的现货量、已分配量和预计入库量。三者相减得到的缺口,再按提前期反推下单时点,就是 MRP 的全部输出——采购指令单和生产指令单。
1.3 一个具体算例:100 台成品背后是六种物料的数量传递
抽象讲完,用原文那张产品结构图走一遍,机制立刻变得具体。最终产品 A 为零层,往下第一层是部件 B 和 C,B 的用量是 2,C 的用量是 3;再往下,D 同时出现在 B 和 C 的下层,B 下用 1 个,C 下也用 1 个;U 在 B 下用 2 个;V 在 C 下用 1 个;W 在 C 下用 2 个。
要生产 100 件 A,各料项的需求量分别是:B 为 2×100=200,C 为 3×100=300,D 为 1×200+1×100=300,U 为 2×200=400,V 为 1×300=300,W 为 2×300=600。注意 D 这一项——它是典型的共用件,同时挂在 B 和 C 下面,需求量必须把两条路径的贡献加起来,而不是取其中一个。这就是 BOM 展开时最容易翻车的地方,也是后面讲低层码时要专门处理的场景。
再注意数量传递的方向:从 0 层往 3 层逐层下推,每一层的需求量由上一层计划投入量乘以 BOM 中的用量系数得到。这也解释了为什么 MRP 不允许跳层计算——上层还没算完,下层的总需求量根本无从确定。原文强调的“信息处理从上至下,n 层未处理完之前,不能处理 n+1 层”,说的就是这条依赖链的强制性。
1.4 三个输入与四类输出:MRP 的逻辑闭环
MRP 的信息系统有三个关键输入:主生产计划(MPS)、物料清单(BOM)和库存记录。MPS 回答“生产什么”,来源是潜在客户、预测和合同;BOM 回答“用到什么”,本质是一棵产品结构树;库存记录回答“已有什么”,里面装的是现货量、已分配量、即将入库量,以及失窃、报损这类损耗调整。
三个输入经 MRP 运算后产生四类输出:采购计划、生产计划、建议的加工及采购计划,以及对各种物料具体需求的措施提示信息。这些输出的形态是订单的发出时间和数量,而不是一句“该补货了”。原文特意标注了一句:措施提示信息不等于生产指令。这是设计上的一个分寸感——系统只负责算出缺口和时点,是否真的下达由计划员结合产能、供应商状况判断。
从系统视角看,这个闭环还接了两条反馈线。设计侧的产品结构修改、物料用量增减、材料代用,会直接改写 BOM 的展开系数;销售侧的预测不准、品种变化、数量变化、交货期变化,会改写 MPS。库存侧的现货量、已分配量、即将入库量以及失窃报损,会改写可用量。三条线任何一条变动,MRP 的运算结果都得重算一遍。生产厂长列举的那些烦恼,产品信息不确定、主生产计划不确定、库存信息不确定,本质上都是这三条反馈线的噪声。
2. 物料清单:为什么它是一棵必须分层编码的树
BOM 在很多人印象里只是一张“产品由哪些零件组成”的清单,但在 MRP 里它是数据结构,而且是带层级语义的数据结构。它的编制步骤有三条硬规则:把最终产品分解后对全部料项分层编码;以最终产品为零层,与其有直接母子关系的料项为 1 层,依次类推;同一料项按其在各个 BOM 中的最低层次编码。最后这条是关键,也是大多数人第一次接触时会觉得别扭的地方。
2.1 分层编码与低层码:共用件为什么必须挂到最深的层
分层的动机很直接:MRP 要逐层展开数量,就必须知道每个料项在第几层被处理。零层是最终产品,1 层是直接装进成品的部件,2 层是装进 1 层部件的零件,依此类推。这个顺序决定了计算的先后依赖——下层的总需求量依赖上层已算出的计划投入量,所以层号就是计算顺序。
麻烦出在共用件上。以前面那个算例为例,D 同时出现在 B(1 层)和 C(1 层)的下层,也就是在两条路径上都位于 2 层。如果只在第一次遇到 D 时处理它,那么来自 C 的那部分需求就会被漏算。原文给出的规则是“同一料项按其在各个 BOM 中的最低层次编码”,即 D 要被登记为 2 层(两条路径中最低的那一层),并且必须在所有可能引用它的上层物料都处理完毕之后,才轮到 D 计算。
这条规则在工程实现里通常体现为一个低层码(low-level code)字段。每个料项存一个整数,表示它在所有产品结构中能被引用到的最深层次。展开计算时按低层码升序处理,同一低层码的料项可以并行算,因为它们的总需求量都只依赖更低层号物料的计划投入量。这个字段的维护成本不低——新增一个产品结构或改动一处用量,都可能让某个共用件的低层码发生变化,随之整张表的计算顺序也变。我一般会这么理解:低层码不是给机器看的索引,而是给“时间上必须是这个顺序”的依赖关系做的一次静态编译。
2.2 展开计算:从 100 台成品到各层需求量的传递过程
展开计算的核心是一个自顶向下的循环。零层先算最终产品的计划投入量,乘以 BOM 中 1 层料项的用量系数,得到 1 层料项的总需求量;1 层料项结合自身的库存记录算出净需求量和计划订货量,再按提前期反推出计划投入量,乘以 2 层用量系数,得到 2 层料项的总需求量,如此逐层向下。
用原文的算例可以把这个传递过程写清楚:A 的计划投入量 100,B 的用量系数 2,得 B 的总需求量 200;C 的用量系数 3,得 C 的总需求量 300。进入 2 层,D 从 B 这条路得到 1×200=200,从 C 这条路得到 1×100…… 这里要注意,不是 1×300,因为 C 的总需求量 300 是总需求,而传递给 D 的应当是 C 的计划投入量,只有在 C 的库存足以覆盖部分需求时,计划投入量会小于总需求量。原文算例中直接用了 1×100,隐含的假设是 C 的计划投入量为 100,差额由库存消化。这个细节在纸面算例里容易被忽略,但在实际系统里是硬性约束:数量传递的源头永远是上一层的计划投入量,不是总需求量。
这条链还有个方向性约束:n 层未处理完之前不能处理 n+1 层。原因是同一层的多个料项可能共同指向同一个下层料项,必须等这一层所有料项的计划投入量都确定之后,才能汇总出下层的总需求量。原文举的例子是 D 需要把两条路径的贡献相加,说的正是这个汇总动作必须在层内做全。
2.3 方桌案例:从销到产到供的集成数据模型
原文给了一个方桌的例子,用来展示 BOM 不只是物料清单,而是一个集成销、产、供业务信息的数据结构模型。10000 套方桌对应 10000 件桌面、10000 件面框、1.0 个单位的油漆、10000 平方米板材、4.0 个单位的螺钉、40000 件方木、8000 立方米的方木…… 每一项都带一个用量系数,有的是整数,有的是小数(油漆 1.0、板材 1.0、方木 0.2)。
这个模型的集成性体现在三个方向。往销售端看,方桌的订单量是 BOM 展开的起点,订单变化直接改变所有下层的需求量;往生产端看,BOM 里的用量系数决定了每个工序要加工多少件;往供应端看,展开出来的净需求量决定了采购部门要买多少板材、多少油漆。同一份 BOM 同时服务于三个部门,这是它被称为“集成销、产、供业务信息的数据结构模型”的原因。
小数系数的存在还引出一个工程细节:用量系数不一定是整数,油漆按配比算、板材按面积算、方木按体积算,单位都不统一。系统里每个料项都必须绑定计量单位,换算关系错一处,展开出来的需求量就会离谱。这也是实务中 BOM 数据治理最耗时的部分——不是结构复杂,而是基础数据脏。
2.4 时间坐标上的产品结构:MRP 就是简化的网络计划
原文有一张“时间坐标上的产品结构”图,横轴是交货日期,纵轴是时间刻度 5、10、15、20、25,产品结构被画在时间轴上,各层物料的提前期表现为斜向的箭头。这张图想说明的是:MRP 本质上是简化的网络计划,期量标准在这里被重新定义。
传统网络计划方法关注工序之间的先后关系和关键路线,MRP 把同样的思想压缩到物料维度——每种物料的计划投入量对应一个时间点,物料之间的供需关系对应一条带提前期的依赖边。优优先级计划的含义也在这里体现:越靠近交货期的物料,其投入时点越靠后、时间余量越少,属于关键路线上的节点;提前期宽裕的物料可以缓一缓。原文把工艺路线、工序、关键路线这些概念和 BOM 放在一起讲,就是在提示这层对应关系:产品结构是静态的物料依赖,时间坐标给它加上了期量,两者合起来才是可执行的计划。
3. MRP 的计算项目:六个字段如何凑出“还缺什么”
MRP 的计算听上去复杂,拆开看其实就是每层每个料项、每个时间周期上重复六件事:算总需求量、看预计入库、查现有库存、求净需求、定计划订货量、反推计划投入量。这六个字段构成一个周期内的完整状态转移,理解它们的先后依赖,比背公式有用得多。
3.1 粗需求量 Gj(t):上层计划投入量与独立需求的叠加
粗需求量也叫总需要量,公式是 Gj(t) = 非独立需求量 + 独立需求量 = 上层物料计划投入量 × 物料清单中每个组装件的用量 + 独立需求量。这个公式把两类需求合并在同一个字段里,是 MRP 设计上一个很实用的取舍。
非独立需求部分是相关需求,由 BOM 展开得到,来源是上层物料的计划投入量乘以用量系数,这一点在上一章已经展开。独立需求部分则来自备件销售、售后服务、试验消耗这类直接面向市场的用量,它不挂在上层产品下面,必须人工录入或由预测系统提供。把两者加在同一个粗需求量里,好处是后续的净需求计算只需要面对一个数,不用区分需求来源;代价是独立需求部分无法参与 BOM 的一致性校验,数据录入错了系统发现不了。
工程上这里有个常见做法:把独立需求单独存一张表,按料项和周期索引,展开计算时再合并进粗需求量。这样既能保持公式的形态,又能在排错时把两类需求分开看。哪个周期的粗需求量异常,先查是展开系数错了还是独立需求录错了,路径清晰。
3.2 净需求量 Nj(t):库存、在途与缺口的三角关系
净需求量是整个 MRP 里最核心的一个字段,因为它直接决定要不要下单。公式是 Nj(t) = Gj(t) − Hj(t−1) − Sj(t),计算结果为负数时取零,表示库存有余,不需要订货。
三个参数各有讲究。Gj(t) 是本期的粗需求量。Hj(t−1) 是上期期末的现有库存量,注意下标是 t−1 而不是 t,因为本期期初的库存等于上期期末结转过来的量,这个时序细节错一位,整条库存链就断了。Sj(t) 是预计入库量,指已经投产或已经订购、预计可在计划周期 t 内到货入库的物料数量——它是在途量,不是现有量,把它减掉才能避免重复下单。
三者相减的语义是:本期要用多少,减去手头已有的,再减去马上会到的,剩下的缺口才需要新下订单。这个顺序不能颠倒,因为库存和在途的可靠性不同——库存在手,在途还有不到货的风险。取零的处理也很关键:负数取零而不是保留负值,是为了防止“负需求”向下层传递,否则上层库存富余会凭空抵消下层缺口。
注意:Hj(t−1) 用的是上期期末库存,不是本期期末。若在实现中误用本期库存,会形成循环依赖——本期净需求影响本期订货,本期订货又影响本期库存。
3.3 计划订货量与计划投入量:批量规则与提前期的两次转换
净需求量算出来只是“缺多少”,还不是“订多少”。计划订货量 Pj(t) 是按批量规则把净需求量调整成生产批量或采购批量后的结果。批量规则有很多种,最朴素的是直接按净需求下单(批量对批量),也有按固定批量、按经济批量、按周期合并等方式。原文提到“按批量规则将净需要量调整为生产批量或采购批量就是计划订货量”,没有指定具体规则,因为规则本身是可配置的策略,不属于 MRP 的机制内核。
真正体现机制的是下一步:计划投入量 Rj(t′) = Pj(t−L),其中 L 是物料的生产提前期或采购提前期。这一步把时间从“交货时点”反推到“动手时点”,是 MRP 区别于普通库存补货的标志性动作。提前期 L 的准确性直接决定这份计划可不可执行——L 估短了,订单一到就发现来不及;L 估长了,物料提前进厂变成库存。
这两个字段的关系值得强调:计划订货量管“量”,计划投入量管“期”,两者通过提前期这一个参数耦合。也正因为只有一个参数耦合,提前期一旦失真,整条倒推链上所有相关物料的时点都会偏,而量却看起来是对的。这是 MRP 实施里最隐蔽的坑之一。
3.4 时间周期 t 的推进:从 n 层到 n+1 层、从 t 到 t+1 的双重循环
原文的逻辑流程图里有两个嵌套的循环判断:所有时间周期 t 算完没有,所有产品结构层次已分解没有。外层是层次 n 从 0 往深走,内层是周期 t 从前往后推,两个循环的推进顺序有严格约束。
内层周期循环先走完,是因为同一个料项在不同周期的库存是连续结转的——本期期末库存等于下期期初库存,净需求量、计划订货量、可用库存量在时间轴上前后的计算互相依赖。跳过某个周期,后面的库存结转就失去基准。外层层次循环后走,是因为下层的粗需求量依赖上层的计划投入量,层次不推进到底,下层的总需求就凑不齐。
流程图里还有一个“计算 n 层 t 周期物料 j 可用库存量 Hj(t)”的环节,位置在净需求与订货量之后。这个字段是本期算完之后的余额,等于期初库存加预计入库加计划订货量减粗需求量,它会被下一个周期当作 Hj(t) 使用。整条链就是靠这个余额在时间上串起来的,任何一期算错,错误会顺着时间轴一直传下去,这也是 MRP 重算必须全量跑、不能只补算局部的原因。
4. 避坑与排查:MRP 跑出来的计划为什么不像人话
4.1 现象:计划里同一物料在不同周期反复下单,量还很小
原因通常出在批量规则和时间周期粒度的配合上。如果批量规则选的是批量对批量,而时间周期又切得很细,那么每个周期只要有一点净需求就会生成一张订单,结果就是订单碎片化。另一种可能是库存结转算错了,某期可用库存被算成负数或异常小,导致后续每期都在补缺口。
排查顺序建议这样走:先看该料项的粗需求量在各周期的分布,确认是不是需求本身就碎;再看 Hj(t) 在周期之间的结转是否连续,本期期初是否等于上期期末;最后检查批量规则有没有被误配成批量对批量。如果是共用件,还要回头看低层码有没有维护正确,低层码错了会导致某些周期的需求被重复计入。
4.2 现象:某个共用件的需求量明显偏大,像是被算了两遍
这是 BOM 展开里最经典的翻车场景。共用件挂在多条路径下,如果系统在第一次遇到它时就把它算完,后面那条路径的贡献就会在另一个周期被重复加一次,导致总量偏大。
原因在于没有严格按低层码汇总。正确的做法是:同一低层码的所有料项全部处理完毕、把所有上层路径的贡献累加完毕之后,才开始计算该料项的净需求和订货量。解决方式是检查低层码字段的维护逻辑,确认新增产品结构或修改用量系数后有没有触发重算;同时在展开循环里加一道断言,同一料项在同一周期内只能被汇总一次。
4.3 现象:计划显示某物料本周必须下单,但供应商根本来不及
这不是计算错误,而是提前期参数与现实的偏差。MRP 的倒推完全信任输入的 L 值,L 填的是理论采购周期,实际供应商的排产、物流、检验都要时间,两者对不上,计划就会“算得对、做不了”。
排查时把该料项最近几个周期的计划投入量和实际到货日期拉出来对比,看偏差是系统性偏短还是偶发。系统性偏短说明 L 需要整体上调并固化到物料主数据;偶发偏差则要考虑在提前期里加安全时间,或者调整批量规则把下单时点提前。原文强调措施提示信息不等于生产指令,留的就是这个人工校准的口子。
4.4 现象:改了 BOM 用量系数,重跑之后下游计划纹丝不动
多半是数据没有真正落到展开计算读取的那张表上,或者缓存没有失效。BOM 修改涉及产品结构修改、物料用量增减、材料代用三种类型,其中材料代用最容易被漏掉——代用关系往往存在另一张关联表里,展开时如果只读主 BOM,代用料的用量就不会被计入。
解决路径是先确认修改落在哪张表、展开程序读的是不是同一张;再检查低层码是否因结构变化而需要重算;最后确认 MRP 是增量跑还是全量跑,增量跑在没有正确标记脏数据的情况下会沿用旧结果。这类问题的血泪经验是:BOM 变更后不要相信增量结果,全量重算一遍再对比。
4.5 现象:库存明明有货,净需求量却还是正的
先分清“现有库存量”和“可用量”的区别。库存记录里有现货量、已分配量、即将入库量,还有失窃报损这类调整。如果已分配量没有从现货量里扣掉,可用量就会被高估;反过来,如果预计入库量被重复计入,实际缺口会被掩盖。
另一个常见原因是 Hj(t−1) 的下标取错,用了本期库存去算本期净需求,形成自指。排查时把该料项该周期的四个数——粗需求、期初库存、预计入库、净需求——单独列出来手工验算一遍,公式对不上就是实现里的时序或字段取错了。
5. 从倒推到重排:MRP 的边界与它的下一代
MRP 的能力边界,其实在它的两个基本原理里就写清楚了。它假设提前期是已知且固定的,所以能倒推;它假设产能无限,所以敢按需展开。这两个假设让 MRP 的计算变得干净、可复现,也让它在真实车间里经常撞墙——倒推出来的开工时点集中在同一周,车间根本排不开;固定提前期遇上换型、缺人、设备故障,时点立刻失真。这不是实现缺陷,而是设计上的自觉取舍:MRP 先把“物料该在什么时候到位”算清楚,把“能不能做到”留给下一层。
这也解释了原文为什么反复强调措施提示信息不等于生产指令。系统输出的是建议,计划员要拿着这份建议去和产能、供应商、资金对账。MRP 的定位是物料维度的推演器,不是车间的调度器。想让它更贴近现实,业界的做法是往上叠能力:把粗能力计划挂在 MPS 上做平衡,把车间级排产挂在计划订单上做有限产能排程,前者回答“主生产计划现不现实”,后者回答“这批订单按什么顺序上机”。再往后走,就是 MRP II 把财务、采购、销售并进来,以及 ERP 把这些模块统一到一个数据库里。
但无论往上叠多少层,底下的那套推演逻辑没变:从 MPS 出发,按 BOM 展开,扣库存算净需求,按提前期反推时点。这套逻辑之所以能活到今天,是因为它把一个组合爆炸的问题压成了可计算的树形展开——每一层只依赖上一层,每一个周期只依赖上一个周期,局部算对,整体就对。代价是它必须假设下层不受上层之外的干扰,一旦共用件、替代料、联副产品这些交叉关系变多,低层码和展开顺序的维护成本就直线上升。
我自己的习惯是,每次拿到一份 MRP 跑出来的计划,先不看总量,先随机抽三个料项把它们的六个字段手工走一遍:粗需求从哪来、期初库存对不对、在途量有没有重复、净需求取零的边界有没有踩到、批量规则是什么、提前期填的是多少。走通三个,基本能判断这份计划的参数底座是干净的还是带病的。这个习惯是被一次共用件重复计算的事故逼出来的——当时整条产线的计划全线偏移了两周,查到最后只是一个低层码字段没跟着产品结构改。从那以后,我每次改动 BOM 结构或用量系数,都会强制走一遍低层码校验和全量重算对比,再去看计划。希望帮到你。
这份资料把 MRP 的输入、BOM 分层、六个计算字段和逻辑处理流程拆得很细,从 100 台成品展开到各层需求量的算例、方桌的集成数据模型都在里面,适合拿来对照自己手上的系统逐项核对。需要完整内容的话,可以在资源页查看并下载。
本文还有配套的精品资源,点击获取