fix: 允许尊享包扣减到负数并优化Token统计逻辑

This commit is contained in:
ccnetcore
2025-10-12 21:12:21 +08:00
parent d32906702a
commit 754f145559
2 changed files with 9 additions and 12 deletions

View File

@@ -516,7 +516,7 @@ public class AiGateWayManager : DomainService
await _usageStatisticsManager.SetUsageAsync(userId.Value, request.Model, data.TokenUsage); await _usageStatisticsManager.SetUsageAsync(userId.Value, request.Model, data.TokenUsage);
// 扣减尊享token包用量 // 扣减尊享token包用量
var totalTokens = (data.TokenUsage?.InputTokens ?? 0) + (data.TokenUsage?.OutputTokens ?? 0); var totalTokens = data.TokenUsage.TotalTokens??0;
if (totalTokens > 0) if (totalTokens > 0)
{ {
var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens); var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens);

View File

@@ -73,7 +73,7 @@ public class PremiumPackageManager : DomainService
{ {
// 获取用户所有可用的尊享包按剩余token升序排列优先消耗快用完的 // 获取用户所有可用的尊享包按剩余token升序排列优先消耗快用完的
var availablePackages = await _premiumPackageRepository._DbQueryable var availablePackages = await _premiumPackageRepository._DbQueryable
.Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0) .Where(x => x.UserId == userId && x.IsActive)
.OrderBy(x => x.RemainingTokens) .OrderBy(x => x.RemainingTokens)
.ToListAsync(); .ToListAsync();
@@ -99,18 +99,18 @@ public class PremiumPackageManager : DomainService
if (totalAvailableTokens < tokenCount) if (totalAvailableTokens < tokenCount)
{ {
_logger.LogWarning( _logger.LogWarning(
$"用户 {userId} 尊享包Token不足需要: {tokenCount}, 可用: {totalAvailableTokens}"); $"用户 {userId} 尊享包Token不足需要: {tokenCount}, 可用: {totalAvailableTokens},将扣减到负数");
return false;
} }
// 从可用的包中逐个扣除Token // 从可用的包中逐个扣除Token,允许扣减到负数
var remainingToConsume = tokenCount; var remainingToConsume = tokenCount;
foreach (var package in validPackages) foreach (var package in validPackages)
{ {
if (remainingToConsume <= 0) if (remainingToConsume <= 0)
break; break;
var toConsume = Math.Min(remainingToConsume, package.RemainingTokens); // 直接扣除剩余需要消耗的token允许扣减到负数
var toConsume = remainingToConsume;
if (package.ConsumeTokens(toConsume)) if (package.ConsumeTokens(toConsume))
{ {
await _premiumPackageRepository.UpdateAsync(package); await _premiumPackageRepository.UpdateAsync(package);
@@ -131,13 +131,10 @@ public class PremiumPackageManager : DomainService
/// <returns>可用Token总数</returns> /// <returns>可用Token总数</returns>
public async Task<long> GetAvailableTokensAsync(Guid userId) public async Task<long> GetAvailableTokensAsync(Guid userId)
{ {
var packages = await _premiumPackageRepository._DbQueryable return await _premiumPackageRepository._DbQueryable
.Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0) .Where(x => x.UserId == userId && x.IsActive && x.RemainingTokens > 0)
.ToListAsync();
return packages
.Where(p => p.IsAvailable()) .Where(p => p.IsAvailable())
.Sum(p => p.RemainingTokens); .SumAsync(p => p.RemainingTokens);
} }
/// <summary> /// <summary>