113 lines
4.0 KiB
Go
113 lines
4.0 KiB
Go
|
|
package recipe
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"errors"
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|||
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
|||
|
|
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 定义领域特定的错误
|
|||
|
|
var (
|
|||
|
|
ErrPigBreedInUse = fmt.Errorf("猪品种正在被猪类型使用,无法删除")
|
|||
|
|
ErrPigBreedNotFound = fmt.Errorf("猪品种不存在")
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// PigBreedService 定义了猪品种领域的核心业务服务接口
|
|||
|
|
type PigBreedService interface {
|
|||
|
|
CreatePigBreed(ctx context.Context, breed *models.PigBreed) error
|
|||
|
|
GetPigBreedByID(ctx context.Context, id uint32) (*models.PigBreed, error)
|
|||
|
|
UpdatePigBreed(ctx context.Context, breed *models.PigBreed) error
|
|||
|
|
DeletePigBreed(ctx context.Context, id uint32) error
|
|||
|
|
ListPigBreeds(ctx context.Context, opts repository.PigBreedListOptions, page, pageSize int) ([]models.PigBreed, int64, error)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// pigBreedServiceImpl 是 PigBreedService 的实现
|
|||
|
|
type pigBreedServiceImpl struct {
|
|||
|
|
ctx context.Context
|
|||
|
|
pigTypeRepo repository.PigTypeRepository // PigBreed 相关的操作目前在 PigTypeRepository 中
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewPigBreedService 创建一个新的 PigBreedService 实例
|
|||
|
|
func NewPigBreedService(ctx context.Context, pigTypeRepo repository.PigTypeRepository) PigBreedService {
|
|||
|
|
return &pigBreedServiceImpl{
|
|||
|
|
ctx: ctx,
|
|||
|
|
pigTypeRepo: pigTypeRepo,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// CreatePigBreed 实现了创建猪品种的核心业务逻辑
|
|||
|
|
func (s *pigBreedServiceImpl) CreatePigBreed(ctx context.Context, breed *models.PigBreed) error {
|
|||
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreatePigBreed")
|
|||
|
|
if err := s.pigTypeRepo.CreatePigBreed(serviceCtx, breed); err != nil {
|
|||
|
|
return fmt.Errorf("创建猪品种失败: %w", err)
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetPigBreedByID 实现了获取单个猪品种的逻辑
|
|||
|
|
func (s *pigBreedServiceImpl) GetPigBreedByID(ctx context.Context, id uint32) (*models.PigBreed, error) {
|
|||
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "GetPigBreedByID")
|
|||
|
|
breed, err := s.pigTypeRepo.GetPigBreedByID(serviceCtx, id)
|
|||
|
|
if err != nil {
|
|||
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|||
|
|
return nil, ErrPigBreedNotFound
|
|||
|
|
}
|
|||
|
|
return nil, fmt.Errorf("获取猪品种失败: %w", err)
|
|||
|
|
}
|
|||
|
|
return breed, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UpdatePigBreed 实现了更新猪品种的核心业务逻辑
|
|||
|
|
func (s *pigBreedServiceImpl) UpdatePigBreed(ctx context.Context, breed *models.PigBreed) error {
|
|||
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdatePigBreed")
|
|||
|
|
if err := s.pigTypeRepo.UpdatePigBreed(serviceCtx, breed); err != nil {
|
|||
|
|
return fmt.Errorf("更新猪品种失败: %w", err)
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeletePigBreed 实现了删除猪品种的核心业务逻辑
|
|||
|
|
func (s *pigBreedServiceImpl) DeletePigBreed(ctx context.Context, id uint32) error {
|
|||
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "DeletePigBreed")
|
|||
|
|
|
|||
|
|
// 检查是否有猪类型关联到该品种
|
|||
|
|
opts := repository.PigTypeListOptions{BreedID: &id}
|
|||
|
|
pigTypes, _, err := s.pigTypeRepo.ListPigTypes(serviceCtx, opts, 1, 1) // 只需检查是否存在,所以取1条
|
|||
|
|
if err != nil {
|
|||
|
|
return fmt.Errorf("检查猪品种关联失败: %w", err)
|
|||
|
|
}
|
|||
|
|
if len(pigTypes) > 0 {
|
|||
|
|
return ErrPigBreedInUse
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查实体是否存在
|
|||
|
|
_, err = s.pigTypeRepo.GetPigBreedByID(serviceCtx, id)
|
|||
|
|
if err != nil {
|
|||
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|||
|
|
return ErrPigBreedNotFound
|
|||
|
|
}
|
|||
|
|
return fmt.Errorf("获取待删除的猪品种失败: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if err := s.pigTypeRepo.DeletePigBreed(serviceCtx, id); err != nil {
|
|||
|
|
return fmt.Errorf("删除猪品种失败: %w", err)
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ListPigBreeds 实现了列出猪品种的逻辑
|
|||
|
|
func (s *pigBreedServiceImpl) ListPigBreeds(ctx context.Context, opts repository.PigBreedListOptions, page, pageSize int) ([]models.PigBreed, int64, error) {
|
|||
|
|
serviceCtx := logs.AddFuncName(ctx, s.ctx, "ListPigBreeds")
|
|||
|
|
breeds, total, err := s.pigTypeRepo.ListPigBreeds(serviceCtx, opts, page, pageSize)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, 0, fmt.Errorf("获取猪品种列表失败: %w", err)
|
|||
|
|
}
|
|||
|
|
return breeds, total, nil
|
|||
|
|
}
|