feat: 今日模型使用统计返回模型图标信息
为 GetTodayModelUsage 接口补充模型图标数据,新增 ModelTodayUsageDto.IconUrl 字段 通过 ModelManager 查询已启用模型的 IconUrl 并映射到结果中 同时统一部分代码格式,提升可读性
This commit is contained in:
@@ -19,4 +19,9 @@ public class ModelTodayUsageDto
|
|||||||
/// 今日消耗总Token数
|
/// 今日消耗总Token数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public long TotalTokens { get; set; }
|
public long TotalTokens { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 模型图标URL
|
||||||
|
/// </summary>
|
||||||
|
public string? IconUrl { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
private readonly ISqlSugarRepository<PremiumPackageAggregateRoot> _premiumPackageRepository;
|
private readonly ISqlSugarRepository<PremiumPackageAggregateRoot> _premiumPackageRepository;
|
||||||
private readonly ISqlSugarRepository<TokenAggregateRoot> _tokenRepository;
|
private readonly ISqlSugarRepository<TokenAggregateRoot> _tokenRepository;
|
||||||
private readonly ModelManager _modelManager;
|
private readonly ModelManager _modelManager;
|
||||||
|
|
||||||
public UsageStatisticsService(
|
public UsageStatisticsService(
|
||||||
ISqlSugarRepository<MessageAggregateRoot> messageRepository,
|
ISqlSugarRepository<MessageAggregateRoot> messageRepository,
|
||||||
ISqlSugarRepository<UsageStatisticsAggregateRoot> usageStatisticsRepository,
|
ISqlSugarRepository<UsageStatisticsAggregateRoot> usageStatisticsRepository,
|
||||||
@@ -48,7 +49,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
/// 获取当前用户近7天的Token消耗统计
|
/// 获取当前用户近7天的Token消耗统计
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>每日Token使用量列表</returns>
|
/// <returns>每日Token使用量列表</returns>
|
||||||
public async Task<List<DailyTokenUsageDto>> GetLast7DaysTokenUsageAsync([FromQuery]UsageStatisticsGetInput input)
|
public async Task<List<DailyTokenUsageDto>> GetLast7DaysTokenUsageAsync([FromQuery] UsageStatisticsGetInput input)
|
||||||
{
|
{
|
||||||
var userId = CurrentUser.GetId();
|
var userId = CurrentUser.GetId();
|
||||||
var endDate = DateTime.Today;
|
var endDate = DateTime.Today;
|
||||||
@@ -59,7 +60,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
.Where(x => x.UserId == userId)
|
.Where(x => x.UserId == userId)
|
||||||
.Where(x => x.Role == "system")
|
.Where(x => x.Role == "system")
|
||||||
.Where(x => x.CreationTime >= startDate && x.CreationTime < endDate.AddDays(1))
|
.Where(x => x.CreationTime >= startDate && x.CreationTime < endDate.AddDays(1))
|
||||||
.WhereIF(input.TokenId.HasValue,x => x.TokenId == input.TokenId)
|
.WhereIF(input.TokenId.HasValue, x => x.TokenId == input.TokenId)
|
||||||
.GroupBy(x => x.CreationTime.Date)
|
.GroupBy(x => x.CreationTime.Date)
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
@@ -89,14 +90,14 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
/// 获取当前用户各个模型的Token消耗量及占比
|
/// 获取当前用户各个模型的Token消耗量及占比
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>模型Token使用量列表</returns>
|
/// <returns>模型Token使用量列表</returns>
|
||||||
public async Task<List<ModelTokenUsageDto>> GetModelTokenUsageAsync([FromQuery]UsageStatisticsGetInput input)
|
public async Task<List<ModelTokenUsageDto>> GetModelTokenUsageAsync([FromQuery] UsageStatisticsGetInput input)
|
||||||
{
|
{
|
||||||
var userId = CurrentUser.GetId();
|
var userId = CurrentUser.GetId();
|
||||||
|
|
||||||
// 从UsageStatistics表获取各模型的token消耗统计(按ModelId聚合,因为同一模型可能有多个TokenId的记录)
|
// 从UsageStatistics表获取各模型的token消耗统计(按ModelId聚合,因为同一模型可能有多个TokenId的记录)
|
||||||
var modelUsages = await _usageStatisticsRepository._DbQueryable
|
var modelUsages = await _usageStatisticsRepository._DbQueryable
|
||||||
.Where(x => x.UserId == userId)
|
.Where(x => x.UserId == userId)
|
||||||
.WhereIF(input.TokenId.HasValue,x => x.TokenId == input.TokenId)
|
.WhereIF(input.TokenId.HasValue, x => x.TokenId == input.TokenId)
|
||||||
.GroupBy(x => x.ModelId)
|
.GroupBy(x => x.ModelId)
|
||||||
.Select(x => new
|
.Select(x => new
|
||||||
{
|
{
|
||||||
@@ -221,7 +222,9 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
var result = tokenUsages.Select(x => new TokenPremiumUsageDto
|
var result = tokenUsages.Select(x => new TokenPremiumUsageDto
|
||||||
{
|
{
|
||||||
TokenId = x.TokenId,
|
TokenId = x.TokenId,
|
||||||
TokenName = x.TokenId == Guid.Empty ? "默认" : (tokenNameDict.TryGetValue(x.TokenId, out var name) ? name : "其他"),
|
TokenName = x.TokenId == Guid.Empty
|
||||||
|
? "默认"
|
||||||
|
: (tokenNameDict.TryGetValue(x.TokenId, out var name) ? name : "其他"),
|
||||||
Tokens = x.TotalTokenCount,
|
Tokens = x.TotalTokenCount,
|
||||||
Percentage = totalTokens > 0 ? Math.Round((decimal)x.TotalTokenCount / totalTokens * 100, 2) : 0
|
Percentage = totalTokens > 0 ? Math.Round((decimal)x.TotalTokenCount / totalTokens * 100, 2) : 0
|
||||||
}).OrderByDescending(x => x.Tokens).ToList();
|
}).OrderByDescending(x => x.Tokens).ToList();
|
||||||
@@ -233,7 +236,8 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
/// 获取当前用户近24小时每小时Token消耗统计(柱状图)
|
/// 获取当前用户近24小时每小时Token消耗统计(柱状图)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>每小时Token使用量列表,包含各模型堆叠数据</returns>
|
/// <returns>每小时Token使用量列表,包含各模型堆叠数据</returns>
|
||||||
public async Task<List<HourlyTokenUsageDto>> GetLast24HoursTokenUsageAsync([FromQuery]UsageStatisticsGetInput input)
|
public async Task<List<HourlyTokenUsageDto>> GetLast24HoursTokenUsageAsync(
|
||||||
|
[FromQuery] UsageStatisticsGetInput input)
|
||||||
{
|
{
|
||||||
var userId = CurrentUser.GetId();
|
var userId = CurrentUser.GetId();
|
||||||
var now = DateTime.Now;
|
var now = DateTime.Now;
|
||||||
@@ -258,7 +262,8 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
var hourlyGrouped = messages
|
var hourlyGrouped = messages
|
||||||
.GroupBy(x => new
|
.GroupBy(x => new
|
||||||
{
|
{
|
||||||
Hour = new DateTime(x.CreationTime.Year, x.CreationTime.Month, x.CreationTime.Day, x.CreationTime.Hour, 0, 0),
|
Hour = new DateTime(x.CreationTime.Year, x.CreationTime.Month, x.CreationTime.Day, x.CreationTime.Hour,
|
||||||
|
0, 0),
|
||||||
x.ModelId
|
x.ModelId
|
||||||
})
|
})
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
@@ -297,7 +302,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
/// 获取当前用户今日各模型使用量统计(卡片列表)
|
/// 获取当前用户今日各模型使用量统计(卡片列表)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>模型今日使用量列表,包含使用次数和总Token</returns>
|
/// <returns>模型今日使用量列表,包含使用次数和总Token</returns>
|
||||||
public async Task<List<ModelTodayUsageDto>> GetTodayModelUsageAsync([FromQuery]UsageStatisticsGetInput input)
|
public async Task<List<ModelTodayUsageDto>> GetTodayModelUsageAsync([FromQuery] UsageStatisticsGetInput input)
|
||||||
{
|
{
|
||||||
var userId = CurrentUser.GetId();
|
var userId = CurrentUser.GetId();
|
||||||
var todayStart = DateTime.Today; // 今天凌晨0点
|
var todayStart = DateTime.Today; // 今天凌晨0点
|
||||||
@@ -328,6 +333,22 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
|
|||||||
.OrderByDescending(x => x.TotalTokens)
|
.OrderByDescending(x => x.TotalTokens)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
if (modelStats.Count > 0)
|
||||||
|
{
|
||||||
|
var modelIds = modelStats.Select(x => x.ModelId).ToList();
|
||||||
|
var modelDic = await _modelManager._aiModelRepository._DbQueryable.Where(x => modelIds.Contains(x.ModelId))
|
||||||
|
.Distinct()
|
||||||
|
.Where(x=>x.IsEnabled)
|
||||||
|
.ToDictionaryAsync<string>(x => x.ModelId, y => y.IconUrl);
|
||||||
|
modelStats.ForEach(x =>
|
||||||
|
{
|
||||||
|
if (modelDic.TryGetValue(x.ModelId, out var icon))
|
||||||
|
{
|
||||||
|
x.IconUrl = icon;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return modelStats;
|
return modelStats;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -11,7 +11,7 @@ namespace Yi.Framework.AiHub.Domain.Managers;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ModelManager : DomainService
|
public class ModelManager : DomainService
|
||||||
{
|
{
|
||||||
private readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
|
public readonly ISqlSugarRepository<AiModelEntity> _aiModelRepository;
|
||||||
private readonly IDistributedCache<List<string>, string> _distributedCache;
|
private readonly IDistributedCache<List<string>, string> _distributedCache;
|
||||||
private readonly ILogger<ModelManager> _logger;
|
private readonly ILogger<ModelManager> _logger;
|
||||||
private const string PREMIUM_MODEL_IDS_CACHE_KEY = "PremiumModelIds";
|
private const string PREMIUM_MODEL_IDS_CACHE_KEY = "PremiumModelIds";
|
||||||
|
|||||||
Reference in New Issue
Block a user