From 9c9945071f98bf7adf1d191805498ac6f964b776 Mon Sep 17 00:00:00 2001 From: erio Date: Mon, 13 Apr 2026 16:00:52 +0800 Subject: [PATCH] fix: expose account_stats_cost in usage log API and fix frontend display Backend: - Add AccountStatsCost field to AdminUsageLog DTO - Map AccountStatsCost in UsageLogFromServiceAdmin mapper - Replace println with slog.Warn in api_key_auth_cache_impl.go Frontend: - Add account_stats_cost to AdminUsageLog TypeScript interface - Usage tooltip and table: prefer account_stats_cost when available, fallback to total_cost * multiplier (mirrors SQL COALESCE logic) - Excel export: same COALESCE fallback --- backend/cmd/server/VERSION | 2 +- backend/internal/handler/dto/mappers.go | 1 + backend/internal/handler/dto/types.go | 2 ++ backend/internal/service/api_key_auth_cache_impl.go | 3 ++- frontend/src/components/admin/usage/UsageTable.vue | 4 ++-- frontend/src/types/index.ts | 2 ++ frontend/src/views/admin/UsageView.vue | 2 +- 7 files changed, 11 insertions(+), 5 deletions(-) diff --git a/backend/cmd/server/VERSION b/backend/cmd/server/VERSION index 8775ce89a0..edd548470c 100644 --- a/backend/cmd/server/VERSION +++ b/backend/cmd/server/VERSION @@ -1 +1 @@ -0.1.110.24 +0.1.110.25 diff --git a/backend/internal/handler/dto/mappers.go b/backend/internal/handler/dto/mappers.go index a7a93d0722..d2ccb8d62f 100644 --- a/backend/internal/handler/dto/mappers.go +++ b/backend/internal/handler/dto/mappers.go @@ -628,6 +628,7 @@ func UsageLogFromServiceAdmin(l *service.UsageLog) *AdminUsageLog { ModelMappingChain: l.ModelMappingChain, BillingTier: l.BillingTier, AccountRateMultiplier: l.AccountRateMultiplier, + AccountStatsCost: l.AccountStatsCost, IPAddress: l.IPAddress, Account: AccountSummaryFromService(l.Account), } diff --git a/backend/internal/handler/dto/types.go b/backend/internal/handler/dto/types.go index afb782b046..25fa50ba16 100644 --- a/backend/internal/handler/dto/types.go +++ b/backend/internal/handler/dto/types.go @@ -427,6 +427,8 @@ type AdminUsageLog struct { // AccountRateMultiplier 账号计费倍率快照(nil 表示按 1.0 处理) AccountRateMultiplier *float64 `json:"account_rate_multiplier"` + // AccountStatsCost 自定义定价规则计算的账号统计费用(nil 表示使用默认公式) + AccountStatsCost *float64 `json:"account_stats_cost,omitempty"` // IPAddress 用户请求 IP(仅管理员可见) IPAddress *string `json:"ip_address,omitempty"` diff --git a/backend/internal/service/api_key_auth_cache_impl.go b/backend/internal/service/api_key_auth_cache_impl.go index 25c6331ac9..2bd9a09188 100644 --- a/backend/internal/service/api_key_auth_cache_impl.go +++ b/backend/internal/service/api_key_auth_cache_impl.go @@ -6,6 +6,7 @@ import ( "encoding/hex" "errors" "fmt" + "log/slog" "math/rand/v2" "time" @@ -99,7 +100,7 @@ func (s *APIKeyService) StartAuthCacheInvalidationSubscriber(ctx context.Context s.authCacheL1.Del(cacheKey) }); err != nil { // Log but don't fail - L1 cache will still work, just without cross-instance invalidation - println("[Service] Warning: failed to start auth cache invalidation subscriber:", err.Error()) + slog.Warn("failed to start auth cache invalidation subscriber", "error", err) } } diff --git a/frontend/src/components/admin/usage/UsageTable.vue b/frontend/src/components/admin/usage/UsageTable.vue index c405e66b2c..d29fc52401 100644 --- a/frontend/src/components/admin/usage/UsageTable.vue +++ b/frontend/src/components/admin/usage/UsageTable.vue @@ -155,7 +155,7 @@
- A ${{ (row.total_cost * row.account_rate_multiplier).toFixed(6) }} + A ${{ (row.account_stats_cost != null ? row.account_stats_cost * (row.account_rate_multiplier ?? 1) : row.total_cost * row.account_rate_multiplier).toFixed(6) }}
@@ -328,7 +328,7 @@
{{ t('usage.accountBilled') }} - ${{ (((tooltipData?.total_cost || 0) * (tooltipData?.account_rate_multiplier ?? 1)) || 0).toFixed(6) }} + ${{ (tooltipData?.account_stats_cost != null ? (tooltipData.account_stats_cost * (tooltipData?.account_rate_multiplier ?? 1)) : ((tooltipData?.total_cost || 0) * (tooltipData?.account_rate_multiplier ?? 1))).toFixed(6) }}
diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index 13e939fbec..1ba5108877 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -1057,6 +1057,8 @@ export interface AdminUsageLog extends UsageLog { // 账号计费倍率(仅管理员可见) account_rate_multiplier?: number | null + // 自定义定价规则计算的账号统计费用(nil 时使用 total_cost * multiplier) + account_stats_cost?: number | null // 用户请求 IP(仅管理员可见) ip_address?: string | null diff --git a/frontend/src/views/admin/UsageView.vue b/frontend/src/views/admin/UsageView.vue index 7972f669d0..495ca7ad77 100644 --- a/frontend/src/views/admin/UsageView.vue +++ b/frontend/src/views/admin/UsageView.vue @@ -495,7 +495,7 @@ const exportToExcel = async () => { log.cache_read_cost?.toFixed(6) || '0.000000', log.cache_creation_cost?.toFixed(6) || '0.000000', log.rate_multiplier?.toPrecision(4) || '1.00', (log.account_rate_multiplier ?? 1).toPrecision(4), log.total_cost?.toFixed(6) || '0.000000', log.actual_cost?.toFixed(6) || '0.000000', - (log.total_cost * (log.account_rate_multiplier ?? 1)).toFixed(6), log.first_token_ms ?? '', log.duration_ms, + ((log.account_stats_cost ?? log.total_cost) * (log.account_rate_multiplier ?? 1)).toFixed(6), log.first_token_ms ?? '', log.duration_ms, log.request_id || '', log.user_agent || '', log.ip_address || '' ]) if (rows.length) {