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