|
|
`)}),await Y(),await q()}else e.warning(n.message||`错误码 ${n.code}`)}catch(t){let n=t,r=t&&typeof t==`object`&&`message`in t?String(t.message):String(t);e.error(n.response?.status===403?`服务端已禁止远程重试登录`:r||`重试请求失败`)}finally{H.value=!1}}function we(e){G.value=e,W.value=!0}n(()=>{J()});let Te=[{title:`场馆ID`,dataIndex:`venueId`,width:120,ellipsis:!0,tooltip:!0},{title:`场馆名称`,dataIndex:`venueName`,width:180,ellipsis:!0,tooltip:!0},{title:`入馆总人数`,dataIndex:`enter`,width:130},{title:`离开(区间累计)`,dataIndex:`exit`,width:125},{title:`经过(区间累计)`,dataIndex:`passing`,width:125}];function Ee(){let e=A.value?.venuesRangeTotals;return Array.isArray(e)?e:[]}function De(e){let t=Array.isArray(e.data)?e.data:[],n=0,r=0,i=0;for(let e of t)n+=Number(e.enter)||0,r+=Number(e.exit)||0,i+=Number(e.passing)||0;return[{venueId:`合计`,venueName:`—`,enter:n,exit:r,passing:i}]}function Oe(e){let t=Array.isArray(e.data)?e.data:[],n=0,r=0,i=0,a=0;for(let e of t)n+=Number(e.enter)||0,r+=Number(e.exit)||0,i+=Number(e.passing)||0,a+=Number(e.updateCount)||0;return[{venueId:`合计`,venueName:`—`,enter:n,exit:r,passing:i,updateCount:a}]}function ke(){let e=A.value?.venuesRangeMissingDates;return!Array.isArray(e)||!e.length?``:e.filter(Boolean).join(`、`)}let Ae=[{title:`场馆ID`,dataIndex:`venueId`,width:140,ellipsis:!0,tooltip:!0},{title:`场馆名称`,dataIndex:`venueName`,width:180,ellipsis:!0,tooltip:!0},{title:`进入`,dataIndex:`enter`,width:96},{title:`离开`,dataIndex:`exit`,width:96},{title:`经过`,dataIndex:`passing`,width:96},{title:`在馆(推算)`,slotName:`net`,width:110},{title:`更新次数`,dataIndex:`updateCount`,width:110},{title:`最后更新`,slotName:`venueLastUpdate`,width:190,ellipsis:!0,tooltip:!0},{title:`包含组`,slotName:`included`,width:220,ellipsis:!0,tooltip:!0},{title:`馆内子组`,slotName:`nested`,width:100}],je=[{title:`小时`,dataIndex:`hourLabel`,width:100},{title:`进入`,dataIndex:`enter`,width:90},{title:`离开`,dataIndex:`exit`,width:90},{title:`经过`,dataIndex:`passing`,width:90}];function Me(e){return(e.hourly??[]).map(t=>({key:`${e.venueId}-${t.hour}`,hourLabel:t.hourLabel!=null&&String(t.hourLabel).trim()?t.hourLabel:String(t.hour),enter:t.enter,exit:t.exit,passing:t.passing}))}let Ne=[{title:`槽位`,dataIndex:`deviceSlot`,width:72},{title:`名称`,dataIndex:`name`,width:120,ellipsis:!0,tooltip:!0},{title:`IP`,dataIndex:`ip`,width:130},{title:`端口`,dataIndex:`port`,width:80},{title:`状态`,slotName:`devStatus`,width:120},{title:`说明`,dataIndex:`statusHint`,ellipsis:!0,tooltip:!0},{title:`探测`,slotName:`probe`,width:200,ellipsis:!0,tooltip:!0}];function Pe(e){let t=e.networkProbe;if(!t)return`—`;let n=[t.tcpReachable===void 0?``:t.tcpReachable?`TCP 已连通`:`TCP 未连通`,t.tcpConnectLatencyMs==null?``:`延迟 ${t.tcpConnectLatencyMs} ms`,t.icmpReachable===void 0?``:t.icmpReachable?`ICMP 已通`:`ICMP 不可用`,(t.summaryHint||``).trim()].filter(Boolean);return n.length?n.join(`,`):`—`}function Fe(e){let t=String(e||``).toUpperCase();return t===`UP`?`正常`:t===`DEGRADED`?`降级`:(e||``).trim()||`—`}function Ie(e){if(e==null||e===``)return`—`;let t;if(typeof e==`number`)t=new Date(e);else{let n=String(e).trim();if(/^\d+$/.test(n)){let e=Number(n),r=e>1e11?e:e*1e3;t=new Date(r)}else t=new Date(n)}if(Number.isNaN(t.getTime()))return String(e);let n=e=>String(e).padStart(2,`0`);return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}`}function Le(e){if(e==null||e===``)return``;if(typeof e==`number`){let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toLocaleString(`zh-CN`)}let t=String(e).trim();if(/^\d+$/.test(t)){let e=Number(t),n=e>1e11?e:e*1e3,r=new Date(n);return Number.isNaN(r.getTime())?t:r.toLocaleString(`zh-CN`)}let n=new Date(t);return Number.isNaN(n.getTime())?t:n.toLocaleString(`zh-CN`)}function Re(e){return{ONLINE:`在线`,LOGIN_FAILED:`登录失败`,ARM_FAILED:`布防失败`}[String(e||``).trim().toUpperCase()]||(e||``).trim()||`—`}let ze=[{title:`统计组ID`,dataIndex:`groupId`,ellipsis:!0,tooltip:!0},{title:`名称`,dataIndex:`groupName`,ellipsis:!0,tooltip:!0},{title:`进入`,dataIndex:`enter`,width:80},{title:`离开`,dataIndex:`exit`,width:80},{title:`经过`,dataIndex:`passing`,width:80}];return(e,n)=>{let l=r(`a-date-picker`),d=r(`a-button`),g=r(`a-space`),_=r(`a-tag`),b=r(`a-typography-text`),x=r(`a-card`),S=r(`a-col`),C=r(`a-statistic`),w=r(`a-row`),E=r(`a-table`),X=r(`a-empty`),Z=r(`a-alert`),Q=r(`a-tab-pane`),$=r(`a-select`),Be=r(`a-switch`),Ve=r(`a-tabs`),He=r(`a-modal`);return t(),o(x,{title:`客流监控 / 海康客流接口`},{default:i(()=>[h(Ve,{"active-key":D.value,"onUpdate:activeKey":n[7]||=e=>D.value=e,type:`rounded`},{default:i(()=>[h(Q,{key:`realtime`,title:`实时汇总`},{default:i(()=>[h(g,{wrap:``,style:{"margin-bottom":`16px`}},{default:i(()=>[n[12]||=p(`span`,{style:{color:`var(--color-text-2)`}},`统计起始日`,-1),h(l,{modelValue:O.value,"onUpdate:modelValue":n[0]||=e=>O.value=e,"value-format":`YYYY-MM-DD`,style:{width:`160px`}},null,8,[`modelValue`]),n[13]||=p(`span`,{style:{color:`var(--color-text-2)`}},`统计结束日`,-1),h(l,{modelValue:k.value,"onUpdate:modelValue":n[1]||=e=>k.value=e,"value-format":`YYYY-MM-DD`,"allow-clear":``,style:{width:`160px`},placeholder:`可选,闭区间结束日`},null,8,[`modelValue`]),n[14]||=p(`span`,{class:`muted`},`留空则仅查询起始日单日(不传 end_date)`,-1),h(d,{type:`primary`,loading:v.value,onClick:n[2]||=e=>K(!0)},{default:i(()=>[...n[9]||=[a(`拉取客流`,-1)]]),_:1},8,[`loading`]),h(d,{loading:T.value,onClick:q},{default:i(()=>[...n[10]||=[a(`健康检查`,-1)]]),_:1},8,[`loading`]),h(d,{onClick:J},{default:i(()=>[...n[11]||=[a(`全部刷新`,-1)]]),_:1}),N.value?(t(),f(`span`,re,`上次拉取:`+u(N.value),1)):s(``,!0)]),_:1}),j.value||M.value?(t(),o(x,{key:0,title:`服务健康状态`,style:{"margin-bottom":`16px`},size:`small`},{default:i(()=>[j.value?(t(),o(g,{key:0,direction:`vertical`,fill:``},{default:i(()=>[h(g,{wrap:``},{default:i(()=>[h(_,{color:m(ne)(j.value.status)},{default:i(()=>[a(u(Fe(j.value.status)),1)]),_:1},8,[`color`]),p(`span`,ie,`配置设备路数:`+u(j.value.nvrConfigured??`—`),1),p(`span`,ae,`已成功登录路数:`+u(j.value.nvrLoggedIn??`—`),1),p(`span`,oe,`设备数量:`+u(j.value.deviceCount??`—`),1),p(`span`,se,`统计组条目数:`+u(j.value.groupCount??`—`),1),j.value.timestamp?(t(),f(`span`,ce,u(`返回时间:${Le(j.value.timestamp)}`),1)):s(``,!0)]),_:1}),j.value.hint?(t(),o(b,{key:0,type:`warning`},{default:i(()=>[a(u(j.value.hint),1)]),_:1})):s(``,!0)]),_:1})):(t(),o(b,{key:1,type:`danger`},{default:i(()=>[a(u(M.value),1)]),_:1}))]),_:1})):s(``,!0),A.value&&A.value.code===200?(t(),o(x,{key:1,title:`当日客流汇总`,style:{"margin-bottom":`16px`},size:`small`},{default:i(()=>[h(w,{gutter:16},{default:i(()=>[h(S,{span:6},{default:i(()=>[n[15]||=p(`div`,{class:`sum-label`},`数据日期`,-1),p(`div`,le,u(A.value.date??`—`),1)]),_:1}),h(S,{span:6},{default:i(()=>[h(C,{title:`进入(合计)`,value:A.value.total.enter},null,8,[`value`])]),_:1}),h(S,{span:6},{default:i(()=>[h(C,{title:`离开(合计)`,value:A.value.total.exit},null,8,[`value`])]),_:1}),h(S,{span:6},{default:i(()=>[h(C,{title:`经过(合计)`,value:A.value.total.passing},null,8,[`value`])]),_:1})]),_:1}),p(`div`,ue,` 累计接收数据条数:`+u(A.value.total.dataCount),1),A.value.rangeFrom||A.value.rangeTo?(t(),f(`div`,de,` 查询区间:`+u(A.value.rangeFrom??`—`)+` ~ `+u(A.value.rangeTo??`—`)+`(快照日为「数据日期」,区间内累计见下方表格) `,1)):s(``,!0)]),_:1})):s(``,!0),A.value&&A.value.code===200&&ve.value?(t(),o(x,{key:2,title:`区间内各馆累计人数`,style:{"margin-bottom":`16px`},size:`small`},{default:i(()=>[A.value.venuesRangeTotalsNote?(t(),o(b,{key:0,type:`warning`,style:{display:`block`,"margin-bottom":`8px`}},{default:i(()=>[a(u(A.value.venuesRangeTotalsNote),1)]),_:1})):s(``,!0),ke()?(t(),f(`div`,fe,` 区间内缺失归档的日期:`+u(ke()),1)):s(``,!0),Ee().length?(t(),o(E,{key:2,"row-key":`venueId`,columns:Te,data:Ee(),pagination:!1,size:`small`,scroll:{x:800,y:200},summary:De},null,8,[`data`])):(t(),f(`div`,pe,`暂无区间内各馆累计数据`))]),_:1})):s(``,!0),A.value===null&&!v.value?(t(),o(X,{key:3,description:`暂无数据,请先拉取客流`})):A.value&&A.value.code!==200?(t(),o(Z,{key:4,type:`warning`,style:{"margin-bottom":`16px`}},{default:i(()=>[a(` 接口返回非 200:`+u(A.value.message||A.value.code),1)]),_:1})):s(``,!0),h(x,{title:`各场馆当日人数统计`,style:{"margin-bottom":`16px`},size:`small`},{default:i(()=>[h(E,{"row-key":`venueId`,columns:Ae,data:P.value,pagination:!1,size:`small`,scroll:{x:1300,y:280},summary:Oe},{net:i(({record:e})=>[a(u(m(y)(e)),1)]),venueLastUpdate:i(({record:e})=>[a(u(Ie(e.lastUpdate)),1)]),included:i(({record:e})=>[a(u(m(te)(e.includedGroups)),1)]),nested:i(({record:e})=>[(e.groups?.length??0)>0?(t(),o(d,{key:0,type:`text`,size:`mini`,onClick:t=>we(e)},{default:i(()=>[a(u(e.groups.length)+` 组 `,1)]),_:2},1032,[`onClick`])):(t(),f(`span`,me,`—`))]),"summary-cell":i(({column:e,record:n})=>[e.dataIndex===`venueId`?(t(),f(c,{key:0},[a(`合计`)],64)):e.dataIndex===`venueName`?(t(),f(c,{key:1},[a(`—`)],64)):e.dataIndex===`enter`?(t(),f(c,{key:2},[a(u(n.enter),1)],64)):e.dataIndex===`exit`?(t(),f(c,{key:3},[a(u(n.exit),1)],64)):e.dataIndex===`passing`?(t(),f(c,{key:4},[a(u(n.passing),1)],64)):e.slotName===`net`?(t(),f(c,{key:5},[a(u(m(y)(n)),1)],64)):e.dataIndex===`updateCount`?(t(),f(c,{key:6},[a(u(n.updateCount),1)],64)):e.slotName===`venueLastUpdate`?(t(),f(c,{key:7},[a(`—`)],64)):e.slotName===`included`?(t(),f(c,{key:8},[a(`—`)],64)):e.slotName===`nested`?(t(),f(c,{key:9},[a(`—`)],64)):(t(),f(c,{key:10},[a(`—`)],64))]),_:1},8,[`data`]),P.value.length===0?(t(),f(`div`,he,` 暂无场馆数据时,请检查服务端场馆与统计组映射是否已正确配置。 `)):s(``,!0)]),_:1})]),_:1}),h(Q,{key:`hourly`,title:`场馆按小时`},{default:i(()=>[h(g,{wrap:``,style:{"margin-bottom":`12px`}},{default:i(()=>[h(l,{modelValue:F.value,"onUpdate:modelValue":n[3]||=e=>F.value=e,"value-format":`YYYY-MM-DD`,style:{width:`160px`}},null,8,[`modelValue`]),h($,{modelValue:I.value,"onUpdate:modelValue":n[4]||=e=>I.value=e,placeholder:`可选:搜索并筛选单个场馆`,"allow-clear":``,"allow-search":``,"filter-option":be,style:{width:`280px`},options:ye.value},null,8,[`modelValue`,`options`]),h(d,{type:`primary`,loading:R.value,onClick:xe},{default:i(()=>[...n[16]||=[a(`按小时查询`,-1)]]),_:1},8,[`loading`])]),_:1}),h(b,{type:`secondary`,style:{display:`block`,"margin-bottom":`12px`}},{default:i(()=>[...n[17]||=[a(` 须选择查询日期;可按需指定场馆。数据来自服务内存按小时汇总,过早历史日期可能均为 0。 `,-1)]]),_:1}),L.value?.venues?.length?(t(!0),f(c,{key:0},ee(L.value.venues||[],e=>(t(),f(`div`,{key:e.venueId,style:{"margin-bottom":`16px`}},[h(x,{size:`small`,title:(e.venueName||e.venueId)+`(${e.venueId})`},{default:i(()=>[h(E,{columns:je,data:Me(e),"row-key":`key`,pagination:!1,size:`small`},null,8,[`data`])]),_:2},1032,[`title`])]))),128)):R.value?s(``,!0):(t(),o(X,{key:1,description:`请选择日期后查询`}))]),_:1}),h(Q,{key:`devices`,title:`设备链路 / 重试`},{default:i(()=>[h(g,{wrap:``,style:{"margin-bottom":`12px`}},{default:i(()=>[h(Be,{modelValue:z.value,"onUpdate:modelValue":n[5]||=e=>z.value=e},{checked:i(()=>[...n[18]||=[a(`含网络探测(较慢)`,-1)]]),unchecked:i(()=>[...n[19]||=[a(`仅快照`,-1)]]),_:1},8,[`modelValue`]),h(d,{loading:V.value,onClick:Y},{default:i(()=>[...n[20]||=[a(`加载设备链路`,-1)]]),_:1},8,[`loading`])]),_:1}),h(b,{type:`secondary`,style:{display:`block`,"margin-bottom":`12px`}},{default:i(()=>[...n[21]||=[a(` 开启网络探测会向各设备端口发起连通性检测,耗时更长;服务端可关闭此项(将返回无权访问)。 `,-1)]]),_:1}),B.value?(t(),o(x,{key:0,title:`设备列表`,size:`small`,style:{"margin-bottom":`16px`}},{default:i(()=>[B.value.probedAt?(t(),f(`div`,ge,` 探测完成时间:`+u(Le(B.value.probedAt)),1)):s(``,!0),B.value.probeDetail?(t(),f(`div`,_e,u(B.value.probeDetail),1)):s(``,!0),h(E,{"row-key":`__k`,columns:Ne,data:(B.value.devices||[]).map((e,t)=>({...e,__k:`${e.deviceSlot}-${e.ip}-${t}`})),pagination:!1,size:`small`,scroll:{x:1e3,y:220}},{devStatus:i(({record:e})=>[a(u(Re(e.status)),1)]),probe:i(({record:e})=>[a(u(Pe(e)),1)]),_:1},8,[`data`])]),_:1})):s(``,!0),h(x,{title:`设备重试登录`,size:`small`},{default:i(()=>[h(g,{direction:`vertical`,fill:``},{default:i(()=>[h($,{modelValue:U.value,"onUpdate:modelValue":n[6]||=e=>U.value=e,options:Se(),multiple:``,placeholder:`默认为失败设备;可选场馆名称与 IP 对应项`,"allow-clear":``,style:{width:`100%`,"max-width":`720px`}},null,8,[`modelValue`,`options`]),h(g,{wrap:``},{default:i(()=>[h(d,{type:`primary`,status:`danger`,loading:H.value,onClick:Ce},{default:i(()=>[...n[22]||=[a(` 发起重试登录 `,-1)]]),_:1},8,[`loading`]),n[23]||=p(`span`,{class:`muted`},`向服务下发重试指令,不勾选从磁盘重新加载配置(如有需要可由运维在服务端操作)`,-1)]),_:1})]),_:1})]),_:1})]),_:1})]),_:1},8,[`active-key`]),h(He,{visible:W.value,"onUpdate:visible":n[8]||=e=>W.value=e,title:`馆内分组明细`,footer:!1,width:`800px`},{default:i(()=>[G.value?(t(),f(c,{key:0},[h(b,{type:`secondary`,style:{"margin-bottom":`8px`,display:`block`}},{default:i(()=>[a(u(G.value.venueName)+` / `+u(G.value.venueId),1)]),_:1}),h(E,{"row-key":`groupId`,columns:ze,data:G.value.groups||[],pagination:!1,size:`small`},null,8,[`data`])],64)):s(``,!0)]),_:1},8,[`visible`])]),_:1})}}}),[[`__scopeId`,`data-v-2c743980`]]);export{T as default}; |