const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/FleetTrendEChart-DuBaa-sD.js","assets/_plugin-vue_export-helper-BDNMzG2s.js","assets/chunk-DK3Fl9T5.js","assets/index-_6O5JL4W.js","assets/index-DUUkodzN.css","assets/StatCardsRow-BGQi59My.js","assets/VTextField-CD7WwKb1.js","assets/VTextField-9wSyupY2.css","assets/VRow-DQSkwKSy.js","assets/VRow-DIr3-SqU.css","assets/VSkeletonLoader-dGuFYK7d.js","assets/VSkeletonLoader-CkAIsbz1.css","assets/StatCardsRow-snFLCRnD.css","assets/FleetTrendEChart-DbHCuhg7.css"])))=>i.map(i=>d[i]); import{t as e}from"./VDataTable-xIamJ7nl.js";import{n as t,t as n}from"./useSnackbar-yP7apGY8.js";import{n as r,t as i}from"./VRow-DQSkwKSy.js";import{Cr as a,Dr as o,Er as s,I as c,K as l,Nt as u,Or as d,P as ee,Q as f,Rr as p,S as m,Sr as h,Tr as g,Ur as _,Vr as v,Yr as y,Yt as b,Zr as x,_ as te,an as S,br as C,di as w,en as T,gr as E,hi as D,ii as O,m as k,pi as A,qt as ne,t as j,tt as M,v as N,w as P,xr as F,y as I,yr as L}from"./index-_6O5JL4W.js";import{a as R,c as z,f as B,h as V,l as H,m as re,n as U,o as W,p as G,s as ie,t as K,u as q}from"./StatCardsRow-BGQi59My.js";import{t as J}from"./_plugin-vue_export-helper-BDNMzG2s.js";import{t as ae}from"./usePageActivateRefresh-CzjzBWP4.js";import{_ as Y,v as oe,y as se}from"./VTextField-CD7WwKb1.js";import{i as X,t as ce}from"./auditNormalize-C-_Ftbtx.js";import{t as le}from"./VSkeletonLoader-dGuFYK7d.js";import{t as ue}from"./VDialog-DEJqI2_G.js";var Z={class:`d-flex align-center justify-space-between mb-1`},de={class:`text-caption text-medium-emphasis text-uppercase`},Q={class:`d-flex align-end ga-2 mb-2`},fe={key:0,class:`text-caption text-medium-emphasis pb-1`},pe={class:`text-caption text-medium-emphasis mt-2`},me=J(d({__name:`FleetTrendKpiStrip`,props:{items:{}},setup(e){function t(e,t){return e==null?`—`:t===`%`?`${e}%`:`${e} 台`}function n(e){return e.min==null||e.max==null?`—`:e.unit===`%`?`${e.min}–${e.max}%`:`${e.min}–${e.max} 台`}function o(e){return e>0?`warning`:e<0?`success`:`default`}function c(e){return e.unit!==`%`||e.current==null||e.threshold==null?``:e.current>=e.threshold?`text-error`:e.current>=e.threshold-10?`text-warning`:`text-success`}function u(e){return e.current==null||e.threshold==null?`primary`:e.current>=e.threshold?`error`:e.current>=e.threshold-10?`warning`:`primary`}return(d,ee)=>(v(),F(i,{dense:``,class:`fleet-kpi-strip`},{default:x(()=>[(v(!0),a(E,null,_(e.items,e=>(v(),F(r,{key:e.key,cols:`6`,sm:`3`},{default:x(()=>[s(j,{rounded:`lg`,border:``,class:A([`pa-3 fleet-kpi-card`,`fleet-kpi-card--${e.key}`])},{default:x(()=>[C(`div`,Z,[C(`span`,de,D(e.label),1),e.delta==null?h(``,!0):(v(),F(I,{key:0,size:`x-small`,color:o(e.delta),variant:`tonal`,label:``},{default:x(()=>[g(D(w(B)(e.delta,e.unit)),1)]),_:2},1032,[`color`]))]),C(`div`,Q,[C(`span`,{class:A([`text-h5 font-weight-bold`,c(e)])},D(t(e.current,e.unit)),3),e.threshold==null?h(``,!0):(v(),a(`span`,fe,` 阈值 `+D(e.threshold)+`% `,1))]),e.unit===`%`&&e.current!=null?(v(),F(l,{key:0,"model-value":e.current,color:u(e),height:`6`,rounded:``,"bg-opacity":`0.15`},null,8,[`model-value`,`color`])):e.max!=null&&e.current!=null&&e.max>0?(v(),F(l,{key:1,"model-value":e.current/e.max*100,color:`success`,height:`6`,rounded:``,"bg-opacity":`0.15`},null,8,[`model-value`])):h(``,!0),C(`div`,pe,` 区间 `+D(n(e))+` · 均 `+D(t(e.avg,e.unit)),1)]),_:2},1032,[`class`])]),_:2},1024))),128))]),_:1}))}}),[[`__scopeId`,`data-v-abbdd903`]]),he={class:`text-medium-emphasis`},ge={key:0},_e={class:`d-flex align-center flex-wrap ga-2`},ve={key:0,class:`py-2`},ye={key:1,class:`text-center py-12`},be={class:`text-caption text-medium-emphasis mt-1`},xe={key:2},Se={class:`d-flex align-center flex-wrap ga-2 mb-3`},Ce={class:`text-subtitle-2 mb-2`},we={key:1,class:`text-medium-emphasis`},Te=J(d({__name:`DashboardFleetTrends`,setup(t,{expose:n}){let r=o(()=>b(()=>import(`./FleetTrendEChart-DuBaa-sD.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13]))),i=O(24),l=O(!0),u=O([]),d=O(10),m=O(``),_=O(!1),y=O(0),S=O({cpu:80,mem:80,disk:80}),k=O(void 0),j=O(void 0),R=O(0),z=O(100),B=L(()=>u.value.length>=2),H=L(()=>R.value>.5||z.value<99.5),U=L(()=>re(u.value.length,R.value,z.value)),W=L(()=>q(u.value,U.value.startIdx,U.value.endIdx)),ie=L(()=>{let{startIdx:e,endIdx:t}=U.value,n=t-e+1;return H.value?`视图 ${G(u.value[e]?.recorded_at??``).slice(5,16)} — ${G(u.value[t]?.recorded_at??``).slice(5,16)} · ${n} 条`:i.value>=168?`全周期 ${n} 条采样`:`近 24 小时 · ${n} 条`}),K=L(()=>[{key:`cpu`,label:`CPU`,unit:`%`,current:W.value.cpu.current,delta:W.value.cpu.delta,min:W.value.cpu.min,max:W.value.cpu.max,avg:W.value.cpu.avg,threshold:S.value.cpu},{key:`mem`,label:`内存`,unit:`%`,current:W.value.mem.current,delta:W.value.mem.delta,min:W.value.mem.min,max:W.value.mem.max,avg:W.value.mem.avg,threshold:S.value.mem},{key:`disk`,label:`磁盘`,unit:`%`,current:W.value.disk.current,delta:W.value.disk.delta,min:W.value.disk.min,max:W.value.disk.max,avg:W.value.disk.avg,threshold:S.value.disk},{key:`online`,label:`在线`,unit:`台`,current:W.value.online.current,delta:W.value.online.delta,min:W.value.online.min,max:W.value.online.max,avg:W.value.online.avg}]),J=[{title:`采样时间`,key:`recorded_at`,sortable:!1},{title:`CPU`,key:`cpu_avg`,align:`end`,width:72},{title:`内存`,key:`mem_avg`,align:`end`,width:72},{title:`磁盘`,key:`disk_avg`,align:`end`,width:72},{title:`在线`,key:`online_count`,align:`end`,width:64},{title:`采样数`,key:`sample_count`,align:`end`,width:72},{title:`覆盖率`,key:`coverage`,align:`end`,width:72,sortable:!1},{title:`告警`,key:`alert_count`,align:`end`,width:56}],ae=L(()=>[...u.value].reverse());function X(e){return e==null?`—`:`${e}%`}function ce(e){return e.sample_count==null||e.online_count<=0?`—`:`${Math.round(e.sample_count/e.online_count*100)}%`}function Z(e,t){return e==null?``:e>=t?`text-error font-weight-medium`:e>=t-10?`text-warning`:``}function de(e){R.value=e.startPercent,z.value=e.endPercent}function Q(){k.value=i.value>=168?65:0,j.value=100,R.value=k.value,z.value=100,y.value+=1}function fe(){Q(),Te()}async function pe(){try{let e=await T.get(`/settings/`);S.value=V(Array.isArray(e)?e:[])}catch{}}async function Te(){l.value=!0;try{let e=await T.get(`/servers/fleet-metrics`,{hours:i.value});u.value=e.points||[],d.value=e.interval_minutes||10,m.value=ne(new Date().toISOString()).slice(11,19)}catch{u.value=[]}finally{l.value=!1}}async function $(){await Promise.all([Te(),pe()])}return p(()=>{Q(),$()}),n({reload:$}),(t,n)=>(v(),a(E,null,[s(Y,{elevation:`0`,rounded:`lg`,border:``,class:`fleet-trends-card`},{default:x(()=>[s(se,null,{title:x(()=>[...n[5]||=[C(`span`,{class:`text-h6`},`舰队资源趋势`,-1)]]),subtitle:x(()=>[C(`span`,he,[g(` 全库 Agent 均值 · 每 `+D(d.value)+` 分钟采样 · 北京时间 `,1),m.value?(v(),a(`span`,ge,` · 更新于 `+D(m.value),1)):h(``,!0)])]),append:x(()=>[C(`div`,_e,[s(M,{modelValue:i.value,"onUpdate:modelValue":[n[0]||=e=>i.value=e,fe],density:`compact`,variant:`outlined`,divided:``,mandatory:``},{default:x(()=>[s(c,{value:24,size:`small`},{default:x(()=>[...n[6]||=[g(`24 小时`,-1)]]),_:1}),s(c,{value:168,size:`small`},{default:x(()=>[...n[7]||=[g(`7 天`,-1)]]),_:1})]),_:1},8,[`modelValue`]),s(c,{size:`small`,variant:`tonal`,"prepend-icon":`mdi-fullscreen`,disabled:!B.value,onClick:n[1]||=e=>_.value=!0},{default:x(()=>[...n[8]||=[g(` 全屏 `,-1)]]),_:1},8,[`disabled`]),s(c,{icon:`mdi-refresh`,size:`small`,variant:`text`,loading:l.value,title:`刷新`,onClick:n[2]||=e=>$()},null,8,[`loading`])])]),_:1}),s(oe,{class:`pt-0`},{default:x(()=>[l.value?(v(),a(`div`,ve,[s(le,{type:`heading`,class:`mb-3`}),s(le,{type:`image`,height:`360`})])):B.value?(v(),a(`div`,xe,[C(`div`,Se,[s(I,{size:`small`,variant:`outlined`,label:``},{default:x(()=>[g(D(ie.value),1)]),_:1}),H.value?(v(),F(I,{key:0,size:`small`,color:`primary`,variant:`tonal`,label:``,closable:``,"onClick:close":Q},{default:x(()=>[...n[10]||=[g(` 已缩放视图 · 点击关闭恢复全览 `,-1)]]),_:1})):h(``,!0)]),s(me,{items:K.value,class:`mb-4`},null,8,[`items`]),(v(),F(w(r),{key:y.value,points:u.value,hours:i.value,thresholds:S.value,"zoom-start":k.value,"zoom-end":j.value,onRangeChange:de},null,8,[`points`,`hours`,`thresholds`,`zoom-start`,`zoom-end`]))])):(v(),a(`div`,ye,[s(f,{icon:`mdi-chart-timeline-variant`,size:`48`,color:`disabled`,class:`mb-3`}),n[9]||=C(`div`,{class:`text-body-1 text-medium-emphasis`},`暂无历史采样数据`,-1),C(`div`,be,` 心跳落库后约 `+D(d.value)+` 分钟出现首条;满 24 小时后曲线更完整 `,1)]))]),_:1})]),_:1}),s(ue,{modelValue:_.value,"onUpdate:modelValue":n[4]||=e=>_.value=e,fullscreen:``,transition:`dialog-bottom-transition`},{default:x(()=>[s(Y,null,{default:x(()=>[s(P,{density:`comfortable`,border:``},{default:x(()=>[s(ee,null,{default:x(()=>[g(`舰队资源趋势 · `+D(i.value>=168?`7 天`:`24 小时`),1)]),_:1}),s(te),s(c,{icon:`mdi-close`,onClick:n[3]||=e=>_.value=!1})]),_:1}),s(oe,{class:`pa-4 pa-md-6`},{default:x(()=>[s(me,{items:K.value,class:`mb-4`},null,8,[`items`]),s(w(r),{points:u.value,hours:i.value,thresholds:S.value,height:420,"zoom-start":k.value,"zoom-end":j.value,onRangeChange:de},null,8,[`points`,`hours`,`thresholds`,`zoom-start`,`zoom-end`]),s(N,{class:`my-4`}),C(`div`,Ce,`采样明细(`+D(u.value.length)+` 条)`,1),s(e,{headers:J,items:ae.value,"items-per-page":15,density:`compact`,height:`320`,"fixed-header":``,class:`fleet-trend-table`},{"item.recorded_at":x(({item:e})=>[g(D(w(G)(e.recorded_at)),1)]),"item.cpu_avg":x(({item:e})=>[C(`span`,{class:A(Z(e.cpu_avg,S.value.cpu))},D(X(e.cpu_avg)),3)]),"item.mem_avg":x(({item:e})=>[C(`span`,{class:A(Z(e.mem_avg,S.value.mem))},D(X(e.mem_avg)),3)]),"item.disk_avg":x(({item:e})=>[C(`span`,{class:A(Z(e.disk_avg,S.value.disk))},D(X(e.disk_avg)),3)]),"item.coverage":x(({item:e})=>[g(D(ce(e)),1)]),"item.alert_count":x(({item:e})=>[(e.alert_count??0)>0?(v(),F(I,{key:0,size:`x-small`,color:`error`,variant:`tonal`,label:``},{default:x(()=>[g(D(e.alert_count),1)]),_:2},1024)):(v(),a(`span`,we,`0`))]),_:1},8,[`items`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64))}}),[[`__scopeId`,`data-v-3da01bdd`]]),$={key:0,class:`text-center text-medium-emphasis py-4`},Ee={class:`text-body-large font-weight-regular`},De={class:`d-flex justify-space-between align-center text-medium-emphasis`},Oe={class:`py-1`},ke={key:0,class:`text-center text-medium-emphasis py-4`},Ae={class:`text-caption`},je={class:`d-flex justify-space-between align-center`},Me={class:`text-medium-emphasis`},Ne={class:`text-body-2 font-weight-medium`},Pe={key:0,class:`text-center text-medium-emphasis py-4`},Fe=J(d({name:`DashboardPage`,__name:`DashboardPage`,setup(e){let o=n(),d=S(),ee=O(null),f=O(!0),p=O(!1),{statItems:b}=H(),te=L(()=>b.value.map((e,t)=>{let n=R[t];return{...e,key:n,clickable:n!==`total`}}));function ne(e){if(e===`alerts`){d.push({path:`/alerts`});return}if(e===`online`){d.push({path:`/servers`});return}if(e===`offline`){d.push({path:`/servers`,query:{status:`offline`}});return}e===`unset-path`&&d.push({path:`/servers`,query:{unset_path:`1`}})}let j=O([]),M=O([{title:`在线率`,progress:0,text:`在`,value:`0%`},{title:`Agent 覆盖`,progress:0,text:`A`,value:`0%`},{title:`CPU 平均`,progress:0,text:`C`,value:`0%`},{title:`内存平均`,progress:0,text:`M`,value:`0%`}]),N=O({}),P=O(0),B=O([]);async function V(e=!1){e||(f.value=!0);try{let e=await ie();W(b,e),re(e)}catch{e||o(`加载统计数据失败`,`error`)}finally{e||(f.value=!1)}}function re(e){N.value=e.categories||{},P.value=e.total;let t=e.total?Math.round(e.online/e.total*100):0;M.value[0].progress=t,M.value[0].value=`${t}%`}async function G(){p.value=!0;try{re(await z(b))}catch{o(`刷新统计数据失败`,`error`)}finally{p.value=!1}}async function q(){try{j.value=((await T.get(`/alert-history/`,{limit:5})).items||[]).map(e=>({title:e.server_name,subtitle:`${e.alert_type} ${e.is_recovery?`(已恢复)`:``} · ${U(e.created_at)}`,value:e.value,color:e.is_recovery?`green`:`red`,icon:e.is_recovery?`mdi-check-circle`:`mdi-alert-circle`}))}catch{j.value=[],o(`加载告警记录失败`,`error`)}}async function J(){try{B.value=ce((await T.get(`/audit/`,{limit:10})).items||[]).slice(0,10)}catch{B.value=[],o(`加载审计记录失败`,`error`)}}async function oe(){try{let e=await T.get(`/servers/`,{per_page:200}),t=e.items||[],n=e.total||t.length;if(n===0)return;let r=t.filter(e=>e.agent_version).length,i=Math.round(r/n*100);M.value[1].progress=i,M.value[1].value=`${i}%`;let a=t.filter(e=>e.system_info?.cpu_usage!=null),o=t.filter(e=>e.system_info?.mem_usage!=null);if(a.length>0){let e=Math.round(a.reduce((e,t)=>e+(t.system_info.cpu_usage||0),0)/a.length);M.value[2].progress=e,M.value[2].value=`${e}%`}if(o.length>0){let e=Math.round(o.reduce((e,t)=>e+(t.system_info.mem_usage||0),0)/o.length);M.value[3].progress=e,M.value[3].value=`${e}%`}}catch{}}async function se(e=!1){await Promise.all([V(e),q(),oe(),J(),ee.value?.reload?.()]),e||T.post(`/settings/bing-wallpapers/sync`).catch(()=>{})}return y(u().alerts,()=>{V(!0),q()}),ae(e=>se(e)),(e,n)=>(v(),F(t,{fluid:``,class:`pa-4 pa-md-6 dashboard-root`},{default:x(()=>[s(K,{items:te.value,loading:f.value,refreshing:p.value,onClick:ne,onRefresh:G},null,8,[`items`,`loading`,`refreshing`]),s(i,{class:`mt-5`},{default:x(()=>[s(r,{cols:`12`},{default:x(()=>[s(Te,{ref_key:`fleetTrendsRef`,ref:ee},null,512)]),_:1})]),_:1}),s(i,{class:`mt-5`},{default:x(()=>[s(r,{cols:`12`,md:`6`},{default:x(()=>[s(Y,{elevation:`0`,rounded:`lg`,title:`告警历史`,border:``},{append:x(()=>[...n[0]||=[C(`div`,{class:`my-5`},null,-1)]]),text:x(()=>[j.value.length===0?(v(),a(`div`,$,` 暂无告警 `)):h(``,!0),(v(!0),a(E,null,_(j.value,(e,t)=>(v(),F(k,{key:t,class:A([t!==0&&`mt-4`,`px-0`]),subtitle:e.subtitle,title:e.title,lines:`one`},{prepend:x(()=>[s(m,{color:e.color,icon:e.icon,variant:`tonal`,rounded:``},null,8,[`color`,`icon`])]),append:x(()=>[C(`span`,Ee,D(e.value),1)]),_:2},1032,[`class`,`subtitle`,`title`]))),128))]),_:1})]),_:1}),s(r,{cols:`12`,md:`6`},{default:x(()=>[s(Y,{elevation:`0`,rounded:`lg`,title:`资源概览`,border:``},{append:x(()=>[...n[1]||=[C(`div`,{class:`my-5`},null,-1)]]),text:x(()=>[(v(!0),a(E,null,_(M.value,(e,t)=>(v(),F(k,{key:t,class:A([t!==0&&`mt-4`,`px-0`])},{prepend:x(()=>[s(m,{text:e.text,color:`primary`,size:`large`,variant:`tonal`},null,8,[`text`])]),title:x(()=>[C(`div`,De,[C(`span`,null,D(e.title),1),C(`span`,null,D(e.value),1)])]),subtitle:x(()=>[C(`div`,Oe,[s(l,{"model-value":e.progress,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`8`,rounded:``},null,8,[`model-value`])])]),_:2},1032,[`class`]))),128))]),_:1})]),_:1})]),_:1}),s(i,null,{default:x(()=>[s(r,{cols:`12`,md:`6`},{default:x(()=>[s(Y,{elevation:`0`,rounded:`lg`,title:`分类分布`,border:``},{text:x(()=>[Object.keys(N.value).length===0?(v(),a(`div`,ke,` 暂无分类数据 `)):h(``,!0),(v(!0),a(E,null,_(N.value,(e,t)=>(v(),F(k,{key:t,class:`px-0`},{prepend:x(()=>[s(m,{color:`primary`,variant:`tonal`,size:`small`},{default:x(()=>[C(`span`,Ae,D(t[0]?.toUpperCase()),1)]),_:2},1024)]),title:x(()=>[C(`div`,je,[C(`span`,Me,D(t===`uncategorized`?`未分类`:t),1),C(`span`,Ne,D(e)+` 台`,1)])]),subtitle:x(()=>[s(l,{"model-value":P.value>0?e/P.value*100:0,"bg-color":`surface-light`,"bg-opacity":`1`,color:`primary`,height:`6`,rounded:``},null,8,[`model-value`])]),_:2},1024))),128))]),_:1})]),_:1}),s(r,{cols:`12`,md:`6`},{default:x(()=>[s(Y,{elevation:`0`,rounded:`lg`,title:`最近操作`,border:``},{append:x(()=>[s(c,{size:`small`,variant:`text`,to:`/audit`},{default:x(()=>[...n[2]||=[g(`查看全部`,-1)]]),_:1})]),text:x(()=>[B.value.length===0?(v(),a(`div`,Pe,` 暂无操作记录 `)):h(``,!0),(v(!0),a(E,null,_(B.value,e=>(v(),F(k,{key:e.id,title:w(X)(e),subtitle:`${e.admin_username} · ${w(U)(e.created_at)}`,class:`px-0`,lines:`two`},{append:x(()=>[s(I,{size:`x-small`,variant:`tonal`,label:``},{default:x(()=>[g(D(e.ip_address||`—`),1)]),_:2},1024)]),_:2},1032,[`title`,`subtitle`]))),128))]),_:1})]),_:1})]),_:1})]),_:1}))}}),[[`__scopeId`,`data-v-57d7888b`]]);export{Fe as default};