feat(purchase): 新增采购申请模块后端(模型+Service+API路由)
This commit is contained in:
86
inventory-backend/app/models/purchase.py
Normal file
86
inventory-backend/app/models/purchase.py
Normal file
@ -0,0 +1,86 @@
|
||||
import json
|
||||
from app.extensions import db, beijing_time
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class PurchaseRequest(db.Model):
|
||||
"""
|
||||
采购申请表
|
||||
"""
|
||||
__tablename__ = 'purchase_request'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
request_no = db.Column(db.String(100), unique=True, nullable=False, index=True)
|
||||
name = db.Column(db.String(255), nullable=False, comment='采购名称')
|
||||
spec_model = db.Column(db.String(255), comment='规格型号')
|
||||
quantity = db.Column(db.Numeric(19, 4), nullable=False, comment='采购数量')
|
||||
purchase_date = db.Column(db.Date, nullable=False, comment='采购时间')
|
||||
supplier_link = db.Column(db.String(500), comment='商家地址链接')
|
||||
remark = db.Column(db.Text, comment='备注信息')
|
||||
images = db.Column(db.Text, comment='图片列表JSON')
|
||||
unit_price = db.Column(db.Numeric(19, 4), default=0, comment='单价')
|
||||
total_price = db.Column(db.Numeric(19, 4), default=0, comment='总价')
|
||||
status = db.Column(db.Integer, default=0, nullable=False)
|
||||
requester_id = db.Column(db.Integer, nullable=False, index=True)
|
||||
approver_id = db.Column(db.Integer, index=True)
|
||||
approved_at = db.Column(db.DateTime)
|
||||
reject_reason = db.Column(db.Text)
|
||||
created_at = db.Column(db.DateTime, default=beijing_time, nullable=False)
|
||||
updated_at = db.Column(db.DateTime, default=beijing_time, onupdate=beijing_time, nullable=False)
|
||||
|
||||
def _safe_parse_json(self, value):
|
||||
if value is None:
|
||||
return []
|
||||
if isinstance(value, (list, dict)):
|
||||
return value
|
||||
if isinstance(value, str):
|
||||
val = value.strip()
|
||||
if not val:
|
||||
return []
|
||||
try:
|
||||
parsed = json.loads(val)
|
||||
return parsed if isinstance(parsed, list) else []
|
||||
except Exception:
|
||||
return []
|
||||
return []
|
||||
|
||||
def get_images(self):
|
||||
return self._safe_parse_json(self.images)
|
||||
|
||||
def set_images(self, image_list):
|
||||
self.images = json.dumps(image_list, ensure_ascii=False) if image_list else '[]'
|
||||
|
||||
def _get_user_name(self, user_id):
|
||||
if not user_id:
|
||||
return ""
|
||||
from app.models.system import SysUser
|
||||
try:
|
||||
user = db.session.get(SysUser, user_id)
|
||||
return user.username if user else f"未知用户({user_id})"
|
||||
except Exception:
|
||||
return f"用户({user_id})"
|
||||
|
||||
def to_dict(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'request_no': self.request_no,
|
||||
'name': self.name,
|
||||
'spec_model': self.spec_model or '',
|
||||
'quantity': float(self.quantity) if self.quantity else 0,
|
||||
'purchase_date': self.purchase_date.strftime('%Y-%m-%d') if self.purchase_date else None,
|
||||
'supplier_link': self.supplier_link or '',
|
||||
'remark': self.remark or '',
|
||||
'images': self.get_images(),
|
||||
'unit_price': float(self.unit_price) if self.unit_price else 0,
|
||||
'total_price': float(self.total_price) if self.total_price else 0,
|
||||
'status': self.status,
|
||||
'status_text': ['待审批', '已通过', '已驳回', '已完成'][self.status] if self.status in [0, 1, 2, 3] else '未知',
|
||||
'requester_id': self.requester_id,
|
||||
'requester_name': self._get_user_name(self.requester_id),
|
||||
'approver_id': self.approver_id,
|
||||
'approver_name': self._get_user_name(self.approver_id) if self.approver_id else None,
|
||||
'approved_at': self.approved_at.strftime('%Y-%m-%d %H:%M:%S') if self.approved_at else None,
|
||||
'reject_reason': self.reject_reason or '',
|
||||
'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,
|
||||
}
|
||||
Reference in New Issue
Block a user