from sqlalchemy import Column, Integer, String, Text, DateTime, Enum, JSON, DECIMAL from datetime import datetime from app.core.database import Base class VasPayment(Base): __tablename__ = "vas_payment" id = Column(Integer, primary_key=True, autoincrement=True) order_id = Column(String(128), nullable=False) provider = Column(Enum('stripe', 'wechat', 'alipay'), nullable=False) channel = Column(String(50), nullable=False) # 支付意向ID (Stripe PaymentIntent ID) payment_intent_id = Column(String(255)) # 外部交易号 (微信/支付宝的 transaction_id) external_trade_no = Column(String(255)) # --- 修改点 1: 扩充状态枚举 --- status = Column( Enum( 'pending', # 待支付 'succeeded', # 支付成功 'failed', # 支付失败 'expired', # 支付超时 'late_paid', # 逾期支付(极少见) 'refunded', # 已全额退款 ), default='pending', ) base_amount = Column(Integer, nullable=False) adjustment_delta = Column(Integer, default=0) final_amount = Column(Integer, nullable=False) base_currency = Column(String(10), nullable=False) amount = Column(Integer, nullable=False) currency = Column(String(10), nullable=False) random_offset = Column(Integer, nullable=False) exchange_rate = Column(DECIMAL(18, 8), nullable=False) qr_id = Column(Integer) payment_url = Column(Text) expire_at = Column(DateTime) provider_payload = Column(JSON) # 外部退款单号 (Stripe Refund ID / 微信退款单号 / 支付宝退款单号) external_refund_no = Column(String(255)) # 退款时间 refunded_at = Column(DateTime) # 退款原因/备注 refund_reason = Column(String(255)) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)