提取修改猪群数量逻辑
This commit is contained in:
@@ -24,6 +24,8 @@ var (
|
||||
ErrPenNotFound = errors.New("指定的猪栏不存在")
|
||||
// ErrPenNotAssociatedWithBatch 表示猪栏未与该批次关联
|
||||
ErrPenNotAssociatedWithBatch = errors.New("猪栏未与该批次关联")
|
||||
// ErrInvalidOperation 非法操作
|
||||
ErrInvalidOperation = errors.New("非法操作")
|
||||
)
|
||||
|
||||
// --- 领域服务接口 ---
|
||||
@@ -51,4 +53,6 @@ type PigBatchService interface {
|
||||
SellPigs(batchID uint, quantity int, unitPrice float64, tatalPrice float64, traderName string, tradeDate time.Time, remarks string, operatorID uint) error
|
||||
// BuyPigs 处理买猪的业务逻辑。
|
||||
BuyPigs(batchID 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
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ func (s *pigBatchService) CreatePigBatch(operatorID uint, batch *models.PigBatch
|
||||
}
|
||||
|
||||
// 3. 记录批次日志
|
||||
if err := s.pigBatchLogRepo.Create(tx, initialLog); err != nil {
|
||||
if err := s.pigBatchLogRepo.CreateTx(tx, initialLog); err != nil {
|
||||
return fmt.Errorf("记录初始批次日志失败: %w", err)
|
||||
}
|
||||
|
||||
@@ -274,3 +274,33 @@ func (s *pigBatchService) getCurrentPigQuantityTx(tx *gorm.DB, batchID uint) (in
|
||||
// 3. 如果找到最后一条日志,则当前数量为该日志的 AfterCount
|
||||
return lastLog.AfterCount, nil
|
||||
}
|
||||
|
||||
func (s *pigBatchService) UpdatePigBatchQuantity(operatorID uint, batchID uint, changeType models.LogChangeType, changeAmount int, changeReason string, happenedAt time.Time) error {
|
||||
return s.uow.ExecuteInTransaction(func(tx *gorm.DB) error {
|
||||
return s.updatePigBatchQuantityTx(tx, operatorID, batchID, changeType, changeAmount, changeReason, happenedAt)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *pigBatchService) updatePigBatchQuantityTx(tx *gorm.DB, operatorID uint, batchID uint, changeType models.LogChangeType, changeAmount int, changeReason string, happenedAt time.Time) error {
|
||||
lastLog, err := s.pigBatchLogRepo.GetLastLogByBatchIDTx(tx, batchID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// 检查数量不应该减到小于零
|
||||
if changeAmount < 0 {
|
||||
if lastLog.AfterCount+changeAmount < 0 {
|
||||
return ErrInvalidOperation
|
||||
}
|
||||
}
|
||||
pigBatchLog := &models.PigBatchLog{
|
||||
PigBatchID: batchID,
|
||||
ChangeType: changeType,
|
||||
ChangeCount: changeAmount,
|
||||
Reason: changeReason,
|
||||
BeforeCount: lastLog.AfterCount,
|
||||
AfterCount: lastLog.AfterCount + changeAmount,
|
||||
OperatorID: operatorID,
|
||||
HappenedAt: happenedAt,
|
||||
}
|
||||
return s.pigBatchLogRepo.CreateTx(tx, pigBatchLog)
|
||||
}
|
||||
|
||||
@@ -51,18 +51,10 @@ func (s *pigBatchService) SellPigs(batchID uint, quantity int, unitPrice float64
|
||||
}
|
||||
|
||||
// 4. 记录批次日志
|
||||
log := &models.PigBatchLog{
|
||||
PigBatchID: batchID,
|
||||
HappenedAt: time.Now(),
|
||||
ChangeType: models.ChangeTypeSale,
|
||||
ChangeCount: -quantity,
|
||||
Reason: fmt.Sprintf("猪批次 %d 销售 %d 头猪给 %s", batchID, quantity, traderName),
|
||||
BeforeCount: currentQuantity,
|
||||
AfterCount: currentQuantity - quantity,
|
||||
OperatorID: operatorID,
|
||||
}
|
||||
if err := s.pigBatchLogRepo.Create(tx, log); err != nil {
|
||||
return fmt.Errorf("记录销售批次日志失败: %w", err)
|
||||
if err := s.updatePigBatchQuantityTx(tx, operatorID, batchID, models.ChangeTypeSale, -quantity,
|
||||
fmt.Sprintf("猪批次 %d 销售 %d 头猪给 %s", batchID, quantity, traderName),
|
||||
tradeDate); err != nil {
|
||||
return fmt.Errorf("更新猪批次数量失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -85,12 +77,6 @@ func (s *pigBatchService) BuyPigs(batchID uint, quantity int, unitPrice float64,
|
||||
return fmt.Errorf("获取猪批次 %d 信息失败: %w", batchID, err)
|
||||
}
|
||||
|
||||
// 2. 获取当前猪批次数量
|
||||
currentQuantity, err := s.getCurrentPigQuantityTx(tx, batchID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("获取猪批次 %d 当前数量失败: %w", batchID, err)
|
||||
}
|
||||
|
||||
// 3. 记录采购交易
|
||||
purchase := &models.PigPurchase{
|
||||
PigBatchID: batchID,
|
||||
@@ -107,18 +93,10 @@ func (s *pigBatchService) BuyPigs(batchID uint, quantity int, unitPrice float64,
|
||||
}
|
||||
|
||||
// 4. 记录批次日志
|
||||
log := &models.PigBatchLog{
|
||||
PigBatchID: batchID,
|
||||
HappenedAt: time.Now(),
|
||||
ChangeType: models.ChangeTypeBuy,
|
||||
ChangeCount: quantity,
|
||||
Reason: fmt.Sprintf("猪批次 %d 采购 %d 头猪从 %s", batchID, quantity, traderName),
|
||||
BeforeCount: currentQuantity,
|
||||
AfterCount: currentQuantity + quantity,
|
||||
OperatorID: operatorID,
|
||||
}
|
||||
if err := s.pigBatchLogRepo.Create(tx, log); err != nil {
|
||||
return fmt.Errorf("记录采购批次日志失败: %w", err)
|
||||
if err := s.updatePigBatchQuantityTx(tx, operatorID, batchID, models.ChangeTypeBuy, quantity,
|
||||
fmt.Sprintf("猪批次 %d 采购 %d 头猪从 %s", batchID, quantity, traderName),
|
||||
tradeDate); err != nil {
|
||||
return fmt.Errorf("更新猪批次数量失败: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user