from sqlalchemy import Column, String, Integer, DateTime, ForeignKey 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 OrderStatus(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) 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) status = Column(Enum(OrderStatus), nullable=False, default=OrderStatus.CREATED) 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()) class MerchantOrderCreate(BaseModel): merchant_product_id: int order_amount: float = Field(..., gt=0) class MerchantOrderInfo(BaseModel): id: int order_id: str user_id: int merchant_product_id: int order_amount: float status: OrderStatus order_verify_code: str verify_time: Optional[datetime] verify_user_id: Optional[int] create_time: datetime update_time: Optional[datetime] class Config: from_attributes = True def generate_order_id() -> str: """生成订单号:8位日期 + 7位时间戳""" now = datetime.now() date_str = now.strftime('%Y%m%d') # 取时间戳后7位 timestamp = str(int(time.time() * 1000))[-7:] return f"{date_str}{timestamp}" def generate_verify_code() -> str: """生成21位数字核销码""" return ''.join(random.choices('0123456789', k=21))