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
|
||
}
|