From 321ef8c7bda73fae74c87940000f084d23f747e1 Mon Sep 17 00:00:00 2001 From: DXC Date: Tue, 24 Mar 2026 15:46:14 +0800 Subject: [PATCH] feat(api): support pagination and keyword search for material base list --- inventory-backend/app/api/v1/bom.py | 35 ++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/inventory-backend/app/api/v1/bom.py b/inventory-backend/app/api/v1/bom.py index 59b5ad6..69828e7 100644 --- a/inventory-backend/app/api/v1/bom.py +++ b/inventory-backend/app/api/v1/bom.py @@ -1,4 +1,5 @@ from flask import Blueprint, request, jsonify, current_app +from sqlalchemy import or_ from app.services.bom_service import BomService from app.models.base import MaterialBase from app.models.bom import BomTable @@ -312,12 +313,36 @@ def save_bom_legacy(): @jwt_required() @permission_required('bom_manage') def get_material_base_list(): - """获取所有基础物料列表,用于前端下拉框""" + """获取基础物料列表,支持分页和关键字搜索,用于前端下拉框""" try: - materials = MaterialBase.query.filter_by(is_enabled=True).order_by(MaterialBase.id.desc()).all() - data = [item.to_dict() for item in materials] - # 字段级脱敏 (如果需要,但此接口通常用于下拉选择,可能不需要脱敏) - # 保持原样 + # 获取分页和搜索参数 + page = int(request.args.get('page', 1)) + limit = int(request.args.get('limit', 20)) + keyword = request.args.get('keyword', '').strip() + + # 构建查询条件 + query = MaterialBase.query.filter_by(is_enabled=True) + + # 添加关键字模糊搜索 + if keyword: + query = query.filter( + or_( + MaterialBase.name.ilike(f"%{keyword}%"), + MaterialBase.spec.ilike(f"%{keyword}%") + ) + ) + + # 执行分页查询 + pagination = query.order_by(MaterialBase.id.desc()).paginate( + page=page, per_page=limit, error_out=False + ) + + # 构建返回数据 + data = { + 'list': [item.to_dict() for item in pagination.items], + 'total': pagination.total + } + return jsonify({ 'code': 200, 'msg': 'success',