Files
claude-relay-service/web/admin-spa/dist/assets/DashboardView-L6RVGrpZ.js
2025-12-26 06:58:07 +00:00

2 lines
50 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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