| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- """配送员端接口"""
- 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
|