原料删除校验

This commit is contained in:
2025-11-25 18:54:11 +08:00
parent 44ff3b19d6
commit c66671bf5f

View File

@@ -12,10 +12,18 @@ import (
"gorm.io/gorm" "gorm.io/gorm"
) )
// StockQuerier 定义了从外部领域查询库存的接口。
// 这样,配方领域就不需要知道库存是如何存储或计算的。
type StockQuerier interface {
// GetCurrentStock 根据原料ID获取当前库存量。
GetCurrentStock(ctx context.Context, rawMaterialID uint32) (float32, error)
}
// 定义领域特定的错误 // 定义领域特定的错误
var ( var (
ErrRawMaterialNameConflict = fmt.Errorf("原料名称已存在") ErrRawMaterialNameConflict = fmt.Errorf("原料名称已存在")
ErrRawMaterialNotFound = fmt.Errorf("原料不存在") ErrRawMaterialNotFound = fmt.Errorf("原料不存在")
ErrStockNotEmpty = fmt.Errorf("原料尚有库存,无法删除")
) )
// RawMaterialService 定义了原料领域的核心业务服务接口 // RawMaterialService 定义了原料领域的核心业务服务接口
@@ -33,14 +41,16 @@ type rawMaterialServiceImpl struct {
ctx context.Context ctx context.Context
uow repository.UnitOfWork uow repository.UnitOfWork
rawMaterialRepo repository.RawMaterialRepository rawMaterialRepo repository.RawMaterialRepository
stockQuerier StockQuerier
} }
// NewRawMaterialService 创建一个新的 RawMaterialService 实例 // NewRawMaterialService 创建一个新的 RawMaterialService 实例
func NewRawMaterialService(ctx context.Context, uow repository.UnitOfWork, rawMaterialRepo repository.RawMaterialRepository) RawMaterialService { func NewRawMaterialService(ctx context.Context, uow repository.UnitOfWork, rawMaterialRepo repository.RawMaterialRepository, stockQuerier StockQuerier) RawMaterialService {
return &rawMaterialServiceImpl{ return &rawMaterialServiceImpl{
ctx: ctx, ctx: ctx,
uow: uow, uow: uow,
rawMaterialRepo: rawMaterialRepo, rawMaterialRepo: rawMaterialRepo,
stockQuerier: stockQuerier,
} }
} }
@@ -116,6 +126,16 @@ func (s *rawMaterialServiceImpl) DeleteRawMaterial(ctx context.Context, id uint3
return fmt.Errorf("获取待删除的原料失败: %w", err) return fmt.Errorf("获取待删除的原料失败: %w", err)
} }
// 检查原料是否有库存
stock, err := s.stockQuerier.GetCurrentStock(serviceCtx, id)
if err != nil {
return fmt.Errorf("检查原料库存失败: %w", err)
}
if stock > 0 {
// 如果库存大于0返回业务错误阻止删除
return ErrStockNotEmpty
}
if err := s.rawMaterialRepo.DeleteRawMaterial(serviceCtx, id); err != nil { if err := s.rawMaterialRepo.DeleteRawMaterial(serviceCtx, id); err != nil {
return fmt.Errorf("删除原料失败: %w", err) return fmt.Errorf("删除原料失败: %w", err)
} }