package repository import ( "errors" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "gorm.io/gorm" ) // PigBatchRepository 定义了与猪批次相关的数据库操作接口 type PigBatchRepository interface { CreatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) GetPigBatchByID(id uint) (*models.PigBatch, error) UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) DeletePigBatch(id uint) error ListPigBatches(isActive *bool) ([]*models.PigBatch, error) } // gormPigBatchRepository 是 PigBatchRepository 的 GORM 实现 type gormPigBatchRepository struct { db *gorm.DB } // NewGormPigBatchRepository 创建一个新的 PigBatchRepository GORM 实现实例 func NewGormPigBatchRepository(db *gorm.DB) PigBatchRepository { return &gormPigBatchRepository{db: db} } // CreatePigBatch 创建一个新的猪批次 func (r *gormPigBatchRepository) CreatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) { if err := r.db.Create(batch).Error; err != nil { return nil, err } return batch, nil } // GetPigBatchByID 根据ID获取单个猪批次 func (r *gormPigBatchRepository) GetPigBatchByID(id uint) (*models.PigBatch, error) { var batch models.PigBatch if err := r.db.First(&batch, id).Error; err != nil { return nil, err } return &batch, nil } // UpdatePigBatch 更新一个猪批次 func (r *gormPigBatchRepository) UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) { result := r.db.Model(&models.PigBatch{}).Where("id = ?", batch.ID).Updates(batch) if result.Error != nil { return nil, result.Error } if result.RowsAffected == 0 { return nil, errors.New("未找到要更新的猪批次或数据未改变") // 明确返回错误,而不是 gorm.ErrRecordNotFound } return batch, nil } // DeletePigBatch 根据ID删除一个猪批次 (GORM 会执行软删除) func (r *gormPigBatchRepository) DeletePigBatch(id uint) error { result := r.db.Delete(&models.PigBatch{}, id) if result.Error != nil { return result.Error } if result.RowsAffected == 0 { return errors.New("未找到要删除的猪批次") // 明确返回错误 } return nil } // ListPigBatches 批量查询猪批次,支持根据 IsActive 筛选 func (r *gormPigBatchRepository) ListPigBatches(isActive *bool) ([]*models.PigBatch, error) { var batches []*models.PigBatch query := r.db.Model(&models.PigBatch{}) if isActive != nil { if *isActive { // 查询活跃的批次:状态不是已出售或已归档 query = query.Where("status NOT IN (?) ", []models.PigBatchStatus{models.BatchStatusSold, models.BatchStatusArchived}) } else { // 查询非活跃的批次:状态是已出售或已归档 query = query.Where("status IN (?) ", []models.PigBatchStatus{models.BatchStatusSold, models.BatchStatusArchived}) } } if err := query.Find(&batches).Error; err != nil { return nil, err } return batches, nil }