mirror of
https://github.com/Wei-Shaw/claude-relay-service.git
synced 2026-01-23 00:53:33 +00:00
2 lines
45 KiB
JavaScript
2 lines
45 KiB
JavaScript
import{E as qt}from"./element-plus-BQHxDbdW.js";import{aP as Ht,r as $,c as Et,aX as Lt,o as xt,q as Vt,D as at,V as jt,x as _,z as t,P as y,u as a,L as A,O as R,Q as Mt,ac as Kt,C as st,R as Nt,K as Yt,al as Wt,y as D}from"./vue-vendor-R8HMg95E.js";import{c as it,s as Ft,_ as Zt,a as Qt}from"./index-CALK15rm.js";import{C as Rt}from"./chart-yFHxLHpB.js";import"./vendor-Dr8jvgFu.js";const Xt=Ht("dashboard",()=>{const Tt=$(!1),dt=$({totalApiKeys:0,activeApiKeys:0,totalAccounts:0,normalAccounts:0,abnormalAccounts:0,pausedAccounts:0,activeAccounts:0,rateLimitedAccounts:0,accountsByPlatform:{claude:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},"claude-console":{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},gemini:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},azure_openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},bedrock:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0}},todayRequests:0,totalRequests:0,todayTokens:0,todayInputTokens:0,todayOutputTokens:0,totalTokens:0,totalInputTokens:0,totalOutputTokens:0,totalCacheCreateTokens:0,totalCacheReadTokens:0,todayCacheCreateTokens:0,todayCacheReadTokens:0,systemRPM:0,systemTPM:0,realtimeRPM:0,realtimeTPM:0,metricsWindow:5,isHistoricalMetrics:!1,systemStatus:"正常",uptime:0,systemTimezone:8}),St=$({todayCosts:{totalCost:0,formatted:{totalCost:"$0.000000"}},totalCosts:{totalCost:0,formatted:{totalCost:"$0.000000"}}}),ct=$([]),s=$([]),vt=$([]),N=$({data:[],topApiKeys:[],totalApiKeys:0}),bt=$({data:[],topAccounts:[],totalAccounts:0,group:"claude",groupLabel:"Claude账户"}),K={preset:"dashboard:date:preset",granularity:"dashboard:trend:granularity"},B="today",ht="day",ut=r=>r==="hour"?[{value:"last24h",label:"近24小时",hours:24},{value:"yesterday",label:"昨天",hours:24},{value:"dayBefore",label:"前天",hours:24}]:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30}],Y=(r,l)=>{try{return localStorage.getItem(r)||l}catch{return l}},H=(r,l)=>{try{localStorage.setItem(r,l)}catch{}},O=(r,l)=>ut(l).some(g=>g.value===r)?r:l==="hour"?"last24h":B,$t=Y(K.granularity,ht),kt=["day","hour"].includes($t)?$t:ht,Pt=O(Y(K.preset,B),kt),o=$({type:"preset",preset:Pt,customStart:"",customEnd:"",customRange:null,presetOptions:ut(kt)}),U=$(kt),_t=$("requests"),mt=$("claude"),It=$([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),Bt=Et(()=>{const r=dt.value.uptime,l=Math.floor(r/86400),n=Math.floor(r%86400/3600),d=Math.floor(r%3600/60);return l>0?`${l}天 ${n}小时`:n>0?`${n}小时 ${d}分钟`:`${d}分钟`});function b(r,l=!0){const n=r.getFullYear(),d=r.getMonth(),g=r.getDate();return l?new Date(Date.UTC(n,d,g-1,16,0,0,0)):new Date(Date.UTC(n,d,g,15,59,59,999))}const W=(r=o.value.preset,l=U.value)=>{H(K.preset,r),H(K.granularity,l)},z=()=>o.value.type==="preset"&&o.value.preset==="today"&&U.value==="day"?"hour":U.value;async function Dt(r=null){Tt.value=!0;try{let l={today:"today",all:"all"};r&&(l={today:{today:"today",all:"today"},"7days":{today:"7days",all:"7days"},monthly:{today:"monthly",all:"monthly"},all:{today:"today",all:"all"}}[r]||l);const[n,d,g]=await Promise.all([it.get("/admin/dashboard"),it.get(`/admin/usage-costs?period=${l.today}`),it.get(`/admin/usage-costs?period=${l.all}`)]);if(n.success){const i=n.data.overview||{},c=n.data.recentActivity||{},u=n.data.systemAverages||{},m=n.data.realtimeMetrics||{},h=n.data.systemHealth||{};dt.value={totalApiKeys:i.totalApiKeys||0,activeApiKeys:i.activeApiKeys||0,totalAccounts:i.totalAccounts||i.totalClaudeAccounts||0,normalAccounts:i.normalAccounts||0,abnormalAccounts:i.abnormalAccounts||0,pausedAccounts:i.pausedAccounts||0,activeAccounts:i.activeAccounts||i.activeClaudeAccounts||0,rateLimitedAccounts:i.rateLimitedAccounts||i.rateLimitedClaudeAccounts||0,accountsByPlatform:i.accountsByPlatform||{claude:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},"claude-console":{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},gemini:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},azure_openai:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0},bedrock:{total:0,normal:0,abnormal:0,paused:0,rateLimited:0}},todayRequests:c.requestsToday||0,totalRequests:i.totalRequestsUsed||0,todayTokens:c.tokensToday||0,todayInputTokens:c.inputTokensToday||0,todayOutputTokens:c.outputTokensToday||0,totalTokens:i.totalTokensUsed||0,totalInputTokens:i.totalInputTokensUsed||0,totalOutputTokens:i.totalOutputTokensUsed||0,totalCacheCreateTokens:i.totalCacheCreateTokensUsed||0,totalCacheReadTokens:i.totalCacheReadTokensUsed||0,todayCacheCreateTokens:c.cacheCreateTokensToday||0,todayCacheReadTokens:c.cacheReadTokensToday||0,systemRPM:u.rpm||0,systemTPM:u.tpm||0,realtimeRPM:m.rpm||0,realtimeTPM:m.tpm||0,metricsWindow:m.windowMinutes||5,isHistoricalMetrics:m.isHistorical||!1,systemStatus:h.redisConnected?"正常":"异常",uptime:h.uptime||0,systemTimezone:n.data.systemTimezone||8}}d.success&&g.success&&(St.value={todayCosts:d.data.totalCosts||{totalCost:0,formatted:{totalCost:"$0.000000"}},totalCosts:g.data.totalCosts||{totalCost:0,formatted:{totalCost:"$0.000000"}}})}catch(l){console.error("加载仪表板数据失败:",l)}finally{Tt.value=!1}}async function Z(r=7,l=z()){try{let n="/admin/usage-trend?";if(l==="hour")if(n+="granularity=hour",o.value.customRange&&o.value.customRange.length===2)n+=`&startDate=${encodeURIComponent(o.value.customRange[0])}`,n+=`&endDate=${encodeURIComponent(o.value.customRange[1])}`;else{const g=new Date;let i,c;if(o.value.type==="preset")switch(o.value.preset){case"today":{i=b(g,!0),c=b(g,!1);break}case"last24h":{c=new Date(g),i=new Date(g.getTime()-24*60*60*1e3);break}case"yesterday":{const u=new Date;u.setDate(u.getDate()-1),i=b(u,!0),c=b(u,!1);break}case"dayBefore":{const u=new Date;u.setDate(u.getDate()-2),i=b(u,!0),c=b(u,!1);break}default:i=new Date(g.getTime()-24*60*60*1e3),c=g}else i=new Date(g.getTime()-r*24*60*60*1e3),c=g;n+=`&startDate=${encodeURIComponent(i.toISOString())}`,n+=`&endDate=${encodeURIComponent(c.toISOString())}`}else n+=`granularity=day&days=${r}`;const d=await it.get(n);d.success&&(s.value=d.data)}catch(n){console.error("加载使用趋势失败:",n)}}async function Q(r="daily",l=null){const n=l||z();try{let d=`/admin/model-stats?period=${r}`;if(o.value.type==="custom"||n==="hour"){if(o.value.customRange&&o.value.customRange.length===2)d+=`&startDate=${encodeURIComponent(o.value.customRange[0])}`,d+=`&endDate=${encodeURIComponent(o.value.customRange[1])}`;else if(n==="hour"&&o.value.type==="preset"){const i=new Date;let c,u;switch(o.value.preset){case"today":{c=b(i,!0),u=b(i,!1);break}case"last24h":{u=new Date(i),c=new Date(i.getTime()-24*60*60*1e3);break}case"yesterday":{const m=new Date;m.setDate(m.getDate()-1),c=b(m,!0),u=b(m,!1);break}case"dayBefore":{const m=new Date;m.setDate(m.getDate()-2),c=b(m,!0),u=b(m,!1);break}default:c=new Date(i.getTime()-24*60*60*1e3),u=i}d+=`&startDate=${encodeURIComponent(c.toISOString())}`,d+=`&endDate=${encodeURIComponent(u.toISOString())}`}}else if(o.value.type==="preset"&&n==="day"){const i=new Date;let c,u;const m=o.value.presetOptions.find(h=>h.value===o.value.preset);if(m){if(o.value.preset==="today")c=b(i,!0),u=b(i,!1);else{const h=new Date;h.setDate(h.getDate()-(m.days-1)),c=b(h,!0),u=b(i,!1)}d+=`&startDate=${encodeURIComponent(c.toISOString())}`,d+=`&endDate=${encodeURIComponent(u.toISOString())}`}}const g=await it.get(d);g.success&&(vt.value=g.data)}catch(d){console.error("加载模型统计失败:",d)}}async function X(r="requests",l=null){const n=l||z();try{let d="/admin/api-keys-usage-trend?",g=7;if(n==="hour")if(d+="granularity=hour",o.value.customRange&&o.value.customRange.length===2)d+=`&startDate=${encodeURIComponent(o.value.customRange[0])}`,d+=`&endDate=${encodeURIComponent(o.value.customRange[1])}`;else{const c=new Date;let u,m;if(o.value.type==="preset")switch(o.value.preset){case"today":{u=b(c,!0),m=b(c,!1);break}case"last24h":{m=new Date(c),u=new Date(c.getTime()-24*60*60*1e3);break}case"yesterday":{const h=new Date;h.setDate(h.getDate()-1),u=b(h,!0),m=b(h,!1);break}case"dayBefore":{const h=new Date;h.setDate(h.getDate()-2),u=b(h,!0),m=b(h,!1);break}default:u=new Date(c.getTime()-24*60*60*1e3),m=c}else u=new Date(c.getTime()-24*60*60*1e3),m=c;d+=`&startDate=${encodeURIComponent(u.toISOString())}`,d+=`&endDate=${encodeURIComponent(m.toISOString())}`}else g=o.value.type==="preset"?o.value.preset==="today"?1:o.value.preset==="7days"?7:30:q(o.value.customStart,o.value.customEnd),d+=`granularity=day&days=${g}`;d+=`&metric=${r}`;const i=await it.get(d);i.success&&(N.value={data:i.data||[],topApiKeys:i.topApiKeys||[],totalApiKeys:i.totalApiKeys||0})}catch(d){console.error("加载API Keys趋势失败:",d)}}async function V(r=mt.value,l=null){const n=l||z();try{let d="/admin/account-usage-trend?",g=7;if(n==="hour")if(d+="granularity=hour",o.value.customRange&&o.value.customRange.length===2)d+=`&startDate=${encodeURIComponent(o.value.customRange[0])}`,d+=`&endDate=${encodeURIComponent(o.value.customRange[1])}`;else{const c=new Date;let u,m;if(o.value.type==="preset")switch(o.value.preset){case"today":{u=b(c,!0),m=b(c,!1);break}case"last24h":{m=new Date(c),u=new Date(c.getTime()-24*60*60*1e3);break}case"yesterday":{const h=new Date;h.setDate(h.getDate()-1),u=b(h,!0),m=b(h,!1);break}case"dayBefore":{const h=new Date;h.setDate(h.getDate()-2),u=b(h,!0),m=b(h,!1);break}default:u=new Date(c.getTime()-24*60*60*1e3),m=c}else u=new Date(c.getTime()-24*60*60*1e3),m=c;d+=`&startDate=${encodeURIComponent(u.toISOString())}`,d+=`&endDate=${encodeURIComponent(m.toISOString())}`}else g=o.value.type==="preset"?o.value.preset==="today"?1:o.value.preset==="7days"?7:30:q(o.value.customStart,o.value.customEnd),d+=`granularity=day&days=${g}`;d+=`&group=${r}`;const i=await it.get(d);i.success&&(bt.value={data:i.data||[],topAccounts:i.topAccounts||[],totalAccounts:i.totalAccounts||0,group:i.group||r,groupLabel:i.groupLabel||""})}catch(d){console.error("加载账号使用趋势失败:",d)}}function ot(r,l={}){const{silent:n=!1,skipSave:d=!1}=l,g=O(r,U.value);o.value.type="preset",o.value.preset=g;const i=o.value.presetOptions.find(P=>P.value===g),c=new Date;let u,m;if(U.value==="hour")switch(g){case"today":{u=b(c,!0),m=b(c,!1);break}case"last24h":{m=new Date(c),u=new Date(c.getTime()-24*60*60*1e3);break}case"yesterday":{const P=new Date;P.setDate(P.getDate()-1),u=b(P,!0),m=b(P,!1);break}case"dayBefore":{const P=new Date;P.setDate(P.getDate()-2),u=b(P,!0),m=b(P,!1);break}default:m=new Date(c),u=new Date(c.getTime()-24*60*60*1e3)}else u=new Date(c),m=new Date(c),g==="today"?(u.setHours(0,0,0,0),m.setHours(23,59,59,999)):i!=null&&i.days&&(u.setDate(c.getDate()-(i.days-1)),u.setHours(0,0,0,0),m.setHours(23,59,59,999));const h=P=>{const L=new Date(P),pt=L.getFullYear(),At=String(L.getMonth()+1).padStart(2,"0"),f=String(L.getDate()).padStart(2,"0"),e=String(L.getHours()).padStart(2,"0"),T=String(L.getMinutes()).padStart(2,"0"),v=String(L.getSeconds()).padStart(2,"0");return`${pt}-${At}-${f} ${e}:${T}:${v}`};o.value.customStart=u?u.toISOString().split("T")[0]:"",o.value.customEnd=m?m.toISOString().split("T")[0]:"",o.value.customRange=u&&m?[h(u),h(m)]:null,d||W(o.value.preset,U.value),n||tt()}function Ct(r){if(r&&r.length===2){o.value.type="custom",o.value.preset="",o.value.customRange=r,o.value.customStart=r[0].split(" ")[0],o.value.customEnd=r[1].split(" ")[0];const l=g=>{const[i,c]=g.split(" "),[u,m,h]=i.split("-").map(Number),[P,L,pt]=c.split(":").map(Number);return new Date(u,m-1,h,P,L,pt)},n=l(r[0]),d=l(r[1]);if(U.value==="hour"){if((d-n)/36e5>24){Ft("小时粒度下日期范围不能超过24小时","warning");return}}else if(Math.ceil((d-n)/864e5)+1>31){Ft("日期范围不能超过 31 天","warning");return}tt()}else r===null&&ot(U.value==="hour"?"last24h":B)}function J(r,l={}){const{silent:n=!1,skipSave:d=!1,presetOverride:g}=l;if(U.value=r,r==="hour"){if(o.value.presetOptions=ut("hour"),o.value.type==="custom"&&o.value.customRange&&o.value.customRange.length===2){const c=new Date(o.value.customRange[0]);if((new Date(o.value.customRange[1])-c)/(1e3*60*60)>24){Ft("小时粒度下日期范围不能超过24小时,已切换到近24小时","warning"),ot("last24h",{silent:n,skipSave:d});return}}}else o.value.presetOptions=ut("day");if(o.value.type==="custom"){d||W(o.value.preset||B,U.value),n||tt();return}const i=g||O(o.value.preset,U.value);ot(i,{silent:!0,skipSave:!0}),d||W(o.value.preset,U.value),n||tt()}async function tt(){let r,l="monthly";const n=z();if(o.value.type==="preset"){const d=o.value.presetOptions.find(g=>g.value===o.value.preset);n==="hour"?(r=1,l="daily"):(r=d?d.days:7,o.value.preset==="today"?l="daily":l="monthly")}else{if(n==="hour"){const d=new Date(o.value.customRange[0]),g=new Date(o.value.customRange[1]),i=Math.ceil((g-d)/(1e3*60*60));r=Math.ceil(i/24)||1}else r=q(o.value.customStart,o.value.customEnd);l="daily"}await Promise.all([Z(r,n),Q(l,n),X(_t.value,n),V(mt.value,n)])}function et(r){return mt.value=r,V(r,z())}function q(r,l){if(!r||!l)return 7;const n=new Date(r),d=new Date(l),g=Math.abs(d-n);return Math.ceil(g/(1e3*60*60*24))||7}function j(r){return r>new Date}return ot(o.value.preset,{silent:!0,skipSave:!0}),W(o.value.preset,U.value),{loading:Tt,dashboardData:dt,costsData:St,modelStats:ct,trendData:s,dashboardModelStats:vt,apiKeysTrendData:N,accountUsageTrendData:bt,dateFilter:o,trendGranularity:U,apiKeysTrendMetric:_t,accountUsageGroup:mt,defaultTime:It,formattedUptime:Bt,loadDashboardData:Dt,loadUsageTrend:Z,loadModelStats:Q,loadApiKeysTrend:X,loadAccountUsageTrend:V,setDateFilterPreset:ot,onCustomDateRangeChange:Ct,setTrendGranularity:J,refreshChartsData:tt,setAccountUsageGroup:et,disabledDate:j}}),Jt={class:"mb-4 grid grid-cols-1 gap-3 sm:mb-6 sm:grid-cols-2 sm:gap-4 md:mb-8 md:gap-6 lg:grid-cols-4"},te={class:"stat-card"},ee={class:"flex items-center justify-between"},ae={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},se={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},oe={class:"stat-card"},ne={class:"flex items-center justify-between"},le={class:"flex-1"},re={class:"flex flex-wrap items-baseline gap-x-2"},ie={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},de={key:0,class:"flex items-center gap-2"},ce=["title"],ue={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},me=["title"],pe={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ye=["title"],ge={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},fe=["title"],xe={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},ve=["title"],be={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},he=["title"],ke={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},_e=["title"],De={class:"text-xs font-medium text-gray-700 dark:text-gray-300"},Ce={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},we={key:0,class:"text-red-600"},Te={key:1,class:"text-gray-600 dark:text-gray-400"},Se={key:2,class:"text-yellow-600"},$e={class:"stat-card"},Ae={class:"flex items-center justify-between"},Re={class:"text-2xl font-bold text-gray-900 dark:text-gray-100 sm:text-3xl"},Pe={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Ie={class:"stat-card"},Be={class:"flex items-center justify-between"},Ue={class:"text-2xl font-bold text-green-600 sm:text-3xl"},Me={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Ke={class:"mb-4 grid grid-cols-1 gap-3 sm:mb-6 sm:grid-cols-2 sm:gap-4 md:mb-8 md:gap-6 lg:grid-cols-4"},Fe={class:"stat-card"},Oe={class:"flex items-center justify-between"},Le={class:"mr-8 flex-1"},Ee={class:"mb-2 flex flex-wrap items-baseline gap-2"},Ge={class:"text-xl font-bold text-blue-600 sm:text-2xl md:text-3xl"},ze={class:"text-sm font-medium text-green-600"},qe={class:"text-xs text-gray-500 dark:text-gray-400"},He={class:"flex flex-wrap items-center justify-between gap-x-4"},Ve={class:"font-medium"},je={class:"font-medium"},Ne={key:0,class:"text-purple-600"},Ye={class:"font-medium"},We={key:1,class:"text-purple-600"},Ze={class:"font-medium"},Qe={class:"stat-card"},Xe={class:"flex items-center justify-between"},Je={class:"mr-8 flex-1"},ta={class:"mb-2 flex flex-wrap items-baseline gap-2"},ea={class:"text-xl font-bold text-emerald-600 sm:text-2xl md:text-3xl"},aa={class:"text-sm font-medium text-green-600"},sa={class:"text-xs text-gray-500 dark:text-gray-400"},oa={class:"flex flex-wrap items-center justify-between gap-x-4"},na={class:"font-medium"},la={class:"font-medium"},ra={key:0,class:"text-purple-600"},ia={class:"font-medium"},da={key:1,class:"text-purple-600"},ca={class:"font-medium"},ua={class:"stat-card"},ma={class:"flex items-center justify-between"},pa={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},ya={class:"text-xs text-gray-400"},ga={class:"text-2xl font-bold text-orange-600 sm:text-3xl"},fa={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},xa={key:0,class:"text-yellow-600"},va={class:"stat-card"},ba={class:"flex items-center justify-between"},ha={class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"},ka={class:"text-xs text-gray-400"},_a={class:"text-2xl font-bold text-rose-600 sm:text-3xl"},Da={class:"mt-1 text-xs text-gray-500 dark:text-gray-400"},Ca={key:0,class:"text-yellow-600"},wa={class:"mb-8"},Ta={class:"mb-4 flex flex-col gap-4 sm:mb-6"},Sa={class:"flex flex-col gap-2 lg:flex-row lg:items-center lg:justify-end"},$a={class:"flex flex-shrink-0 gap-1 overflow-x-auto rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},Aa=["onClick"],Ra={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},Pa={class:"flex items-center gap-2"},Ia={key:0,class:"text-xs text-orange-600"},Ba={class:"flex items-center gap-2"},Ua={class:"flex items-center rounded-lg bg-gray-100 px-3 py-1 dark:bg-gray-700"},Ma={class:"relative inline-flex cursor-pointer items-center"},Ka={class:"ml-2.5 flex select-none items-center gap-1 text-sm font-medium text-gray-600 dark:text-gray-300"},Fa=["disabled"],Oa={class:"hidden sm:inline"},La={class:"grid grid-cols-1 gap-6 lg:grid-cols-2"},Ea={class:"card p-4 sm:p-6"},Ga={class:"relative",style:{height:"250px"}},za={class:"card p-4 sm:p-6"},qa={key:0,class:"py-8 text-center"},Ha={key:1,class:"max-h-[250px] overflow-auto sm:max-h-[300px]"},Va={class:"min-w-full"},ja={class:"divide-y divide-gray-200 dark:divide-gray-600"},Na={class:"px-2 py-2 text-xs text-gray-900 dark:text-gray-100 sm:px-4 sm:text-sm"},Ya=["title"],Wa={class:"hidden px-2 py-2 text-right text-xs text-gray-600 dark:text-gray-400 sm:table-cell sm:px-4 sm:text-sm"},Za={class:"px-2 py-2 text-right text-xs text-gray-600 dark:text-gray-400 sm:px-4 sm:text-sm"},Qa={class:"px-2 py-2 text-right text-xs font-medium text-green-600 sm:px-4 sm:text-sm"},Xa={class:"hidden px-2 py-2 text-right text-xs font-medium sm:table-cell sm:px-4 sm:text-sm"},Ja={class:"inline-flex items-center rounded-full bg-blue-100 px-2 py-1 text-xs font-medium text-blue-800 dark:bg-blue-900/30 dark:text-blue-300"},ts={class:"mb-4 sm:mb-6 md:mb-8"},es={class:"card p-4 sm:p-6"},as={class:"sm:h-[300px]",style:{height:"250px"}},ss={class:"mb-4 sm:mb-6 md:mb-8"},os={class:"card p-4 sm:p-6"},ns={class:"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"},ls={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},rs={class:"mb-4 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},is={key:0},ds={key:1},cs={class:"sm:h-[350px]",style:{height:"300px"}},us={class:"mb-4 sm:mb-6 md:mb-8"},ms={class:"card p-4 sm:p-6"},ps={class:"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between"},ys={class:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3"},gs={class:"text-xs text-gray-500 dark:text-gray-400 sm:text-sm"},fs={class:"flex flex-wrap items-center gap-2"},xs={class:"flex gap-1 rounded-lg bg-gray-100 p-1 dark:bg-gray-700"},vs=["onClick"],bs={class:"mb-4 flex flex-wrap items-center gap-2 text-xs text-gray-600 dark:text-gray-400 sm:text-sm"},hs={key:0},ks={key:0,class:"py-12 text-center text-sm text-gray-500 dark:text-gray-400"},_s={key:1,class:"sm:h-[350px]",style:{height:"300px"}},Ds={__name:"DashboardView",setup(Tt){const dt=Xt(),St=Qt(),{isDarkMode:ct}=Lt(St),{dashboardData:s,costsData:vt,dashboardModelStats:N,trendData:bt,apiKeysTrendData:K,accountUsageTrendData:B,accountUsageGroup:ht,formattedUptime:ut,dateFilter:Y,trendGranularity:H,apiKeysTrendMetric:O,defaultTime:$t}=Lt(dt),{loadDashboardData:kt,loadApiKeysTrend:Pt,setDateFilterPreset:o,onCustomDateRangeChange:U,setTrendGranularity:_t,refreshChartsData:mt,setAccountUsageGroup:It,disabledDate:Bt}=dt,b=$(null),W=$(null),z=$(null),Dt=$(null);let Z=null,Q=null,X=null,V=null;const ot=[{value:"claude",label:"Claude"},{value:"openai",label:"OpenAI"},{value:"gemini",label:"Gemini"},{value:"droid",label:"Droid"}],Ct=$(!1),J=$(!1),tt=$(30),et=$(null),q=$(0),j=$(null),r=$(!1),l=Et(()=>({text:ct.value?"#e5e7eb":"#374151",grid:ct.value?"rgba(75, 85, 99, 0.3)":"rgba(0, 0, 0, 0.1)",legend:ct.value?"#e5e7eb":"#374151"}));function n(f){return f>=1e6?(f/1e6).toFixed(2)+"M":f>=1e3?(f/1e3).toFixed(2)+"K":f.toString()}function d(f){return Number.isFinite(f)?f>=1?`$${f.toFixed(2)}`:f>=.01?`$${f.toFixed(3)}`:`$${f.toFixed(6)}`:"$0.000000"}function g(f,e){if(!e||e.length===0)return 0;const T=e.reduce((v,G)=>v+G.allTokens,0);return T===0?0:(f/T*100).toFixed(1)}function i(){if(!b.value)return;Z&&Z.destroy();const f=N.value||[],e={labels:f.map(T=>T.model),datasets:[{data:f.map(T=>T.allTokens),backgroundColor:["#3B82F6","#10B981","#F59E0B","#EF4444","#8B5CF6","#EC4899","#14B8A6","#F97316","#6366F1","#84CC16"],borderWidth:0}]};Z=new Rt(b.value,{type:"doughnut",data:e,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{padding:15,usePointStyle:!0,font:{size:12},color:l.value.legend}},tooltip:{callbacks:{label:function(T){const v=T.label||"",G=n(T.parsed),nt=g(T.parsed,f);return`${v}: ${G} (${nt}%)`}}}}}})}function c(){var x;if(!W.value)return;Q&&Q.destroy();const f=bt.value||[],e=f.map(p=>p.inputTokens||0),T=f.map(p=>p.outputTokens||0),v=f.map(p=>p.cacheCreateTokens||0),G=f.map(p=>p.cacheReadTokens||0),nt=f.map(p=>p.requests||0),yt=f.map(p=>p.cost||0),lt=(x=f[0])!=null&&x.date?"date":"hour",M={labels:f.map(p=>{if(p.label)return p.label;if(lt==="hour"){const k=new Date(p.hour),S=String(k.getMonth()+1).padStart(2,"0"),E=String(k.getDate()).padStart(2,"0"),F=String(k.getHours()).padStart(2,"0");return`${S}/${E} ${F}:00`}const C=p.date;if(C&&C.includes("-")){const k=C.split("-");if(k.length>=3)return`${k[1]}/${k[2]}`}return p.date}),datasets:[{label:"输入Token",data:e,borderColor:"rgb(102, 126, 234)",backgroundColor:"rgba(102, 126, 234, 0.1)",tension:.3},{label:"输出Token",data:T,borderColor:"rgb(240, 147, 251)",backgroundColor:"rgba(240, 147, 251, 0.1)",tension:.3},{label:"缓存创建Token",data:v,borderColor:"rgb(59, 130, 246)",backgroundColor:"rgba(59, 130, 246, 0.1)",tension:.3},{label:"缓存读取Token",data:G,borderColor:"rgb(147, 51, 234)",backgroundColor:"rgba(147, 51, 234, 0.1)",tension:.3},{label:"费用 (USD)",data:yt,borderColor:"rgb(34, 197, 94)",backgroundColor:"rgba(34, 197, 94, 0.1)",tension:.3,yAxisID:"y2"},{label:"请求数",data:nt,borderColor:"rgb(16, 185, 129)",backgroundColor:"rgba(16, 185, 129, 0.1)",tension:.3,yAxisID:"y1"}]};Q=new Rt(W.value,{type:"line",data:M,options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{title:{display:!0,text:"Token使用趋势",font:{size:16,weight:"bold"},color:l.value.text},legend:{position:"top",labels:{color:l.value.legend}},tooltip:{mode:"index",intersect:!1,itemSort:function(p,C){const k=p.dataset.label||"",S=C.dataset.label||"";return k==="费用 (USD)"||S==="费用 (USD)"?k==="费用 (USD)"?-1:1:k==="请求数"||S==="请求数"?k==="请求数"?1:-1:C.parsed.y-p.parsed.y},callbacks:{label:function(p){const C=p.dataset.label||"";let k=p.parsed.y;return C==="费用 (USD)"?k<.01?C+": $"+k.toFixed(6):C+": $"+k.toFixed(4):C==="请求数"?C+": "+k.toLocaleString()+" 次":k>=1e6?C+": "+(k/1e6).toFixed(2)+"M tokens":k>=1e3?C+": "+(k/1e3).toFixed(2)+"K tokens":C+": "+k.toLocaleString()+" tokens"}}}},scales:{x:{type:"category",display:!0,title:{display:!0,text:H==="hour"?"时间":"日期",color:l.value.text},ticks:{color:l.value.text},grid:{color:l.value.grid}},y:{type:"linear",display:!0,position:"left",min:0,title:{display:!0,text:"Token数量",color:l.value.text},ticks:{callback:function(p){return n(p)},color:l.value.text},grid:{color:l.value.grid}},y1:{type:"linear",display:!0,position:"right",min:0,title:{display:!0,text:"请求数",color:l.value.text},grid:{drawOnChartArea:!1},ticks:{callback:function(p){return p.toLocaleString()},color:l.value.text}},y2:{type:"linear",display:!1,position:"right",min:0}}}})}function u(){var yt,lt;if(!z.value)return;X&&X.destroy();const f=K.value.data||[],e=O.value,T=["#3B82F6","#10B981","#F59E0B","#EF4444","#8B5CF6","#EC4899","#14B8A6","#F97316","#6366F1","#84CC16"],v=((yt=K.value.topApiKeys)==null?void 0:yt.map((w,M)=>{var C,k;const x=K.value.data.map(S=>!S.apiKeys||!S.apiKeys[w]?0:e==="tokens"?S.apiKeys[w].tokens:S.apiKeys[w].requests||0);return{label:((k=(C=K.value.data.find(S=>S.apiKeys&&S.apiKeys[w]))==null?void 0:C.apiKeys[w])==null?void 0:k.name)||`API Key ${w}`,data:x,borderColor:T[M%T.length],backgroundColor:T[M%T.length]+"20",tension:.4,fill:!1}}))||[],G=(lt=f[0])!=null&<.date?"date":"hour",nt={labels:f.map(w=>{if(w.label)return w.label;if(G==="hour"){const x=new Date(w.hour),p=String(x.getMonth()+1).padStart(2,"0"),C=String(x.getDate()).padStart(2,"0"),k=String(x.getHours()).padStart(2,"0");return`${p}/${C} ${k}:00`}const M=w.date;if(M&&M.includes("-")){const x=M.split("-");if(x.length>=3)return`${x[1]}/${x[2]}`}return w.date}),datasets:v};X=new Rt(z.value,{type:"line",data:nt,options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{padding:20,usePointStyle:!0,font:{size:12},color:l.value.legend}},tooltip:{mode:"index",intersect:!1,itemSort:function(w,M){return M.parsed.y-w.parsed.y},callbacks:{label:function(w){var F;const M=w.dataset.label||"",x=w.parsed.y,p=w.dataIndex,C=K.value.data[p],S=w.chart.data.datasets.map((I,gt)=>({value:I.data[p]||0,index:gt})).sort((I,gt)=>gt.value-I.value).findIndex(I=>I.index===w.datasetIndex)+1;let E="";if(S===1?E="🥇 ":S===2?E="🥈 ":S===3&&(E="🥉 "),O.value==="tokens"){let I="";x>=1e6?I=(x/1e6).toFixed(2)+"M":x>=1e3?I=(x/1e3).toFixed(2)+"K":I=x.toLocaleString();const gt=K.value.topApiKeys[w.datasetIndex],rt=(F=C==null?void 0:C.apiKeys)==null?void 0:F[gt],ft=(rt==null?void 0:rt.formattedCost)||"$0.00";return`${E}${M}: ${I} tokens (${ft})`}else return`${E}${M}: ${x.toLocaleString()} 次`}}}},scales:{x:{type:"category",display:!0,title:{display:!0,text:H==="hour"?"时间":"日期",color:l.value.text},ticks:{color:l.value.text},grid:{color:l.value.grid}},y:{beginAtZero:!0,min:0,title:{display:!0,text:O.value==="tokens"?"Token 数量":"请求次数",color:l.value.text},ticks:{callback:function(w){return n(w)},color:l.value.text},grid:{color:l.value.grid}}}}})}async function m(){await Pt(O.value),await at(),u()}function h(){var lt,w,M;if(!Dt.value)return;V&&V.destroy();const f=((lt=B.value)==null?void 0:lt.data)||[],e=((w=B.value)==null?void 0:w.topAccounts)||[],T=["#2563EB","#059669","#D97706","#DC2626","#7C3AED","#F472B6","#0EA5E9","#F97316","#6366F1","#22C55E"],v=e.map((x,p)=>{var S,E;const C=f.map(F=>!F.accounts||!F.accounts[x]?0:F.accounts[x].cost||0);return{label:((E=(S=f.find(F=>F.accounts&&F.accounts[x]))==null?void 0:S.accounts[x])==null?void 0:E.name)||`账号 ${String(x).slice(0,6)}`,data:C,borderColor:T[p%T.length],backgroundColor:T[p%T.length]+"20",tension:.4,fill:!1}}),G=(M=f[0])!=null&&M.date?"date":"hour",nt={labels:f.map(x=>{if(x.label)return x.label;if(G==="hour"){const p=new Date(x.hour),C=String(p.getMonth()+1).padStart(2,"0"),k=String(p.getDate()).padStart(2,"0"),S=String(p.getHours()).padStart(2,"0");return`${C}/${k} ${S}:00`}if(x.date&&x.date.includes("-")){const p=x.date.split("-");if(p.length>=3)return`${p[1]}/${p[2]}`}return x.date}),datasets:v},yt=e;V=new Rt(Dt.value,{type:"line",data:nt,options:{responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},plugins:{legend:{position:"bottom",labels:{padding:20,usePointStyle:!0,font:{size:12},color:l.value.legend}},tooltip:{mode:"index",intersect:!1,itemSort:(x,p)=>p.parsed.y-x.parsed.y,callbacks:{label:function(x){var Ot;const p=x.dataset.label||"",C=x.parsed.y||0,k=x.dataIndex,S=x.datasetIndex,E=yt[S],F=B.value.data[k],I=(Ot=F==null?void 0:F.accounts)==null?void 0:Ot[E],rt=x.chart.data.datasets.map((wt,Ut)=>({value:wt.data[k]||0,index:Ut})).sort((wt,Ut)=>Ut.value-wt.value).findIndex(wt=>wt.index===S)+1;let ft="";rt===1?ft="🥇 ":rt===2?ft="🥈 ":rt===3&&(ft="🥉 ");const Gt=(I==null?void 0:I.formattedCost)||d(C),zt=(I==null?void 0:I.requests)||0;return`${ft}${p}: ${Gt} / ${zt.toLocaleString()} 次`}}}},scales:{x:{type:"category",display:!0,title:{display:!0,text:H.value==="hour"?"时间":"日期",color:l.value.text},ticks:{color:l.value.text},grid:{color:l.value.grid}},y:{beginAtZero:!0,min:0,title:{display:!0,text:"消耗金额 (USD)",color:l.value.text},ticks:{callback:x=>d(Number(x)),color:l.value.text},grid:{color:l.value.grid}}}}})}async function P(f){if(!(ht.value===f||Ct.value)){Ct.value=!0;try{await It(f),await at(),h()}finally{Ct.value=!1}}}xt(N,()=>{at(()=>i())}),xt(bt,()=>{at(()=>c())}),xt(K,()=>{at(()=>u())}),xt(B,()=>{at(()=>h())});async function L(){if(!r.value){r.value=!0;try{await Promise.all([kt(),mt()])}finally{r.value=!1}}}function pt(){J.value&&(q.value=tt.value,j.value&&clearInterval(j.value),et.value&&clearTimeout(et.value),j.value=setInterval(()=>{q.value--,q.value<=0&&clearInterval(j.value)},1e3),et.value=setTimeout(async()=>{await L(),J.value&&pt()},tt.value*1e3))}function At(){j.value&&(clearInterval(j.value),j.value=null),et.value&&(clearTimeout(et.value),et.value=null),q.value=0}return xt(J,f=>{f?pt():At()}),xt(ct,()=>{at(()=>{i(),c(),u(),h()})}),Vt(async()=>{await L(),await at(),i(),c(),u(),h()}),jt(()=>{At(),Z&&Z.destroy(),Q&&Q.destroy(),X&&X.destroy(),V&&V.destroy()}),(f,e)=>{const T=qt;return D(),_("div",null,[t("div",Jt,[t("div",te,[t("div",ee,[t("div",null,[e[7]||(e[7]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 总API Keys ",-1)),t("p",ae,y(a(s).totalApiKeys),1),t("p",se," 活跃: "+y(a(s).activeApiKeys||0),1)]),e[8]||(e[8]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-blue-500 to-blue-600"},[t("i",{class:"fas fa-key"})],-1))])]),t("div",oe,[t("div",ne,[t("div",le,[e[16]||(e[16]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 服务账户 ",-1)),t("div",re,[t("p",ie,y(a(s).totalAccounts),1),a(s).accountsByPlatform?(D(),_("div",de,[a(s).accountsByPlatform.claude&&a(s).accountsByPlatform.claude.total>0?(D(),_("div",{key:0,class:"inline-flex items-center gap-0.5",title:`Claude: ${a(s).accountsByPlatform.claude.total} 个 (正常: ${a(s).accountsByPlatform.claude.normal})`},[e[9]||(e[9]=t("i",{class:"fas fa-brain text-xs text-indigo-600"},null,-1)),t("span",ue,y(a(s).accountsByPlatform.claude.total),1)],8,ce)):A("",!0),a(s).accountsByPlatform["claude-console"]&&a(s).accountsByPlatform["claude-console"].total>0?(D(),_("div",{key:1,class:"inline-flex items-center gap-0.5",title:`Console: ${a(s).accountsByPlatform["claude-console"].total} 个 (正常: ${a(s).accountsByPlatform["claude-console"].normal})`},[e[10]||(e[10]=t("i",{class:"fas fa-terminal text-xs text-purple-600"},null,-1)),t("span",pe,y(a(s).accountsByPlatform["claude-console"].total),1)],8,me)):A("",!0),a(s).accountsByPlatform.gemini&&a(s).accountsByPlatform.gemini.total>0?(D(),_("div",{key:2,class:"inline-flex items-center gap-0.5",title:`Gemini: ${a(s).accountsByPlatform.gemini.total} 个 (正常: ${a(s).accountsByPlatform.gemini.normal})`},[e[11]||(e[11]=t("i",{class:"fas fa-robot text-xs text-yellow-600"},null,-1)),t("span",ge,y(a(s).accountsByPlatform.gemini.total),1)],8,ye)):A("",!0),a(s).accountsByPlatform.bedrock&&a(s).accountsByPlatform.bedrock.total>0?(D(),_("div",{key:3,class:"inline-flex items-center gap-0.5",title:`Bedrock: ${a(s).accountsByPlatform.bedrock.total} 个 (正常: ${a(s).accountsByPlatform.bedrock.normal})`},[e[12]||(e[12]=t("i",{class:"fab fa-aws text-xs text-orange-600"},null,-1)),t("span",xe,y(a(s).accountsByPlatform.bedrock.total),1)],8,fe)):A("",!0),a(s).accountsByPlatform.openai&&a(s).accountsByPlatform.openai.total>0?(D(),_("div",{key:4,class:"inline-flex items-center gap-0.5",title:`OpenAI: ${a(s).accountsByPlatform.openai.total} 个 (正常: ${a(s).accountsByPlatform.openai.normal})`},[e[13]||(e[13]=t("i",{class:"fas fa-openai text-xs text-gray-100"},null,-1)),t("span",be,y(a(s).accountsByPlatform.openai.total),1)],8,ve)):A("",!0),a(s).accountsByPlatform.azure_openai&&a(s).accountsByPlatform.azure_openai.total>0?(D(),_("div",{key:5,class:"inline-flex items-center gap-0.5",title:`Azure OpenAI: ${a(s).accountsByPlatform.azure_openai.total} 个 (正常: ${a(s).accountsByPlatform.azure_openai.normal})`},[e[14]||(e[14]=t("i",{class:"fab fa-microsoft text-xs text-blue-600"},null,-1)),t("span",ke,y(a(s).accountsByPlatform.azure_openai.total),1)],8,he)):A("",!0),a(s).accountsByPlatform["openai-responses"]&&a(s).accountsByPlatform["openai-responses"].total>0?(D(),_("div",{key:6,class:"inline-flex items-center gap-0.5",title:`OpenAI Responses: ${a(s).accountsByPlatform["openai-responses"].total} 个 (正常: ${a(s).accountsByPlatform["openai-responses"].normal})`},[e[15]||(e[15]=t("i",{class:"fas fa-server text-xs text-cyan-600"},null,-1)),t("span",De,y(a(s).accountsByPlatform["openai-responses"].total),1)],8,_e)):A("",!0)])):A("",!0)]),t("p",Ce,[R(" 正常: "+y(a(s).normalAccounts||0)+" ",1),a(s).abnormalAccounts>0?(D(),_("span",we," | 异常: "+y(a(s).abnormalAccounts),1)):A("",!0),a(s).pausedAccounts>0?(D(),_("span",Te," | 停止调度: "+y(a(s).pausedAccounts),1)):A("",!0),a(s).rateLimitedAccounts>0?(D(),_("span",Se," | 限流: "+y(a(s).rateLimitedAccounts),1)):A("",!0)])]),e[17]||(e[17]=t("div",{class:"stat-icon ml-2 flex-shrink-0 bg-gradient-to-br from-green-500 to-green-600"},[t("i",{class:"fas fa-user-circle"})],-1))])]),t("div",$e,[t("div",Ae,[t("div",null,[e[18]||(e[18]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日请求 ",-1)),t("p",Re,y(a(s).todayRequests),1),t("p",Pe," 总请求: "+y(n(a(s).totalRequests||0)),1)]),e[19]||(e[19]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-purple-500 to-purple-600"},[t("i",{class:"fas fa-chart-line"})],-1))])]),t("div",Ie,[t("div",Be,[t("div",null,[e[20]||(e[20]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 系统状态 ",-1)),t("p",Ue,y(a(s).systemStatus),1),t("p",Me," 运行时间: "+y(a(ut)),1)]),e[21]||(e[21]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-yellow-500 to-orange-500"},[t("i",{class:"fas fa-heartbeat"})],-1))])])]),t("div",Ke,[t("div",Fe,[t("div",Oe,[t("div",Le,[e[26]||(e[26]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 今日Token ",-1)),t("div",Ee,[t("p",Ge,y(n((a(s).todayInputTokens||0)+(a(s).todayOutputTokens||0)+(a(s).todayCacheCreateTokens||0)+(a(s).todayCacheReadTokens||0))),1),t("span",ze,"/ "+y(a(vt).todayCosts.formatted.totalCost),1)]),t("div",qe,[t("div",He,[t("span",null,[e[22]||(e[22]=R("输入: ",-1)),t("span",Ve,y(n(a(s).todayInputTokens||0)),1)]),t("span",null,[e[23]||(e[23]=R("输出: ",-1)),t("span",je,y(n(a(s).todayOutputTokens||0)),1)]),(a(s).todayCacheCreateTokens||0)>0?(D(),_("span",Ne,[e[24]||(e[24]=R("缓存创建: ",-1)),t("span",Ye,y(n(a(s).todayCacheCreateTokens||0)),1)])):A("",!0),(a(s).todayCacheReadTokens||0)>0?(D(),_("span",We,[e[25]||(e[25]=R("缓存读取: ",-1)),t("span",Ze,y(n(a(s).todayCacheReadTokens||0)),1)])):A("",!0)])])]),e[27]||(e[27]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-indigo-500 to-indigo-600"},[t("i",{class:"fas fa-coins"})],-1))])]),t("div",Qe,[t("div",Xe,[t("div",Je,[e[32]||(e[32]=t("p",{class:"mb-1 text-xs font-semibold text-gray-600 dark:text-gray-400 sm:text-sm"}," 总Token消耗 ",-1)),t("div",ta,[t("p",ea,y(n((a(s).totalInputTokens||0)+(a(s).totalOutputTokens||0)+(a(s).totalCacheCreateTokens||0)+(a(s).totalCacheReadTokens||0))),1),t("span",aa,"/ "+y(a(vt).totalCosts.formatted.totalCost),1)]),t("div",sa,[t("div",oa,[t("span",null,[e[28]||(e[28]=R("输入: ",-1)),t("span",na,y(n(a(s).totalInputTokens||0)),1)]),t("span",null,[e[29]||(e[29]=R("输出: ",-1)),t("span",la,y(n(a(s).totalOutputTokens||0)),1)]),(a(s).totalCacheCreateTokens||0)>0?(D(),_("span",ra,[e[30]||(e[30]=R("缓存创建: ",-1)),t("span",ia,y(n(a(s).totalCacheCreateTokens||0)),1)])):A("",!0),(a(s).totalCacheReadTokens||0)>0?(D(),_("span",da,[e[31]||(e[31]=R("缓存读取: ",-1)),t("span",ca,y(n(a(s).totalCacheReadTokens||0)),1)])):A("",!0)])])]),e[33]||(e[33]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-emerald-500 to-emerald-600"},[t("i",{class:"fas fa-database"})],-1))])]),t("div",ua,[t("div",ma,[t("div",null,[t("p",pa,[e[34]||(e[34]=R(" 实时RPM ",-1)),t("span",ya,"("+y(a(s).metricsWindow)+"分钟)",1)]),t("p",ga,y(a(s).realtimeRPM||0),1),t("p",fa,[e[36]||(e[36]=R(" 每分钟请求数 ",-1)),a(s).isHistoricalMetrics?(D(),_("span",xa,e[35]||(e[35]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),R(" 历史数据 ",-1)]))):A("",!0)])]),e[37]||(e[37]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-orange-500 to-orange-600"},[t("i",{class:"fas fa-tachometer-alt"})],-1))])]),t("div",va,[t("div",ba,[t("div",null,[t("p",ha,[e[38]||(e[38]=R(" 实时TPM ",-1)),t("span",ka,"("+y(a(s).metricsWindow)+"分钟)",1)]),t("p",_a,y(n(a(s).realtimeTPM||0)),1),t("p",Da,[e[40]||(e[40]=R(" 每分钟Token数 ",-1)),a(s).isHistoricalMetrics?(D(),_("span",Ca,e[39]||(e[39]=[t("i",{class:"fas fa-exclamation-circle"},null,-1),R(" 历史数据 ",-1)]))):A("",!0)])]),e[41]||(e[41]=t("div",{class:"stat-icon flex-shrink-0 bg-gradient-to-br from-rose-500 to-rose-600"},[t("i",{class:"fas fa-rocket"})],-1))])])]),t("div",wa,[t("div",Ta,[e[48]||(e[48]=t("h3",{class:"text-lg font-bold text-gray-900 dark:text-gray-100 sm:text-xl"}," 模型使用分布与Token使用趋势 ",-1)),t("div",Sa,[t("div",$a,[(D(!0),_(Mt,null,Kt(a(Y).presetOptions,v=>(D(),_("button",{key:v.value,class:st(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(Y).preset===v.value&&a(Y).type==="preset"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:G=>a(o)(v.value)},y(v.label),11,Aa))),128))]),t("div",Ra,[t("button",{class:st(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(H)==="day"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[0]||(e[0]=v=>a(_t)("day"))},e[42]||(e[42]=[t("i",{class:"fas fa-calendar-day mr-1"},null,-1),R("按天 ",-1)]),2),t("button",{class:st(["rounded-md px-3 py-1 text-sm font-medium transition-colors",a(H)==="hour"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[1]||(e[1]=v=>a(_t)("hour"))},e[43]||(e[43]=[t("i",{class:"fas fa-clock mr-1"},null,-1),R("按小时 ",-1)]),2)]),t("div",Pa,[Nt(T,{modelValue:a(Y).customRange,"onUpdate:modelValue":e[2]||(e[2]=v=>a(Y).customRange=v),class:"custom-date-picker w-full lg:w-auto","default-time":a($t),"disabled-date":a(Bt),"end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","range-separator":"至",size:"default","start-placeholder":"开始日期",style:{"max-width":"400px"},type:"datetimerange","value-format":"YYYY-MM-DD HH:mm:ss",onChange:a(U)},null,8,["modelValue","default-time","disabled-date","onChange"]),a(H)==="hour"?(D(),_("span",Ia,e[44]||(e[44]=[t("i",{class:"fas fa-info-circle"},null,-1),R(" 最多24小时 ",-1)]))):A("",!0)]),t("div",Ba,[t("div",Ua,[t("label",Ma,[Yt(t("input",{"onUpdate:modelValue":e[3]||(e[3]=v=>J.value=v),class:"peer sr-only",type:"checkbox"},null,512),[[Wt,J.value]]),e[47]||(e[47]=t("div",{class:"peer relative h-5 w-9 rounded-full bg-gray-300 transition-all duration-200 after:absolute after:left-[2px] after:top-0.5 after:h-4 after:w-4 after:rounded-full after:bg-white after:shadow-sm after:transition-transform after:duration-200 after:content-[''] peer-checked:bg-blue-500 peer-checked:after:translate-x-4 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-blue-300 dark:bg-gray-600 dark:after:bg-gray-300 dark:peer-focus:ring-blue-600"},null,-1)),t("span",Ka,[e[45]||(e[45]=t("i",{class:"fas fa-redo-alt text-xs text-gray-500 dark:text-gray-400"},null,-1)),e[46]||(e[46]=t("span",null,"自动刷新",-1)),J.value?(D(),_("span",{key:0,class:st(["ml-1 font-mono text-xs text-blue-600 transition-opacity",q.value>0?"opacity-100":"opacity-0"])},y(q.value)+"s ",3)):A("",!0)])])]),t("button",{class:"flex items-center gap-1 rounded-md border border-gray-300 bg-white px-3 py-1 text-sm font-medium text-blue-600 shadow-sm transition-colors hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:hover:bg-gray-700 sm:gap-2",disabled:r.value,title:"立即刷新数据",onClick:e[4]||(e[4]=v=>L())},[t("i",{class:st(["fas fa-sync-alt text-xs",{"animate-spin":r.value}])},null,2),t("span",Oa,y(r.value?"刷新中":"刷新"),1)],8,Fa)])])]),t("div",La,[t("div",Ea,[e[49]||(e[49]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," Token使用分布 ",-1)),t("div",Ga,[t("canvas",{ref_key:"modelUsageChart",ref:b},null,512)])]),t("div",za,[e[52]||(e[52]=t("h4",{class:"mb-4 text-base font-semibold text-gray-800 dark:text-gray-200 sm:text-lg"}," 详细统计数据 ",-1)),a(N).length===0?(D(),_("div",qa,e[50]||(e[50]=[t("p",{class:"text-sm text-gray-500 sm:text-base"},"暂无模型使用数据",-1)]))):(D(),_("div",Ha,[t("table",Va,[e[51]||(e[51]=t("thead",{class:"sticky top-0 bg-gray-50 dark:bg-gray-700"},[t("tr",null,[t("th",{class:"px-2 py-2 text-left text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 模型 "),t("th",{class:"hidden px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:table-cell sm:px-4"}," 请求数 "),t("th",{class:"px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 总Token "),t("th",{class:"px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:px-4"}," 费用 "),t("th",{class:"hidden px-2 py-2 text-right text-xs font-medium text-gray-700 dark:text-gray-300 sm:table-cell sm:px-4"}," 占比 ")])],-1)),t("tbody",ja,[(D(!0),_(Mt,null,Kt(a(N),v=>(D(),_("tr",{key:v.model,class:"hover:bg-gray-50 dark:hover:bg-gray-700"},[t("td",Na,[t("span",{class:"block max-w-[100px] truncate sm:max-w-none",title:v.model},y(v.model),9,Ya)]),t("td",Wa,y(n(v.requests)),1),t("td",Za,y(n(v.allTokens)),1),t("td",Qa,y(v.formatted?v.formatted.total:"$0.000000"),1),t("td",Xa,[t("span",Ja,y(g(v.allTokens,a(N)))+"% ",1)])]))),128))])])]))])])]),t("div",ts,[t("div",es,[t("div",as,[t("canvas",{ref_key:"usageTrendChart",ref:W},null,512)])])]),t("div",ss,[t("div",os,[t("div",ns,[e[55]||(e[55]=t("h3",{class:"text-base font-semibold text-gray-900 dark:text-gray-100 sm:text-lg"}," API Keys 使用趋势 ",-1)),t("div",ls,[t("button",{class:st(["rounded-md px-2 py-1 text-xs font-medium transition-colors sm:px-3 sm:text-sm",a(O)==="requests"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[5]||(e[5]=v=>(O.value="requests",m()))},e[53]||(e[53]=[t("i",{class:"fas fa-exchange-alt mr-1"},null,-1),t("span",{class:"hidden sm:inline"},"请求次数",-1),t("span",{class:"sm:hidden"},"请求",-1)]),2),t("button",{class:st(["rounded-md px-2 py-1 text-xs font-medium transition-colors sm:px-3 sm:text-sm",a(O)==="tokens"?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:e[6]||(e[6]=v=>(O.value="tokens",m()))},e[54]||(e[54]=[t("i",{class:"fas fa-coins mr-1"},null,-1),t("span",{class:"hidden sm:inline"},"Token 数量",-1),t("span",{class:"sm:hidden"},"Token",-1)]),2)])]),t("div",rs,[a(K).totalApiKeys>10?(D(),_("span",is," 共 "+y(a(K).totalApiKeys)+" 个 API Key,显示使用量前 10 个 ",1)):(D(),_("span",ds," 共 "+y(a(K).totalApiKeys)+" 个 API Key ",1))]),t("div",cs,[t("canvas",{ref_key:"apiKeysUsageTrendChart",ref:z},null,512)])])]),t("div",us,[t("div",ms,[t("div",ps,[t("div",ys,[e[56]||(e[56]=t("h3",{class:"text-base font-semibold text-gray-900 dark:text-gray-100 sm:text-lg"}," 账号使用趋势 ",-1)),t("span",gs," 当前分组:"+y(a(B).groupLabel||"未选择"),1)]),t("div",fs,[t("div",xs,[(D(),_(Mt,null,Kt(ot,v=>t("button",{key:v.value,class:st(["rounded-md px-2 py-1 text-xs font-medium transition-colors sm:px-3 sm:text-sm",a(ht)===v.value?"bg-white text-blue-600 shadow-sm dark:bg-gray-800":"text-gray-600 hover:text-gray-900 dark:text-gray-300 dark:hover:text-gray-100"]),onClick:G=>P(v.value)},y(v.label),11,vs)),64))])])]),t("div",bs,[t("span",null,"共 "+y(a(B).totalAccounts||0)+" 个账号",1),a(B).topAccounts&&a(B).topAccounts.length?(D(),_("span",hs," 显示消耗排名前 "+y(a(B).topAccounts.length)+" 个账号 ",1)):A("",!0)]),!a(B).data||a(B).data.length===0?(D(),_("div",ks," 暂无账号使用数据 ")):(D(),_("div",_s,[t("canvas",{ref_key:"accountUsageTrendChart",ref:Dt},null,512)]))])])])}}},As=Zt(Ds,[["__scopeId","data-v-f3897099"]]);export{As as default};
|