117 lines
4.1 KiB
Go
117 lines
4.1 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/domain/recipe"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
|
)
|
|
|
|
// 定义营养种类服务特定的错误
|
|
var (
|
|
ErrNutrientNameConflict = errors.New("营养种类名称已存在")
|
|
ErrNutrientNotFound = errors.New("营养种类不存在")
|
|
)
|
|
|
|
// NutrientService 定义了营养种类相关的应用服务接口
|
|
type NutrientService interface {
|
|
CreateNutrient(ctx context.Context, req *dto.CreateNutrientRequest) (*dto.NutrientResponse, error)
|
|
UpdateNutrient(ctx context.Context, id uint32, req *dto.UpdateNutrientRequest) (*dto.NutrientResponse, error)
|
|
DeleteNutrient(ctx context.Context, id uint32) error
|
|
GetNutrient(ctx context.Context, id uint32) (*dto.NutrientResponse, error)
|
|
ListNutrients(ctx context.Context, req *dto.ListNutrientRequest) (*dto.ListNutrientResponse, error)
|
|
}
|
|
|
|
// nutrientServiceImpl 是 NutrientService 接口的实现
|
|
type nutrientServiceImpl struct {
|
|
ctx context.Context
|
|
recipeSvc recipe.Service
|
|
}
|
|
|
|
// NewNutrientService 创建一个新的 NutrientService 实例
|
|
func NewNutrientService(ctx context.Context, recipeSvc recipe.Service) NutrientService {
|
|
return &nutrientServiceImpl{
|
|
ctx: ctx,
|
|
recipeSvc: recipeSvc,
|
|
}
|
|
}
|
|
|
|
// CreateNutrient 创建营养种类
|
|
func (s *nutrientServiceImpl) CreateNutrient(ctx context.Context, req *dto.CreateNutrientRequest) (*dto.NutrientResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreateNutrient")
|
|
|
|
nutrient, err := s.recipeSvc.CreateNutrient(serviceCtx, req.Name, req.Description)
|
|
if err != nil {
|
|
if errors.Is(err, recipe.ErrNutrientNameConflict) {
|
|
return nil, ErrNutrientNameConflict
|
|
}
|
|
return nil, fmt.Errorf("创建营养种类失败: %w", err)
|
|
}
|
|
return dto.ConvertNutrientToDTO(nutrient), nil
|
|
}
|
|
|
|
// UpdateNutrient 更新营养种类
|
|
func (s *nutrientServiceImpl) UpdateNutrient(ctx context.Context, id uint32, req *dto.UpdateNutrientRequest) (*dto.NutrientResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdateNutrient")
|
|
|
|
nutrient, err := s.recipeSvc.UpdateNutrient(serviceCtx, id, req.Name, req.Description)
|
|
if err != nil {
|
|
if errors.Is(err, recipe.ErrNutrientNotFound) {
|
|
return nil, ErrNutrientNotFound
|
|
}
|
|
if errors.Is(err, recipe.ErrNutrientNameConflict) {
|
|
return nil, ErrNutrientNameConflict
|
|
}
|
|
return nil, fmt.Errorf("更新营养种类失败: %w", err)
|
|
}
|
|
return dto.ConvertNutrientToDTO(nutrient), nil
|
|
}
|
|
|
|
// DeleteNutrient 删除营养种类
|
|
func (s *nutrientServiceImpl) DeleteNutrient(ctx context.Context, id uint32) error {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "DeleteNutrient")
|
|
err := s.recipeSvc.DeleteNutrient(serviceCtx, id)
|
|
if err != nil {
|
|
if errors.Is(err, recipe.ErrNutrientNotFound) {
|
|
return ErrNutrientNotFound
|
|
}
|
|
return fmt.Errorf("删除营养种类失败: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetNutrient 获取单个营养种类
|
|
func (s *nutrientServiceImpl) GetNutrient(ctx context.Context, id uint32) (*dto.NutrientResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "GetNutrient")
|
|
|
|
nutrient, err := s.recipeSvc.GetNutrient(serviceCtx, id)
|
|
if err != nil {
|
|
if errors.Is(err, recipe.ErrNutrientNotFound) {
|
|
return nil, ErrNutrientNotFound
|
|
}
|
|
return nil, fmt.Errorf("获取营养种类失败: %w", err)
|
|
}
|
|
return dto.ConvertNutrientToDTO(nutrient), nil
|
|
}
|
|
|
|
// ListNutrients 列出营养种类
|
|
func (s *nutrientServiceImpl) ListNutrients(ctx context.Context, req *dto.ListNutrientRequest) (*dto.ListNutrientResponse, error) {
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "ListNutrients")
|
|
|
|
opts := repository.NutrientListOptions{
|
|
Name: req.Name,
|
|
RawMaterialName: req.RawMaterialName,
|
|
OrderBy: req.OrderBy,
|
|
}
|
|
nutrients, total, err := s.recipeSvc.ListNutrients(serviceCtx, opts, req.Page, req.PageSize)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("获取营养种类列表失败: %w", err)
|
|
}
|
|
|
|
return dto.ConvertNutrientListToDTO(nutrients, total, req.Page, req.PageSize), nil
|
|
}
|