MPS中ATP可承诺量算法解析:从离散到累积,避开实施中的坑
“这批货到底什么时候能交还能接多少单”——做了几年MPS/MRP实施我最常被问到的问题就是这个。放在没有系统支撑的年代回答基本靠计划员翻Excel、打电话催采购、再凭经验拍个数字。后来接触了ERP里主生产计划MPS模块才真正明白ATPAvailable To Promise可承诺量不是系统里多出来的一个普通字段而是连接“销售接单”和“计划排产”的一套核心算法。这篇文章想把MPS中ATP的算法逻辑完整梳理一遍从最基础的计算公式到离散、累积两类经典算法再到真实系统里的实施差异和容易踩的坑。适合刚接触主生产计划的ERP顾问、负责订单承诺流程的供应链人员以及想搞清楚ATP结果到底怎么来的产品经理。1. 为什么MPS要输出ATP搞清楚它是干什么的再看怎么算1.1 产销协调中最难回答的那个问题销售要接单本质上是在问一个问题我答应客户这个交期能不能做到制造要排产本质上也在问一个问题这些订单压下来物料和产能到底够不够这两个问题之间隔着的就是供需平衡。没有ATP之前企业常见的做法是“两层皮”。销售拿着粗估的交期去谈客户计划员等到订单正式进来再排产发现物料不够、产能满了只能回过头去跟销售说“交不了”。这时候客户可能已经答应了终端销售只能硬着头皮去催计划最后变成内部吵架。MPS主生产计划解决的就是这个“对外承诺”和“对内排产”的衔接问题。它把销售预测、客户订单、成品库存、计划产出放在同一个时间轴上看算出每个时间段“还能不能再接新订单”。这个“还能再接多少”的输出就是ATP。1.2 ATP在MPS和MRP之间的位置我见过不少实施项目把ATP和MRP里的可用量检查混为一谈。其实两者作用完全不同。MPS里的ATP面向的是成品或关键物料回答的是“未来某个时间段还有多少可承诺给客户的量”是对外承诺工具。MRP里的可用量检查面向的是所有物料回答的是“某个物料在当前库存和计划订单之下够不够用”是对内核算工具。可以这样理解ATP是MPS跑完之后生成的一份“可接单余额表”它把供给和需求按时间桶算清楚告诉销售和计划员哪些时段的量是可以承诺的、哪些时段已经超卖。MRP则是在MPS确定之后往下展开算所有component的需求。1.3 ATP算法的本质供给减需求但难在“怎么减”ATP的底层逻辑不复杂一句话就是“可用供给减去已承诺需求”。但现实中的难点在于供给不是均匀到达的有期初库存、有在途、有计划接收它们分布在不同的时间点。需求也不是均匀发生的有确认的客户订单、有预测、有安全库存预留还有已经承诺但没录入系统的手工单。承诺是有时间维度的你说“月底前能交20台”那这20台到底算哪一周的ATP所以真正决定ATP算法好坏的不是公式本身而是时间桶time bucket怎么分、供给和需求怎么归集、负数怎么处理。下面我把这个过程拆开来讲。2. ATP核心计算公式与两种经典算法离散和累积到底差在哪2.1 基本公式从一个时间桶说起先把所有复杂的维度放一边只看一个物料在一个时间桶里的ATP。假设我们把计划展望期按周切成多个桶每个桶内ATP[桶] 期初可用库存 计划接收量 - 已承诺订单 - 安全库存 - 预留这里每个术语单独解释一下期初可用库存本时段开始时实际有多少可以动用的库存不是账面结存是扣除了不可动用部分后的数量。计划接收量本时段内会入库的量包括已下达的生产订单、采购订单、在途量。已承诺订单本时段内要求出货的、已经确认过的客户订单。安全库存为了保证服务水平而预留的缓冲这部分不能拿去承诺。预留某些系统里还有“库存预留”概念比如已经分给某个项目但还没形成订单的量。逻辑上很像餐厅的预订系统现有空桌加上未来会翻台的桌子减去已经被预订的桌数剩下的就是还能预订的量。安全库存就是那几桌“只留给vip”的备用桌。2.2 离散ATP按时间桶独立核算离散ATPDiscrete ATP的思路是每个时间桶单独算一次不累计、不跨期。每个桶只看自己的供给和需求算出自己的ATP。举个具体例子。某成品期初库存50台安全库存设为0计划展望期按周切分已下达和计划接收量、已确认订单如下表周次计划接收量已承诺订单离散ATP第1周1008070第2周100120-20第3周1007030第4周1009010第1周ATP 50 100 - 80 70很好理解。但到了第2周公式变成100 - 120 -20。离散算法的结果就是第2周已经没有可承诺量如果客户要在第2周要货系统会直接提示“不可承诺”。离散ATP的好处是简单、直观适合那些订单提前期短、产出节奏固定、各周之间相对独立的场景。但它有一个明显问题它不承认“这个星期少承诺点下个星期就能多挤出来”的灵活性。如果第1周只接10台而不是80台的订单那第2周其实是可以多接的离散算法看不出来。用伪代码表示for each time_bucket b: atp[b] opening_inventory[b] scheduled_receipts[b] - confirmed_orders[b] - safety_stock[b]2.3 累积ATP把余量滚动起来为了弥补离散ATP不能跨期调剂的问题就有了累积ATPCumulative ATP。它的核心思路是从起点开始把每个时间桶的供需差额往后滚动累加。还是上面那个例子假设期初可用50周次计划接收量已承诺订单当期差额累积ATP第1周100802070第2周100120-2050第3周100703080第4周100901090计算方式是第1周50 100 - 80 70 第2周70 100 - 120 50 第3周50 100 - 70 80 第4周80 100 - 90 90注意第2周虽然当期仍然出现负差额但由于第1周的余量70可以补过来第2周累积ATP仍有50。这意味着只要第1周没有把70台的余量全部承诺出去第2周依然是可以接单的。伪代码available opening_inventory for each time_bucket b: available scheduled_receipts[b] - confirmed_orders[b] atp[b] available - safety_stock[b]这里有个非常关键的细节累积方向不同结果会不一样。上面是“从前往后累加”也就是前期的余量可以用来补后期的不足。实际系统里还有“从后往前累加”的变体它优先保证远期的可承诺量适合那些远期订单更稳定、更值得保护的场景。选哪种取决于企业想保护哪个时间段的接单能力。还有一点要强调离散和累积不是非此即彼的。很多系统支持按日、按周、按月混合设置比如未来两周按日离散计算更远的期间按周累积计算。这种混合策略在快速消费品、电子制造行业很常见。3. 真实系统里ATP的扩展算法从单料号到整个供应网络3.1 不同系统对ATP的实现差异真正上线实施过ERP的人都知道教科书公式和系统里的实际算法之间隔着一条沟。不同ERP对ATP的实现有各自的命名和扩展逻辑但底层思路都能归到上面的离散/累积模型。我简单梳理一下几类典型系统的差异不谈具体厂商只看共性系统类型常见用语特点国际主流套装ERP可用量检查、ATP检查规则支持按产品、按产品工厂、按批次多级检查策略配置复杂另一类高端计划系统基于规则集的可承诺量把供应源选择、物料替代、需求优先规则都放进规则集灵活但上线成本高国产主流ERP预计可用量、现存量预计入-预计出更贴近传统库存管理思维通常按仓库维度核算相对直观这些系统在“供给减需求”的底子上扩展了几个维度。第一个维度是检查粒度。最低级的是单工厂单物料ATP只看某个工厂里某个成品的库存和订单。再往上走是按“工厂物料”组合检查还有按批次检查——带有效期的物料尤其需要同一种料不同的批次有效期不同能承诺的量也不一样。第二个维度是供应源选择。一个物料在多个仓库有库存或者有替代料承诺时到底先用哪个仓、哪个批次这就不再是简单的加减法而是带优先级的分配问题。系统通常按“可用日期最早优先”“指定仓库优先”“先到期批次优先”等规则来算。第三个维度是需求归属。预测和实际订单同时存在时先消耗谁、剩余多少能参与ATP这就是所谓的需求消化逻辑。举个例子本周预测100台实际订单80台剩下20台预测要不要继续占用可承诺量如果系统默认“订单先冲销预测”那这20台预测就会被消耗掉剩余ATP可能仍然是满的如果默认预测保留那ATP就会少20台。这种细微差异直接影响销售看到的可承诺量。3.2 ATP不只盯“物料”能力维度也要看还有一个经常被忽略的扩展方向是把ATP从“物料量”扩展到“能力量”。高端计划系统里有所谓产品可承诺量和能力可承诺量的区分。物料可承诺量只看物料供给和需求的平衡回答“有没有货”。能力可承诺量进一步检查关键工作中心的产能回答“就算有料能不能在我承诺的时间做出来”。这个扩展对瓶颈工序尤其重要。曾经有个做装备制造的客户物料库存完全充足但表面处理工序是瓶颈产能已经排满到六周以后。如果只看物料ATP系统会说“随时可交”如果把瓶颈资源加入检查系统才会如实反映“这批货要排队”。这也是后面我要强调的“ATP与CTP结合”的落地问题。4. 影响ATP计算结果的隐藏开关时界、安全库存与展望期4.1 时界锁定窗口内的需求和供给要区别对待时界是MPS里绕不开的概念也是很多人学ATP时最容易忽略的一点。简单理解时界就是计划展望期内画出来的“锁定区间”。需求时界通常对应采购或生产的累计提前期。在这个时界内已有订单基本冻结MPS不会轻易变动。计划时界比需求时界更长时界内的计划订单已经被确认MPS排程算法不能自动调整它们。时界对ATP的影响在于锁定区间内的需求可信度高计划接收量也相对刚性锁定区间外的需求可能还会变计划接收量也可能是未确认的草案。有的系统在计算ATP时会对时界内外的供给和需求分别处理。举个例子时界内有一张预测单还没有转成实际订单系统可能仍然把它当作确认需求计入减项时界外有一张未确认的计划订单系统可能先不计入供给。实际操作中我见过不少企业把时界设置成“拍脑袋”结果MPS跑出来的ATP要么过于保守要么过于激进。保守和激进都不可怕怕的是和实际业务节奏对不上。时界设置要和采购提前期、生产提前期、订单评审周期对齐不是越大越好也不是越小越好。4.2 安全库存该不该扣扣多少直接影响可承诺量安全库存是ATP计算里最容易被误操作的地方。公式里如果直接减去安全库存意味着安全库存以下的库存是“看得见用不着”的。问题在于很多企业的安全库存是凭经验填的没有经过统计分析。某次我接手一个诊断项目发现一个老产品安全库存设了三个月用量结果销售天天抱怨“系统显示有库存但ATP一直是0”。查下来就是安全库存设置严重偏高把可承诺量全部“吃”掉了。反过来如果完全不设安全库存ATP倒是高了但一旦出现供应链波动断货风险全部暴露。所以安全库存的正确做法应该是按历史需求波动率和目标服务水平去测算而不是人人都能改的Excel数字。在ATP配置上至少要把安全库存纳入不可承诺部分否则算出来的ATP没有实际意义。4.3 需求分类和展望期隐藏的“过滤条件”ATP减项里到底包含哪些需求这是一个配置细节但影响很大。常见需求分类有客户订单、预测单、补货订单、内部领用单、预留单。系统默认动作不同ATP结果天差地别。假设本周有100台预测、60台订单系统配置“订单冲销预测”那么这个时段的总需求通常就是100台如果配置“预测和订单都保留”总需求就成了160台ATP立刻少了60台。这没有谁对谁错只取决于企业想用ATP回答什么问题是想回答“按正常预测节奏还能接多少”还是“极端情况下完全不动预测还能接多少”。再说到展望期。很多ERP要求ATP计算有一个计划展望期比如26周。在这个展望期之外不再计算可承诺量。这个期限之外的需求哪怕库存再充裕系统也会拒绝承诺。有的销售会在系统里看不到远期可承诺量就认为不能接单其实只是展望期设短了。所以展望期的长度要覆盖最长交期承诺周期否则ATP表在“不合理的时间”就断掉了。5. 实战中最容易踩的五个坑都是我在项目里真实见过的5.1 时段粒度太粗按周承诺结果月底爆单有不少项目图省事ATP的时段粒度直接按周设置。这样做的好处是计算量小、报表简单但坏处是一周内的需求被平均化处理了。实际业务往往是月初没人下单、月末扎堆要货。按周算ATP系统可能认为本周需求是50台可承诺量很充足销售放开接单结果所有客户都挤在周五要货产线根本来不及做。我的建议是对提前期短、需求波动大的产品至少未来两周按日计算ATP再往后按周或月。日级粒度的计算量在现代服务器上根本不是问题关键是要对业务有足够的响应度。5.2 负数ATP被当成“数据错误”离散ATP出现负数很多人第一反应是“系统坏了”。其实负ATP是一个非常有价值的信号它代表“当前时段供给不足要么需要补货要么需要把前面的需求挪到后面”。如果实施方为了报表好看用公式强行把负数隐藏成0等于把一个缺货预警掩埋了。正确的做法是保留负值并在ATP报表里用醒目颜色标出来同时关联到例外消息提醒计划员去处理。曾经有个客户第3周一直显示负ATP业务部门却视而不见直到有一天销售查可承诺量发现那个时段的货一直无法承诺才倒逼计划员去追了三个在途采购单把到货日期提前了。负ATP不是错误是提醒。5.3 多仓库存没打通明明有货系统却说不能接一家做家用电器的客户分销中心A仓库存充足但主要仓B仓却是零库存。因为系统只在B仓维度做ATP检查销售每次查可承诺量都显示0急得跳脚。后来我们把ATP检查升级为“跨仓检查按指定优先级顺序消耗”同时跑完分销计划再基于全局库存做承诺问题才解决。多仓ATP的复杂度在于多个仓库之间哪些可以互相调拨、调拨需要多少时间、有没有运输批量限制都得在算法里体现。否则你把A仓的货承诺出去了实际调拨三天才能到客户那里交期承诺照样失信。多仓ATP一定要和调拨提前期、运输日历一起配置单是打通仓库维度还不够。5.4 主数据不准ATP算法再聪明也是“垃圾进垃圾出”ATP计算依赖的数据主要来自库存台账、未结订单、计划订单、采购在途、BOM、提前期。任何一个不准确都会直接污染结果。有一次排查某物料ATP异常系统显示可承诺量严重偏大。查来查去原因是有张紧急采购单已经在三天前入库但仓储部门一直没做入库确认这些货一直挂在“在途量”里被ATP算成了“未来供给”。等到账实不一致被盘点查出ATP已经多承诺出去一批货。所以上ATP之前必须先把库存准确率、BOM准确率、订单数据完整性三项基础盘干净。这是最笨但最有效的一步比调一百个参数都管用。5.5 只做物料ATP不做能力检查接单时爽排产时慌物料维度不缺料不等于可以交。瓶颈工序是硬约束这一点前面已经提过。如果企业没有条件上带资源检查的高级计划系统也有过渡方案在MPS之后增加一道人工关键资源复核计划员拉出ATP可承诺量报表后再去对照瓶颈工作中心的排程情况。只有物料和关键产能都确认后承诺才是安全的。等业务规模上去、接单频率变高之后再考虑在ATP规则里加入关键资源的粗能力检查。这块投入产出比很高但一般作为第二阶段优化不建议在项目初期一次性铺开复杂度会超出团队承载能力。6. 落地ATP的配置建议与实操心得6.1 上线前先做三件事缺一不可第一件事把期初库存的“不可动用数量”拆清楚。包括不合格品、已分配给项目的预留、样品、展览用机等这些都不能算进ATP的可用量。如果期初数据里混着这些后面全部白算。第二件事和各业务部门对齐“需求分类”的口径。哪些订单算确认需求、哪些预测参与ATP计算、哪些预留单必须占用可承诺量这些口径必须在配置前达成一致。我经历过的项目中这一环节花的时间往往比配置系统本身还多。第三件事确定ATP结果的操作规范。系统算出ATP后谁来负责解释销售能直接看到还是需要计划员审批负ATP出现后走什么流程去处理这些不在系统里配置但在流程里必须定义。6.2 分产品差异化配置不要一套参数打天下不同产品的需求特性差异很大ATP参数最好不要全国统一。我习惯把产品至少分成三类稳定走量的常青产品时界较长、安全库存按统计方法设置、按周或双周做ATP系统运行稳定。项目型/订单型产品时界偏短、需求以实际订单为主、预测参与度低ATP检查建议按日且必须结合项目预留。促销/新品预测波动大、安全库存不宜设置过高可以把展望期放短一些避免远期ATP拖累近期的承诺。差异化配置其实不难难的是运维时要有人持续维护这套参数。产品进入衰退期时时界和安全库存跟着调参数不能一年前定完就再也没人碰。6.3 一张自查表解决80%的ATP异常问题现象可能的根因排查方向ATP长期为0安全库存设置过高、可用库存被预留占完检查安全库存和预留单明细远期ATP突然消失展望期设置过短、未确认计划订单未参与检查展望期和MPS运行结果某时段负ATP离散ATP计算、该时段暂无法跨期确认是否启用累积算法多仓有货但显示不可承诺未启用跨仓ATP、分配顺序配置错误检查ATP检查范围和供应源优先级库存账实不符导致ATP失真出入库滞后、盘点差异盘查库存流水、补录单据这套自查表我在多个项目里用过基本能帮业务快速定位问题范围。真正处理起来不复杂但前提是流程和数据要有人管。6.4 最后说点体会ATP这个模块从算法原理上看并不高深公式就那几个。但它背后牵扯的是销售怎么承诺、计划怎么排产、仓库怎么管理、采购怎么协同。算法只是把业务逻辑固化下来业务逻辑没理顺再精妙的算法也只是一堆数字游戏。我个人的建议是先跑通一个产品线的单仓离散ATP让各部门理解它的含义和局限再一步步叠加累积算法、多仓检查、能力检查稳步把ATP从“报表里的字段”变成“真正指导接单决策的仪表盘”。