feat: implement cross-table search and debounced dynamic search for borrow and return records

This commit is contained in:
DXC
2026-03-20 09:58:42 +08:00
parent 74089c7d7d
commit 990399a408
3 changed files with 104 additions and 12 deletions

View File

@ -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)