deliver.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. """配送员端接口"""
  2. from typing import List
  3. from datetime import datetime
  4. from fastapi import APIRouter, Depends, HTTPException, status
  5. from sqlalchemy.orm import Session
  6. from app.core.database import get_db
  7. from app.core.auth import get_current_user
  8. from app.models import Deliver, DeliveryTask
  9. from app.schemas import DeliveryTaskResponse, DeliveryPickupRequest, DeliveryCompleteRequest
  10. router = APIRouter(prefix="/deliver", tags=["配送员端接口"])
  11. def require_deliver(current_user: dict = Depends(get_current_user)):
  12. """验证配送员权限"""
  13. if current_user.get("role") != "deliver":
  14. raise HTTPException(status_code=403, detail="需要配送员权限")
  15. return current_user
  16. @router.get("/profile")
  17. def get_deliver_profile(
  18. db: Session = Depends(get_db),
  19. current_user: dict = Depends(require_deliver)
  20. ):
  21. """获取配送员信息"""
  22. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  23. if not deliver:
  24. raise HTTPException(status_code=404, detail="配送员信息不存在")
  25. return deliver
  26. @router.get("/delivery-tasks", response_model=List[DeliveryTaskResponse])
  27. def list_delivery_tasks(
  28. status: str = None,
  29. skip: int = 0,
  30. limit: int = 20,
  31. db: Session = Depends(get_db),
  32. current_user: dict = Depends(require_deliver)
  33. ):
  34. """获取配送任务列表"""
  35. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  36. if not deliver:
  37. raise HTTPException(status_code=404, detail="配送员信息不存在")
  38. query = db.query(DeliveryTask).filter(DeliveryTask.deliver_id == deliver.id)
  39. if status:
  40. query = query.filter(DeliveryTask.status == status)
  41. return query.order_by(DeliveryTask.created_at.desc()).offset(skip).limit(limit).all()
  42. @router.get("/delivery-tasks/{task_id}", response_model=DeliveryTaskResponse)
  43. def get_delivery_task(
  44. task_id: int,
  45. db: Session = Depends(get_db),
  46. current_user: dict = Depends(require_deliver)
  47. ):
  48. """获取配送任务详情"""
  49. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  50. if not deliver:
  51. raise HTTPException(status_code=404, detail="配送员信息不存在")
  52. task = db.query(DeliveryTask).filter(
  53. DeliveryTask.id == task_id,
  54. DeliveryTask.deliver_id == deliver.id
  55. ).first()
  56. if not task:
  57. raise HTTPException(status_code=404, detail="配送任务不存在")
  58. return task
  59. @router.post("/delivery-tasks/{task_id}/pickup")
  60. def pickup_confirm(
  61. task_id: int,
  62. request: DeliveryPickupRequest,
  63. db: Session = Depends(get_db),
  64. current_user: dict = Depends(require_deliver)
  65. ):
  66. """确认取货"""
  67. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  68. if not deliver:
  69. raise HTTPException(status_code=404, detail="配送员信息不存在")
  70. task = db.query(DeliveryTask).filter(
  71. DeliveryTask.id == task_id,
  72. DeliveryTask.deliver_id == deliver.id
  73. ).first()
  74. if not task:
  75. raise HTTPException(status_code=404, detail="配送任务不存在")
  76. if task.status != "pending":
  77. raise HTTPException(status_code=400, detail="当前任务状态不允许取货")
  78. task.status = "picking"
  79. task.pickup_time = datetime.utcnow()
  80. task.pickup_remark = request.remark
  81. task.pickup_image_url = request.image_url
  82. db.commit()
  83. return {"message": "取货确认成功"}
  84. @router.post("/delivery-tasks/{task_id}/complete")
  85. def delivery_complete(
  86. task_id: int,
  87. request: DeliveryCompleteRequest,
  88. db: Session = Depends(get_db),
  89. current_user: dict = Depends(require_deliver)
  90. ):
  91. """确认送达"""
  92. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  93. if not deliver:
  94. raise HTTPException(status_code=404, detail="配送员信息不存在")
  95. task = db.query(DeliveryTask).filter(
  96. DeliveryTask.id == task_id,
  97. DeliveryTask.deliver_id == deliver.id
  98. ).first()
  99. if not task:
  100. raise HTTPException(status_code=404, detail="配送任务不存在")
  101. if task.status not in ["picking", "delivering"]:
  102. raise HTTPException(status_code=400, detail="当前任务状态不允许送达")
  103. task.status = "completed"
  104. task.delivery_time = datetime.utcnow()
  105. task.delivery_remark = request.remark
  106. task.delivery_image_url = request.image_url
  107. db.commit()
  108. return {"message": "送达确认成功"}
  109. @router.get("/expiring-tasks", response_model=List[DeliveryTaskResponse])
  110. def get_expiring_tasks(
  111. minutes: int = 60,
  112. db: Session = Depends(get_db),
  113. current_user: dict = Depends(require_deliver)
  114. ):
  115. """获取即将过期的配送任务(1小时内)"""
  116. deliver = db.query(Deliver).filter(Deliver.user_id == current_user["user_id"]).first()
  117. if not deliver:
  118. raise HTTPException(status_code=404, detail="配送员信息不存在")
  119. from datetime import timedelta
  120. expire_time = datetime.utcnow() + timedelta(minutes=minutes)
  121. tasks = db.query(DeliveryTask).filter(
  122. DeliveryTask.deliver_id == deliver.id,
  123. DeliveryTask.status.in_(["pending", "picking"]),
  124. DeliveryTask.created_at <= expire_time
  125. ).all()
  126. return tasks