- 后端
- 企业应用
【免费下载链接】erpnext
Free and Open Source Enterprise Resource Planning (ERP)
导读
在 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_code | Link → Item | 只读 | 是 | 主物料(收货的成品)物料代码,label 为 "Item Code" |
rm_item_code | Link → Item | 只读 | 是 | 供应的原材料物料代码,label 为 "Raw Material Item Code" |
item_name | Data | 只读 | 否 | 原材料名称 |
bom_detail_no | Data | 只读 | 是(隐藏列) | BOM 明细行号(隐藏字段) |
description | Text Editor | 只读 | 否 | 原材料描述,参与全局搜索(in_global_search: 1) |
stock_uom | Link → UOM | 只读 | 否 | 库存计量单位 |
conversion_factor | Float | 只读 | 否 | 换算系数,隐藏字段,精度 9 位 |
reference_name | Data | 只读 | 是(隐藏列) | 上游单据行引用(隐藏字段) |
required_qty | Float | 只读 | 是 | "Available Qty For Consumption"(可消耗数量) |
consumed_qty | Float | 可编辑(reqd) | 是 | "Qty to Be Consumed"(计划消耗数量),必填 |
current_stock | Float | 只读 | 是 | 原材料当前库存量 |
rate | Currency | 只读 | 否 | 原材料估价单价,以公司默认币种计价 |
amount | Currency | 只读 | 否 | 消耗金额 = consumed_qty × rate |
batch_no | Link → Batch | 可编辑 | 否 | 消耗的批次号,no_copy: 1 |
serial_no | Text | 可编辑 | 否 | 消耗的序列号,no_copy: 1 |
purchase_order | Link → 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):
- "Get Current Stock" 按钮:
depends_on: "supplied_items",仅当子表有数据时显示。点击后刷新各行的current_stock(当前库存)与required_qty(可消耗数量),帮助用户在确认消耗数量前核对实时库存。 - "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"——可以将其拆解为三层能力:
- 记录:收货时完整保存"主物料 + 消耗原材料 + 数量 + 单价金额 + 批次/序列号 + 上游单据参考"的快照,形成可供追溯的供料档案;
- 联动:数据自动从采购单/外协单映射而来,收货时人工仅确认
consumed_qty、batch_no、serial_no,并通过 "Get Current Stock" 按钮核对实时库存; - 核算:
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)
相关推荐
flutter_lints 使用指南:为 Flutter 项目启用官方推荐静态分析规则集
flutter_lints 使用指南:为 Flutter 项目启用官方推荐静态分析规则集 导读 flutter_lints 是 Flutter 团队维护的官方
后端企业应用ERPNext物料接收单与仓库转移的完整技术指南:从采购到库存管理的无缝流程
ERPNext物料接收单与仓库转移的完整技术指南:从采购到库存管理的无缝流程 ERPNext作为一款免费开源的企业资源规划系统,其物料接收单与仓库转移功能是企业
后端企业应用InvenTree DigiKey 条码插件(DigiKeyBarcodePlugin)实战指南:扫码识别供应商物料与采购收货
InvenTree DigiKey 条码插件(DigiKeyBarcodePlugin)实战指南:扫码识别供应商物料与采购收货 导读 本文围绕 InvenTre
后端前端企业应用ERP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考