From 808e491fe8b8f3930ba79e34b317be51031d89b2 Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 4 Sep 2026 15:57:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20BOM=20=E5=8C=B9=E9=85=8D=E5=BA=93?= =?UTF-8?q?=E5=AD=98(bom=5Fmatch=5Fstock)=E5=8A=A0=E8=A1=8C=E7=BA=A7?= =?UTF-8?q?=E5=85=AC=E5=8F=B8=E9=9A=94=E7=A6=BB=EF=BC=88=E4=B8=89=E8=A1=A8?= =?UTF-8?q?=E6=8C=89=20base=20=E5=85=AC=E5=8F=B8=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=EF=BC=8C=E8=B6=85=E7=AE=A1/=E8=B7=A8=E5=9F=9F=E4=B8=8D?= =?UTF-8?q?=E5=8F=97=E9=99=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/api/v1/outbound.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/inventory-backend/app/api/v1/outbound.py b/inventory-backend/app/api/v1/outbound.py index 36b07a5..6f9ccb0 100644 --- a/inventory-backend/app/api/v1/outbound.py +++ b/inventory-backend/app/api/v1/outbound.py @@ -215,6 +215,11 @@ def bom_match_stock(): # 去重 child_ids = list(set(int(x) for x in child_ids)) + # ★ 行级公司隔离:普通用户只能匹配本公司的库存(超管/跨域不受限) + from app.utils.decorators import get_current_company_filter + from app.models.base import MaterialBase + company_limit = get_current_company_filter() + from app.models.inbound.buy import StockBuy from app.models.inbound.semi import StockSemi from app.models.inbound.product import StockProduct @@ -226,7 +231,10 @@ def bom_match_stock(): buy_items = StockBuy.query.filter( StockBuy.base_id.in_(child_ids), StockBuy.stock_quantity > 0 - ).options(joinedload(StockBuy.base)).all() + ) + if company_limit is not None: + buy_items = buy_items.filter(StockBuy.base.has(MaterialBase.company_name == company_limit)) + buy_items = buy_items.options(joinedload(StockBuy.base)).all() for s in buy_items: d = s.to_dict() d['type'] = 'material' @@ -242,7 +250,10 @@ def bom_match_stock(): semi_items = StockSemi.query.filter( StockSemi.base_id.in_(child_ids), StockSemi.stock_quantity > 0 - ).options(joinedload(StockSemi.base)).all() + ) + if company_limit is not None: + semi_items = semi_items.filter(StockSemi.base.has(MaterialBase.company_name == company_limit)) + semi_items = semi_items.options(joinedload(StockSemi.base)).all() for s in semi_items: d = s.to_dict() d['type'] = 'semi' @@ -260,7 +271,10 @@ def bom_match_stock(): prod_items = StockProduct.query.filter( StockProduct.base_id.in_(child_ids), StockProduct.stock_quantity > 0 - ).options(joinedload(StockProduct.base)).all() + ) + if company_limit is not None: + prod_items = prod_items.filter(StockProduct.base.has(MaterialBase.company_name == company_limit)) + prod_items = prod_items.options(joinedload(StockProduct.base)).all() for s in prod_items: d = s.to_dict() d['type'] = 'product'