Files
Migu2.0/MiGu.Server/wwwroot/assets/MapMonitorView-DDv0PMYv.js
T
zhaowei.huang 3356c2cd12 chore(web): 重新构建前端静态资源
- 更新 MiGu.Server/wwwroot/assets 产物与 index.html 入口哈希,对应本次前端源码改动
2026-05-29 23:53:00 +08:00

3 lines
52 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{aE as Se,b4 as d,aA as g,ax as e,bk as p,aD as l,R as Ue,a3 as st,bD as o,ah as J,be as ie,Z as it,a_ as ye,ac as We,aC as W,_ as ot,az as be,bc as C,at as M,aj as Ce,aQ as re,b2 as je,b3 as Ye,u as qe,a9 as Ze,aa as Je,bE as Fe,bv as Be,bG as _e,a$ as Qe,Y as Me,X as P,bC as et,ay as ue,a2 as rt,r as Ae,G as tt,bp as nt,Q as Ke,bn as Z,aV as ct,b1 as at,as as ut,o as dt,I as ft,b5 as vt,al as Ve,K as mt,b8 as pt,aM as _t,J as yt,aK as gt,bA as ht,by as kt,bx as bt,ar as wt,bz as $t,aH as St,af as Ct,bb as It,L as Nt,a1 as xt,w as Tt,a5 as Lt,t as Et,ab as Vt,a8 as At}from"./index-C6ULY2Si.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{W as Mt}from"./Workspace3D-CHeE5zz3.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{r as de}from"./reflection-CKXyOCM_.js";import{m as Pt}from"./mapEdit-D6_KBS33.js";import{O as Dt}from"./ops-BCeFEEjY.js";import{e as Ot}from"./ops-BCWJhnEq.js";/* empty css *//* empty css *//* empty css */import{l as zt,a as Rt}from"./projection-b1x6abrR.js";import{u as Ft}from"./useProjectionStream-BoSdoSNC.js";const Bt={class:"vehicle-monitor"},Ut={class:"overview-row"},Wt={class:"overview-item"},jt={class:"overview-num"},Kt={class:"overview-item"},Gt={class:"overview-num online"},Ht={class:"overview-item"},Xt={class:"overview-num running"},Yt={class:"overview-item"},qt={class:"overview-num charging"},Zt={class:"overview-item"},Jt={class:"overview-num fault"},Qt={class:"toolbar"},en={class:"vehicle-list"},tn=["onClick"],nn={class:"vehicle-head"},an={class:"vid"},ln=["title"],sn={class:"vehicle-sub"},on=["title"],rn={class:"mission-mini"},cn=["title"],un={key:1,class:"mission-name muted"},dn={key:0,class:"empty muted"},fn=Se({__name:"VehicleMonitorPanel",props:{cars:{},missions:{},selectedId:{}},emits:["select"],setup(r,{emit:k}){const f=r,I=k,c=C(""),v=C(""),L=[{value:"idle",label:"空闲"},{value:"running",label:"运行中"},{value:"charging",label:"充电中"},{value:"paused",label:"已暂停"},{value:"fault",label:"故障"},{value:"offline",label:"离线"}],$=L.reduce((t,m)=>(t[m.value]=m.label,t),{});function V(t){return $[t]??t}function j(t){switch(t){case"running":return"success";case"charging":return"primary";case"paused":return"warning";case"fault":return"danger";case"offline":return"info";case"idle":default:return"info"}}const z={queued:"排队",assigned:"已分配",running:"执行中",paused:"暂停",completed:"已完成",cancelled:"已取消",failed:"失败"};function K(t){return z[t]??t}function X(t){switch(t){case"running":return"success";case"assigned":return"primary";case"queued":return"info";case"paused":return"warning";case"completed":return"success";case"cancelled":return"info";case"failed":return"danger";default:return"info"}}const A=M(()=>f.cars.filter(t=>t.state!=="offline").length),h=M(()=>f.cars.filter(t=>t.state==="running").length),Q=M(()=>f.cars.filter(t=>t.state==="charging").length),q=M(()=>f.cars.filter(t=>t.state==="fault").length),Y=M(()=>{const t=i=>i==="running"?0:i==="paused"?1:i==="assigned"?2:3,m=new Map;for(const i of f.missions){if(!i.carId||i.status!=="running"&&i.status!=="paused"&&i.status!=="assigned")continue;const u=m.get(i.carId);(!u||t(i.status)<t(u.status))&&m.set(i.carId,i)}return m});function R(t){if(t.missionId){const m=f.missions.find(i=>i.id===t.missionId);if(m)return m}return Y.value.get(t.id)}function D(t){const m=t.batterySoc??0,i=m>1?m:m*100;return Math.max(0,Math.min(100,Math.round(i)))}function ee(t){return t<20?"#f56c6c":t<50?"#e6a23c":"#67c23a"}function ce(t){return t<20?"low":t<50?"mid":"high"}const F=M(()=>{const t=c.value.trim().toLowerCase(),m=t?t.split(/\s+/).filter(Boolean):[];return f.cars.filter(i=>{if(v.value&&i.state!==v.value)return!1;if(!m.length)return!0;const u=R(i),O=[i.id,i.name,i.typeName??"",i.group??"",i.ip??"",V(i.state),u?.name??"",u?K(u.status):""].join(" ").toLowerCase();return m.every(B=>O.includes(B))})});function U(t){I("select",{kind:"vehicle",id:_(t),name:t.name})}function _(t){return t.rawId!=null?String(t.rawId):t.id.replace(/^C/i,"").replace(/^0+/,"")||t.id}return(t,m)=>{const i=Ue,u=it,O=st,B=We,le=ot;return d(),g("div",Bt,[e("div",Ut,[e("div",Wt,[e("div",jt,p(r.cars.length),1),m[2]||(m[2]=e("div",{class:"overview-label"},"总数",-1))]),e("div",Kt,[e("div",Gt,p(A.value),1),m[3]||(m[3]=e("div",{class:"overview-label"},"在线",-1))]),e("div",Ht,[e("div",Xt,p(h.value),1),m[4]||(m[4]=e("div",{class:"overview-label"},"运行",-1))]),e("div",Yt,[e("div",qt,p(Q.value),1),m[5]||(m[5]=e("div",{class:"overview-label"},"充电",-1))]),e("div",Zt,[e("div",Jt,p(q.value),1),m[6]||(m[6]=e("div",{class:"overview-label"},"故障",-1))])]),e("div",Qt,[l(i,{modelValue:c.value,"onUpdate:modelValue":m[0]||(m[0]=E=>c.value=E),size:"small",clearable:"",placeholder:"搜索 ID / 名称 / 任务",class:"search"},null,8,["modelValue"]),l(O,{modelValue:v.value,"onUpdate:modelValue":m[1]||(m[1]=E=>v.value=E),size:"small",placeholder:"状态",clearable:"",class:"filter"},{default:o(()=>[(d(),g(J,null,ie(L,E=>l(u,{key:E.value,label:E.label,value:E.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),e("div",en,[(d(!0),g(J,null,ie(F.value,E=>(d(),g("div",{key:E.id,class:ye(["vehicle-row",{"is-selected":E.id===r.selectedId}]),onClick:N=>U(E)},[e("div",nn,[e("span",an,p(E.id),1),e("span",{class:"vname",title:E.name},p(E.name),9,ln),l(B,{size:"small",type:j(E.state),class:"state-tag",effect:"dark"},{default:o(()=>[e("span",{class:ye(["dot",`dot-${E.state}`])},null,2),W(" "+p(V(E.state)),1)]),_:2},1032,["type"])]),e("div",sn,[e("div",{class:"battery-mini",title:`电量 ${D(E)}%`},[l(le,{percentage:D(E),"stroke-width":6,"show-text":!1,color:ee(D(E)),class:"battery-bar"},null,8,["percentage","color"]),e("span",{class:ye(["battery-text",ce(D(E))])},p(D(E))+"% ",3)],8,on),e("div",rn,[R(E)?(d(),g(J,{key:0},[l(B,{size:"small",type:X(R(E).status),effect:"plain",class:"mission-tag"},{default:o(()=>[W(p(K(R(E).status)),1)]),_:2},1032,["type"]),e("span",{class:"mission-name",title:R(E).name},p(R(E).name),9,cn)],64)):(d(),g("span",un,"空闲"))])])],10,tn))),128)),F.value.length?be("",!0):(d(),g("div",dn," 无匹配车辆 "))])])}}}),vn=Ce(fn,[["__scopeId","data-v-b169b1ca"]]),Pe="/sl/projection/deliveries";async function mn(r){const k={};r?.includeFinished===!1&&(k.includeFinished="false"),r?.includeAborted===!1&&(k.includeAborted="false");const{data:f}=await re.get(Pe,{params:k});return Array.isArray(f)?f:[]}async function pn(r){await re.post(`${Pe}/${r}/cancel`)}async function _n(r){await re.post(`${Pe}/${r}/resend`)}async function yn(r){await re.post(`${Pe}/${r}/force-complete`)}const gn={class:"mission-list-panel"},hn={class:"toolbar"},kn=["title"],bn=["title"],wn=["title"],$n=["title"],Sn={key:1,class:"muted"},Cn={key:0,class:"empty muted"},In=["disabled"],Nn=["disabled"],xn=Se({__name:"MissionListPanel",props:{deliveries:{},selectedId:{},loading:{type:Boolean}},emits:["select","refresh","actionDone"],setup(r,{emit:k}){const f=r,I=k,c=C(""),v=C(!0),L=C(!0),$=C(!1),V=C(0),j=C(0),z=C(null),K=M(()=>{const i=c.value.trim().toLowerCase(),u=i?i.split(/\s+/).filter(Boolean):[];return f.deliveries.filter(O=>{if(!u.length)return!0;const B=[String(O.id),O.srcLabel,O.dstLabel,O.status,O.carName??"",O.missionName].join(" ").toLowerCase();return u.every(le=>B.includes(le))})});function X(i,u=9){const O=i.indexOf("-"),B=O>=0?i.slice(O+1):i;return B.length<=u?B:`${B.slice(0,u)}…`}function A(i){return{已下发:"待发",执行中:"执行",已完成:"完成",已取消:"取消",强制结束:"强结",任务异常:"异常"}[i]??(i.length>4?`${i.slice(0,3)}…`:i)}function h(i,u=6){return i.length<=u?i:`${i.slice(0,u)}…`}function Q(i){switch(i){case"Fetching":case"Putting":return"success";case"Waiting":return"primary";case"Finished":return"info";case"Canceled":case"Terminated":return"warning";case"Error":return"danger";default:return"info"}}function q({row:i}){const u=[];return i.id===f.selectedId&&u.push("is-selected-row"),i.overdue&&u.push("is-overdue-row"),u.join(" ")}function Y(i){return["Finished","Canceled","Terminated","Error"].includes(i)}function R(i){return i!=null&&!Y(i.statusCode)}function D(i){return i!=null&&!Y(i.statusCode)}function ee(){I("refresh",{includeFinished:v.value,includeAborted:L.value})}function ce(i){U(),I("select",i)}function F(i,u,O){O.preventDefault(),z.value=i,V.value=O.clientX,j.value=O.clientY,$.value=!0}function U(){$.value=!1,z.value=null}const _={cancel:"取消任务",resend:"重发任务","force-complete":"强制完成"};async function t(i){const u=z.value;if(U(),!!u&&!(i==="cancel"&&!R(u))&&!(i==="force-complete"&&!D(u))){try{await Me.confirm(`确定对任务 #${u.id}${u.srcLabel}${u.dstLabel})执行「${_[i]}」?`,"确认操作",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"})}catch{return}try{i==="cancel"?await pn(u.id):i==="resend"?await _n(u.id):await yn(u.id),P.success(`${_[i]} 已提交`),I("actionDone")}catch(O){P.error(`${_[i]} 失败:${O.message}`)}}}function m(){U()}return je(()=>document.addEventListener("click",m)),Ye(()=>document.removeEventListener("click",m)),(i,u)=>{const O=Ue,B=qe,le=Je,E=Ze;return d(),g("div",gn,[e("div",hn,[l(O,{modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=N=>c.value=N),size:"small",clearable:"",placeholder:"搜索任务 ID / 站点 / 车辆",class:"search"},null,8,["modelValue"]),l(B,{modelValue:v.value,"onUpdate:modelValue":u[1]||(u[1]=N=>v.value=N),size:"small",onChange:ee},{default:o(()=>[...u[7]||(u[7]=[W(" 含已完成 ",-1)])]),_:1},8,["modelValue"]),l(B,{modelValue:L.value,"onUpdate:modelValue":u[2]||(u[2]=N=>L.value=N),size:"small",onChange:ee},{default:o(()=>[...u[8]||(u[8]=[W(" 含取消/异常 ",-1)])]),_:1},8,["modelValue"])]),l(E,{data:K.value,size:"small",stripe:"","highlight-current-row":"","row-class-name":q,height:"100%",class:"delivery-table","table-layout":"fixed",onRowClick:ce,onRowContextmenu:F},{default:o(()=>[l(le,{prop:"id",label:"ID",width:"40",align:"center"}),l(le,{label:"起点","show-overflow-tooltip":""},{default:o(({row:N})=>[e("span",{class:"cell-ellipsis",title:N.srcLabel},p(X(N.srcLabel)),9,kn)]),_:1}),l(le,{label:"终点","show-overflow-tooltip":""},{default:o(({row:N})=>[e("span",{class:"cell-ellipsis",title:N.dstLabel},p(X(N.dstLabel)),9,bn)]),_:1}),l(le,{label:"状态",width:"52",align:"center"},{default:o(({row:N})=>[e("span",{class:ye(["status-pill",`status-pill--${Q(N.statusCode)}`]),title:N.status},p(A(N.status)),11,wn)]),_:1}),l(le,{label:"车辆",width:"56","show-overflow-tooltip":""},{default:o(({row:N})=>[N.carName?(d(),g("span",{key:0,class:"cell-ellipsis",title:N.carName},p(h(N.carName)),9,$n)):(d(),g("span",Sn,"—"))]),_:1})]),_:1},8,["data"]),K.value.length?be("",!0):(d(),g("div",Cn,"暂无搬运任务")),Fe(e("div",{class:"ctx-menu",style:Qe({left:`${V.value}px`,top:`${j.value}px`}),onClick:u[6]||(u[6]=_e(()=>{},["stop"]))},[e("button",{type:"button",class:"ctx-item",disabled:!R(z.value),onClick:u[3]||(u[3]=N=>t("cancel"))}," 取消任务 ",8,In),e("button",{type:"button",class:"ctx-item",onClick:u[4]||(u[4]=N=>t("resend"))}," 重发任务 "),e("button",{type:"button",class:"ctx-item",disabled:!D(z.value),onClick:u[5]||(u[5]=N=>t("force-complete"))}," 强制完成 ",8,Nn)],4),[[Be,$.value]])])}}}),Tn=Ce(xn,[["__scopeId","data-v-38e00e9c"]]),Ln=["onClick"],En={class:"sid"},Vn={class:"sname"},An={key:0,class:"empty"},Mn=Se({__name:"SitePickDialog",props:{modelValue:{type:Boolean},title:{},sites:{}},emits:["update:modelValue","confirm","pickOnMap"],setup(r,{expose:k,emit:f}){const I=r,c=f,v=M({get:()=>I.modelValue,set:A=>c("update:modelValue",A)}),L=C(""),$=C(null),V=C(!1),j=M(()=>{const A=L.value.trim().toLowerCase();return A?I.sites.filter(h=>String(h.id).includes(A)||h.name.toLowerCase().includes(A)||h.label.toLowerCase().includes(A)):I.sites});et(()=>I.modelValue,A=>{A&&(L.value="",$.value=I.sites[0]?.id??null)});function z(){$.value!=null&&(c("confirm",$.value),v.value=!1)}function K(){V.value=!0,c("pickOnMap")}function X(){V.value=!1}return k({close:()=>{v.value=!1},endMapPick:()=>{V.value=!1}}),(A,h)=>{const Q=Ue,q=rt,Y=Ae,R=tt;return d(),ue(R,{modelValue:v.value,"onUpdate:modelValue":h[2]||(h[2]=D=>v.value=D),title:r.title,width:"420px","destroy-on-close":"","append-to-body":"",class:"site-pick-dialog",onClosed:X},{footer:o(()=>[l(Y,{onClick:h[1]||(h[1]=D=>v.value=!1)},{default:o(()=>[...h[3]||(h[3]=[W("取消",-1)])]),_:1}),l(Y,{loading:V.value,onClick:K},{default:o(()=>[...h[4]||(h[4]=[W("在地图上拾取",-1)])]),_:1},8,["loading"]),l(Y,{type:"primary",disabled:$.value==null,onClick:z},{default:o(()=>[...h[5]||(h[5]=[W("确认前往",-1)])]),_:1},8,["disabled"])]),default:o(()=>[h[6]||(h[6]=e("p",{class:"hint"},"请选择车辆要前往的目标站点。",-1)),l(Q,{modelValue:L.value,"onUpdate:modelValue":h[0]||(h[0]=D=>L.value=D),clearable:"",placeholder:"搜索站点 ID / 名称",class:"filter-input"},null,8,["modelValue"]),l(q,{"max-height":"280px",class:"site-scroll"},{default:o(()=>[(d(!0),g(J,null,ie(j.value,D=>(d(),g("button",{key:D.id,type:"button",class:ye(["site-row",{active:$.value===D.id}]),onClick:ee=>$.value=D.id},[e("span",En,"#"+p(D.id),1),e("span",Vn,p(D.name||"未命名"),1)],10,Ln))),128)),j.value.length?be("",!0):(d(),g("div",An,"无匹配站点"))]),_:1})]),_:1},8,["modelValue","title"])}}}),Pn=Ce(Mn,[["__scopeId","data-v-1e1b7025"]]),Dn=new Set(["Goto","GotoSite"]),On=["去某地","前往站点"];function He(r){if(r.params?.length)return!1;if(Dn.has(r.methodName))return!0;const k=r.label??"";return On.some(f=>k.includes(f))}async function zn(){return(await de.listObjects("site")).map(k=>({id:k.id,name:k.name,label:`#${k.id} ${k.name||"站点"}`})).sort((k,f)=>k.id-f.id)}async function Xe(){try{P.info({message:"请在 3D 地图上点击目标站点附近",duration:4e3});const r=await Pt.pick();return r.siteId==null||r.siteId<0?(P.warning("未识别到附近站点,请靠近站点再点击"),null):r.siteId}catch(r){return r instanceof Error&&/取消|cancel|499/i.test(r.message)||P.error(`地图拾取失败:${r instanceof Error?r.message:String(r)}`),null}}function Rn(r){if(r&&typeof r=="object"&&"response"in r&&r.response?.status===404)return!0;const k=r instanceof Error?r.message:String(r);return/status code 404/i.test(k)}async function Fn(r,k){try{const f=await de.gotoCarSite(r,k);return P.success(f.message||`已下发前往站点 #${k}`),!0}catch(f){if(!Rn(f))return P.error(`前往站点失败:${f instanceof Error?f.message:String(f)}`),!1;try{const I=await de.execute("car",r,"WebGotoSite",{siteId:k});return P.success(I.returnValue?`已执行:${I.returnValue}`:`已下发前往站点 #${k}`),!0}catch(I){const c=I instanceof Error?I.message:String(I),v=/WebGotoSite|goto-site|不存在可调用方法/i.test(c);return P.error(v?`${c}。当前 SimpleLite 仍是旧版 DLL:请先完全关闭 SimpleLite 窗口,再在 PowerShell 执行 Migu2.0/scripts/redeploy-simplelite.ps1,然后重新登录;或调用 POST /api/health/simplelite/restart-for-update`:`前往站点失败:${c}`),!1}}}async function Bn(r,k,f){const I=f.label||f.methodName,c={};for(const v of f.params)try{const{value:L}=await Me.prompt(`参数 ${v.name}${v.typeName}`,I,{inputValue:v.defaultValue??"",confirmButtonText:"确定",cancelButtonText:"取消"});c[v.name]=L??""}catch{return!1}try{const v=await de.execute(r,k,f.methodName,c);return P.success(v.returnValue?`已执行:${v.returnValue}`:`已执行 ${I}`),!0}catch(v){return P.error(`执行失败:${v instanceof Error?v.message:String(v)}`),!1}}const Un={class:"monitor-selection"},Wn={key:0,class:"empty-hint"},jn={key:1,class:"pane"},Kn={key:0,class:"pane-loading"},Gn={class:"card card--header"},Hn={class:"title-row"},Xn={class:"id-tag"},Yn={class:"name-line"},qn={class:"card"},Zn={class:"kv-grid"},Jn={class:"kv"},Qn={class:"v mono"},ea={class:"kv"},ta={class:"v mono"},na={class:"kv"},aa={class:"v mono"},la={key:0,class:"card"},sa={class:"card-hd"},ia={class:"meta"},oa={class:"kv-list"},ra={class:"k"},ca=["title"],ua={key:1,class:"card card--actions"},da={class:"action-grid"},fa=["disabled","onClick"],va={class:"card card--header"},ma={class:"title-row"},pa={class:"id-tag"},_a={class:"name-line"},ya={class:"card"},ga={class:"kv-list"},ha={class:"kv-row"},ka=["title"],ba={class:"kv-row"},wa={class:"v"},$a=["title"],Sa={class:"kv-row"},Ca={class:"kv-row"},Ia=["title"],Na={class:"card card--actions"},xa={class:"card-hd"},Ta={key:0,class:"meta"},La={key:1,class:"meta"},Ea={key:0,class:"muted-line"},Va={key:1,class:"action-grid action-grid--vehicle"},Aa=["disabled","title","onClick"],Ma={key:0,class:"muted-line"},Pa={key:1,class:"muted-line"},Da={key:2,class:"action-grid action-grid--vehicle"},Oa=["disabled","onClick"],za={class:"card card--header"},Ra={class:"title-row"},Fa={class:"id-tag"},Ba={class:"name-line"},Ua={key:0,class:"card"},Wa={class:"kv-list"},ja={class:"k"},Ka={class:"v"},Ga={class:"k"},Ha={class:"v"},Xa={key:1,class:"card card--actions"},Ya={class:"action-grid"},qa=["disabled","onClick"],Za={key:4,class:"muted-line"},Ja=Se({__name:"MonitorSelectionPanel",props:{selection:{},refreshKey:{},cars:{},missions:{},readOnly:{type:Boolean}},setup(r){const k=new Set(["AllowLock","PreventLock"]),f=r,I=nt(),c=C(!1),v=C(!1),L=C(!1),$=C(null),V=C(null),j=C(""),z=C(""),K=C(""),X=C({}),A=C([]),h=C([]),Q=C({}),q=C([]),Y=C([]),R=C(!1),D=C(!1),ee=C([]),ce=C("选择目标站点"),F={car:"car",vehicle:"car",site:"site",track:"track"},U=M(()=>{const n=f.selection?.kind?.toLowerCase();return n?F[n]??null:null}),_=M(()=>{const n=f.selection?.kind?.toLowerCase();return n==="site"?"site":n==="vehicle"||n==="car"?"vehicle":n==="track"?"track":"other"}),t=M(()=>{const n=Number(f.selection?.id);return Number.isFinite(n)?n:f.selection?.id??"-"});function m(n,s=1){if(n==null||n==="")return"—";const y=Number(n);return Number.isFinite(y)?y.toFixed(s):n}function i(...n){for(const s of n){const y=X.value[s];if(y!=null&&y!=="")return y}return""}function u(...n){for(const s of n){const y=A.value.find(x=>x.key===s);if(y?.value)return y.value}for(const s of n){const y=A.value.find(x=>x.key.includes(s));if(y?.value)return y.value}return""}function O(){const n=u("标记","tags");return n?/unavailable/i.test(n):!1}const B=M(()=>({name:i("name")||j.value||f.selection?.name||`站点 ${t.value}`,x:m(i("x"),1),y:m(i("y"),1),z:m(i("z"),1),disabled:O()})),le=M(()=>{const n=q.value;if(n.length){const s=new Set(n);return h.value.filter(y=>s.has(y.methodName))}return h.value.filter(s=>k.has(s.methodName))}),E=M(()=>{const n=Y.value;if(!n.length)return h.value;const s=new Set(n);return h.value.filter(y=>s.has(y.methodName))});function N(){if(!f.selection||_.value!=="vehicle")return;const n=String(f.selection.id);return f.cars?.find(s=>s.id===n||String(s.rawId??"")===n||Ie(s)===n)}function Ie(n){return n.rawId!=null?String(n.rawId):n.id.replace(/^C/i,"").replace(/^0+/,"")||n.id}const fe=M(()=>A.value.map(n=>({key:n.key,value:n.value||"—",warn:/alarm|error|fault|block|stop/i.test(`${n.key} ${n.value}`)&&n.value!=="0"&&n.value!=="无"})));function ge(){const n=i("tags");if(n)return n;const s=u("tags","标记");if(s)return s;for(const y of A.value)if(/tag|标记/i.test(y.key)&&y.value)return y.value;return""}function Ne(){const n=ge();if(/occupied/i.test(n))return!0;for(const s of A.value)if(/occupied/i.test(s.value??""))return!0;return!1}function S(){const n=N(),s=i("batterySoc","battery","电量");let y=null;if(s){const x=Number(s);Number.isFinite(x)&&(y=x<=1?Math.round(x*100):Math.round(x))}else n!=null&&(y=Math.round(n.batterySoc<=1?n.batterySoc*100:n.batterySoc));return y==null?{text:"—",low:!1}:{text:`${y}%`,low:y<20}}function te(){const n=N(),s=i("x"),y=i("y"),x=i("th","theta"),b=s||(n!=null?String(n.x):""),H=y||(n!=null?String(n.y):""),ke=x||(n!=null?String(n.theta):"");if(b||H)return`(${b||"—"}, ${H||"—"}${ke?`, ${m(ke,1)}°`:""})`;const Le=i("siteID");return Le&&Le!=="-1"?`站点 #${Le}`:u("位姿","站点")||"—"}function xe(){const n=u("TCStat")||i("TCStat");if(n&&n!=="/"&&n.trim()!=="")return n;const s=u("blockedBy");if(s&&s!=="[]"&&s!=="/")try{const ke=JSON.parse(s);if(Array.isArray(ke)&&ke.length>0){const Le=ke.map(ze=>ze.carid).filter(ze=>ze!=null);return Le.length?`被车辆 ${Le.join("、")} 交管`:"交管阻塞"}}catch{return s.length>48?`${s.slice(0,48)}…`:s}const y=u("trafficStopped");if(y&&y!=="(0, 0)"&&y!=="(0,0)"&&y!=="/")return`交管暂停 ${y}`;const x=u("holdingLocks"),b=u("pendingLocks"),H=[];return x&&x!=="[]"&&H.push(`已占 ${x}`),b&&b!=="[]"&&H.push(`待锁 ${b}`),H.length?H.join(""):"正常"}function Ee(){const n=u("车体_AlarmInfo","AlarmInfo")||A.value.find(y=>/alarminfo/i.test(y.key))?.value;if(n&&n!=="0"&&n!=="/"&&n.trim()!=="")return{text:n,warn:!0};const s=i("lstatus")||u("lstatus");return s&&/故障|报警|异常|失联|超时|检修/i.test(s)?{text:s,warn:!0}:{text:"无",warn:!1}}const ne=M(()=>{const n=N(),s=Ne(),y=s?"任务中":"空闲",x=Ee(),b=S();return{id:n?.id??f.selection?.id??"-",name:j.value||n?.name||f.selection?.name||"车辆",runLabel:y,runTagType:s?"success":"info",traffic:xe(),alarm:x.text,alarmWarn:x.warn,battery:b.text,batteryLow:b.low,position:te()}});function a(){const n=Q.value,s=K.value,y=z.value;if(s&&n[s]?.length)return n[s];if(y&&n[y]?.length)return n[y];for(const[x,b]of Object.entries(n))if(b.length&&(s&&(x===s||x.endsWith("."+y)||s.endsWith("."+x))||y&&(x===y||x.endsWith("."+y))))return b;return[]}const w=M(()=>a()),T=M(()=>{const n=w.value;if(!n.length)return[];const s=new Set(n);return h.value.filter(y=>s.has(y.methodName))}),G=M(()=>Dt.filter(n=>n.target==="car"&&I.hasOp(n.code)));async function oe(n){const s=Number(f.selection?.id);if(Number.isFinite(s)){if(n.needConfirm)try{await Me.confirm(`确认执行 [${n.label}]
目标车辆:${f.selection?.id}`,"二次确认",{type:"warning"})}catch{return}$.value=n.code;try{const y=await Ot({opCode:n.code,targetId:String(s),reason:""});y.ok?P.success(`已执行 ${n.label}auditId=${y.auditId}`):P.warning(y.message||`执行未成功:${n.label}`)}catch(y){P.error(`执行失败:${y.message}`)}finally{$.value=null}}}const se=M(()=>R.value?Object.keys(Q.value).length?w.value.length?"当前车型无可执行动作。":"当前车型未配置动作,或方法名与运营维护中勾选的不一致。":"未配置动作。请在「配置中心 → 运营维护」按车型勾选动作并保存。":"加载配置中…"),ae=M(()=>({name:i("name")||j.value||f.selection?.name||`路径 ${t.value}`})),he=M(()=>[{key:"layer",label:"图层",value:i("layerName","layer")||"—"},{key:"type",label:"类型",value:z.value||"—"}]);function we(n){return n?`${n.kind}:${n.id}`:""}async function Te(n=!1){if(!(R.value&&!n))try{const s=await de.getMonitorConfig();Q.value={...s.config.carActionByType??{}},q.value=[...s.config.site?.methods??[]],Y.value=[...s.config.track?.methods??[]]}catch{Q.value={},q.value=[],Y.value=[]}finally{R.value=!0}}async function $e(){if(!f.selection){j.value="",X.value={},A.value=[],h.value=[],v.value=!1;return}const n=U.value,s=Number(f.selection.id);if(!n||!Number.isFinite(s))return;const y=v.value;y?L.value=!0:c.value=!0;try{if(f.readOnly){const H=await de.getBundle(n,s);j.value=H.summary?.name??f.selection.name??"",z.value=H.typeName??"",K.value="fullTypeName"in H&&H.fullTypeName?H.fullTypeName:H.typeName??"",X.value={...H.fields};for(const ke of H.fieldList??[])X.value[ke.key]=ke.value;A.value=H.status??[],h.value=[],v.value=!0;return}await Te(!y);const[x,b]=await Promise.all([de.getBundle(n,s),de.listMethods(n,s)]);j.value=x.summary?.name??f.selection.name??"",z.value=x.typeName??"",K.value="fullTypeName"in x&&x.fullTypeName?x.fullTypeName:x.typeName??"",X.value={...x.fields};for(const H of x.fieldList??[])X.value[H.key]=H.value;A.value=x.status??[],h.value=b,v.value=!0}catch(x){f.readOnly?console.warn("[MonitorSelection] 只读详情加载失败,降级用列表数据",x):P.error(`加载选中信息失败:${x.message}`)}finally{c.value=!1,L.value=!1}}async function De(n){const s=U.value;if(!s||!f.selection||!n.methodName)return;const y=Number(f.selection.id);if(Number.isFinite(y)){if(s==="car"&&He(n)){V.value=n,ce.value=`选择目标站点 — ${n.label||n.methodName}`,$.value=n.methodName;try{const x=await Xe();if(x!=null){await Oe(x);return}ee.value=await zn(),D.value=!0}catch(x){P.error(`加载站点列表失败:${x.message}`)}finally{D.value||($.value=null)}return}$.value=n.methodName;try{await Bn(s,y,n)&&await $e()}finally{$.value=null}}}async function Oe(n){const s=Number(f.selection?.id);if(Number.isFinite(s)){$.value=V.value?.methodName??"goto";try{await Fn(s,n)&&await $e()}finally{$.value=null,V.value=null}}}async function lt(){const n=await Xe();D.value=!1,n!=null&&await Oe(n)}let Ge=0;return et(()=>[we(f.selection),f.refreshKey],()=>{const n=++Ge;(async()=>await $e())()},{immediate:!0}),(n,s)=>{const y=Ke,x=We;return d(),g("div",Un,[r.selection?(d(),g("div",jn,[c.value?(d(),g("div",Kn,[l(y,{class:"is-loading"},{default:o(()=>[l(Z(ct))]),_:1}),s[2]||(s[2]=e("span",null,"加载中…",-1))])):_.value==="site"?(d(),g(J,{key:1},[e("section",Gn,[e("div",Hn,[e("span",Xn,"#"+p(t.value),1),s[3]||(s[3]=e("span",{class:"type-tag"},"站点",-1))]),e("div",Yn,p(B.value.name),1)]),e("section",qn,[s[7]||(s[7]=e("header",{class:"card-hd"},[e("span",null,"位置")],-1)),e("div",Zn,[e("div",Jn,[s[4]||(s[4]=e("span",{class:"k"},"X",-1)),e("span",Qn,p(B.value.x),1)]),e("div",ea,[s[5]||(s[5]=e("span",{class:"k"},"Y",-1)),e("span",ta,p(B.value.y),1)]),e("div",na,[s[6]||(s[6]=e("span",{class:"k"},"Z",-1)),e("span",aa,p(B.value.z),1)])])]),fe.value.length?(d(),g("section",la,[e("header",sa,[s[8]||(s[8]=e("span",null,"状态",-1)),e("span",ia,p(fe.value.length),1)]),e("div",oa,[(d(!0),g(J,null,ie(fe.value,b=>(d(),g("div",{key:b.key,class:"kv-row"},[e("span",ra,p(b.key),1),e("span",{class:"v",title:b.value},p(b.value),9,ca)]))),128))])])):be("",!0),!r.readOnly&&le.value.length?(d(),g("section",ua,[s[9]||(s[9]=e("header",{class:"card-hd"},[e("span",null,"操作")],-1)),e("div",da,[(d(!0),g(J,null,ie(le.value,b=>(d(),g("button",{key:b.methodName,type:"button",class:"action-btn",disabled:$.value===b.methodName,onClick:H=>De(b)},p(b.label||b.methodName),9,fa))),128))])])):be("",!0)],64)):_.value==="vehicle"?(d(),g(J,{key:2},[e("section",va,[e("div",ma,[e("span",pa,p(ne.value.id),1),l(x,{size:"small",type:ne.value.runTagType,effect:"dark"},{default:o(()=>[W(p(ne.value.runLabel),1)]),_:1},8,["type"])]),e("div",_a,p(ne.value.name),1)]),e("section",ya,[s[15]||(s[15]=e("header",{class:"card-hd"},[e("span",null,"运行信息")],-1)),e("div",ga,[e("div",ha,[s[10]||(s[10]=e("span",{class:"k"},"交管状态",-1)),e("span",{class:"v",title:ne.value.traffic},p(ne.value.traffic),9,ka)]),e("div",ba,[s[11]||(s[11]=e("span",{class:"k"},"运行状态",-1)),e("span",wa,p(ne.value.runLabel),1)]),e("div",{class:ye(["kv-row",{"is-warn":ne.value.alarmWarn}])},[s[12]||(s[12]=e("span",{class:"k"},"报警状态",-1)),e("span",{class:"v",title:ne.value.alarm},p(ne.value.alarm),9,$a)],2),e("div",Sa,[s[13]||(s[13]=e("span",{class:"k"},"电量",-1)),e("span",{class:ye(["v",{"is-low-battery":ne.value.batteryLow}])},p(ne.value.battery),3)]),e("div",Ca,[s[14]||(s[14]=e("span",{class:"k"},"位置",-1)),e("span",{class:"v mono",title:ne.value.position},p(ne.value.position),9,Ia)])])]),e("section",Na,[e("header",xa,[e("span",null,p(r.readOnly?"运维动作":"动作"),1),!r.readOnly&&T.value.length?(d(),g("span",Ta,p(T.value.length),1)):r.readOnly&&G.value.length?(d(),g("span",La,p(G.value.length),1)):be("",!0)]),r.readOnly?(d(),g(J,{key:0},[G.value.length?(d(),g("div",Va,[(d(!0),g(J,null,ie(G.value,b=>(d(),g("button",{key:b.code,type:"button",class:ye(["action-btn",{"action-btn--goto":b.needConfirm}]),disabled:$.value===b.code,title:b.description,onClick:H=>oe(b)},p(b.label),11,Aa))),128))])):(d(),g("div",Ea,"当前账号无可执行的运维动作。"))],64)):(d(),g(J,{key:1},[L.value?(d(),g("div",Ma,"加载动作…")):T.value.length?(d(),g("div",Da,[(d(!0),g(J,null,ie(T.value,b=>(d(),g("button",{key:b.methodName,type:"button",class:ye(["action-btn",{"action-btn--goto":Z(He)(b)}]),disabled:$.value===b.methodName,onClick:H=>De(b)},p(b.label||b.methodName),11,Oa))),128))])):(d(),g("div",Pa,p(se.value),1))],64))])],64)):_.value==="track"?(d(),g(J,{key:3},[e("section",za,[e("div",Ra,[e("span",Fa,"#"+p(t.value),1),s[16]||(s[16]=e("span",{class:"type-tag"},"路径",-1))]),e("div",Ba,p(ae.value.name),1)]),fe.value.length||he.value.length?(d(),g("section",Ua,[s[17]||(s[17]=e("header",{class:"card-hd"},[e("span",null,"信息")],-1)),e("div",Wa,[(d(!0),g(J,null,ie(he.value,b=>(d(),g("div",{key:b.key,class:"kv-row"},[e("span",ja,p(b.label),1),e("span",Ka,p(b.value),1)]))),128)),(d(!0),g(J,null,ie(fe.value,b=>(d(),g("div",{key:"s-"+b.key,class:"kv-row"},[e("span",Ga,p(b.key),1),e("span",Ha,p(b.value),1)]))),128))])])):be("",!0),!r.readOnly&&E.value.length?(d(),g("section",Xa,[s[18]||(s[18]=e("header",{class:"card-hd"},[e("span",null,"动作")],-1)),e("div",Ya,[(d(!0),g(J,null,ie(E.value,b=>(d(),g("button",{key:b.methodName,type:"button",class:"action-btn",disabled:$.value===b.methodName,onClick:H=>De(b)},p(b.label||b.methodName),9,qa))),128))])])):be("",!0)],64)):(d(),g("div",Za,"该类型暂不支持监控详情展示。"))])):(d(),g("div",Wn,[...s[1]||(s[1]=[e("span",{class:"empty-title"},"未选中对象",-1),e("span",{class:"empty-desc"},"在 3D 画布或车辆列表中点击以查看信息。",-1)])])),l(Pn,{modelValue:D.value,"onUpdate:modelValue":s[0]||(s[0]=b=>D.value=b),title:ce.value,sites:ee.value,onConfirm:Oe,onPickOnMap:lt},null,8,["modelValue","title","sites"])])}}}),Qa=Ce(Ja,[["__scopeId","data-v-9944e828"]]),el={class:"fac-header"},tl={class:"fac-title"},nl={class:"fac-time"},al={class:"fac-body"},ll={class:"fac-info"},sl={class:"fac-coord"},il={key:0},ol={key:1,class:"muted"},rl={class:"fac-actions"},cl=Se({__name:"FloatingAlarmCard",props:{alarm:{},initialOffset:{}},emits:["close","ack","snooze","locate"],setup(r,{emit:k}){const f=r,I=k,c=C(null),v=C(!1),L=C({right:f.initialOffset?.right??24,bottom:f.initialOffset?.bottom??24}),$=M(()=>typeof f.alarm.x=="number"&&Number.isFinite(f.alarm.x)),V=M(()=>{const F=(f.alarm.info||"").toLowerCase();return F.includes("critical")||F.includes("严重")||F.includes("紧急")?"critical":F.includes("error")||F.includes("故障")?"error":F.includes("warn")||F.includes("告警")?"warn":"info"}),j=M(()=>{try{return new Date(f.alarm.timestamp).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit",second:"2-digit"})}catch{return""}}),z=M(()=>({left:L.value.left!==void 0?`${L.value.left}px`:void 0,top:L.value.top!==void 0?`${L.value.top}px`:void 0,right:L.value.right!==void 0?`${L.value.right}px`:void 0,bottom:L.value.bottom!==void 0?`${L.value.bottom}px`:void 0}));let K=0,X=0,A=0,h=0;function Q(F){if(!c.value)return;const U=c.value.getBoundingClientRect();A=U.left,h=U.top,K=F.clientX,X=F.clientY,v.value=!0,window.addEventListener("mousemove",q),window.addEventListener("mouseup",Y)}function q(F){L.value={left:A+(F.clientX-K),top:h+(F.clientY-X)}}function Y(){v.value=!1,window.removeEventListener("mousemove",q),window.removeEventListener("mouseup",Y)}at(()=>{window.removeEventListener("mousemove",q),window.removeEventListener("mouseup",Y)});function R(){I("close")}function D(){I("ack")}function ee(){I("snooze")}function ce(){I("locate",f.alarm)}return(F,U)=>{const _=Ke,t=Ae;return d(),g("div",{ref_key:"cardRef",ref:c,class:ye(["floating-alarm-card",[`lvl-${V.value}`,{dragging:v.value}]]),style:Qe(z.value),onMousedown:_e(Q,["stop"])},[e("div",el,[U[0]||(U[0]=e("span",{class:"fac-dot"},null,-1)),e("span",tl,p(r.alarm.carName)+" #"+p(r.alarm.carId),1),e("span",nl,p(j.value),1),l(_,{class:"fac-close",onClick:_e(R,["stop"])},{default:o(()=>[l(Z(ut))]),_:1})]),e("div",al,[e("div",ll,p(r.alarm.info),1),e("div",sl,[$.value?(d(),g("span",il,"坐标 ("+p(r.alarm.x?.toFixed(0))+", "+p(r.alarm.y?.toFixed(0))+") mm",1)):(d(),g("span",ol,"无坐标"))])]),e("div",rl,[l(t,{size:"small",plain:"",disabled:!$.value,onClick:_e(ce,["stop"])},{default:o(()=>[...U[1]||(U[1]=[W("定位",-1)])]),_:1},8,["disabled"]),l(t,{size:"small",plain:"",onClick:_e(D,["stop"])},{default:o(()=>[...U[2]||(U[2]=[W("确认",-1)])]),_:1}),l(t,{size:"small",plain:"",onClick:_e(ee,["stop"])},{default:o(()=>[...U[3]||(U[3]=[W("稍后",-1)])]),_:1})])],38)}}}),ul=Ce(cl,[["__scopeId","data-v-0b6ee97c"]]),dl={class:"floating-alarm-stack"},fl=Se({__name:"FloatingAlarmStack",props:{alarms:{}},emits:["locate","ack"],setup(r,{emit:k}){const f=r,I=k,c=C(new Set),v=C(new Set);function L(h){return`${h.carId}`}const $=M(()=>f.alarms.filter(h=>h.action!=="clear").filter(h=>!c.value.has(L(h))).filter(h=>!v.value.has(L(h)))),V=M(()=>f.alarms.filter(h=>v.value.has(L(h))));function j(h){c.value=new Set([...c.value,L(h)])}function z(h){c.value=new Set([...c.value,L(h)]),I("ack",h)}function K(h){v.value=new Set([...v.value,L(h)])}function X(h){I("locate",h)}function A(){v.value=new Set}return(h,Q)=>{const q=Ae,Y=dt;return d(),g("div",dl,[(d(!0),g(J,null,ie($.value,(R,D)=>(d(),ue(ul,{key:`${R.carId}-${R.timestamp}`,alarm:R,"initial-offset":{right:24,bottom:24+D*132},onClose:ee=>j(R),onAck:ee=>z(R),onSnooze:ee=>K(R),onLocate:X},null,8,["alarm","initial-offset","onClose","onAck","onSnooze"]))),128)),V.value.length?(d(),g("div",{key:0,class:"snooze-tray",onClick:A},[l(Y,{value:V.value.length,type:"warning"},{default:o(()=>[l(q,{size:"small",circle:""},{default:o(()=>[...Q[0]||(Q[0]=[W("≡",-1)])]),_:1})]),_:1},8,["value"])])):be("",!0)])}}}),vl=Ce(fl,[["__scopeId","data-v-c37fdeb1"]]),ve="/sl/projection/toolbar";function Re(r,k){return{key:r,value:k,Key:r,Value:k}}function ml(r,k){return{name:r,visible:k,Name:r,Visible:k}}function pl(r){return{note:r,Note:r}}function _l(r){return{fileName:r,FileName:r}}async function me(r){const k=(await r).data;if(!k?.success)throw new Error(k?.message??"请求失败");if(k.data==null)throw new Error("服务端返回空数据");return k.data}const pe={getState:()=>me(re.get(`${ve}/state`)),setAlign:(r,k)=>me(re.post(`${ve}/align`,Re(r,k))),setSelect:(r,k)=>me(re.post(`${ve}/select`,Re(r,k))),setDisplay:(r,k)=>me(re.post(`${ve}/display`,Re(r,k))),setLayerVisibility:(r,k)=>me(re.post(`${ve}/layer`,ml(r,k))),startRecording:r=>me(re.post(`${ve}/recording/start`,pl(r??""))),stopRecording:()=>me(re.post(`${ve}/recording/stop`)),deleteRecording:r=>me(re.delete(`${ve}/recording/${encodeURIComponent(r)}`)),startPlayback:r=>me(re.post(`${ve}/playback/start`,_l(r))),stopPlayback:()=>me(re.post(`${ve}/playback/stop`))},yl={class:"canvas-toolbar"},gl=["onClick"],hl=["onClick"],kl={key:0,class:"menu-empty"},bl=["onClick"],wl=["onClick"],$l={class:"btn-label"},Sl={class:"btn-label"},Cl={class:"muted-hint"},Il=Se({__name:"WorkspaceCanvasToolbar",setup(r){const k=[{key:"sites",label:"站点"},{key:"cars",label:"AGV"},{key:"tracks",label:"路径"}],f=[{key:"tracks",label:"路径"},{key:"cars",label:"AGV"},{key:"decor",label:"区域/装饰"},{key:"sites",label:"站点"}],I=[{key:"labels",label:"场景图元标记"},{key:"primitives",label:"场景图元"},{key:"cars",label:"车辆"}],c=C(null),v=It({align:!1,select:!1,display:!1,layer:!1,recording:!1,playback:!1}),L=C(!1),$=C(!1);let V=null;const j=M(()=>{const _=c.value?.recording;if(!_?.isRecording)return"录制";const t=Math.floor((_.elapsedMs??0)/1e3),m=String(Math.floor(t/60)).padStart(2,"0"),i=String(t%60).padStart(2,"0");return`停止 ${m}:${i}`});async function z(){try{c.value=await pe.getState()}catch(_){P.error(`同步工具栏状态失败:${_.message}`)}}async function K(_){if(c.value){v.align=!0;try{c.value=await pe.setAlign(_,!c.value.align[_])}catch(t){P.error(`切换对齐失败:${t.message}`)}finally{v.align=!1}}}async function X(_){if(c.value){v.select=!0;try{c.value=await pe.setSelect(_,!c.value.select[_])}catch(t){P.error(`切换选择过滤失败:${t.message}`)}finally{v.select=!1}}}async function A(_){if(c.value){v.display=!0;try{c.value=await pe.setDisplay(_,!c.value.display[_])}catch(t){P.error(`切换显示内容失败:${t.message}`)}finally{v.display=!1}}}async function h(_,t){v.layer=!0;try{c.value=await pe.setLayerVisibility(_,t)}catch(m){P.error(`切换图层失败:${m.message}`)}finally{v.layer=!1}}function Q(){P.info("寻路右键动作尚未接入 SimpleLite;请使用 SegmentPlan.FindRoute / 工作台脚本。")}async function q(){const _=c.value?.recording;if(_){if(_.isPlaying){P.warning("当前在回放中,请先停止回放。");return}v.recording=!0;try{c.value=_.isRecording?await pe.stopRecording():await pe.startRecording("")}catch(t){P.error(`录制操作失败:${t.message}`)}finally{v.recording=!1}}}async function Y(){const _=c.value?.recording;if(_){if(_.isRecording){P.warning("录制中无法进入回放,请先停止录制。");return}if(_.isPlaying){v.playback=!0;try{c.value=await pe.stopPlayback()}catch(t){P.error(`停止回放失败:${t.message}`)}finally{v.playback=!1}return}await z(),L.value=!0}}async function R(_){v.playback=!0;try{c.value=await pe.startPlayback(_),L.value=!1,$.value=!1,P.success(`已开始回放 ${_}`)}catch(t){P.error(`启动回放失败:${t.message}`)}finally{v.playback=!1}}async function D(_){try{await Me.confirm(`确认删除录像 ${_}?此操作不可恢复。`,"删除录像",{type:"warning"})}catch{return}try{c.value=await pe.deleteRecording(_),P.success(`已删除 ${_}`)}catch(t){P.error(`删除失败:${t.message}`)}}async function ee(){await z(),$.value=!0}function ce(_){if(!Number.isFinite(_)||_<=0)return"0 B";if(_<1024)return`${_} B`;const t=_/1024;return t<1024?`${t.toFixed(0)} KB`:`${(t/1024).toFixed(1)} MB`}function F(_){if(!Number.isFinite(_)||_<=0)return"00:00:00";const t=Math.floor(_/1e3),m=String(Math.floor(t/3600)).padStart(2,"0"),i=String(Math.floor(t%3600/60)).padStart(2,"0"),u=String(t%60).padStart(2,"0");return`${m}:${i}:${u}`}function U(_){if(!_)return"—";const t=new Date(_);if(isNaN(t.getTime()))return _;const m=i=>String(i).padStart(2,"0");return`${t.getFullYear()}-${m(t.getMonth()+1)}-${m(t.getDate())} ${m(t.getHours())}:${m(t.getMinutes())}`}return je(()=>{z(),V=setInterval(()=>{const _=c.value?.recording;(_?.isRecording||_?.isPlaying)&&z()},1e3)}),at(()=>{V&&clearInterval(V)}),(_,t)=>{const m=Ke,i=Ae,u=qe,O=mt,B=ft,le=yt,E=Nt,N=Je,Ie=Ze,fe=tt,ge=We,Ne=Ct;return d(),g("div",yl,[l(B,{trigger:"click","hide-on-click":!1,placement:"top-start"},{dropdown:o(()=>[l(O,{class:"toolbar-menu"},{default:o(()=>[(d(),g(J,null,ie(k,S=>e("div",{key:S.key,class:"menu-row",onClick:_e(te=>K(S.key),["stop"])},[l(u,{"model-value":c.value?.align[S.key]??!1},null,8,["model-value"]),e("span",null,p(S.label),1)],8,gl)),64))]),_:1})]),default:o(()=>[l(i,{size:"small",loading:v.align},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(vt))]),_:1}),t[2]||(t[2]=e("span",{class:"btn-label"},"对齐",-1)),l(m,{class:"caret"},{default:o(()=>[l(Z(Ve))]),_:1})]),_:1},8,["loading"])]),_:1}),l(B,{trigger:"click","hide-on-click":!1,placement:"top-start"},{dropdown:o(()=>[l(O,{class:"toolbar-menu"},{default:o(()=>[(d(),g(J,null,ie(f,S=>e("div",{key:S.key,class:"menu-row",onClick:_e(te=>X(S.key),["stop"])},[l(u,{"model-value":c.value?.select[S.key]??!1},null,8,["model-value"]),e("span",null,p(S.label),1)],8,hl)),64))]),_:1})]),default:o(()=>[l(i,{size:"small",loading:v.select},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(pt))]),_:1}),t[3]||(t[3]=e("span",{class:"btn-label"},"选择",-1)),l(m,{class:"caret"},{default:o(()=>[l(Z(Ve))]),_:1})]),_:1},8,["loading"])]),_:1}),l(B,{trigger:"click",placement:"top-start"},{dropdown:o(()=>[l(O,{class:"toolbar-menu"},{default:o(()=>[l(le,{onClick:Q},{default:o(()=>[...t[5]||(t[5]=[W("寻路",-1)])]),_:1})]),_:1})]),default:o(()=>[l(i,{size:"small"},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(_t))]),_:1}),t[4]||(t[4]=e("span",{class:"btn-label"},"右击功能",-1)),l(m,{class:"caret"},{default:o(()=>[l(Z(Ve))]),_:1})]),_:1})]),_:1}),t[14]||(t[14]=e("span",{class:"separator"},null,-1)),l(B,{trigger:"click","hide-on-click":!1,placement:"top-start"},{dropdown:o(()=>[l(O,{class:"toolbar-menu layer-menu"},{default:o(()=>[!c.value||c.value.layers.length===0?(d(),g("div",kl,"(无图层)")):(d(!0),g(J,{key:1},ie(c.value.layers,S=>(d(),g("div",{key:S.name,class:"menu-row",onClick:_e(te=>h(S.name,!S.visible),["stop"])},[l(u,{"model-value":S.visible},null,8,["model-value"]),e("span",null,"图层 "+p(S.name),1)],8,bl))),128))]),_:1})]),default:o(()=>[l(i,{size:"small",loading:v.layer},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(gt))]),_:1}),t[6]||(t[6]=e("span",{class:"btn-label"},"显示图层",-1)),l(m,{class:"caret"},{default:o(()=>[l(Z(Ve))]),_:1})]),_:1},8,["loading"])]),_:1}),l(B,{trigger:"click","hide-on-click":!1,placement:"top-start"},{dropdown:o(()=>[l(O,{class:"toolbar-menu"},{default:o(()=>[(d(),g(J,null,ie(I,S=>e("div",{key:S.key,class:"menu-row",onClick:_e(te=>A(S.key),["stop"])},[l(u,{"model-value":c.value?.display[S.key]??!1},null,8,["model-value"]),e("span",null,p(S.label),1)],8,wl)),64))]),_:1})]),default:o(()=>[l(i,{size:"small",loading:v.display},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(ht))]),_:1}),t[7]||(t[7]=e("span",{class:"btn-label"},"显示内容",-1)),l(m,{class:"caret"},{default:o(()=>[l(Z(Ve))]),_:1})]),_:1},8,["loading"])]),_:1}),t[15]||(t[15]=e("span",{class:"separator"},null,-1)),l(i,{size:"small",type:c.value?.recording.isRecording?"danger":"default",loading:v.recording,onClick:q},{default:o(()=>[c.value?.recording.isRecording?(d(),ue(m,{key:0},{default:o(()=>[l(Z(kt))]),_:1})):(d(),ue(m,{key:1},{default:o(()=>[l(Z(bt))]),_:1})),e("span",$l,p(j.value),1)]),_:1},8,["type","loading"]),l(i,{size:"small",type:c.value?.recording.isPlaying?"warning":"default",loading:v.playback,onClick:Y},{default:o(()=>[c.value?.recording.isPlaying?(d(),ue(m,{key:0},{default:o(()=>[l(Z(wt))]),_:1})):(d(),ue(m,{key:1},{default:o(()=>[l(Z($t))]),_:1})),e("span",Sl,p(c.value?.recording.isPlaying?"退出回放":"回放"),1)]),_:1},8,["type","loading"]),l(i,{size:"small",onClick:ee},{default:o(()=>[l(m,null,{default:o(()=>[l(Z(St))]),_:1}),t[8]||(t[8]=e("span",{class:"btn-label"},"录像管理",-1))]),_:1}),l(fe,{modelValue:L.value,"onUpdate:modelValue":t[0]||(t[0]=S=>L.value=S),title:"选择录像回放",width:"640px","append-to-body":"","destroy-on-close":""},{default:o(()=>[!c.value||c.value.recording.entries.length===0?(d(),ue(E,{key:0,description:"(无可用录像。点 ● 录制 创建首份录像。)"})):(d(),ue(Ie,{key:1,data:c.value.recording.entries,size:"small",stripe:""},{default:o(()=>[l(N,{prop:"fileName",label:"文件名","min-width":"180"}),l(N,{label:"大小",width:"90"},{default:o(({row:S})=>[W(p(ce(S.fileSizeBytes)),1)]),_:1}),l(N,{prop:"frameCount",label:"帧",width:"70"}),l(N,{label:"时长",width:"100"},{default:o(({row:S})=>[W(p(F(S.durationMs)),1)]),_:1}),l(N,{label:"时间",width:"160"},{default:o(({row:S})=>[W(p(U(S.fileWriteTime)),1)]),_:1}),l(N,{label:"操作",width:"100",fixed:"right"},{default:o(({row:S})=>[l(i,{link:"",type:"primary",disabled:!S.headerReadable,onClick:te=>R(S.fileName)},{default:o(()=>[...t[9]||(t[9]=[W("回放",-1)])]),_:1},8,["disabled","onClick"])]),_:1})]),_:1},8,["data"]))]),_:1},8,["modelValue"]),l(fe,{modelValue:$.value,"onUpdate:modelValue":t[1]||(t[1]=S=>$.value=S),title:"录像管理",width:"780px","append-to-body":"","destroy-on-close":""},{default:o(()=>[e("p",Cl,"目录:"+p(c.value?.recording.recordingsDirectory??"—"),1),!c.value||c.value.recording.entries.length===0?(d(),ue(E,{key:0,description:"(无可用录像。)"})):(d(),ue(Ie,{key:1,data:c.value.recording.entries,size:"small",stripe:""},{default:o(()=>[l(N,{prop:"fileName",label:"文件名","min-width":"200"}),l(N,{label:"大小",width:"90"},{default:o(({row:S})=>[W(p(ce(S.fileSizeBytes)),1)]),_:1}),l(N,{prop:"frameCount",label:"帧",width:"70"}),l(N,{label:"时长",width:"100"},{default:o(({row:S})=>[W(p(F(S.durationMs)),1)]),_:1}),l(N,{label:"时间",width:"160"},{default:o(({row:S})=>[W(p(U(S.fileWriteTime)),1)]),_:1}),l(N,{label:"状态",width:"120"},{default:o(({row:S})=>[S.headerReadable?(d(),ue(ge,{key:0,type:"success",size:"small"},{default:o(()=>[...t[10]||(t[10]=[W("完整",-1)])]),_:1})):(d(),ue(Ne,{key:1,content:S.error,placement:"top"},{default:o(()=>[l(ge,{type:"danger",size:"small"},{default:o(()=>[...t[11]||(t[11]=[W("头部不可读",-1)])]),_:1})]),_:1},8,["content"]))]),_:1}),l(N,{label:"操作",width:"160",fixed:"right"},{default:o(({row:S})=>[l(i,{link:"",type:"primary",disabled:!S.headerReadable,onClick:te=>R(S.fileName)},{default:o(()=>[...t[12]||(t[12]=[W("回放",-1)])]),_:1},8,["disabled","onClick"]),l(i,{link:"",type:"danger",onClick:te=>D(S.fileName)},{default:o(()=>[...t[13]||(t[13]=[W("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"]))]),_:1},8,["modelValue"])])}}}),Nl=Ce(Il,[["__scopeId","data-v-8e85cbc4"]]),xl={class:"map-monitor-page"},Tl={class:"muted"},Ll={class:"canvas-with-alarms"},El={class:"workbench-header"},Vl=Se({__name:"MapMonitorView",props:{readOnly:{type:Boolean}},setup(r){const k=nt(),f="localhost:8223",I=C([]),c=C([]),v=C([]),L=C({includeFinished:!0,includeAborted:!0}),$=C(null),V=C(0),j=C(!1),z=C("vehicle"),K=C(null),X=C(null),A=C([]);async function h(a){const w=Number(a.carId);if(!Number.isFinite(w)){P.warning(`报警车辆 id 无法解析:${a.carId}`);return}try{await de.setSelection("car",w),$.value={kind:"vehicle",id:String(w),name:a.carName??String(a.carId)}}catch(T){P.error(`定位失败:${T.message}`)}}function Q(a){}let q=null;const Y=M(()=>I.value.filter(a=>a.state!=="offline").length),R=M(()=>v.value.length>0?v.value.filter(a=>a.statusCode==="Fetching"||a.statusCode==="Putting").length:c.value.filter(a=>a.status==="running").length),D=M(()=>v.value.length>0?v.value.filter(a=>a.statusCode==="Waiting").length:c.value.filter(a=>a.status==="queued").length),ee=M(()=>{if(!$.value||$.value.kind!=="vehicle")return null;const a=$.value;return I.value.find(T=>T.id===a.id||te(T)===a.id)?.id??null});function ce(a){}const F=/^(?:UI)?(?:Car|Vehicle)-(\d+)$/i,U=/^UISite-(\d+)$/i,_=/^(?:UITrack|UICircularArcTrack|UIBezierTrack|UINurbsTrack)-(\d+)$/i;function t(a){const w=F.exec(a);if(w)return{kind:"vehicle",id:w[1]};const T=U.exec(a);if(T)return{kind:"site",id:T[1]};const G=_.exec(a);if(G)return{kind:"track",id:G[1]};const oe=/^UI([A-Za-z]+)-(\d+)$/.exec(a)??/^([A-Za-z]+)-(\d+)$/.exec(a);if(!oe)return null;const se=oe[1].toLowerCase(),ae=oe[2];return se==="site"?{kind:"site",id:ae}:se==="car"||se==="vehicle"?{kind:"vehicle",id:ae}:se.includes("track")?{kind:"track",id:ae}:null}function m(a,w){return!a&&!w?!0:!a||!w?!1:a.kind===w.kind&&a.id===w.id}function i(a,w){K.value=null;let T;if(a.kind==="vehicle"){const G=(w?Ne(w):void 0)??I.value.find(oe=>te(oe)===a.id);T=G?{kind:"vehicle",id:te(G),name:G.name}:{kind:"vehicle",id:a.id,name:`Vehicle ${a.id}`}}else T={kind:a.kind,id:a.id,name:w||`${a.kind==="site"?"Site":"Track"} ${a.id}`};m($.value,T)||($.value=T,V.value++)}function u(a,w,T){if(K.value=null,a==="car"){const ae=String(w),he=T?.find($e=>F.test($e))??`Car-${w}`,we=Ne(he)??I.value.find($e=>te($e)===ae||$e.id===ae),Te=we?{kind:"vehicle",id:te(we),name:we.name}:{kind:"vehicle",id:ae,name:`Vehicle ${ae}`};m($.value,Te)||($.value=Te,V.value++);return}const G=String(w),oe=T?.find(ae=>{const he=t(ae);return he?.kind===a&&he.id===G}),se={kind:a,id:G,name:oe||`${a==="site"?"Site":"Track"} ${G}`};m($.value,se)||($.value=se,V.value++)}function O(a){const w=a.siteIds?.length??0,T=a.trackIds?.length??0,G=a.carIds?.length??0,oe=Array.isArray(a.names)?a.names.length:0;if(w+T+G+oe===0){$.value=null,V.value++;return}if(Array.isArray(a.names))for(const se of a.names){const ae=t(se);if(ae){i(ae,se);return}}if(a.kind&&a.id){u(a.kind,a.id,a.names);return}if(w>0){u("site",a.siteIds[0],a.names);return}if(T>0){u("track",a.trackIds[0],a.names);return}G>0&&u("car",a.carIds[0],a.names)}function B(a){if(!a.length){E();return}for(const w of a){const T=t(w);if(T){i(T,w);return}}E()}function le(){E()}async function E(){try{const a=await de.getSelection();if(!a?.kind||a.id==null||a.kind!=="car"&&a.kind!=="site"&&a.kind!=="track")return;u(a.kind,Number(a.id),a.name?[a.name]:void 0)}catch{}}async function N(a){K.value=null,m($.value,a)||($.value=a,V.value++);const w=Number(a.id);if(Number.isFinite(w))try{await de.setSelection("car",w)}catch(T){P.error(`同步 3D 选中失败:${T.message}`)}}async function Ie(a){if(K.value=a.id,a.carId!=null){const w=I.value.find(T=>T.rawId===a.carId||te(T)===String(a.carId));if(w){await N({kind:"vehicle",id:te(w),name:w.name});return}try{await de.setSelection("car",a.carId),$.value={kind:"vehicle",id:String(a.carId),name:a.carName??`Vehicle ${a.carId}`},V.value++}catch(T){P.error(`同步 3D 选中失败:${T.message}`)}return}$.value={kind:"delivery",id:String(a.id),name:`${a.srcLabel}${a.dstLabel}`},V.value++}function fe(a){L.value=a,ge()}async function ge(){try{v.value=await mn(L.value)}catch(a){console.warn("[MapMonitor] refreshDeliveries failed",a),v.value=[]}}function Ne(a){const w=S(a);return I.value.find(T=>T.name===a||T.id===a||w!=null&&te(T)===w)}function S(a){return/^(?:UI)?(?:Car|Vehicle)-(\d+)$/i.exec(a)?.[1]??null}function te(a){return a.rawId!=null?String(a.rawId):a.id.replace(/^C/i,"").replace(/^0+/,"")||a.id}async function xe(){j.value=!0;try{const[a,w]=await Promise.all([zt(),Rt()]);I.value=a,c.value=w,await ge()}catch(a){console.warn("[MapMonitor] refreshAll failed",a)}finally{V.value++,j.value=!1}}const Ee=Ft({autoConnect:!0});function ne(a){if(a?.kind)switch(a.kind){case"alarm":{const w=a.payload;if(!w)return;A.value=[w,...A.value.filter(T=>T.carId!==w.carId)].slice(0,30);break}case"car-state":case"mission-status":xe();break;case"selection-detail":a.payload&&typeof a.payload=="object"&&O(a.payload);break;case"monitor-config-updated":V.value++;break}}return Ee.on(ne),je(async()=>{await xe(),q=setInterval(()=>{!Ee.connected.value||I.value.length===0?xe():z.value==="mission"&&ge()},3e3)}),Ye(()=>{q&&clearInterval(q),Ee.off(ne)}),(a,w)=>{const T=Lt,G=Tt,oe=xt,se=At,ae=Vt,he=Ae,we=Et;return d(),g("div",xl,[l(oe,{gutter:12,class:"kpi-row"},{default:o(()=>[l(G,{span:8},{default:o(()=>[l(T,{title:"在线车辆",value:Y.value},{suffix:o(()=>[e("span",Tl,"/ "+p(I.value.length),1)]),_:1},8,["value"])]),_:1}),l(G,{span:8},{default:o(()=>[l(T,{title:"运行中任务",value:R.value},null,8,["value"])]),_:1}),l(G,{span:8},{default:o(()=>[l(T,{title:"排队任务",value:D.value},null,8,["value"])]),_:1})]),_:1}),l(oe,{gutter:12,class:"main-row"},{default:o(()=>[l(G,{span:16},{default:o(()=>[e("div",Ll,[l(Mt,{ref_key:"workspaceRef",ref:X,host:Z(f),scope:Z(k).scope??"Platform",token:Z(k).token??"","read-only":!!r.readOnly,"embed-ui":!0,onPick:ce,onSelect:B,onReady:le},null,8,["host","scope","token","read-only"]),l(vl,{alarms:A.value,onLocate:h,onAck:Q},null,8,["alarms"]),l(Nl)])]),_:1}),l(G,{span:8,class:"side-col"},{default:o(()=>[l(we,{shadow:"never",class:"side-card workbench-card"},{header:o(()=>[e("div",El,[l(ae,{modelValue:z.value,"onUpdate:modelValue":w[0]||(w[0]=Te=>z.value=Te),class:"workbench-tabs"},{default:o(()=>[l(se,{label:"车辆监控台",name:"vehicle"}),l(se,{label:"任务列表",name:"mission"})]),_:1},8,["modelValue"]),l(he,{link:"",type:"primary",size:"small",loading:j.value,onClick:xe},{default:o(()=>[...w[1]||(w[1]=[W(" 刷新 ",-1)])]),_:1},8,["loading"])])]),default:o(()=>[Fe(l(vn,{cars:I.value,missions:c.value,"selected-id":ee.value,onSelect:N},null,8,["cars","missions","selected-id"]),[[Be,z.value==="vehicle"]]),Fe(l(Tn,{deliveries:v.value,"selected-id":K.value,onSelect:Ie,onRefresh:fe,onActionDone:ge},null,8,["deliveries","selected-id"]),[[Be,z.value==="mission"]])]),_:1}),l(we,{shadow:"never",class:"side-card detail-card"},{header:o(()=>[...w[2]||(w[2]=[e("span",null,"选中信息",-1)])]),default:o(()=>[l(Qa,{selection:$.value,"refresh-key":V.value,cars:I.value,missions:c.value,"read-only":!!r.readOnly},null,8,["selection","refresh-key","cars","missions","read-only"])]),_:1})]),_:1})]),_:1})])}}}),is=Ce(Vl,[["__scopeId","data-v-4671e9a9"]]);export{is as default};