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, }