From efbe7d167c117708e6f6c9ae59190964b1bdedf3 Mon Sep 17 00:00:00 2001 From: huang <1724659546@qq.com> Date: Mon, 6 Oct 2025 17:44:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0AssignEmptyPensToBatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/domain/pig/pig_batch.go | 12 ++-- .../pig/pig_batch_service_pen_transfer.go | 57 +++++++++++++++++++ 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/internal/domain/pig/pig_batch.go b/internal/domain/pig/pig_batch.go index 26eca87..4576d7e 100644 --- a/internal/domain/pig/pig_batch.go +++ b/internal/domain/pig/pig_batch.go @@ -46,21 +46,25 @@ type PigBatchService interface { ListPigBatches(isActive *bool) ([]*models.PigBatch, error) // UpdatePigBatchPens 更新猪批次关联的猪栏。 UpdatePigBatchPens(batchID uint, desiredPenIDs []uint) error + // AssignEmptyPensToBatch 为猪群分配空栏 + AssignEmptyPensToBatch(batchID uint, penIDs []uint, operatorID uint) error + // MovePigsIntoPen 将猪只从“虚拟库存”移入指定猪栏 + MovePigsIntoPen(batchID uint, toPenID uint, quantity int, operatorID uint, remarks string) error + // ReclassifyPenToNewBatch 连猪带栏,整体划拨到另一个猪群 + ReclassifyPenToNewBatch(fromBatchID uint, toBatchID uint, penID uint, operatorID uint, remarks string) error // 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 - // 调栏子服务 - + // ---调栏子服务 --- 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 } diff --git a/internal/domain/pig/pig_batch_service_pen_transfer.go b/internal/domain/pig/pig_batch_service_pen_transfer.go index 95cefa1..2c6b7f6 100644 --- a/internal/domain/pig/pig_batch_service_pen_transfer.go +++ b/internal/domain/pig/pig_batch_service_pen_transfer.go @@ -158,3 +158,60 @@ func (s *pigBatchService) TransferPigsAcrossBatches(sourceBatchID uint, destBatc return nil }) } + +// AssignEmptyPensToBatch 为猪群分配空栏 +func (s *pigBatchService) AssignEmptyPensToBatch(batchID uint, penIDs []uint, operatorID uint) error { + return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error { + // 1. 验证猪批次是否存在且活跃 + pigBatch, err := s.pigBatchRepo.GetPigBatchByIDTx(tx, batchID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return ErrPigBatchNotFound + } + return fmt.Errorf("获取猪批次信息失败: %w", err) + } + if !pigBatch.IsActive() { + return ErrPigBatchNotActive + } + + // 2. 遍历并校验每一个待分配的猪栏 + for _, penID := range penIDs { + pen, err := s.transferSvc.GetPenByID(tx, penID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return fmt.Errorf("猪栏 %d 不存在: %w", penID, ErrPenNotFound) + } + return fmt.Errorf("获取猪栏 %d 信息失败: %w", penID, err) + } + + // 核心业务规则:校验猪栏是否完全空闲 + if pen.Status != models.PenStatusEmpty { + return fmt.Errorf("猪栏 %s 状态不为空 (%s),无法分配", pen.PenNumber, pen.Status) + } + if pen.PigBatchID != nil { + return fmt.Errorf("猪栏 %s 已被其他批次 %d 占用,无法分配", pen.PenNumber, *pen.PigBatchID) + } + + // 3. 更新猪栏的归属 + updates := map[string]interface{}{ + "pig_batch_id": &batchID, + "status": models.PenStatusOccupied, + } + if err := s.transferSvc.UpdatePenFields(tx, penID, updates); err != nil { + return fmt.Errorf("分配猪栏 %d 失败: %w", penID, err) + } + } + + return nil + }) +} + +// MovePigsIntoPen 将猪只从“虚拟库存”移入指定猪栏 +func (s *pigBatchService) MovePigsIntoPen(batchID uint, toPenID uint, quantity int, operatorID uint, remarks string) error { + panic("implement me") +} + +// ReclassifyPenToNewBatch 连猪带栏,整体划拨到另一个猪群 +func (s *pigBatchService) ReclassifyPenToNewBatch(fromBatchID uint, toBatchID uint, penID uint, operatorID uint, remarks string) error { + panic("implement me") +}