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