fix(bom): get_bom_summary 关键词与 list 对齐 + 状态更新方法健壮化
- get_bom_summary 关键词过滤改为与 get_bom_list 同款子查询(同时匹配 bom_no、父件名/规格、子件名/规格),任意关键词下 summary 计数与 list 明细严格一致,消除“标题有数、表格为空” - update_enabled/update_archived 对 bom_no/version 做 strip 规范化,并细化“BOM不存在”报错(带上实际参数便于排查)
This commit is contained in:
@ -267,14 +267,35 @@ class BomService:
|
|||||||
elif status == 'archived':
|
elif status == 'archived':
|
||||||
query = query.filter(BomTable.is_archived == True)
|
query = query.filter(BomTable.is_archived == True)
|
||||||
|
|
||||||
# 关键词搜索
|
# 关键词搜索:与 get_bom_list 保持同一口径——子查询匹配 (bom_no, version),
|
||||||
|
# 同时覆盖 bom_no、父件名/规格、子件名/规格,保证任意关键字下 summary 计数与 list 明细绝对一致
|
||||||
if keyword:
|
if keyword:
|
||||||
kw = f'%{keyword.strip()}%'
|
kw = f'%{keyword.strip()}%'
|
||||||
query = query.filter(or_(
|
kw_child_alias = db.aliased(MaterialBase)
|
||||||
BomTable.bom_no.ilike(kw),
|
match_subq = db.session.query(
|
||||||
MaterialBase.name.ilike(kw),
|
BomTable.bom_no,
|
||||||
MaterialBase.spec_model.ilike(kw)
|
BomTable.version
|
||||||
))
|
).join(
|
||||||
|
MaterialBase, BomTable.parent_id == MaterialBase.id
|
||||||
|
).outerjoin(
|
||||||
|
kw_child_alias, BomTable.child_id == kw_child_alias.id
|
||||||
|
).filter(
|
||||||
|
or_(
|
||||||
|
BomTable.bom_no.ilike(kw),
|
||||||
|
MaterialBase.name.ilike(kw),
|
||||||
|
MaterialBase.spec_model.ilike(kw),
|
||||||
|
kw_child_alias.name.ilike(kw),
|
||||||
|
kw_child_alias.spec_model.ilike(kw)
|
||||||
|
)
|
||||||
|
).distinct().subquery()
|
||||||
|
|
||||||
|
query = query.join(
|
||||||
|
match_subq,
|
||||||
|
db.and_(
|
||||||
|
BomTable.bom_no == match_subq.c.bom_no,
|
||||||
|
BomTable.version == match_subq.c.version
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
query = query.group_by(MaterialBase.category) \
|
query = query.group_by(MaterialBase.category) \
|
||||||
.order_by(MaterialBase.category)
|
.order_by(MaterialBase.category)
|
||||||
@ -525,10 +546,16 @@ class BomService:
|
|||||||
"""
|
"""
|
||||||
仅更新某 BOM 版本(整组行)的启用状态,供列表/只读视图"启用/停用"开关使用。
|
仅更新某 BOM 版本(整组行)的启用状态,供列表/只读视图"启用/停用"开关使用。
|
||||||
不触碰子件结构;成功后清除该 bom_no 的缓存。
|
不触碰子件结构;成功后清除该 bom_no 的缓存。
|
||||||
|
注意:只按 bom_no+version 精确匹配,不加 is_enabled/is_archived 等多余过滤——
|
||||||
|
停用/归档中的版本只要记录存在即可继续改状态。
|
||||||
"""
|
"""
|
||||||
|
bom_no = (bom_no or '').strip()
|
||||||
|
version = (version or '').strip()
|
||||||
|
if not bom_no or not version:
|
||||||
|
raise ValueError('BOM编号/版本不能为空')
|
||||||
rows = BomTable.query.filter_by(bom_no=bom_no, version=version).all()
|
rows = BomTable.query.filter_by(bom_no=bom_no, version=version).all()
|
||||||
if not rows:
|
if not rows:
|
||||||
raise ValueError('BOM 不存在')
|
raise ValueError(f'BOM不存在(bom_no={bom_no}, version={version})')
|
||||||
for rec in rows:
|
for rec in rows:
|
||||||
rec.is_enabled = bool(is_enabled)
|
rec.is_enabled = bool(is_enabled)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
@ -542,9 +569,13 @@ class BomService:
|
|||||||
仅更新某 BOM 版本(整组行)的归档标记。
|
仅更新某 BOM 版本(整组行)的归档标记。
|
||||||
归档=仍启用可查看/编辑,但不再作为其它 BOM 子件的引用候选;取消归档即恢复正常引用。
|
归档=仍启用可查看/编辑,但不再作为其它 BOM 子件的引用候选;取消归档即恢复正常引用。
|
||||||
"""
|
"""
|
||||||
|
bom_no = (bom_no or '').strip()
|
||||||
|
version = (version or '').strip()
|
||||||
|
if not bom_no or not version:
|
||||||
|
raise ValueError('BOM编号/版本不能为空')
|
||||||
rows = BomTable.query.filter_by(bom_no=bom_no, version=version).all()
|
rows = BomTable.query.filter_by(bom_no=bom_no, version=version).all()
|
||||||
if not rows:
|
if not rows:
|
||||||
raise ValueError('BOM 不存在')
|
raise ValueError(f'BOM不存在(bom_no={bom_no}, version={version})')
|
||||||
for rec in rows:
|
for rec in rows:
|
||||||
rec.is_archived = bool(archived)
|
rec.is_archived = bool(archived)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|||||||
Reference in New Issue
Block a user