|
|
import{n as e}from"./axios-CiYFffbI.js";import{I as t,N as n,P as r,V as i,Y as a,_ as o,d as s,f as c,i as l,it as u,kt as d,l as f,p,u as m,v as h,y as g,z as _}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{n as v}from"./http-LCi9aT1G.js";import{d as y,u as b}from"./index-CsO7K1zc.js";async function x(e){let{data:t}=await v.get(`/camera-devices`,{params:e});return t}async function S(e){let{data:t}=await v.post(`/camera-devices`,e);return t}async function C(e,t){let{data:n}=await v.put(`/camera-devices/${e}`,t);return n}async function w(e){let{data:t}=await v.delete(`/camera-devices/${e}`);return t}async function T(e){let{data:t}=await v.post(`/camera-devices/${e}/retry`);return t}async function E(){let{data:e}=await v.get(`/camera-health`);return e}async function D(e){let{data:t}=await v.get(`/camera-alerts`,{params:e});return t}async function O(e){let{data:t}=await v.post(`/camera-alerts/${e}/acknowledge`);return t}async function k(){let{data:e}=await v.get(`/camera-monitor-settings`);return e}async function A(e){let{data:t}=await v.put(`/camera-monitor-settings`,e);return t}var j={class:`muted`},M=b(g({__name:`CameraAlerts`,setup(g){let b=u(`health`),M=u(!1),N=u([]),P=u([]),F=u(null),I=u(null),L=u(!1),R=u({monitor_enabled:!0,notification_enabled:!0,include_in_venue_stats:!0,sdk_port:8e3,http_port:80,channel:1,push_timeout_seconds:300}),z=u([]),B=u({keyword:``}),V=u(`all`),H=u({}),U=u({}),W=u(``),G=e=>({ONLINE_PUSHING:`推送正常`,PUSH_SUSPECT:`疑似停止`,PUSH_STALE:`推送停止`,NETWORK_DOWN:`网络不可达`,LOGIN_FAILED:`登录认证失败`,ARM_FAILED:`布防失败`,NO_PUSH_YET:`尚未收到推送`,SERVICE_UNAVAILABLE:`监测服务不可用`,UNKNOWN:`未知`,DISABLED:`已停用`,RECONNECTING:`重连中`})[String(e||`UNKNOWN`)]||String(e||`未知`),K=e=>[`ONLINE_PUSHING`].includes(String(e))?`green`:[`PUSH_SUSPECT`,`RECONNECTING`].includes(String(e))?`orangered`:`red`,q=e=>{if(!e)return`—`;let t=String(e).replace(/\.(\d{3})\d+/g,`.$1`),n=/(?:Z|[+-]\d{2}:?\d{2})$/i.test(t)?t:`${t.replace(` `,`T`)}Z`,r=new Date(n);return Number.isNaN(r.getTime())?`—`:r.toLocaleString(`zh-CN`,{timeZone:`Asia/Shanghai`})},J=f(()=>N.value.filter(e=>{let t=!B.value.venue_id||Number(e.venue_id)===Number(B.value.venue_id),n=String(e.health?.status||`UNKNOWN`),r=V.value===`normal`?n===`ONLINE_PUSHING`:V.value===`abnormal`?[`PUSH_STALE`,`NETWORK_DOWN`,`LOGIN_FAILED`,`ARM_FAILED`,`PUSH_SUSPECT`,`NO_PUSH_YET`,`SERVICE_UNAVAILABLE`].includes(n):!B.value.status||n===B.value.status,i=B.value.keyword.trim().toLowerCase(),a=!i||`${e.name} ${e.ip} ${e.venue_name||e.venue?.name||``}`.toLowerCase().includes(i);return t&&r&&a}).sort((e,t)=>{let n=e=>({SERVICE_UNAVAILABLE:0,LOGIN_FAILED:1,ARM_FAILED:2,NETWORK_DOWN:3,PUSH_STALE:4,PUSH_SUSPECT:5,NO_PUSH_YET:6,UNKNOWN:7,RECONNECTING:8,ONLINE_PUSHING:9})[String(e||`UNKNOWN`)]??7;return n(e.health?.status)-n(t.health?.status)}));async function Y(){try{let{data:e}=await v.get(`/venues`);z.value=Array.isArray(e)?e:[]}catch{z.value=[]}}async function X(){M.value=!0;try{let[e,t,n,r]=await Promise.all([E(),D({status:`OPEN`,page_size:100}),x({page_size:100}),k()]);N.value=e.devices??n.data??[],N.value.forEach(e=>{H.value[e.id]&&e.health?.status!==`RECONNECTING`&&(H.value[e.id]=!1)}),U.value=e.summary?.byStatus??{},P.value=t.data??[],F.value={...r,notification_start_time:String(r.notification_start_time||``).slice(0,5),notification_end_time:String(r.notification_end_time||``).slice(0,5)},W.value=(r.recipient_emails||[]).join(`,`)}catch(t){e.error(t?.response?.data?.message||t?.message||`加载摄像头预警数据失败`)}finally{M.value=!1}}function Z(){I.value=null,R.value={monitor_enabled:!0,notification_enabled:!0,include_in_venue_stats:!0,sdk_port:8e3,http_port:80,channel:1,push_timeout_seconds:F.value?.default_push_timeout_seconds??300},L.value=!0}function Q(e){I.value=e,R.value={...e,password:``},L.value=!0}async function ee(){try{I.value?await C(I.value.id,R.value):await S(R.value),e.success(`已保存`),L.value=!1,await X()}catch(t){e.error(t?.response?.data?.message||t?.message||`保存失败`)}}async function te(t){H.value[t.id]||y.confirm({title:`确认重新连接`,content:`请确认摄像头已正常在线或已经重启,再重新链接。`,okText:`确认重新连接`,cancelText:`关闭`,onOk:async()=>{H.value[t.id]=!0;try{await T(t.id),e.success(`重试指令已下发,正在等待登录、布防和客流推送验证`),await X()}catch(n){H.value[t.id]=!1,e.error(n?.response?.data?.message||n?.message||`重试失败`)}}})}async function ne(t){y.confirm({title:`停用摄像头`,content:`确定停用 ${t.name}(${t.ip})吗?`,okText:`确认停用`,cancelText:`关闭`,onOk:async()=>{await w(t.id),e.success(`已停用`),await X()}})}async function re(t){await O(t.id),e.success(`已确认`),await X()}async function ie(){F.value&&(F.value.recipient_emails=W.value.split(`,`).map(e=>e.trim()).filter(Boolean),await A(F.value),e.success(`通知设置已保存`))}let $;return n(()=>{Promise.all([X(),Y()]),$=setInterval(()=>{M.value||X()},1e4)}),r(()=>{$&&clearInterval($)}),(e,n)=>{let r=i(`a-tag`),u=i(`a-input`),f=i(`a-option`),g=i(`a-select`),v=i(`a-button`),y=i(`a-space`),x=i(`a-table-column`),S=i(`a-table`),C=i(`a-tab-pane`),w=i(`a-form-item`),T=i(`a-time-picker`),E=i(`a-input-number`),D=i(`a-form`),O=i(`a-tabs`),k=i(`a-card`),A=i(`a-input-password`),Y=i(`a-switch`),$=i(`a-modal`);return t(),p(l,null,[h(k,{title:`场馆管理 / 摄像头预警`},{default:a(()=>[h(O,{"active-key":b.value,"onUpdate:activeKey":n[11]||=e=>b.value=e},{default:a(()=>[h(C,{key:`health`,title:`实时状态`},{default:a(()=>[h(y,{wrap:``,size:12,style:{"margin-bottom":`12px`}},{default:a(()=>[h(r,{color:`green`,class:`clickable-tag`,onClick:n[0]||=e=>{V.value=`normal`,B.value.status=void 0}},{default:a(()=>[o(`正常 `+d(U.value.ONLINE_PUSHING||0),1)]),_:1}),h(r,{color:`red`,class:`clickable-tag`,onClick:n[1]||=e=>{V.value=`abnormal`,B.value.status=void 0}},{default:a(()=>[o(`异常 `+d((U.value.PUSH_STALE||0)+(U.value.NETWORK_DOWN||0)+(U.value.LOGIN_FAILED||0)+(U.value.ARM_FAILED||0)+(U.value.NO_PUSH_YET||0)+(U.value.SERVICE_UNAVAILABLE||0)),1)]),_:1}),h(r,{class:`clickable-tag`,onClick:n[2]||=e=>{V.value=`all`,B.value.status=void 0}},{default:a(()=>[o(`总数 `+d(N.value.length),1)]),_:1}),h(u,{modelValue:B.value.keyword,"onUpdate:modelValue":n[3]||=e=>B.value.keyword=e,"allow-clear":``,placeholder:`搜索摄像头名称或 IP`,style:{width:`240px`}},null,8,[`modelValue`]),h(g,{modelValue:B.value.venue_id,"onUpdate:modelValue":n[4]||=e=>B.value.venue_id=e,"allow-clear":``,"allow-search":``,placeholder:`按场馆筛选`,style:{width:`220px`}},{default:a(()=>[(t(!0),p(l,null,_(z.value,e=>(t(),s(f,{key:e.id,value:e.id},{default:a(()=>[o(d(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`]),h(g,{modelValue:B.value.status,"onUpdate:modelValue":n[5]||=e=>B.value.status=e,"allow-clear":``,"allow-search":``,placeholder:`按状态筛选`,style:{width:`160px`},onChange:n[6]||=e=>V.value=`all`},{default:a(()=>[h(f,{value:`ONLINE_PUSHING`},{default:a(()=>[...n[24]||=[o(`推送正常`,-1)]]),_:1}),h(f,{value:`PUSH_STALE`},{default:a(()=>[...n[25]||=[o(`推送停止`,-1)]]),_:1}),h(f,{value:`NETWORK_DOWN`},{default:a(()=>[...n[26]||=[o(`网络断开`,-1)]]),_:1}),h(f,{value:`LOGIN_FAILED`},{default:a(()=>[...n[27]||=[o(`登录失败`,-1)]]),_:1}),h(f,{value:`ARM_FAILED`},{default:a(()=>[...n[28]||=[o(`布防失败`,-1)]]),_:1}),h(f,{value:`NO_PUSH_YET`},{default:a(()=>[...n[29]||=[o(`尚未收到推送`,-1)]]),_:1}),h(f,{value:`SERVICE_UNAVAILABLE`},{default:a(()=>[...n[30]||=[o(`监测服务不可用`,-1)]]),_:1}),h(f,{value:`UNKNOWN`},{default:a(()=>[...n[31]||=[o(`未知`,-1)]]),_:1})]),_:1},8,[`modelValue`]),h(v,{onClick:X,loading:M.value},{default:a(()=>[...n[32]||=[o(`刷新`,-1)]]),_:1},8,[`loading`]),h(v,{type:`primary`,onClick:Z},{default:a(()=>[...n[33]||=[o(`新增摄像头`,-1)]]),_:1})]),_:1}),h(S,{data:J.value,loading:M.value,"row-key":`id`,pagination:!1},{columns:a(()=>[h(x,{title:`场馆`},{cell:a(({record:e})=>[o(d(e.venue?.name||e.venue_name||`未绑定`),1)]),_:1}),h(x,{title:`摄像头`},{cell:a(({record:e})=>[o(d(e.name),1),m(`div`,j,d(e.ip)+` / 通道 `+d(e.channel),1)]),_:1}),h(x,{title:`状态`},{cell:a(({record:e})=>[h(r,{color:K(e.health?.status)},{default:a(()=>[o(d(G(e.health?.status)),1)]),_:2},1032,[`color`])]),_:1}),h(x,{title:`最后推送`},{cell:a(({record:e})=>[o(d(q(e.health?.last_pdc_at_source||e.health?.last_pdc_at)),1)]),_:1}),h(x,{title:`网络连通性`},{cell:a(({record:e})=>[o(d(e.health?.tcp_reachable===!0?`网络正常`:e.health?.tcp_reachable===!1?`网络不可达`:`未检测`),1)]),_:1}),h(x,{title:`操作`},{cell:a(({record:e})=>[h(y,null,{default:a(()=>[h(v,{size:`small`,onClick:t=>Q(e)},{default:a(()=>[...n[34]||=[o(`编辑`,-1)]]),_:1},8,[`onClick`]),h(v,{size:`small`,type:`primary`,loading:H.value[e.id],disabled:H.value[e.id],onClick:t=>te(e)},{default:a(()=>[o(d(H.value[e.id]?`重新连接中`:`重新连接`),1)]),_:2},1032,[`loading`,`disabled`,`onClick`]),h(v,{size:`small`,status:`danger`,onClick:t=>ne(e)},{default:a(()=>[...n[35]||=[o(`停用`,-1)]]),_:1},8,[`onClick`])]),_:2},1024)]),_:1})]),_:1},8,[`data`,`loading`])]),_:1}),h(C,{key:`alerts`,title:`待处理告警`},{default:a(()=>[h(S,{data:P.value,pagination:!1},{columns:a(()=>[h(x,{title:`时间`},{cell:a(({record:e})=>[o(d(q(e.first_occurred_at)),1)]),_:1}),h(x,{title:`场馆`},{cell:a(({record:e})=>[o(d(e.venue?.name||`—`),1)]),_:1}),h(x,{title:`设备`},{cell:a(({record:e})=>[o(d(e.camera?.name)+`(`+d(e.camera?.ip)+`)`,1)]),_:1}),h(x,{title:`原因`,"data-index":`reason`}),h(x,{title:`操作`},{cell:a(({record:e})=>[h(v,{size:`small`,onClick:t=>re(e)},{default:a(()=>[...n[36]||=[o(`确认处理`,-1)]]),_:1},8,[`onClick`])]),_:1})]),_:1},8,[`data`])]),_:1}),h(C,{key:`settings`,title:`通知设置`},{default:a(()=>[F.value?(t(),s(D,{key:0,model:F.value,layout:`vertical`,style:{"max-width":`680px`}},{default:a(()=>[h(w,{label:`接收邮箱`},{default:a(()=>[h(u,{modelValue:W.value,"onUpdate:modelValue":n[7]||=e=>W.value=e,placeholder:`多个邮箱用逗号分隔`},null,8,[`modelValue`])]),_:1}),h(w,{label:`通知开始时间`},{default:a(()=>[h(T,{modelValue:F.value.notification_start_time,"onUpdate:modelValue":n[8]||=e=>F.value.notification_start_time=e,format:`HH:mm`},null,8,[`modelValue`])]),_:1}),h(w,{label:`通知结束时间`},{default:a(()=>[h(T,{modelValue:F.value.notification_end_time,"onUpdate:modelValue":n[9]||=e=>F.value.notification_end_time=e,format:`HH:mm`},null,8,[`modelValue`])]),_:1}),h(w,{label:`客流推送超时时间`},{default:a(()=>[h(E,{modelValue:F.value.default_push_timeout_seconds,"onUpdate:modelValue":n[10]||=e=>F.value.default_push_timeout_seconds=e,min:60,max:86400},null,8,[`modelValue`]),n[37]||=m(`div`,{class:`form-help`},`超过这个时间没有收到该摄像头的客流数据,系统会判定为推送异常,并继续进行自动重连判断。单位:秒。`,-1)]),_:1}),h(w,null,{default:a(()=>[h(v,{type:`primary`,onClick:ie},{default:a(()=>[...n[38]||=[o(`保存设置`,-1)]]),_:1})]),_:1})]),_:1},8,[`model`])):c(``,!0)]),_:1})]),_:1},8,[`active-key`])]),_:1}),h($,{visible:L.value,"onUpdate:visible":n[23]||=e=>L.value=e,title:I.value?`编辑摄像头`:`新增摄像头`,height:640,"body-style":{maxHeight:`520px`,overflowY:`auto`},onOk:ee},{default:a(()=>[h(D,{model:R.value,layout:`vertical`},{default:a(()=>[h(w,{label:`名称`},{default:a(()=>[h(u,{modelValue:R.value.name,"onUpdate:modelValue":n[12]||=e=>R.value.name=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`所属场馆`},{default:a(()=>[h(g,{modelValue:R.value.venue_id,"onUpdate:modelValue":n[13]||=e=>R.value.venue_id=e,"allow-clear":``,"allow-search":``,placeholder:`请输入或选择场馆`},{default:a(()=>[(t(!0),p(l,null,_(z.value,e=>(t(),s(f,{key:e.id,value:e.id},{default:a(()=>[o(d(e.name),1)]),_:2},1032,[`value`]))),128))]),_:1},8,[`modelValue`])]),_:1}),h(w,{label:`IP/域名`},{default:a(()=>[h(u,{modelValue:R.value.ip,"onUpdate:modelValue":n[14]||=e=>R.value.ip=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`SDK 端口`},{default:a(()=>[h(E,{modelValue:R.value.sdk_port,"onUpdate:modelValue":n[15]||=e=>R.value.sdk_port=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`通道`},{default:a(()=>[h(E,{modelValue:R.value.channel,"onUpdate:modelValue":n[16]||=e=>R.value.channel=e,min:1},null,8,[`modelValue`])]),_:1}),h(w,{label:`设备槽位`},{default:a(()=>[h(E,{modelValue:R.value.device_slot,"onUpdate:modelValue":n[17]||=e=>R.value.device_slot=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`用户名`},{default:a(()=>[h(u,{modelValue:R.value.username,"onUpdate:modelValue":n[18]||=e=>R.value.username=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`密码`},{default:a(()=>[h(A,{modelValue:R.value.password,"onUpdate:modelValue":n[19]||=e=>R.value.password=e,placeholder:`编辑时留空表示不修改`},null,8,[`modelValue`])]),_:1}),h(w,{label:`客流推送超时时间`},{default:a(()=>[h(E,{modelValue:R.value.push_timeout_seconds,"onUpdate:modelValue":n[20]||=e=>R.value.push_timeout_seconds=e,min:60},null,8,[`modelValue`]),n[39]||=m(`div`,{class:`form-help`},`该摄像头超过设定时间没有客流数据时,系统会判定推送异常。单位:秒。`,-1)]),_:1}),h(w,{label:`监测`},{default:a(()=>[h(Y,{modelValue:R.value.monitor_enabled,"onUpdate:modelValue":n[21]||=e=>R.value.monitor_enabled=e},null,8,[`modelValue`])]),_:1}),h(w,{label:`发送人工介入邮件`},{default:a(()=>[h(Y,{modelValue:R.value.notification_enabled,"onUpdate:modelValue":n[22]||=e=>R.value.notification_enabled=e},null,8,[`modelValue`])]),_:1})]),_:1},8,[`model`])]),_:1},8,[`visible`,`title`])],64)}}}),[[`__scopeId`,`data-v-1928296b`]]);export{M as default}; |