修改semi,product,service的搜索逻辑
This commit is contained in:
@ -7,64 +7,67 @@ class StockService(db.Model):
|
||||
"""
|
||||
服务权益库存表
|
||||
对应数据库表: stock_service
|
||||
说明:服务权益通常为虚拟资产,不进行具体的库存数量(actual_quantity)管理
|
||||
"""
|
||||
__tablename__ = 'stock_service'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||
|
||||
# 关联基础物料信息
|
||||
# 注意:这里使用了 db.ForeignKey 指向 material_base 表的 id
|
||||
# 外键关联基础物料
|
||||
base_id = db.Column(db.Integer, db.ForeignKey('material_base.id'), nullable=False)
|
||||
|
||||
# 系统生成的SKU,格式 SRV-YYYYMMDD-XXXX
|
||||
sku = db.Column(db.String(64), unique=True, nullable=False)
|
||||
# 核心业务字段
|
||||
sku = db.Column(db.String(100), unique=True, nullable=False)
|
||||
|
||||
# 售价
|
||||
sale_price = db.Column(db.Numeric(10, 2), nullable=False)
|
||||
|
||||
# 服务商名称
|
||||
# 扩展字段 (对应您的数据库建表脚本)
|
||||
service_category = db.Column(db.String(100), comment='服务类别')
|
||||
provider_name = db.Column(db.String(255), nullable=False, default='')
|
||||
contract_id = db.Column(db.String(100), comment='合同号')
|
||||
contact_person = db.Column(db.String(100), comment='联系人')
|
||||
|
||||
# 服务详情/简介
|
||||
# 价格相关
|
||||
cost_price = db.Column(db.Numeric(19, 4), default=0)
|
||||
sale_price = db.Column(db.Numeric(19, 4), nullable=False, default=0)
|
||||
|
||||
# 描述与状态
|
||||
description = db.Column(db.Text, default='')
|
||||
valid_period = db.Column(db.String(100), comment='有效期')
|
||||
status = db.Column(db.String(20), default='active')
|
||||
|
||||
# ==========================================================================
|
||||
# 【新增】库存数量字段
|
||||
# 上一轮的 Service 代码中尝试累加这两个字段,如果模型里没有,程序会报错
|
||||
# ==========================================================================
|
||||
actual_quantity = db.Column(db.Integer, default=0, nullable=False, comment='库存数量')
|
||||
available_quantity = db.Column(db.Integer, default=0, nullable=False, comment='可用数量')
|
||||
|
||||
# 创建时间与更新时间
|
||||
# 时间与系统字段
|
||||
created_at = db.Column(db.DateTime, default=datetime.now, nullable=False)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, nullable=False)
|
||||
|
||||
# 软删除标志
|
||||
is_deleted = db.Column(db.Boolean, default=False, nullable=False)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
|
||||
is_deleted = db.Column(db.Boolean, default=False)
|
||||
|
||||
# ==========================================================================
|
||||
# 【修复】关系映射
|
||||
# 1. 属性名必须叫 'base',因为 MaterialBase 里定义了 back_populates='base'
|
||||
# 2. back_populates 指向 MaterialBase 里的属性名 'stock_services'
|
||||
# 关联关系设置
|
||||
# MaterialBase 中定义了 back_populates='stock_services'
|
||||
# 因此这里必须定义 base 属性指向 'stock_services'
|
||||
# ==========================================================================
|
||||
base = db.relationship('MaterialBase', back_populates='stock_services', lazy='joined')
|
||||
base = db.relationship('MaterialBase', back_populates='stock_services')
|
||||
|
||||
def to_dict(self):
|
||||
"""转为字典,用于 API 响应"""
|
||||
"""序列化为字典"""
|
||||
return {
|
||||
'id': self.id,
|
||||
'base_id': self.base_id,
|
||||
'sku': self.sku,
|
||||
'sale_price': float(self.sale_price) if self.sale_price is not None else 0,
|
||||
'service_category': self.service_category,
|
||||
'provider_name': self.provider_name,
|
||||
'contract_id': self.contract_id,
|
||||
'contact_person': self.contact_person,
|
||||
'sale_price': float(self.sale_price) if self.sale_price is not None else 0,
|
||||
'cost_price': float(self.cost_price) if self.cost_price is not None else 0,
|
||||
'description': self.description,
|
||||
'actual_quantity': self.actual_quantity, # 返回库存数
|
||||
'available_quantity': self.available_quantity, # 返回可用数
|
||||
'valid_period': self.valid_period,
|
||||
'status': self.status,
|
||||
'created_at': self.created_at.strftime('%Y-%m-%d %H:%M:%S') if self.created_at else None,
|
||||
'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M:%S') if self.updated_at else None,
|
||||
|
||||
# 注意:这里通过 self.base 访问关联对象,而不是 self.material_base
|
||||
# 关联的基础信息 (Flattened)
|
||||
'material_name': self.base.name if self.base else None,
|
||||
'spec_model': self.base.spec_model if self.base else None,
|
||||
'unit': self.base.unit if self.base else None,
|
||||
'category': self.base.category if self.base else None,
|
||||
'material_type': self.base.material_type if self.base else None,
|
||||
}
|
||||
Reference in New Issue
Block a user