feat: 今日模型使用统计返回模型图标信息

为 GetTodayModelUsage 接口补充模型图标数据,新增 ModelTodayUsageDto.IconUrl 字段
通过 ModelManager 查询已启用模型的 IconUrl 并映射到结果中
同时统一部分代码格式,提升可读性
This commit is contained in:
ccnetcore
2026-01-23 22:13:51 +08:00
parent 87c93534a5
commit caa90cc227
3 changed files with 35 additions and 9 deletions

View File

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

View File

@@ -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,
@@ -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
@@ -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;
} }
} }

View File

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