货品关系设置
货品关系设置维护的是商品关系 BOM:一个成品由哪些原料组成、各用多少。窗口标题写作商品关系BOM。它是组装单 / 拆卸单的用量与成本基准——组装单打开时带的原料行、拆卸单摊成本用的售价比例,都从这张表读。
功能路径:存货管理 → 货品关系设置 网页地址:/admin/Storage/goodsrelatepage/(成品列表)、/admin/Storage/goodsrelatepage/bom_edit/<成品ID>/(单个成品的 BOM)

一、它和工艺配方不是一回事
这两套东西在两个模块、两张表、两套成品判定条件,互不相通:
| 商品关系 BOM(本页) | 工艺配方(生产调度) | |
|---|---|---|
| 表 | GoodsRelate | SPP_CreateBom 系列 |
| 归属 | 存货管理-组装拆卸 | 生产调度-配方管理 |
| 成品判定 | 物料档案标记为组合商品、状态正常、非某类特殊料 | 按行类型区分成品与半成品 |
| 谁读它 | 组装单、拆卸单 | 生产中心排产、配料管理 |
| 有没有工序 | 没有,只有用量 | 有工序、工时、搅拌缸 |
| 要不要「确认」 | 不需要,保存即生效 | 需要确认后才被下游读取 |
维护了 BOM 不等于生产能用,排产读的是配方;反过来也一样。两边都要的话得各维护一份。
二、成品列表
- 工具栏:刷新价格、更新成本、循环检测、复制BOM、粘贴BOM。没有「新增」——BOM 挂在成品档案上,成品本身在物料管理建;
- 查询条:「成品搜索」关键字(占位提示是编号 / 名称)+ 七种匹配方式(包含 / 等于 / 开头为 / 结尾为 / 不等于 / 不包含 / 介于)+ 查询 / 重置;
- 列表列:成品编号、成品名称、规格、单位、原材料数量、用量合计、成本合计、最后修改;
- 默认每页 50 条(可切 20 / 30 / 50 / 100 / 200),比单据列表宽;
- 成品编号是可点链接,点了直接进那个成品的 BOM 维护页。
三列汇总的含义:
| 列 | 算法 |
|---|---|
| 原材料数量 | 这支成品挂了几行原料 |
| 用量合计 | Σ 单位用量 |
| 成本合计 | Σ(单位用量 × 该原料的采购价),带 ¥ 前缀显示 |
成本合计是列表侧的即时估算,它不等于成品档案上的成本价——后者要按「更新成本」才会回写。
三、单个成品的 BOM
点成品编号进维护页。顶部信息区给「<成品编号> / 名称:… / 单位:…」,右侧三个计数:原材料: N、用量合计: N.NNNN、成本合计: N.NN。
按钮:返回列表、添加原材料、删除选中、刷新价格、更新成本、循环检测。
明细列:
| 列 | 能不能改 | 说明 |
|---|---|---|
| 编号、名称、规格、单位 | 只读 | 添加原材料时选进来 |
| 单位用量 | 可改 | 一个成品用多少,组装单按它放大 |
| 采购价 | 只读 | 「刷新价格」重算这一列 |
| 售价 | 只读 | 拆卸单分摊成本用 |
| 金额 | 只读 | = 单位用量 × 采购价 |
| 修改人、修改时间 | 只读 | 行级痕迹 |
| 操作 | — | 行内动作 |
空表提示原文:「暂无原材料,点击「添加原材料」开始维护 BOM」。

编辑时的提示原文
| 提示原文 | 触发条件 |
|---|---|
| 用量必须大于0 | 单位用量填了 0 或负数 |
| 用量已更新 | 改完单位用量保存 |
| 已添加 N 个原材料 | 「添加原材料」选完确认 |
| 确认删除此原材料? | 行删除前的确认 |
| 成本价已更新为: <成本>,售价合计: <售价> | 在该页点「更新成本」之后 |
四、五个工具栏动作
这五个都会先弹确认框,确认后批量作用于选中的成品行:
| 动作 | 确认原文 | 做什么 |
|---|---|---|
| 刷新价格 | 确认刷新选中成品的原材料价格? | 按物料档案当前进价重算每行的采购价与金额,不改成品档案 |
| 更新成本 | 确认按 BOM 汇总更新选中成品的成本价? | 把成本合计回写到成品档案的采购价字段,影响后续所有出库计价 |
| 循环检测 | 确认检测选中成品的 BOM 循环引用? | 沿 BOM 树深度优先找环;结果给「检测到循环引用: <链路>」或「未检测到循环引用」 |
| 复制BOM | — | 单选一个成品,把它的原料行复制走 |
| 粘贴BOM | — | 多选目标成品,把复制的原料行贴上去(会覆盖目标原有行) |
「刷新价格」和「更新成本」的差别要分清:前者只刷新这张 BOM 上原料的价格显示,后者把汇总值写进成品档案。做完原料调价,只点刷新价格的话,成品成本还是老的;要让组装单入出来的成品成本变,必须点更新成本。
循环引用是 BOM 维护最常见的硬伤——A 的原料里有 B,B 的原料里又有 A。组装单生效时这种结构会算不收敛,先跑一次循环检测再开单。
五、三个系统选项
BOM 和组装的行为受三个账套级开关控制(存在系统选项表里,界面上在系统设置那边):
| 选项 | 界面名 | 影响 |
|---|---|---|
IsSetAllInv | 是否设置全部物料为可选原材料 | 打开后「添加原材料」的候选不再限制物料类型,全部物料都能挂进 BOM |
IsCombinatQty | 是否允许修改组装数量 | 关掉时组装单 / 拆卸单的「组装数量 / 拆卸数量」字段是锁的 |
CombinPriceType | 组装成本价格类型 | 0 = 采购价、1 = 最新含税价、2 = 最新成本价。记账侧固定按采购价,这个开关只影响界面估算口径 |
第三条容易踩:把「组装成本价格类型」设成 1 或 2,界面上看到的成本合计会跟着变,但单据生效入账时仍然按采购价。两边对不上不是 bug,是口径本来不同。
六、常见问题
「成品列表里找不到我的商品」 — 成品判定要求物料档案标记为组合商品、状态正常、非某类特殊料。去物料管理把标记打开,回本页点「刷新」。
「成本合计和组装单入出来的成本不一样」 — 三种可能:原料进价在这之后改过(点刷新价格)、组装单实际用量与 BOM 用量不同(按实际数量算)、价格类型口径不同(见第五节第三条)。
「粘贴BOM 会不会覆盖」 — 会。粘贴前确认目标成品原来的原料行是否还需要。
「删掉一行原料会不会影响已生效的组装单」 — 不会。已生效的单据用的是当时的实际数量,BOM 只影响之后新建的单。
「用量能不能填小数」 — 能,界面上用量按四位小数存。
「按 BOM 算出来成本是 0」 — 原料没有采购价。先做采购入库或补期初库存单的成本。
