2026-02-04 13:30:07 +08:00
|
|
|
|
from app.extensions import db
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
# 1. 借用表
|
|
|
|
|
|
class TransBorrow(db.Model):
|
|
|
|
|
|
__tablename__ = 'trans_borrow'
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
sku = db.Column(db.String(100), index=True) # 加索引优化查询
|
2026-02-04 13:30:07 +08:00
|
|
|
|
source_table = db.Column(db.String(50))
|
|
|
|
|
|
stock_id = db.Column(db.Integer)
|
|
|
|
|
|
quantity = db.Column(db.Numeric(19, 4))
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
borrow_time = db.Column(db.DateTime, default=datetime.now)
|
|
|
|
|
|
expected_return_time = db.Column(db.DateTime)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
borrower_name = db.Column(db.String(100))
|
|
|
|
|
|
actual_return_time = db.Column(db.DateTime)
|
|
|
|
|
|
approver_name = db.Column(db.String(100))
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
|
|
|
|
|
# 状态:borrowed(借出), returned(已还), overdue(逾期)
|
|
|
|
|
|
status = db.Column(db.String(20), default='borrowed')
|
2026-02-04 13:30:07 +08:00
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
|
|
return {
|
|
|
|
|
|
'id': self.id,
|
|
|
|
|
|
'sku': self.sku,
|
2026-02-04 14:29:59 +08:00
|
|
|
|
'quantity': float(self.quantity) if self.quantity else 0,
|
2026-02-04 13:30:07 +08:00
|
|
|
|
'borrower_name': self.borrower_name,
|
2026-02-04 14:29:59 +08:00
|
|
|
|
'borrow_time': self.borrow_time.strftime('%Y-%m-%d %H:%M:%S') if self.borrow_time else None,
|
2026-02-04 13:30:07 +08:00
|
|
|
|
'status': self.status
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
# 2. 维修表
|
|
|
|
|
|
class TransRepair(db.Model):
|
|
|
|
|
|
__tablename__ = 'trans_repair'
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
sku = db.Column(db.String(100), index=True)
|
2026-02-04 13:30:07 +08:00
|
|
|
|
source_table = db.Column(db.String(50))
|
|
|
|
|
|
stock_id = db.Column(db.Integer)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
arrival_date = db.Column(db.Date)
|
|
|
|
|
|
expected_repair_time = db.Column(db.String(100))
|
|
|
|
|
|
shipping_date = db.Column(db.Date)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
is_self_made = db.Column(db.Boolean, default=False)
|
|
|
|
|
|
related_product_id = db.Column(db.Integer)
|
|
|
|
|
|
related_contract_id = db.Column(db.String(100))
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
repair_manager = db.Column(db.String(100))
|
|
|
|
|
|
fault_description = db.Column(db.Text)
|
|
|
|
|
|
repair_result = db.Column(db.Text)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
cost_price = db.Column(db.Numeric(19, 4))
|
|
|
|
|
|
sale_price = db.Column(db.Numeric(19, 4))
|
|
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
2026-02-04 14:29:59 +08:00
|
|
|
|
return {
|
|
|
|
|
|
'id': self.id,
|
|
|
|
|
|
'sku': self.sku,
|
|
|
|
|
|
'status': 'repaired' if self.repair_result else 'pending',
|
|
|
|
|
|
'manager': self.repair_manager
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
|
|
|
|
|
|
# 3. 报废表
|
|
|
|
|
|
class TransScrap(db.Model):
|
|
|
|
|
|
__tablename__ = 'trans_scrap'
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
id = db.Column(db.Integer, primary_key=True)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
sku = db.Column(db.String(100), index=True)
|
2026-02-04 13:30:07 +08:00
|
|
|
|
source_table = db.Column(db.String(50))
|
|
|
|
|
|
stock_id = db.Column(db.Integer)
|
|
|
|
|
|
quantity = db.Column(db.Numeric(19, 4))
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
reason = db.Column(db.Text)
|
|
|
|
|
|
operator_name = db.Column(db.String(100))
|
|
|
|
|
|
operation_time = db.Column(db.DateTime, default=datetime.now)
|
2026-02-04 14:29:59 +08:00
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
approver_name = db.Column(db.String(100))
|
2026-02-04 14:29:59 +08:00
|
|
|
|
approval_status = db.Column(db.String(20), default='pending') # pending, approved, rejected
|
|
|
|
|
|
|
2026-02-04 13:30:07 +08:00
|
|
|
|
cost_at_scrap = db.Column(db.Numeric(19, 4))
|
|
|
|
|
|
total_loss = db.Column(db.Numeric(19, 4))
|
|
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
2026-02-04 14:29:59 +08:00
|
|
|
|
return {
|
|
|
|
|
|
'id': self.id,
|
|
|
|
|
|
'sku': self.sku,
|
|
|
|
|
|
'quantity': float(self.quantity) if self.quantity else 0,
|
|
|
|
|
|
'total_loss': float(self.total_loss) if self.total_loss else 0,
|
|
|
|
|
|
'reason': self.reason
|
|
|
|
|
|
}
|