dingdanquanliucheng/backend/app/api/customers.py

81 lines
2.8 KiB
Python

from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from backend.app.api.deps import require_roles
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.customers import CreateCustomerRequest, ImportCustomerRequest
from backend.app.services.customer_service import customer_service
router = APIRouter(prefix="/api/customers", tags=["customers"])
@router.get("")
def list_customers(
customer_name: str | None = Query(default=None),
mobile: str | None = Query(default=None),
customer_type: str | None = Query(default=None),
settlement_type: str | None = Query(default=None),
salesman_id: int | None = Query(default=None),
page_no: int = Query(default=1),
page_size: int = Query(default=20),
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("salesman", "manager", "admin")),
) -> dict:
result = customer_service.list_customers(
session,
customer_service.normalize_list_filters(
{
"customer_name": customer_name,
"mobile": mobile,
"customer_type": customer_type,
"settlement_type": settlement_type,
"salesman_id": salesman_id,
},
current_user,
),
)
start = max(page_no - 1, 0) * page_size
result["list"] = result["list"][start : start + page_size]
result["page_no"] = page_no
result["page_size"] = page_size
return success_payload(result)
@router.post("")
def create_customer(
payload: CreateCustomerRequest,
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("salesman", "manager", "admin")),
) -> dict:
return success_payload(
customer_service.create_customer(
session=session,
payload=payload.model_dump(),
current_user=current_user,
)
)
@router.get("/{customer_id}")
def get_customer(
customer_id: int,
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("salesman", "manager", "admin")),
) -> dict:
customer = customer_service.get_customer(customer_id, session, current_user)
if not customer:
raise AppException(code=ErrorCode.NOT_FOUND, message="客户不存在", status_code=404)
return success_payload(customer)
@router.post("/import")
def import_customers(
payload: ImportCustomerRequest,
session: Session = Depends(get_db_session),
current_user: dict = Depends(require_roles("manager", "admin")),
) -> dict:
return success_payload(customer_service.import_customers_from_file(session, payload.model_dump()))