"""配送员端接口""" from typing import List from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from app.core.database import get_db from app.core.auth import get_current_user from app.models import Deliver, DeliveryTask from app.schemas import DeliveryTaskResponse, DeliveryPickupRequest, DeliveryCompleteRequest router = APIRouter(prefix="/deliver", tags=["配送员端接口"]) def require_deliver(current_user: dict = Depends(get_current_user)): """验证配送员权限""" if current_user.get("role") != "deliver": raise HTTPException(status_code=403, detail="需要配送员权限") return current_user @router.get("/profile") def get_deliver_profile( db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """获取配送员信息""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") return deliver @router.get("/delivery-tasks", response_model=List[DeliveryTaskResponse]) def list_delivery_tasks( status: str = None, skip: int = 0, limit: int = 20, db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """获取配送任务列表""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") query = db.query(DeliveryTask).filter(DeliveryTask.deliver_id == deliver.id) if status: query = query.filter(DeliveryTask.status == status) return query.order_by(DeliveryTask.created_at.desc()).offset(skip).limit(limit).all() @router.get("/delivery-tasks/{task_id}", response_model=DeliveryTaskResponse) def get_delivery_task( task_id: int, db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """获取配送任务详情""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") task = db.query(DeliveryTask).filter( DeliveryTask.id == task_id, DeliveryTask.deliver_id == deliver.id ).first() if not task: raise HTTPException(status_code=404, detail="配送任务不存在") return task @router.post("/delivery-tasks/{task_id}/pickup") def pickup_confirm( task_id: int, request: DeliveryPickupRequest, db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """确认取货""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") task = db.query(DeliveryTask).filter( DeliveryTask.id == task_id, DeliveryTask.deliver_id == deliver.id ).first() if not task: raise HTTPException(status_code=404, detail="配送任务不存在") if task.status != "pending": raise HTTPException(status_code=400, detail="当前任务状态不允许取货") task.status = "picking" task.pickup_time = datetime.utcnow() task.pickup_remark = request.remark task.pickup_image_url = request.image_url db.commit() return {"message": "取货确认成功"} @router.post("/delivery-tasks/{task_id}/complete") def delivery_complete( task_id: int, request: DeliveryCompleteRequest, db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """确认送达""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") task = db.query(DeliveryTask).filter( DeliveryTask.id == task_id, DeliveryTask.deliver_id == deliver.id ).first() if not task: raise HTTPException(status_code=404, detail="配送任务不存在") if task.status not in ["picking", "delivering"]: raise HTTPException(status_code=400, detail="当前任务状态不允许送达") task.status = "completed" task.delivery_time = datetime.utcnow() task.delivery_remark = request.remark task.delivery_image_url = request.image_url db.commit() return {"message": "送达确认成功"} @router.get("/expiring-tasks", response_model=List[DeliveryTaskResponse]) def get_expiring_tasks( minutes: int = 60, db: Session = Depends(get_db), current_user: dict = Depends(require_deliver) ): """获取即将过期的配送任务(1小时内)""" deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first() if not deliver: raise HTTPException(status_code=404, detail="配送员信息不存在") from datetime import timedelta expire_time = datetime.utcnow() + timedelta(minutes=minutes) tasks = db.query(DeliveryTask).filter( DeliveryTask.deliver_id == deliver.id, DeliveryTask.status.in_(["pending", "picking"]), DeliveryTask.created_at <= expire_time ).all() return tasks