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) 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()) # 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 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