certflow.services.bom_material_service module

BOM 零件牌号服务

从「生产-下料计划 TAO」目录的材料清单(.xls/.xlsx)解析零件牌号,落库到 bom_materials 表,并提供按 生产令号 查询与超链接索引生成能力。

文件结构异构,解析器自适应两种常见表头: - 12 列版(.xlsx):序号/代号/名称/数量/单位/材料/图纸尺寸/毛坯尺寸/毛坯单量/材料型态/备注 - 4 列版(.xls):零件名称/材料/备注/方向 通过「行内同时含 名称类列 与 材料类列」定位表头,再按列名映射取数,不依赖固定列序。

class certflow.services.bom_material_service.BomMaterial(**kwargs)[源代码]

基类:Base

BOM 零件牌号表

同一 生产令号 下可有多条零件记录;(production_order_no, seq) 唯一标识一行。

id
production_order_no
seq
part_no
part_name
material_grade
material_source
material_note
quantity
material_form
source_file
created_at
updated_at
class certflow.services.bom_material_service.BomImportMode(*values)[源代码]

基类:StrEnum

BOM 导入模式(UI 四选一,决定旧数据如何处理)。

CLEAR = 'clear'
APPEND = 'append'
REFRESH = 'refresh'
SKIP = 'skip'
classmethod from_clear_existing(clear_existing)[源代码]

兼容旧 clear_existing 布尔参数:True→CLEAR,False→APPEND。

参数:

clear_existing (bool | None)

返回类型:

BomImportMode

certflow.services.bom_material_service.ensure_bom_material_columns(engine)[源代码]

为已存在的 bom_materials 表补齐新增列(存量库 ALTER,避免 drop/recreate 丢数据)。

create_all 只能建缺失的表、不会给既有表加列,故对可能已存在的表做一次幂等 ALTER。 新增列:material_source(默认 import) / material_note / updated_at。

参数:

engine (Any)

返回类型:

None

certflow.services.bom_material_service.scan_and_import(folder, session, *, clear_existing=None, mode=None)[源代码]

遍历 folder(含子目录)下所有 .xls/.xlsx,解析并批量入库。

参数:
  • folder (str) -- 根目录(如 生产-下料计划TAO)。

  • session (Session) -- 数据库会话(本函数内 commit)。

  • clear_existing (bool | None) -- [兼容旧调用] 优先使用 mode;为 None 时: ``True``→CLEAR,``False``→APPEND。

  • mode (str | BomImportMode | None) --

    导入模式(见 BomImportMode): - clear:清空全表后重导(默认,幂等、无重复); - append:不清空,所有解析行直接插入(重复导入同文件会重复); - refresh:不清空;已导入过的 source_file 先删其旧行再写最新内容

    (如某文件 12→10 行则删 2、12→15 行则加 5),新文件追加;

    • skip:不清空;只导入 source_file 尚未入库的文件,已存在文件 (即便内容已更新)跳过;需刷新旧文件请清空重导。

返回:

{files, rows, orders, new_files, refreshed_files, skipped_files} 统计。 files 维持旧语义 = 实际写入的文件数(new+refreshed),兼容旧调用方。

返回类型:

dict[str, int]

certflow.services.bom_material_service.query_by_production_order_no(production_order_no, session)[源代码]

按 生产令号 精确查询其全部零件(按 seq 排序)。

参数:
返回类型:

list[BomMaterial]

certflow.services.bom_material_service.list_production_order_nos(session)[源代码]

返回库中所有不重复的 生产令号(排序)。

参数:

session (Session)

返回类型:

list[str]

生成超链接索引 xlsx:生产令号 | 文件名 | 零件数 | 零件牌号摘要 | 完整路径。

  • 「文件名」列为指向源文件的 file:// 超链接,点击即可回访材料清单;

  • 「零件牌号摘要」形如「阀体:WCB; 阀杆:35#无缝钢管; …」(超长截断)。

参数:
  • out_path (str) -- 输出 xlsx 路径。

  • session (Session) -- 数据库会话。

  • folder (str | None) -- 可选,仅导出源文件位于该目录(及其子目录)下的记录;默认全部。

返回:

写入的索引行数(不含表头)。

返回类型:

int

certflow.services.bom_material_service.export_bom_table(out_path, session, *, folder=None)[源代码]

从 bom_materials 表导出自包含索引表(无网络超链接依赖,可直接拷贝存档)。

生成两张工作表: - 「BOM索引」:生产令号 | 源文件名 | 零件数 | 在销售计划 | 零件牌号摘要 - 「零件明细」:生产令号 | 序号 | 代号 | 零件名称 | 材料牌号 | 数量 | 材料型态 | 源文件名

参数:
  • out_path (str) -- 输出 xlsx 路径。

  • session (Session) -- 数据库会话。

  • folder (str | None) -- 可选,仅导出源文件位于该目录(及其子目录)下的记录;默认全部。

返回:

{orders, rows}:索引生产令号数 / 明细零件行数。

返回类型:

dict[str, int]