# 合批原料 material_ofrom 历史排查

## 历史现象

曾出现合批或生产流转后，批次签带显示的原料类型与实物板段棒签不一致。同一工序可能存在多条并行原料输入，因此也可能发生真实混料。该问题当时决定暂缓，只有再次出现并取得可复现样本时再继续调查。

## 已确认的代码风险

`WMaterial.locked_get_or_create`（`apps/utils/models.py`）命中既有行时直接返回，不会应用 `defaults`。在 `apps/wpm/services.py` 的合批或流转逻辑中：

- `material_ofrom`、`batch_ofrom`、`number_from` 只放在 `defaults`。
- 定位既有行的键不包含 `material_ofrom`。

因此，一旦命中相同业务键的旧行，后续不同原料流入时，`material_ofrom` 可能继续保留首次建行时的值。该字段又是单个外键，结构上无法表达混料。签带展示值来自 serializer 中的 `material_ofrom_name`。

## 历史样本结论

当时抽样数据中的相关 `WMaterial` 行已经归零，来源记录也指向原有材料；实物板段号在当前 WPM 相关表中没有找到。由此推测，实物棒签的材料源和板段号可能来自上游拉丝或滚圆子系统，单靠当前库无法闭环证明。

## 下次接续

再次出现时应先取得一个“实物棒签材料与批次签带材料不一致、且两者来源可在同一系统追踪”的批次样本，然后：

1. 确认实物棒签由哪个系统和表生成。
2. 用只读查询验证流转前后定位键是否命中旧行。
3. 区分真实混料、上游标签来源和 `defaults` 未更新这三种原因。
4. 在复现前不要直接修改字段结构或流转逻辑。

查询时遵守 [生产数据只读验证](project_gx_db_access.md)。
