deliveryman-api/app/models/merchant_order.py
aaron 1c38cf825b 1. 规范订单号
2. 账户明细中,关联对应的订单号。
2025-01-19 23:44:59 +08:00

74 lines
2.7 KiB
Python
Raw 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
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)
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)
deduct_amount = Column(DECIMAL(10,2), nullable=False, default=0)
pay_amount = Column(DECIMAL(10,2), nullable=False, default=0)
status = Column(Enum(MerchantOrderStatus), nullable=False, default=MerchantOrderStatus.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
deduct_amount: float
pay_amount: float
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_logo: Optional[str] = None
merchant_address: Optional[str] = None
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"M{date_str}{timestamp}"
def generate_verify_code() -> str:
"""生成21位数字核销码"""
return ''.join(random.choices('0123456789', k=21))