feat(usage): 用户用量按平台拆分 + UsersView 列设置可配置 + 用量列排序

后端
- BatchUserUsageStats / UserDashboardStats 新增 ByPlatform 字段
  复用 ops 路径 COALESCE(g.platform, a.platform) 语义,不冗余 DB 字段
- 抽出 usageLogEffectivePlatformExpr 常量供管理员与用户两路径共用
- GetBatchUsersUsage cacheKey 加 v=2 + 当日日期,修复跨午夜旧缓存兼容新字段

前端
- 新建 PlatformUsageBreakdown:管理员用量列 hover tooltip 展示各平台 today/total
- 新建 PlatformCostCell:单平台 today/total 紧凑单元格
- UsersView 列设置新增 Claude/OpenAI/Gemini/Antigravity 四个平台子列,默认隐藏可手动启用
- 普通用户 Dashboard 新增 Row 3 平台拆分卡片,受 isSimple 控制
- 平台之和 < 总值时显式展示"其他"行,避免数字对不齐
- last_active_at 从 FORCED_VISIBLE_COLUMNS 移除,允许用户隐藏并持久化
- 列设置加 schema 版本号 + 迁移机制,老用户升级时新增默认隐藏列自动应用
- UsersView 用量列(汇总 + 4 平台子列)加入前端单页排序:列头单按钮 + 弹出菜单
  切换"今日 / 近30天",三态循环 desc → asc → off;菜单底部备注"仅对本页数据排序"
- sortedUsers computed 在 server-side-sort 结果之上叠加本地排序,缺失值按 0 处理;
  usageSort 状态独立 localStorage 持久化,互不干扰后端 sort_by
- i18n 新增 admin.users.sortBy / sortCurrentPageOnly

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
DaydreamCoding
2026-05-19 15:25:34 +08:00
committed by QTom
co-authored by Claude Opus 4.7
parent b006e36af9
commit 664e9fdcd4
11 changed files with 673 additions and 36 deletions
+7
View File
@@ -266,10 +266,17 @@ export async function getUserSpendingRanking(
return data
}
export interface PlatformUsage {
platform: string
today_actual_cost: number
total_actual_cost: number
}
export interface BatchUserUsageStats {
user_id: number
today_actual_cost: number
total_actual_cost: number
by_platform?: PlatformUsage[]
}
export interface BatchUsersUsageResponse {
+11
View File
@@ -15,6 +15,16 @@ import type {
// ==================== Dashboard Types ====================
export interface PlatformDashboardStats {
platform: string
total_requests: number
total_tokens: number
total_actual_cost: number
today_requests: number
today_tokens: number
today_actual_cost: number
}
export interface UserDashboardStats {
total_api_keys: number
active_api_keys: number
@@ -37,6 +47,7 @@ export interface UserDashboardStats {
average_duration_ms: number
rpm: number // 近5分钟平均每分钟请求数
tpm: number // 近5分钟平均每分钟Token数
by_platform?: PlatformDashboardStats[]
}
export interface TrendParams {