Files
zkxw/backend/app/schemas/delivery.py
T
2026-05-12 16:35:07 +08:00

266 lines
7.5 KiB
Python

"""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