using Microsoft.Extensions.Logging;
using Volo.Abp.Domain.Services;
using Yi.Framework.AiHub.Domain.Entities;
using Yi.Framework.AiHub.Domain.Shared.Enums;
using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.AiHub.Domain.Managers;
///
/// 尊享包管理器
///
public class PremiumPackageManager : DomainService
{
private readonly ISqlSugarRepository _premiumPackageRepository;
private readonly ILogger _logger;
private readonly ISqlSugarRepository _rechargeRepository;
public PremiumPackageManager(
ISqlSugarRepository premiumPackageRepository,
ILogger logger, ISqlSugarRepository rechargeRepository)
{
_premiumPackageRepository = premiumPackageRepository;
_logger = logger;
_rechargeRepository = rechargeRepository;
}
///
/// 为用户创建尊享包
///
/// 用户ID
///
/// 支付金额
///
/// 过期月数,0或null表示永久
///
/// 是否创建订单,如果只购买尊享包,才需要单独创建订单,如果和会员组合一起购买,只需要创建会员套餐订单即可
///
public async Task CreatePremiumPackageAsync(
Guid userId,
long tokenAmount,
string packageName,
decimal totalAmount,
string remark,
int? expireMonths = null,
bool isCreateRechargeRecord = true)
{
var premiumPackage = new PremiumPackageAggregateRoot(userId, tokenAmount, packageName)
{
PurchaseAmount = totalAmount
};
// 设置到期时间
if (expireMonths.HasValue && expireMonths.Value > 0)
{
premiumPackage.SetExpireDateTime(DateTime.Now.AddMonths(expireMonths.Value));
}
await _premiumPackageRepository.InsertAsync(premiumPackage);
if (isCreateRechargeRecord)
{
// 创建充值记录
var rechargeRecord = new AiRechargeAggregateRoot
{
UserId = userId,
RechargeAmount = totalAmount,
Content = packageName,
ExpireDateTime = premiumPackage.ExpireDateTime,
Remark = remark,
ContactInfo = null,
RechargeType = RechargeTypeEnum.PremiumPackage
};
// 保存充值记录到数据库
await _rechargeRepository.InsertAsync(rechargeRecord);
}
_logger.LogInformation(
$"用户 {userId} 购买尊享包成功: {packageName}, Token数量: {tokenAmount}, 金额: {totalAmount}");
return premiumPackage;
}
///
/// 消耗用户尊享包的Token
///
/// 用户ID
/// 需要消耗的Token数量
/// 是否消耗成功
public async Task TryConsumeTokensAsync(Guid userId, long tokenCount)
{
// 获取用户所有可用的尊享包,按剩余token升序排列(优先消耗快用完的)
var availablePackages = await _premiumPackageRepository._DbQueryable
.Where(x => x.UserId == userId && x.IsActive)
.OrderBy(x => x.CreationTime)
.ToListAsync();
if (!availablePackages.Any())
{
_logger.LogWarning($"用户 {userId} 没有可用的尊享包");
return false;
}
// 过滤掉已过期的包
var validPackages = availablePackages
.Where(p => p.IsAvailable())
.ToList();
if (!validPackages.Any())
{
_logger.LogWarning($"用户 {userId} 的尊享包已全部过期");
return false;
}
var firstPackage = validPackages.First();
// 直接扣除最早的token包需要消耗的token,允许扣减到负数
firstPackage.ConsumeTokens(tokenCount);
await _premiumPackageRepository.UpdateAsync(firstPackage);
return true;
}
///
/// 获取用户可用的尊享包总Token数
///
/// 用户ID
/// 可用Token总数
public async Task GetAvailableTokensAsync(Guid userId)
{
return await _premiumPackageRepository._DbQueryable
.Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0)
.Where(p => p.IsActive)
.Where(p => !p.ExpireDateTime.HasValue || p.ExpireDateTime.Value >= DateTime.Now)
.SumAsync(p => p.RemainingTokens);
}
}