feat: 完成token下拉框

This commit is contained in:
ccnetcore
2025-11-29 18:25:43 +08:00
parent ddb00879f4
commit 86555af6ce
6 changed files with 54 additions and 13 deletions

View File

@@ -3,7 +3,7 @@ namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Token;
/// <summary> /// <summary>
/// Token列表输出 /// Token列表输出
/// </summary> /// </summary>
public class TokenListOutput public class TokenGetListOutputDto
{ {
/// <summary> /// <summary>
/// Token Id /// Token Id

View File

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

View File

@@ -0,0 +1,9 @@
namespace Yi.Framework.AiHub.Application.Contracts.Dtos.UsageStatistics;
public class UsageStatisticsGetInput
{
/// <summary>
/// tokenId
/// </summary>
public Guid? TokenId { get; set; }
}

View File

@@ -11,13 +11,13 @@ public interface IUsageStatisticsService
/// 获取当前用户近7天的Token消耗统计 /// 获取当前用户近7天的Token消耗统计
/// </summary> /// </summary>
/// <returns>每日Token使用量列表</returns> /// <returns>每日Token使用量列表</returns>
Task<List<DailyTokenUsageDto>> GetLast7DaysTokenUsageAsync(); Task<List<DailyTokenUsageDto>> GetLast7DaysTokenUsageAsync(UsageStatisticsGetInput input);
/// <summary> /// <summary>
/// 获取当前用户各个模型的Token消耗量及占比 /// 获取当前用户各个模型的Token消耗量及占比
/// </summary> /// </summary>
/// <returns>模型Token使用量列表</returns> /// <returns>模型Token使用量列表</returns>
Task<List<ModelTokenUsageDto>> GetModelTokenUsageAsync(); Task<List<ModelTokenUsageDto>> GetModelTokenUsageAsync(UsageStatisticsGetInput input);
/// <summary> /// <summary>
/// 获取当前用户尊享服务Token用量统计 /// 获取当前用户尊享服务Token用量统计

View File

@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SqlSugar; using SqlSugar;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Users; using Volo.Abp.Users;
using Yi.Framework.AiHub.Application.Contracts.Dtos.Token; 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.Entities.OpenApi;
using Yi.Framework.AiHub.Domain.Extensions; using Yi.Framework.AiHub.Domain.Extensions;
using Yi.Framework.AiHub.Domain.Shared.Consts; using Yi.Framework.AiHub.Domain.Shared.Consts;
using Yi.Framework.Ddd.Application.Contracts;
using Yi.Framework.SqlSugarCore.Abstractions; using Yi.Framework.SqlSugarCore.Abstractions;
namespace Yi.Framework.AiHub.Application.Services; namespace Yi.Framework.AiHub.Application.Services;
@@ -33,18 +35,19 @@ public class TokenService : ApplicationService
/// 获取当前用户的Token列表 /// 获取当前用户的Token列表
/// </summary> /// </summary>
[HttpGet("token/list")] [HttpGet("token/list")]
public async Task<List<TokenListOutput>> GetListAsync() public async Task<PagedResultDto<TokenGetListOutputDto>> GetListAsync([FromQuery] PagedAllResultRequestDto input)
{ {
RefAsync<int> total = 0;
var userId = CurrentUser.GetId(); var userId = CurrentUser.GetId();
var tokens = await _tokenRepository._DbQueryable var tokens = await _tokenRepository._DbQueryable
.Where(x => x.UserId == userId) .Where(x => x.UserId == userId)
.OrderByDescending(x => x.CreationTime) .OrderByDescending(x => x.CreationTime)
.ToListAsync(); .ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
if (!tokens.Any()) if (!tokens.Any())
{ {
return new List<TokenListOutput>(); return new PagedResultDto<TokenGetListOutputDto>();
} }
// 获取尊享包模型ID列表 // 获取尊享包模型ID列表
@@ -65,7 +68,7 @@ public class TokenService : ApplicationService
var result = tokens.Select(t => var result = tokens.Select(t =>
{ {
var usedQuota = usageStats.FirstOrDefault(u => u.TokenId == t.Id)?.UsedQuota ?? 0; var usedQuota = usageStats.FirstOrDefault(u => u.TokenId == t.Id)?.UsedQuota ?? 0;
return new TokenListOutput return new TokenGetListOutputDto
{ {
Id = t.Id, Id = t.Id,
Name = t.Name, Name = t.Name,
@@ -78,14 +81,32 @@ public class TokenService : ApplicationService
}; };
}).ToList(); }).ToList();
return result; return new PagedResultDto<TokenGetListOutputDto>(total, result);
} }
[HttpGet("token/select-list")]
public async Task<List<TokenSelectListOutputDto>> 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;
}
/// <summary> /// <summary>
/// 创建Token /// 创建Token
/// </summary> /// </summary>
[HttpPost("token")] [HttpPost("token")]
public async Task<TokenListOutput> CreateAsync([FromBody] TokenCreateInput input) public async Task<TokenGetListOutputDto> CreateAsync([FromBody] TokenCreateInput input)
{ {
var userId = CurrentUser.GetId(); var userId = CurrentUser.GetId();
@@ -111,7 +132,7 @@ public class TokenService : ApplicationService
await _tokenRepository.InsertAsync(token); await _tokenRepository.InsertAsync(token);
return new TokenListOutput return new TokenGetListOutputDto
{ {
Id = token.Id, Id = token.Id,
Name = token.Name, Name = token.Name,
@@ -213,4 +234,4 @@ public class TokenService : ApplicationService
token.Disable(); token.Disable();
await _tokenRepository.UpdateAsync(token); await _tokenRepository.UpdateAsync(token);
} }
} }

View File

@@ -44,7 +44,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
/// 获取当前用户近7天的Token消耗统计 /// 获取当前用户近7天的Token消耗统计
/// </summary> /// </summary>
/// <returns>每日Token使用量列表</returns> /// <returns>每日Token使用量列表</returns>
public async Task<List<DailyTokenUsageDto>> GetLast7DaysTokenUsageAsync() 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;
@@ -55,6 +55,7 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
.Where(x => x.UserId == userId) .Where(x => x.UserId == userId)
.Where(x => x.Role == "assistant" || x.Role == "system") .Where(x => x.Role == "assistant" || 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)
.GroupBy(x => x.CreationTime.Date) .GroupBy(x => x.CreationTime.Date)
.Select(g => new .Select(g => new
{ {
@@ -84,13 +85,14 @@ public class UsageStatisticsService : ApplicationService, IUsageStatisticsServic
/// 获取当前用户各个模型的Token消耗量及占比 /// 获取当前用户各个模型的Token消耗量及占比
/// </summary> /// </summary>
/// <returns>模型Token使用量列表</returns> /// <returns>模型Token使用量列表</returns>
public async Task<List<ModelTokenUsageDto>> GetModelTokenUsageAsync() 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)
.GroupBy(x => x.ModelId) .GroupBy(x => x.ModelId)
.Select(x => new .Select(x => new
{ {