feat(bom): BOM列表按物料类别分组展示,支持折叠展开与数量统计

This commit is contained in:
DXC
2026-05-12 15:27:47 +08:00
parent f3c4dc8d39
commit 1edd471208
2 changed files with 80 additions and 31 deletions

View File

@ -3,6 +3,7 @@ from app.models.bom import BomTable
from app.models.base import MaterialBase
from app.models.inbound.buy import StockBuy
from sqlalchemy import func, distinct, or_, case
from collections import defaultdict
import uuid
from datetime import datetime
@ -64,6 +65,7 @@ class BomService:
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')
).join(
@ -72,7 +74,7 @@ class BomService:
BomTable.bom_no == bom_no,
BomTable.version == version
).group_by(
BomTable.parent_id, MaterialBase.name, MaterialBase.spec_model, BomTable.is_enabled
BomTable.parent_id, MaterialBase.name, MaterialBase.spec_model, MaterialBase.category, BomTable.is_enabled
).first()
if summary:
@ -82,12 +84,39 @@ class BomService:
'parent_id': summary.parent_id,
'parent_name': summary.parent_name,
'parent_spec': summary.parent_spec or '',
'parent_category': summary.parent_category or '',
'is_enabled': summary.is_enabled,
'child_count': summary.child_count
})
results.sort(key=lambda x: (x['bom_no'], x['version']), reverse=True)
return results
# 如果有关键词过滤结果keyword 匹配逻辑保持不变)
if keyword:
kw = f'%{keyword}%'
results = [
r for r in results
if kw in (r.get('parent_name') or '')
or kw in (r.get('parent_spec') or '')
or kw in (r.get('bom_no') or '')
or kw in (r.get('parent_category') or '')
]
# 按 parent_category 分组
grouped = defaultdict(list)
for item in results:
cat = item.get('parent_category') or '未分类'
grouped[cat].append(item)
grouped_list = []
for cat, items in sorted(grouped.items(), key=lambda x: x[0]):
grouped_list.append({
'category': cat,
'count': len(items),
'items': items
})
return grouped_list
@staticmethod
def get_bom_detail(bom_no, version=None):