Files
Yi.Framework/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Activities/ActivationCodeService.cs
2026-01-01 18:25:43 +08:00

117 lines
3.9 KiB
C#

using Medallion.Threading;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Users;
using Yi.Framework.AiHub.Application.Contracts.Dtos.ActivationCode;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Recharge;
using Yi.Framework.AiHub.Application.Contracts.IServices;
using Yi.Framework.AiHub.Domain.Managers;
using Yi.Framework.AiHub.Domain.Shared.Enums;
namespace Yi.Framework.AiHub.Application.Services;
/// <summary>
/// 激活码服务
/// </summary>
public class ActivationCodeService : ApplicationService, IActivationCodeService
{
private readonly ActivationCodeManager _activationCodeManager;
private readonly IRechargeService _rechargeService;
private readonly PremiumPackageManager _premiumPackageManager;
private IDistributedLockProvider DistributedLock => LazyServiceProvider.LazyGetRequiredService<IDistributedLockProvider>();
public ActivationCodeService(
ActivationCodeManager activationCodeManager,
IRechargeService rechargeService,
PremiumPackageManager premiumPackageManager)
{
_activationCodeManager = activationCodeManager;
_rechargeService = rechargeService;
_premiumPackageManager = premiumPackageManager;
}
/// <summary>
/// 批量生成激活码
/// </summary>
[Authorize]
[HttpPost("activationCode/Batch")]
public async Task<ActivationCodeCreateListOutput> CreateBatchAsync(ActivationCodeCreateListInput input)
{
if (input.Items == null || input.Items.Count == 0)
{
throw new UserFriendlyException("生成列表不能为空");
}
var entities = await _activationCodeManager.CreateBatchAsync(
input.Items.Select(x => (x.GoodsType, x.Count)).ToList());
var outputs = entities
.GroupBy(x => x.GoodsType)
.Select(group => new ActivationCodeCreateOutput
{
GoodsType = group.Key,
Count = group.Count(),
Codes = group.Select(x => x.Code).ToList()
})
.ToList();
return new ActivationCodeCreateListOutput
{
Items = outputs
};
}
/// <summary>
/// 兑换激活码
/// </summary>
[Authorize]
[HttpPost("activationCode/Redeem")]
public async Task<ActivationCodeRedeemOutput> 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;
var goods = redeemContext.Goods;
var packageName = redeemContext.PackageName;
var totalAmount = goods.Price;
if (goods.TokenAmount > 0)
{
await _premiumPackageManager.CreatePremiumPackageAsync(
userId,
goods.TokenAmount,
packageName,
totalAmount,
"激活码兑换",
expireMonths: null,
isCreateRechargeRecord: !goods.IsCombo);
}
if (goods.VipMonths > 0 || goods.VipDays > 0)
{
await _rechargeService.RechargeVipAsync(new RechargeCreateInput
{
UserId = userId,
RechargeAmount = totalAmount,
Content = packageName,
Months = goods.VipMonths,
Days = goods.VipDays,
Remark = "激活码兑换",
ContactInfo = null
});
}
return new ActivationCodeRedeemOutput
{
GoodsType = goodsType,
PackageName = packageName,
Content = packageName
};
}
}