"""销售订单路由层 - 薄路由 业务逻辑下沉至 inventory.services.sales_order_service,路由只做参数校验与响应组装。 路由前缀: /api/sales-orders """ from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import Optional from shared.database.database import get_db_session from shared.services.auth_service import get_current_active_user from shared.models.identity import User from ..schemas import ( SalesOrderCreate, SalesOrderResponse, SalesOrderDetailResponse, SalesOrderProductionPlanResponse, SalesOrderIssueRequest, SalesOrderIssueResponse, SalesOrderStatusUpdate, MaterialConsumptionRequest, PaginatedResponse, ) from ..services.sales_order_service import sales_order_service router = APIRouter(prefix="/sales-orders", tags=["销售订单"]) @router.get("", response_model=PaginatedResponse[SalesOrderResponse]) async def list_sales_orders( status: Optional[str] = None, skip: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100), db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.list_orders(db_session, status, skip, limit) @router.post("", response_model=SalesOrderResponse, status_code=201) async def create_sales_order( order_data: SalesOrderCreate, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.create_order(db_session, order_data, current_user) @router.get("/{order_id}", response_model=SalesOrderDetailResponse) async def get_sales_order_detail( order_id: int, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.get_detail(db_session, order_id) @router.put("/{order_id}", response_model=SalesOrderResponse) async def update_sales_order( order_id: int, order_data: SalesOrderCreate, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.update_order(db_session, order_id, order_data, current_user) @router.patch("/{order_id}/status", response_model=SalesOrderResponse) async def update_sales_order_status( order_id: int, payload: SalesOrderStatusUpdate, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.update_status(db_session, order_id, payload, current_user) @router.delete("/{order_id}") async def delete_sales_order( order_id: int, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.delete_order(db_session, order_id, current_user) @router.post("/{order_id}/consume-materials") async def consume_materials( order_id: int, request: MaterialConsumptionRequest, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): """记录销售订单的物料消耗(在已发料基础上记录额外消耗,如报废/超耗)""" return await sales_order_service.consume_materials(db_session, order_id, request, current_user) @router.get("/{order_id}/production-plan", response_model=SalesOrderProductionPlanResponse) async def get_sales_order_production_plan( order_id: int, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.get_production_plan(db_session, order_id) @router.post("/{order_id}/issue-materials", response_model=SalesOrderIssueResponse) async def issue_sales_order_materials( order_id: int, payload: SalesOrderIssueRequest, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_current_active_user) ): return await sales_order_service.issue_materials(db_session, order_id, payload, current_user)