dingdanquanliucheng/backend/app/api/orders.py

162 lines
5.5 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from backend.app.api.deps import get_order_service
from backend.app.core.error_codes import ErrorCode
from backend.app.core.exceptions import AppException
from backend.app.db import get_db_session
from backend.app.schemas.common import success_payload
from backend.app.schemas.orders import (
ApproveOrderRequest,
CancelOrderRequest,
ConfirmSupplierTextRequest,
CreateOrderRequest,
SupplierTextRequest,
)
from backend.app.services.order_service import OrderService
router = APIRouter(prefix="/api/orders", tags=["orders"])
@router.get("")
def list_orders(
order_no: str | None = Query(default=None),
order_status: str | None = Query(default=None),
customer_name: str | None = Query(default=None),
customer_mobile: str | None = Query(default=None),
salesman_id: int | None = Query(default=None),
factory_id: int | None = Query(default=None),
order_source: str | None = Query(default=None),
start_time: str | None = Query(default=None),
end_time: str | None = Query(default=None),
page_no: int = Query(default=1),
page_size: int = Query(default=20),
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
orders = order_service.list_orders(
session,
{
"order_no": order_no,
"order_status": order_status,
"customer_name": customer_name,
"customer_mobile": customer_mobile,
"salesman_id": salesman_id,
"factory_id": factory_id,
"order_source": order_source,
"start_time": start_time,
"end_time": end_time,
},
)
start = max(page_no - 1, 0) * page_size
page_list = orders[start : start + page_size]
return success_payload(
{
"total": len(orders),
"page_no": page_no,
"page_size": page_size,
"list": page_list,
}
)
@router.post("")
def create_order(
payload: CreateOrderRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
if not payload.items:
raise AppException(code=ErrorCode.PARAM_ERROR, message="订单明细不能为空", status_code=400)
order = order_service.create_order(payload.model_dump(), session)
return success_payload(order)
@router.get("/{order_id}")
def get_order(
order_id: int,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.get_order(order_id, session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/submit")
def submit_order(
order_id: int,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.submit_order(order_id, session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/cancel")
def cancel_order(
order_id: int,
payload: CancelOrderRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.cancel_order(order_id, payload.model_dump(), session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/approve")
def approve_order(
order_id: int,
payload: ApproveOrderRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.approve_order(order_id, payload.model_dump(), session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/cancel-approve")
def cancel_approve_order(
order_id: int,
payload: ApproveOrderRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.cancel_approve_order(order_id, payload.model_dump(), session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/supplier-text")
def supplier_text(
order_id: int,
payload: SupplierTextRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.get_supplier_text(order_id, payload.model_dump(), session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)
@router.post("/{order_id}/supplier-text/confirm")
def confirm_supplier_text(
order_id: int,
payload: ConfirmSupplierTextRequest,
order_service: OrderService = Depends(get_order_service),
session: Session = Depends(get_db_session),
) -> dict:
order = order_service.confirm_supplier_text(order_id, payload.model_dump(), session)
if not order:
raise AppException(code=ErrorCode.NOT_FOUND, message="订单不存在", status_code=404)
return success_payload(order)