diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/ModelTodayUsageDto.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/ModelTodayUsageDto.cs index afc163e5..08caab2d 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/ModelTodayUsageDto.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/ModelTodayUsageDto.cs @@ -19,4 +19,9 @@ public class ModelTodayUsageDto /// 今日消耗总Token数 /// public long TotalTokens { get; set; } + + /// + /// 模型图标URL + /// + public string? IconUrl { get; set; } } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs index d3d38bae..9ba060be 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/UsageStatisticsService.cs @@ -30,6 +30,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic private readonly ISqlSugarRepository _premiumPackageRepository; private readonly ISqlSugarRepository _tokenRepository; private readonly ModelManager _modelManager; + public UsageStatisticsService( ISqlSugarRepository messageRepository, ISqlSugarRepository usageStatisticsRepository, @@ -48,7 +49,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户近7天的Token消耗统计 /// /// 每日Token使用量列表 - public async Task> GetLast7DaysTokenUsageAsync([FromQuery]UsageStatisticsGetInput input) + public async Task> GetLast7DaysTokenUsageAsync([FromQuery] UsageStatisticsGetInput input) { var userId = CurrentUser.GetId(); var endDate = DateTime.Today; @@ -59,7 +60,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic .Where(x => x.UserId == userId) .Where(x => x.Role == "system") .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) .Select(g => new { @@ -89,14 +90,14 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户各个模型的Token消耗量及占比 /// /// 模型Token使用量列表 - public async Task> GetModelTokenUsageAsync([FromQuery]UsageStatisticsGetInput input) + public async Task> GetModelTokenUsageAsync([FromQuery] UsageStatisticsGetInput input) { var userId = CurrentUser.GetId(); // 从UsageStatistics表获取各模型的token消耗统计(按ModelId聚合,因为同一模型可能有多个TokenId的记录) var modelUsages = await _usageStatisticsRepository._DbQueryable .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) .Select(x => new { @@ -221,7 +222,9 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic var result = tokenUsages.Select(x => new TokenPremiumUsageDto { 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, Percentage = totalTokens > 0 ? Math.Round((decimal)x.TotalTokenCount / totalTokens * 100, 2) : 0 }).OrderByDescending(x => x.Tokens).ToList(); @@ -233,7 +236,8 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户近24小时每小时Token消耗统计(柱状图) /// /// 每小时Token使用量列表,包含各模型堆叠数据 - public async Task> GetLast24HoursTokenUsageAsync([FromQuery]UsageStatisticsGetInput input) + public async Task> GetLast24HoursTokenUsageAsync( + [FromQuery] UsageStatisticsGetInput input) { var userId = CurrentUser.GetId(); var now = DateTime.Now; @@ -258,7 +262,8 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic var hourlyGrouped = messages .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 }) .Select(g => new @@ -297,7 +302,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户今日各模型使用量统计(卡片列表) /// /// 模型今日使用量列表,包含使用次数和总Token - public async Task> GetTodayModelUsageAsync([FromQuery]UsageStatisticsGetInput input) + public async Task> GetTodayModelUsageAsync([FromQuery] UsageStatisticsGetInput input) { var userId = CurrentUser.GetId(); var todayStart = DateTime.Today; // 今天凌晨0点 @@ -328,6 +333,22 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic .OrderByDescending(x => x.TotalTokens) .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(x => x.ModelId, y => y.IconUrl); + modelStats.ForEach(x => + { + if (modelDic.TryGetValue(x.ModelId, out var icon)) + { + x.IconUrl = icon; + } + }); + } + return modelStats; } } \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ModelManager.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ModelManager.cs index 1bbe0ea7..a9dd91c1 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ModelManager.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Managers/ModelManager.cs @@ -11,7 +11,7 @@ namespace Yi.Framework.AiHub.Domain.Managers; /// public class ModelManager : DomainService { - private readonly ISqlSugarRepository _aiModelRepository; + public readonly ISqlSugarRepository _aiModelRepository; private readonly IDistributedCache, string> _distributedCache; private readonly ILogger _logger; private const string PREMIUM_MODEL_IDS_CACHE_KEY = "PremiumModelIds";