☰
ERPNext 采购收货单供料明细(Purchase Receipt Item Supplied)子表解析:字段设计、外协供料流程与库存核算
2026/10/1 3:49:59 网站建设 项目流程
  • 后端
  • 企业应用

【免费下载链接】erpnext

Free and Open Source Enterprise Resource Planning (ERP)

项目地址:https://gitcode.com/GitHub_Trending/er/erpnext
点击查看免费下载

导读

在 ERPNext 的采购收货流程中,Purchase Receipt Item Supplied是一个承载"供应商供货/加工过程中消耗的原材料明细"的子表(Child Table),它记录收货时随主物料一起供应的原材料物料代码、消耗数量、批次/序列号以及估价金额。本文以 purchase_receipt_item_supplied 的 README 所定义的 "Details of Items supplied when receiving purchases via Purchase Receipt" 为骨架,结合仓库中的 DocType 定义、Purchase Receipt 主文档配置与外协控制器源码,完整讲解该子表的全部字段、读写规则、数据来源,以及它在外协加工(Subcontracting)与库存估价中的实际作用。


一、先理解业务场景:为什么收货单里要记录"供应的物料"

普通的采购收货只需要记录"收到了哪些货、数量多少、单价多少"。但在外协加工(Subcontracting)业务中,企业会把原材料发给供应商,由供应商加工成成品后再交付回来。此时 Purchase Receipt 上出现的不只是成品收货明细,还必须记录这批成品对应消耗掉了哪些原材料,以及这些原材料是从哪个采购单/外协单流转过来的。

Purchase Receipt Item Supplied正是承担这一职责的子表:它挂在 Purchase Receipt 的supplied_items("Consumed Items / 消耗物料")表格字段下,一行代表"加工某个主物料(main_item_code)时消耗的某一种原材料(rm_item_code)"。README 中那句 "Details of Items supplied when receiving purchases via Purchase Receipt" 所指的,正是这套"收货时同步记录的供料明细"。

从仓库源码看,该子表不仅用于传统的 Purchase Receipt,也被外协模块的 Subcontracting Receipt 复用:外协控制器通过receipt_supplied_items_field字段配置,在 subcontracting_controller.py 中把"收货侧供料明细"指向Purchase Receipt Item Supplied(Subcontracting Receipt 场景)或Subcontracting Receipt Supplied Item。


二、DocType 定义与字段全景

该子表的 DocType 定义位于 purchase_receipt_item_supplied.json,istable: 1明确它是子表(Child Table),不独立创建单据,只作为父文档(Purchase Receipt / Subcontracting Receipt)的行数据存在。Python 端对应类 PurchaseReceiptItemSupplied 仅包含 Frappe 自动生成的类型注解,业务逻辑全部由父文档控制器驱动。

字段清单

字段名类型是否只读是否列表显示说明
main_item_codeLink → Item只读是主物料(收货的成品)物料代码,label 为 "Item Code"
rm_item_codeLink → Item只读是供应的原材料物料代码,label 为 "Raw Material Item Code"
item_nameData只读否原材料名称
bom_detail_noData只读是(隐藏列)BOM 明细行号(隐藏字段)
descriptionText Editor只读否原材料描述,参与全局搜索(in_global_search: 1)
stock_uomLink → UOM只读否库存计量单位
conversion_factorFloat只读否换算系数,隐藏字段,精度 9 位
reference_nameData只读是(隐藏列)上游单据行引用(隐藏字段)
required_qtyFloat只读是"Available Qty For Consumption"(可消耗数量)
consumed_qtyFloat可编辑(reqd)是"Qty to Be Consumed"(计划消耗数量),必填
current_stockFloat只读是原材料当前库存量
rateCurrency只读否原材料估价单价,以公司默认币种计价
amountCurrency只读否消耗金额 = consumed_qty × rate
batch_noLink → Batch可编辑否消耗的批次号,no_copy: 1
serial_noText可编辑否消耗的序列号,no_copy: 1
purchase_orderLink → Purchase Order只读否关联采购单,隐藏且不打印,no_copy: 1

表格中的隐藏(hidden: 1)、print_hide: 1、no_copy: 1等属性均可在 JSON 定义 中逐字段核对。

可编辑性设计:谁可以改,谁不能改

从字段属性可以清楚看出该子表的"快照 + 少量人工干预"设计哲学:

  • 只读快照:物料代码、名称、描述、UOM、换算系数、可消耗数量、当前库存、单价、金额、上游参考、采购单——这些信息由上游单据(采购单/外协单/BOM)带入,收货时不允许随意修改,保证与采购/外协链路一致。
  • 人工干预点:只有consumed_qty(计划消耗数量,必填)、batch_no(批次)与serial_no(序列号)可编辑。这正对应用户在收货时确认"本次实际消耗多少、消耗哪一批/哪一序列号"的操作习惯。
  • 金额联动:rate、amount为 Currency 字段且绑定Company:company:default_currency,金额由消耗数量与估价单价自动计算,配合conversion_factor(精度 9 位)保证多单位换算下的精度。

三、子表在 Purchase Receipt 主文档中的位置与交互

在 purchase_receipt.json 中,supplied_items字段被定义为 Table 类型、options: "Purchase Receipt Item Supplied",label 为 "Consumed Items",并配有两个重要配套控件(见 L517-L545):

  1. "Get Current Stock" 按钮:depends_on: "supplied_items",仅当子表有数据时显示。点击后刷新各行的current_stock(当前库存)与required_qty(可消耗数量),帮助用户在确认消耗数量前核对实时库存。
  2. "Raw Materials Consumed" 可折叠区域:collapsible: 1且collapsible_depends_on: "supplied_items",子表有数据时才展开,print_hide: 1表示该区域不打印在收货单上,属于内部核算信息。

这一 UI 设计印证了 README 的定位:供料明细是收货流程的附属核算数据,用户可见、可操作,但默认折叠、不进入打印版式。


四、数据从哪来:采购单 → 收货单的自动映射

当采购收货单从采购单(Purchase Order)映射生成时,供料明细会随主明细一并带入。在 purchase_order/mapper.py 的映射逻辑中,service_items、items、supplied_items等表字段被统一处理,将采购单上的外协供料行复制到收货单的对应子表中:

for key in ["service_items", "items", "supplied_items"]: # 逐行复制上游子表数据到目标文档 ...

这意味着:只要采购单上带有供料明细(例如基于采购订单的外协场景),收货时这些明细会自动出现在 Purchase Receipt 的supplied_items中,用户只需核对并填写consumed_qty、batch_no、serial_no。reference_name与bom_detail_no等隐藏字段则用于回溯"这一行来自采购单的哪一行、对应 BOM 的哪个明细",保证链路的可追踪性。

此外,purchase_order字段(Link → Purchase Order,只读、隐藏、不打印)直接记录供料明细关联的采购单号,与外协订单/采购单建立显式关联。


五、底层实现:供料明细如何参与外协收货与库存核算

Purchase Receipt Item Supplied不是孤立的数据表,它在 subcontracting_controller.py 中扮演外协核算的关键角色:

  • 原材料入库/出库:外协控制器在validate阶段调用create_raw_materials_supplied_or_received(raw_material_table="supplied_items")(L62-L66),根据订单侧的供料明细生成收货侧的供料行;其中order_supplied_items_field与receipt_supplied_items_field的配对(L390-L394)正是把Purchase Receipt Item Supplied与上游外协订单/采购单子表对应起来的桥梁。
  • 批量/序列号回填:set_batch_for_supplied_items(L737 起)在收货确认批次后,把批次/序列号写回供料行并联动更新父文档的库存操作。
  • 原材料估价:set_valuation_rate_for_rm(L71-L101)基于rm_item_code、consumed_qty、batch_no、serial_no与收货日期调用_get_incoming_rate计算原材料的最新入价,并重算rate与amount = consumed_qty × rate——这解释了为什么这两个字段被设计为只读:它们的值由系统按估价逻辑维护,而非手工填写。
  • 成本汇总:get_supplied_items_cost(L1224-L1231)遍历supplied_items累加各行amount,得到本次收货消耗的原材料总成本,为后续外协收货的成本核算与 GL 分录提供依据(对应 gl_composer.py 的科目组合逻辑)。

同时,供料明细也参与库存侧的处理:子表的批量/序列号字段与 serial_batch_inline_editor.js 的内联编辑机制对接,用户可以在收货界面上直接为supplied_items的每一行指定消耗批次与序列号,操作方式与主物料明细一致。


六、相关报告与派生使用

供料明细数据被多个采购/外协报告与模块消费,常见包括:

  • Subcontracted Raw Materials To Be Transferred:统计"待转移的外协原材料",其数据基础即来自订单/收货侧的供料明细行。
  • Subcontract Order Summary 与 Subcontracted Item To Be Received:分别汇总外协订单概览与待收货明细,测试用例覆盖了supplied_items的流转一致性。
  • 外协模块的 Subcontracting Order 与 Subcontracting Receipt 在各自supplied_items子表中使用了同源结构(收货侧即Purchase Receipt Item Supplied)。

七、小结:一张子表贯通"收货—供料—核算"链路

回到 README 的核心定义——"Details of Items supplied when receiving purchases via Purchase Receipt"——可以将其拆解为三层能力:

  1. 记录:收货时完整保存"主物料 + 消耗原材料 + 数量 + 单价金额 + 批次/序列号 + 上游单据参考"的快照,形成可供追溯的供料档案;
  2. 联动:数据自动从采购单/外协单映射而来,收货时人工仅确认consumed_qty、batch_no、serial_no,并通过 "Get Current Stock" 按钮核对实时库存;
  3. 核算:rate/amount由原材料估价逻辑自动维护,get_supplied_items_cost汇总消耗成本,供料明细由此成为外协收货估价、库存流水与 GL 分录的数据基础。

对于需要在 ERPNext 中实现外协加工、来料加工或"收货即扣料"业务的实施与开发者,理解Purchase Receipt Item Supplied的字段语义与流转路径,是打通采购收货与原材料核算的第一块基石。

延伸阅读(仓库内):

  • 子表定义:purchase_receipt_item_supplied.json / purchase_receipt_item_supplied.py
  • 父文档集成:purchase_receipt.json(supplied_items字段、折叠区域、Get Current Stock 按钮)
  • 映射逻辑:purchase_order/mapper.py
  • 外协核算:subcontracting_controller.py
  • 相关报告:Subcontracted Raw Materials To Be Transferred
  • 后端
  • 企业应用

【免费下载链接】erpnext

Free and Open Source Enterprise Resource Planning (ERP)

项目地址:https://gitcode.com/GitHub_Trending/er/erpnext
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询