diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs index 2bda12f6..1665cdfd 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/PremiumPackageAggregateRoot.cs @@ -76,23 +76,9 @@ public class PremiumPackageAggregateRoot : FullAuditedAggregateRoot /// 是否消耗成功 public bool ConsumeTokens(long tokenCount) { - if (RemainingTokens < tokenCount) - { - return false; - } - - if (!IsActive) - { - return false; - } - - if (ExpireDateTime.HasValue && ExpireDateTime.Value < DateTime.Now) - { - return false; - } - RemainingTokens -= tokenCount; UsedTokens += tokenCount; + return true; } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs index 5071ab4f..5fd0c875 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/AiGateWayManager.cs @@ -292,7 +292,7 @@ public class AiGateWayManager : DomainService var totalTokens = tokenUsage.TotalTokens ?? 0; if (totalTokens > 0) { - await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens); + await PremiumPackageManager.TryConsumeTokensAsync(userId.Value, totalTokens); } } } @@ -354,7 +354,7 @@ public class AiGateWayManager : DomainService var totalTokens = response.Usage.TotalTokens ?? 0; if (totalTokens > 0) { - await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens); + await PremiumPackageManager.TryConsumeTokensAsync(userId.Value, totalTokens); } } } @@ -547,7 +547,7 @@ public class AiGateWayManager : DomainService var totalTokens = data.TokenUsage.TotalTokens ?? 0; if (totalTokens > 0) { - await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens); + await PremiumPackageManager.TryConsumeTokensAsync(userId.Value, totalTokens); } } @@ -650,11 +650,7 @@ public class AiGateWayManager : DomainService var totalTokens = tokenUsage.TotalTokens ?? 0; if (totalTokens > 0) { - var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens); - if (!consumeSuccess) - { - _logger.LogWarning($"用户 {userId.Value} 尊享token包扣减失败,消耗token数: {totalTokens}"); - } + await PremiumPackageManager.TryConsumeTokensAsync(userId.Value, totalTokens); } } } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/PremiumPackageManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/PremiumPackageManager.cs index 73c5f02f..312c3f39 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/PremiumPackageManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/PremiumPackageManager.cs @@ -69,12 +69,12 @@ public class PremiumPackageManager : DomainService /// 用户ID /// 需要消耗的Token数量 /// 是否消耗成功 - public async Task ConsumeTokensAsync(Guid userId, long tokenCount) + public async Task TryConsumeTokensAsync(Guid userId, long tokenCount) { // 获取用户所有可用的尊享包,按剩余token升序排列(优先消耗快用完的) var availablePackages = await _premiumPackageRepository._DbQueryable .Where(x => x.UserId == userId && x.IsActive) - .OrderBy(x => x.RemainingTokens) + .OrderBy(x => x.CreationTime) .ToListAsync(); if (!availablePackages.Any()) @@ -94,34 +94,12 @@ public class PremiumPackageManager : DomainService return false; } - // 计算总可用Token - var totalAvailableTokens = validPackages.Sum(p => p.RemainingTokens); - if (totalAvailableTokens < tokenCount) - { - _logger.LogWarning( - $"用户 {userId} 尊享包Token不足,需要: {tokenCount}, 可用: {totalAvailableTokens},将扣减到负数"); - } + var firstPackage = validPackages.First(); + // 直接扣除最早的token包需要消耗的token,允许扣减到负数 + firstPackage.ConsumeTokens(tokenCount); + await _premiumPackageRepository.UpdateAsync(firstPackage); - // 从可用的包中逐个扣除Token,允许扣减到负数 - var remainingToConsume = tokenCount; - foreach (var package in validPackages) - { - if (remainingToConsume <= 0) - break; - - // 直接扣除剩余需要消耗的token,允许扣减到负数 - var toConsume = remainingToConsume; - if (package.ConsumeTokens(toConsume)) - { - await _premiumPackageRepository.UpdateAsync(package); - remainingToConsume -= toConsume; - - _logger.LogInformation( - $"用户 {userId} 从尊享包 {package.Id} 消耗 {toConsume} tokens, 剩余: {package.RemainingTokens}"); - } - } - - return remainingToConsume == 0; + return true; } /// @@ -137,46 +115,4 @@ public class PremiumPackageManager : DomainService .Where(p => !p.ExpireDateTime.HasValue || p.ExpireDateTime.Value >= DateTime.Now) .SumAsync(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; - } } \ No newline at end of file