From 448b721af56e7ace722ce50b4515d10c7d02438a Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 6 Oct 2025 11:58:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=96=B9=E6=B3=95=E5=AD=98?= =?UTF-8?q?=E6=94=BE=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/domain/pig/pig_batch_service.go | 130 ----------------- .../pig/pig_batch_service_pen_transfer.go | 138 ++++++++++++++++++ .../domain/pig/pig_batch_service_pig_trade.go | 1 + 3 files changed, 139 insertions(+), 130 deletions(-) create mode 100644 internal/domain/pig/pig_batch_service_pen_transfer.go create mode 100644 internal/domain/pig/pig_batch_service_pig_trade.go diff --git a/internal/domain/pig/pig_batch_service.go b/internal/domain/pig/pig_batch_service.go index 5688971..7b711d4 100644 --- a/internal/domain/pig/pig_batch_service.go +++ b/internal/domain/pig/pig_batch_service.go @@ -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 - }) -} diff --git a/internal/domain/pig/pig_batch_service_pen_transfer.go b/internal/domain/pig/pig_batch_service_pen_transfer.go new file mode 100644 index 0000000..0a216b5 --- /dev/null +++ b/internal/domain/pig/pig_batch_service_pen_transfer.go @@ -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 + }) +} diff --git a/internal/domain/pig/pig_batch_service_pig_trade.go b/internal/domain/pig/pig_batch_service_pig_trade.go new file mode 100644 index 0000000..467de02 --- /dev/null +++ b/internal/domain/pig/pig_batch_service_pig_trade.go @@ -0,0 +1 @@ +package pig