88 lines
3.9 KiB
Python
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
|