## base_service.py — MaterialBase删除硬化 - 新增 BomTable 引用检查(bom_usage_count) - 物料被BOM引用时禁止删除,提示「请先解除BOM绑定」 ## models/base.py + bom.py — 缺失索引补全 - material_base: company_name + is_enabled 添加 index=True - bom_table: is_enabled 添加 index=True ## __init__.py — 全局异常处理 - @app.errorhandler(ValueError) → 400 + 自定义消息 - @app.errorhandler(404/405) → 标准错误 - @app.errorhandler(Exception) → 500 + 通用消息 堆栈仅记录服务器日志,不泄露到前端
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
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='备注')
|
|
|
|
# ★ 新增:启用状态
|
|
is_enabled = db.Column(db.Boolean, default=True, 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
|
|
) |