deliveryman-api/app/models/merchant_order.py
2025-03-26 23:52:12 +08:00

110 lines
5.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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