feat: 重构全局搜索框为复合条件选择,支持按名称、俗名、规格进行精准查杂
This commit is contained in:
@ -124,7 +124,8 @@ def get_list():
|
||||
'isAsc': request.args.get('isAsc', None),
|
||||
'advancedFilters': advanced_filters_list,
|
||||
'enableWarningSort': request.args.get('enableWarningSort', 'false').lower() == 'true',
|
||||
'has_stock': request.args.get('has_stock', '')
|
||||
'has_stock': request.args.get('has_stock', ''),
|
||||
'searchField': request.args.get('searchField', 'all')
|
||||
}
|
||||
|
||||
user_permissions = get_current_user_permissions()
|
||||
|
||||
@ -116,6 +116,7 @@ def get_list():
|
||||
limit = request.args.get('pageSize', 15, type=int)
|
||||
keyword = request.args.get('keyword', '')
|
||||
sku = request.args.get('sku', '')
|
||||
search_field = request.args.get('searchField', 'all')
|
||||
|
||||
# 新增筛选参数
|
||||
category = request.args.get('category', '')
|
||||
@ -138,7 +139,7 @@ def get_list():
|
||||
statuses_str = request.args.get('statuses', '')
|
||||
statuses = statuses_str.split(',') if statuses_str else []
|
||||
|
||||
result = BuyInboundService.get_list(page, limit, keyword, sku, statuses, category, material_type, company,
|
||||
result = BuyInboundService.get_list(page, limit, keyword, sku, search_field, statuses, category, material_type, company,
|
||||
order_by, is_asc, advanced_filters)
|
||||
# 字段级脱敏
|
||||
user_permissions = get_current_user_permissions()
|
||||
|
||||
@ -74,6 +74,7 @@ def get_list():
|
||||
limit = request.args.get('pageSize', 15, type=int)
|
||||
keyword = request.args.get('keyword', '')
|
||||
sku = request.args.get('sku', '')
|
||||
search_field = request.args.get('searchField', 'all')
|
||||
statuses_str = request.args.get('statuses', '')
|
||||
statuses = statuses_str.split(',') if statuses_str else []
|
||||
category = request.args.get('category', '')
|
||||
@ -105,7 +106,7 @@ def get_list():
|
||||
|
||||
# 调用服务,传入所有参数
|
||||
result = ProductInboundService.get_list(
|
||||
page, limit, keyword, sku, statuses,
|
||||
page, limit, keyword, sku, search_field, statuses,
|
||||
category=extra_filters.get('category'),
|
||||
material_type=extra_filters.get('material_type'),
|
||||
company=extra_filters.get('company'),
|
||||
|
||||
@ -74,6 +74,7 @@ def get_list():
|
||||
limit = request.args.get('pageSize', 15, type=int)
|
||||
keyword = request.args.get('keyword', '')
|
||||
sku = request.args.get('sku', '')
|
||||
search_field = request.args.get('searchField', 'all')
|
||||
statuses_str = request.args.get('statuses', '')
|
||||
statuses = statuses_str.split(',') if statuses_str else []
|
||||
company = request.args.get('company', '')
|
||||
@ -105,7 +106,7 @@ def get_list():
|
||||
|
||||
# 调用服务,传入所有参数
|
||||
result = SemiInboundService.get_list(
|
||||
page, limit, keyword, sku, statuses,
|
||||
page, limit, keyword, sku, search_field, statuses,
|
||||
**extra_filters
|
||||
)
|
||||
user_permissions = get_current_user_permissions()
|
||||
|
||||
@ -169,14 +169,23 @@ class MaterialBaseService:
|
||||
.outerjoin(MaterialWarningSetting, MaterialBase.id == MaterialWarningSetting.base_id)
|
||||
|
||||
if filters:
|
||||
# 1. 关键词模糊搜索
|
||||
if filters.get('keyword'):
|
||||
kw = f"%{filters['keyword']}%"
|
||||
query = query.filter(or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.common_name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw)
|
||||
))
|
||||
# 1. 关键词精准搜索(支持指定字段)
|
||||
search_field = filters.get('searchField', 'all')
|
||||
keyword = filters.get('keyword')
|
||||
if keyword:
|
||||
kw = f"%{keyword}%"
|
||||
if search_field == 'name':
|
||||
query = query.filter(MaterialBase.name.ilike(kw))
|
||||
elif search_field == 'common_name':
|
||||
query = query.filter(MaterialBase.common_name.ilike(kw))
|
||||
elif search_field == 'spec':
|
||||
query = query.filter(MaterialBase.spec_model.ilike(kw))
|
||||
else: # 'all' 默认全局模糊匹配
|
||||
query = query.filter(or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.common_name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw)
|
||||
))
|
||||
|
||||
# 2. 精确筛选
|
||||
company = filters.get('company')
|
||||
|
||||
@ -240,26 +240,41 @@ class BuyInboundService:
|
||||
# 5. 获取列表 (支持排序和高级筛选)
|
||||
# ============================================================
|
||||
@staticmethod
|
||||
def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None,
|
||||
def get_list(page, limit, keyword=None, sku=None, search_field='all', statuses=None, category=None, material_type=None, company=None,
|
||||
order_by='', is_asc='', advanced_filters=None):
|
||||
try:
|
||||
from sqlalchemy import and_, or_
|
||||
query = db.session.query(StockBuy).outerjoin(MaterialBase, StockBuy.base_id == MaterialBase.id)
|
||||
|
||||
# 1. 通用关键词搜索(名称、规格、公司)
|
||||
# 1. 通用关键词搜索(支持指定字段精准搜索)
|
||||
if keyword:
|
||||
k_str = f'%{keyword.strip()}%'
|
||||
conditions = [
|
||||
StockBuy.barcode.ilike(k_str),
|
||||
StockBuy.batch_number.ilike(k_str),
|
||||
StockBuy.serial_number.ilike(k_str),
|
||||
StockBuy.supplier_name.ilike(k_str),
|
||||
StockBuy.buyer_name.ilike(k_str),
|
||||
MaterialBase.name.ilike(k_str),
|
||||
MaterialBase.spec_model.ilike(k_str),
|
||||
MaterialBase.company_name.ilike(k_str), # 关键词也支持搜公司
|
||||
]
|
||||
query = query.filter(or_(*conditions))
|
||||
if search_field == 'name':
|
||||
query = query.filter(MaterialBase.name.ilike(k_str))
|
||||
elif search_field == 'spec':
|
||||
query = query.filter(MaterialBase.spec_model.ilike(k_str))
|
||||
elif search_field == 'common_name':
|
||||
query = query.filter(MaterialBase.common_name.ilike(k_str))
|
||||
elif search_field == 'barcode':
|
||||
query = query.filter(StockBuy.barcode.ilike(k_str))
|
||||
elif search_field == 'batch_number':
|
||||
query = query.filter(StockBuy.batch_number.ilike(k_str))
|
||||
elif search_field == 'supplier_name':
|
||||
query = query.filter(StockBuy.supplier_name.ilike(k_str))
|
||||
elif search_field == 'buyer_name':
|
||||
query = query.filter(StockBuy.buyer_name.ilike(k_str))
|
||||
else: # 'all' 默认全局模糊匹配
|
||||
conditions = [
|
||||
StockBuy.barcode.ilike(k_str),
|
||||
StockBuy.batch_number.ilike(k_str),
|
||||
StockBuy.serial_number.ilike(k_str),
|
||||
StockBuy.supplier_name.ilike(k_str),
|
||||
StockBuy.buyer_name.ilike(k_str),
|
||||
MaterialBase.name.ilike(k_str),
|
||||
MaterialBase.spec_model.ilike(k_str),
|
||||
MaterialBase.company_name.ilike(k_str),
|
||||
]
|
||||
query = query.filter(or_(*conditions))
|
||||
|
||||
# 1.1 SKU 独立搜索
|
||||
if sku and sku.strip():
|
||||
|
||||
@ -270,22 +270,35 @@ class ProductInboundService:
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None,
|
||||
def get_list(page, limit, keyword=None, sku=None, search_field='all', statuses=None, category=None, material_type=None, company=None,
|
||||
order_by_column=None, is_asc=None, advanced_filters=None):
|
||||
from app.models.inbound.product import StockProduct
|
||||
try:
|
||||
query = db.session.query(StockProduct).outerjoin(MaterialBase, StockProduct.base_id == MaterialBase.id)
|
||||
# 1. 通用关键词搜索(名称、规格、公司)
|
||||
# 1. 通用关键词搜索(支持指定字段精准搜索)
|
||||
if keyword:
|
||||
kw = f'%{keyword}%'
|
||||
query = query.filter(or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw),
|
||||
MaterialBase.company_name.ilike(kw),
|
||||
StockProduct.serial_number.ilike(kw),
|
||||
StockProduct.work_order_code.ilike(kw),
|
||||
StockProduct.order_id.ilike(kw)
|
||||
))
|
||||
if search_field == 'name':
|
||||
query = query.filter(MaterialBase.name.ilike(kw))
|
||||
elif search_field == 'spec':
|
||||
query = query.filter(MaterialBase.spec_model.ilike(kw))
|
||||
elif search_field == 'common_name':
|
||||
query = query.filter(MaterialBase.common_name.ilike(kw))
|
||||
elif search_field == 'serial_number':
|
||||
query = query.filter(StockProduct.serial_number.ilike(kw))
|
||||
elif search_field == 'work_order_code':
|
||||
query = query.filter(StockProduct.work_order_code.ilike(kw))
|
||||
elif search_field == 'order_id':
|
||||
query = query.filter(StockProduct.order_id.ilike(kw))
|
||||
else: # 'all' 默认全局模糊匹配
|
||||
query = query.filter(or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw),
|
||||
MaterialBase.company_name.ilike(kw),
|
||||
StockProduct.serial_number.ilike(kw),
|
||||
StockProduct.work_order_code.ilike(kw),
|
||||
StockProduct.order_id.ilike(kw)
|
||||
))
|
||||
# 1.1 SKU 独立搜索
|
||||
if sku and sku.strip():
|
||||
sku_str = f'%{sku.strip()}%'
|
||||
|
||||
@ -359,25 +359,38 @@ class SemiInboundService:
|
||||
return []
|
||||
|
||||
@staticmethod
|
||||
def get_list(page, limit, keyword=None, sku=None, statuses=None, category=None, material_type=None, company=None,
|
||||
def get_list(page, limit, keyword=None, sku=None, search_field='all', statuses=None, category=None, material_type=None, company=None,
|
||||
order_by_column=None, is_asc=None, advanced_filters=None):
|
||||
from app.models.inbound.semi import StockSemi
|
||||
try:
|
||||
query = db.session.query(StockSemi).outerjoin(MaterialBase, StockSemi.base_id == MaterialBase.id)
|
||||
# 1. 通用关键词搜索(名称、规格、公司)
|
||||
# 1. 通用关键词搜索(支持指定字段精准搜索)
|
||||
if keyword:
|
||||
kw = f'%{keyword}%'
|
||||
query = query.filter(
|
||||
or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw),
|
||||
MaterialBase.company_name.ilike(kw),
|
||||
StockSemi.batch_number.ilike(kw),
|
||||
StockSemi.serial_number.ilike(kw),
|
||||
StockSemi.work_order_code.ilike(kw),
|
||||
StockSemi.bom_code.ilike(kw)
|
||||
if search_field == 'name':
|
||||
query = query.filter(MaterialBase.name.ilike(kw))
|
||||
elif search_field == 'spec':
|
||||
query = query.filter(MaterialBase.spec_model.ilike(kw))
|
||||
elif search_field == 'common_name':
|
||||
query = query.filter(MaterialBase.common_name.ilike(kw))
|
||||
elif search_field == 'batch_number':
|
||||
query = query.filter(StockSemi.batch_number.ilike(kw))
|
||||
elif search_field == 'work_order_code':
|
||||
query = query.filter(StockSemi.work_order_code.ilike(kw))
|
||||
elif search_field == 'bom_code':
|
||||
query = query.filter(StockSemi.bom_code.ilike(kw))
|
||||
else: # 'all' 默认全局模糊匹配
|
||||
query = query.filter(
|
||||
or_(
|
||||
MaterialBase.name.ilike(kw),
|
||||
MaterialBase.spec_model.ilike(kw),
|
||||
MaterialBase.company_name.ilike(kw),
|
||||
StockSemi.batch_number.ilike(kw),
|
||||
StockSemi.serial_number.ilike(kw),
|
||||
StockSemi.work_order_code.ilike(kw),
|
||||
StockSemi.bom_code.ilike(kw)
|
||||
)
|
||||
)
|
||||
)
|
||||
# 1.1 SKU 独立搜索
|
||||
if sku and sku.strip():
|
||||
sku_str = f'%{sku.strip()}%'
|
||||
|
||||
Reference in New Issue
Block a user