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);
// 扣减尊享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);

View File

@@ -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>