diff --git a/internal/infra/repository/pig_farm_repository.go b/internal/infra/repository/pig_farm_repository.go index 5341594..f6099f7 100644 --- a/internal/infra/repository/pig_farm_repository.go +++ b/internal/infra/repository/pig_farm_repository.go @@ -8,8 +8,9 @@ import ( ) var ( - ErrHouseContainsPens = errors.New("cannot delete a pig house that still contains pens") - ErrHouseNotFound = errors.New("the specified pig house does not exist") + ErrHouseContainsPens = errors.New("请在移除所有猪圈后移除当前猪舍") + ErrHouseNotFound = errors.New("猪舍不存在") + ErrPenInUse = errors.New("猪栏正在被活跃批次使用,无法删除") ) // PigFarmRepository 定义了与猪场资产(猪舍、猪栏)相关的数据库操作接口 @@ -146,12 +147,34 @@ func (r *gormPigFarmRepository) UpdatePen(pen *models.Pen) error { } func (r *gormPigFarmRepository) DeletePen(id uint) error { - result := r.db.Delete(&models.Pen{}, id) - if result.Error != nil { - return result.Error - } - if result.RowsAffected == 0 { - return gorm.ErrRecordNotFound - } - return nil + return r.db.Transaction(func(tx *gorm.DB) error { + var pen models.Pen + if err := tx.First(&pen, id).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return gorm.ErrRecordNotFound + } + return err + } + + // 检查猪栏是否被活跃批次使用 + if pen.PigBatchID != 0 { + var pigBatch models.PigBatch + err := tx.First(&pigBatch, pen.PigBatchID).Error + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return err + } + if pigBatch.IsActive() { + return ErrPenInUse + } + } + + result := tx.Delete(&models.Pen{}, id) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return gorm.ErrRecordNotFound + } + return nil + }) }