dingdanquanliucheng/backend/app/api/logistics.py

130 lines
4.9 KiB
Python
Raw Normal View History

2026-05-14 15:17:56 +08:00
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
2026-05-14 13:51:06 +08:00
from backend.app.api.deps import get_logistics_service, require_roles
2026-05-14 15:17:56 +08:00
from backend.app.db import get_db_session
2026-05-14 13:51:06 +08:00
from backend.app.schemas.common import success_payload
2026-05-14 16:12:25 +08:00
from backend.app.schemas.logistics import CreateLogisticsTaskRequest, CreateLogisticsTraceRequest, DriverTaskOperateRequest
2026-05-14 15:17:56 +08:00
from backend.app.services.logistics_service import LogisticsService
2026-05-14 13:51:06 +08:00
router = APIRouter(tags=["logistics"])
@router.get("/api/logistics/tasks")
2026-05-14 15:17:56 +08:00
def list_logistics_tasks(
order_id: int | None = Query(default=None),
task_no: str | None = Query(default=None),
status: str | None = Query(default=None),
driver_id: int | None = Query(default=None),
factory_id: int | None = Query(default=None),
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(
logistics_service.list_tasks(
session=session,
filters={
"order_id": order_id,
"task_no": task_no,
"status": status,
"driver_id": driver_id,
"factory_id": factory_id,
},
current_user=current_user,
2026-05-14 15:17:56 +08:00
)
)
2026-05-14 13:51:06 +08:00
@router.post("/api/logistics/tasks")
2026-05-14 15:17:56 +08:00
def create_logistics_task(
payload: CreateLogisticsTaskRequest,
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.create_task(payload.model_dump(), session, current_user))
2026-05-14 13:51:06 +08:00
@router.get("/api/logistics/tasks/{task_id}")
2026-05-14 15:17:56 +08:00
def get_logistics_task(
task_id: int,
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.get_task(task_id, session, current_user))
2026-05-14 13:51:06 +08:00
@router.get("/api/driver/tasks")
2026-05-14 15:17:56 +08:00
def list_driver_tasks(
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.list_driver_tasks(session, current_user))
2026-05-14 13:51:06 +08:00
@router.get("/api/driver/tasks/{task_id}")
2026-05-14 15:17:56 +08:00
def get_driver_task(
task_id: int,
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.get_driver_task(task_id, session, current_user))
2026-05-14 13:51:06 +08:00
@router.post("/api/driver/tasks/{task_id}/accept")
2026-05-14 15:17:56 +08:00
def accept_driver_task(
task_id: int,
2026-05-14 16:12:25 +08:00
payload: DriverTaskOperateRequest,
2026-05-14 15:17:56 +08:00
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.accept_task(task_id, payload.model_dump(), session, current_user))
2026-05-14 13:51:06 +08:00
@router.post("/api/driver/tasks/{task_id}/pickup")
2026-05-14 15:17:56 +08:00
def pickup_driver_task(
task_id: int,
2026-05-14 16:12:25 +08:00
payload: DriverTaskOperateRequest,
2026-05-14 15:17:56 +08:00
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.pickup_task(task_id, payload.model_dump(), session, current_user))
2026-05-14 13:51:06 +08:00
@router.post("/api/driver/tasks/{task_id}/deliver")
2026-05-14 15:17:56 +08:00
def deliver_driver_task(
task_id: int,
2026-05-14 16:12:25 +08:00
payload: DriverTaskOperateRequest,
2026-05-14 15:17:56 +08:00
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.deliver_task(task_id, payload.model_dump(), session, current_user))
2026-05-14 13:51:06 +08:00
@router.get("/api/logistics/{order_id}/trace")
2026-05-14 15:17:56 +08:00
def get_logistics_trace(
order_id: int,
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin", "driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.get_trace(order_id, session, current_user))
2026-05-14 13:51:06 +08:00
@router.post("/api/logistics/{order_id}/trace")
2026-05-14 15:17:56 +08:00
def create_logistics_trace(
order_id: int,
2026-05-14 16:12:25 +08:00
payload: CreateLogisticsTraceRequest,
2026-05-14 15:17:56 +08:00
logistics_service: LogisticsService = Depends(get_logistics_service),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin", "driver")),
2026-05-14 15:17:56 +08:00
) -> dict:
return success_payload(logistics_service.create_trace(order_id, payload.model_dump(), session, current_user))