2025-07-04 19:07:35 +08:00

69 lines
2.3 KiB
Python

"""
支付模型
"""
from datetime import datetime
from config.database import db
class Payment(db.Model):
"""支付记录模型"""
__tablename__ = 'payments'
id = db.Column(db.Integer, primary_key=True)
order_id = db.Column(db.Integer, db.ForeignKey('orders.id'), nullable=False)
payment_sn = db.Column(db.String(64), unique=True, nullable=False)
payment_method = db.Column(db.String(20), nullable=False)
amount = db.Column(db.Numeric(10, 2), nullable=False)
status = db.Column(db.Integer, default=1) # 1-待支付 2-支付成功 3-支付失败 4-已退款
third_party_sn = db.Column(db.String(100)) # 第三方支付流水号
callback_data = db.Column(db.Text) # 支付回调数据
paid_at = db.Column(db.DateTime)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# 关联关系
order = db.relationship('Order', backref='payments')
# 状态常量
STATUS_PENDING = 1 # 待支付
STATUS_SUCCESS = 2 # 支付成功
STATUS_FAILED = 3 # 支付失败
STATUS_REFUNDED = 4 # 已退款
STATUS_CHOICES = {
STATUS_PENDING: '待支付',
STATUS_SUCCESS: '支付成功',
STATUS_FAILED: '支付失败',
STATUS_REFUNDED: '已退款'
}
def get_status_text(self):
"""获取状态文本"""
return self.STATUS_CHOICES.get(self.status, '未知状态')
def to_dict(self):
"""转换为字典"""
return {
'id': self.id,
'payment_sn': self.payment_sn,
'payment_method': self.payment_method,
'amount': float(self.amount),
'status': self.status,
'status_text': self.get_status_text(),
'third_party_sn': self.third_party_sn,
'paid_at': self.paid_at.isoformat() if self.paid_at else None,
'created_at': self.created_at.isoformat() if self.created_at else None
}
@classmethod
def generate_payment_sn(cls):
"""生成支付流水号"""
import time
import random
timestamp = str(int(time.time()))
random_str = str(random.randint(100000, 999999))
return f"PAY{timestamp}{random_str}"
def __repr__(self):
return f'<Payment {self.payment_sn}>'