from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Enum, DECIMAL, Boolean from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional from datetime import datetime from .database import Base import time import enum class MerchantPayOrderStatus(str, enum.Enum): UNPAID = "UNPAID" # 未支付 PAID = "PAID" # 已支付 REFUNDING = "REFUNDING" # 退款中 REFUNDED = "REFUNDED" # 已退款 class MerchantPayOrderDB(Base): __tablename__ = "merchant_pay_orders" id = Column(Integer, primary_key=True, autoincrement=True) order_id = Column(String(20), unique=True, nullable=False) merchant_id = Column(Integer, ForeignKey("merchants.id"), nullable=False) user_id = Column(Integer, ForeignKey("users.userid"), nullable=False) amount = Column(DECIMAL(10,2), nullable=False) gift_points = Column(DECIMAL(10,1), nullable=False, default=0) status = Column(Enum(MerchantPayOrderStatus), nullable=False, default=MerchantPayOrderStatus.UNPAID) pay_status = Column(Boolean, nullable=False, default=False) create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) pay_time = Column(DateTime(timezone=True), nullable=True) transaction_id = Column(String(64)) # 微信支付交易号 class MerchantPayOrderCreate(BaseModel): merchant_id: int amount: float = Field(..., gt=0) class MerchantPayOrderInfo(BaseModel): id: int order_id: str merchant_id: int user_id: int amount: float gift_points: float status: MerchantPayOrderStatus create_time: datetime update_time: Optional[datetime] pay_time: Optional[datetime] merchant_name: Optional[str] = None class Config: from_attributes = True def generate_pay_order_id() -> str: """生成支付订单号:P + 8位日期 + 7位时间戳""" now = datetime.now() date_str = now.strftime('%Y%m%d') # 取时间戳后7位 timestamp = str(int(time.time() * 1000))[-7:] return f"P{date_str}{timestamp}"