From 990399a408cc37278aca785523bfb8a3ecdeac78 Mon Sep 17 00:00:00 2001 From: DXC Date: Fri, 20 Mar 2026 09:58:42 +0800 Subject: [PATCH] feat: implement cross-table search and debounced dynamic search for borrow and return records --- .../app/services/trans_service.py | 32 +++++++++++-- inventory-web/src/views/outbound/index.vue | 38 +++++++++++++-- .../src/views/transaction/records.vue | 46 +++++++++++++++++-- 3 files changed, 104 insertions(+), 12 deletions(-) diff --git a/inventory-backend/app/services/trans_service.py b/inventory-backend/app/services/trans_service.py index af4096a..4fe7144 100644 --- a/inventory-backend/app/services/trans_service.py +++ b/inventory-backend/app/services/trans_service.py @@ -5,7 +5,8 @@ from app.models.transaction import TransBorrow from app.models.inbound.buy import StockBuy from app.models.inbound.semi import StockSemi from app.models.inbound.product import StockProduct -from sqlalchemy import desc, func, nullslast, asc +from app.models.base import MaterialBase +from sqlalchemy import desc, func, nullslast, asc, or_ class TransService: @@ -189,15 +190,36 @@ class TransService: @staticmethod def get_records(page=1, limit=10, status='all', keyword=None): q = TransBorrow.query + + # 如果有关键词,需要联表搜索物料名称和规格型号 + if keyword: + # 子查询:关联 material_base 表获取物料名称和规格型号 + material_join = db.session.query( + TransBorrow.id + ).join( + MaterialBase, + TransBorrow.sku == MaterialBase.sku + ).filter(or_( + MaterialBase.name.ilike(f'%{keyword}%'), + MaterialBase.spec_model.ilike(f'%{keyword}%') + )).subquery() + + # 主搜索条件:借用人、SKU、单号 + 物料名称、规格型号 + keyword_conditions = or_( + TransBorrow.borrower_name.ilike(f'%{keyword}%'), + TransBorrow.sku.ilike(f'%{keyword}%'), + TransBorrow.borrow_no.ilike(f'%{keyword}%'), + TransBorrow.id.in_(material_join) # 匹配物料名称/规格型号的记录 + ) + q = q.filter(keyword_conditions) + if status == 'borrowed': q = q.filter(TransBorrow.is_returned == False) elif status == 'returned': q = q.filter(TransBorrow.is_returned == True) - if keyword: - q = q.filter(TransBorrow.borrower_name.ilike(f'%{keyword}%') | - TransBorrow.sku.ilike(f'%{keyword}%') | - TransBorrow.borrow_no.ilike(f'%{keyword}%')) + # 使用 distinct 防止跨表查询产生重复记录 + q = q.distinct() q = q.order_by(nullslast(asc(TransBorrow.expected_return_time))) pagination = q.paginate(page=page, per_page=limit, error_out=False) diff --git a/inventory-web/src/views/outbound/index.vue b/inventory-web/src/views/outbound/index.vue index 3e3db28..3144366 100644 --- a/inventory-web/src/views/outbound/index.vue +++ b/inventory-web/src/views/outbound/index.vue @@ -4,10 +4,11 @@