from app.extensions import db class BomTable(db.Model): __tablename__ = 'bom_table' id = db.Column(db.Integer, primary_key=True) parent_id = db.Column( db.Integer, db.ForeignKey('material_base.id', ondelete='SET NULL'), nullable=False, index=True ) child_id = db.Column( db.Integer, db.ForeignKey('material_base.id', ondelete='SET NULL'), nullable=False, index=True ) bom_no = db.Column(db.String(100), nullable=False, index=True, comment='BOM编号') # ★ Redis 缓存 Key + 列表查询核心列 version = db.Column(db.String(50), nullable=False, default='V1.0', index=True, comment='版本') # ★ 配合 bom_no 做唯一性约束 dosage = db.Column(db.Numeric(19, 4), comment='个数') loss_rate = db.Column(db.Numeric(5, 2), comment='损耗率%', default=0, nullable=True) remark = db.Column(db.Text, comment='备注') # ★ BOM 级备注(父件级):与 parent_id/is_enabled 一样冗余存于本版本每一行,读取取首行。 # 上面的 remark 是**子件级**备注,语义不同,勿混用。 bom_remark = db.Column(db.Text, comment='BOM级备注(父件级,冗余存于每行,读取取首行)') # ★ 子件引用的"自制 BOM"版本:子件物料若本身是自制件(作为其它 BOM 的父件), # 此列记录该子件实际引用的配方版本((bom_no, version) 共同定位),由新建/编辑 BOM 时选版本保存。 # 外购件/无下级 BOM 的子件这两列为 NULL。 child_bom_no = db.Column(db.String(100), nullable=True, index=True, comment='子件引用的自制BOM编号') child_bom_version = db.Column(db.String(50), nullable=True, index=True, comment='子件引用的自制BOM版本') # ★ 新增:启用状态 is_enabled = db.Column(db.Boolean, default=True, index=True, comment='是否启用') # ★ 状态过滤高频列 # ★ 归档标记:仍保持 is_enabled 语义(可查看/编辑/启停),但归档配方不再作为"其它 BOM 子件"的版本候选与可引用版本 is_archived = db.Column(db.Boolean, default=False, index=True, comment='是否归档(不作为子件引用候选)') # 约束: 保证同一版本下的父子对唯一,允许不同版本存在 __table_args__ = ( db.UniqueConstraint('bom_no', 'version', 'parent_id', 'child_id', name='uniq_bom_pair_in_version'), ) # relationships parent = db.relationship( 'MaterialBase', foreign_keys=[parent_id], backref='bom_parents', passive_deletes=True ) child = db.relationship( 'MaterialBase', foreign_keys=[child_id], backref='bom_children', passive_deletes=True )