from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Enum, Boolean, Date, Time from sqlalchemy.dialects.mysql import DECIMAL from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional from datetime import datetime, date, time from .database import Base from .merchant_product import DeliveryType, DeliveryTimeType import random import time as time_module import enum from sqlalchemy.orm import relationship class MerchantOrderStatus(str, enum.Enum): CREATED = "CREATED" # 已创建(待支付) PENDING = "PENDING" # 待接单 DELIVERING = "DELIVERING" # 待配送 PICKUP_READY = "PICKUP_READY" # 待自提 COMPLETED = "COMPLETED" # 已完成 CANCELLED = "CANCELLED" # 已取消 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_id = Column(Integer, ForeignKey("merchants.id"), nullable=False) # 商家ID merchant_product_id = Column(Integer, ForeignKey("merchant_products.id"), nullable=False) address_id = Column(Integer, ForeignKey("delivery_addresses.id"), nullable=False) # 收货地址ID qty = Column(Integer, nullable=False, default=1) # 购买数量 unit_price = Column(DECIMAL(10,2), 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) # 商品快照数据 product_delivery_type = Column(Enum(DeliveryType), nullable=True) # 配送类型快照 product_pickup_place = Column(String(200), nullable=True) # 自提点快照 product_pickup_time_from = Column(Time, nullable=True) # 自提开始时间快照 product_pickup_time_to = Column(Time, nullable=True) # 自提结束时间快照 product_delivery_time_type = Column(Enum(DeliveryTimeType), nullable=True) # 配送时间类型快照 product_delivery_date = Column(Date, nullable=True) # 配送日期快照 product_delivery_deadline_time = Column(DateTime(timezone=True), 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) refund_transaction_id = Column(String(64)) # 微信退款交易号 refund_time = Column(DateTime(timezone=True), nullable=True) merchant_product = relationship("MerchantProductDB", backref="merchant_orders") merchant = relationship("MerchantDB", backref="merchant_orders") address = relationship("AddressDB", backref="merchant_orders") class MerchantOrderCreate(BaseModel): merchant_product_id: int qty: int = Field(..., gt=0) # 购买数量,必须大于0 address_id: int # 收货地址ID class MerchantOrderVerify(BaseModel): verify_code: str class MerchantOrderInfo(BaseModel): id: int order_id: str user_id: int merchant_id: int # 商家ID merchant_product_id: int address_id: int # 收货地址ID qty: int # 购买数量 unit_price: float # 产品单价 order_amount: float pay_amount: float gift_points: int status: MerchantOrderStatus order_verify_code: str verify_time: Optional[datetime] verify_user_id: Optional[int] # 商品快照数据 product_delivery_type: Optional[DeliveryType] = None # 配送类型快照 product_pickup_place: Optional[str] = None # 自提点快照 product_pickup_time_from: Optional[time] = None # 自提开始时间快照 product_pickup_time_to: Optional[time] = None # 自提结束时间快照 product_delivery_time_type: Optional[DeliveryTimeType] = None # 配送时间类型快照 product_delivery_date: Optional[date] = None # 配送日期快照 product_delivery_deadline_time: Optional[datetime] = None # 配送截止时间快照 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