From dca6cc5dd44cac0bc558aae31abf4d830aeff864 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Thu, 27 Nov 2025 00:39:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E6=96=99=E5=A2=9E=E5=8A=A0=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=B7=BB=E5=8A=A0=E9=87=8F=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/app/dto/feed_dto.go | 15 +++++++++------ internal/domain/recipe/raw_material_service.go | 18 +++++++++++------- .../repository/raw_material_repository.go | 7 ++++--- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/internal/app/dto/feed_dto.go b/internal/app/dto/feed_dto.go index fd8b8a1..ef1a777 100644 --- a/internal/app/dto/feed_dto.go +++ b/internal/app/dto/feed_dto.go @@ -52,16 +52,18 @@ type ListNutrientResponse struct { // CreateRawMaterialRequest 创建原料的请求体 type CreateRawMaterialRequest struct { - Name string `json:"name" validate:"required,max=100"` // 原料名称 - Description string `json:"description" validate:"max=255"` // 描述 - ReferencePrice float32 `json:"reference_price"` // 参考价格(kg/元) + Name string `json:"name" validate:"required,max=100"` // 原料名称 + Description string `json:"description" validate:"max=255"` // 描述 + ReferencePrice float32 `json:"reference_price"` // 参考价格(kg/元) + MaxAdditionRatio float32 `json:"max_addition_ratio"` // 最大添加比例 } // UpdateRawMaterialRequest 更新原料的请求体 type UpdateRawMaterialRequest struct { - Name string `json:"name" validate:"required,max=100"` // 原料名称 - Description string `json:"description" validate:"max=255"` // 描述 - ReferencePrice float32 `json:"reference_price"` // 参考价格(kg/元) + Name string `json:"name" validate:"required,max=100"` // 原料名称 + Description string `json:"description" validate:"max=255"` // 描述 + ReferencePrice float32 `json:"reference_price"` // 参考价格(kg/元) + MaxAdditionRatio *float32 `json:"max_addition_ratio"` // 最大添加比例 } // RawMaterialNutrientDTO 原料营养素响应体 @@ -78,6 +80,7 @@ type RawMaterialResponse struct { Name string `json:"name"` Description string `json:"description"` ReferencePrice float32 `json:"reference_price"` // 参考价格(kg/元) + MaxAdditionRatio float32 `json:"max_addition_ratio"` // 最大添加比例 RawMaterialNutrients []RawMaterialNutrientDTO `json:"raw_material_nutrients"` // 关联的营养素信息 } diff --git a/internal/domain/recipe/raw_material_service.go b/internal/domain/recipe/raw_material_service.go index 0dd5916..a16a967 100644 --- a/internal/domain/recipe/raw_material_service.go +++ b/internal/domain/recipe/raw_material_service.go @@ -29,8 +29,8 @@ var ( // RawMaterialService 定义了原料领域的核心业务服务接口 type RawMaterialService interface { - CreateRawMaterial(ctx context.Context, name, description string, referencePrice float32) (*models.RawMaterial, error) - UpdateRawMaterial(ctx context.Context, id uint32, name, description string, referencePrice float32) (*models.RawMaterial, error) + CreateRawMaterial(ctx context.Context, name, description string, referencePrice, maxAdditionRatio float32) (*models.RawMaterial, error) + UpdateRawMaterial(ctx context.Context, id uint32, name, description string, referencePrice float32, maxAdditionRatio *float32) (*models.RawMaterial, error) DeleteRawMaterial(ctx context.Context, id uint32) error GetRawMaterial(ctx context.Context, id uint32) (*models.RawMaterial, error) ListRawMaterials(ctx context.Context, opts repository.RawMaterialListOptions, page, pageSize int) ([]models.RawMaterial, int64, error) @@ -56,7 +56,7 @@ func NewRawMaterialService(ctx context.Context, uow repository.UnitOfWork, rawMa } // CreateRawMaterial 实现了创建原料的核心业务逻辑 -func (s *rawMaterialServiceImpl) CreateRawMaterial(ctx context.Context, name, description string, referencePrice float32) (*models.RawMaterial, error) { +func (s *rawMaterialServiceImpl) CreateRawMaterial(ctx context.Context, name, description string, referencePrice, maxAdditionRatio float32) (*models.RawMaterial, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreateRawMaterial") // 检查名称是否已存在 @@ -69,9 +69,10 @@ func (s *rawMaterialServiceImpl) CreateRawMaterial(ctx context.Context, name, de } rawMaterial := &models.RawMaterial{ - Name: name, - Description: description, - ReferencePrice: referencePrice, + Name: name, + Description: description, + ReferencePrice: referencePrice, + MaxAdditionRatio: maxAdditionRatio, } if err := s.rawMaterialRepo.CreateRawMaterial(serviceCtx, rawMaterial); err != nil { @@ -82,7 +83,7 @@ func (s *rawMaterialServiceImpl) CreateRawMaterial(ctx context.Context, name, de } // UpdateRawMaterial 实现了更新原料的核心业务逻辑 -func (s *rawMaterialServiceImpl) UpdateRawMaterial(ctx context.Context, id uint32, name, description string, referencePrice float32) (*models.RawMaterial, error) { +func (s *rawMaterialServiceImpl) UpdateRawMaterial(ctx context.Context, id uint32, name, description string, referencePrice float32, maxAdditionRatio *float32) (*models.RawMaterial, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdateRawMaterial") // 检查要更新的实体是否存在 @@ -108,6 +109,9 @@ func (s *rawMaterialServiceImpl) UpdateRawMaterial(ctx context.Context, id uint3 rawMaterial.Name = name rawMaterial.Description = description rawMaterial.ReferencePrice = referencePrice + if maxAdditionRatio != nil { + rawMaterial.MaxAdditionRatio = *maxAdditionRatio + } if err := s.rawMaterialRepo.UpdateRawMaterial(serviceCtx, rawMaterial); err != nil { return nil, fmt.Errorf("更新原料失败: %w", err) diff --git a/internal/infra/repository/raw_material_repository.go b/internal/infra/repository/raw_material_repository.go index 8490fd6..3e63cbc 100644 --- a/internal/infra/repository/raw_material_repository.go +++ b/internal/infra/repository/raw_material_repository.go @@ -144,9 +144,10 @@ func (r *gormRawMaterialRepository) UpdateRawMaterial(ctx context.Context, rawMa repoCtx := logs.AddFuncName(ctx, r.ctx, "UpdateRawMaterial") // 使用 map 更新以避免 GORM 的零值问题,并确保只更新指定字段 updateData := map[string]interface{}{ - "name": rawMaterial.Name, - "description": rawMaterial.Description, - "reference_price": rawMaterial.ReferencePrice, + "name": rawMaterial.Name, + "description": rawMaterial.Description, + "reference_price": rawMaterial.ReferencePrice, + "max_addition_ratio": rawMaterial.MaxAdditionRatio, } result := r.db.WithContext(repoCtx).Model(&models.RawMaterial{}).Where("id = ?", rawMaterial.ID).Updates(updateData) if result.Error != nil {