From d119bebe943c95185cc8b49977f2843ab45a5fed Mon Sep 17 00:00:00 2001 From: DXC Date: Thu, 21 May 2026 17:41:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20BOM=E6=90=9C=E7=B4=A2=E5=AD=90=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0+=E8=87=AA=E5=8A=A8=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E9=98=B2=E6=8A=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/services/bom_service.py | 21 ++++++++++++++++--- inventory-web/src/views/bom/BomManage.vue | 11 +++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/inventory-backend/app/services/bom_service.py b/inventory-backend/app/services/bom_service.py index 8b9593c..0047e56 100644 --- a/inventory-backend/app/services/bom_service.py +++ b/inventory-backend/app/services/bom_service.py @@ -140,24 +140,35 @@ class BomService: ) ) + # ★ 调试:打印 SQL 语句 + logger.info(f"[BOM List] keyword={keyword!r} → SQL:\n{str(query_base.statement.compile(compile_kwargs={'literal_binds': True}))}") + # 获取符合条件的唯一组合 target_pairs = query_base.distinct().all() if not target_pairs: return [] - # 2. 聚合查询详情 + # 2. 聚合查询详情(★ 修复:使用 string_agg 聚合子件名称,解决步骤3过滤遗漏问题) results = [] for bom_no, version in target_pairs: + # ★ 使用子件的别名查询子件信息,聚合所有子件的名称和规格 + child_alias = db.aliased(MaterialBase) summary = db.session.query( BomTable.parent_id, MaterialBase.name.label('parent_name'), MaterialBase.spec_model.label('parent_spec'), MaterialBase.category.label('parent_category'), BomTable.is_enabled, - func.count(BomTable.child_id).label('child_count') + func.count(BomTable.child_id).label('child_count'), + # ★ 聚合子件名称为逗号分隔字符串(用于步骤3关键词过滤) + func.string_agg(child_alias.name, ', ').label('child_names'), + # ★ 同时聚合子件规格(备用) + func.string_agg(child_alias.spec_model, ', ').label('child_specs') ).join( MaterialBase, BomTable.parent_id == MaterialBase.id + ).outerjoin( + child_alias, BomTable.child_id == child_alias.id ).filter( BomTable.bom_no == bom_no, BomTable.version == version @@ -174,7 +185,9 @@ class BomService: 'parent_spec': summary.parent_spec or '', 'parent_category': summary.parent_category or '', 'is_enabled': summary.is_enabled, - 'child_count': summary.child_count + 'child_count': summary.child_count, + 'child_names': summary.child_names or '', # ★ 新增:子件名称聚合 + 'child_specs': summary.child_specs or '' # ★ 新增:子件规格聚合 }) results.sort(key=lambda x: (x['bom_no'], x['version']), reverse=True) @@ -188,6 +201,8 @@ class BomService: or kw in (r.get('parent_spec') or '').lower() or kw in (r.get('bom_no') or '').lower() or kw in (r.get('parent_category') or '').lower() + or kw in (r.get('child_names') or '').lower() # ★ 修复:加入子件名称过滤 + or kw in (r.get('child_specs') or '').lower() # ★ 同步加入子件规格过滤 ] # 按 parent_category 分组 diff --git a/inventory-web/src/views/bom/BomManage.vue b/inventory-web/src/views/bom/BomManage.vue index 59448c6..963b729 100644 --- a/inventory-web/src/views/bom/BomManage.vue +++ b/inventory-web/src/views/bom/BomManage.vue @@ -240,7 +240,7 @@