import json from pydantic import BaseModel, field_validator from typing import Optional, Dict, Any, Literal, List from datetime import datetime class VasPaymentBase(BaseModel): status: Optional[Literal['pending', 'succeeded', 'failed', 'expired', 'late_paid']] = None qr_id: Optional[int] = None payment_url: Optional[str] = None expire_at: Optional[datetime] = None provider_payload: Optional[Dict[str, Any]] = None @field_validator("provider_payload", mode="before") def normalize_json_field(cls, v): if v is None: return None if isinstance(v, str): try: return json.loads(v) except Exception: return {} return v class VasPaymentCreate(BaseModel): order_id: str provider: Literal['stripe', 'wechat', 'alipay'] class VasPaymentUpdate(VasPaymentBase): pass class VasPaymentOut(VasPaymentBase): id: int order_id: str provider: str channel: str payment_intent_id: Optional[str] external_trade_no: Optional[str] base_amount: int base_currency: str amount: int currency: str random_offset: int exchange_rate: float # 注意:仅用于展示,DB 里是 DECIMAL created_at: datetime updated_at: datetime class Config: orm_mode = True