dingdanquanliucheng/backend/app/repositories/order_repository.py
2026-05-14 13:51:06 +08:00

88 lines
3.9 KiB
Python

from datetime import datetime
from sqlalchemy import select
from sqlalchemy.orm import Session
from backend.app.models.business import SalesOrder, SalesOrderItem, Supplier
class OrderRepository:
"""订单数据访问层。"""
def list_orders(self, session: Session) -> list[SalesOrder]:
stmt = select(SalesOrder).where(SalesOrder.deleted == 0).order_by(SalesOrder.id.desc())
return list(session.execute(stmt).scalars())
def list_orders_by_filters(self, session: Session, filters: dict) -> list[SalesOrder]:
stmt = select(SalesOrder).where(SalesOrder.deleted == 0)
if filters.get("order_status"):
stmt = stmt.where(SalesOrder.order_status == filters["order_status"])
if filters.get("customer_name"):
stmt = stmt.where(SalesOrder.customer_name.contains(filters["customer_name"]))
if filters.get("customer_mobile"):
stmt = stmt.where(SalesOrder.customer_mobile.contains(filters["customer_mobile"]))
if filters.get("salesman_id") is not None:
stmt = stmt.where(SalesOrder.salesman_id == filters["salesman_id"])
if filters.get("factory_id") is not None:
stmt = stmt.where(SalesOrder.factory_id == filters["factory_id"])
if filters.get("order_source"):
stmt = stmt.where(SalesOrder.order_source == filters["order_source"])
if filters.get("start_time"):
start_time = datetime.strptime(filters["start_time"], "%Y-%m-%d %H:%M:%S")
stmt = stmt.where(SalesOrder.created_at >= start_time)
if filters.get("end_time"):
end_time = datetime.strptime(filters["end_time"], "%Y-%m-%d %H:%M:%S")
stmt = stmt.where(SalesOrder.created_at <= end_time)
stmt = stmt.order_by(SalesOrder.id.desc())
return list(session.execute(stmt).scalars())
def get_order(self, session: Session, order_id: int) -> SalesOrder | None:
stmt = select(SalesOrder).where(SalesOrder.id == order_id, SalesOrder.deleted == 0)
return session.execute(stmt).scalar_one_or_none()
def get_supplier(self, session: Session, supplier_id: int | None) -> Supplier | None:
if supplier_id is None:
return None
stmt = select(Supplier).where(Supplier.id == supplier_id, Supplier.deleted == 0)
return session.execute(stmt).scalar_one_or_none()
def list_order_items(self, session: Session, order_id: int) -> list[SalesOrderItem]:
stmt = select(SalesOrderItem).where(SalesOrderItem.order_id == order_id, SalesOrderItem.deleted == 0)
return list(session.execute(stmt).scalars())
def create_order(self, session: Session, payload: dict, items: list[dict]) -> SalesOrder:
order = SalesOrder(**payload)
session.add(order)
session.flush()
for item_payload in items:
session.add(SalesOrderItem(order_id=order.id, **item_payload))
session.flush()
return order
def update_order_status(self, session: Session, order: SalesOrder, target_status: str) -> SalesOrder:
order.order_status = target_status
session.add(order)
session.flush()
return order
def update_cancel_fields(self, session: Session, order: SalesOrder, payload: dict) -> SalesOrder:
order.order_status = payload["order_status"]
order.cancel_reason = payload["cancel_reason"]
order.cancel_opinion = payload.get("cancel_opinion")
order.cancel_previous_status = payload.get("cancel_previous_status")
session.add(order)
session.flush()
return order
def update_supplier_text_confirm(self, session: Session, order: SalesOrder, operator_id: int | None = None) -> SalesOrder:
order.order_status = "pending_factory"
order.supplier_text_confirmed_at = datetime.now()
order.supplier_text_confirmed_by = operator_id
session.add(order)
session.flush()
return order