You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
17 KiB

import{_ as Ot}from"./CCixCNzH.js";import{u as dt}from"./BgfmgSoF.js";import{h as Vt,R as Tt,a as qt}from"./PN667bHc.js";import{g as _t,B as vt,o,c as l,a,t as r,l as f,G as pt,b as Q,w as ct,d as I,F as g,r as h,n as P,x as _,z as k,_ as mt,j as zt,p as H,q as G,y as ut,L as U}from"./AL6uUoB7.js";import"./mydnAiU4.js";const It={class:"ab-head"},Ht={class:"ab-ico"},Gt={class:"ab-title"},Ut={key:0,class:"ab-sub"},Pt={class:"ab-sub"},jt={key:0,class:"ab-list"},Yt={class:"ab-name"},Wt={key:0,class:"ab-chip"},Jt={class:"ab-chip ab-chip-scope"},Zt={class:"ab-msg"},Kt={key:1,class:"ab-streak"},Qt={key:0,class:"ab-more"},Xt=12,te=_t({__name:"SvcAlertBanner",setup(ft,{expose:y}){const{webApi:A}=dt(),w=_([]),m=_(0),E=_(0),M=_(0),F=_(!1),C=_(!1),x=k(()=>Vt(M.value));function S(u){const v=u.app_name?u.app_name:"全局";return u.region?`${v} · ${Tt[u.region]||"区域"+u.region}`:v}function j(u){return qt(u)}async function B(){try{const u=await A("getsvcalerts",{limit:Xt});w.value=u.alerts||[],m.value=u.error_count||0,E.value=u.warn_count||0,M.value=u.last_run||0,C.value=m.value+E.value>w.value.length,F.value=m.value>0}catch{w.value=[],m.value=0,E.value=0}}return vt(B),y({load:B}),(u,v)=>{const O=Ot;return m.value+E.value>0?(o(),l("div",{key:0,class:P(["alert-banner",m.value>0?"lv-error":"lv-warn"])},[a("div",It,[a("span",Ht,r(m.value>0?"🚨":"⚠️"),1),a("div",Gt,[a("strong",null,r(m.value>0?`${m.value} 项第三方服务不可用`:`${E.value} 项第三方服务存在隐患`),1),m.value>0&&E.value>0?(o(),l("span",Ut,",另有 "+r(E.value)+" 项隐患",1)):f("",!0),a("span",Pt," · 最近巡检 "+r(pt(x)),1)]),a("button",{class:"ab-btn",onClick:v[0]||(v[0]=d=>F.value=!F.value)},r(F.value?"收起":"展开详情"),1),Q(O,{to:"/svcinspect",class:"ab-btn ab-btn-primary"},{default:ct(()=>[...v[1]||(v[1]=[I("前往巡检",-1)])]),_:1})]),F.value?(o(),l("div",jt,[(o(!0),l(g,null,h(w.value,d=>(o(),l("div",{key:`${d.app_name}/${d.svc_id}/${d.region}`,class:"ab-item"},[a("span",{class:P(["ab-dot",d.status==="error"?"d-error":"d-warn"])},null,2),a("span",Yt,r(d.name||d.svc_id),1),d.provider?(o(),l("span",Wt,r(d.provider),1)):f("",!0),a("span",Jt,r(S(d)),1),a("span",Zt,r(j(d)),1),d.fail_streak>1?(o(),l("span",Kt,"连续失败 "+r(d.fail_streak)+" 次",1)):f("",!0)]))),128)),C.value?(o(),l("div",Qt,[I(" 仅显示前 "+r(w.value.length)+" 条,其余请到",1),Q(O,{to:"/svcinspect",class:"ab-link"},{default:ct(()=>[...v[2]||(v[2]=[I("服务巡检",-1)])]),_:1}),v[3]||(v[3]=I("查看 ",-1))])):f("",!0)])):f("",!0)],2)):f("",!0)}}}),ee=Object.assign(mt(te,[["__scopeId","data-v-3dd2fb7c"]]),{__name:"SvcAlertBanner"}),se={class:"panel p-4 mb-5"},ae={class:"flex flex-wrap items-end gap-3"},ne={key:0,class:"form-control"},oe=["value"],le={key:1,class:"form-control"},re=["value"],ie={class:"form-control"},ce=["value"],ue={key:2,class:"form-control"},de=["value"],_e={class:"grid grid-cols-2 md:grid-cols-4 gap-3 mb-8"},ve={class:"body"},pe={class:"lbl"},me={class:"val"},fe={class:"today-wrap mb-8"},ye={class:"sec-title hero",style:{"margin-bottom":"16px"}},be={class:"tag",style:{color:"#0369a1",background:"#dbeafe"}},ge={class:"grid grid-cols-2 md:grid-cols-4 gap-4"},he={class:"today-card-top"},ke={class:"lbl"},Ee={class:"val"},Fe={class:"foot"},xe={key:0,class:"delta up"},we={class:"grid grid-cols-1 xl:grid-cols-2 gap-6"},Ce={class:"panel-head"},De=["stroke"],Ae=["d"],Me={class:"font-semibold text-slate-700 text-sm"},Se={key:0,class:"ml-auto text-xs text-slate-400"},Be={key:1,class:"ml-auto flex items-center gap-1"},Le=["onClick"],Ne={class:"px-5 py-4"},$e={class:"grid grid-cols-2 sm:grid-cols-3 gap-2.5"},Re={class:"stat-label"},Oe={class:"stat-val"},Ve={key:0,style:{height:"170px","margin-top":"1rem"}},Te=_t({__name:"dashboard",setup(ft){const y=zt(),{webApi:A,consoleApi:w}=dt(),m=[["cn","中国"],["us","美国"],["ea","东亚"],["sea","东南亚"],["sa","南亚"],["me","中东"],["eu","欧洲"],["ru","俄罗斯"],["af","非洲"],["sam","南美"],["nam","北美"],["oc","大洋洲"],["br","巴西"],["in","印度"]],E={new_user_count:["👥","#EEF2FF","#6366F1"],active_user_count:["🟢","#ECFDF5","#10B981"],bind_device_count:["📱","#E0F2FE","#0EA5E9"],qr_active_count:["🔳","#FCE7F3","#EC4899"],order_paid_count:["🧾","#FEF3C7","#F59E0B"],order_paid_amount:["💰","#FEE2E2","#EF4444"],pay_user_count:["⭐","#FFF7ED","#F97316"],meet_second:["🎙️","#CFFAFE","#22D3EE"],trade_second:["🌐","#F3E8FF","#8B5CF6"]},M=[["new_user_count","累计用户",!1],["bind_device_count","累计绑定设备",!1],["qr_active_count","累计二维码激活",!1],["order_paid_count","累计支付订单",!1],["order_paid_amount","累计支付金额",!0],["meet_second","累计会议时长",!1],["trade_second","累计翻译时长",!1]],F=[["new_user_count","新增用户",!1],["active_user_count","活跃用户",!1],["qr_active_count","二维码激活",!1],["order_paid_count","支付订单",!1],["order_paid_amount","支付金额",!0],["pay_user_count","付费用户",!1],["meet_second","会议时长",!1,!0],["trade_second","翻译时长",!1,!0]],C=[{key:"user",title:"用户增长",color:"#6366F1",tint:"#EEF2FF",icon:"M17 20h5v-2a4 4 0 00-3-3.87M9 20H4v-2a4 4 0 013-3.87m6-1.13a4 4 0 10-4-4 4 4 0 004 4z",stats:[["new_user_count","新增用户"],["active_user_count","活跃用户"],["login_user_count","登录用户"],["login_count","登录次数"]],lines:[["new_user_count","新增用户","#6366F1"],["active_user_count","活跃用户","#34D399"]]},{key:"device",title:"设备激活绑定",color:"#0EA5E9",tint:"#E0F2FE",icon:"M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z",stats:[["active_device_count","已激活"],["bind_device_count","已绑定"]],lines:[["active_device_count","已激活","#0EA5E9"],["bind_device_count","已绑定","#818CF8"]]},{key:"qrcode",title:"二维码激活",color:"#EC4899",tint:"#FCE7F3",icon:"M12 4v1m6 11h2m-6 0h-1v4m-6-4H5m14 0h-2m-6-7H5m0 0V5m0 4v6m14-6V5h-4M5 5h4M5 19h4m6 0h4v-4M4 4h6v6H4V4zm10 0h6v6h-6V4zM4 14h6v6H4v-6z",stats:[["qr_active_count","二维码激活次数"]],lines:[["qr_active_count","二维码激活","#EC4899"]]},{key:"order",title:"订单支付",color:"#F59E0B",tint:"#FEF3C7",icon:"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z",stats:[["order_create_count","创建订单"],["order_paid_count","支付订单"],["order_failed_count","失败订单"],["pay_user_count","付费用户"],["order_paid_amount","支付金额",!0],["order_create_amount","创建金额",!0]],lines:[["order_paid_count","支付订单","#F59E0B"],["order_create_count","创建订单","#FCD34D"]]},{key:"meeting",title:"会议",color:"#22D3EE",tint:"#CFFAFE",icon:"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z",stats:[["meet_count","会议次数"],["meet_second","会议时长",!1,!0],["grant_meet_second","发放会议时长",!1,!0]],lines:[["meet_count","会议次数","#22D3EE"],["meet_second","会议时长(秒)","#0EA5E9"]]},{key:"translate",title:"翻译",color:"#8B5CF6",tint:"#F3E8FF",icon:"M3 5h12M9 3v2m1.048 9.5A18.022 18.022 0 016.412 9m6.088 9h7M11 21l5-10 5 10M12.751 5C11.783 10.77 8.07 15.61 3 18.129",stats:[["trade_count","翻译次数"],["trade_second","翻译时长",!1,!0],["trade_words","翻译字数"],["grant_trade_second","发放翻译时长",!1,!0]],lines:[["trade_count","翻译次数","#8B5CF6"],["trade_second","翻译时长(秒)","#A78BFA"]]}],x=k(()=>y.identity===3&&!y.brandid),S=k(()=>y.isBrandAccount||y.isDealer),j=k(()=>y.apps),B=k(()=>y.regions),u=k(()=>y.products.map(t=>parseInt(t)).filter(t=>!isNaN(t))),v=["new_user_count","active_user_count","qr_active_count"],O=k(()=>x.value?M.filter(t=>!v.includes(t[0])):M),d=k(()=>x.value?F.filter(t=>!v.includes(t[0])):F),X=k(()=>x.value?C.filter(t=>t.key!=="user"&&t.key!=="qrcode"):C),yt=[[7,"7天"],[30,"30天"],[90,"90天"],[0,"全部"]],c=ut({app:"",region:"",product:"",channel:""}),L=_([]),Y=_([]),W=_([]),bt=k(()=>x.value&&B.value.length?m.filter(t=>B.value.includes(t[0])).map(t=>({value:t[0],label:t[1]})):m.map(t=>({value:t[0],label:t[1]}))),tt=_({}),et=_({}),J=_({}),st=_({}),at=_("实时"),Z=_({}),V=ut({});C.forEach(t=>{V[t.key]=30});function T(t){const e=t.getFullYear(),n=("0"+(t.getMonth()+1)).slice(-2),s=("0"+t.getDate()).slice(-2);return parseInt(e+n+s)}function gt(t){if(!t)return{start:0,end:0};const e=new Date,n=new Date;return n.setDate(n.getDate()-(t-1)),{start:T(n),end:T(e)}}function ht(t,e){return t=Number(t)||0,e?"¥"+(t/100).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2}):t.toLocaleString()}function kt(t){t=Math.max(0,Math.floor(Number(t)||0));const e=Math.floor(t/3600),n=Math.floor(t%3600/60),s=t%60;return e>0?e+"时"+n+"分":n>0?n+"分"+s+"秒":s+"秒"}function K(t,e,n){return n?kt(t):ht(t,e)}function Et(t){const e=String(t);return e.length===8?e.slice(4,6)+"-"+e.slice(6,8):e}function Ft(t,e){return t=Number(t)||0,e=Number(e)||0,e===0?t>0?null:0:(t-e)/e*100}function N(t){return E[t]||["📊","#f1f5f9","#94a3b8"]}function xt(t){const e=t[0]==="bind_device_count"||t[0]==="active_device_count"?et.value:tt.value,n=t[0]==="meet_second"||t[0]==="trade_second";return K(e[t[0]],t[2],n)}function wt(t){return K(J.value[t[0]],t[2],!!t[3])}function $(t){const e=Ft(J.value[t[0]],st.value[t[0]]);if(e===null)return{type:"new",arrow:"",abs:""};const n=e>0?"up":e<0?"down":"flat",s=e>0?"▲":e<0?"▼":"—";return{type:n,arrow:s,abs:Math.abs(e).toFixed(1)}}function Ct(t,e){return K((Z.value[t.key]||{})[e[0]],e[2],e[3])}function q(){const t={};return c.app!==""&&(t.app_id=c.app),c.region!==""&&(t.region=c.region),c.product!==""&&(t.product_id=parseInt(String(c.product))),ot(t),t}function nt(){const t={};return c.product!==""&&(t.product_id=parseInt(String(c.product))),ot(t),t}function ot(t){c.channel!==""&&(t.channel_id=c.channel==="__none__"?"":c.channel)}async function D(t,e){try{return{code:0,data:await A(t,e)??{}}}catch{return null}}async function Dt(){const t=await D("getstatssummary",q());tt.value=t&&t.code===0&&t.data?t.data:{};const e=await D("getstatssummary",nt());et.value=e&&e.code===0&&e.data?e.data:{}}async function At(){const t=T(new Date),e=new Date;e.setDate(e.getDate()-1);const n=T(e),s=q();s.start_day=t,s.end_day=t;const i=q();i.start_day=n,i.end_day=n;const b=await D("getstatssummary",s);J.value=b&&b.code===0&&b.data?b.data:{};const p=await D("getstatssummary",i);st.value=p&&p.code===0&&p.data?p.data:{};const z=new Date,$t=("0"+(z.getMonth()+1)).slice(-2),Rt=("0"+z.getDate()).slice(-2);at.value=$t+"-"+Rt+" 实时"}async function lt(t){let e;if(t.key==="device")e=nt();else{const p=gt(V[t.key]);e=q(),e.start_day=p.start,e.end_day=p.end}const n=await D("getstatssummary",e),s=n&&n.code===0&&n.data?n.data:{};if(Z.value={...Z.value,[t.key]:s},t.key==="device")return;const i=await D("getstatstrend",e),b=i&&i.code===0?i.data||[]:[];Bt(t,b)}function Mt(t,e){V[t]=e;const n=C.find(s=>s.key===t);n&&lt(n)}function rt(){Dt(),At(),X.value.forEach(t=>lt(t))}const it={},R={};function St(t,e){e&&(it[t]=e)}function Bt(t,e){const n=window.Chart,s=it[t.key];if(!n||!s)return;const i=e.map(p=>Et(p.stat_day)),b=t.lines.map(p=>({label:p[1],data:e.map(z=>Number(z[p[0]])||0),borderColor:p[2],backgroundColor:p[2]+"22",tension:.35,fill:!0,pointRadius:0,borderWidth:2}));if(R[t.key]){R[t.key].data.labels=i,R[t.key].data.datasets=b,R[t.key].update();return}R[t.key]=new n(s,{type:"line",data:{labels:i,datasets:b},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{position:"bottom",labels:{boxWidth:10,padding:12,font:{size:11}}}},scales:{x:{ticks:{maxTicksLimit:8,font:{size:10},color:"#94a3b8"},grid:{display:!1}},y:{beginAtZero:!0,ticks:{precision:0,maxTicksLimit:5,font:{size:10},color:"#94a3b8"},grid:{color:"#f1f5f9"}}},interaction:{mode:"index",intersect:!1}}})}async function Lt(){if(S.value)L.value=[];else if(x.value)L.value=j.value.map(t=>({value:t,label:t}));else try{const t=await w("apps/list",{}),e=Array.isArray(t)?t:[];L.value=e.map(n=>({value:n.name||"",label:n.name||"应用#"+n.id}))}catch{L.value=[]}try{const t=await A("getproducts",{});let e=t&&t.products?t.products:[];x.value&&u.value.length&&(e=e.filter(n=>u.value.includes(n.id))),W.value=e.map(n=>({value:n.id,label:(n.devicename||"产品#"+n.id)+" (#"+n.id+")"}))}catch{W.value=[]}try{const t=await A("getchannels",{status:-1}),e=t&&t.channels?t.channels:[];Y.value=e.map(n=>({value:n.id,label:(n.name||"渠道商")+" ("+n.id+")"}))}catch{Y.value=[]}}function Nt(){return new Promise(t=>{if(window.Chart)return t();const e=document.createElement("script");e.src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js",e.onload=()=>t(),e.onerror=()=>t(),document.head.appendChild(e)})}return vt(async()=>{await Nt(),await Lt(),rt()}),(t,e)=>{const n=ee;return o(),l("div",null,[Q(n),a("div",se,[a("div",ae,[S.value?f("",!0):(o(),l("div",ne,[e[5]||(e[5]=a("label",{class:"label py-1"},[a("span",{class:"label-text text-xs text-slate-500"},"应用")],-1)),H(a("select",{"onUpdate:modelValue":e[0]||(e[0]=s=>c.app=s),class:"select select-bordered select-sm w-40"},[e[4]||(e[4]=a("option",{value:""},"全部应用",-1)),(o(!0),l(g,null,h(L.value,s=>(o(),l("option",{key:s.value,value:s.value},r(s.label),9,oe))),128))],512),[[G,c.app]])])),S.value?f("",!0):(o(),l("div",le,[e[7]||(e[7]=a("label",{class:"label py-1"},[a("span",{class:"label-text text-xs text-slate-500"},"区域")],-1)),H(a("select",{"onUpdate:modelValue":e[1]||(e[1]=s=>c.region=s),class:"select select-bordered select-sm w-32"},[e[6]||(e[6]=a("option",{value:""},"全部区域",-1)),(o(!0),l(g,null,h(bt.value,s=>(o(),l("option",{key:s.value,value:s.value},r(s.label),9,re))),128))],512),[[G,c.region]])])),a("div",ie,[e[9]||(e[9]=a("label",{class:"label py-1"},[a("span",{class:"label-text text-xs text-slate-500"},"产品")],-1)),H(a("select",{"onUpdate:modelValue":e[2]||(e[2]=s=>c.product=s),class:"select select-bordered select-sm w-48"},[e[8]||(e[8]=a("option",{value:""},"全部产品",-1)),(o(!0),l(g,null,h(W.value,s=>(o(),l("option",{key:s.value,value:s.value},r(s.label),9,ce))),128))],512),[[G,c.product]])]),pt(y).isDealer?f("",!0):(o(),l("div",ue,[e[12]||(e[12]=a("label",{class:"label py-1"},[a("span",{class:"label-text text-xs text-slate-500"},"渠道商")],-1)),H(a("select",{"onUpdate:modelValue":e[3]||(e[3]=s=>c.channel=s),class:"select select-bordered select-sm w-48"},[e[10]||(e[10]=a("option",{value:""},"全部渠道商",-1)),e[11]||(e[11]=a("option",{value:"__none__"},"未分配渠道",-1)),(o(!0),l(g,null,h(Y.value,s=>(o(),l("option",{key:s.value,value:s.value},r(s.label),9,de))),128))],512),[[G,c.channel]])])),a("button",{class:"btn btn-primary btn-sm text-white",onClick:rt},"查询"),e[13]||(e[13]=a("span",{class:"text-xs text-slate-400 ml-auto self-center"},"顶部为全量总览;各版面右上角可单独选时间周期",-1))])]),e[18]||(e[18]=a("div",{class:"sec-title muted"},[a("span",{class:"bar",style:{background:"#cbd5e1"}}),a("h2",null,"累计数据"),a("span",{class:"sub"},"全量累计 · 随筛选条件变化")],-1)),a("div",_e,[(o(!0),l(g,null,h(O.value,s=>(o(),l("div",{key:s[0],class:"cum-card"},[a("span",{class:"ico",style:U({background:N(s[0])[1]})},r(N(s[0])[0]),5),a("div",ve,[a("div",pe,r(s[1]),1),a("div",me,r(xt(s)),1)])]))),128))]),a("div",fe,[a("div",ye,[e[14]||(e[14]=a("span",{class:"bar",style:{background:"linear-gradient(180deg,#0EA5E9,#22D3EE)"}},null,-1)),e[15]||(e[15]=a("h2",null,"今日数据",-1)),a("span",be,r(at.value),1),e[16]||(e[16]=a("span",{class:"sub"},"今日 0 点至现在 · 含较昨日同比(设备类无日期维度,仅见累计)",-1))]),a("div",ge,[(o(!0),l(g,null,h(d.value,s=>(o(),l("div",{key:s[0],class:"today-card"},[a("span",{class:"accent",style:U({background:N(s[0])[2]})},null,4),a("div",he,[a("span",ke,r(s[1]),1),a("span",{class:"ico",style:U({background:N(s[0])[1]})},r(N(s[0])[0]),5)]),a("div",Ee,r(wt(s)),1),a("div",Fe,[$(s).type==="new"?(o(),l("span",xe,"新")):$(s).type!=="none"?(o(),l("span",{key:1,class:P(["delta",$(s).type])},r($(s).arrow)+" "+r($(s).abs)+"%",3)):f("",!0),e[17]||(e[17]=a("span",null,"较昨日",-1))])]))),128))])]),e[19]||(e[19]=a("div",{class:"sec-title"},[a("span",{class:"bar",style:{background:"linear-gradient(180deg,#10B981,#22D3EE)"}}),a("h2",null,"趋势分析"),a("span",{class:"sub"},"各版面右上角可独立选择时间周期")],-1)),a("div",we,[(o(!0),l(g,null,h(X.value,s=>(o(),l("div",{key:s.key,class:"panel"},[a("div",Ce,[a("span",{class:"panel-dot",style:U({background:s.tint})},[(o(),l("svg",{width:"17",height:"17",fill:"none",viewBox:"0 0 24 24",stroke:s.color},[a("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:s.icon},null,8,Ae)],8,De))],4),a("span",Me,r(s.title),1),s.key==="device"?(o(),l("span",Se,"当前累计 · 无日期维度")):(o(),l("div",Be,[(o(),l(g,null,h(yt,i=>a("button",{key:i[0],class:P(["tbtn",{"tbtn-on":i[0]===V[s.key]}]),onClick:b=>Mt(s.key,Number(i[0]))},r(i[1]),11,Le)),64))]))]),a("div",Ne,[a("div",$e,[(o(!0),l(g,null,h(s.stats,i=>(o(),l("div",{key:i[0],class:"stat-box"},[a("div",Re,r(i[1]),1),a("div",Oe,r(Ct(s,i)),1)]))),128))]),s.key!=="device"?(o(),l("div",Ve,[a("canvas",{ref_for:!0,ref:i=>St(s.key,i)},null,512)])):f("",!0)])]))),128))])])}}}),Ue=mt(Te,[["__scopeId","data-v-aff3efc7"]]);export{Ue as default};