84 lines
2.7 KiB
Python
84 lines
2.7 KiB
Python
from datetime import datetime
|
||
from typing import Optional, List
|
||
from sqlalchemy import Column, String, Integer, Float, DateTime, ForeignKey
|
||
from sqlalchemy.sql import func
|
||
from pydantic import BaseModel, Field
|
||
from .database import Base
|
||
|
||
# 数据库模型
|
||
class ShippingOrderDB(Base):
|
||
__tablename__ = "shipping_orders"
|
||
|
||
orderid = Column(String(32), primary_key=True)
|
||
userid = Column(Integer, ForeignKey("users.userid"), index=True)
|
||
addressid = Column(Integer, ForeignKey("delivery_addresses.id"), index=True)
|
||
package_count = Column(Integer, nullable=False)
|
||
original_amount = Column(Float, nullable=False)
|
||
coupon_discount_amount = Column(Float, default=0)
|
||
coupon_id = Column(Integer, ForeignKey("user_coupons.id"), nullable=True)
|
||
final_amount = Column(Float, nullable=False)
|
||
create_time = Column(DateTime(timezone=True), server_default=func.now())
|
||
|
||
class ShippingOrderPackageDB(Base):
|
||
__tablename__ = "shipping_order_packages"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
orderid = Column(String(32), ForeignKey("shipping_orders.orderid"), index=True)
|
||
station_id = Column(Integer, ForeignKey("stations.id"), index=True)
|
||
pickup_codes = Column(String(100), nullable=False)
|
||
create_time = Column(DateTime(timezone=True), server_default=func.now())
|
||
|
||
# Pydantic 模型
|
||
class OrderPackage(BaseModel):
|
||
station_id: int
|
||
pickup_codes: str = Field(..., max_length=100)
|
||
|
||
class OrderCreate(BaseModel):
|
||
addressid: int
|
||
package_count: int = Field(..., gt=0)
|
||
original_amount: float = Field(..., ge=0)
|
||
coupon_id: Optional[int] = None
|
||
packages: List[OrderPackage]
|
||
|
||
class OrderInfo(BaseModel):
|
||
orderid: str
|
||
userid: int
|
||
addressid: int
|
||
package_count: int
|
||
original_amount: float
|
||
coupon_discount_amount: float
|
||
coupon_id: Optional[int]
|
||
final_amount: float
|
||
create_time: datetime
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
class OrderPackageInfo(BaseModel):
|
||
id: int
|
||
orderid: str
|
||
station_id: int
|
||
pickup_codes: str
|
||
create_time: datetime
|
||
|
||
class Config:
|
||
from_attributes = True
|
||
|
||
def generate_order_id() -> str:
|
||
"""生成订单号:日期+时间戳"""
|
||
now = datetime.now()
|
||
# 生成8位日期 + 6位序号,共14位
|
||
date_str = now.strftime('%Y%m%d') # 8位日期
|
||
# 生成6位序号(毫秒级时间戳后6位)
|
||
timestamp = str(int(now.timestamp() * 1000))[-6:]
|
||
return f"{date_str}{timestamp}"
|
||
|
||
class OrderPriceCalculateRequest(BaseModel):
|
||
packages: List[OrderPackage]
|
||
|
||
class OrderPriceInfo(BaseModel):
|
||
package_count: int
|
||
original_amount: float
|
||
coupon_discount_amount: float
|
||
coupon_id: Optional[int] = None
|
||
final_amount: float |