From 6c0f655d0a6afd06e177215ff2927273ce01b46a Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Wed, 26 Nov 2025 21:14:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A0=E9=99=A4=E5=8E=9F?= =?UTF-8?q?=E6=96=99=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/domain/recipe/raw_material_service.go | 16 +++++++++++++--- .../infra/repository/raw_material_repository.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/internal/domain/recipe/raw_material_service.go b/internal/domain/recipe/raw_material_service.go index a06e529..0dd5916 100644 --- a/internal/domain/recipe/raw_material_service.go +++ b/internal/domain/recipe/raw_material_service.go @@ -21,9 +21,10 @@ type StockQuerier interface { // 定义领域特定的错误 var ( - ErrRawMaterialNameConflict = fmt.Errorf("原料名称已存在") - ErrRawMaterialNotFound = fmt.Errorf("原料不存在") - ErrStockNotEmpty = fmt.Errorf("原料尚有库存,无法删除") + ErrRawMaterialNameConflict = fmt.Errorf("原料名称已存在") + ErrRawMaterialNotFound = fmt.Errorf("原料不存在") + ErrStockNotEmpty = fmt.Errorf("原料尚有库存,无法删除") + ErrRawMaterialInUseByRecipe = fmt.Errorf("原料已被配方使用,无法删除") ) // RawMaterialService 定义了原料领域的核心业务服务接口 @@ -138,6 +139,15 @@ func (s *rawMaterialServiceImpl) DeleteRawMaterial(ctx context.Context, id uint3 return ErrStockNotEmpty } + // 检查原料是否被配方使用 + isUsed, err := s.rawMaterialRepo.IsRawMaterialUsedInRecipes(serviceCtx, id) + if err != nil { + return fmt.Errorf("检查原料是否被配方使用失败: %w", err) + } + if isUsed { + return ErrRawMaterialInUseByRecipe + } + if err := s.rawMaterialRepo.DeleteRawMaterial(serviceCtx, id); err != nil { return fmt.Errorf("删除原料失败: %w", err) } diff --git a/internal/infra/repository/raw_material_repository.go b/internal/infra/repository/raw_material_repository.go index a1f9e2c..8490fd6 100644 --- a/internal/infra/repository/raw_material_repository.go +++ b/internal/infra/repository/raw_material_repository.go @@ -41,6 +41,7 @@ type RawMaterialRepository interface { DeleteRawMaterial(ctx context.Context, id uint32) error DeleteNutrientsByRawMaterialIDTx(ctx context.Context, db *gorm.DB, rawMaterialID uint32) error CreateBatchRawMaterialNutrientsTx(ctx context.Context, db *gorm.DB, nutrients []models.RawMaterialNutrient) error + IsRawMaterialUsedInRecipes(ctx context.Context, rawMaterialID uint32) (bool, error) // 库存日志相关方法 CreateRawMaterialStockLog(ctx context.Context, log *models.RawMaterialStockLog) error @@ -329,3 +330,16 @@ func (r *gormRawMaterialRepository) ListStockLogs(ctx context.Context, opts Stoc return logs, total, nil } + +// IsRawMaterialUsedInRecipes 检查原料是否被任何配方使用 +func (r *gormRawMaterialRepository) IsRawMaterialUsedInRecipes(ctx context.Context, rawMaterialID uint32) (bool, error) { + repoCtx := logs.AddFuncName(ctx, r.ctx, "IsRawMaterialUsedInRecipes") + var count int64 + err := r.db.WithContext(repoCtx).Model(&models.RecipeIngredient{}). + Where("raw_material_id = ?", rawMaterialID). + Count(&count).Error + if err != nil { + return false, fmt.Errorf("查询原料是否被配方使用失败: %w", err) + } + return count > 0, nil +}