diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenListOutput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenGetListOutputDto.cs similarity index 96% rename from Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenListOutput.cs rename to Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenGetListOutputDto.cs index 2a91ad63..6358985b 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenListOutput.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenGetListOutputDto.cs @@ -3,7 +3,7 @@ namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Token; /// /// Token列表输出 /// -public class TokenListOutput +public class TokenGetListOutputDto { /// /// Token Id diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenSelectListOutputDto.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenSelectListOutputDto.cs new file mode 100644 index 00000000..445ef6f0 --- /dev/null +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Token/TokenSelectListOutputDto.cs @@ -0,0 +1,9 @@ +namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Token; + +public class TokenSelectListOutputDto +{ + public Guid TokenId { get; set; } + public string Name { get; set; } + + public bool IsDisabled { get; set; } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/UsageStatisticsGetInput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/UsageStatisticsGetInput.cs new file mode 100644 index 00000000..98ed1fd4 --- /dev/null +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/UsageStatistics/UsageStatisticsGetInput.cs @@ -0,0 +1,9 @@ +namespace Yi.Framework.AiHub.Application.Contracts.Dtos.UsageStatistics; + +public class UsageStatisticsGetInput +{ + /// + /// tokenId + /// + public Guid? TokenId { get; set; } +} \ No newline at end of file diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/IServices/IUsageStatisticsService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/IServices/IUsageStatisticsService.cs index add4d348..99be00a6 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/IServices/IUsageStatisticsService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/IServices/IUsageStatisticsService.cs @@ -11,13 +11,13 @@ public interface IUsageStatisticsService /// 获取当前用户近7天的Token消耗统计 /// /// 每日Token使用量列表 - Task> GetLast7DaysTokenUsageAsync(); + Task> GetLast7DaysTokenUsageAsync(UsageStatisticsGetInput input); /// /// 获取当前用户各个模型的Token消耗量及占比 /// /// 模型Token使用量列表 - Task> GetModelTokenUsageAsync(); + Task> GetModelTokenUsageAsync(UsageStatisticsGetInput input); /// /// 获取当前用户尊享服务Token用量统计 diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/TokenService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/TokenService.cs index 9f818ebd..04020b42 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/TokenService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/TokenService.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; +using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Users; using Yi.Framework.AiHub.Application.Contracts.Dtos.Token; @@ -8,6 +9,7 @@ using Yi.Framework.AiHub.Domain.Entities; using Yi.Framework.AiHub.Domain.Entities.OpenApi; using Yi.Framework.AiHub.Domain.Extensions; using Yi.Framework.AiHub.Domain.Shared.Consts; +using Yi.Framework.Ddd.Application.Contracts; using Yi.Framework.SqlSugarCore.Abstractions; namespace Yi.Framework.AiHub.Application.Services; @@ -33,18 +35,19 @@ public class TokenService : ApplicationService /// 获取当前用户的Token列表 /// [HttpGet("token/list")] - public async Task> GetListAsync() + public async Task> GetListAsync([FromQuery] PagedAllResultRequestDto input) { + RefAsync total = 0; var userId = CurrentUser.GetId(); var tokens = await _tokenRepository._DbQueryable .Where(x => x.UserId == userId) .OrderByDescending(x => x.CreationTime) - .ToListAsync(); + .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); if (!tokens.Any()) { - return new List(); + return new PagedResultDto(); } // 获取尊享包模型ID列表 @@ -65,7 +68,7 @@ public class TokenService : ApplicationService var result = tokens.Select(t => { var usedQuota = usageStats.FirstOrDefault(u => u.TokenId == t.Id)?.UsedQuota ?? 0; - return new TokenListOutput + return new TokenGetListOutputDto { Id = t.Id, Name = t.Name, @@ -78,14 +81,32 @@ public class TokenService : ApplicationService }; }).ToList(); - return result; + return new PagedResultDto(total, result); } + [HttpGet("token/select-list")] + public async Task> GetSelectListAsync() + { + var userId = CurrentUser.GetId(); + var tokens = await _tokenRepository._DbQueryable + .Where(x => x.UserId == userId) + .OrderBy(x => x.IsDisabled) + .OrderByDescending(x => x.CreationTime) + .Select(x => new TokenSelectListOutputDto + { + TokenId = x.Id, + Name = x.Name, + IsDisabled = x.IsDisabled + }).ToListAsync(); + return tokens; + } + + /// /// 创建Token /// [HttpPost("token")] - public async Task CreateAsync([FromBody] TokenCreateInput input) + public async Task CreateAsync([FromBody] TokenCreateInput input) { var userId = CurrentUser.GetId(); @@ -111,7 +132,7 @@ public class TokenService : ApplicationService await _tokenRepository.InsertAsync(token); - return new TokenListOutput + return new TokenGetListOutputDto { Id = token.Id, Name = token.Name, @@ -213,4 +234,4 @@ public class TokenService : ApplicationService token.Disable(); await _tokenRepository.UpdateAsync(token); } -} +} \ No newline at end of file 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 8391b5af..ffc05c88 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 @@ -44,7 +44,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户近7天的Token消耗统计 /// /// 每日Token使用量列表 - public async Task> GetLast7DaysTokenUsageAsync() + public async Task> GetLast7DaysTokenUsageAsync([FromQuery]UsageStatisticsGetInput input) { var userId = CurrentUser.GetId(); var endDate = DateTime.Today; @@ -55,6 +55,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic .Where(x => x.UserId == userId) .Where(x => x.Role == "assistant" || x.Role == "system") .Where(x => x.CreationTime >= startDate && x.CreationTime < endDate.AddDays(1)) + .WhereIF(input.TokenId.HasValue,x => x.TokenId == input.TokenId) .GroupBy(x => x.CreationTime.Date) .Select(g => new { @@ -84,13 +85,14 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic /// 获取当前用户各个模型的Token消耗量及占比 /// /// 模型Token使用量列表 - public async Task> GetModelTokenUsageAsync() + 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) .GroupBy(x => x.ModelId) .Select(x => new {