From 17a61b489c1e06a4e2cd4e48b36c17370952dbcd Mon Sep 17 00:00:00 2001 From: dxc Date: Tue, 10 Feb 2026 13:50:26 +0800 Subject: [PATCH] fix: prevent inbound of disabled materials --- .../app/services/inbound/buy_service.py | 6 ++++++ .../app/services/inbound/product_service.py | 6 +++++- .../app/services/inbound/semi_service.py | 6 +++++- .../app/services/inbound/service_service.py | 19 ++++++++++++++----- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/inventory-backend/app/services/inbound/buy_service.py b/inventory-backend/app/services/inbound/buy_service.py index 0ea65fa..95fd5fb 100644 --- a/inventory-backend/app/services/inbound/buy_service.py +++ b/inventory-backend/app/services/inbound/buy_service.py @@ -60,7 +60,9 @@ class BuyInboundService: @staticmethod def search_base_material(keyword): try: + # [核心修改] 只查询已启用的物料,防止选择已禁用的历史物料 query = MaterialBase.query.filter(MaterialBase.is_enabled == True) + if keyword: query = query.filter( or_( @@ -100,6 +102,10 @@ class BuyInboundService: if not material: raise ValueError("所选物料不存在") + # [核心修改] 后端二次校验:如果物料已停用,禁止入库 + if not material.is_enabled: + raise ValueError(f"物料【{material.name}】已停用,无法办理新入库。") + # --- [修复点] 执行唯一性校验 --- BuyInboundService._check_unique( base_id=base_id, diff --git a/inventory-backend/app/services/inbound/product_service.py b/inventory-backend/app/services/inbound/product_service.py index 54b4e76..cd76cb6 100644 --- a/inventory-backend/app/services/inbound/product_service.py +++ b/inventory-backend/app/services/inbound/product_service.py @@ -40,7 +40,7 @@ class ProductInboundService: @staticmethod def search_base_material(keyword): try: - # 1. 基础查询:必须是已启用的物料 + # [核心修改] 只查询已启用的物料 query = MaterialBase.query.filter(MaterialBase.is_enabled == True) # 2. 动态条件:如果传入了关键词,则增加模糊匹配条件 @@ -85,6 +85,10 @@ class ProductInboundService: material = MaterialBase.query.get(base_id) if not material: raise ValueError("物料不存在") + # [核心修改] 后端二次校验:如果物料已停用,禁止入库 + if not material.is_enabled: + raise ValueError(f"物料【{material.name}】已停用,无法办理新入库。") + # --- [核心修改] 执行唯一性校验 --- ProductInboundService._check_unique( serial_number=data.get('serial_number') diff --git a/inventory-backend/app/services/inbound/semi_service.py b/inventory-backend/app/services/inbound/semi_service.py index 00e2fdb..ee7ecc3 100644 --- a/inventory-backend/app/services/inbound/semi_service.py +++ b/inventory-backend/app/services/inbound/semi_service.py @@ -54,7 +54,7 @@ class SemiInboundService: @staticmethod def search_base_material(keyword): try: - # 基础查询:必须是已启用的物料 + # [核心修改] 只查询已启用的物料 query = MaterialBase.query.filter(MaterialBase.is_enabled == True) # 如果有关键词,进行模糊匹配 @@ -101,6 +101,10 @@ class SemiInboundService: if not material: raise ValueError(f"ID为 {base_id} 的基础物料不存在") + # [核心修改] 后端二次校验:如果物料已停用,禁止入库 + if not material.is_enabled: + raise ValueError(f"物料【{material.name}】已停用,无法办理新入库。") + # --- [核心修改] 执行唯一性校验 --- SemiInboundService._check_unique( base_id=base_id, diff --git a/inventory-backend/app/services/inbound/service_service.py b/inventory-backend/app/services/inbound/service_service.py index b97250d..1fa97e6 100644 --- a/inventory-backend/app/services/inbound/service_service.py +++ b/inventory-backend/app/services/inbound/service_service.py @@ -1,3 +1,4 @@ +# app/services/inbound/service_service.py from app import db from app.models.inbound.service import StockService from app.models.base import MaterialBase @@ -37,7 +38,9 @@ class ServiceService: def search_base_material(cls, keyword): """搜索基础物料,供前端远程选择""" try: + # [核心修改] 只查询已启用的物料 query = MaterialBase.query.filter(MaterialBase.is_enabled == True) + if keyword: query = query.filter( db.or_( @@ -66,9 +69,15 @@ class ServiceService: def create_service(cls, data): """创建服务权益记录""" # 检查基础物料是否存在 - base = MaterialBase.query.get(data.get('base_id')) + base_id = data.get('base_id') + base = MaterialBase.query.get(base_id) if not base: raise ValueError('基础物料不存在') + + # [核心修改] 后端二次校验:如果物料已停用,禁止创建服务权益 + if not base.is_enabled: + raise ValueError(f"物料【{base.name}】已停用,无法创建新的服务权益。") + # 生成SKU sku = cls._generate_sku() service = StockService( @@ -144,12 +153,12 @@ class ServiceService: # 总数 total = query.count() # 分页 - items = query.order_by(StockService.created_at.desc())\ - .offset((page - 1) * per_page)\ - .limit(per_page).all() + items = query.order_by(StockService.created_at.desc()) \ + .offset((page - 1) * per_page) \ + .limit(per_page).all() return { 'items': [item.to_dict() for item in items], 'total': total, 'page': page, 'per_page': per_page - } + } \ No newline at end of file