certflow.services.report_bom_enricher module

报告 BOM 材质富集器(阶段 C:C1–C4 串联)

把「按生产令号查 BOM → 关键词归类 → 查材质化学/力学 → 产出主材位+待核对明细」 串成一个可单测、不污染 ReportView 的服务。

数据流(docs/PATCH_LOG.md 补丁 14「阶段 C:BOM 材质集成到报告生成」):
query_by_production_order_no(pno) → list[BomMaterial]

→ BomPartClassifier.classify → {主材位: [BomMaterial]} + 待核对 → MaterialGradeService.get_by_grade → 化学/力学性能范围 → MaterialPart(命中的主材位,带虚拟实测值)+ 待核对明细(未命中/多牌号/缺数据)

设计要点: - 命中的主材位才自动落报告材质块;匹配不到 / 多对一 / 牌号缺 material_grades 记录

的零件一律进「待核对明细」,不写 sale_plan、不写超链接(原则 3)。

  • 归类与报告富集各自独立、可单测(原则:不污染 UI)。

  • 多标准牌号策略(§9.2 待定 → 取 is_active 优先):generate_composition_values 已按 is_active.is_(True) 过滤;富集器仅用 get_by_grade 判定牌号是否在表, 缺化学/力学范围时记入待核对明细提示,不报错中断生成(C3.3)。

class certflow.services.report_bom_enricher.BomEnrichResult(production_order_no='', matched=0, detail_count=0, classified=<factory>, detail=<factory>, leftover_parts=<factory>)[源代码]

基类:object

BOM 材质富集结果。

参数:
production_order_no

生产令号。

Type:

str

matched

命中主材位数(已落地到报告材质块的 BOM 主材位数量)。

Type:

int

detail_count

待核对明细条数。

Type:

int

classified

主材位标识 → 该位代表性 MaterialPart(含化学/力学性能,来源=bom)。

Type:

dict[str, certflow.services.report_migration.material_provider.MaterialPart]

detail

待核对明细列表,每项 {part_name, material_grade, reason, note}

Type:

list[dict[str, str]]

production_order_no: str = ''
matched: int = 0
detail_count: int = 0
classified: dict[str, MaterialPart]
detail: list[dict[str, str]]
leftover_parts: list[MaterialPart]
certflow.services.report_bom_enricher.enrich_parts(production_order_no, parts, material_svc, cfg=None)[源代码]

富集已取出的 BOM 零件列表(无 DB 依赖,便于单测)。

参数:
  • production_order_no (str) -- 生产令号(仅用于溯源标注)。

  • parts (list[Any]) -- 该令号的全部 BOM 零件(含 part_name / material_grade / seq)。

  • material_svc (Any) -- 材质服务,需提供 generate_composition_values(grade)get_by_grade(grade)``(通常为 ``MaterialGradeService 实例)。

  • cfg (dict[str, Any] | None) -- 归类配置(同 classify)。

返回:

BomEnrichResult:命中的主材位 MaterialPart + 待核对明细。

返回类型:

BomEnrichResult

certflow.services.report_bom_enricher.enrich(production_order_no, session, cfg=None)[源代码]

按生产令号从 DB 拉取 BOM 并富集(C1 入口)。

参数:
  • production_order_no (str) -- 生产令号。

  • session (Any) -- SQLAlchemy 会话(已绑定 bom_materials / material_grades)。

  • cfg (dict[str, Any] | None) -- 归类配置;缺省回退 DEFAULT_BOM_REPORT_CFG

返回:

BomEnrichResult:命中的主材位 + 待核对明细。

返回类型:

BomEnrichResult

备注

BOM 查询 / 材质服务实例化失败会向上抛出;调用方(_resolve_materials) 应捕获降级为留空,避免阻断整批报告生成。