需求预测录入

为自制部件逐周录入预期的未来需求,让计划运算在销售订单尚未到达前就提前下单。

是在销售订单出现之前,对部件每周预期需求的录入。计划运算会把预测与已排定的供应相抵,把部件的制造方法展开为组件需求,并建议所需的生产订单和采购订单。

你在生产 → 需求预测中逐部件录入预测,形式为 52 周网格。每个单元格是你预期该周消耗的数量。保存后,下一次 运算会读取它。

预测是什么

预测保存在 demandProjection 表中,按物料、地点和周 period 建键——每个部件/地点/周一行,带 forecastQuantity(packages/database/supabase/migrations/20251020183630_mrp-projections.sql:3-25)。period 表是共享的、与公司无关的带日期周桶集合(startDate、endDate、periodType);Carbon 在 getOrCreatePeriods 从今天向前推进时按需创建(packages/database/supabase/migrations/20250610000433_demand-planning.sql:26-34)。

只有自制部件才有预测。表单的物料选择器固定为 type="Part" 且 replenishmentSystem="Make"(apps/erp/app/modules/production/ui/DemandProjection/DemandProjectionForm.tsx),因此你预测的是自己制造的东西。其采购组件通过 BOM 展开继承需求,而不是通过自己的预测。

NOTE

Projection 是录入,forecast 是输出

有两张表看起来相似。demandProjection 是你的输入——你输入的数字。demandForecast 是计划运算的输出—— 运算回写的、展开后的逐组件需求(forecastMethod = "mrp")。你从不手工编辑 demandForecast;它在每次运行时重建(packages/planning/src/mrp/mrp.ts)。需求预测界面只操作 demandProjection。

如何录入

表单是一个抽屉,包含部件、地点和 52 个数值周单元格,分为四个季度标签页,另有周需求和累计需求的实时柱线图(apps/erp/app/modules/production/ui/DemandProjection/DemandProjectionForm.tsx)。第 1 周从当前周开始;每个单元格标注其日历日期。

保存时,操作把每个 week{i} 值与匹配的 period ID 配对并 upsert(apps/erp/app/routes/x+/production+/demand-forecasts.$itemId.$locationId.tsx)。设置为零的单元格会被删除而不是存储,因此网格保持稀疏(upsertDemandProjections,packages/ee/src/forecast.server.ts)。编辑部件会把其现有行重新载入网格;删除部件的预测会清除该物料和地点所有未来周(apps/erp/app/routes/x+/production+/demand-forecasts.delete.$itemId.$locationId.tsx)。

录入网格跨 52 周(demand-forecasts.new.tsx 和 demand-forecasts.$itemId.$locationId.tsx 中的 WEEKS_TO_PROJECT = 52)。列表视图显示接下来 48 周(WEEKS_TO_PROJECT = 12 * 4,apps/erp/app/routes/x+/production+/demand-forecasts.tsx),把按期间的行透视回周列以便浏览,并把第一列标为「Present Week(本周)」(apps/erp/app/modules/production/ui/DemandProjection/DemandProjectionTable.tsx)。创建、编辑和删除预测都需要 production 权限,且属于 Business 套餐(FORECAST 功能,packages/ee/src/plan.ts)。

计划运算如何使用

计划运算在进程内由 @carbon/planning(runMrp)运行,它直接把 demandProjection 作为需求来源读取(packages/planning/src/mrp/mrp.ts)。但预测并不简单地叠加到需求上:实际需求会消耗预测。每次 MRP 运算会把每个未结销售订单行和生产订单物料行与同一部件、同一地点的预测相抵——先在订单自身所在周,然后向后、再向前延伸到可配置的周数——只有预测的未消耗余量仍然驱动需求。同一周预测 10、在订 10,需求是 10 而不是 20;在订 12、预测 10,需求是 12。

延伸范围在设置 → 计划的 Forecast Consumption(预测消耗) 卡片中按公司设置:Look back (weeks)(向前回看周数)(默认 4)和 Look ahead (weeks)(向后前瞻周数)(默认 1)。该窗口用于修补空档——如果你某周预测 10、下一周为 0,落在空档周的销售订单会消耗相邻周的预测,而不会重复计算。两者都设为 0 时严格只在同一周内相抵。每次运行会把消耗量持久化到 demandProjection.consumedQuantity,因此计划界面、物料计划图表和库存读取同一个净额,编辑表单会在已被实际需求占用的周下方显示「N consumed」提示。

销售订单按完整未结数量消耗——已被关联生产订单覆盖的按订单制造行仍会消耗预测它的预测,尽管驱动供应的是生产订单而非该行。日期早于当前周的订单仍是需求,但不消耗任何预测;没有日期的订单视为现在到期,会消耗。过去周的预测会直接移出计划期,绝不会作为幻影需求滞留。

NOTE

预测不会重复计划已在生产中的东西

未结生产在供应侧处理,而不是通过消耗:已确认的生产订单/采购订单供应在 BOM 展开的滚动现有/供应余额中只抵扣一次,因此已被在制生产订单部分覆盖的预测不会被重复计划。消耗是需求侧的核对——预测对实际订单——两者永不重叠。

该预测需求与实际需求(未结销售订单行和未结生产订单物料)一起进入毛需求汇总,MRP 展开每个自制部件的制造方法,把组件需求向下推入 BOM。结果写入 demandForecast 以及 demandForecastSource 来源表,后者为每个单位标明来源:"Sales Order"、"Job Material" 或 "Demand Projection"(packages/planning/src/mrp/mrp.ts)。在部件的计划页面上,你可以打开任意周的需求,查看构成它的预测、订单和父生产订单(apps/erp/app/modules/items/items.service.ts)。

HEADS UP

MRP 只建议,从不下单

运算把预测需求转化为建议的生产订单和采购订单。在你处理建议之前不会创建任何东西。建议如何呈现以及如何转换,参见计划(MRP);影响预测转化结果的逐部件数值(提前期、批量、安全库存),参见再订货策略。

字段

字段类型
你为其预测需求的自制部件。仅限补货方式为 Make 的部件。
需求落到的库存地点。预测按地点划分,因此同一部件在不同工厂可以有不同的数字。
每个周桶的预期消耗数量,从当前周开始。空白或零单元格不存储任何内容。

预测是手工输入。Carbon 不会根据历史、季节性统计或统计模型计算它们。虽然 schema 保留了 forecastMethod 和 confidence,需求预测表单不会写入它们。MRP 负责相抵和 BOM 展开。