diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/ActivationCodeService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/ActivationCodeService.cs index 009af46e..799e8764 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/ActivationCodeService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/ActivationCodeService.cs @@ -1,3 +1,4 @@ +using Medallion.Threading; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Volo.Abp; @@ -19,7 +20,7 @@ public class ActivationCodeService : ApplicationService, IActivationCodeService private readonly ActivationCodeManager _activationCodeManager; private readonly IRechargeService _rechargeService; private readonly PremiumPackageManager _premiumPackageManager; - + private IDistributedLockProvider DistributedLock => LazyServiceProvider.LazyGetRequiredService(); public ActivationCodeService( ActivationCodeManager activationCodeManager, IRechargeService rechargeService, @@ -68,6 +69,10 @@ public class ActivationCodeService : ApplicationService, IActivationCodeService [HttpPost("activationCode/Redeem")] public async Task RedeemAsync(ActivationCodeRedeemInput input) { + //自旋等待,防抖 + await using var handle = + await DistributedLock.AcquireLockAsync($"Yi:AiHub:ActivationCodeLock:{input.Code}"); + var userId = CurrentUser.GetId(); var redeemContext = await _activationCodeManager.RedeemAsync(userId, input.Code); var goodsType = redeemContext.ActivationCode.GoodsType; diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Activities/DailyTaskService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Activities/DailyTaskService.cs index 6bf90d36..013a82f4 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Activities/DailyTaskService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Activities/DailyTaskService.cs @@ -1,3 +1,4 @@ +using Medallion.Threading; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using SqlSugar; @@ -23,7 +24,7 @@ public class DailyTaskService : ApplicationService private readonly ISqlSugarRepository _messageRepository; private readonly ISqlSugarRepository _premiumPackageRepository; private readonly ILogger _logger; - + private IDistributedLockProvider DistributedLock => LazyServiceProvider.LazyGetRequiredService(); // 任务配置 private readonly Dictionary _taskConfigs = new() @@ -113,6 +114,11 @@ public class DailyTaskService : ApplicationService public async Task ClaimTaskRewardAsync(ClaimTaskRewardInput input) { var userId = CurrentUser.GetId(); + //自旋等待,防抖 + await using var handle = + await DistributedLock.AcquireLockAsync($"Yi:AiHub:ClaimTaskRewardLock:{userId}"); + + var today = DateTime.Today; // 1. 验证任务等级