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
|
|
|
|
2026-05-15 12:05:18 +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),
|
2026-05-15 12:05:18 +08:00
|
|
|
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,
|
|
|
|
|
},
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("manager", "admin")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("manager", "admin")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 11:31:55 +08:00
|
|
|
session: Session = Depends(get_db_session),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("manager", "admin", "driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
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),
|
2026-05-15 11:31:55 +08:00
|
|
|
session: Session = Depends(get_db_session),
|
2026-05-15 12:05:18 +08:00
|
|
|
current_user: dict = Depends(require_roles("manager", "admin", "driver")),
|
2026-05-14 15:17:56 +08:00
|
|
|
) -> dict:
|
2026-05-15 12:05:18 +08:00
|
|
|
return success_payload(logistics_service.create_trace(order_id, payload.model_dump(), session, current_user))
|