From 75705d31c92f8e9977e739e8918fd5e362318829 Mon Sep 17 00:00:00 2001 From: DXC Date: Tue, 19 May 2026 11:40:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=89=A9=E6=96=99=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E7=BA=A7=E8=81=94=E6=B8=85=E9=99=A4=20BOM=20=E6=A0=91?= =?UTF-8?q?=E7=BC=93=E5=AD=98=EF=BC=8C=E9=98=B2=E6=AD=A2=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/services/inbound/base_service.py | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) 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: