diff --git a/inventory-backend/app/services/inbound/base_service.py b/inventory-backend/app/services/inbound/base_service.py index 7ffe345..a1f9fc6 100644 --- a/inventory-backend/app/services/inbound/base_service.py +++ b/inventory-backend/app/services/inbound/base_service.py @@ -593,6 +593,31 @@ class MaterialBaseService: material.is_enabled = str(raw_enabled).lower() in ['1', 'true', 'yes', 't'] 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 except Exception as e: