4. 食品生产订单创建与批次追溯链路设计

订单—批次绑定对象与追溯链路

本案例的核心不是“建一张订单”,而是让订单成为批次关系的锚点:生产订单向上绑定配方/BOM版本与工艺路线,向下绑定原料批次(投料)与成品批次(产出),从而形成可正查、可反查的批次谱系。设计时先明确三个关键对象及其标识规则,再落库建单。

  • 生产订单:订单号 MO-20250612-001,产品为“低温酸奶 100g×12杯”,计划数量 5000 杯,绑定 BOM 版本 BOM-YOG-V3(生效日期 2025-05-01)与工艺路线 RT-YOG-02。
  • 原料批次:生鲜乳 RM-MILK-250610-A、白砂糖 RM-SUG-250528-B、发酵菌种 RM-CUL-250605-C,均带供应商与入库检验单号。
  • 成品批次:FG-YOG-250612-01,与订单一一对应,出库时携带该批次号。

批次关联关系必须落在“订单—投料明细—产出明细”三张关系上,而不是只写在订单备注里。下面用一张链路图说明正向(原料→成品)与反向(成品→原料)两条查询路径如何共用同一组关联记录。

生产订单 MO-20250612-001 的批次谱系 正向追溯:原料批次 → 订单投料 → 成品批次 | 反向追溯:成品批次 → 订单产出 → 原料批次 原料批次(入库) 生鲜乳 RM-MILK-250610-A 白砂糖 RM-SUG-250528-B 发酵菌种 RM-CUL-250605-C 均含供应商、检验单号、入库日期 生产订单 MO-20250612-001 产品:低温酸奶 100g×12 计划数量:5000 杯 BOM:BOM-YOG-V3 工艺路线:RT-YOG-02 状态:已下达 成品批次(产出) 低温酸奶 FG-YOG-250612-01 出库单携带该批次号 可回查订单与投料明细 关联记录与查询验证要点 正向:按原料批次查投料明细 → 订单 → 成品批次 反向:按成品批次查产出明细 → 订单 → 全部原料批次 验证条件:两条路径返回的订单号、批次号集合必须完全一致;投料数量合计与 BOM 用量偏差在允许范围内。

建单与批次绑定的关键字段

在 MES 中创建订单时,批次绑定不是事后补录,而是随订单下达一并生成。以下为订单主表与两张明细表的关键字段设计(示例值可直接作为建单输入):

表/对象关键字段示例值作用
生产订单order_no / product_code / plan_qty / bom_version / route_code / statusMO-20250612-001 / YOG-100X12 / 5000 / BOM-YOG-V3 / RT-YOG-02 / 已下达追溯锚点,锁定配方与工艺版本
投料明细order_no / material_code / material_batch / qty / issue_timeMO-20250612-001 / RM-MILK / RM-MILK-250610-A / 4200 kg / 2025-06-12 08:20建立原料批次→订单的正向关系
产出明细order_no / product_batch / qty / produce_timeMO-20250612-001 / FG-YOG-250612-01 / 4980 杯 / 2025-06-12 16:40建立订单→成品批次的反向入口

注意:投料明细中的 material_batch 必须来自入库批次主数据,不能手工自由输入,否则反向追溯会断链。成品批次号建议按“产品前缀+生产日期+当日流水”生成,保证唯一且可读。

追溯链路的查询实现

正向与反向查询本质是同一组关联表的不同连接方向。以下 SQL 以示例表名给出两条路径,可直接在测试库中执行验证(表名与字段按实际 MES 数据模型调整):

-- 正向:给定原料批次,查它流向了哪些订单和成品批次
SELECT i.order_no, o.product_code, p.product_batch, i.qty AS issue_qty, p.qty AS output_qty
FROM issue_detail i
JOIN prod_order o   ON o.order_no = i.order_no
JOIN output_detail p ON p.order_no = i.order_no
WHERE i.material_batch = 'RM-MILK-250610-A';

-- 反向:给定成品批次,查它由哪些原料批次生产
SELECT p.product_batch, i.material_code, i.material_batch, i.qty
FROM output_detail p
JOIN issue_detail i ON i.order_no = p.order_no
WHERE p.product_batch = 'FG-YOG-250612-01'
ORDER BY i.material_code;

两条查询都应返回订单 MO-20250612-001。正向结果中成品批次应为 FG-YOG-250612-01;反向结果应包含三条原料批次记录。若任一方向缺失记录,说明投料或产出明细未完整落库,需回到建单环节补录。

可查询性验证清单

建单完成后,按以下四项做闭环验证,全部通过才算批次关联关系可用:

  1. 唯一性:同一成品批次号在产出明细中只出现一次,且只对应一个订单号。
  2. 完整性:反向查询返回的原料批次数量等于该订单实际投料种类数(本例为 3 种)。
  3. 一致性:正向与反向查询得到的订单号、批次号集合完全一致,无孤立记录。
  4. 数量合理性:投料合计与 BOM 标准用量的偏差在工艺允许范围内(示例中按 BOM 用量核算,偏差需人工确认,不作为自动判定结果)。

常见断链原因:① 投料时手工输入批次号而非选择入库批次;② 成品入库未回写产出明细;③ 订单变更后未同步更新投料明细。任一处缺失都会导致反向追溯查不到原料来源,食品召回场景下后果严重,建单后必须执行上述验证。