"""Pydantic schemas - 配送任务管理""" from pydantic import BaseModel, Field from typing import Optional, List from datetime import datetime from decimal import Decimal class DeliveryTaskItemResponse(BaseModel): """配送任务明细响应""" id: str taskId: str orderId: Optional[str] = None orderItemId: Optional[str] = None productId: Optional[str] = None productName: Optional[str] = None clientId: Optional[str] = None deliveryAddress: Optional[str] = None contactPerson: Optional[str] = None contactPhone: Optional[str] = None quantity: Decimal deliveredQuantity: Optional[Decimal] = None status: str deliveryTime: Optional[datetime] = None class Config: from_attributes = True class DeliveryTaskResponse(BaseModel): """配送任务响应""" id: str taskNo: str orderId: Optional[str] = None regionId: Optional[str] = None regionName: Optional[str] = None supplierId: Optional[str] = None supplierName: Optional[str] = None deliverId: Optional[str] = None deliverName: Optional[str] = None status: str effectiveTime: Optional[datetime] = None pickupTime: Optional[datetime] = None pickupRemark: Optional[str] = None pickupImageUrl: Optional[str] = None deliveryTime: Optional[datetime] = None deliveryRemark: Optional[str] = None deliveryImageUrl: Optional[str] = None createAt: Optional[datetime] = None class Config: from_attributes = True class DeliveryTaskDetailResponse(DeliveryTaskResponse): """配送任务详情响应""" items: List[DeliveryTaskItemResponse] = [] order: Optional[dict] = None deliver: Optional[dict] = None class DeliveryTaskListResponse(BaseModel): """配送任务列表响应""" items: List[DeliveryTaskResponse] total: int page: int pageSize: int totalPages: int class DeliveryTaskCreateRequest(BaseModel): """创建配送任务请求""" orderId: str = Field(..., description="订单ID") regionId: str = Field(..., description="区域ID") supplierId: str = Field(..., description="供应商ID") deliverId: Optional[str] = Field(None, description="配送员ID") effectiveTime: Optional[datetime] = Field(None, description="配送截止时间") class DeliveryTaskAssignRequest(BaseModel): """分配配送员请求""" deliverId: str = Field(..., description="配送员ID") class DeliveryTaskPickupRequest(BaseModel): """确认取货请求""" pickupRemark: Optional[str] = Field(None, description="取货备注") pickupImageUrl: Optional[str] = Field(None, description="取货图片URL") class DeliveryTaskDeliverRequest(BaseModel): """确认送达请求""" deliveryRemark: Optional[str] = Field(None, description="送达备注") deliveryImageUrl: Optional[str] = Field(None, description="送达图片URL") class DeliveryTaskCancelRequest(BaseModel): """取消配送任务请求""" reason: str = Field(..., description="取消原因") class DeliveryTaskStatusUpdateRequest(BaseModel): """更新配送任务状态请求""" status: str = Field(..., description="新状态") remark: Optional[str] = Field(None, description="备注") # ============ 供应商端配送任务 Schema ============ class SupplierTaskResponse(BaseModel): """供应商配送任务响应""" id: str taskNo: str orderId: Optional[str] = None regionId: Optional[str] = None regionName: Optional[str] = None clientName: Optional[str] = None supplierId: Optional[str] = None deliverId: Optional[str] = None deliverName: Optional[str] = None status: str effectiveTime: Optional[datetime] = None pickupTime: Optional[datetime] = None pickupRemark: Optional[str] = None deliveryTime: Optional[datetime] = None totalItems: int = 0 deliveredItems: int = 0 createAt: Optional[datetime] = None class Config: from_attributes = True class SupplierTaskListResponse(BaseModel): """供应商配送任务列表响应""" items: List[SupplierTaskResponse] total: int page: int pageSize: int totalPages: int class SupplierConfirmPickupRequest(BaseModel): """供应商确认取货请求""" pickupRemark: Optional[str] = Field(None, description="取货备注") class SupplierConfirmPreparedRequest(BaseModel): """供应商确认备货完成请求""" preparedRemark: Optional[str] = Field(None, description="备货备注") # ============ 配送统计 Schema ============ class DeliveryStatisticsResponse(BaseModel): """配送统计响应""" totalTasks: int pendingTasks: int inProgressTasks: int completedTasks: int cancelledTasks: int averageDeliveryTime: Optional[float] = None onTimeRate: Optional[float] = None class DeliveryWarningItem(BaseModel): """配送预警项""" taskId: str taskNo: str urgencyLevel: str remainingMinutes: int orderId: Optional[str] = None clientName: Optional[str] = None deliverName: Optional[str] = None class DeliveryWarningListResponse(BaseModel): """配送预警列表响应""" items: List[DeliveryWarningItem] = [] total: int page: int pageSize: int totalPages: int # ============ 运营端配送任务 Schema (兼容旧命名) ============ class DeliveryAssignRequest(BaseModel): """分配配送员请求""" deliverId: str = Field(..., description="配送员ID") class DeliveryAssignBatchRequest(BaseModel): """批量分配配送员请求""" taskIds: List[str] = Field(..., description="配送任务ID列表") deliverId: str = Field(..., description="配送员ID") class DeliveryPickupRequest(BaseModel): """配送员取货确认请求""" taskId: str = Field(..., description="配送任务ID") pickupRemark: Optional[str] = Field(None, description="取货备注") pickupImageUrl: Optional[str] = Field(None, description="取货图片") class DeliveryDeliverItem(BaseModel): """送达明细""" taskItemId: str = Field(..., description="配送任务明细ID") deliveredQuantity: Decimal = Field(..., description="送达数量") class DeliveryDeliverRequest(BaseModel): """确认送达请求""" taskId: str = Field(..., description="配送任务ID") items: List[DeliveryDeliverItem] = Field(default_factory=list, description="送达明细列表") deliveryRemark: Optional[str] = Field(None, description="送达备注") deliveryImageUrl: Optional[str] = Field(None, description="送达图片") class DeliveryCancelRequest(BaseModel): """取消配送任务请求""" taskId: str = Field(..., description="配送任务ID") reason: str = Field(..., description="取消原因") class DeliveryReassignRequest(BaseModel): """重新分配配送员请求""" taskId: str = Field(..., description="配送任务ID") newDeliverId: str = Field(..., description="新配送员ID") reason: Optional[str] = Field(None, description="重新分配原因") class DeliveryStatusResponse(BaseModel): """配送状态更新响应""" id: str status: str message: str = "操作成功" class DeliveryTaskStatistics(BaseModel): """配送任务统计""" total: int = 0 pending: int = 0 picking: int = 0 delivering: int = 0 completed: int = 0 cancelled: int = 0 class DeliveryAttachmentResponse(BaseModel): """配送附件响应""" id: str taskId: str type: str url: str createAt: datetime class Config: from_attributes = True # 兼容别名 DeliveryCompleteRequest = DeliveryTaskDeliverRequest