from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum, DECIMAL, JSON from sqlalchemy.sql import func from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime from .database import Base import enum class AdditionalFeeResult(str, enum.Enum): PENDING = "PENDING" # 待处理 ACCEPTED = "ACCEPTED" # 已接受 REJECTED = "REJECTED" # 已拒绝 class OrderAdditionalFeeDB(Base): __tablename__ = "order_additional_fees" id = Column(Integer, primary_key=True, autoincrement=True) orderid = Column(String(32), ForeignKey("shipping_orders.orderid"), nullable=False, index=True) fee_order_id = Column(String(32), nullable=False, unique=True) # 子订单号,用于支付标识 order_user_id = Column(Integer, ForeignKey("users.userid"), nullable=False) deliveryman_id = Column(Integer, ForeignKey("users.userid"), nullable=False) reason = Column(String(200), nullable=False) photo_urls = Column(JSON, nullable=True) # 存储照片URL的JSON数组 additional_fee_amount = Column(DECIMAL(10, 2), nullable=False) result = Column(Enum(AdditionalFeeResult), nullable=False, default=AdditionalFeeResult.PENDING) create_time = Column(DateTime(timezone=True), server_default=func.now()) update_time = Column(DateTime(timezone=True), onupdate=func.now()) transaction_id = Column(String(64), nullable=True) # 微信支付交易号 # Pydantic 模型 class OrderAdditionalFeeCreate(BaseModel): orderid: str reason: str = Field(..., max_length=200) photo_urls: Optional[List[str]] = None additional_fee_amount: float = Field(..., gt=0) class OrderAdditionalFeeUpdate(BaseModel): id: int reason: str photo_urls: Optional[List[str]] additional_fee_amount: float class OrderAdditionalFeeInfo(BaseModel): id: int orderid: str order_user_id: int deliveryman_id: int deliveryman_name: Optional[str] = None deliveryman_phone: Optional[str] = None deliveryman_avatar: Optional[str] = None reason: str photo_urls: Optional[List[str]] additional_fee_amount: float result: AdditionalFeeResult create_time: datetime update_time: Optional[datetime] = None class Config: from_attributes = True