certflow.models.bom_material 源代码

"""BOM 零件牌号数据模型

从「生产-下料计划 TAO」目录下的材料清单(.xls/.xlsx)解析得到,按 生产令号 归集
每张 BOM 的零件(零件名称 + 材料牌号),落库为 ``bom_materials`` 表。

与 ``material_grades`` 表的区别:
- ``material_grades`` 存「牌号 → 化学成分/力学性能范围」,供质保书生成;
- ``bom_materials`` 存「生产令号 → 该令号下各零件的牌号」,来自设计 BOM 实单,
  用于按生产令号反查零件材质,并作为材质自学习/补充的数据源。
"""

from __future__ import annotations

from datetime import datetime

from sqlalchemy import Column, DateTime, Index, Integer, String

from .base import Base

# 材料牌号来源取值:导入(解析自材料清单)/ 自学习(自动补全)/ 手动(人工订正)
MATERIAL_SOURCE_IMPORT = "import"
MATERIAL_SOURCE_AUTO_LEARN = "auto_learn"
MATERIAL_SOURCE_MANUAL = "manual"
MATERIAL_SOURCE_CHOICES = [
    MATERIAL_SOURCE_IMPORT,
    MATERIAL_SOURCE_AUTO_LEARN,
    MATERIAL_SOURCE_MANUAL,
]


[文档] class BomMaterial(Base): """BOM 零件牌号表 同一 生产令号 下可有多条零件记录;``(production_order_no, seq)`` 唯一标识一行。 """ __tablename__ = "bom_materials" id = Column(Integer, primary_key=True, autoincrement=True) # 生产令号:取自材料清单文件名开头 token(与 SalePlan.production_order_no 同源) production_order_no = Column(String(64), nullable=False, comment="生产令号") seq = Column(Integer, default=0, comment="BOM 内序号(原表 序号 列;无则按出现顺序)") part_no = Column(String(64), nullable=True, comment="代号(原表 代号 列,可能为空)") part_name = Column(String(128), nullable=False, comment="零件名称") material_grade = Column(String(128), nullable=True, comment="材料牌号/零件牌号(原表 材料 列)") material_source = Column( String(16), nullable=False, default=MATERIAL_SOURCE_IMPORT, comment="材料牌号来源:import(导入)/auto_learn(自学习)/manual(手动订正)", ) material_note = Column(String(255), nullable=True, comment="材料牌号补全备注(手动/自学习)") quantity = Column(String(32), nullable=True, comment="数量") material_form = Column( String(64), nullable=True, comment="材料型态/方向(原表 材料型态/方向 列)" ) source_file = Column(String(512), nullable=False, comment="来源材料清单文件完整路径") created_at = Column(DateTime, default=datetime.now, comment="入库时间") updated_at = Column(DateTime, nullable=True, comment="材料牌号最近更新时间") __table_args__ = ( Index("idx_bom_production_order_no", "production_order_no"), Index("idx_bom_source_file", "source_file"), Index("idx_bom_material_source", "material_source"), ) def __repr__(self) -> str: return ( f"<BomMaterial(pon='{self.production_order_no}', " f"part='{self.part_name}', grade='{self.material_grade}')>" )