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; public PremiumPackageManager( ISqlSugarRepository premiumPackageRepository, ILogger logger) { _premiumPackageRepository = premiumPackageRepository; _logger = logger; } /// /// 为用户创建尊享包 /// /// 用户ID /// 商品类型 /// 支付金额 /// 过期月数,0或null表示永久 /// public async Task CreatePremiumPackageAsync( Guid userId, GoodsTypeEnum goodsType, decimal totalAmount, int? expireMonths = null) { if (!goodsType.IsPremiumPackage()) { throw new UserFriendlyException($"商品类型 {goodsType} 不是尊享包商品"); } var tokenAmount = goodsType.GetTokenAmount(); var packageName = goodsType.GetDisplayName(); 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); _logger.LogInformation( $"用户 {userId} 购买尊享包成功: {packageName}, Token数量: {tokenAmount}, 金额: {totalAmount}"); return premiumPackage; } /// /// 消耗用户尊享包的Token /// /// 用户ID /// 需要消耗的Token数量 /// 是否消耗成功 public async Task ConsumeTokensAsync(Guid userId, long tokenCount) { // 获取用户所有可用的尊享包,按剩余token升序排列(优先消耗快用完的) var availablePackages = await _premiumPackageRepository._DbQueryable .Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0) .OrderBy(x => x.RemainingTokens) .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; } // 计算总可用Token var totalAvailableTokens = validPackages.Sum(p => p.RemainingTokens); if (totalAvailableTokens < tokenCount) { _logger.LogWarning( $"用户 {userId} 尊享包Token不足,需要: {tokenCount}, 可用: {totalAvailableTokens}"); return false; } // 从可用的包中逐个扣除Token var remainingToConsume = tokenCount; foreach (var package in validPackages) { if (remainingToConsume <= 0) break; var toConsume = Math.Min(remainingToConsume, package.RemainingTokens); if (package.ConsumeTokens(toConsume)) { await _premiumPackageRepository.UpdateAsync(package); remainingToConsume -= toConsume; _logger.LogInformation( $"用户 {userId} 从尊享包 {package.Id} 消耗 {toConsume} tokens, 剩余: {package.RemainingTokens}"); } } return remainingToConsume == 0; } /// /// 获取用户可用的尊享包总Token数 /// /// 用户ID /// 可用Token总数 public async Task GetAvailableTokensAsync(Guid userId) { var packages = await _premiumPackageRepository._DbQueryable .Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0) .ToListAsync(); return packages .Where(p => p.IsAvailable()) .Sum(p => p.RemainingTokens); } /// /// 获取用户的所有尊享包 /// /// 用户ID /// 尊享包列表 public async Task> GetUserPremiumPackagesAsync(Guid userId) { return await _premiumPackageRepository._DbQueryable .Where(x => x.UserId == userId) .OrderByDescending(x => x.CreationTime) .ToListAsync(); } /// /// 停用过期的尊享包 /// /// 停用的包数量 public async Task DeactivateExpiredPackagesAsync() { _logger.LogInformation("开始执行尊享包过期自动停用任务"); var now = DateTime.Now; var expiredPackages = await _premiumPackageRepository._DbQueryable .Where(x => x.IsActive && x.ExpireDateTime.HasValue && x.ExpireDateTime.Value < now) .ToListAsync(); if (!expiredPackages.Any()) { _logger.LogInformation("没有找到过期的尊享包"); return 0; } foreach (var package in expiredPackages) { package.Deactivate(); await _premiumPackageRepository.UpdateAsync(package); } _logger.LogInformation($"成功停用 {expiredPackages.Count} 个过期的尊享包"); return expiredPackages.Count; } }