| 1 |
- import{_ as O,u as V,r as f,c as B,o as F,a as q,w as W,b as g,d as p,e as v,i,f as d,g as l,k as w,t as _,j as $,D as J,R as K,m as G,F as H,n as P,l as Q,h as C,v as T}from"./index-29b7bbe1.js";const X={class:"alarm-status"},Y={class:"overview-bar"},Z={class:"overview-item"},ee={class:"overview-item"},te={class:"overview-item"},ae={class:"overview-value"},se={class:"overview-actions"},ne={key:0},oe={key:1,class:"text-muted"},ie={key:2},le={key:4,class:"timestamp"},re={__name:"AlarmStatus",setup(de){const S=V(),h=f(!1),x=f(!1),c=f([]),b=f(""),D=f(null),E=[{title:"时间",key:"timestamp",dataIndex:"timestamp",width:180,sorter:(e,t)=>new Date(t.timestamp)-new Date(e.timestamp)},{title:"面板",key:"panel_id",dataIndex:"panel_id",width:80},{title:"端口",key:"port_id",dataIndex:"port_id",width:80},{title:"类型",key:"event_type",dataIndex:"event_type",width:100},{title:"告警类型",key:"alarm_type",dataIndex:"alarm_type",width:150},{title:"期望跳线UID",key:"expected_jumper",dataIndex:"expected_jumper_uid",width:130},{title:"实际跳线UID",key:"actual_jumper",dataIndex:"actual_jumper_uid",width:130}],N=B(()=>c.value.filter(e=>e.event_type==="ALARM").length);function R(e){if(!e)return"-";try{return new Date(e).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return e}}function I(e){const t=m(e.expected_jumper_uid)||"",u=m(e.actual_jumper_uid)||"";return`${e.panel_id||""}|${e.port_id||""}|${e.timestamp||""}|${e.event_type||""}|${e.alarm_type||""}|${t}|${u}`}function m(e){if(!e)return"";const t=String(e).toUpperCase().replace(/[:\s-]/g,"");return t.length===16&&/^[0-9A-F]{16}$/.test(t)?t.slice(4):t.length===12&&/^[0-9A-F]{12}$/.test(t)?t:""}function A(e){return m(e)}async function U(){try{const e=await C.port.getEvents(100);if(e.data.success){const t=(e.data.events||[]).map((o,r)=>({...o,key:`${o.timestamp}-${r}`,_dedupe:I(o)})),u=c.value.filter(o=>!t.some(r=>r._dedupe===o._dedupe)),n=[...t,...u];n.sort((o,r)=>{const y=new Date(o.timestamp).getTime()||0;return(new Date(r.timestamp).getTime()||0)-y}),c.value=n.slice(0,500)}}catch(e){console.error("load events error:",e)}}async function j(){h.value=!0;try{await U(),b.value=new Date().toLocaleTimeString()}finally{h.value=!1}}async function z(){x.value=!0;try{(await C.port.clearEvents()).data.success&&(T.success("事件已清除"),c.value=[])}catch(e){console.error("clear events error:",e),T.error("清除失败")}finally{x.value=!1}}return F(async()=>{await j(),D.value=setInterval(j,5e3)}),q(()=>{D.value&&clearInterval(D.value)}),W(()=>S.mqttData.length,(e,t)=>{if(e<=(t||0))return;const u=S.mqttData.slice(t||0,e);for(const n of u){if(!n||typeof n!="object")continue;const o=n.topic||"",r=o.endsWith("/alarm"),y=o.endsWith("/event");if(!(!r&&!y))try{const a=typeof n.payload=="string"?JSON.parse(n.payload):n.payload,s=(a==null?void 0:a.payload)||a||{},M=a!=null&&a.timestamp?new Date(a.timestamp).toISOString():n.timestamp||new Date().toISOString(),k={key:`rt-${(a==null?void 0:a.msg_id)||Date.now()}-${Math.random().toString(36).slice(2,6)}`,timestamp:M,panel_id:s.panel_id,port_id:s.port_id,event_type:r?"ALARM":"EVENT",alarm_type:s.alarm_type||(y?s.event_type:null),expected_jumper_uid:m(s.expected_jumper_uid)||null,actual_jumper_uid:m(s.actual_jumper_uid??s.jumper_uid)||null,severity:s.severity||null};k._dedupe=I(k),c.value.find(L=>L._dedupe===k._dedupe)||(c.value=[k,...c.value].slice(0,500),b.value=new Date().toLocaleTimeString())}catch(a){console.warn("实时告警解析失败:",a,n)}}}),(e,t)=>{const u=g("a-tag"),n=g("a-button"),o=g("a-card"),r=g("a-empty"),y=g("a-table");return p(),v("div",X,[t[5]||(t[5]=i("div",{class:"page-header"},[i("h2",{class:"page-title"},"告警显示")],-1)),d(o,{bordered:!1,class:"overview-card"},{default:l(()=>[i("div",Y,[i("div",Z,[t[0]||(t[0]=i("span",{class:"overview-label"},"告警总数:",-1)),d(u,{color:"red"},{default:l(()=>[w(_(N.value),1)]),_:1})]),i("div",ee,[t[1]||(t[1]=i("span",{class:"overview-label"},"事件总数:",-1)),d(u,{color:"blue"},{default:l(()=>[w(_(c.value.length),1)]),_:1})]),i("div",te,[t[2]||(t[2]=i("span",{class:"overview-label"},"最后更新:",-1)),i("span",ae,_(b.value||"--"),1)]),i("div",se,[d(n,{type:"primary",danger:"",onClick:z,loading:x.value},{icon:l(()=>[d($(J))]),default:l(()=>[t[3]||(t[3]=w(" 清除所有事件 ",-1))]),_:1},8,["loading"]),d(n,{onClick:j,loading:h.value},{icon:l(()=>[d($(K))]),default:l(()=>[t[4]||(t[4]=w(" 刷新 ",-1))]),_:1},8,["loading"])])])]),_:1}),d(o,{bordered:!1,class:"events-card"},{default:l(()=>[d(y,{columns:E,"data-source":c.value,loading:h.value,pagination:{pageSize:20,showSizeChanger:!0,showTotal:a=>`共 ${a} 条`},scroll:{x:800},"row-key":"key",size:"middle"},{bodyCell:l(({column:a,record:s})=>[a.key==="event_type"?(p(),G(u,{key:0,color:s.event_type==="ALARM"?"red":"blue"},{default:l(()=>[w(_(s.event_type==="ALARM"?"告警":"事件"),1)]),_:2},1032,["color"])):a.key==="alarm_type"?(p(),v(H,{key:1},[s.alarm_type?(p(),v("span",ne,_(s.alarm_type),1)):(p(),v("span",oe,"-"))],64)):a.key==="expected_jumper"?(p(),v("span",ie,_(A(s.expected_jumper_uid)||"-"),1)):a.key==="actual_jumper"?(p(),v("span",{key:3,class:P({"text-danger":m(s.actual_jumper_uid)!==m(s.expected_jumper_uid)})},_(A(s.actual_jumper_uid)||"未读到"),3)):a.key==="timestamp"?(p(),v("span",le,_(R(s.timestamp)),1)):Q("",!0)]),emptyText:l(()=>[d(r,{description:"暂无告警事件"})]),_:1},8,["data-source","loading","pagination"])]),_:1})])}}},ue=O(re,[["__scopeId","data-v-192a0b7b"]]);export{ue as default};
|