覆盖所有模块: - api 层:17 个路由文件,每个接口标注用途、参数、返回值、权限 - services 层:18 个服务文件,每个方法标注作用、参数、返回值、调用方 - repositories 层:13 个仓储文件,每个方法标注查询逻辑和被调用方 - schemas 层:11 个请求/响应体文件,每个字段标注业务含义 - core 层:config、security、exceptions、responses、error_codes - models 层:19 个 ORM 模型类,每个表标注业务含义和关联关系 - scripts:bootstrap_data、smoke_check - migrations:env.py 和版本迁移文件 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
101 lines
3.8 KiB
Python
101 lines
3.8 KiB
Python
"""
|
||
供应商数据访问层。
|
||
|
||
负责封装供应商(Supplier)模型的数据库查询操作,
|
||
提供供应商的条件筛选、创建、更新、唯一性校验等方法。
|
||
被 SupplierService 调用。
|
||
"""
|
||
|
||
from sqlalchemy import select
|
||
from sqlalchemy.orm import Session
|
||
|
||
from backend.app.models.business import Supplier
|
||
|
||
|
||
class SupplierRepository:
|
||
"""供应商数据访问层,封装供应商表的数据库操作。
|
||
|
||
被 SupplierService 调用。
|
||
"""
|
||
|
||
def list_suppliers(self, session: Session, filters: dict) -> list[Supplier]:
|
||
"""根据筛选条件查询供应商列表,支持供应商名模糊匹配、类型和状态精确匹配。
|
||
|
||
:param session: 数据库会话
|
||
:param filters: 筛选条件字典,可包含 supplier_name、supplier_type、status 等键
|
||
:return: 符合条件的供应商列表,按 id 降序排列
|
||
被 SupplierService.list_suppliers 调用。
|
||
"""
|
||
stmt = select(Supplier).where(Supplier.deleted == 0)
|
||
|
||
if filters.get("supplier_name"):
|
||
stmt = stmt.where(Supplier.supplier_name.contains(filters["supplier_name"]))
|
||
if filters.get("supplier_type"):
|
||
stmt = stmt.where(Supplier.supplier_type == filters["supplier_type"])
|
||
if filters.get("status") is not None:
|
||
stmt = stmt.where(Supplier.status == filters["status"])
|
||
|
||
stmt = stmt.order_by(Supplier.id.desc())
|
||
return list(session.execute(stmt).scalars())
|
||
|
||
def get_supplier_by_name_and_type(
|
||
self,
|
||
session: Session,
|
||
supplier_name: str,
|
||
supplier_type: str,
|
||
) -> Supplier | None:
|
||
"""根据供应商名称和类型精确查找供应商(用于创建时的唯一性校验)。
|
||
|
||
:param session: 数据库会话
|
||
:param supplier_name: 供应商名称
|
||
:param supplier_type: 供应商类型
|
||
:return: 匹配的供应商对象,不存在则返回 None
|
||
被 SupplierService.create_supplier 调用,用于校验同名同类型供应商是否已存在。
|
||
"""
|
||
stmt = select(Supplier).where(
|
||
Supplier.supplier_name == supplier_name,
|
||
Supplier.supplier_type == supplier_type,
|
||
Supplier.deleted == 0,
|
||
)
|
||
return session.execute(stmt).scalar_one_or_none()
|
||
|
||
def create_supplier(self, session: Session, payload: dict) -> Supplier:
|
||
"""创建新的供应商记录。
|
||
|
||
:param session: 数据库会话
|
||
:param payload: 供应商字段字典
|
||
:return: 新创建的供应商对象(含自增 ID)
|
||
被 SupplierService.create_supplier 调用。
|
||
"""
|
||
supplier = Supplier(**payload)
|
||
session.add(supplier)
|
||
session.flush()
|
||
return supplier
|
||
|
||
def get_supplier(self, session: Session, supplier_id: int) -> Supplier | None:
|
||
"""根据 ID 获取单个供应商详情。
|
||
|
||
:param session: 数据库会话
|
||
:param supplier_id: 供应商主键 ID
|
||
:return: 供应商对象,不存在则返回 None
|
||
被 SupplierService.get_supplier 调用。
|
||
"""
|
||
stmt = select(Supplier).where(Supplier.id == supplier_id, Supplier.deleted == 0)
|
||
return session.execute(stmt).scalar_one_or_none()
|
||
|
||
def update_supplier(self, session: Session, supplier: Supplier, payload: dict) -> Supplier:
|
||
"""更新已有供应商的字段信息(动态赋值,跳过值为 None 的字段)。
|
||
|
||
:param session: 数据库会话
|
||
:param supplier: 待更新的供应商对象
|
||
:param payload: 更新字段字典
|
||
:return: 更新后的供应商对象
|
||
被 SupplierService.update_supplier 调用。
|
||
"""
|
||
for key, value in payload.items():
|
||
if hasattr(supplier, key) and value is not None:
|
||
setattr(supplier, key, value)
|
||
session.add(supplier)
|
||
session.flush()
|
||
return supplier
|