import{E as Qt}from"./element-plus-BUfCkBQO.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-R8HMg95E.js";import{c as st,s as Kt,_ as ne,a as re}from"./index-CPpuj8f9.js";import{C as Ft}from"./chart-yFHxLHpB.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};