266 lines
7.5 KiB
Python
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
|