| 1234 |
- import{_ as fe,r as m,c as N,o as ge,a as ye,b as i,d as p,e as b,f as a,g as s,i as o,k as c,t as _,m as E,F as A,p as $,q as F,h as I,v as d,n as be}from"./index-29b7bbe1.js";const Ce={class:"port-status"},we={class:"overview-bar"},ke={class:"overview-item"},Ne={class:"overview-item"},Ie={class:"overview-item"},De={class:"overview-item"},Ee={class:"overview-value"},xe={class:"overview-item"},he={key:1,class:"port-grid"},Se={class:"panel-header"},Oe={class:"ports-row"},Ue=["title"],je={class:"port-number"},Le={class:"port-uid"},Pe={class:"port-legend"},Ae={class:"legend-item"},$e={class:"legend-item"},Fe={class:"legend-item"},Me={class:"event-scroll"},Be={class:"event-item"},Ve={class:"event-header"},ze={class:"event-time"},Ge={class:"event-detail"},Te={class:"event-uid"},He={__name:"PortStatus",setup(Ke){const x=m(!1),M=m(""),f=m({}),D=m([]),h=m(null),C=m(!1),y=m(!1),S=m("single"),v=m({panel_id:1,port_id:1,jumper_uid:""}),w=m(""),O={idle:"#d9d9d9",normal:"#52c41a",alarm:"#ff4d4f"},q={CONNECT:"连接",DISCONNECT:"断开",MOVE:"移动",ILLEGAL_CONNECT:"非法连接",ILLEGAL_DISCONNECT:"非法断开"},R=N(()=>Object.keys(f.value).length),J=N(()=>{let t=0;for(const e of Object.values(f.value))t+=Object.keys(e).length;return t}),Q=N(()=>{let t=0;for(const e of Object.values(f.value))for(const n of Object.values(e))n.alarm_count>0&&t++;return t}),W=N(()=>{const t={},e=Object.keys(f.value).sort((n,r)=>Number(n)-Number(r));for(const n of e){t[n]={};const r=Object.keys(f.value[n]).sort((u,g)=>Number(u)-Number(g));for(const u of r)t[n][u]=f.value[n][u]}return t}),X=N(()=>D.value.slice(0,20).reverse());function Z(t){return t.last_uid?t.alarm_count>0?"port-alarm":"port-normal":"port-idle"}function ee(t,e,n){const r=[`面板 ${t} 端口 ${e}`];return n.last_uid&&r.push(`当前UID: ${n.last_uid}`),n.expected_uid&&r.push(`期望UID: ${n.expected_uid}`),n.alarm_count>0&&r.push(`告警次数: ${n.alarm_count}`),r.join(`
- `)}function B(t){return t&&String(t).toUpperCase().replace(/[:\s-]/g,"")||"--"}function te(t){return t?new Date(t).toLocaleTimeString():""}function ae(t){return t!=null&&t.includes("ILLEGAL")?"red":t==="CONNECT"?"green":t==="DISCONNECT"?"gray":"blue"}function se(t){return t!=null&&t.includes("ILLEGAL")?"red":t==="CONNECT"?"green":t==="DISCONNECT"?"default":t==="MOVE"?"blue":"default"}async function ne(){try{const t=await I.port.getStatus();t.data.success&&(f.value=t.data.port_state||{})}catch(t){console.error("load port status error:",t)}}async function oe(){try{const t=await I.port.getEvents(100);t.data.success&&(D.value=t.data.events||[])}catch(t){console.error("load events error:",t)}}async function U(){x.value=!0;try{await Promise.all([ne(),oe()]),M.value=new Date().toLocaleTimeString()}finally{x.value=!1}}async function le(){try{(await I.port.clearEvents()).data.success&&(d.success("事件已清除"),D.value=[])}catch(t){console.error("clear events error:",t),d.error("清除失败")}}function re(){C.value=!0}async function V(){const t=(v.value.jumper_uid||"").trim().toUpperCase();if(!t){d.warning("请输入期望UID");return}if(!/^[0-9A-F]{12}$/.test(t)){d.warning("期望UID 必须是 12 位十六进制(V4 卡号 6 字节)");return}y.value=!0;try{const e=await I.dtu.sendControl({command:"SYNC_PORT_MAPPING",params:{target:"port",panel_id:v.value.panel_id,port_id:v.value.port_id,jumper_uid:t}});e.data.success?(d.success("端口映射已同步"),v.value.jumper_uid=""):d.error(e.data.message||"同步失败")}catch(e){console.error("sync port mapping error:",e),d.error("同步失败")}finally{y.value=!1}}async function z(){if(!w.value.trim()){d.warning("请输入批量映射数据");return}const t=w.value.trim().split(`
- `),e=[];for(const n of t){const r=n.split(",").map(u=>u.trim());if(r.length>=3){const u=r[2].toUpperCase();if(!/^[0-9A-F]{12}$/.test(u)){d.warning(`第 "${n}" 行 jumper_uid 必须 12 位 Hex,当前 "${r[2]}"`);return}e.push({panel_id:parseInt(r[0])||1,port_id:parseInt(r[1])||1,jumper_uid:u})}}if(e.length===0){d.warning("无效的映射数据");return}y.value=!0;try{const n=await I.dtu.sendControl({command:"SYNC_ALL_MAPPING",params:{target:"port",mappings:e}});n.data.success?(d.success(`已同步 ${e.length} 个端口映射`),w.value=""):d.error(n.data.message||"批量同步失败")}catch(n){console.error("sync all mapping error:",n),d.error("批量同步失败")}finally{y.value=!1}}async function ie(){S.value==="single"?await V():await z(),C.value&&(C.value=!1)}return ge(async()=>{await U(),h.value=setInterval(U,5e3)}),ye(()=>{h.value&&clearInterval(h.value)}),(t,e)=>{const n=i("a-tag"),r=i("a-button"),u=i("a-card"),g=i("a-col"),G=i("a-alert"),T=i("a-input-number"),j=i("a-form-item"),ue=i("a-input"),H=i("a-row"),de=i("a-form"),K=i("a-tab-pane"),ce=i("a-textarea"),_e=i("a-tabs"),pe=i("a-modal"),Y=i("a-empty"),ve=i("a-timeline-item"),me=i("a-timeline");return p(),b("div",Ce,[a(H,{gutter:[24,24]},{default:s(()=>[a(g,{span:24},{default:s(()=>[a(u,null,{default:s(()=>[o("div",we,[o("div",ke,[e[7]||(e[7]=o("span",{class:"overview-label"},"面板数量",-1)),a(n,{color:"blue"},{default:s(()=>[c(_(R.value)+" 个",1)]),_:1})]),o("div",Ne,[e[8]||(e[8]=o("span",{class:"overview-label"},"端口总数",-1)),a(n,{color:"purple"},{default:s(()=>[c(_(J.value)+" 个",1)]),_:1})]),o("div",Ie,[e[9]||(e[9]=o("span",{class:"overview-label"},"告警端口",-1)),a(n,{color:"red"},{default:s(()=>[c(_(Q.value)+" 个",1)]),_:1})]),o("div",De,[e[10]||(e[10]=o("span",{class:"overview-label"},"最近更新",-1)),o("span",Ee,_(M.value),1)]),o("div",xe,[a(r,{type:"primary",size:"small",onClick:U,loading:x.value},{default:s(()=>[...e[11]||(e[11]=[c(" 刷新 ",-1)])]),_:1},8,["loading"]),a(r,{size:"small",onClick:le,style:{marginLeft:"8px"}},{default:s(()=>[...e[12]||(e[12]=[c(" 清除事件 ",-1)])]),_:1}),a(r,{size:"small",type:"dashed",onClick:re,style:{marginLeft:"8px"}},{default:s(()=>[...e[13]||(e[13]=[c(" 同步映射 ",-1)])]),_:1})])])]),_:1})]),_:1}),a(pe,{open:C.value,"onUpdate:open":e[5]||(e[5]=l=>C.value=l),title:"同步端口映射","confirm-loading":y.value,onOk:ie,onCancel:e[6]||(e[6]=l=>C.value=!1),width:"600px"},{default:s(()=>[a(G,{message:"同步映射说明",description:"将期望的UID映射到指定端口。同步后,系统会比较实际连接UID与期望UID,不匹配时触发告警。",type:"info","show-icon":"",style:{marginBottom:"16px"}}),a(_e,{activeKey:S.value,"onUpdate:activeKey":e[4]||(e[4]=l=>S.value=l)},{default:s(()=>[a(K,{key:"single",tab:"单个端口"},{default:s(()=>[a(de,{layout:"vertical"},{default:s(()=>[a(H,{gutter:16},{default:s(()=>[a(g,{span:8},{default:s(()=>[a(j,{label:"面板ID"},{default:s(()=>[a(T,{value:v.value.panel_id,"onUpdate:value":e[0]||(e[0]=l=>v.value.panel_id=l),min:1,style:{width:"100%"},placeholder:"1"},null,8,["value"])]),_:1})]),_:1}),a(g,{span:8},{default:s(()=>[a(j,{label:"端口ID"},{default:s(()=>[a(T,{value:v.value.port_id,"onUpdate:value":e[1]||(e[1]=l=>v.value.port_id=l),min:1,style:{width:"100%"},placeholder:"1"},null,8,["value"])]),_:1})]),_:1}),a(g,{span:8},{default:s(()=>[a(j,{label:"期望UID"},{default:s(()=>[a(ue,{value:v.value.jumper_uid,"onUpdate:value":e[2]||(e[2]=l=>v.value.jumper_uid=l),placeholder:"12位Hex,如 DDAD57F95001",maxlength:12},null,8,["value"])]),_:1})]),_:1})]),_:1}),a(r,{type:"primary",onClick:V,loading:y.value},{default:s(()=>[...e[14]||(e[14]=[c(" 同步单个端口 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1}),a(K,{key:"batch",tab:"批量同步"},{default:s(()=>[a(G,{message:"批量格式",description:"每行一个映射,格式: panel_id,port_id,jumper_uid (如: 3,10,DDAD57F95001)。jumper_uid 为 12 位 Hex",type:"warning","show-icon":"",style:{marginBottom:"12px"}}),a(ce,{value:w.value,"onUpdate:value":e[3]||(e[3]=l=>w.value=l),rows:8,placeholder:`3,10,DDAD57F95001
- 2,1,AABBCCDDEEFF`},null,8,["value"]),a(r,{type:"primary",onClick:z,loading:y.value,style:{marginTop:"12px"}},{default:s(()=>[...e[15]||(e[15]=[c(" 批量同步 ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["activeKey"])]),_:1},8,["open","confirm-loading"]),a(g,{xs:24,lg:14},{default:s(()=>[a(u,{title:"端口状态"},{default:s(()=>[Object.keys(f.value).length===0?(p(),E(Y,{key:0,description:"暂无端口数据"})):(p(),b("div",he,[(p(!0),b(A,null,$(W.value,(l,k)=>(p(),b("div",{key:k,class:"panel-section"},[o("div",Se,"面板 "+_(k),1),o("div",Oe,[(p(!0),b(A,null,$(l,(L,P)=>(p(),b("div",{key:P,class:be(["port-cell",Z(L)]),title:ee(k,P,L)},[o("div",je,_(P),1),o("div",Le,_(B(L.last_uid)),1)],10,Ue))),128))])]))),128))])),o("div",Pe,[o("div",Ae,[o("span",{class:"dot",style:F({background:O.idle})},null,4),e[16]||(e[16]=c(" 无设备 ",-1))]),o("div",$e,[o("span",{class:"dot",style:F({background:O.normal})},null,4),e[17]||(e[17]=c(" 正常 ",-1))]),o("div",Fe,[o("span",{class:"dot",style:F({background:O.alarm})},null,4),e[18]||(e[18]=c(" 告警 ",-1))])])]),_:1})]),_:1}),a(g,{xs:24,lg:10},{default:s(()=>[a(u,{title:"事件历史"},{default:s(()=>[o("div",Me,[D.value.length===0?(p(),E(Y,{key:0,description:"暂无事件"})):(p(),E(me,{key:1},{default:s(()=>[(p(!0),b(A,null,$(X.value,(l,k)=>(p(),E(ve,{key:k,color:ae(l.event_type)},{default:s(()=>[o("div",Be,[o("div",Ve,[a(n,{color:se(l.event_type),size:"small"},{default:s(()=>[c(_(q[l.event_type]||l.event_type),1)]),_:2},1032,["color"]),o("span",ze,_(te(l.timestamp)),1)]),o("div",Ge," 面板 "+_(l.panel_id)+" 端口 "+_(l.port_id),1),o("div",Te," UID: "+_(B(l.jumper_uid)),1)])]),_:2},1032,["color"]))),128))]),_:1}))])]),_:1})]),_:1})]),_:1})])}}},qe=fe(He,[["__scopeId","data-v-19debc9e"]]);export{qe as default};
|