issue_29 #32
@@ -7,7 +7,6 @@ import (
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/repository"
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -236,132 +235,3 @@ func (s *pigBatchService) UpdatePigBatchPens(batchID uint, desiredPenIDs []uint)
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// --- 新增的调栏业务实现 ---
|
||||
|
||||
// executeTransferAndLog 是一个私有辅助方法,用于封装创建和记录迁移日志的通用逻辑。
|
||||
func (s *pigBatchService) executeTransferAndLog(tx *gorm.DB, fromBatchID, toBatchID, fromPenID, toPenID uint, quantity int, transferType models.PigTransferType, operatorID uint, remarks string) error {
|
||||
// 1. 生成关联ID
|
||||
correlationID := uuid.New().String()
|
||||
|
||||
// 2. 创建调出日志
|
||||
logOut := &models.PigTransferLog{
|
||||
TransferTime: time.Now(),
|
||||
PigBatchID: fromBatchID,
|
||||
PenID: fromPenID,
|
||||
Quantity: -quantity, // 调出为负数
|
||||
Type: transferType,
|
||||
CorrelationID: correlationID,
|
||||
OperatorID: operatorID,
|
||||
Remarks: remarks,
|
||||
}
|
||||
|
||||
// 3. 创建调入日志
|
||||
logIn := &models.PigTransferLog{
|
||||
TransferTime: time.Now(),
|
||||
PigBatchID: toBatchID,
|
||||
PenID: toPenID,
|
||||
Quantity: quantity, // 调入为正数
|
||||
Type: transferType,
|
||||
CorrelationID: correlationID,
|
||||
OperatorID: operatorID,
|
||||
Remarks: remarks,
|
||||
}
|
||||
|
||||
// 4. 调用子服务记录日志
|
||||
if err := s.transferSvc.LogTransfer(tx, logOut); err != nil {
|
||||
return fmt.Errorf("记录调出日志失败: %w", err)
|
||||
}
|
||||
if err := s.transferSvc.LogTransfer(tx, logIn); err != nil {
|
||||
return fmt.Errorf("记录调入日志失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TransferPigsWithinBatch 实现了同一个猪群内部的调栏业务。
|
||||
func (s *pigBatchService) TransferPigsWithinBatch(batchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error {
|
||||
if fromPenID == toPenID {
|
||||
return errors.New("源猪栏和目标猪栏不能相同")
|
||||
}
|
||||
if quantity == 0 {
|
||||
return errors.New("迁移数量不能为零")
|
||||
}
|
||||
|
||||
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error {
|
||||
// 1. 核心业务规则校验
|
||||
fromPen, err := s.transferSvc.GetPenByID(tx, fromPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪栏信息失败: %w", err)
|
||||
}
|
||||
toPen, err := s.transferSvc.GetPenByID(tx, toPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取目标猪栏信息失败: %w", err)
|
||||
}
|
||||
|
||||
if fromPen.PigBatchID == nil || *fromPen.PigBatchID != batchID {
|
||||
return fmt.Errorf("源猪栏 %d 不属于指定的猪群 %d", fromPenID, batchID)
|
||||
}
|
||||
if toPen.PigBatchID != nil && *toPen.PigBatchID != batchID {
|
||||
return fmt.Errorf("目标猪栏 %d 已被其他猪群占用", toPenID)
|
||||
}
|
||||
|
||||
// 2. 调用通用辅助方法执行日志记录
|
||||
err = s.executeTransferAndLog(tx, batchID, batchID, fromPenID, toPenID, int(quantity), "群内调栏", operatorID, remarks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 3. 群内调栏,猪群总数不变
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// TransferPigsAcrossBatches 实现了跨猪群的调栏业务。
|
||||
func (s *pigBatchService) TransferPigsAcrossBatches(sourceBatchID uint, destBatchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error {
|
||||
if sourceBatchID == destBatchID {
|
||||
return errors.New("源猪群和目标猪群不能相同")
|
||||
}
|
||||
if quantity == 0 {
|
||||
return errors.New("迁移数量不能为零")
|
||||
}
|
||||
|
||||
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error {
|
||||
// 1. 核心业务规则校验
|
||||
sourceBatch, err := s.pigBatchRepo.GetPigBatchByID(sourceBatchID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪群信息失败: %w", err)
|
||||
}
|
||||
destBatch, err := s.pigBatchRepo.GetPigBatchByID(destBatchID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取目标猪群信息失败: %w", err)
|
||||
}
|
||||
|
||||
fromPen, err := s.transferSvc.GetPenByID(tx, fromPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪栏信息失败: %w", err)
|
||||
}
|
||||
if fromPen.PigBatchID == nil || *fromPen.PigBatchID != sourceBatchID {
|
||||
return fmt.Errorf("源猪栏 %d 不属于源猪群 %d", fromPenID, sourceBatchID)
|
||||
}
|
||||
|
||||
// 2. 调用通用辅助方法执行日志记录
|
||||
err = s.executeTransferAndLog(tx, sourceBatchID, destBatchID, fromPenID, toPenID, int(quantity), "跨群调栏", operatorID, remarks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 3. 修改本聚合的数据(猪群总数)
|
||||
sourceBatch.InitialCount -= int(quantity)
|
||||
destBatch.InitialCount += int(quantity)
|
||||
|
||||
if _, _, err := s.pigBatchRepo.UpdatePigBatch(sourceBatch); err != nil {
|
||||
return fmt.Errorf("更新源猪群数量失败: %w", err)
|
||||
}
|
||||
if _, _, err := s.pigBatchRepo.UpdatePigBatch(destBatch); err != nil {
|
||||
return fmt.Errorf("更新目标猪群数量失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
138
internal/domain/pig/pig_batch_service_pen_transfer.go
Normal file
138
internal/domain/pig/pig_batch_service_pen_transfer.go
Normal file
@@ -0,0 +1,138 @@
|
||||
package pig
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// executeTransferAndLog 是一个私有辅助方法,用于封装创建和记录迁移日志的通用逻辑。
|
||||
func (s *pigBatchService) executeTransferAndLog(tx *gorm.DB, fromBatchID, toBatchID, fromPenID, toPenID uint, quantity int, transferType models.PigTransferType, operatorID uint, remarks string) error {
|
||||
// 1. 生成关联ID
|
||||
correlationID := uuid.New().String()
|
||||
|
||||
// 2. 创建调出日志
|
||||
logOut := &models.PigTransferLog{
|
||||
TransferTime: time.Now(),
|
||||
PigBatchID: fromBatchID,
|
||||
PenID: fromPenID,
|
||||
Quantity: -quantity, // 调出为负数
|
||||
Type: transferType,
|
||||
CorrelationID: correlationID,
|
||||
OperatorID: operatorID,
|
||||
Remarks: remarks,
|
||||
}
|
||||
|
||||
// 3. 创建调入日志
|
||||
logIn := &models.PigTransferLog{
|
||||
TransferTime: time.Now(),
|
||||
PigBatchID: toBatchID,
|
||||
PenID: toPenID,
|
||||
Quantity: quantity, // 调入为正数
|
||||
Type: transferType,
|
||||
CorrelationID: correlationID,
|
||||
OperatorID: operatorID,
|
||||
Remarks: remarks,
|
||||
}
|
||||
|
||||
// 4. 调用子服务记录日志
|
||||
if err := s.transferSvc.LogTransfer(tx, logOut); err != nil {
|
||||
return fmt.Errorf("记录调出日志失败: %w", err)
|
||||
}
|
||||
if err := s.transferSvc.LogTransfer(tx, logIn); err != nil {
|
||||
return fmt.Errorf("记录调入日志失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// TransferPigsWithinBatch 实现了同一个猪群内部的调栏业务。
|
||||
func (s *pigBatchService) TransferPigsWithinBatch(batchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error {
|
||||
if fromPenID == toPenID {
|
||||
return errors.New("源猪栏和目标猪栏不能相同")
|
||||
}
|
||||
if quantity == 0 {
|
||||
return errors.New("迁移数量不能为零")
|
||||
}
|
||||
|
||||
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error {
|
||||
// 1. 核心业务规则校验
|
||||
fromPen, err := s.transferSvc.GetPenByID(tx, fromPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪栏信息失败: %w", err)
|
||||
}
|
||||
toPen, err := s.transferSvc.GetPenByID(tx, toPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取目标猪栏信息失败: %w", err)
|
||||
}
|
||||
|
||||
if fromPen.PigBatchID == nil || *fromPen.PigBatchID != batchID {
|
||||
return fmt.Errorf("源猪栏 %d 不属于指定的猪群 %d", fromPenID, batchID)
|
||||
}
|
||||
if toPen.PigBatchID != nil && *toPen.PigBatchID != batchID {
|
||||
return fmt.Errorf("目标猪栏 %d 已被其他猪群占用", toPenID)
|
||||
}
|
||||
|
||||
// 2. 调用通用辅助方法执行日志记录
|
||||
err = s.executeTransferAndLog(tx, batchID, batchID, fromPenID, toPenID, int(quantity), "群内调栏", operatorID, remarks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 3. 群内调栏,猪群总数不变
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// TransferPigsAcrossBatches 实现了跨猪群的调栏业务。
|
||||
func (s *pigBatchService) TransferPigsAcrossBatches(sourceBatchID uint, destBatchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error {
|
||||
if sourceBatchID == destBatchID {
|
||||
return errors.New("源猪群和目标猪群不能相同")
|
||||
}
|
||||
if quantity == 0 {
|
||||
return errors.New("迁移数量不能为零")
|
||||
}
|
||||
|
||||
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error {
|
||||
// 1. 核心业务规则校验
|
||||
sourceBatch, err := s.pigBatchRepo.GetPigBatchByID(sourceBatchID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪群信息失败: %w", err)
|
||||
}
|
||||
destBatch, err := s.pigBatchRepo.GetPigBatchByID(destBatchID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取目标猪群信息失败: %w", err)
|
||||
}
|
||||
|
||||
fromPen, err := s.transferSvc.GetPenByID(tx, fromPenID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取源猪栏信息失败: %w", err)
|
||||
}
|
||||
if fromPen.PigBatchID == nil || *fromPen.PigBatchID != sourceBatchID {
|
||||
return fmt.Errorf("源猪栏 %d 不属于源猪群 %d", fromPenID, sourceBatchID)
|
||||
}
|
||||
|
||||
// 2. 调用通用辅助方法执行日志记录
|
||||
err = s.executeTransferAndLog(tx, sourceBatchID, destBatchID, fromPenID, toPenID, int(quantity), "跨群调栏", operatorID, remarks)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 3. 修改本聚合的数据(猪群总数)
|
||||
sourceBatch.InitialCount -= int(quantity)
|
||||
destBatch.InitialCount += int(quantity)
|
||||
|
||||
if _, _, err := s.pigBatchRepo.UpdatePigBatch(sourceBatch); err != nil {
|
||||
return fmt.Errorf("更新源猪群数量失败: %w", err)
|
||||
}
|
||||
if _, _, err := s.pigBatchRepo.UpdatePigBatch(destBatch); err != nil {
|
||||
return fmt.Errorf("更新目标猪群数量失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
1
internal/domain/pig/pig_batch_service_pig_trade.go
Normal file
1
internal/domain/pig/pig_batch_service_pig_trade.go
Normal file
@@ -0,0 +1 @@
|
||||
package pig
|
||||
Reference in New Issue
Block a user