51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from backend.app.models.business import LogisticsTask
|
|
|
|
|
|
class LogisticsRepository:
|
|
"""物流任务数据访问层。"""
|
|
|
|
def list_tasks_by_filters(self, session: Session, filters: dict) -> list[LogisticsTask]:
|
|
stmt = select(LogisticsTask).where(LogisticsTask.deleted == 0)
|
|
|
|
if filters.get("order_id") is not None:
|
|
stmt = stmt.where(LogisticsTask.order_id == filters["order_id"])
|
|
if filters.get("task_no"):
|
|
stmt = stmt.where(LogisticsTask.task_no.contains(filters["task_no"]))
|
|
if filters.get("status"):
|
|
stmt = stmt.where(LogisticsTask.status == filters["status"])
|
|
if filters.get("driver_id") is not None:
|
|
stmt = stmt.where(LogisticsTask.driver_id == filters["driver_id"])
|
|
if filters.get("factory_id") is not None:
|
|
stmt = stmt.where(LogisticsTask.factory_id == filters["factory_id"])
|
|
|
|
stmt = stmt.order_by(LogisticsTask.id.desc())
|
|
return list(session.execute(stmt).scalars())
|
|
|
|
def get_task(self, session: Session, task_id: int) -> LogisticsTask | None:
|
|
stmt = select(LogisticsTask).where(LogisticsTask.id == task_id, LogisticsTask.deleted == 0)
|
|
return session.execute(stmt).scalar_one_or_none()
|
|
|
|
def get_task_by_order_id(self, session: Session, order_id: int) -> LogisticsTask | None:
|
|
stmt = (
|
|
select(LogisticsTask)
|
|
.where(LogisticsTask.order_id == order_id, LogisticsTask.deleted == 0)
|
|
.order_by(LogisticsTask.id.desc())
|
|
)
|
|
return session.execute(stmt).scalar_one_or_none()
|
|
|
|
def create_task(self, session: Session, payload: dict) -> LogisticsTask:
|
|
task = LogisticsTask(**payload)
|
|
session.add(task)
|
|
session.flush()
|
|
return task
|
|
|
|
def update_task_status(self, session: Session, task: LogisticsTask, status: str) -> LogisticsTask:
|
|
task.status = status
|
|
session.add(task)
|
|
session.flush()
|
|
return task
|
|
|