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}')>"
)