移动业务逻辑

This commit is contained in:
2025-10-04 00:58:29 +08:00
parent 8bb0a54f18
commit 1bc36f5e10
4 changed files with 73 additions and 66 deletions

View File

@@ -133,11 +133,15 @@ func (s *pigBatchService) UpdatePigBatch(id uint, dto *dto.PigBatchUpdateDTO) (*
existingBatch.Status = *dto.Status existingBatch.Status = *dto.Status
} }
updatedBatch, err := s.pigBatchRepo.UpdatePigBatch(existingBatch) updatedBatch, rowsAffected, err := s.pigBatchRepo.UpdatePigBatch(existingBatch)
if err != nil { if err != nil {
s.logger.Errorf("更新猪批次失败ID: %d, 错误: %v", id, err) s.logger.Errorf("更新猪批次失败ID: %d, 错误: %v", id, err)
return nil, err return nil, err
} }
// 如果没有行受影响,则认为猪批次不存在
if rowsAffected == 0 {
return nil, ErrPigBatchNotFound
}
return s.toPigBatchResponseDTO(updatedBatch), nil return s.toPigBatchResponseDTO(updatedBatch), nil
} }
@@ -160,14 +164,16 @@ func (s *pigBatchService) DeletePigBatch(id uint) error {
} }
// 3. 执行删除操作 // 3. 执行删除操作
err = s.pigBatchRepo.DeletePigBatch(id) rowsAffected, err := s.pigBatchRepo.DeletePigBatch(id)
if err != nil { if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) || errors.New("未找到要删除的猪批次").Error() == err.Error() {
return ErrPigBatchNotFound
}
s.logger.Errorf("删除猪批次失败ID: %d, 错误: %v", id, err) s.logger.Errorf("删除猪批次失败ID: %d, 错误: %v", id, err)
return err return err
} }
// 如果没有行受影响,则认为猪批次不存在
if rowsAffected == 0 {
return ErrPigBatchNotFound
}
return nil return nil
} }

View File

@@ -71,10 +71,13 @@ func (s *pigFarmService) UpdatePigHouse(id uint, name, description string) (*mod
Name: name, Name: name,
Description: description, Description: description,
} }
err := s.repo.UpdatePigHouse(house) rowsAffected, err := s.repo.UpdatePigHouse(house)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if rowsAffected == 0 {
return nil, ErrHouseNotFound
}
// 返回更新后的完整信息 // 返回更新后的完整信息
return s.repo.GetPigHouseByID(id) return s.repo.GetPigHouseByID(id)
} }
@@ -90,11 +93,14 @@ func (s *pigFarmService) DeletePigHouse(id uint) error {
} }
// 调用仓库层进行删除 // 调用仓库层进行删除
err = s.repo.DeletePigHouse(id) rowsAffected, err := s.repo.DeletePigHouse(id)
if errors.Is(err, gorm.ErrRecordNotFound) { if err != nil {
return ErrHouseNotFound // 或者直接返回 gorm.ErrRecordNotFound取决于业务需求 return err
} }
return err if rowsAffected == 0 {
return ErrHouseNotFound
}
return nil
} }
// --- Pen Implementation --- // --- Pen Implementation ---
@@ -144,10 +150,13 @@ func (s *pigFarmService) UpdatePen(id uint, penNumber string, houseID uint, capa
Capacity: capacity, Capacity: capacity,
Status: status, Status: status,
} }
err = s.repo.UpdatePen(pen) rowsAffected, err := s.repo.UpdatePen(pen)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if rowsAffected == 0 {
return nil, ErrPenNotFound
}
// 返回更新后的完整信息 // 返回更新后的完整信息
return s.repo.GetPenByID(id) return s.repo.GetPenByID(id)
} }
@@ -157,27 +166,31 @@ func (s *pigFarmService) DeletePen(id uint) error {
pen, err := s.repo.GetPenByID(id) pen, err := s.repo.GetPenByID(id)
if err != nil { if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return gorm.ErrRecordNotFound // 猪栏不存在 return ErrPenNotFound // 猪栏不存在
} }
return err return err
} }
// 检查猪栏是否关联了活跃批次 // 检查猪栏是否关联了活跃批次
if *pen.PigBatchID != 0 { // 注意pen.PigBatchID 是指针类型,需要检查是否为 nil
if pen.PigBatchID != nil && *pen.PigBatchID != 0 {
pigBatch, err := s.repo.GetPigBatchByID(*pen.PigBatchID) pigBatch, err := s.repo.GetPigBatchByID(*pen.PigBatchID)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return err return err
} }
// 如果批次活跃,则不能删除猪栏 // 如果批次活跃,则不能删除猪栏
if pigBatch.IsActive() { if pigBatch != nil && pigBatch.IsActive() {
return ErrPenInUse return ErrPenInUse
} }
} }
// 调用仓库层进行删除 // 调用仓库层进行删除
err = s.repo.DeletePen(id) rowsAffected, err := s.repo.DeletePen(id)
if errors.Is(err, gorm.ErrRecordNotFound) { if err != nil {
return gorm.ErrRecordNotFound // 猪栏不存在 return err
} }
return err if rowsAffected == 0 {
return ErrPenNotFound
}
return nil
} }

View File

@@ -1,8 +1,6 @@
package repository package repository
import ( import (
"errors"
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -11,8 +9,10 @@ import (
type PigBatchRepository interface { type PigBatchRepository interface {
CreatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) CreatePigBatch(batch *models.PigBatch) (*models.PigBatch, error)
GetPigBatchByID(id uint) (*models.PigBatch, error) GetPigBatchByID(id uint) (*models.PigBatch, error)
UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) // UpdatePigBatch 更新一个猪批次,返回更新后的批次、受影响的行数和错误
DeletePigBatch(id uint) error UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, int64, error)
// DeletePigBatch 根据ID删除一个猪批次返回受影响的行数和错误
DeletePigBatch(id uint) (int64, error)
ListPigBatches(isActive *bool) ([]*models.PigBatch, error) ListPigBatches(isActive *bool) ([]*models.PigBatch, error)
} }
@@ -44,27 +44,23 @@ func (r *gormPigBatchRepository) GetPigBatchByID(id uint) (*models.PigBatch, err
} }
// UpdatePigBatch 更新一个猪批次 // UpdatePigBatch 更新一个猪批次
func (r *gormPigBatchRepository) UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, error) { func (r *gormPigBatchRepository) UpdatePigBatch(batch *models.PigBatch) (*models.PigBatch, int64, error) {
result := r.db.Model(&models.PigBatch{}).Where("id = ?", batch.ID).Updates(batch) result := r.db.Model(&models.PigBatch{}).Where("id = ?", batch.ID).Updates(batch)
if result.Error != nil { if result.Error != nil {
return nil, result.Error return nil, 0, result.Error
} }
if result.RowsAffected == 0 { // 返回更新后的批次、受影响的行数和错误
return nil, errors.New("未找到要更新的猪批次或数据未改变") // 明确返回错误,而不是 gorm.ErrRecordNotFound return batch, result.RowsAffected, nil
}
return batch, nil
} }
// DeletePigBatch 根据ID删除一个猪批次 (GORM 会执行软删除) // DeletePigBatch 根据ID删除一个猪批次 (GORM 会执行软删除)
func (r *gormPigBatchRepository) DeletePigBatch(id uint) error { func (r *gormPigBatchRepository) DeletePigBatch(id uint) (int64, error) {
result := r.db.Delete(&models.PigBatch{}, id) result := r.db.Delete(&models.PigBatch{}, id)
if result.Error != nil { if result.Error != nil {
return result.Error return 0, result.Error
} }
if result.RowsAffected == 0 { // 返回受影响的行数和错误
return errors.New("未找到要删除的猪批次") // 明确返回错误 return result.RowsAffected, nil
}
return nil
} }
// ListPigBatches 批量查询猪批次,支持根据 IsActive 筛选 // ListPigBatches 批量查询猪批次,支持根据 IsActive 筛选

View File

@@ -11,8 +11,10 @@ type PigFarmRepository interface {
CreatePigHouse(house *models.PigHouse) error CreatePigHouse(house *models.PigHouse) error
GetPigHouseByID(id uint) (*models.PigHouse, error) GetPigHouseByID(id uint) (*models.PigHouse, error)
ListPigHouses() ([]models.PigHouse, error) ListPigHouses() ([]models.PigHouse, error)
UpdatePigHouse(house *models.PigHouse) error // UpdatePigHouse 更新一个猪舍,返回受影响的行数和错误
DeletePigHouse(id uint) error UpdatePigHouse(house *models.PigHouse) (int64, error)
// DeletePigHouse 根据ID删除一个猪舍返回受影响的行数和错误
DeletePigHouse(id uint) (int64, error)
CountPensInHouse(houseID uint) (int64, error) CountPensInHouse(houseID uint) (int64, error)
// Pen methods // Pen methods
@@ -22,8 +24,10 @@ type PigFarmRepository interface {
// GetPenByIDTx 根据ID获取单个猪栏 (事务性) // GetPenByIDTx 根据ID获取单个猪栏 (事务性)
GetPenByIDTx(tx *gorm.DB, id uint) (*models.Pen, error) GetPenByIDTx(tx *gorm.DB, id uint) (*models.Pen, error)
ListPens() ([]models.Pen, error) ListPens() ([]models.Pen, error)
UpdatePen(pen *models.Pen) error // UpdatePen 更新一个猪栏,返回受影响的行数和错误
DeletePen(id uint) error UpdatePen(pen *models.Pen) (int64, error)
// DeletePen 根据ID删除一个猪栏返回受影响的行数和错误
DeletePen(id uint) (int64, error)
// GetPensByBatchID 根据批次ID获取所有关联的猪栏 (事务性) // GetPensByBatchID 根据批次ID获取所有关联的猪栏 (事务性)
GetPensByBatchID(tx *gorm.DB, batchID uint) ([]models.Pen, error) GetPensByBatchID(tx *gorm.DB, batchID uint) ([]models.Pen, error)
// UpdatePenFields 更新猪栏的指定字段 (事务性) // UpdatePenFields 更新猪栏的指定字段 (事务性)
@@ -71,28 +75,22 @@ func (r *gormPigFarmRepository) ListPigHouses() ([]models.PigHouse, error) {
return houses, nil return houses, nil
} }
// UpdatePigHouse 更新一个猪舍 // UpdatePigHouse 更新一个猪舍,返回受影响的行数和错误
func (r *gormPigFarmRepository) UpdatePigHouse(house *models.PigHouse) error { func (r *gormPigFarmRepository) UpdatePigHouse(house *models.PigHouse) (int64, error) {
result := r.db.Model(&models.PigHouse{}).Where("id = ?", house.ID).Updates(house) result := r.db.Model(&models.PigHouse{}).Where("id = ?", house.ID).Updates(house)
if result.Error != nil { if result.Error != nil {
return result.Error return 0, result.Error
} }
if result.RowsAffected == 0 { return result.RowsAffected, nil
return gorm.ErrRecordNotFound // 未找到要更新的猪舍或数据未改变
}
return nil
} }
// DeletePigHouse 根据ID删除一个猪舍 // DeletePigHouse 根据ID删除一个猪舍,返回受影响的行数和错误
func (r *gormPigFarmRepository) DeletePigHouse(id uint) error { func (r *gormPigFarmRepository) DeletePigHouse(id uint) (int64, error) {
result := r.db.Delete(&models.PigHouse{}, id) result := r.db.Delete(&models.PigHouse{}, id)
if result.Error != nil { if result.Error != nil {
return result.Error return 0, result.Error
} }
if result.RowsAffected == 0 { return result.RowsAffected, nil
return gorm.ErrRecordNotFound // 未找到要删除的猪舍
}
return nil
} }
// CountPensInHouse 统计猪舍中的猪栏数量 // CountPensInHouse 统计猪舍中的猪栏数量
@@ -136,28 +134,22 @@ func (r *gormPigFarmRepository) ListPens() ([]models.Pen, error) {
return pens, nil return pens, nil
} }
// UpdatePen 更新一个猪栏 // UpdatePen 更新一个猪栏,返回受影响的行数和错误
func (r *gormPigFarmRepository) UpdatePen(pen *models.Pen) error { func (r *gormPigFarmRepository) UpdatePen(pen *models.Pen) (int64, error) {
result := r.db.Model(&models.Pen{}).Where("id = ?", pen.ID).Updates(pen) result := r.db.Model(&models.Pen{}).Where("id = ?", pen.ID).Updates(pen)
if result.Error != nil { if result.Error != nil {
return result.Error return 0, result.Error
} }
if result.RowsAffected == 0 { return result.RowsAffected, nil
return gorm.ErrRecordNotFound // 未找到要更新的猪栏或数据未改变
}
return nil
} }
// DeletePen 根据ID删除一个猪栏 // DeletePen 根据ID删除一个猪栏,返回受影响的行数和错误
func (r *gormPigFarmRepository) DeletePen(id uint) error { func (r *gormPigFarmRepository) DeletePen(id uint) (int64, error) {
result := r.db.Delete(&models.Pen{}, id) result := r.db.Delete(&models.Pen{}, id)
if result.Error != nil { if result.Error != nil {
return result.Error return 0, result.Error
} }
if result.RowsAffected == 0 { return result.RowsAffected, nil
return gorm.ErrRecordNotFound // 未找到要删除的猪栏
}
return nil
} }
// GetPensByBatchID 根据批次ID获取所有关联的猪栏 (事务性) // GetPensByBatchID 根据批次ID获取所有关联的猪栏 (事务性)