This commit is contained in:
2026-03-08 22:58:25 +08:00
parent 3e19e45e9a
commit 1bdc75cee2
25 changed files with 1086 additions and 790 deletions
+111
View File
@@ -0,0 +1,111 @@
"""
采购订单路由模块
提供采购订单的管理功能,包括:
- 采购订单列表查询(支持分页、状态筛选)
- 创建采购订单(自动生成订单号、计算总金额)
- 采购订单明细管理
路由前缀: /api/purchase-orders
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from typing import Optional, List
from database.database import get_db_session
from services.auth_service import get_current_active_user
from models.database import User, Supplier, Product, PurchaseOrder, PurchaseOrderItem
from .schemas import PurchaseOrderCreate, PurchaseOrderResponse
from .utils import generate_order_no
router = APIRouter(prefix="/purchase-orders", tags=["采购订单"])
@router.get("", response_model=List[PurchaseOrderResponse])
async def list_purchase_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)
):
query = (
select(PurchaseOrder, Supplier)
.join(Supplier, PurchaseOrder.supplier_id == Supplier.id)
.order_by(PurchaseOrder.created_at.desc())
)
if status:
query = query.where(PurchaseOrder.status == status)
query = query.offset(skip).limit(limit)
result = await db_session.execute(query)
orders = []
for order, supplier in result.all():
orders.append(PurchaseOrderResponse(
id=order.id,
order_no=order.order_no,
supplier_name=supplier.name,
order_date=order.order_date,
expected_date=order.expected_date,
status=order.status,
total_amount=order.total_amount,
paid_amount=order.paid_amount,
remark=order.remark,
created_at=order.created_at
))
return orders
@router.post("", response_model=PurchaseOrderResponse, status_code=201)
async def create_purchase_order(
order_data: PurchaseOrderCreate,
db_session: AsyncSession = Depends(get_db_session),
current_user: User = Depends(get_current_active_user)
):
order = PurchaseOrder(
order_no=generate_order_no("PO"),
supplier_id=order_data.supplier_id,
expected_date=order_data.expected_date,
remark=order_data.remark,
operator_id=current_user.id,
status="draft"
)
db_session.add(order)
await db_session.flush()
total_amount = 0
for item_data in order_data.items:
item = PurchaseOrderItem(
order_id=order.id,
product_id=item_data.product_id,
quantity=item_data.quantity,
unit_price=item_data.unit_price,
amount=item_data.quantity * item_data.unit_price,
remark=item_data.remark
)
db_session.add(item)
total_amount += item.amount
order.total_amount = total_amount
await db_session.commit()
await db_session.refresh(order)
supplier = await db_session.execute(select(Supplier).where(Supplier.id == order.supplier_id))
supplier = supplier.scalar_one()
return PurchaseOrderResponse(
id=order.id,
order_no=order.order_no,
supplier_name=supplier.name,
order_date=order.order_date,
expected_date=order.expected_date,
status=order.status,
total_amount=order.total_amount,
paid_amount=order.paid_amount,
remark=order.remark,
created_at=order.created_at
)