diff --git a/internal/controller/studio_controller.go b/internal/controller/studio_controller.go index ae9f593..2cd9ad6 100644 --- a/internal/controller/studio_controller.go +++ b/internal/controller/studio_controller.go @@ -1,8 +1,10 @@ package controller import ( + "log" "net/http" "strconv" + "time" "metazone.cc/metalab/internal/common" "metazone.cc/metalab/internal/model" @@ -349,9 +351,21 @@ func (ctrl *StudioController) Delete(c *gin.Context) { return } - // 删稿扣作者域能(无视负数,静默失败) + // 删稿扣作者域能(无视负数,有限重试后静默忽略) if ctrl.energySvc != nil { - _ = ctrl.energySvc.DeductOnDeletePost(authorID, uint(id)) + const maxRetries = 3 + backoff := 100 * time.Millisecond + for i := 0; i < maxRetries; i++ { + if err := ctrl.energySvc.DeductOnDeletePost(authorID, uint(id)); err == nil { + break + } + if i < maxRetries-1 { + time.Sleep(backoff) + backoff *= 2 + } else { + log.Printf("删稿扣域能失败(user=%d, post=%d): %v", authorID, id, err) + } + } } common.OkMessage(c, "删除成功") diff --git a/internal/service/energy_service.go b/internal/service/energy_service.go index 3b1b386..3b89efd 100644 --- a/internal/service/energy_service.go +++ b/internal/service/energy_service.go @@ -254,20 +254,25 @@ func (s *EnergyService) RefundOnRenameReject(userID uint) error { } // DeductOnDeletePost 删稿扣域能(扣文章作者的域能,无视负数) +// 事务包裹:确保扣域能 + 写流水原子性 func (s *EnergyService) DeductOnDeletePost(authorUserID uint, postID uint) error { - if err := s.repo.AddEnergy(authorUserID, EnergyDeletePost); err != nil { - return fmt.Errorf("扣减删稿域能失败: %w", err) - } + return s.db.Transaction(func(tx *gorm.DB) error { + txRepo := s.repo.WithTx(tx) - log := &model.EnergyLog{ - UserID: authorUserID, - Amount: EnergyDeletePost, - Type: model.EnergyTypeDeletePost, - RelatedType: "post", - RelatedID: postID, - Description: "删除文章消耗 2.0 域能", - } - return s.repo.CreateEnergyLog(log) + if err := txRepo.AddEnergy(authorUserID, EnergyDeletePost); err != nil { + return fmt.Errorf("扣减删稿域能失败: %w", err) + } + + log := &model.EnergyLog{ + UserID: authorUserID, + Amount: EnergyDeletePost, + Type: model.EnergyTypeDeletePost, + RelatedType: "post", + RelatedID: postID, + Description: "删除文章消耗 2.0 域能", + } + return txRepo.CreateEnergyLog(log) + }) } // AdminAdjust 后台调整用户域能