fix: 允许尊享包扣减到负数并优化Token统计逻辑
This commit is contained in:
@@ -516,7 +516,7 @@ public class AiGateWayManager : DomainService
|
||||
await _usageStatisticsManager.SetUsageAsync(userId.Value, request.Model, data.TokenUsage);
|
||||
|
||||
// 扣减尊享token包用量
|
||||
var totalTokens = (data.TokenUsage?.InputTokens ?? 0) + (data.TokenUsage?.OutputTokens ?? 0);
|
||||
var totalTokens = data.TokenUsage.TotalTokens??0;
|
||||
if (totalTokens > 0)
|
||||
{
|
||||
var consumeSuccess = await PremiumPackageManager.ConsumeTokensAsync(userId.Value, totalTokens);
|
||||
|
||||
@@ -73,7 +73,7 @@ public class PremiumPackageManager : DomainService
|
||||
{
|
||||
// 获取用户所有可用的尊享包,按剩余token升序排列(优先消耗快用完的)
|
||||
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)
|
||||
.ToListAsync();
|
||||
|
||||
@@ -99,18 +99,18 @@ public class PremiumPackageManager : DomainService
|
||||
if (totalAvailableTokens < tokenCount)
|
||||
{
|
||||
_logger.LogWarning(
|
||||
$"用户 {userId} 尊享包Token不足,需要: {tokenCount}, 可用: {totalAvailableTokens}");
|
||||
return false;
|
||||
$"用户 {userId} 尊享包Token不足,需要: {tokenCount}, 可用: {totalAvailableTokens},将扣减到负数");
|
||||
}
|
||||
|
||||
// 从可用的包中逐个扣除Token
|
||||
// 从可用的包中逐个扣除Token,允许扣减到负数
|
||||
var remainingToConsume = tokenCount;
|
||||
foreach (var package in validPackages)
|
||||
{
|
||||
if (remainingToConsume <= 0)
|
||||
break;
|
||||
|
||||
var toConsume = Math.Min(remainingToConsume, package.RemainingTokens);
|
||||
// 直接扣除剩余需要消耗的token,允许扣减到负数
|
||||
var toConsume = remainingToConsume;
|
||||
if (package.ConsumeTokens(toConsume))
|
||||
{
|
||||
await _premiumPackageRepository.UpdateAsync(package);
|
||||
@@ -131,13 +131,10 @@ public class PremiumPackageManager : DomainService
|
||||
/// <returns>可用Token总数</returns>
|
||||
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)
|
||||
.ToListAsync();
|
||||
|
||||
return packages
|
||||
.Where(p => p.IsAvailable())
|
||||
.Sum(p => p.RemainingTokens);
|
||||
.SumAsync(p => p.RemainingTokens);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -181,4 +178,4 @@ public class PremiumPackageManager : DomainService
|
||||
_logger.LogInformation($"成功停用 {expiredPackages.Count} 个过期的尊享包");
|
||||
return expiredPackages.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user