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
{