dingdanquanliucheng/backend/app/api/suppliers.py

107 lines
5.0 KiB
Python
Raw Normal View History

"""
供应商管理路由模块
职责
处理供应商信息的增删改查接口URL 前缀为 /api/suppliers
包括供应商列表查询创建供应商查看详情更新供应商信息
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
2026-05-14 13:51:06 +08:00
from backend.app.api.deps import get_supplier_service, 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
2026-05-14 13:51:06 +08:00
from backend.app.schemas.common import success_payload
2026-05-28 22:59:04 +08:00
from backend.app.schemas.suppliers import CreateSupplierRequest, UpdateSupplierRequest
from backend.app.services.supplier_service import SupplierService
2026-05-14 13:51:06 +08:00
router = APIRouter(prefix="/api/suppliers", tags=["suppliers"])
@router.get("")
def list_suppliers(
supplier_name: str | None = Query(default=None), # 供应商名称模糊搜索
supplier_type: str | None = Query(default=None), # 供应商类型筛选
status: int | None = Query(default=None), # 供应商状态筛选(启用/停用)
page_no: int = Query(default=1), # 页码,默认第 1 页
page_size: int = Query(default=20), # 每页条数,默认 20 条
supplier_service: SupplierService = Depends(get_supplier_service), # 注入供应商服务
session: Session = Depends(get_db_session), # 注入数据库会话
current_user: dict = Depends(require_roles("salesman", "manager", "admin")), # 角色鉴权
) -> dict:
"""分页查询供应商列表
用途获取所有供应商信息支持按名称类型状态筛选
请求参数Query 参数筛选 + 分页参数
返回值分页供应商列表包含 totalpage_nopage_sizelist
权限要求业务员salesman经理manager管理员admin
"""
result = supplier_service.list_suppliers(
{"supplier_name": supplier_name, "supplier_type": supplier_type, "status": status},
session,
)
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)
2026-05-14 13:51:06 +08:00
@router.post("")
def create_supplier(
payload: CreateSupplierRequest, # 创建供应商的请求体
supplier_service: SupplierService = Depends(get_supplier_service), # 注入供应商服务
session: Session = Depends(get_db_session), # 注入数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 角色鉴权:仅经理/管理员
) -> dict:
"""创建新供应商
用途新增一个供应商记录
请求参数CreateSupplierRequest供应商名称类型联系方式等
返回值创建成功后的供应商信息
权限要求经理manager或管理员admin
"""
return success_payload(supplier_service.create_supplier(payload.model_dump(), session))
@router.get("/{supplier_id}")
def get_supplier(
supplier_id: int, # 供应商 ID路径参数
supplier_service: SupplierService = Depends(get_supplier_service), # 注入供应商服务
session: Session = Depends(get_db_session), # 注入数据库会话
current_user: dict = Depends(require_roles("salesman", "manager", "admin")), # 角色鉴权
) -> dict:
"""查询供应商详情
用途根据供应商 ID 获取单个供应商的详细信息
请求参数supplier_id - 供应商 ID路径参数
返回值供应商详情信息
权限要求业务员salesman经理manager管理员admin
"""
supplier = supplier_service.get_supplier(supplier_id, session)
if not supplier:
raise AppException(code=ErrorCode.NOT_FOUND, message="供应商不存在", status_code=404)
return success_payload(supplier)
2026-05-28 22:59:04 +08:00
@router.put("/{supplier_id}")
def update_supplier(
supplier_id: int, # 供应商 ID路径参数
payload: UpdateSupplierRequest, # 更新供应商的请求体
supplier_service: SupplierService = Depends(get_supplier_service), # 注入供应商服务
session: Session = Depends(get_db_session), # 注入数据库会话
current_user: dict = Depends(require_roles("manager", "admin")), # 角色鉴权:仅经理/管理员
2026-05-28 22:59:04 +08:00
) -> dict:
"""更新供应商信息
用途修改已有供应商的基本信息
请求参数supplier_id路径参数+ UpdateSupplierRequest更新字段
返回值更新后的供应商信息
权限要求经理manager或管理员admin
"""
2026-05-28 22:59:04 +08:00
result = supplier_service.update_supplier(supplier_id, payload.model_dump(), session)
if not result:
raise AppException(code=ErrorCode.NOT_FOUND, message="供应商不存在", status_code=404)
return success_payload(result)