From 51b776f3932062481e3ace2b94352242b9cbdc77 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 6 Oct 2025 17:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=A8=E7=BE=A4=E8=B0=83=E6=A0=8F=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E8=B0=83=E6=95=B4=E7=8C=AA=E7=9A=84=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/domain/pig/pig_batch.go | 9 ++++- .../pig/pig_batch_service_pen_transfer.go | 37 ++++++++++++------- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/internal/domain/pig/pig_batch.go b/internal/domain/pig/pig_batch.go index 001c0aa..26eca87 100644 --- a/internal/domain/pig/pig_batch.go +++ b/internal/domain/pig/pig_batch.go @@ -50,12 +50,19 @@ type PigBatchService interface { // GetCurrentPigQuantity 获取指定猪批次的当前猪只数量。 GetCurrentPigQuantity(batchID uint) (int, error) + UpdatePigBatchQuantity(operatorID uint, batchID uint, changeType models.LogChangeType, changeAmount int, changeReason string, happenedAt time.Time) error + + // 交易子服务 + // SellPigs 处理卖猪的业务逻辑。 SellPigs(batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error // BuyPigs 处理买猪的业务逻辑。 BuyPigs(batchID uint, penID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error - UpdatePigBatchQuantity(operatorID uint, batchID uint, changeType models.LogChangeType, changeAmount int, changeReason string, happenedAt time.Time) error + // 调栏子服务 + + TransferPigsAcrossBatches(sourceBatchID uint, destBatchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error + TransferPigsWithinBatch(batchID uint, fromPenID uint, toPenID uint, quantity uint, operatorID uint, remarks string) error } // pigBatchService 是 PigBatchService 接口的具体实现。 diff --git a/internal/domain/pig/pig_batch_service_pen_transfer.go b/internal/domain/pig/pig_batch_service_pen_transfer.go index d50244a..95cefa1 100644 --- a/internal/domain/pig/pig_batch_service_pen_transfer.go +++ b/internal/domain/pig/pig_batch_service_pen_transfer.go @@ -110,15 +110,21 @@ func (s *pigBatchService) TransferPigsAcrossBatches(sourceBatchID uint, destBatc return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error { // 1. 核心业务规则校验 - sourceBatch, err := s.pigBatchRepo.GetPigBatchByID(sourceBatchID) - if err != nil { + // 1.1 校验猪群存在 + if _, err := s.pigBatchRepo.GetPigBatchByIDTx(tx, sourceBatchID); err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("源猪群 %d 不存在", sourceBatchID) + } return fmt.Errorf("获取源猪群信息失败: %w", err) } - destBatch, err := s.pigBatchRepo.GetPigBatchByID(destBatchID) - if err != nil { + if _, err := s.pigBatchRepo.GetPigBatchByIDTx(tx, destBatchID); err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("目标猪群 %d 不存在", destBatchID) + } return fmt.Errorf("获取目标猪群信息失败: %w", err) } + // 1.2 校验猪栏归属 fromPen, err := s.transferSvc.GetPenByID(tx, fromPenID) if err != nil { return fmt.Errorf("获取源猪栏信息失败: %w", err) @@ -127,21 +133,26 @@ func (s *pigBatchService) TransferPigsAcrossBatches(sourceBatchID uint, destBatc return fmt.Errorf("源猪栏 %d 不属于源猪群 %d", fromPenID, sourceBatchID) } - // 2. 调用通用辅助方法执行日志记录 + // 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) + // 3. 通过创建批次日志来修改猪群总数,确保数据可追溯 + now := time.Now() + // 3.1 记录源猪群数量减少 + reasonOut := fmt.Sprintf("跨群调栏: %d头猪从批次 %d 调出至批次 %d。备注: %s", quantity, sourceBatchID, destBatchID, remarks) + err = s.updatePigBatchQuantityTx(tx, operatorID, sourceBatchID, models.ChangeTypeTransferOut, -int(quantity), reasonOut, now) + if err != nil { + return fmt.Errorf("更新源猪群 %d 数量失败: %w", sourceBatchID, err) } - if _, _, err := s.pigBatchRepo.UpdatePigBatch(destBatch); err != nil { - return fmt.Errorf("更新目标猪群数量失败: %w", err) + + // 3.2 记录目标猪群数量增加 + reasonIn := fmt.Sprintf("跨群调栏: %d头猪从批次 %d 调入。备注: %s", quantity, sourceBatchID, remarks) + err = s.updatePigBatchQuantityTx(tx, operatorID, destBatchID, models.ChangeTypeTransferIn, int(quantity), reasonIn, now) + if err != nil { + return fmt.Errorf("更新目标猪群 %d 数量失败: %w", destBatchID, err) } return nil