fix: 允许尊享包扣减到负数并优化Token统计逻辑
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -181,4 +178,4 @@ public class PremiumPackageManager : DomainService
|
|||||||
_logger.LogInformation($"成功停用 {expiredPackages.Count} 个过期的尊享包");
|
_logger.LogInformation($"成功停用 {expiredPackages.Count} 个过期的尊享包");
|
||||||
return expiredPackages.Count;
|
return expiredPackages.Count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user