from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Enum, Boolean from sqlalchemy.dialects.mysql import DECIMAL from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional from datetime import datetime from .database import Base import random import time import enum class MerchantOrderStatus(str, enum.Enum): CREATED = "CREATED" # 已下单 UNVERIFIED = "UNVERIFIED" # 未核销 VERIFIED = "VERIFIED" # 已核销 REFUNDING = "REFUNDING" # 退款中 REFUNDED = "REFUNDED" # 已退款 class MerchantOrderDB(Base): __tablename__ = "merchant_orders" id = Column(Integer, primary_key=True, autoincrement=True) order_id = Column(String(15), unique=True, nullable=False) qrcode_url = Column(String(200)) # 核销码二维码图片地址 user_id = Column(Integer, ForeignKey("users.userid"), nullable=False) merchant_product_id = Column(Integer, ForeignKey("merchant_products.id"), nullable=False) order_amount = Column(DECIMAL(10,2), nullable=False) pay_amount = Column(DECIMAL(10,2), nullable=False, default=0) gift_points = Column(Integer, nullable=False, default=0) # 赠送的积分 status = Column(Enum(MerchantOrderStatus), nullable=False, default=MerchantOrderStatus.CREATED) pay_status = Column(Boolean, nullable=False, default=False) order_verify_code = Column(String(21), unique=True, nullable=False) verify_time = Column(DateTime(timezone=True), nullable=True) verify_user_id = Column(Integer, ForeignKey("users.userid"), nullable=True) create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) transaction_id = Column(String(64)) # 微信支付交易号 pay_time = Column(DateTime(timezone=True), nullable=True) class MerchantOrderCreate(BaseModel): merchant_product_id: int class MerchantOrderVerify(BaseModel): verify_code: str class MerchantOrderInfo(BaseModel): id: int order_id: str user_id: int merchant_product_id: int order_amount: float pay_amount: float gift_points: int status: MerchantOrderStatus order_verify_code: str verify_time: Optional[datetime] verify_user_id: Optional[int] create_time: datetime update_time: Optional[datetime] product_name: Optional[str] = None product_image: Optional[str] = None product_price: Optional[float] = None merchant_name: Optional[str] = None merchant_address: Optional[str] = None class Config: from_attributes = True