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