69 lines
2.8 KiB
Python
69 lines
2.8 KiB
Python
#stock.py
|
|
from app.extensions import db
|
|
from datetime import datetime
|
|
|
|
|
|
class StockBuy(db.Model):
|
|
__tablename__ = 'stock_buy'
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
|
|
|
# 【核心关联】
|
|
# 这里明确指定了 base_id 是外键,关联 material_base 表的 id
|
|
base_id = db.Column(db.Integer, db.ForeignKey('material_base.id'), nullable=False)
|
|
|
|
sku = db.Column(db.String(100))
|
|
in_date = db.Column(db.Date)
|
|
serial_number = db.Column(db.String(100))
|
|
batch_number = db.Column(db.String(100))
|
|
|
|
# 数量
|
|
in_quantity = db.Column(db.Numeric(19, 4), default=0)
|
|
stock_quantity = db.Column(db.Numeric(19, 4), default=0)
|
|
available_quantity = db.Column(db.Numeric(19, 4), default=0)
|
|
|
|
# 状态与位置
|
|
status = db.Column(db.String(50))
|
|
inspection_status = db.Column(db.String(50))
|
|
warehouse_location = db.Column(db.String(100))
|
|
|
|
# 财务与商务
|
|
unit_price = db.Column(db.Numeric(19, 4), default=0)
|
|
total_price = db.Column(db.Numeric(19, 4), default=0)
|
|
currency = db.Column(db.String(20), default='CNY')
|
|
exchange_rate = db.Column(db.Numeric(15, 6), default=1.0)
|
|
supplier_name = db.Column(db.String(255))
|
|
buyer_name = db.Column(db.String(100))
|
|
buyer_email = db.Column(db.String(100))
|
|
original_link = db.Column(db.Text)
|
|
detail_link = db.Column(db.Text)
|
|
arrival_photo = db.Column(db.Text)
|
|
|
|
# 【核心关联】
|
|
# 建立对象级别的连接,方便通过 stock.material 访问基础信息
|
|
material = db.relationship('MaterialBase', back_populates='stock_buys')
|
|
|
|
def to_dict(self):
|
|
"""序列化"""
|
|
return {
|
|
'id': self.id,
|
|
'base_id': self.base_id, # 前端需要这个ID来判断关联
|
|
'material_name': self.material.name if self.material else None,
|
|
'spec_model': self.material.spec_model if self.material else None,
|
|
'category': self.material.category if self.material else None,
|
|
'unit': self.material.unit if self.material else None,
|
|
'material_type': self.material.material_type if self.material else None,
|
|
|
|
'sku': self.sku,
|
|
'inbound_date': self.in_date.strftime('%Y-%m-%d') if self.in_date else None,
|
|
'serial_number': self.serial_number,
|
|
'batch_number': self.batch_number,
|
|
'qty_inbound': float(self.in_quantity) if self.in_quantity else 0,
|
|
'qty_stock': float(self.stock_quantity) if self.stock_quantity else 0,
|
|
'qty_available': float(self.available_quantity) if self.available_quantity else 0,
|
|
'warehouse_loc': self.warehouse_location,
|
|
'status': self.status,
|
|
'price_unit': float(self.unit_price) if self.unit_price else 0,
|
|
'price_total': float(self.total_price) if self.total_price else 0,
|
|
'supplier_name': self.supplier_name
|
|
} |