实现配方领域关于猪模型和营养需求的增删改查
This commit is contained in:
281
internal/infra/repository/pig_type_repository.go
Normal file
281
internal/infra/repository/pig_type_repository.go
Normal file
@@ -0,0 +1,281 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// PigBreedListOptions 定义了查询猪品种记录时的可选参数
|
||||
type PigBreedListOptions struct {
|
||||
Name *string // 品种名称
|
||||
OrderBy string // 例如 "name asc"
|
||||
}
|
||||
|
||||
// PigAgeStageListOptions 定义了查询猪年龄阶段记录时的可选参数
|
||||
type PigAgeStageListOptions struct {
|
||||
Name *string // 年龄阶段名称
|
||||
OrderBy string // 例如 "name asc"
|
||||
}
|
||||
|
||||
// PigTypeListOptions 定义了查询猪类型记录时的可选参数
|
||||
type PigTypeListOptions struct {
|
||||
BreedID *uint32 // 关联的猪品种ID
|
||||
AgeStageID *uint32 // 关联的猪年龄阶段ID
|
||||
BreedName *string // 关联的猪品种名称 (用于模糊查询)
|
||||
AgeStageName *string // 关联的猪年龄阶段名称 (用于模糊查询)
|
||||
OrderBy string // 例如 "id desc"
|
||||
}
|
||||
|
||||
// PigTypeRepository 定义了猪品种、猪年龄阶段和猪类型数据持久化的接口。
|
||||
type PigTypeRepository interface {
|
||||
|
||||
// <-- 猪品种相关接口 -->
|
||||
|
||||
// CreatePigBreed 在数据库中创建一条猪品种记录。
|
||||
CreatePigBreed(ctx context.Context, breed *models.PigBreed) error
|
||||
// GetPigBreedByID 根据ID获取猪品种记录。
|
||||
GetPigBreedByID(ctx context.Context, id uint32) (*models.PigBreed, error)
|
||||
// UpdatePigBreed 更新猪品种记录。
|
||||
UpdatePigBreed(ctx context.Context, breed *models.PigBreed) error
|
||||
// DeletePigBreed 根据ID删除猪品种记录。
|
||||
DeletePigBreed(ctx context.Context, id uint32) error
|
||||
// ListPigBreeds 支持分页和过滤的猪品种记录列表查询。
|
||||
ListPigBreeds(ctx context.Context, opts PigBreedListOptions, page, pageSize int) ([]models.PigBreed, int64, error)
|
||||
|
||||
// <-- 猪年龄阶段相关接口 -->
|
||||
|
||||
// CreatePigAgeStage 在数据库中创建一条猪年龄阶段记录。
|
||||
CreatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error
|
||||
// GetPigAgeStageByID 根据ID获取猪年龄阶段记录。
|
||||
GetPigAgeStageByID(ctx context.Context, id uint32) (*models.PigAgeStage, error)
|
||||
// UpdatePigAgeStage 更新猪年龄阶段记录。
|
||||
UpdatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error
|
||||
// DeletePigAgeStage 根据ID删除猪年龄阶段记录。
|
||||
DeletePigAgeStage(ctx context.Context, id uint32) error
|
||||
// ListPigAgeStages 支持分页和过滤的猪年龄阶段记录列表查询。
|
||||
ListPigAgeStages(ctx context.Context, opts PigAgeStageListOptions, page, pageSize int) ([]models.PigAgeStage, int64, error)
|
||||
|
||||
// <-- 猪类型相关接口 -->
|
||||
|
||||
// CreatePigType 在数据库中创建一条猪类型记录。
|
||||
CreatePigType(ctx context.Context, pigType *models.PigType) error
|
||||
// GetPigTypeByID 根据ID获取猪类型记录。
|
||||
GetPigTypeByID(ctx context.Context, id uint32) (*models.PigType, error)
|
||||
// UpdatePigType 更新猪类型记录。
|
||||
UpdatePigType(ctx context.Context, pigType *models.PigType) error
|
||||
// DeletePigType 根据ID删除猪类型记录。
|
||||
DeletePigType(ctx context.Context, id uint32) error
|
||||
// ListPigTypes 支持分页和过滤的猪类型记录列表查询。
|
||||
ListPigTypes(ctx context.Context, opts PigTypeListOptions, page, pageSize int) ([]models.PigType, int64, error)
|
||||
}
|
||||
|
||||
// gormPigTypeRepository 是 PigTypeRepository 接口的 GORM 实现。
|
||||
type gormPigTypeRepository struct {
|
||||
ctx context.Context
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewGormPigTypeRepository 创建一个新的 PigTypeRepository GORM 实现实例。
|
||||
func NewGormPigTypeRepository(ctx context.Context, db *gorm.DB) PigTypeRepository {
|
||||
return &gormPigTypeRepository{ctx: ctx, db: db}
|
||||
}
|
||||
|
||||
// CreatePigBreed 实现了在数据库中创建猪品种记录的逻辑。
|
||||
func (r *gormPigTypeRepository) CreatePigBreed(ctx context.Context, breed *models.PigBreed) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "CreatePigBreed")
|
||||
return r.db.WithContext(repoCtx).Create(breed).Error
|
||||
}
|
||||
|
||||
// GetPigBreedByID 实现了根据ID获取猪品种记录的逻辑。
|
||||
func (r *gormPigTypeRepository) GetPigBreedByID(ctx context.Context, id uint32) (*models.PigBreed, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "GetPigBreedByID")
|
||||
var breed models.PigBreed
|
||||
err := r.db.WithContext(repoCtx).First(&breed, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &breed, nil
|
||||
}
|
||||
|
||||
// UpdatePigBreed 实现了更新猪品种记录的逻辑。
|
||||
func (r *gormPigTypeRepository) UpdatePigBreed(ctx context.Context, breed *models.PigBreed) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "UpdatePigBreed")
|
||||
return r.db.WithContext(repoCtx).Save(breed).Error
|
||||
}
|
||||
|
||||
// DeletePigBreed 实现了根据ID删除猪品种记录的逻辑。
|
||||
func (r *gormPigTypeRepository) DeletePigBreed(ctx context.Context, id uint32) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "DeletePigBreed")
|
||||
return r.db.WithContext(repoCtx).Delete(&models.PigBreed{}, id).Error
|
||||
}
|
||||
|
||||
// ListPigBreeds 实现了分页和过滤查询猪品种记录的功能。
|
||||
func (r *gormPigTypeRepository) ListPigBreeds(ctx context.Context, opts PigBreedListOptions, page, pageSize int) ([]models.PigBreed, int64, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListPigBreeds")
|
||||
if page <= 0 || pageSize <= 0 {
|
||||
return nil, 0, ErrInvalidPagination
|
||||
}
|
||||
|
||||
var results []models.PigBreed
|
||||
var total int64
|
||||
|
||||
query := r.db.WithContext(repoCtx).Model(&models.PigBreed{})
|
||||
|
||||
if opts.Name != nil {
|
||||
query = query.Where("name LIKE ?", "%"+*opts.Name+"%")
|
||||
}
|
||||
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
orderBy := "id DESC" // 默认排序
|
||||
if opts.OrderBy != "" {
|
||||
orderBy = opts.OrderBy
|
||||
}
|
||||
query = query.Order(orderBy)
|
||||
|
||||
offset := (page - 1) * pageSize
|
||||
err := query.Limit(pageSize).Offset(offset).Find(&results).Error
|
||||
|
||||
return results, total, err
|
||||
}
|
||||
|
||||
// CreatePigAgeStage 实现了在数据库中创建猪年龄阶段记录的逻辑。
|
||||
func (r *gormPigTypeRepository) CreatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "CreatePigAgeStage")
|
||||
return r.db.WithContext(repoCtx).Create(ageStage).Error
|
||||
}
|
||||
|
||||
// GetPigAgeStageByID 实现了根据ID获取猪年龄阶段记录的逻辑。
|
||||
func (r *gormPigTypeRepository) GetPigAgeStageByID(ctx context.Context, id uint32) (*models.PigAgeStage, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "GetPigAgeStageByID")
|
||||
var ageStage models.PigAgeStage
|
||||
err := r.db.WithContext(repoCtx).First(&ageStage, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &ageStage, nil
|
||||
}
|
||||
|
||||
// UpdatePigAgeStage 实现了更新猪年龄阶段记录的逻辑。
|
||||
func (r *gormPigTypeRepository) UpdatePigAgeStage(ctx context.Context, ageStage *models.PigAgeStage) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "UpdatePigAgeStage")
|
||||
return r.db.WithContext(repoCtx).Save(ageStage).Error
|
||||
}
|
||||
|
||||
// DeletePigAgeStage 实现了根据ID删除猪年龄阶段记录的逻辑。
|
||||
func (r *gormPigTypeRepository) DeletePigAgeStage(ctx context.Context, id uint32) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "DeletePigAgeStage")
|
||||
return r.db.WithContext(repoCtx).Delete(&models.PigAgeStage{}, id).Error
|
||||
}
|
||||
|
||||
// ListPigAgeStages 实现了分页和过滤查询猪年龄阶段记录的功能。
|
||||
func (r *gormPigTypeRepository) ListPigAgeStages(ctx context.Context, opts PigAgeStageListOptions, page, pageSize int) ([]models.PigAgeStage, int64, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListPigAgeStages")
|
||||
if page <= 0 || pageSize <= 0 {
|
||||
return nil, 0, ErrInvalidPagination
|
||||
}
|
||||
|
||||
var results []models.PigAgeStage
|
||||
var total int64
|
||||
|
||||
query := r.db.WithContext(repoCtx).Model(&models.PigAgeStage{})
|
||||
|
||||
if opts.Name != nil {
|
||||
query = query.Where("name LIKE ?", "%"+*opts.Name+"%")
|
||||
}
|
||||
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
orderBy := "id DESC" // 默认排序
|
||||
if opts.OrderBy != "" {
|
||||
orderBy = opts.OrderBy
|
||||
}
|
||||
query = query.Order(orderBy)
|
||||
|
||||
offset := (page - 1) * pageSize
|
||||
err := query.Limit(pageSize).Offset(offset).Find(&results).Error
|
||||
|
||||
return results, total, err
|
||||
}
|
||||
|
||||
// CreatePigType 实现了在数据库中创建猪类型记录的逻辑。
|
||||
func (r *gormPigTypeRepository) CreatePigType(ctx context.Context, pigType *models.PigType) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "CreatePigType")
|
||||
return r.db.WithContext(repoCtx).Create(pigType).Error
|
||||
}
|
||||
|
||||
// GetPigTypeByID 实现了根据ID获取猪类型记录的逻辑。
|
||||
func (r *gormPigTypeRepository) GetPigTypeByID(ctx context.Context, id uint32) (*models.PigType, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "GetPigTypeByID")
|
||||
var pigType models.PigType
|
||||
err := r.db.WithContext(repoCtx).Preload("Breed").Preload("AgeStage").First(&pigType, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &pigType, nil
|
||||
}
|
||||
|
||||
// UpdatePigType 实现了更新猪类型记录的逻辑。
|
||||
func (r *gormPigTypeRepository) UpdatePigType(ctx context.Context, pigType *models.PigType) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "UpdatePigType")
|
||||
return r.db.WithContext(repoCtx).Save(pigType).Error
|
||||
}
|
||||
|
||||
// DeletePigType 实现了根据ID删除猪类型记录的逻辑。
|
||||
func (r *gormPigTypeRepository) DeletePigType(ctx context.Context, id uint32) error {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "DeletePigType")
|
||||
return r.db.WithContext(repoCtx).Delete(&models.PigType{}, id).Error
|
||||
}
|
||||
|
||||
// ListPigTypes 实现了分页和过滤查询猪类型记录的功能。
|
||||
func (r *gormPigTypeRepository) ListPigTypes(ctx context.Context, opts PigTypeListOptions, page, pageSize int) ([]models.PigType, int64, error) {
|
||||
repoCtx := logs.AddFuncName(ctx, r.ctx, "ListPigTypes")
|
||||
|
||||
if page <= 0 || pageSize <= 0 {
|
||||
return nil, 0, ErrInvalidPagination
|
||||
}
|
||||
|
||||
var results []models.PigType
|
||||
var total int64
|
||||
|
||||
query := r.db.WithContext(repoCtx).Model(&models.PigType{})
|
||||
|
||||
if opts.BreedID != nil {
|
||||
query = query.Where("breed_id = ?", *opts.BreedID)
|
||||
}
|
||||
if opts.AgeStageID != nil {
|
||||
query = query.Where("age_stage_id = ?", *opts.AgeStageID)
|
||||
}
|
||||
|
||||
if opts.BreedName != nil {
|
||||
query = query.Joins("left join pig_breeds on pig_types.breed_id = pig_breeds.id").
|
||||
Where("pig_breeds.name LIKE ?", "%"+*opts.BreedName+"%")
|
||||
}
|
||||
if opts.AgeStageName != nil {
|
||||
query = query.Joins("left join pig_age_stages on pig_types.age_stage_id = pig_age_stages.id").
|
||||
Where("pig_age_stages.name LIKE ?", "%"+*opts.AgeStageName+"%")
|
||||
}
|
||||
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
orderBy := "id DESC" // 默认排序
|
||||
if opts.OrderBy != "" {
|
||||
orderBy = opts.OrderBy
|
||||
}
|
||||
query = query.Order(orderBy)
|
||||
|
||||
offset := (page - 1) * pageSize
|
||||
err := query.Limit(pageSize).Offset(offset).Preload("Breed").Preload("AgeStage").Find(&results).Error
|
||||
|
||||
return results, total, err
|
||||
}
|
||||
Reference in New Issue
Block a user