112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
|
|
"""
|
||
|
|
销售订单路由模块
|
||
|
|
|
||
|
|
提供销售订单的管理功能,包括:
|
||
|
|
- 销售订单列表查询(支持分页、状态筛选)
|
||
|
|
- 创建销售订单(自动生成订单号、计算总金额)
|
||
|
|
- 销售订单明细管理
|
||
|
|
|
||
|
|
路由前缀: /api/sales-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, Customer, SalesOrder, SalesOrderItem
|
||
|
|
from .schemas import SalesOrderCreate, SalesOrderResponse
|
||
|
|
from .utils import generate_order_no
|
||
|
|
|
||
|
|
router = APIRouter(prefix="/sales-orders", tags=["销售订单"])
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("", response_model=List[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)
|
||
|
|
):
|
||
|
|
query = (
|
||
|
|
select(SalesOrder, Customer)
|
||
|
|
.join(Customer, SalesOrder.customer_id == Customer.id)
|
||
|
|
.order_by(SalesOrder.created_at.desc())
|
||
|
|
)
|
||
|
|
|
||
|
|
if status:
|
||
|
|
query = query.where(SalesOrder.status == status)
|
||
|
|
|
||
|
|
query = query.offset(skip).limit(limit)
|
||
|
|
result = await db_session.execute(query)
|
||
|
|
|
||
|
|
orders = []
|
||
|
|
for order, customer in result.all():
|
||
|
|
orders.append(SalesOrderResponse(
|
||
|
|
id=order.id,
|
||
|
|
order_no=order.order_no,
|
||
|
|
customer_name=customer.name,
|
||
|
|
order_date=order.order_date,
|
||
|
|
delivery_date=order.delivery_date,
|
||
|
|
status=order.status,
|
||
|
|
total_amount=order.total_amount,
|
||
|
|
received_amount=order.received_amount,
|
||
|
|
remark=order.remark,
|
||
|
|
created_at=order.created_at
|
||
|
|
))
|
||
|
|
|
||
|
|
return orders
|
||
|
|
|
||
|
|
|
||
|
|
@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)
|
||
|
|
):
|
||
|
|
order = SalesOrder(
|
||
|
|
order_no=generate_order_no("SO"),
|
||
|
|
customer_id=order_data.customer_id,
|
||
|
|
delivery_date=order_data.delivery_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 = SalesOrderItem(
|
||
|
|
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)
|
||
|
|
|
||
|
|
customer = await db_session.execute(select(Customer).where(Customer.id == order.customer_id))
|
||
|
|
customer = customer.scalar_one()
|
||
|
|
|
||
|
|
return SalesOrderResponse(
|
||
|
|
id=order.id,
|
||
|
|
order_no=order.order_no,
|
||
|
|
customer_name=customer.name,
|
||
|
|
order_date=order.order_date,
|
||
|
|
delivery_date=order.delivery_date,
|
||
|
|
status=order.status,
|
||
|
|
total_amount=order.total_amount,
|
||
|
|
received_amount=order.received_amount,
|
||
|
|
remark=order.remark,
|
||
|
|
created_at=order.created_at
|
||
|
|
)
|