fix: 物料修改后级联清除 BOM 树缓存,防止信息不一致
This commit is contained in:
@ -593,6 +593,31 @@ class MaterialBaseService:
|
|||||||
material.is_enabled = str(raw_enabled).lower() in ['1', 'true', 'yes', 't']
|
material.is_enabled = str(raw_enabled).lower() in ['1', 'true', 'yes', 't']
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
|
# ★★★ 级联缓存失效:物料信息变更后,清除所有涉及该物料的 BOM 树缓存
|
||||||
|
try:
|
||||||
|
from app.models.bom import BomTable
|
||||||
|
from app.extensions import redis_client
|
||||||
|
|
||||||
|
# 查出所有以该物料为父件或子件的 bom_no(去重)
|
||||||
|
affected = db.session.query(BomTable.bom_no).filter(
|
||||||
|
or_(BomTable.parent_id == m_id, BomTable.child_id == m_id)
|
||||||
|
).distinct().all()
|
||||||
|
affected_bom_nos = [r[0] for r in affected]
|
||||||
|
|
||||||
|
if affected_bom_nos:
|
||||||
|
for bom_no in affected_bom_nos:
|
||||||
|
# 清除最新版缓存
|
||||||
|
redis_client.delete(f'bom:tree:{bom_no}')
|
||||||
|
# 清除所有版本缓存(通配符)
|
||||||
|
for key in redis_client.scan_iter(f'bom:tree:{bom_no}:*'):
|
||||||
|
redis_client.delete(key)
|
||||||
|
print(f"🔁 物料 {m_id} 变更,已级联清除 {len(affected_bom_nos)} 个 BOM 缓存: {affected_bom_nos}")
|
||||||
|
|
||||||
|
except Exception as cache_err:
|
||||||
|
# Redis 报错不阻断业务返回
|
||||||
|
print(f"⚠️ BOM 缓存级联清除失败(不阻断业务): {cache_err}")
|
||||||
|
|
||||||
return material
|
return material
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user