diff --git a/MiGu.Server/wwwroot/assets/AnnotationView-W73nG5X1.js b/MiGu.Server/wwwroot/assets/AnnotationView-DixiuHnc.js similarity index 98% rename from MiGu.Server/wwwroot/assets/AnnotationView-W73nG5X1.js rename to MiGu.Server/wwwroot/assets/AnnotationView-DixiuHnc.js index 1e06849..a618e66 100644 --- a/MiGu.Server/wwwroot/assets/AnnotationView-W73nG5X1.js +++ b/MiGu.Server/wwwroot/assets/AnnotationView-DixiuHnc.js @@ -1 +1 @@ -import{aI as S,bv as N,aC as f,bJ as a,t as B,b9 as p,aH as e,N as z,bL as O,O as T,R as A,a4 as M,aE as U,ai as D,bj as F,Z as I,r as L,bt as b,aG as d,H as G,aa as H,ab as j,ad as q,bq as J,aB as c,bg as R,bh as X,X as g}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const Z={style:{display:"flex","align-items":"center",gap:"8px"}},pe=S({__name:"AnnotationView",setup($){const s=N(),l=R({title:"",target:"",level:"info",content:""}),m=X([{id:"N001",ts:"2026-05-19 10:25",author:"ops",target:"C05",level:"warn",title:"AGV-005 故障观察",content:"出库点附近频繁停顿,怀疑激光被遮挡"}]);function w(r){return r==="error"?"danger":r==="warn"?"warning":"info"}function v(){if(!l.title){g.warning("请填写标题");return}const r=`N${String(m.value.length+1).padStart(3,"0")}`;m.value.unshift({id:r,ts:new Date().toLocaleString("zh-CN"),author:s.user?.username??"mock",target:l.target,level:l.level,title:l.title,content:l.content}),g.success("已记录(Mock,未写入数据库)"),l.title="",l.content="",l.target=""}return(r,t)=>{const u=q,_=A,i=T,V=I,y=M,E=L,h=z,x=G,n=j,k=H,C=B;return p(),f(C,{shadow:"never"},{header:a(()=>[c("div",Z,[t[7]||(t[7]=c("span",null,"运营备注(monitor.note.write · 写 platform.db.Annotations)",-1)),b(s).hasOp("monitor.note.write")?(p(),f(u,{key:0,size:"small",type:"success"},{default:a(()=>[...t[5]||(t[5]=[d("可写",-1)])]),_:1})):(p(),f(u,{key:1,size:"small",type:"danger"},{default:a(()=>[...t[6]||(t[6]=[d("只读",-1)])]),_:1}))])]),default:a(()=>[e(h,{inline:"",onSubmit:t[3]||(t[3]=O(()=>{},["prevent"]))},{default:a(()=>[e(i,{label:"标题"},{default:a(()=>[e(_,{modelValue:l.title,"onUpdate:modelValue":t[0]||(t[0]=o=>l.title=o),style:{width:"240px"}},null,8,["modelValue"])]),_:1}),e(i,{label:"关联目标"},{default:a(()=>[e(_,{modelValue:l.target,"onUpdate:modelValue":t[1]||(t[1]=o=>l.target=o),placeholder:"例如 C01 / M02 / S006",style:{width:"200px"}},null,8,["modelValue"])]),_:1}),e(i,{label:"层级"},{default:a(()=>[e(y,{modelValue:l.level,"onUpdate:modelValue":t[2]||(t[2]=o=>l.level=o),style:{width:"120px"}},{default:a(()=>[(p(),U(D,null,F(["info","warn","error"],o=>e(V,{key:o,label:o,value:o},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),e(i,null,{default:a(()=>[e(E,{type:"primary",disabled:!b(s).hasOp("monitor.note.write"),onClick:v},{default:a(()=>[...t[8]||(t[8]=[d("提交",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1}),e(_,{modelValue:l.content,"onUpdate:modelValue":t[4]||(t[4]=o=>l.content=o),type:"textarea",rows:4,placeholder:"描述备注内容...",disabled:!b(s).hasOp("monitor.note.write")},null,8,["modelValue","disabled"]),e(x),e(k,{data:m.value,size:"small","max-height":"400"},{default:a(()=>[e(n,{prop:"ts",label:"时间",width:"180"}),e(n,{prop:"author",label:"作者",width:"100"}),e(n,{prop:"target",label:"目标",width:"100"}),e(n,{prop:"level",label:"层级",width:"80"},{default:a(o=>[e(u,{size:"small",type:w(o.row.level)},{default:a(()=>[d(J(o.row.level),1)]),_:2},1032,["type"])]),_:1}),e(n,{prop:"title",label:"标题"}),e(n,{prop:"content",label:"内容"})]),_:1},8,["data"])]),_:1})}}});export{pe as default}; +import{aI as S,bv as N,aC as f,bJ as a,t as B,b9 as p,aH as e,N as z,bL as O,O as T,R as A,a4 as M,aE as U,ai as D,bj as F,Z as I,r as L,bt as b,aG as d,H as G,aa as H,ab as j,ad as q,bq as J,aB as c,bg as R,bh as X,X as g}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const Z={style:{display:"flex","align-items":"center",gap:"8px"}},pe=S({__name:"AnnotationView",setup($){const s=N(),l=R({title:"",target:"",level:"info",content:""}),m=X([{id:"N001",ts:"2026-05-19 10:25",author:"ops",target:"C05",level:"warn",title:"AGV-005 故障观察",content:"出库点附近频繁停顿,怀疑激光被遮挡"}]);function w(r){return r==="error"?"danger":r==="warn"?"warning":"info"}function v(){if(!l.title){g.warning("请填写标题");return}const r=`N${String(m.value.length+1).padStart(3,"0")}`;m.value.unshift({id:r,ts:new Date().toLocaleString("zh-CN"),author:s.user?.username??"mock",target:l.target,level:l.level,title:l.title,content:l.content}),g.success("已记录(Mock,未写入数据库)"),l.title="",l.content="",l.target=""}return(r,t)=>{const u=q,_=A,i=T,V=I,y=M,E=L,h=z,x=G,n=j,k=H,C=B;return p(),f(C,{shadow:"never"},{header:a(()=>[c("div",Z,[t[7]||(t[7]=c("span",null,"运营备注(monitor.note.write · 写 platform.db.Annotations)",-1)),b(s).hasOp("monitor.note.write")?(p(),f(u,{key:0,size:"small",type:"success"},{default:a(()=>[...t[5]||(t[5]=[d("可写",-1)])]),_:1})):(p(),f(u,{key:1,size:"small",type:"danger"},{default:a(()=>[...t[6]||(t[6]=[d("只读",-1)])]),_:1}))])]),default:a(()=>[e(h,{inline:"",onSubmit:t[3]||(t[3]=O(()=>{},["prevent"]))},{default:a(()=>[e(i,{label:"标题"},{default:a(()=>[e(_,{modelValue:l.title,"onUpdate:modelValue":t[0]||(t[0]=o=>l.title=o),style:{width:"240px"}},null,8,["modelValue"])]),_:1}),e(i,{label:"关联目标"},{default:a(()=>[e(_,{modelValue:l.target,"onUpdate:modelValue":t[1]||(t[1]=o=>l.target=o),placeholder:"例如 C01 / M02 / S006",style:{width:"200px"}},null,8,["modelValue"])]),_:1}),e(i,{label:"层级"},{default:a(()=>[e(y,{modelValue:l.level,"onUpdate:modelValue":t[2]||(t[2]=o=>l.level=o),style:{width:"120px"}},{default:a(()=>[(p(),U(D,null,F(["info","warn","error"],o=>e(V,{key:o,label:o,value:o},null,8,["label","value"])),64))]),_:1},8,["modelValue"])]),_:1}),e(i,null,{default:a(()=>[e(E,{type:"primary",disabled:!b(s).hasOp("monitor.note.write"),onClick:v},{default:a(()=>[...t[8]||(t[8]=[d("提交",-1)])]),_:1},8,["disabled"])]),_:1})]),_:1}),e(_,{modelValue:l.content,"onUpdate:modelValue":t[4]||(t[4]=o=>l.content=o),type:"textarea",rows:4,placeholder:"描述备注内容...",disabled:!b(s).hasOp("monitor.note.write")},null,8,["modelValue","disabled"]),e(x),e(k,{data:m.value,size:"small","max-height":"400"},{default:a(()=>[e(n,{prop:"ts",label:"时间",width:"180"}),e(n,{prop:"author",label:"作者",width:"100"}),e(n,{prop:"target",label:"目标",width:"100"}),e(n,{prop:"level",label:"层级",width:"80"},{default:a(o=>[e(u,{size:"small",type:w(o.row.level)},{default:a(()=>[d(J(o.row.level),1)]),_:2},1032,["type"])]),_:1}),e(n,{prop:"title",label:"标题"}),e(n,{prop:"content",label:"内容"})]),_:1},8,["data"])]),_:1})}}});export{pe as default}; diff --git a/MiGu.Server/wwwroot/assets/AppShell-BqTC0xJK.js b/MiGu.Server/wwwroot/assets/AppShell-CAX-HJ2b.js similarity index 99% rename from MiGu.Server/wwwroot/assets/AppShell-BqTC0xJK.js rename to MiGu.Server/wwwroot/assets/AppShell-CAX-HJ2b.js index bafa4fb..5c35eef 100644 --- a/MiGu.Server/wwwroot/assets/AppShell-BqTC0xJK.js +++ b/MiGu.Server/wwwroot/assets/AppShell-CAX-HJ2b.js @@ -1 +1 @@ -import{aI as A,bv as j,bx as G,b9 as o,aC as u,bJ as e,aH as t,a0 as me,aG as m,ax as f,a1 as ue,X as pe,by as q,aB as a,b4 as F,bq as i,bt as s,Q as H,ar as J,K,aE as y,ai as M,bj as N,J as Q,b3 as R,as as _e,aD as T,I as X,ak as Y,aF as be,A as fe,bw as he,bl as ge,m as ve,V as ke,a7 as ye,W as we,bm as D,P as Ee,aR as Ce,aN as xe,p as Me,q as Se,n as Ie,U as Pe,M as Te,aT as $e,a$ as W,br as De,b5 as O,bo as Ne,b0 as Re,bC as Ae,be as ze}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";import{_ as Be}from"./FRLD-logo-white-no_title-BE78iS6n.js";/* empty css */const Le="/FRLD-logo-white.png",Ue=A({__name:"ScopeSwitcher",setup(z){const r=j(),w=G(),l=f(()=>r.scope??"Platform");let c=!1;async function v(_){if(!c){c=!0;try{await E(_)}finally{c=!1}}}async function E(_){try{await r.switchScope(_),w.push(_==="Platform"?"/admin/map-monitor":"/monitor/map")}catch(b){pe.error(b?.message??`切换到 ${_} 失败`)}}return(_,b)=>{const C=me,S=ue;return o(),u(S,{"model-value":l.value,size:"small",onChange:v},{default:e(()=>[t(C,{value:"Platform"},{default:e(()=>[...b[0]||(b[0]=[m("管理员",-1)])]),_:1}),t(C,{value:"RCSMonitor"},{default:e(()=>[...b[1]||(b[1]=[m("运营",-1)])]),_:1})]),_:1},8,["model-value"])}}}),Ve=["title"],Fe={class:"theme-label"},We={class:"option-text"},Oe={class:"option-name"},je={class:"option-desc"},Ge=A({__name:"ThemeSwitcher",setup(z){const r=q(),w=f(()=>({background:`linear-gradient(135deg, ${r.activeTheme.preview} 0%, ${r.activeTheme.previewAccent} 100%)`}));function l(v){const E=r.getMergedTheme(v);return{background:`linear-gradient(135deg, ${E.preview} 0%, ${E.previewAccent} 100%)`}}function c(v){r.setThemeId(v)}return(v,E)=>{const _=H,b=Q,C=K,S=X;return o(),u(S,{trigger:"click",onCommand:c},{dropdown:e(()=>[t(C,{class:"theme-menu"},{default:e(()=>[(o(!0),y(M,null,N(s(r).availableThemes,h=>(o(),u(b,{key:h.id,command:h.id,class:R({"is-active":h.id===s(r).themeId})},{default:e(()=>[a("span",{class:"option-swatch",style:F(l(h))},null,4),a("span",We,[a("span",Oe,i(h.name),1),a("span",je,i(h.description),1)]),h.id===s(r).themeId?(o(),u(_,{key:0,class:"check"},{default:e(()=>[t(s(_e))]),_:1})):T("",!0)]),_:2},1032,["command","class"]))),128))]),_:1})]),default:e(()=>[a("button",{class:"theme-trigger",type:"button",title:`当前主题:${s(r).activeTheme.name}`},[a("span",{class:"swatch",style:F(w.value)},null,4),a("span",Fe,i(s(r).activeTheme.name),1),t(_,{class:"caret"},{default:e(()=>[t(s(J))]),_:1})],8,Ve)]),_:1})}}}),qe=Y(Ge,[["__scopeId","data-v-28ea4aeb"]]),He={class:"app-shell"},Je={class:"aside-footer"},Ke={key:0},Qe={class:"header-left"},Xe={class:"header-right"},Ye={class:"user-link"},Ze={class:"user-name"},ea=A({__name:"AppShell",setup(z){const r=he(),w=G(),l=j(),c=q(),v=f(()=>"localhost:8223".split(":")[1]??"8223"),E=f(()=>"/api"),_=f(()=>(l.user?.displayName??l.user?.username??"?").slice(0,1).toUpperCase()),b=f(()=>l.scope==="Platform"?"管理员 (Platform)":"运营 (RCSMonitor)"),C=f(()=>{switch(l.runMode){case"WebOnly":return"Web-Only";case"WebEnabled":return"Web + Desktop";case"Detached":return"SimpleLite 未连接";default:return String(l.runMode??"Unknown")}}),S=[{path:"/admin/dashboard",label:"总览",icon:$e,key:"admin-dashboard"},{path:"/admin/map-monitor",label:"地图监控",icon:W,key:"admin-map-monitor"},{path:"/admin/design",label:"设计与编排",icon:De,children:[{path:"/admin/maps",label:"地图管理",key:"admin-maps"},{path:"/admin/map-editor",label:"地图编辑",key:"admin-map-editor"},{path:"/admin/project-properties",label:"项目属性",key:"admin-project-properties"},{path:"/admin/tracks",label:"场景管理",key:"admin-tracks"},{path:"/admin/cars",label:"车辆管理",key:"admin-cars"},{path:"/admin/processes",label:"进程管理",key:"admin-processes"},{path:"/admin/scripts",label:"脚本管理",key:"admin-scripts"},{path:"/admin/missions",label:"任务编排",key:"admin-missions"}]},{path:"/admin/playback",label:"调度回放",icon:O,key:"admin-playback"},{path:"/admin/config",label:"平台配置中心",icon:Ne,children:[{path:"/admin/config/system",label:"系统级配置",key:"admin-config-system"},{path:"/admin/config/integrations",label:"外部系统对接",key:"admin-config-integrations"},{path:"/admin/config/routing",label:"路径规划",key:"admin-config-routing"},{path:"/admin/config/vehicle-hub",label:"车辆运维",key:"admin-vehicle-hub"},{path:"/admin/config/charge",label:"充电策略",key:"admin-config-charge"},{path:"/admin/config/task",label:"任务分配",key:"admin-config-task"},{path:"/admin/config/traffic",label:"交通管制",key:"admin-config-traffic"},{path:"/admin/config/auth",label:"权限与角色",key:"admin-config-auth"},{path:"/admin/config/device",label:"设备接入",key:"admin-config-device"},{path:"/admin/config/scenario",label:"场景模板",key:"admin-config-scenario"},{path:"/admin/config/location",label:"库位管理",key:"admin-config-location"},{path:"/admin/config/ops",label:"运营维护",key:"admin-config-ops"},{path:"/admin/config/widget",label:"自定义控件",key:"admin-config-widget"}]}],h=[{path:"/monitor/dashboard",label:"运营总览",icon:Re,key:"monitor-dashboard"},{path:"/monitor/vehicle-hub",label:"车辆运维",icon:Ae,key:"monitor-vehicle-hub"},{path:"/monitor/map",label:"地图监控",icon:W,key:"monitor-map"},{path:"/monitor/ops",label:"运维操作",icon:ze,key:"monitor-ops"},{path:"/monitor/notes",label:"运营备注",icon:O,key:"monitor-notes"}];function Z(g){const n=[];for(const d of g)if(d.children){const x=d.children.filter(k=>!k.key||l.hasPage(k.key));x.length&&n.push({...d,children:x})}else(!d.key||l.hasPage(d.key))&&n.push(d);return n}const B=f(()=>Z(l.scope==="Platform"?S:h)),ee=f(()=>{const g=r.path,n=[],d=k=>{k.forEach(I=>{n.push(I),I.children&&d(I.children)})};return d(B.value),n.find(k=>k.path===g)?.path??g}),L=f(()=>r.meta.title??"");function ae(g){g==="logout"?(l.logout(),w.push("/login")):g==="status"?w.push("/status"):g==="wizard"&&w.push("/wizard")}return(g,n)=>{const d=H,x=we,k=ye,I=ke,te=ve,U=Se,ne=Me,oe=Ie,$=Q,se=K,le=X,ie=Ee,re=ge("router-view"),ce=Pe,de=Te,V=fe;return o(),y("div",He,[n[9]||(n[9]=be('',1)),t(V,{class:"app-container"},{default:e(()=>[t(te,{width:s(c).sidebarCollapsed?"76px":"240px",class:"aside"},{default:e(()=>[a("div",{class:R(["logo",{collapsed:s(c).sidebarCollapsed}])},[s(c).sidebarCollapsed?(o(),y(M,{key:0},[n[1]||(n[1]=a("img",{src:Be,alt:"FRLD",class:"logo-img-small"},null,-1)),n[2]||(n[2]=a("span",{class:"logo-abbr"},"迷毂",-1))],64)):(o(),y(M,{key:1},[n[3]||(n[3]=a("img",{src:Le,alt:"FRLD",class:"logo-img-full"},null,-1)),n[4]||(n[4]=a("div",{class:"logo-titles"},[a("span",{class:"logo-title-zh"},"迷 毂 · 智能调度平台"),a("span",{class:"logo-title-en"},[a("b",null,"M"),m("i "),a("b",null,"G"),m("u · "),a("b",null,"I"),m("ntelligent "),a("b",null,"D"),m("ispatch "),a("b",null,"P"),m("latform ")])],-1))],64))],2),t(I,{"default-active":ee.value,collapse:s(c).sidebarCollapsed,"collapse-transition":!1,"background-color":"transparent","text-color":"rgba(255, 255, 255, 0.72)","active-text-color":"#fff",router:"",class:"menu"},{default:e(()=>[(o(!0),y(M,null,N(B.value,p=>(o(),y(M,{key:p.path},[p.children?(o(),u(k,{key:0,index:p.path},{title:e(()=>[t(d,null,{default:e(()=>[(o(),u(D(p.icon)))]),_:2},1024),a("span",null,i(p.label),1)]),default:e(()=>[(o(!0),y(M,null,N(p.children,P=>(o(),u(x,{key:P.path,index:P.path},{default:e(()=>[a("span",null,i(P.label),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(o(),u(x,{key:1,index:p.path},{title:e(()=>[m(i(p.label),1)]),default:e(()=>[t(d,null,{default:e(()=>[(o(),u(D(p.icon)))]),_:2},1024)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse"]),a("div",Je,[n[5]||(n[5]=a("span",{class:"aside-footer-badge"},"v1.6",-1)),s(c).sidebarCollapsed?T("",!0):(o(),y("span",Ke,i(s(c).activeTheme.name)+" · "+i(s(c).activeTheme.preview),1))])]),_:1},8,["width"]),t(V,{class:"container-right"},{default:e(()=>[t(ie,{class:"header"},{default:e(()=>[a("div",Qe,[a("button",{class:"icon-btn",onClick:n[0]||(n[0]=p=>s(c).toggleSidebar()),title:"切换侧栏"},[t(d,{size:"18"},{default:e(()=>[s(c).sidebarCollapsed?(o(),u(s(xe),{key:1})):(o(),u(s(Ce),{key:0}))]),_:1})]),t(ne,{separator:"/"},{default:e(()=>[t(U,null,{default:e(()=>[m(i(b.value),1)]),_:1}),L.value?(o(),u(U,{key:0},{default:e(()=>[m(i(L.value),1)]),_:1})):T("",!0)]),_:1})]),a("div",Xe,[t(qe),t(Ue),a("span",{class:R(["runmode-tag",s(l).runMode])},i(C.value),3),t(le,{trigger:"click",onCommand:ae},{dropdown:e(()=>[t(se,null,{default:e(()=>[s(l).scope==="Platform"?(o(),u($,{key:0,command:"wizard"},{default:e(()=>[...n[6]||(n[6]=[m("配置向导",-1)])]),_:1})):T("",!0),t($,{command:"status"},{default:e(()=>[...n[7]||(n[7]=[m("服务状态",-1)])]),_:1}),t($,{command:"logout",divided:""},{default:e(()=>[...n[8]||(n[8]=[m("退出登录",-1)])]),_:1})]),_:1})]),default:e(()=>[a("span",Ye,[t(oe,{size:"small"},{default:e(()=>[m(i(_.value),1)]),_:1}),a("span",Ze,i(s(l).user?.displayName??"未登录"),1),t(d,null,{default:e(()=>[t(s(J))]),_:1})])]),_:1})])]),_:1}),t(ce,{class:"main mg-content"},{default:e(()=>[t(re,null,{default:e(({Component:p,route:P})=>[p?(o(),u(D(p),{key:P.fullPath,class:"route-page"})):T("",!0)]),_:1})]),_:1}),t(de,{class:"footer"},{default:e(()=>[a("span",null,i(b.value)+" · webVRender :"+i(v.value)+" · API "+i(E.value),1)]),_:1})]),_:1})]),_:1})])}}}),ma=Y(ea,[["__scopeId","data-v-94b7b35c"]]);export{ma as default}; +import{aI as A,bv as j,bx as G,b9 as o,aC as u,bJ as e,aH as t,a0 as me,aG as m,ax as f,a1 as ue,X as pe,by as q,aB as a,b4 as F,bq as i,bt as s,Q as H,ar as J,K,aE as y,ai as M,bj as N,J as Q,b3 as R,as as _e,aD as T,I as X,ak as Y,aF as be,A as fe,bw as he,bl as ge,m as ve,V as ke,a7 as ye,W as we,bm as D,P as Ee,aR as Ce,aN as xe,p as Me,q as Se,n as Ie,U as Pe,M as Te,aT as $e,a$ as W,br as De,b5 as O,bo as Ne,b0 as Re,bC as Ae,be as ze}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";import{_ as Be}from"./FRLD-logo-white-no_title-BE78iS6n.js";/* empty css */const Le="/FRLD-logo-white.png",Ue=A({__name:"ScopeSwitcher",setup(z){const r=j(),w=G(),l=f(()=>r.scope??"Platform");let c=!1;async function v(_){if(!c){c=!0;try{await E(_)}finally{c=!1}}}async function E(_){try{await r.switchScope(_),w.push(_==="Platform"?"/admin/map-monitor":"/monitor/map")}catch(b){pe.error(b?.message??`切换到 ${_} 失败`)}}return(_,b)=>{const C=me,S=ue;return o(),u(S,{"model-value":l.value,size:"small",onChange:v},{default:e(()=>[t(C,{value:"Platform"},{default:e(()=>[...b[0]||(b[0]=[m("管理员",-1)])]),_:1}),t(C,{value:"RCSMonitor"},{default:e(()=>[...b[1]||(b[1]=[m("运营",-1)])]),_:1})]),_:1},8,["model-value"])}}}),Ve=["title"],Fe={class:"theme-label"},We={class:"option-text"},Oe={class:"option-name"},je={class:"option-desc"},Ge=A({__name:"ThemeSwitcher",setup(z){const r=q(),w=f(()=>({background:`linear-gradient(135deg, ${r.activeTheme.preview} 0%, ${r.activeTheme.previewAccent} 100%)`}));function l(v){const E=r.getMergedTheme(v);return{background:`linear-gradient(135deg, ${E.preview} 0%, ${E.previewAccent} 100%)`}}function c(v){r.setThemeId(v)}return(v,E)=>{const _=H,b=Q,C=K,S=X;return o(),u(S,{trigger:"click",onCommand:c},{dropdown:e(()=>[t(C,{class:"theme-menu"},{default:e(()=>[(o(!0),y(M,null,N(s(r).availableThemes,h=>(o(),u(b,{key:h.id,command:h.id,class:R({"is-active":h.id===s(r).themeId})},{default:e(()=>[a("span",{class:"option-swatch",style:F(l(h))},null,4),a("span",We,[a("span",Oe,i(h.name),1),a("span",je,i(h.description),1)]),h.id===s(r).themeId?(o(),u(_,{key:0,class:"check"},{default:e(()=>[t(s(_e))]),_:1})):T("",!0)]),_:2},1032,["command","class"]))),128))]),_:1})]),default:e(()=>[a("button",{class:"theme-trigger",type:"button",title:`当前主题:${s(r).activeTheme.name}`},[a("span",{class:"swatch",style:F(w.value)},null,4),a("span",Fe,i(s(r).activeTheme.name),1),t(_,{class:"caret"},{default:e(()=>[t(s(J))]),_:1})],8,Ve)]),_:1})}}}),qe=Y(Ge,[["__scopeId","data-v-28ea4aeb"]]),He={class:"app-shell"},Je={class:"aside-footer"},Ke={key:0},Qe={class:"header-left"},Xe={class:"header-right"},Ye={class:"user-link"},Ze={class:"user-name"},ea=A({__name:"AppShell",setup(z){const r=he(),w=G(),l=j(),c=q(),v=f(()=>"localhost:8223".split(":")[1]??"8223"),E=f(()=>"/api"),_=f(()=>(l.user?.displayName??l.user?.username??"?").slice(0,1).toUpperCase()),b=f(()=>l.scope==="Platform"?"管理员 (Platform)":"运营 (RCSMonitor)"),C=f(()=>{switch(l.runMode){case"WebOnly":return"Web-Only";case"WebEnabled":return"Web + Desktop";case"Detached":return"SimpleLite 未连接";default:return String(l.runMode??"Unknown")}}),S=[{path:"/admin/dashboard",label:"总览",icon:$e,key:"admin-dashboard"},{path:"/admin/map-monitor",label:"地图监控",icon:W,key:"admin-map-monitor"},{path:"/admin/design",label:"设计与编排",icon:De,children:[{path:"/admin/maps",label:"地图管理",key:"admin-maps"},{path:"/admin/map-editor",label:"地图编辑",key:"admin-map-editor"},{path:"/admin/project-properties",label:"项目属性",key:"admin-project-properties"},{path:"/admin/tracks",label:"场景管理",key:"admin-tracks"},{path:"/admin/cars",label:"车辆管理",key:"admin-cars"},{path:"/admin/processes",label:"进程管理",key:"admin-processes"},{path:"/admin/scripts",label:"脚本管理",key:"admin-scripts"},{path:"/admin/missions",label:"任务编排",key:"admin-missions"}]},{path:"/admin/playback",label:"调度回放",icon:O,key:"admin-playback"},{path:"/admin/config",label:"平台配置中心",icon:Ne,children:[{path:"/admin/config/system",label:"系统级配置",key:"admin-config-system"},{path:"/admin/config/integrations",label:"外部系统对接",key:"admin-config-integrations"},{path:"/admin/config/routing",label:"路径规划",key:"admin-config-routing"},{path:"/admin/config/vehicle-hub",label:"车辆运维",key:"admin-vehicle-hub"},{path:"/admin/config/charge",label:"充电策略",key:"admin-config-charge"},{path:"/admin/config/task",label:"任务分配",key:"admin-config-task"},{path:"/admin/config/traffic",label:"交通管制",key:"admin-config-traffic"},{path:"/admin/config/auth",label:"权限与角色",key:"admin-config-auth"},{path:"/admin/config/device",label:"设备接入",key:"admin-config-device"},{path:"/admin/config/scenario",label:"场景模板",key:"admin-config-scenario"},{path:"/admin/config/location",label:"库位管理",key:"admin-config-location"},{path:"/admin/config/ops",label:"运营维护",key:"admin-config-ops"},{path:"/admin/config/widget",label:"自定义控件",key:"admin-config-widget"}]}],h=[{path:"/monitor/dashboard",label:"运营总览",icon:Re,key:"monitor-dashboard"},{path:"/monitor/vehicle-hub",label:"车辆运维",icon:Ae,key:"monitor-vehicle-hub"},{path:"/monitor/map",label:"地图监控",icon:W,key:"monitor-map"},{path:"/monitor/ops",label:"运维操作",icon:ze,key:"monitor-ops"},{path:"/monitor/notes",label:"运营备注",icon:O,key:"monitor-notes"}];function Z(g){const n=[];for(const d of g)if(d.children){const x=d.children.filter(k=>!k.key||l.hasPage(k.key));x.length&&n.push({...d,children:x})}else(!d.key||l.hasPage(d.key))&&n.push(d);return n}const B=f(()=>Z(l.scope==="Platform"?S:h)),ee=f(()=>{const g=r.path,n=[],d=k=>{k.forEach(I=>{n.push(I),I.children&&d(I.children)})};return d(B.value),n.find(k=>k.path===g)?.path??g}),L=f(()=>r.meta.title??"");function ae(g){g==="logout"?(l.logout(),w.push("/login")):g==="status"?w.push("/status"):g==="wizard"&&w.push("/wizard")}return(g,n)=>{const d=H,x=we,k=ye,I=ke,te=ve,U=Se,ne=Me,oe=Ie,$=Q,se=K,le=X,ie=Ee,re=ge("router-view"),ce=Pe,de=Te,V=fe;return o(),y("div",He,[n[9]||(n[9]=be('',1)),t(V,{class:"app-container"},{default:e(()=>[t(te,{width:s(c).sidebarCollapsed?"76px":"240px",class:"aside"},{default:e(()=>[a("div",{class:R(["logo",{collapsed:s(c).sidebarCollapsed}])},[s(c).sidebarCollapsed?(o(),y(M,{key:0},[n[1]||(n[1]=a("img",{src:Be,alt:"FRLD",class:"logo-img-small"},null,-1)),n[2]||(n[2]=a("span",{class:"logo-abbr"},"迷毂",-1))],64)):(o(),y(M,{key:1},[n[3]||(n[3]=a("img",{src:Le,alt:"FRLD",class:"logo-img-full"},null,-1)),n[4]||(n[4]=a("div",{class:"logo-titles"},[a("span",{class:"logo-title-zh"},"迷 毂 · 智能调度平台"),a("span",{class:"logo-title-en"},[a("b",null,"M"),m("i "),a("b",null,"G"),m("u · "),a("b",null,"I"),m("ntelligent "),a("b",null,"D"),m("ispatch "),a("b",null,"P"),m("latform ")])],-1))],64))],2),t(I,{"default-active":ee.value,collapse:s(c).sidebarCollapsed,"collapse-transition":!1,"background-color":"transparent","text-color":"rgba(255, 255, 255, 0.72)","active-text-color":"#fff",router:"",class:"menu"},{default:e(()=>[(o(!0),y(M,null,N(B.value,p=>(o(),y(M,{key:p.path},[p.children?(o(),u(k,{key:0,index:p.path},{title:e(()=>[t(d,null,{default:e(()=>[(o(),u(D(p.icon)))]),_:2},1024),a("span",null,i(p.label),1)]),default:e(()=>[(o(!0),y(M,null,N(p.children,P=>(o(),u(x,{key:P.path,index:P.path},{default:e(()=>[a("span",null,i(P.label),1)]),_:2},1032,["index"]))),128))]),_:2},1032,["index"])):(o(),u(x,{key:1,index:p.path},{title:e(()=>[m(i(p.label),1)]),default:e(()=>[t(d,null,{default:e(()=>[(o(),u(D(p.icon)))]),_:2},1024)]),_:2},1032,["index"]))],64))),128))]),_:1},8,["default-active","collapse"]),a("div",Je,[n[5]||(n[5]=a("span",{class:"aside-footer-badge"},"v1.6",-1)),s(c).sidebarCollapsed?T("",!0):(o(),y("span",Ke,i(s(c).activeTheme.name)+" · "+i(s(c).activeTheme.preview),1))])]),_:1},8,["width"]),t(V,{class:"container-right"},{default:e(()=>[t(ie,{class:"header"},{default:e(()=>[a("div",Qe,[a("button",{class:"icon-btn",onClick:n[0]||(n[0]=p=>s(c).toggleSidebar()),title:"切换侧栏"},[t(d,{size:"18"},{default:e(()=>[s(c).sidebarCollapsed?(o(),u(s(xe),{key:1})):(o(),u(s(Ce),{key:0}))]),_:1})]),t(ne,{separator:"/"},{default:e(()=>[t(U,null,{default:e(()=>[m(i(b.value),1)]),_:1}),L.value?(o(),u(U,{key:0},{default:e(()=>[m(i(L.value),1)]),_:1})):T("",!0)]),_:1})]),a("div",Xe,[t(qe),t(Ue),a("span",{class:R(["runmode-tag",s(l).runMode])},i(C.value),3),t(le,{trigger:"click",onCommand:ae},{dropdown:e(()=>[t(se,null,{default:e(()=>[s(l).scope==="Platform"?(o(),u($,{key:0,command:"wizard"},{default:e(()=>[...n[6]||(n[6]=[m("配置向导",-1)])]),_:1})):T("",!0),t($,{command:"status"},{default:e(()=>[...n[7]||(n[7]=[m("服务状态",-1)])]),_:1}),t($,{command:"logout",divided:""},{default:e(()=>[...n[8]||(n[8]=[m("退出登录",-1)])]),_:1})]),_:1})]),default:e(()=>[a("span",Ye,[t(oe,{size:"small"},{default:e(()=>[m(i(_.value),1)]),_:1}),a("span",Ze,i(s(l).user?.displayName??"未登录"),1),t(d,null,{default:e(()=>[t(s(J))]),_:1})])]),_:1})])]),_:1}),t(ce,{class:"main mg-content"},{default:e(()=>[t(re,null,{default:e(({Component:p,route:P})=>[p?(o(),u(D(p),{key:P.fullPath,class:"route-page"})):T("",!0)]),_:1})]),_:1}),t(de,{class:"footer"},{default:e(()=>[a("span",null,i(b.value)+" · webVRender :"+i(v.value)+" · API "+i(E.value),1)]),_:1})]),_:1})]),_:1})])}}}),ma=Y(ea,[["__scopeId","data-v-94b7b35c"]]);export{ma as default}; diff --git a/MiGu.Server/wwwroot/assets/AuthRoleView-94zjdzbD.js b/MiGu.Server/wwwroot/assets/AuthRoleView-BW7bVuKX.js similarity index 99% rename from MiGu.Server/wwwroot/assets/AuthRoleView-94zjdzbD.js rename to MiGu.Server/wwwroot/assets/AuthRoleView-BW7bVuKX.js index a94859f..8884267 100644 --- a/MiGu.Server/wwwroot/assets/AuthRoleView-94zjdzbD.js +++ b/MiGu.Server/wwwroot/assets/AuthRoleView-BW7bVuKX.js @@ -1 +1 @@ -import{aU as k,aI as Be,bv as Se,b7 as Te,aE as b,aH as t,bJ as s,ai as x,X as c,bh as f,bg as oe,t as De,G as Oe,b9 as u,ac as qe,a9 as Ae,aB as v,bq as g,r as Ge,bt as E,bc as ue,aG as i,bK as ie,aC as w,aa as Me,ab as je,bj as R,ad as Fe,aD as G,a8 as Le,aM as de,aW as He,aK as re,bA as Ke,bi as We,N as Je,O as Xe,R as Ye,a4 as Ze,Z as Qe,a2 as el,w as ll,H as al,v as tl,u as sl,L as nl,ax as J,Y as pe,ak as ol}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */async function ul(){const{data:d}=await k.get("/rbac/catalog");return d}async function il(){const{data:d}=await k.get("/rbac/roles");return d}async function dl(d){if(d.id){const{data:z}=await k.put(`/rbac/roles/${d.id}`,d);return z}const{data:V}=await k.post("/rbac/roles",d);return V}async function rl(d){await k.delete(`/rbac/roles/${d}`)}async function pl(){const{data:d}=await k.get("/rbac/users");return d}async function cl(d){const{data:V}=await k.post("/rbac/users",d);return V}async function ce(d,V){const{data:z}=await k.put(`/rbac/users/${d}`,V);return z}async function ml(d,V){await k.put(`/rbac/users/${d}/password`,{password:V})}async function fl(d){await k.delete(`/rbac/users/${d}`)}const vl={class:"rbac-header"},bl={class:"tab-toolbar"},gl={class:"toolbar-hint"},yl={key:0,class:"muted"},_l={class:"tab-toolbar"},wl={class:"toolbar-hint"},kl={key:1},Vl={key:0,class:"page-picker"},Cl={class:"page-group-head"},El={class:"page-group-title"},Ul={class:"page-group-actions"},$l={key:1,class:"wildcard-hint"},xl=Be({__name:"AuthRoleView",setup(d){const V=Se(),z=J(()=>V.user?.id??""),X=f("users"),B=f(!1),C=f(!1),M=f(null),S=f([]),j=f([]);function me(a){return S.value.find(e=>e.id===a)?.name??a}function A(a){return a==="*"?"通用":a==="Platform"?"管理端":a==="RCSMonitor"?"运营端":a}function fe(a){return a==="*"?"danger":a==="Platform"?"warning":"success"}async function N(){B.value=!0;try{const[a,e,o]=await Promise.all([ul(),il(),pl()]);M.value=a,S.value=e,j.value=o}catch(a){c.error(`加载失败:${$(a)}`)}finally{B.value=!1}}const h=f(!1),n=oe({id:null,username:"",displayName:"",password:"",roleIds:[],enabled:!0});function ve(){Object.assign(n,{id:null,username:"",displayName:"",password:"",roleIds:[],enabled:!0}),h.value=!0}function be(a){Object.assign(n,{id:a.id,username:a.username,displayName:a.displayName,password:"",roleIds:[...a.roleIds],enabled:a.enabled}),h.value=!0}async function ge(){C.value=!0;try{n.id?(await ce(n.id,{displayName:n.displayName,roleIds:n.roleIds,enabled:n.enabled}),c.success("用户已更新")):(await cl({username:n.username,displayName:n.displayName,password:n.password,roleIds:n.roleIds,enabled:n.enabled}),c.success("用户已创建")),h.value=!1,await N()}catch(a){c.error($(a))}finally{C.value=!1}}async function ye(a,e){a._busy=!0;try{await ce(a.id,{enabled:e}),a.enabled=e,c.success(e?"已启用":"已停用")}catch(o){c.error($(o))}finally{a._busy=!1}}async function _e(a){try{await pe.confirm(`确定删除用户「${a.username}」?此操作不可恢复。`,"删除确认",{type:"warning"})}catch{return}try{await fl(a.id),c.success("用户已删除"),await N()}catch(e){c.error($(e))}}const T=f(!1),D=f(null),O=f("");function we(a){D.value=a,O.value="",T.value=!0}async function ke(){if(D.value){if(!O.value){c.warning("请输入新密码");return}C.value=!0;try{await ml(D.value.id,O.value),c.success("密码已重置"),T.value=!1}catch(a){c.error($(a))}finally{C.value=!1}}}const I=f(!1),p=oe({id:null,name:"",description:"",scope:"Platform"}),y=f([]),U=f(!1),F=f([]),L=f([]),Y=J(()=>(M.value?.pages??[]).filter(a=>p.scope==="*"||a.scope===p.scope)),Z=J(()=>{const a=new Map;for(const e of Y.value)a.has(e.group)||a.set(e.group,[]),a.get(e.group).push(e);return[...a.entries()].map(([e,o])=>({group:e,pages:o}))});function Ve(){Object.assign(p,{id:null,name:"",description:"",scope:"Platform"}),y.value=[],U.value=!1,F.value=[],L.value=[],I.value=!0}function Ce(a){Object.assign(p,{id:a.id,name:a.name,description:a.description,scope:a.scope}),U.value=a.pages.includes("*"),y.value=U.value?[]:[...a.pages],F.value=[...a.ops],L.value=a.widgetGrants.map(e=>({...e})),I.value=!0}function Ee(){const a=new Set(Y.value.map(e=>e.key));y.value=y.value.filter(e=>a.has(e))}function Q(a,e){const o=a.map(m=>m.key);e?y.value=[...new Set([...y.value,...o])]:y.value=y.value.filter(m=>!o.includes(m))}async function Ue(){if(!p.name.trim()){c.warning("请填写角色名称");return}C.value=!0;try{await dl({id:p.id??void 0,name:p.name,description:p.description,scope:p.scope,pages:U.value?["*"]:y.value,ops:F.value,widgetGrants:L.value}),c.success(p.id?"角色已更新":"角色已创建"),I.value=!1,await N()}catch(a){c.error($(a))}finally{C.value=!1}}async function $e(a){try{await pe.confirm(`确定删除角色「${a.name}」?`,"删除确认",{type:"warning"})}catch{return}try{await rl(a.id),c.success("角色已删除"),await N()}catch(e){c.error($(e))}}function $(a){return a instanceof Error?a.message:String(a)}return Te(N),(a,e)=>{const o=Ge,m=je,q=Fe,H=Le,ee=Me,le=Ae,xe=qe,Ne=De,P=Ye,_=Xe,ae=Qe,te=Ze,K=Je,W=Oe,se=ll,he=el,Ie=al,Pe=sl,Re=tl,ze=nl,ne=Ke;return u(),b(x,null,[t(Ne,{shadow:"never",class:"rbac-card"},{header:s(()=>[v("div",vl,[e[19]||(e[19]=v("div",{class:"rbac-title-wrap"},[v("span",{class:"rbac-title"},"权限与角色管理"),v("span",{class:"rbac-desc"},"为角色分配可访问页面、操作与控件,并为用户指派角色(标准 RBAC)。")],-1)),t(o,{icon:E(We),loading:B.value,onClick:N},{default:s(()=>[...e[18]||(e[18]=[i("刷新",-1)])]),_:1},8,["icon","loading"])])]),default:s(()=>[t(xe,{modelValue:X.value,"onUpdate:modelValue":e[0]||(e[0]=l=>X.value=l),class:"rbac-tabs"},{default:s(()=>[t(le,{label:"用户管理",name:"users"},{default:s(()=>[v("div",bl,[v("span",gl,"共 "+g(j.value.length)+" 个用户",1),t(o,{type:"primary",icon:E(ue),onClick:ve},{default:s(()=>[...e[20]||(e[20]=[i("新增用户",-1)])]),_:1},8,["icon"])]),ie((u(),w(ee,{data:j.value,size:"default",border:"",stripe:""},{default:s(()=>[t(m,{label:"用户名",prop:"username",width:"140"}),t(m,{label:"显示名",prop:"displayName",width:"150"}),t(m,{label:"角色","min-width":"200"},{default:s(({row:l})=>[(u(!0),b(x,null,R(l.roleIds,r=>(u(),w(q,{key:r,size:"small",effect:"plain",class:"mg-tag"},{default:s(()=>[i(g(me(r)),1)]),_:2},1024))),128)),l.roleIds.length?G("",!0):(u(),b("span",yl,"—"))]),_:1}),t(m,{label:"可用域",width:"180"},{default:s(({row:l})=>[(u(!0),b(x,null,R(l.scopes,r=>(u(),w(q,{key:r,size:"small",type:"info",effect:"plain",class:"mg-tag"},{default:s(()=>[i(g(A(r)),1)]),_:2},1024))),128))]),_:1}),t(m,{label:"启用",width:"90",align:"center"},{default:s(({row:l})=>[t(H,{"model-value":l.enabled,loading:l._busy,onChange:r=>ye(l,!!r)},null,8,["model-value","loading","onChange"])]),_:1}),t(m,{label:"操作",width:"220",align:"center"},{default:s(({row:l})=>[t(o,{link:"",type:"primary",icon:E(de),onClick:r=>be(l)},{default:s(()=>[...e[21]||(e[21]=[i("编辑",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"warning",icon:E(He),onClick:r=>we(l)},{default:s(()=>[...e[22]||(e[22]=[i("改密",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"danger",icon:E(re),disabled:l.id===z.value,onClick:r=>_e(l)},{default:s(()=>[...e[23]||(e[23]=[i("删除",-1)])]),_:1},8,["icon","disabled","onClick"])]),_:1})]),_:1},8,["data"])),[[ne,B.value]])]),_:1}),t(le,{label:"角色与页面权限",name:"roles"},{default:s(()=>[v("div",_l,[v("span",wl,"共 "+g(S.value.length)+" 个角色",1),t(o,{type:"primary",icon:E(ue),onClick:Ve},{default:s(()=>[...e[24]||(e[24]=[i("新增角色",-1)])]),_:1},8,["icon"])]),ie((u(),w(ee,{data:S.value,size:"default",border:"",stripe:""},{default:s(()=>[t(m,{label:"角色名称",width:"160"},{default:s(({row:l})=>[v("span",null,g(l.name),1),l.system?(u(),w(q,{key:0,size:"small",type:"success",effect:"plain",class:"mg-tag"},{default:s(()=>[...e[25]||(e[25]=[i("内置",-1)])]),_:1})):G("",!0)]),_:1}),t(m,{label:"描述",prop:"description","min-width":"180","show-overflow-tooltip":""}),t(m,{label:"归属域",width:"120"},{default:s(({row:l})=>[t(q,{size:"small",type:fe(l.scope),effect:"plain"},{default:s(()=>[i(g(A(l.scope)),1)]),_:2},1032,["type"])]),_:1}),t(m,{label:"可访问页面",width:"130",align:"center"},{default:s(({row:l})=>[l.pages.includes("*")?(u(),w(q,{key:0,size:"small",type:"danger",effect:"plain"},{default:s(()=>[...e[26]||(e[26]=[i("全部页面",-1)])]),_:1})):(u(),b("span",kl,g(l.pages.length)+" 个",1))]),_:1}),t(m,{label:"操作",width:"160",align:"center"},{default:s(({row:l})=>[t(o,{link:"",type:"primary",icon:E(de),onClick:r=>Ce(l)},{default:s(()=>[...e[27]||(e[27]=[i("编辑",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"danger",icon:E(re),disabled:l.system,onClick:r=>$e(l)},{default:s(()=>[...e[28]||(e[28]=[i("删除",-1)])]),_:1},8,["icon","disabled","onClick"])]),_:1})]),_:1},8,["data"])),[[ne,B.value]])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(W,{modelValue:h.value,"onUpdate:modelValue":e[7]||(e[7]=l=>h.value=l),title:n.id?"编辑用户":"新增用户",width:"480px","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[6]||(e[6]=l=>h.value=!1)},{default:s(()=>[...e[29]||(e[29]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:ge},{default:s(()=>[...e[30]||(e[30]=[i("保存",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"84px","label-position":"right"},{default:s(()=>[t(_,{label:"用户名",required:""},{default:s(()=>[t(P,{modelValue:n.username,"onUpdate:modelValue":e[1]||(e[1]=l=>n.username=l),disabled:!!n.id,placeholder:"登录用户名"},null,8,["modelValue","disabled"])]),_:1}),t(_,{label:"显示名"},{default:s(()=>[t(P,{modelValue:n.displayName,"onUpdate:modelValue":e[2]||(e[2]=l=>n.displayName=l),placeholder:"界面展示名称(留空则同用户名)"},null,8,["modelValue"])]),_:1}),n.id?G("",!0):(u(),w(_,{key:0,label:"初始密码",required:""},{default:s(()=>[t(P,{modelValue:n.password,"onUpdate:modelValue":e[3]||(e[3]=l=>n.password=l),type:"password","show-password":"",placeholder:"设置初始登录密码"},null,8,["modelValue"])]),_:1})),t(_,{label:"角色"},{default:s(()=>[t(te,{modelValue:n.roleIds,"onUpdate:modelValue":e[4]||(e[4]=l=>n.roleIds=l),multiple:"",filterable:"",placeholder:"选择一个或多个角色",style:{width:"100%"}},{default:s(()=>[(u(!0),b(x,null,R(S.value,l=>(u(),w(ae,{key:l.id,label:`${l.name}(${A(l.scope)})`,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(_,{label:"启用"},{default:s(()=>[t(H,{modelValue:n.enabled,"onUpdate:modelValue":e[5]||(e[5]=l=>n.enabled=l)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"]),t(W,{modelValue:T.value,"onUpdate:modelValue":e[10]||(e[10]=l=>T.value=l),title:"重置密码",width:"420px","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[9]||(e[9]=l=>T.value=!1)},{default:s(()=>[...e[31]||(e[31]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:ke},{default:s(()=>[...e[32]||(e[32]=[i("确定",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"84px"},{default:s(()=>[t(_,{label:"用户"},{default:s(()=>[v("span",null,g(D.value?.displayName)+"("+g(D.value?.username)+")",1)]),_:1}),t(_,{label:"新密码",required:""},{default:s(()=>[t(P,{modelValue:O.value,"onUpdate:modelValue":e[8]||(e[8]=l=>O.value=l),type:"password","show-password":"",placeholder:"输入新密码"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(W,{modelValue:I.value,"onUpdate:modelValue":e[17]||(e[17]=l=>I.value=l),title:p.id?"编辑角色":"新增角色",width:"760px",top:"6vh","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[16]||(e[16]=l=>I.value=!1)},{default:s(()=>[...e[36]||(e[36]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:Ue},{default:s(()=>[...e[37]||(e[37]=[i("保存",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"92px","label-position":"right"},{default:s(()=>[t(he,{gutter:12},{default:s(()=>[t(se,{span:12},{default:s(()=>[t(_,{label:"角色名称",required:""},{default:s(()=>[t(P,{modelValue:p.name,"onUpdate:modelValue":e[11]||(e[11]=l=>p.name=l),placeholder:"如:场景设计员"},null,8,["modelValue"])]),_:1})]),_:1}),t(se,{span:12},{default:s(()=>[t(_,{label:"归属域",required:""},{default:s(()=>[t(te,{modelValue:p.scope,"onUpdate:modelValue":e[12]||(e[12]=l=>p.scope=l),style:{width:"100%"},onChange:Ee},{default:s(()=>[(u(!0),b(x,null,R(M.value?.scopes??[],l=>(u(),w(ae,{key:l.value,label:l.label,value:l.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1})]),_:1}),t(_,{label:"描述"},{default:s(()=>[t(P,{modelValue:p.description,"onUpdate:modelValue":e[13]||(e[13]=l=>p.description=l),placeholder:"角色用途说明"},null,8,["modelValue"])]),_:1}),t(Ie,{"content-position":"left"},{default:s(()=>[...e[33]||(e[33]=[i("可访问页面",-1)])]),_:1}),t(_,{label:"授权方式"},{default:s(()=>[t(H,{modelValue:U.value,"onUpdate:modelValue":e[14]||(e[14]=l=>U.value=l),"active-text":"该域全部页面(含未来新增)","inactive-text":"按页面精确勾选","inline-prompt":"",style:{"--el-switch-on-color":"var(--mg-primary, #6366f1)"}},null,8,["modelValue"])]),_:1}),U.value?(u(),b("div",$l,"已授予「"+g(A(p.scope))+"」下的全部页面(包括未来新增的页面)。",1)):(u(),b("div",Vl,[(u(!0),b(x,null,R(Z.value,l=>(u(),b("div",{key:l.group,class:"page-group"},[v("div",Cl,[v("span",El,g(l.group),1),v("span",Ul,[t(o,{link:"",type:"primary",size:"small",onClick:r=>Q(l.pages,!0)},{default:s(()=>[...e[34]||(e[34]=[i("全选",-1)])]),_:1},8,["onClick"]),t(o,{link:"",type:"info",size:"small",onClick:r=>Q(l.pages,!1)},{default:s(()=>[...e[35]||(e[35]=[i("清空",-1)])]),_:1},8,["onClick"])])]),t(Re,{modelValue:y.value,"onUpdate:modelValue":e[15]||(e[15]=r=>y.value=r),class:"page-checks"},{default:s(()=>[(u(!0),b(x,null,R(l.pages,r=>(u(),w(Pe,{key:r.key,value:r.key,label:r.key},{default:s(()=>[i(g(r.label),1)]),_:2},1032,["value","label"]))),128))]),_:2},1032,["modelValue"])]))),128)),Z.value.length?G("",!0):(u(),w(ze,{key:0,description:"该域暂无可分配页面","image-size":60}))]))]),_:1})]),_:1},8,["modelValue","title"])],64)}}}),Jl=ol(xl,[["__scopeId","data-v-2392979d"]]);export{Jl as default}; +import{aU as k,aI as Be,bv as Se,b7 as Te,aE as b,aH as t,bJ as s,ai as x,X as c,bh as f,bg as oe,t as De,G as Oe,b9 as u,ac as qe,a9 as Ae,aB as v,bq as g,r as Ge,bt as E,bc as ue,aG as i,bK as ie,aC as w,aa as Me,ab as je,bj as R,ad as Fe,aD as G,a8 as Le,aM as de,aW as He,aK as re,bA as Ke,bi as We,N as Je,O as Xe,R as Ye,a4 as Ze,Z as Qe,a2 as el,w as ll,H as al,v as tl,u as sl,L as nl,ax as J,Y as pe,ak as ol}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */async function ul(){const{data:d}=await k.get("/rbac/catalog");return d}async function il(){const{data:d}=await k.get("/rbac/roles");return d}async function dl(d){if(d.id){const{data:z}=await k.put(`/rbac/roles/${d.id}`,d);return z}const{data:V}=await k.post("/rbac/roles",d);return V}async function rl(d){await k.delete(`/rbac/roles/${d}`)}async function pl(){const{data:d}=await k.get("/rbac/users");return d}async function cl(d){const{data:V}=await k.post("/rbac/users",d);return V}async function ce(d,V){const{data:z}=await k.put(`/rbac/users/${d}`,V);return z}async function ml(d,V){await k.put(`/rbac/users/${d}/password`,{password:V})}async function fl(d){await k.delete(`/rbac/users/${d}`)}const vl={class:"rbac-header"},bl={class:"tab-toolbar"},gl={class:"toolbar-hint"},yl={key:0,class:"muted"},_l={class:"tab-toolbar"},wl={class:"toolbar-hint"},kl={key:1},Vl={key:0,class:"page-picker"},Cl={class:"page-group-head"},El={class:"page-group-title"},Ul={class:"page-group-actions"},$l={key:1,class:"wildcard-hint"},xl=Be({__name:"AuthRoleView",setup(d){const V=Se(),z=J(()=>V.user?.id??""),X=f("users"),B=f(!1),C=f(!1),M=f(null),S=f([]),j=f([]);function me(a){return S.value.find(e=>e.id===a)?.name??a}function A(a){return a==="*"?"通用":a==="Platform"?"管理端":a==="RCSMonitor"?"运营端":a}function fe(a){return a==="*"?"danger":a==="Platform"?"warning":"success"}async function N(){B.value=!0;try{const[a,e,o]=await Promise.all([ul(),il(),pl()]);M.value=a,S.value=e,j.value=o}catch(a){c.error(`加载失败:${$(a)}`)}finally{B.value=!1}}const h=f(!1),n=oe({id:null,username:"",displayName:"",password:"",roleIds:[],enabled:!0});function ve(){Object.assign(n,{id:null,username:"",displayName:"",password:"",roleIds:[],enabled:!0}),h.value=!0}function be(a){Object.assign(n,{id:a.id,username:a.username,displayName:a.displayName,password:"",roleIds:[...a.roleIds],enabled:a.enabled}),h.value=!0}async function ge(){C.value=!0;try{n.id?(await ce(n.id,{displayName:n.displayName,roleIds:n.roleIds,enabled:n.enabled}),c.success("用户已更新")):(await cl({username:n.username,displayName:n.displayName,password:n.password,roleIds:n.roleIds,enabled:n.enabled}),c.success("用户已创建")),h.value=!1,await N()}catch(a){c.error($(a))}finally{C.value=!1}}async function ye(a,e){a._busy=!0;try{await ce(a.id,{enabled:e}),a.enabled=e,c.success(e?"已启用":"已停用")}catch(o){c.error($(o))}finally{a._busy=!1}}async function _e(a){try{await pe.confirm(`确定删除用户「${a.username}」?此操作不可恢复。`,"删除确认",{type:"warning"})}catch{return}try{await fl(a.id),c.success("用户已删除"),await N()}catch(e){c.error($(e))}}const T=f(!1),D=f(null),O=f("");function we(a){D.value=a,O.value="",T.value=!0}async function ke(){if(D.value){if(!O.value){c.warning("请输入新密码");return}C.value=!0;try{await ml(D.value.id,O.value),c.success("密码已重置"),T.value=!1}catch(a){c.error($(a))}finally{C.value=!1}}}const I=f(!1),p=oe({id:null,name:"",description:"",scope:"Platform"}),y=f([]),U=f(!1),F=f([]),L=f([]),Y=J(()=>(M.value?.pages??[]).filter(a=>p.scope==="*"||a.scope===p.scope)),Z=J(()=>{const a=new Map;for(const e of Y.value)a.has(e.group)||a.set(e.group,[]),a.get(e.group).push(e);return[...a.entries()].map(([e,o])=>({group:e,pages:o}))});function Ve(){Object.assign(p,{id:null,name:"",description:"",scope:"Platform"}),y.value=[],U.value=!1,F.value=[],L.value=[],I.value=!0}function Ce(a){Object.assign(p,{id:a.id,name:a.name,description:a.description,scope:a.scope}),U.value=a.pages.includes("*"),y.value=U.value?[]:[...a.pages],F.value=[...a.ops],L.value=a.widgetGrants.map(e=>({...e})),I.value=!0}function Ee(){const a=new Set(Y.value.map(e=>e.key));y.value=y.value.filter(e=>a.has(e))}function Q(a,e){const o=a.map(m=>m.key);e?y.value=[...new Set([...y.value,...o])]:y.value=y.value.filter(m=>!o.includes(m))}async function Ue(){if(!p.name.trim()){c.warning("请填写角色名称");return}C.value=!0;try{await dl({id:p.id??void 0,name:p.name,description:p.description,scope:p.scope,pages:U.value?["*"]:y.value,ops:F.value,widgetGrants:L.value}),c.success(p.id?"角色已更新":"角色已创建"),I.value=!1,await N()}catch(a){c.error($(a))}finally{C.value=!1}}async function $e(a){try{await pe.confirm(`确定删除角色「${a.name}」?`,"删除确认",{type:"warning"})}catch{return}try{await rl(a.id),c.success("角色已删除"),await N()}catch(e){c.error($(e))}}function $(a){return a instanceof Error?a.message:String(a)}return Te(N),(a,e)=>{const o=Ge,m=je,q=Fe,H=Le,ee=Me,le=Ae,xe=qe,Ne=De,P=Ye,_=Xe,ae=Qe,te=Ze,K=Je,W=Oe,se=ll,he=el,Ie=al,Pe=sl,Re=tl,ze=nl,ne=Ke;return u(),b(x,null,[t(Ne,{shadow:"never",class:"rbac-card"},{header:s(()=>[v("div",vl,[e[19]||(e[19]=v("div",{class:"rbac-title-wrap"},[v("span",{class:"rbac-title"},"权限与角色管理"),v("span",{class:"rbac-desc"},"为角色分配可访问页面、操作与控件,并为用户指派角色(标准 RBAC)。")],-1)),t(o,{icon:E(We),loading:B.value,onClick:N},{default:s(()=>[...e[18]||(e[18]=[i("刷新",-1)])]),_:1},8,["icon","loading"])])]),default:s(()=>[t(xe,{modelValue:X.value,"onUpdate:modelValue":e[0]||(e[0]=l=>X.value=l),class:"rbac-tabs"},{default:s(()=>[t(le,{label:"用户管理",name:"users"},{default:s(()=>[v("div",bl,[v("span",gl,"共 "+g(j.value.length)+" 个用户",1),t(o,{type:"primary",icon:E(ue),onClick:ve},{default:s(()=>[...e[20]||(e[20]=[i("新增用户",-1)])]),_:1},8,["icon"])]),ie((u(),w(ee,{data:j.value,size:"default",border:"",stripe:""},{default:s(()=>[t(m,{label:"用户名",prop:"username",width:"140"}),t(m,{label:"显示名",prop:"displayName",width:"150"}),t(m,{label:"角色","min-width":"200"},{default:s(({row:l})=>[(u(!0),b(x,null,R(l.roleIds,r=>(u(),w(q,{key:r,size:"small",effect:"plain",class:"mg-tag"},{default:s(()=>[i(g(me(r)),1)]),_:2},1024))),128)),l.roleIds.length?G("",!0):(u(),b("span",yl,"—"))]),_:1}),t(m,{label:"可用域",width:"180"},{default:s(({row:l})=>[(u(!0),b(x,null,R(l.scopes,r=>(u(),w(q,{key:r,size:"small",type:"info",effect:"plain",class:"mg-tag"},{default:s(()=>[i(g(A(r)),1)]),_:2},1024))),128))]),_:1}),t(m,{label:"启用",width:"90",align:"center"},{default:s(({row:l})=>[t(H,{"model-value":l.enabled,loading:l._busy,onChange:r=>ye(l,!!r)},null,8,["model-value","loading","onChange"])]),_:1}),t(m,{label:"操作",width:"220",align:"center"},{default:s(({row:l})=>[t(o,{link:"",type:"primary",icon:E(de),onClick:r=>be(l)},{default:s(()=>[...e[21]||(e[21]=[i("编辑",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"warning",icon:E(He),onClick:r=>we(l)},{default:s(()=>[...e[22]||(e[22]=[i("改密",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"danger",icon:E(re),disabled:l.id===z.value,onClick:r=>_e(l)},{default:s(()=>[...e[23]||(e[23]=[i("删除",-1)])]),_:1},8,["icon","disabled","onClick"])]),_:1})]),_:1},8,["data"])),[[ne,B.value]])]),_:1}),t(le,{label:"角色与页面权限",name:"roles"},{default:s(()=>[v("div",_l,[v("span",wl,"共 "+g(S.value.length)+" 个角色",1),t(o,{type:"primary",icon:E(ue),onClick:Ve},{default:s(()=>[...e[24]||(e[24]=[i("新增角色",-1)])]),_:1},8,["icon"])]),ie((u(),w(ee,{data:S.value,size:"default",border:"",stripe:""},{default:s(()=>[t(m,{label:"角色名称",width:"160"},{default:s(({row:l})=>[v("span",null,g(l.name),1),l.system?(u(),w(q,{key:0,size:"small",type:"success",effect:"plain",class:"mg-tag"},{default:s(()=>[...e[25]||(e[25]=[i("内置",-1)])]),_:1})):G("",!0)]),_:1}),t(m,{label:"描述",prop:"description","min-width":"180","show-overflow-tooltip":""}),t(m,{label:"归属域",width:"120"},{default:s(({row:l})=>[t(q,{size:"small",type:fe(l.scope),effect:"plain"},{default:s(()=>[i(g(A(l.scope)),1)]),_:2},1032,["type"])]),_:1}),t(m,{label:"可访问页面",width:"130",align:"center"},{default:s(({row:l})=>[l.pages.includes("*")?(u(),w(q,{key:0,size:"small",type:"danger",effect:"plain"},{default:s(()=>[...e[26]||(e[26]=[i("全部页面",-1)])]),_:1})):(u(),b("span",kl,g(l.pages.length)+" 个",1))]),_:1}),t(m,{label:"操作",width:"160",align:"center"},{default:s(({row:l})=>[t(o,{link:"",type:"primary",icon:E(de),onClick:r=>Ce(l)},{default:s(()=>[...e[27]||(e[27]=[i("编辑",-1)])]),_:1},8,["icon","onClick"]),t(o,{link:"",type:"danger",icon:E(re),disabled:l.system,onClick:r=>$e(l)},{default:s(()=>[...e[28]||(e[28]=[i("删除",-1)])]),_:1},8,["icon","disabled","onClick"])]),_:1})]),_:1},8,["data"])),[[ne,B.value]])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(W,{modelValue:h.value,"onUpdate:modelValue":e[7]||(e[7]=l=>h.value=l),title:n.id?"编辑用户":"新增用户",width:"480px","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[6]||(e[6]=l=>h.value=!1)},{default:s(()=>[...e[29]||(e[29]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:ge},{default:s(()=>[...e[30]||(e[30]=[i("保存",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"84px","label-position":"right"},{default:s(()=>[t(_,{label:"用户名",required:""},{default:s(()=>[t(P,{modelValue:n.username,"onUpdate:modelValue":e[1]||(e[1]=l=>n.username=l),disabled:!!n.id,placeholder:"登录用户名"},null,8,["modelValue","disabled"])]),_:1}),t(_,{label:"显示名"},{default:s(()=>[t(P,{modelValue:n.displayName,"onUpdate:modelValue":e[2]||(e[2]=l=>n.displayName=l),placeholder:"界面展示名称(留空则同用户名)"},null,8,["modelValue"])]),_:1}),n.id?G("",!0):(u(),w(_,{key:0,label:"初始密码",required:""},{default:s(()=>[t(P,{modelValue:n.password,"onUpdate:modelValue":e[3]||(e[3]=l=>n.password=l),type:"password","show-password":"",placeholder:"设置初始登录密码"},null,8,["modelValue"])]),_:1})),t(_,{label:"角色"},{default:s(()=>[t(te,{modelValue:n.roleIds,"onUpdate:modelValue":e[4]||(e[4]=l=>n.roleIds=l),multiple:"",filterable:"",placeholder:"选择一个或多个角色",style:{width:"100%"}},{default:s(()=>[(u(!0),b(x,null,R(S.value,l=>(u(),w(ae,{key:l.id,label:`${l.name}(${A(l.scope)})`,value:l.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(_,{label:"启用"},{default:s(()=>[t(H,{modelValue:n.enabled,"onUpdate:modelValue":e[5]||(e[5]=l=>n.enabled=l)},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue","title"]),t(W,{modelValue:T.value,"onUpdate:modelValue":e[10]||(e[10]=l=>T.value=l),title:"重置密码",width:"420px","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[9]||(e[9]=l=>T.value=!1)},{default:s(()=>[...e[31]||(e[31]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:ke},{default:s(()=>[...e[32]||(e[32]=[i("确定",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"84px"},{default:s(()=>[t(_,{label:"用户"},{default:s(()=>[v("span",null,g(D.value?.displayName)+"("+g(D.value?.username)+")",1)]),_:1}),t(_,{label:"新密码",required:""},{default:s(()=>[t(P,{modelValue:O.value,"onUpdate:modelValue":e[8]||(e[8]=l=>O.value=l),type:"password","show-password":"",placeholder:"输入新密码"},null,8,["modelValue"])]),_:1})]),_:1})]),_:1},8,["modelValue"]),t(W,{modelValue:I.value,"onUpdate:modelValue":e[17]||(e[17]=l=>I.value=l),title:p.id?"编辑角色":"新增角色",width:"760px",top:"6vh","destroy-on-close":""},{footer:s(()=>[t(o,{onClick:e[16]||(e[16]=l=>I.value=!1)},{default:s(()=>[...e[36]||(e[36]=[i("取消",-1)])]),_:1}),t(o,{type:"primary",loading:C.value,onClick:Ue},{default:s(()=>[...e[37]||(e[37]=[i("保存",-1)])]),_:1},8,["loading"])]),default:s(()=>[t(K,{"label-width":"92px","label-position":"right"},{default:s(()=>[t(he,{gutter:12},{default:s(()=>[t(se,{span:12},{default:s(()=>[t(_,{label:"角色名称",required:""},{default:s(()=>[t(P,{modelValue:p.name,"onUpdate:modelValue":e[11]||(e[11]=l=>p.name=l),placeholder:"如:场景设计员"},null,8,["modelValue"])]),_:1})]),_:1}),t(se,{span:12},{default:s(()=>[t(_,{label:"归属域",required:""},{default:s(()=>[t(te,{modelValue:p.scope,"onUpdate:modelValue":e[12]||(e[12]=l=>p.scope=l),style:{width:"100%"},onChange:Ee},{default:s(()=>[(u(!0),b(x,null,R(M.value?.scopes??[],l=>(u(),w(ae,{key:l.value,label:l.label,value:l.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1})]),_:1})]),_:1}),t(_,{label:"描述"},{default:s(()=>[t(P,{modelValue:p.description,"onUpdate:modelValue":e[13]||(e[13]=l=>p.description=l),placeholder:"角色用途说明"},null,8,["modelValue"])]),_:1}),t(Ie,{"content-position":"left"},{default:s(()=>[...e[33]||(e[33]=[i("可访问页面",-1)])]),_:1}),t(_,{label:"授权方式"},{default:s(()=>[t(H,{modelValue:U.value,"onUpdate:modelValue":e[14]||(e[14]=l=>U.value=l),"active-text":"该域全部页面(含未来新增)","inactive-text":"按页面精确勾选","inline-prompt":"",style:{"--el-switch-on-color":"var(--mg-primary, #6366f1)"}},null,8,["modelValue"])]),_:1}),U.value?(u(),b("div",$l,"已授予「"+g(A(p.scope))+"」下的全部页面(包括未来新增的页面)。",1)):(u(),b("div",Vl,[(u(!0),b(x,null,R(Z.value,l=>(u(),b("div",{key:l.group,class:"page-group"},[v("div",Cl,[v("span",El,g(l.group),1),v("span",Ul,[t(o,{link:"",type:"primary",size:"small",onClick:r=>Q(l.pages,!0)},{default:s(()=>[...e[34]||(e[34]=[i("全选",-1)])]),_:1},8,["onClick"]),t(o,{link:"",type:"info",size:"small",onClick:r=>Q(l.pages,!1)},{default:s(()=>[...e[35]||(e[35]=[i("清空",-1)])]),_:1},8,["onClick"])])]),t(Re,{modelValue:y.value,"onUpdate:modelValue":e[15]||(e[15]=r=>y.value=r),class:"page-checks"},{default:s(()=>[(u(!0),b(x,null,R(l.pages,r=>(u(),w(Pe,{key:r.key,value:r.key,label:r.key},{default:s(()=>[i(g(r.label),1)]),_:2},1032,["value","label"]))),128))]),_:2},1032,["modelValue"])]))),128)),Z.value.length?G("",!0):(u(),w(ze,{key:0,description:"该域暂无可分配页面","image-size":60}))]))]),_:1})]),_:1},8,["modelValue","title"])],64)}}}),Jl=ol(xl,[["__scopeId","data-v-2392979d"]]);export{Jl as default}; diff --git a/MiGu.Server/wwwroot/assets/CarPanelView-DpfkXBoo.js b/MiGu.Server/wwwroot/assets/CarPanelView-DfcvV1b9.js similarity index 97% rename from MiGu.Server/wwwroot/assets/CarPanelView-DpfkXBoo.js rename to MiGu.Server/wwwroot/assets/CarPanelView-DfcvV1b9.js index 84e76f1..b33c7b7 100644 --- a/MiGu.Server/wwwroot/assets/CarPanelView-DpfkXBoo.js +++ b/MiGu.Server/wwwroot/assets/CarPanelView-DfcvV1b9.js @@ -1 +1 @@ -import{aI as H,b9 as y,aC as $,N as ae,bJ as l,aH as a,a2 as se,w as oe,O as ne,S as re,a8 as ie,z as J,aB as r,bq as w,R as de,r as Q,aG as f,aD as P,ax as X,bh as N,ak as W,b7 as Y,bK as ue,bA as ce,aE as j,t as pe,ad as me,ai as q,bj as G,x as fe,Q as ye,bt as ve,bi as _e,bg as K,X as V,Y as be,y as ge,L as ke,ac as Ce,a9 as Ee}from"./index-368apsQG.js";/* empty css *//* empty css */import{R as Ne}from"./ReflectionManagerPanel-CKQWtKhJ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as L}from"./reflection-C0K7EJ_N.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const $e={class:"cse-color-code"},Ie={class:"cse-color-code"},Se={class:"cse-color-code"},Ae={class:"cse-model-row"},Ve=H({__name:"CarStyleEditorForm",props:{typeFullName:{},modelValue:{},hasOverride:{type:Boolean},saving:{type:Boolean}},emits:["update:modelValue","save","reset"],setup(O,{emit:C}){const x=O,b=C,c=X(()=>x.modelValue);function m(n){b("update:modelValue",{...c.value,...n})}const I=N(null);function g(){I.value?.click()}function M(n){const t=n.target,v=t.files?.[0];v&&(m({modelPath:v.name}),t.value="")}function T(n){const t=n>>>24&255,v=n>>>16&255,p=n>>>8&255,_=n&255,E=z=>z.toString(16).padStart(2,"0");return`${E(v)}${E(p)}${E(_)}${E(t)}`}function h(n){const t=n.replace(/^#/,"");if(t.length===6){const v=parseInt(t.slice(0,2),16),p=parseInt(t.slice(2,4),16),_=parseInt(t.slice(4,6),16);return(255<<24|v<<16|p<<8|_)>>>0}if(t.length===8){const v=parseInt(t.slice(0,2),16),p=parseInt(t.slice(2,4),16),_=parseInt(t.slice(4,6),16);return(parseInt(t.slice(6,8),16)<<24|v<<16|p<<8|_)>>>0}return 0}return(n,t)=>{const v=re,p=ne,_=oe,E=ie,z=se,S=J,B=Q,R=de,F=ae;return y(),$(F,{"label-width":"120px",size:"default",class:"cse-form",model:c.value},{default:l(()=>[a(z,{gutter:16},{default:l(()=>[a(_,{span:8},{default:l(()=>[a(p,{label:"长度 (m)"},{default:l(()=>[a(v,{"model-value":c.value.bodyLengthM,min:.12,max:4,step:.01,precision:2,"onUpdate:modelValue":t[0]||(t[0]=u=>m({bodyLengthM:Number(u??0)}))},null,8,["model-value"])]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"宽度 (m)"},{default:l(()=>[a(v,{"model-value":c.value.bodyWidthM,min:.08,max:3,step:.01,precision:2,"onUpdate:modelValue":t[1]||(t[1]=u=>m({bodyWidthM:Number(u??0)}))},null,8,["model-value"])]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"显示名称"},{default:l(()=>[a(E,{"model-value":c.value.showLabel,"onUpdate:modelValue":t[2]||(t[2]=u=>m({showLabel:!!u}))},null,8,["model-value"])]),_:1})]),_:1})]),_:1}),a(z,{gutter:16},{default:l(()=>[a(_,{span:8},{default:l(()=>[a(p,{label:"车体颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.bodyColorArgb),"show-alpha":"","onUpdate:modelValue":t[3]||(t[3]=u=>m({bodyColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",$e,"#"+w(T(c.value.bodyColorArgb).toUpperCase()),1),t[9]||(t[9]=r("span",{class:"cse-color-hint"},"无报警/上线时生效",-1))]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"描边颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.outlineColorArgb),"show-alpha":"","onUpdate:modelValue":t[4]||(t[4]=u=>m({outlineColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",Ie,"#"+w(T(c.value.outlineColorArgb).toUpperCase()),1)]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"标签颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.labelColorArgb),"show-alpha":"","onUpdate:modelValue":t[5]||(t[5]=u=>m({labelColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",Se,"#"+w(T(c.value.labelColorArgb).toUpperCase()),1)]),_:1})]),_:1})]),_:1}),a(p,{label:"3D 模型路径"},{default:l(()=>[r("div",Ae,[a(R,{"model-value":c.value.modelPath,placeholder:"如 ./models/agv-base.glb(路径仅保存,3D 替换矩形渲染由后续阶段接入)",clearable:"","onUpdate:modelValue":t[6]||(t[6]=u=>m({modelPath:u??""}))},{append:l(()=>[a(B,{onClick:g},{default:l(()=>[...t[10]||(t[10]=[f("浏览…",-1)])]),_:1})]),_:1},8,["model-value"]),r("input",{ref_key:"fileInput",ref:I,type:"file",accept:".glb,.gltf,.obj,.fbx",style:{display:"none"},onChange:M},null,544)]),t[11]||(t[11]=r("p",{class:"cse-model-hint"}," 现版本仅记录文件路径作为元信息。3D 渲染替代矩形将在后续阶段实现(CycleGUI Workspace LoadModel)。 如需上传文件到服务器请先用其它方式将模型放到 SimpleLite 可访问的相对路径。 ",-1))]),_:1}),a(p,null,{default:l(()=>[a(B,{type:"primary",loading:O.saving,onClick:t[7]||(t[7]=u=>n.$emit("save"))},{default:l(()=>[...t[12]||(t[12]=[f("保存此车型",-1)])]),_:1},8,["loading"]),O.hasOverride?(y(),$(B,{key:0,type:"warning",plain:"",onClick:t[8]||(t[8]=u=>n.$emit("reset"))},{default:l(()=>[...t[13]||(t[13]=[f("恢复为默认",-1)])]),_:1})):P("",!0)]),_:1})]),_:1},8,["model"])}}}),xe=W(Ve,[["__scopeId","data-v-3cdad944"]]),Te={class:"cse-root"},Ue={class:"cse-card-header"},we={class:"cse-desc"},he={class:"cse-palette"},ze={class:"cse-palette-label"},Pe={class:"cse-palette-key"},Oe={class:"cse-palette-pickers"},Be={class:"cse-color-code"},De={class:"cse-card-header"},Le={class:"cse-row-title"},je={class:"cse-row-name"},Me={class:"cse-row-fqn"},Re=H({__name:"CarStyleEditor",setup(O,{expose:C}){const x=N(!1),b=N(!1),c=N(!1),m=N(null),I=N([]),g=K({}),M=N(void 0),T=N([]),h=N([]),n=K({}),t=K({}),v=X(()=>{const s=new Set([...Object.keys(n),...Object.keys(t)]);for(const e of s)if(n[e]!==t[e])return!0;return!1});function p(s){return n[s]??0}function _(s,e){n[s]=e?z(e):0}function E(s){const e=s>>>24&255,i=s>>>16&255,k=s>>>8&255,A=s&255,o=U=>U.toString(16).padStart(2,"0");return`${o(i)}${o(k)}${o(A)}${o(e)}`}function z(s){const e=s.replace(/^#/,"");if(e.length===6){const i=parseInt(e.slice(0,2),16),k=parseInt(e.slice(2,4),16),A=parseInt(e.slice(4,6),16);return(255<<24|i<<16|k<<8|A)>>>0}if(e.length===8){const i=parseInt(e.slice(0,2),16),k=parseInt(e.slice(2,4),16),A=parseInt(e.slice(4,6),16);return(parseInt(e.slice(6,8),16)<<24|i<<16|k<<8|A)>>>0}return 0}async function S(){x.value=!0;try{const s=await L.getCarStyleTypes().catch(o=>(console.warn("[CarStyleEditor] getCarStyleTypes failed:",o),null)),e=await L.getAlarmColors().catch(o=>(console.warn("[CarStyleEditor] getAlarmColors failed:",o),null)),i=Array.isArray(s?.types)?s.types:[];I.value=i;for(const o of i)g[o.typeName]={...o.style};for(const o of Object.keys(g))i.find(U=>U.typeName===o)||delete g[o];const k=Array.isArray(e?.entries)?e.entries:[],A=Array.isArray(e?.defaultKeys)?e.defaultKeys:[];T.value=A,h.value=k;for(const o of Object.keys(n))delete n[o];for(const o of Object.keys(t))delete t[o];for(const o of k){if(!o?.key)continue;const U=Number(o.colorArgb)>>>0;n[o.key]=U,t[o.key]=U}(!s||!e)&&V.warning("车型样式 / 报警颜色加载部分失败,请确认 SimpleLite 已启动(端口 8222)。")}catch(s){V.error(`加载车型样式失败:${s.message}`)}finally{x.value=!1}}async function B(){if(v.value){b.value=!0;try{await L.putAlarmColors({...n}),V.success("调色板已写入并生效"),await S()}catch(s){V.error(`保存调色板失败:${s.message}`)}finally{b.value=!1}}}function R(){c.value=!0;const s={避障:4294940672,运行:4283215696,上线:4280391411,下线:4288585374,导航失联:4288423856,报警:4294198070,低电量:4294951175};for(const e of Object.keys(n))delete n[e];for(const e of Object.keys(s))n[e]=s[e];c.value=!1,V.info("已恢复为 7 种默认颜色,未写入。点「保存调色板」生效。")}async function F(s){const e=g[s.typeName];if(e){m.value=s.typeName;try{const i=await L.putCarStyle(s.typeName,e);g[s.typeName]={...i},s.hasOverride=!0,V.success(`已保存 ${s.label} 车型样式`)}catch(i){V.error(`保存 ${s.label} 失败:${i.message}`)}finally{m.value=null}}}async function u(s){try{await be.confirm(`把 ${s.label} (${s.typeName}) 的样式恢复为全局默认?删除条目后将与未覆盖车型一致。`,"恢复默认",{confirmButtonText:"恢复",cancelButtonText:"取消",type:"warning"})}catch{return}try{await L.deleteCarStyle(s.typeName),V.success(`已恢复 ${s.label} 为默认样式`),await S()}catch(e){V.error(`恢复默认失败:${e.message}`)}}return Y(S),C({refresh:S}),(s,e)=>{const i=me,k=Q,A=J,o=pe,U=ye,Z=ge,ee=fe,te=ke,le=ce;return ue((y(),j("div",Te,[a(o,{shadow:"never",class:"cse-card"},{header:l(()=>[r("div",Ue,[e[4]||(e[4]=r("span",{class:"cse-card-title"},"报警 / 状态调色板",-1)),a(i,{size:"small",type:"info",effect:"plain"},{default:l(()=>[...e[1]||(e[1]=[f("7 种默认状态",-1)])]),_:1}),e[5]||(e[5]=r("span",{class:"cse-card-spacer"},null,-1)),a(k,{size:"small",loading:c.value,onClick:R},{default:l(()=>[...e[2]||(e[2]=[f("恢复默认",-1)])]),_:1},8,["loading"]),a(k,{size:"small",type:"primary",disabled:!v.value,loading:b.value,onClick:B},{default:l(()=>[...e[3]||(e[3]=[f(" 保存调色板(写入 simple.json) ",-1)])]),_:1},8,["disabled","loading"])])]),default:l(()=>[r("p",we,[e[9]||(e[9]=f(" 车体颜色的判定优先级: ",-1)),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[6]||(e[6]=[f("1. AlarmInfo 非空 → 「报警」",-1)])]),_:1}),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[7]||(e[7]=[f("2. lstatus 包含关键字 → 对应键",-1)])]),_:1}),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[8]||(e[8]=[f("3. 兜底 → 上下线默认色",-1)])]),_:1}),e[10]||(e[10]=f(" 修改下方颜色 + 「保存调色板」即时生效。 ",-1))]),r("div",he,[(y(!0),j(q,null,G(h.value,d=>(y(),j("div",{key:d.key,class:"cse-palette-item"},[r("div",ze,[r("span",Pe,w(d.key),1),d.isDefault?P("",!0):(y(),$(i,{key:0,size:"small",type:"warning",effect:"plain"},{default:l(()=>[...e[11]||(e[11]=[f("自定义",-1)])]),_:1}))]),r("div",Oe,[a(A,{"model-value":E(p(d.key)),"show-alpha":"",size:"small","onUpdate:modelValue":D=>_(d.key,D)},null,8,["model-value","onUpdate:modelValue"]),r("code",Be,"#"+w(E(p(d.key)).toUpperCase()),1)])]))),128))])]),_:1}),a(o,{shadow:"never",class:"cse-card cse-types-card"},{header:l(()=>[r("div",De,[e[13]||(e[13]=r("span",{class:"cse-card-title"},"车型样式",-1)),a(i,{size:"small",type:"info",effect:"plain"},{default:l(()=>[f(w(I.value.length)+" 个已加载车型",1)]),_:1}),e[14]||(e[14]=r("span",{class:"cse-card-spacer"},null,-1)),a(k,{size:"small",onClick:S},{default:l(()=>[a(U,null,{default:l(()=>[a(ve(_e))]),_:1}),e[12]||(e[12]=r("span",{class:"cse-btn-text"},"刷新",-1))]),_:1})])]),default:l(()=>[e[17]||(e[17]=r("p",{class:"cse-desc"}," 点击车型行展开编辑:尺寸(米)、车体 / 描边 / 标签颜色、是否显示名称、3D 模型文件路径。 每辆车按 .NET 类型 (`assemblyName::shortName`) 索引样式。修改后点行内「保存」即时写入并生效。 ",-1)),a(ee,{modelValue:M.value,"onUpdate:modelValue":e[0]||(e[0]=d=>M.value=d),accordion:""},{default:l(()=>[(y(!0),j(q,null,G(I.value,d=>(y(),$(Z,{key:d.typeName,name:d.typeName},{title:l(()=>[r("div",Le,[r("span",je,w(d.label),1),r("code",Me,w(d.typeName),1),d.hasOverride?(y(),$(i,{key:0,size:"small",type:"success",effect:"plain"},{default:l(()=>[...e[15]||(e[15]=[f("已覆盖",-1)])]),_:1})):(y(),$(i,{key:1,size:"small",type:"info",effect:"plain"},{default:l(()=>[...e[16]||(e[16]=[f("默认",-1)])]),_:1}))])]),default:l(()=>[g[d.typeName]?(y(),$(xe,{key:0,"type-full-name":d.typeName,"model-value":g[d.typeName],"has-override":d.hasOverride,saving:m.value===d.typeName,"onUpdate:modelValue":D=>g[d.typeName]=D,onSave:D=>F(d),onReset:D=>u(d)},null,8,["type-full-name","model-value","has-override","saving","onUpdate:modelValue","onSave","onReset"])):P("",!0)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"]),!x.value&&I.value.length===0?(y(),$(te,{key:0,description:"未发现任何 Car 子类(请确认 SimpleLite 已加载相应插件 dll)"})):P("",!0)]),_:1})])),[[le,x.value]])}}}),Fe=W(Re,[["__scopeId","data-v-3af8f925"]]),Ke={class:"car-page"},He=H({__name:"CarPanelView",setup(O){const C=N("list");function x(b){C.value=b,sessionStorage.setItem("admin.cars.tab",C.value)}return Y(()=>{const b=sessionStorage.getItem("admin.cars.tab");(b==="list"||b==="style")&&(C.value=b)}),(b,c)=>{const m=Ee,I=Ce;return y(),j("div",Ke,[a(I,{modelValue:C.value,"onUpdate:modelValue":c[0]||(c[0]=g=>C.value=g),type:"border-card",class:"car-tabs admin-tabs",onTabChange:x},{default:l(()=>[a(m,{label:"车辆列表",name:"list"},{default:l(()=>[C.value==="list"?(y(),$(Ne,{key:0,kind:"car","kind-label":"车辆",title:"车辆管理(Car / AbstractCar,含模拟车、插件车型 reflectionApi 实例化)","empty-text":"当前没有车辆;点击右上角「新建车辆」从已加载的 CarType 中选一个实例化。"})):P("",!0)]),_:1}),a(m,{label:"车型样式 / 报警颜色",name:"style"},{default:l(()=>[C.value==="style"?(y(),$(Fe,{key:0})):P("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Ct=W(He,[["__scopeId","data-v-c3733824"]]);export{Ct as default}; +import{aI as H,b9 as y,aC as $,N as ae,bJ as l,aH as a,a2 as se,w as oe,O as ne,S as re,a8 as ie,z as J,aB as r,bq as w,R as de,r as Q,aG as f,aD as P,ax as X,bh as N,ak as W,b7 as Y,bK as ue,bA as ce,aE as j,t as pe,ad as me,ai as q,bj as G,x as fe,Q as ye,bt as ve,bi as _e,bg as K,X as V,Y as be,y as ge,L as ke,ac as Ce,a9 as Ee}from"./index-Dg4NaXsE.js";/* empty css *//* empty css */import{R as Ne}from"./ReflectionManagerPanel-BZQZIz4T.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as L}from"./reflection-B_glb6eT.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const $e={class:"cse-color-code"},Ie={class:"cse-color-code"},Se={class:"cse-color-code"},Ae={class:"cse-model-row"},Ve=H({__name:"CarStyleEditorForm",props:{typeFullName:{},modelValue:{},hasOverride:{type:Boolean},saving:{type:Boolean}},emits:["update:modelValue","save","reset"],setup(O,{emit:C}){const x=O,b=C,c=X(()=>x.modelValue);function m(n){b("update:modelValue",{...c.value,...n})}const I=N(null);function g(){I.value?.click()}function M(n){const t=n.target,v=t.files?.[0];v&&(m({modelPath:v.name}),t.value="")}function T(n){const t=n>>>24&255,v=n>>>16&255,p=n>>>8&255,_=n&255,E=z=>z.toString(16).padStart(2,"0");return`${E(v)}${E(p)}${E(_)}${E(t)}`}function h(n){const t=n.replace(/^#/,"");if(t.length===6){const v=parseInt(t.slice(0,2),16),p=parseInt(t.slice(2,4),16),_=parseInt(t.slice(4,6),16);return(255<<24|v<<16|p<<8|_)>>>0}if(t.length===8){const v=parseInt(t.slice(0,2),16),p=parseInt(t.slice(2,4),16),_=parseInt(t.slice(4,6),16);return(parseInt(t.slice(6,8),16)<<24|v<<16|p<<8|_)>>>0}return 0}return(n,t)=>{const v=re,p=ne,_=oe,E=ie,z=se,S=J,B=Q,R=de,F=ae;return y(),$(F,{"label-width":"120px",size:"default",class:"cse-form",model:c.value},{default:l(()=>[a(z,{gutter:16},{default:l(()=>[a(_,{span:8},{default:l(()=>[a(p,{label:"长度 (m)"},{default:l(()=>[a(v,{"model-value":c.value.bodyLengthM,min:.12,max:4,step:.01,precision:2,"onUpdate:modelValue":t[0]||(t[0]=u=>m({bodyLengthM:Number(u??0)}))},null,8,["model-value"])]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"宽度 (m)"},{default:l(()=>[a(v,{"model-value":c.value.bodyWidthM,min:.08,max:3,step:.01,precision:2,"onUpdate:modelValue":t[1]||(t[1]=u=>m({bodyWidthM:Number(u??0)}))},null,8,["model-value"])]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"显示名称"},{default:l(()=>[a(E,{"model-value":c.value.showLabel,"onUpdate:modelValue":t[2]||(t[2]=u=>m({showLabel:!!u}))},null,8,["model-value"])]),_:1})]),_:1})]),_:1}),a(z,{gutter:16},{default:l(()=>[a(_,{span:8},{default:l(()=>[a(p,{label:"车体颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.bodyColorArgb),"show-alpha":"","onUpdate:modelValue":t[3]||(t[3]=u=>m({bodyColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",$e,"#"+w(T(c.value.bodyColorArgb).toUpperCase()),1),t[9]||(t[9]=r("span",{class:"cse-color-hint"},"无报警/上线时生效",-1))]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"描边颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.outlineColorArgb),"show-alpha":"","onUpdate:modelValue":t[4]||(t[4]=u=>m({outlineColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",Ie,"#"+w(T(c.value.outlineColorArgb).toUpperCase()),1)]),_:1})]),_:1}),a(_,{span:8},{default:l(()=>[a(p,{label:"标签颜色"},{default:l(()=>[a(S,{"model-value":T(c.value.labelColorArgb),"show-alpha":"","onUpdate:modelValue":t[5]||(t[5]=u=>m({labelColorArgb:u?h(u):0}))},null,8,["model-value"]),r("code",Se,"#"+w(T(c.value.labelColorArgb).toUpperCase()),1)]),_:1})]),_:1})]),_:1}),a(p,{label:"3D 模型路径"},{default:l(()=>[r("div",Ae,[a(R,{"model-value":c.value.modelPath,placeholder:"如 ./models/agv-base.glb(路径仅保存,3D 替换矩形渲染由后续阶段接入)",clearable:"","onUpdate:modelValue":t[6]||(t[6]=u=>m({modelPath:u??""}))},{append:l(()=>[a(B,{onClick:g},{default:l(()=>[...t[10]||(t[10]=[f("浏览…",-1)])]),_:1})]),_:1},8,["model-value"]),r("input",{ref_key:"fileInput",ref:I,type:"file",accept:".glb,.gltf,.obj,.fbx",style:{display:"none"},onChange:M},null,544)]),t[11]||(t[11]=r("p",{class:"cse-model-hint"}," 现版本仅记录文件路径作为元信息。3D 渲染替代矩形将在后续阶段实现(CycleGUI Workspace LoadModel)。 如需上传文件到服务器请先用其它方式将模型放到 SimpleLite 可访问的相对路径。 ",-1))]),_:1}),a(p,null,{default:l(()=>[a(B,{type:"primary",loading:O.saving,onClick:t[7]||(t[7]=u=>n.$emit("save"))},{default:l(()=>[...t[12]||(t[12]=[f("保存此车型",-1)])]),_:1},8,["loading"]),O.hasOverride?(y(),$(B,{key:0,type:"warning",plain:"",onClick:t[8]||(t[8]=u=>n.$emit("reset"))},{default:l(()=>[...t[13]||(t[13]=[f("恢复为默认",-1)])]),_:1})):P("",!0)]),_:1})]),_:1},8,["model"])}}}),xe=W(Ve,[["__scopeId","data-v-3cdad944"]]),Te={class:"cse-root"},Ue={class:"cse-card-header"},we={class:"cse-desc"},he={class:"cse-palette"},ze={class:"cse-palette-label"},Pe={class:"cse-palette-key"},Oe={class:"cse-palette-pickers"},Be={class:"cse-color-code"},De={class:"cse-card-header"},Le={class:"cse-row-title"},je={class:"cse-row-name"},Me={class:"cse-row-fqn"},Re=H({__name:"CarStyleEditor",setup(O,{expose:C}){const x=N(!1),b=N(!1),c=N(!1),m=N(null),I=N([]),g=K({}),M=N(void 0),T=N([]),h=N([]),n=K({}),t=K({}),v=X(()=>{const s=new Set([...Object.keys(n),...Object.keys(t)]);for(const e of s)if(n[e]!==t[e])return!0;return!1});function p(s){return n[s]??0}function _(s,e){n[s]=e?z(e):0}function E(s){const e=s>>>24&255,i=s>>>16&255,k=s>>>8&255,A=s&255,o=U=>U.toString(16).padStart(2,"0");return`${o(i)}${o(k)}${o(A)}${o(e)}`}function z(s){const e=s.replace(/^#/,"");if(e.length===6){const i=parseInt(e.slice(0,2),16),k=parseInt(e.slice(2,4),16),A=parseInt(e.slice(4,6),16);return(255<<24|i<<16|k<<8|A)>>>0}if(e.length===8){const i=parseInt(e.slice(0,2),16),k=parseInt(e.slice(2,4),16),A=parseInt(e.slice(4,6),16);return(parseInt(e.slice(6,8),16)<<24|i<<16|k<<8|A)>>>0}return 0}async function S(){x.value=!0;try{const s=await L.getCarStyleTypes().catch(o=>(console.warn("[CarStyleEditor] getCarStyleTypes failed:",o),null)),e=await L.getAlarmColors().catch(o=>(console.warn("[CarStyleEditor] getAlarmColors failed:",o),null)),i=Array.isArray(s?.types)?s.types:[];I.value=i;for(const o of i)g[o.typeName]={...o.style};for(const o of Object.keys(g))i.find(U=>U.typeName===o)||delete g[o];const k=Array.isArray(e?.entries)?e.entries:[],A=Array.isArray(e?.defaultKeys)?e.defaultKeys:[];T.value=A,h.value=k;for(const o of Object.keys(n))delete n[o];for(const o of Object.keys(t))delete t[o];for(const o of k){if(!o?.key)continue;const U=Number(o.colorArgb)>>>0;n[o.key]=U,t[o.key]=U}(!s||!e)&&V.warning("车型样式 / 报警颜色加载部分失败,请确认 SimpleLite 已启动(端口 8222)。")}catch(s){V.error(`加载车型样式失败:${s.message}`)}finally{x.value=!1}}async function B(){if(v.value){b.value=!0;try{await L.putAlarmColors({...n}),V.success("调色板已写入并生效"),await S()}catch(s){V.error(`保存调色板失败:${s.message}`)}finally{b.value=!1}}}function R(){c.value=!0;const s={避障:4294940672,运行:4283215696,上线:4280391411,下线:4288585374,导航失联:4288423856,报警:4294198070,低电量:4294951175};for(const e of Object.keys(n))delete n[e];for(const e of Object.keys(s))n[e]=s[e];c.value=!1,V.info("已恢复为 7 种默认颜色,未写入。点「保存调色板」生效。")}async function F(s){const e=g[s.typeName];if(e){m.value=s.typeName;try{const i=await L.putCarStyle(s.typeName,e);g[s.typeName]={...i},s.hasOverride=!0,V.success(`已保存 ${s.label} 车型样式`)}catch(i){V.error(`保存 ${s.label} 失败:${i.message}`)}finally{m.value=null}}}async function u(s){try{await be.confirm(`把 ${s.label} (${s.typeName}) 的样式恢复为全局默认?删除条目后将与未覆盖车型一致。`,"恢复默认",{confirmButtonText:"恢复",cancelButtonText:"取消",type:"warning"})}catch{return}try{await L.deleteCarStyle(s.typeName),V.success(`已恢复 ${s.label} 为默认样式`),await S()}catch(e){V.error(`恢复默认失败:${e.message}`)}}return Y(S),C({refresh:S}),(s,e)=>{const i=me,k=Q,A=J,o=pe,U=ye,Z=ge,ee=fe,te=ke,le=ce;return ue((y(),j("div",Te,[a(o,{shadow:"never",class:"cse-card"},{header:l(()=>[r("div",Ue,[e[4]||(e[4]=r("span",{class:"cse-card-title"},"报警 / 状态调色板",-1)),a(i,{size:"small",type:"info",effect:"plain"},{default:l(()=>[...e[1]||(e[1]=[f("7 种默认状态",-1)])]),_:1}),e[5]||(e[5]=r("span",{class:"cse-card-spacer"},null,-1)),a(k,{size:"small",loading:c.value,onClick:R},{default:l(()=>[...e[2]||(e[2]=[f("恢复默认",-1)])]),_:1},8,["loading"]),a(k,{size:"small",type:"primary",disabled:!v.value,loading:b.value,onClick:B},{default:l(()=>[...e[3]||(e[3]=[f(" 保存调色板(写入 simple.json) ",-1)])]),_:1},8,["disabled","loading"])])]),default:l(()=>[r("p",we,[e[9]||(e[9]=f(" 车体颜色的判定优先级: ",-1)),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[6]||(e[6]=[f("1. AlarmInfo 非空 → 「报警」",-1)])]),_:1}),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[7]||(e[7]=[f("2. lstatus 包含关键字 → 对应键",-1)])]),_:1}),a(i,{size:"small",effect:"plain"},{default:l(()=>[...e[8]||(e[8]=[f("3. 兜底 → 上下线默认色",-1)])]),_:1}),e[10]||(e[10]=f(" 修改下方颜色 + 「保存调色板」即时生效。 ",-1))]),r("div",he,[(y(!0),j(q,null,G(h.value,d=>(y(),j("div",{key:d.key,class:"cse-palette-item"},[r("div",ze,[r("span",Pe,w(d.key),1),d.isDefault?P("",!0):(y(),$(i,{key:0,size:"small",type:"warning",effect:"plain"},{default:l(()=>[...e[11]||(e[11]=[f("自定义",-1)])]),_:1}))]),r("div",Oe,[a(A,{"model-value":E(p(d.key)),"show-alpha":"",size:"small","onUpdate:modelValue":D=>_(d.key,D)},null,8,["model-value","onUpdate:modelValue"]),r("code",Be,"#"+w(E(p(d.key)).toUpperCase()),1)])]))),128))])]),_:1}),a(o,{shadow:"never",class:"cse-card cse-types-card"},{header:l(()=>[r("div",De,[e[13]||(e[13]=r("span",{class:"cse-card-title"},"车型样式",-1)),a(i,{size:"small",type:"info",effect:"plain"},{default:l(()=>[f(w(I.value.length)+" 个已加载车型",1)]),_:1}),e[14]||(e[14]=r("span",{class:"cse-card-spacer"},null,-1)),a(k,{size:"small",onClick:S},{default:l(()=>[a(U,null,{default:l(()=>[a(ve(_e))]),_:1}),e[12]||(e[12]=r("span",{class:"cse-btn-text"},"刷新",-1))]),_:1})])]),default:l(()=>[e[17]||(e[17]=r("p",{class:"cse-desc"}," 点击车型行展开编辑:尺寸(米)、车体 / 描边 / 标签颜色、是否显示名称、3D 模型文件路径。 每辆车按 .NET 类型 (`assemblyName::shortName`) 索引样式。修改后点行内「保存」即时写入并生效。 ",-1)),a(ee,{modelValue:M.value,"onUpdate:modelValue":e[0]||(e[0]=d=>M.value=d),accordion:""},{default:l(()=>[(y(!0),j(q,null,G(I.value,d=>(y(),$(Z,{key:d.typeName,name:d.typeName},{title:l(()=>[r("div",Le,[r("span",je,w(d.label),1),r("code",Me,w(d.typeName),1),d.hasOverride?(y(),$(i,{key:0,size:"small",type:"success",effect:"plain"},{default:l(()=>[...e[15]||(e[15]=[f("已覆盖",-1)])]),_:1})):(y(),$(i,{key:1,size:"small",type:"info",effect:"plain"},{default:l(()=>[...e[16]||(e[16]=[f("默认",-1)])]),_:1}))])]),default:l(()=>[g[d.typeName]?(y(),$(xe,{key:0,"type-full-name":d.typeName,"model-value":g[d.typeName],"has-override":d.hasOverride,saving:m.value===d.typeName,"onUpdate:modelValue":D=>g[d.typeName]=D,onSave:D=>F(d),onReset:D=>u(d)},null,8,["type-full-name","model-value","has-override","saving","onUpdate:modelValue","onSave","onReset"])):P("",!0)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"]),!x.value&&I.value.length===0?(y(),$(te,{key:0,description:"未发现任何 Car 子类(请确认 SimpleLite 已加载相应插件 dll)"})):P("",!0)]),_:1})])),[[le,x.value]])}}}),Fe=W(Re,[["__scopeId","data-v-3af8f925"]]),Ke={class:"car-page"},He=H({__name:"CarPanelView",setup(O){const C=N("list");function x(b){C.value=b,sessionStorage.setItem("admin.cars.tab",C.value)}return Y(()=>{const b=sessionStorage.getItem("admin.cars.tab");(b==="list"||b==="style")&&(C.value=b)}),(b,c)=>{const m=Ee,I=Ce;return y(),j("div",Ke,[a(I,{modelValue:C.value,"onUpdate:modelValue":c[0]||(c[0]=g=>C.value=g),type:"border-card",class:"car-tabs admin-tabs",onTabChange:x},{default:l(()=>[a(m,{label:"车辆列表",name:"list"},{default:l(()=>[C.value==="list"?(y(),$(Ne,{key:0,kind:"car","kind-label":"车辆",title:"车辆管理(Car / AbstractCar,含模拟车、插件车型 reflectionApi 实例化)","empty-text":"当前没有车辆;点击右上角「新建车辆」从已加载的 CarType 中选一个实例化。"})):P("",!0)]),_:1}),a(m,{label:"车型样式 / 报警颜色",name:"style"},{default:l(()=>[C.value==="style"?(y(),$(Fe,{key:0})):P("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),Ct=W(He,[["__scopeId","data-v-c3733824"]]);export{Ct as default}; diff --git a/MiGu.Server/wwwroot/assets/ChargePolicyView-BMq754im.js b/MiGu.Server/wwwroot/assets/ChargePolicyView-fgYXxU-T.js similarity index 83% rename from MiGu.Server/wwwroot/assets/ChargePolicyView-BMq754im.js rename to MiGu.Server/wwwroot/assets/ChargePolicyView-fgYXxU-T.js index a4a5c0a..cb54a76 100644 --- a/MiGu.Server/wwwroot/assets/ChargePolicyView-BMq754im.js +++ b/MiGu.Server/wwwroot/assets/ChargePolicyView-fgYXxU-T.js @@ -1 +1 @@ -import{aI as s,aC as c,bJ as t,bt as d,b9 as u,aH as e,N as f,O as b,a8 as h,S as C,aa as g,ab as w,D as E}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as V}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const K=s({__name:"ChargePolicyView",setup(x){return(T,U)=>{const i=h,l=b,n=C,a=w,p=g,_=f;return u(),c(V,{section:"charge",title:"充电逻辑",description:"充电优先级、空闲充电、任务中断充电(ChargePolicy)",defaults:d(E)},{default:t(({payload:o,update:r})=>[e(_,{"label-width":"180px",model:o},{default:t(()=>[e(l,{label:"允许任务中断充电"},{default:t(()=>[e(i,{"model-value":o.allowMidTaskCharge,"onUpdate:modelValue":m=>r({...o,allowMidTaskCharge:!!m})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(l,{label:"空闲多少秒后充电"},{default:t(()=>[e(n,{"model-value":o.idleChargeAfterSec,min:0,max:86400,"onUpdate:modelValue":m=>r({...o,idleChargeAfterSec:m??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(l,{label:"充电优先级规则"},{default:t(()=>[e(p,{data:o.priority,size:"small"},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"条件",prop:"condition"}),e(a,{label:"权重",prop:"weight",width:"100"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{K as default}; +import{aI as s,aC as c,bJ as t,bt as d,b9 as u,aH as e,N as f,O as b,a8 as h,S as C,aa as g,ab as w,D as E}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as V}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const K=s({__name:"ChargePolicyView",setup(x){return(T,U)=>{const i=h,l=b,n=C,a=w,p=g,_=f;return u(),c(V,{section:"charge",title:"充电逻辑",description:"充电优先级、空闲充电、任务中断充电(ChargePolicy)",defaults:d(E)},{default:t(({payload:o,update:r})=>[e(_,{"label-width":"180px",model:o},{default:t(()=>[e(l,{label:"允许任务中断充电"},{default:t(()=>[e(i,{"model-value":o.allowMidTaskCharge,"onUpdate:modelValue":m=>r({...o,allowMidTaskCharge:!!m})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(l,{label:"空闲多少秒后充电"},{default:t(()=>[e(n,{"model-value":o.idleChargeAfterSec,min:0,max:86400,"onUpdate:modelValue":m=>r({...o,idleChargeAfterSec:m??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(l,{label:"充电优先级规则"},{default:t(()=>[e(p,{data:o.priority,size:"small"},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"条件",prop:"condition"}),e(a,{label:"权重",prop:"weight",width:"100"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{K as default}; diff --git a/MiGu.Server/wwwroot/assets/ConfigPageBase-CT6BdvCe.js b/MiGu.Server/wwwroot/assets/ConfigPageBase-MHa7yfOO.js similarity index 95% rename from MiGu.Server/wwwroot/assets/ConfigPageBase-CT6BdvCe.js rename to MiGu.Server/wwwroot/assets/ConfigPageBase-MHa7yfOO.js index ee067f1..65dcc8c 100644 --- a/MiGu.Server/wwwroot/assets/ConfigPageBase-CT6BdvCe.js +++ b/MiGu.Server/wwwroot/assets/ConfigPageBase-MHa7yfOO.js @@ -1 +1 @@ -import{aU as E,e as z,aJ as L,aI as R,bh as h,bI as V,b7 as D,aC as O,bJ as r,b9 as k,aH as l,aE as I,bq as y,aD as w,aB as p,a2 as j,w as G,t as U,bk as q,aG as u,ad as H,r as W,bt as J,bi as X,as as Q,ax as T,X as m,ak as Y}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as Z}from"./PermissionGuard-DUg2FNrM.js";import{b as tt,r as C}from"./reflection-C0K7EJ_N.js";import{i as et}from"./monitorConfigCache-BtW5W6GI.js";async function at(t){const{data:e}=await E.get(`/config/${t}`);return e}async function ot(t,e){const{data:a}=await E.put(`/config/${t}`,e);return a}function S(){return JSON.parse(JSON.stringify(z.monitor))}function b(t){const e=JSON.parse(JSON.stringify(z));if(!t)return e;const a={...S(),...t.monitor??{},car:{...S().car,...t.monitor?.car??{}},site:{...S().site,...t.monitor?.site??{}},track:{...S().track,...t.monitor?.track??{}},carActionByType:{...t.monitor?.carActionByType??{}}};return{...e,...t,playback:{...e.playback,...t.playback??{}},logRetention:{...e.logRetention,...t.logRetention??{}},version:{...e.version,...t.version??{}},monitor:a}}function M(t){const e={};if(!t)return e;for(const[a,o]of Object.entries(t))!a||!Array.isArray(o)||(e[a]=[...o]);return e}function nt(t){return{carActionByType:M(t.carActionByType),siteActionKeys:[...t.site?.methods??[]],trackActionKeys:[...t.track?.methods??[]]}}async function kt(t,e){const a=b(t);let o=null;try{o=(e??await C.getMonitorConfig()).config;const d=nt(o);a.monitor.carActionByType=d.carActionByType,a.monitor.site.actionKeys=d.siteActionKeys,a.monitor.track.actionKeys=d.trackActionKeys}catch{}return{config:a,cache:o}}async function Ct(t,e){const a=b(t).monitor;let o=e?.cachedRoot??tt();if(!e?.cachedRoot)try{o=(await C.getMonitorConfig()).config}catch{}const c=await C.saveMonitorConfig({car:{fields:[...o.car?.fields??[]],status:[...o.car?.status??[]],methods:[...o.car?.methods??[]]},site:{fields:[...o.site?.fields??[]],status:[...o.site?.status??[]],methods:[...a.site.actionKeys]},track:{fields:[...o.track?.fields??[]],status:[...o.track?.status??[]],methods:[...a.track.actionKeys]},carActionByType:M(a.carActionByType)});return et(),c}const st=L("config",{state:()=>({cache:{},loading:{}}),actions:{async load(t,e=!1){if(!e&&this.cache[t])return this.cache[t];this.loading[t]=!0;try{const a=await at(t);return t==="ops"&&a.payload&&(a.payload=b(a.payload)),this.cache[t]=a,a}finally{this.loading[t]=!1}},async save(t,e){this.loading[t]=!0;try{const a=t==="ops"?b(e):e,o=await ot(t,a);return this.cache[t]=o,o}finally{this.loading[t]=!1}}}}),it={class:"cpb-header"},rt={class:"cpb-title"},ct={key:0,class:"cpb-desc"},lt={class:"cpb-body"},dt={class:"cpb-json"},ft=R({__name:"ConfigPageBase",props:{section:{},title:{},description:{},defaults:{},normalizePayload:{type:Function},afterLoad:{type:Function},beforeSave:{type:Function},afterSave:{type:Function}},setup(t){const e=t,a=st(),o=h(null),c=h(JSON.parse(JSON.stringify(e.defaults))),d=h(!1),v=h(!1),P=T(()=>JSON.stringify(c.value,null,2)),$=T(()=>o.value?.updatedAt?new Date(o.value.updatedAt).toLocaleString("zh-CN"):"—");function A(i){c.value=i}function x(i){let n=JSON.parse(JSON.stringify(i||e.defaults));e.normalizePayload&&(n=e.normalizePayload(n)),c.value=n}async function B(i,n){d.value=!0;try{const s=await a.load(e.section,i);o.value=s,x(s.payload),e.afterLoad&&await e.afterLoad(c.value,A),n&&m.success("已重载")}catch(s){m.error(`加载失败:${s instanceof Error?s.message:String(s)}`)}finally{d.value=!1}}async function _(i=!1){await B(i,i)}async function K(){v.value=!0;let i=c.value;if(e.normalizePayload&&(i=e.normalizePayload(i)),e.beforeSave)try{await e.beforeSave(i)}catch(s){m.error(`地图监控配置保存失败:${s instanceof Error?s.message:String(s)}`),v.value=!1;return}let n="";try{const s=await a.save(e.section,i);if(o.value=s,c.value=i,e.afterSave)try{await e.afterSave(i)}catch(f){n=`(平台配置已保存,但 SimpleLite 同步失败:${f instanceof Error?f.message:String(f)})`}await B(!0,!1);const g=e.beforeSave||e.afterSave?",地图监控配置已写入 SimpleLite":"";m.success(`已保存 v${s.version}${g}${n}`)}catch(s){m.error(`保存失败:${s instanceof Error?s.message:String(s)}`)}finally{v.value=!1}}return V(()=>e.section,()=>_()),D(()=>_()),(i,n)=>{const s=H,g=W,f=U,N=G,F=j;return k(),O(Z,{"widget-id":"ConfigCenter"},{default:r(()=>[l(f,{shadow:"never"},{header:r(()=>[p("div",it,[p("span",rt,y(t.title),1),l(s,{size:"small",effect:"plain"},{default:r(()=>[u("section="+y(t.section),1)]),_:1}),l(s,{size:"small",type:"info",effect:"plain"},{default:r(()=>[u("v"+y(o.value?.version??"-"),1)]),_:1}),o.value?.updatedAt?(k(),O(s,{key:0,size:"small",type:"success",effect:"plain"},{default:r(()=>[u(y($.value),1)]),_:1})):w("",!0),n[3]||(n[3]=p("div",{class:"spacer"},null,-1)),l(g,{size:"small",icon:J(X),loading:d.value,onClick:n[0]||(n[0]=ut=>_(!0))},{default:r(()=>[...n[1]||(n[1]=[u("重载",-1)])]),_:1},8,["icon","loading"]),l(g,{size:"small",type:"primary",icon:J(Q),loading:v.value,onClick:K},{default:r(()=>[...n[2]||(n[2]=[u("保存",-1)])]),_:1},8,["icon","loading"])])]),default:r(()=>[t.description?(k(),I("p",ct,y(t.description),1)):w("",!0),p("div",lt,[l(F,{gutter:12},{default:r(()=>[l(N,{span:14},{default:r(()=>[l(f,{shadow:"never","body-style":"padding: 12px"},{header:r(()=>[...n[4]||(n[4]=[u("表单",-1)])]),default:r(()=>[q(i.$slots,"default",{payload:c.value,update:A},void 0,!0)]),_:3})]),_:3}),l(N,{span:10},{default:r(()=>[l(f,{shadow:"never","body-style":"padding: 0"},{header:r(()=>[...n[5]||(n[5]=[u("JSON 预览(保存即下发占位)",-1)])]),default:r(()=>[p("pre",dt,y(P.value),1)]),_:1})]),_:1})]),_:3})])]),_:3})]),_:3})}}}),At=Y(ft,[["__scopeId","data-v-1d51a575"]]);export{At as C,M as c,S as d,kt as l,b as n,Ct as s,st as u}; +import{aU as E,e as z,aJ as L,aI as R,bh as h,bI as V,b7 as D,aC as O,bJ as r,b9 as k,aH as l,aE as I,bq as y,aD as w,aB as p,a2 as j,w as G,t as U,bk as q,aG as u,ad as H,r as W,bt as J,bi as X,as as Q,ax as T,X as m,ak as Y}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as Z}from"./PermissionGuard-BlMEkqrL.js";import{b as tt,r as C}from"./reflection-B_glb6eT.js";import{i as et}from"./monitorConfigCache-BigdkiFw.js";async function at(t){const{data:e}=await E.get(`/config/${t}`);return e}async function ot(t,e){const{data:a}=await E.put(`/config/${t}`,e);return a}function S(){return JSON.parse(JSON.stringify(z.monitor))}function b(t){const e=JSON.parse(JSON.stringify(z));if(!t)return e;const a={...S(),...t.monitor??{},car:{...S().car,...t.monitor?.car??{}},site:{...S().site,...t.monitor?.site??{}},track:{...S().track,...t.monitor?.track??{}},carActionByType:{...t.monitor?.carActionByType??{}}};return{...e,...t,playback:{...e.playback,...t.playback??{}},logRetention:{...e.logRetention,...t.logRetention??{}},version:{...e.version,...t.version??{}},monitor:a}}function M(t){const e={};if(!t)return e;for(const[a,o]of Object.entries(t))!a||!Array.isArray(o)||(e[a]=[...o]);return e}function nt(t){return{carActionByType:M(t.carActionByType),siteActionKeys:[...t.site?.methods??[]],trackActionKeys:[...t.track?.methods??[]]}}async function kt(t,e){const a=b(t);let o=null;try{o=(e??await C.getMonitorConfig()).config;const d=nt(o);a.monitor.carActionByType=d.carActionByType,a.monitor.site.actionKeys=d.siteActionKeys,a.monitor.track.actionKeys=d.trackActionKeys}catch{}return{config:a,cache:o}}async function Ct(t,e){const a=b(t).monitor;let o=e?.cachedRoot??tt();if(!e?.cachedRoot)try{o=(await C.getMonitorConfig()).config}catch{}const c=await C.saveMonitorConfig({car:{fields:[...o.car?.fields??[]],status:[...o.car?.status??[]],methods:[...o.car?.methods??[]]},site:{fields:[...o.site?.fields??[]],status:[...o.site?.status??[]],methods:[...a.site.actionKeys]},track:{fields:[...o.track?.fields??[]],status:[...o.track?.status??[]],methods:[...a.track.actionKeys]},carActionByType:M(a.carActionByType)});return et(),c}const st=L("config",{state:()=>({cache:{},loading:{}}),actions:{async load(t,e=!1){if(!e&&this.cache[t])return this.cache[t];this.loading[t]=!0;try{const a=await at(t);return t==="ops"&&a.payload&&(a.payload=b(a.payload)),this.cache[t]=a,a}finally{this.loading[t]=!1}},async save(t,e){this.loading[t]=!0;try{const a=t==="ops"?b(e):e,o=await ot(t,a);return this.cache[t]=o,o}finally{this.loading[t]=!1}}}}),it={class:"cpb-header"},rt={class:"cpb-title"},ct={key:0,class:"cpb-desc"},lt={class:"cpb-body"},dt={class:"cpb-json"},ft=R({__name:"ConfigPageBase",props:{section:{},title:{},description:{},defaults:{},normalizePayload:{type:Function},afterLoad:{type:Function},beforeSave:{type:Function},afterSave:{type:Function}},setup(t){const e=t,a=st(),o=h(null),c=h(JSON.parse(JSON.stringify(e.defaults))),d=h(!1),v=h(!1),P=T(()=>JSON.stringify(c.value,null,2)),$=T(()=>o.value?.updatedAt?new Date(o.value.updatedAt).toLocaleString("zh-CN"):"—");function A(i){c.value=i}function x(i){let n=JSON.parse(JSON.stringify(i||e.defaults));e.normalizePayload&&(n=e.normalizePayload(n)),c.value=n}async function B(i,n){d.value=!0;try{const s=await a.load(e.section,i);o.value=s,x(s.payload),e.afterLoad&&await e.afterLoad(c.value,A),n&&m.success("已重载")}catch(s){m.error(`加载失败:${s instanceof Error?s.message:String(s)}`)}finally{d.value=!1}}async function _(i=!1){await B(i,i)}async function K(){v.value=!0;let i=c.value;if(e.normalizePayload&&(i=e.normalizePayload(i)),e.beforeSave)try{await e.beforeSave(i)}catch(s){m.error(`地图监控配置保存失败:${s instanceof Error?s.message:String(s)}`),v.value=!1;return}let n="";try{const s=await a.save(e.section,i);if(o.value=s,c.value=i,e.afterSave)try{await e.afterSave(i)}catch(f){n=`(平台配置已保存,但 SimpleLite 同步失败:${f instanceof Error?f.message:String(f)})`}await B(!0,!1);const g=e.beforeSave||e.afterSave?",地图监控配置已写入 SimpleLite":"";m.success(`已保存 v${s.version}${g}${n}`)}catch(s){m.error(`保存失败:${s instanceof Error?s.message:String(s)}`)}finally{v.value=!1}}return V(()=>e.section,()=>_()),D(()=>_()),(i,n)=>{const s=H,g=W,f=U,N=G,F=j;return k(),O(Z,{"widget-id":"ConfigCenter"},{default:r(()=>[l(f,{shadow:"never"},{header:r(()=>[p("div",it,[p("span",rt,y(t.title),1),l(s,{size:"small",effect:"plain"},{default:r(()=>[u("section="+y(t.section),1)]),_:1}),l(s,{size:"small",type:"info",effect:"plain"},{default:r(()=>[u("v"+y(o.value?.version??"-"),1)]),_:1}),o.value?.updatedAt?(k(),O(s,{key:0,size:"small",type:"success",effect:"plain"},{default:r(()=>[u(y($.value),1)]),_:1})):w("",!0),n[3]||(n[3]=p("div",{class:"spacer"},null,-1)),l(g,{size:"small",icon:J(X),loading:d.value,onClick:n[0]||(n[0]=ut=>_(!0))},{default:r(()=>[...n[1]||(n[1]=[u("重载",-1)])]),_:1},8,["icon","loading"]),l(g,{size:"small",type:"primary",icon:J(Q),loading:v.value,onClick:K},{default:r(()=>[...n[2]||(n[2]=[u("保存",-1)])]),_:1},8,["icon","loading"])])]),default:r(()=>[t.description?(k(),I("p",ct,y(t.description),1)):w("",!0),p("div",lt,[l(F,{gutter:12},{default:r(()=>[l(N,{span:14},{default:r(()=>[l(f,{shadow:"never","body-style":"padding: 12px"},{header:r(()=>[...n[4]||(n[4]=[u("表单",-1)])]),default:r(()=>[q(i.$slots,"default",{payload:c.value,update:A},void 0,!0)]),_:3})]),_:3}),l(N,{span:10},{default:r(()=>[l(f,{shadow:"never","body-style":"padding: 0"},{header:r(()=>[...n[5]||(n[5]=[u("JSON 预览(保存即下发占位)",-1)])]),default:r(()=>[p("pre",dt,y(P.value),1)]),_:1})]),_:1})]),_:3})])]),_:3})]),_:3})}}}),At=Y(ft,[["__scopeId","data-v-1d51a575"]]);export{At as C,M as c,S as d,kt as l,b as n,Ct as s,st as u}; diff --git a/MiGu.Server/wwwroot/assets/CustomWidgetView-BKa7U3FY.js b/MiGu.Server/wwwroot/assets/CustomWidgetView-Ch7DIGUj.js similarity index 80% rename from MiGu.Server/wwwroot/assets/CustomWidgetView-BKa7U3FY.js rename to MiGu.Server/wwwroot/assets/CustomWidgetView-Ch7DIGUj.js index d277b64..6f93718 100644 --- a/MiGu.Server/wwwroot/assets/CustomWidgetView-BKa7U3FY.js +++ b/MiGu.Server/wwwroot/assets/CustomWidgetView-Ch7DIGUj.js @@ -1 +1 @@ -import{aI as _,aC as i,bJ as e,bt as d,b9 as s,aH as t,aa as u,ab as f,aB as n,bq as r,aE as b,ai as g,bj as h,ad as w,aG as C,l as E,ak as T}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as y}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const B={class:"js-mini"},k={class:"js-mini"},x=_({__name:"CustomWidgetView",setup(J){return(S,V)=>{const a=f,p=w,m=u;return s(),i(y,{section:"widget",title:"自定义控件",description:"呼叫/展示界面可自由定义(platform-vue + rcsmonitor-vue 双渲染器)",defaults:d(E)},{default:e(({payload:c})=>[t(m,{data:c.items,size:"small",border:""},{default:e(()=>[t(a,{label:"ID",prop:"id",width:"180"}),t(a,{label:"名称",prop:"name",width:"140"}),t(a,{label:"Schema",prop:"schemaJson"},{default:e(o=>[n("pre",B,r(o.row.schemaJson),1)]),_:1}),t(a,{label:"Layout",prop:"layoutJson"},{default:e(o=>[n("pre",k,r(o.row.layoutJson),1)]),_:1}),t(a,{label:"绑定 Scope"},{default:e(o=>[(s(!0),b(g,null,h(o.row.bindToScopes,l=>(s(),i(p,{key:l,size:"small",effect:"plain",style:{"margin-right":"4px"}},{default:e(()=>[C(r(l),1)]),_:2},1024))),128))]),_:1})]),_:1},8,["data"])]),_:1},8,["defaults"])}}}),M=T(x,[["__scopeId","data-v-96b90481"]]);export{M as default}; +import{aI as _,aC as i,bJ as e,bt as d,b9 as s,aH as t,aa as u,ab as f,aB as n,bq as r,aE as b,ai as g,bj as h,ad as w,aG as C,l as E,ak as T}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as y}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const B={class:"js-mini"},k={class:"js-mini"},x=_({__name:"CustomWidgetView",setup(J){return(S,V)=>{const a=f,p=w,m=u;return s(),i(y,{section:"widget",title:"自定义控件",description:"呼叫/展示界面可自由定义(platform-vue + rcsmonitor-vue 双渲染器)",defaults:d(E)},{default:e(({payload:c})=>[t(m,{data:c.items,size:"small",border:""},{default:e(()=>[t(a,{label:"ID",prop:"id",width:"180"}),t(a,{label:"名称",prop:"name",width:"140"}),t(a,{label:"Schema",prop:"schemaJson"},{default:e(o=>[n("pre",B,r(o.row.schemaJson),1)]),_:1}),t(a,{label:"Layout",prop:"layoutJson"},{default:e(o=>[n("pre",k,r(o.row.layoutJson),1)]),_:1}),t(a,{label:"绑定 Scope"},{default:e(o=>[(s(!0),b(g,null,h(o.row.bindToScopes,l=>(s(),i(p,{key:l,size:"small",effect:"plain",style:{"margin-right":"4px"}},{default:e(()=>[C(r(l),1)]),_:2},1024))),128))]),_:1})]),_:1},8,["data"])]),_:1},8,["defaults"])}}}),M=T(x,[["__scopeId","data-v-96b90481"]]);export{M as default}; diff --git a/MiGu.Server/wwwroot/assets/DashboardView-fmEPf2c4.js b/MiGu.Server/wwwroot/assets/DashboardView-C5o_Ttf4.js similarity index 99% rename from MiGu.Server/wwwroot/assets/DashboardView-fmEPf2c4.js rename to MiGu.Server/wwwroot/assets/DashboardView-C5o_Ttf4.js index cbc26d8..32c5e48 100644 --- a/MiGu.Server/wwwroot/assets/DashboardView-fmEPf2c4.js +++ b/MiGu.Server/wwwroot/assets/DashboardView-C5o_Ttf4.js @@ -1,4 +1,4 @@ -import{aI as iL,bh as yr,b7 as oL,b2 as sL,b8 as lL,aE as Kt,aB as $,b3 as mr,bq as Wt,aG as Da,ai as Ma,bj as La,aF as pm,aH as me,bJ as fe,ax as _e,t as uL,bx as fL,b9 as $t,b4 as Yh,aC as $h,bm as gm,Q as hL,bt as Vl,bs as vL,bC as ym,aD as mm,bb as cL,ac as dL,a9 as pL,ap as gL,T as yL,bo as mL,ba as Xh,ao as _L,br as SL,bH as xL,aY as bL,bc as wL,X as TL,aA as AL,az as CL,aq as DL,aX as ML,ak as LL}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as IL,c as PL,l as RL,a as EL}from"./projection-nWPnmoX1.js";import"./reflection-C0K7EJ_N.js";/*! ***************************************************************************** +import{aI as iL,bh as yr,b7 as oL,b2 as sL,b8 as lL,aE as Kt,aB as $,b3 as mr,bq as Wt,aG as Da,ai as Ma,bj as La,aF as pm,aH as me,bJ as fe,ax as _e,t as uL,bx as fL,b9 as $t,b4 as Yh,aC as $h,bm as gm,Q as hL,bt as Vl,bs as vL,bC as ym,aD as mm,bb as cL,ac as dL,a9 as pL,ap as gL,T as yL,bo as mL,ba as Xh,ao as _L,br as SL,bH as xL,aY as bL,bc as wL,X as TL,aA as AL,az as CL,aq as DL,aX as ML,ak as LL}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as IL,c as PL,l as RL,a as EL}from"./projection-BMms551H.js";import"./reflection-B_glb6eT.js";/*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any diff --git a/MiGu.Server/wwwroot/assets/DeviceHubView-6kHSU9g1.js b/MiGu.Server/wwwroot/assets/DeviceHubView-D6W4gbr_.js similarity index 90% rename from MiGu.Server/wwwroot/assets/DeviceHubView-6kHSU9g1.js rename to MiGu.Server/wwwroot/assets/DeviceHubView-D6W4gbr_.js index b6fdc68..f42b393 100644 --- a/MiGu.Server/wwwroot/assets/DeviceHubView-6kHSU9g1.js +++ b/MiGu.Server/wwwroot/assets/DeviceHubView-D6W4gbr_.js @@ -1 +1 @@ -import{aI as b,aC as u,bJ as a,bt as f,b9 as h,aH as e,ac as w,a9 as v,aa as C,ab as E,a8 as D,C as P,F as T,aG as i,bq as r,a as V}from"./index-368apsQG.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{C as g}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const W=b({__name:"DeviceHubView",setup(I){return(x,S)=>{const l=E,s=C,n=v,d=D,o=T,m=P,c=w;return h(),u(g,{section:"device",title:"第三方设备统一接入",description:"电梯/卷帘门/安全门/充电桩/AP/交换机/摄像头/读码器/PLC(DeviceManagementConfig)",defaults:f(V)},{default:a(({payload:t})=>[e(c,{"model-value":"drivers"},{default:a(()=>[e(n,{name:"drivers",label:"驱动绑定"},{default:a(()=>[e(s,{data:t.drivers,size:"small",border:""},{default:a(()=>[e(l,{label:"ID",prop:"id",width:"120"}),e(l,{label:"设备类型",prop:"deviceType",width:"120"}),e(l,{label:"驱动名",prop:"driverName"}),e(l,{label:"版本",prop:"version",width:"100"})]),_:1},8,["data"])]),_:2},1024),e(n,{name:"devices",label:"设备实例"},{default:a(()=>[e(s,{data:t.devices,size:"small",border:""},{default:a(()=>[e(l,{label:"ID",prop:"id",width:"120"}),e(l,{label:"名称",prop:"name",width:"140"}),e(l,{label:"类型",prop:"deviceType",width:"100"}),e(l,{label:"协议",prop:"protocol",width:"120"}),e(l,{label:"地址",prop:"address"}),e(l,{label:"启用",width:"80"},{default:a(p=>[e(d,{modelValue:p.row.enabled,"onUpdate:modelValue":_=>p.row.enabled=_},null,8,["modelValue","onUpdate:modelValue"])]),_:1})]),_:1},8,["data"])]),_:2},1024),e(n,{name:"policy",label:"健康 / 告警"},{default:a(()=>[e(m,{column:2,border:""},{default:a(()=>[e(o,{label:"心跳周期 (s)"},{default:a(()=>[i(r(t.healthPolicy.heartbeatSec),1)]),_:2},1024),e(o,{label:"离线判定 (s)"},{default:a(()=>[i(r(t.healthPolicy.offlineSec),1)]),_:2},1024),e(o,{label:"告警启用"},{default:a(()=>[i(r(t.alarmPolicy.enabled?"是":"否"),1)]),_:2},1024),e(o,{label:"规则数"},{default:a(()=>[i(r(t.alarmPolicy.rules.length),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{W as default}; +import{aI as b,aC as u,bJ as a,bt as f,b9 as h,aH as e,ac as w,a9 as v,aa as C,ab as E,a8 as D,C as P,F as T,aG as i,bq as r,a as V}from"./index-Dg4NaXsE.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{C as g}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const W=b({__name:"DeviceHubView",setup(I){return(x,S)=>{const l=E,s=C,n=v,d=D,o=T,m=P,c=w;return h(),u(g,{section:"device",title:"第三方设备统一接入",description:"电梯/卷帘门/安全门/充电桩/AP/交换机/摄像头/读码器/PLC(DeviceManagementConfig)",defaults:f(V)},{default:a(({payload:t})=>[e(c,{"model-value":"drivers"},{default:a(()=>[e(n,{name:"drivers",label:"驱动绑定"},{default:a(()=>[e(s,{data:t.drivers,size:"small",border:""},{default:a(()=>[e(l,{label:"ID",prop:"id",width:"120"}),e(l,{label:"设备类型",prop:"deviceType",width:"120"}),e(l,{label:"驱动名",prop:"driverName"}),e(l,{label:"版本",prop:"version",width:"100"})]),_:1},8,["data"])]),_:2},1024),e(n,{name:"devices",label:"设备实例"},{default:a(()=>[e(s,{data:t.devices,size:"small",border:""},{default:a(()=>[e(l,{label:"ID",prop:"id",width:"120"}),e(l,{label:"名称",prop:"name",width:"140"}),e(l,{label:"类型",prop:"deviceType",width:"100"}),e(l,{label:"协议",prop:"protocol",width:"120"}),e(l,{label:"地址",prop:"address"}),e(l,{label:"启用",width:"80"},{default:a(p=>[e(d,{modelValue:p.row.enabled,"onUpdate:modelValue":_=>p.row.enabled=_},null,8,["modelValue","onUpdate:modelValue"])]),_:1})]),_:1},8,["data"])]),_:2},1024),e(n,{name:"policy",label:"健康 / 告警"},{default:a(()=>[e(m,{column:2,border:""},{default:a(()=>[e(o,{label:"心跳周期 (s)"},{default:a(()=>[i(r(t.healthPolicy.heartbeatSec),1)]),_:2},1024),e(o,{label:"离线判定 (s)"},{default:a(()=>[i(r(t.healthPolicy.offlineSec),1)]),_:2},1024),e(o,{label:"告警启用"},{default:a(()=>[i(r(t.alarmPolicy.enabled?"是":"否"),1)]),_:2},1024),e(o,{label:"规则数"},{default:a(()=>[i(r(t.alarmPolicy.rules.length),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{W as default}; diff --git a/MiGu.Server/wwwroot/assets/ExternalIntegrationView-CRYMen0m.js b/MiGu.Server/wwwroot/assets/ExternalIntegrationView-CVrzHPs8.js similarity index 88% rename from MiGu.Server/wwwroot/assets/ExternalIntegrationView-CRYMen0m.js rename to MiGu.Server/wwwroot/assets/ExternalIntegrationView-CVrzHPs8.js index 1b1a514..546e051 100644 --- a/MiGu.Server/wwwroot/assets/ExternalIntegrationView-CRYMen0m.js +++ b/MiGu.Server/wwwroot/assets/ExternalIntegrationView-CVrzHPs8.js @@ -1 +1 @@ -import{aI as U,aC as x,bJ as a,bt as c,b9 as b,aH as t,ac as g,aE as T,ai as h,bj as I,a9 as S,aa as B,ab as $,R as v,a8 as D,r as L,aG as f,bc as N,bq as R,c as z}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as P}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const le=U({__name:"ExternalIntegrationView",setup(A){function w(r,s,l){const o=`${l}-${Date.now()}`,i={...r,[l]:[...r[l]??[],{id:o,name:"新端点",url:"http://",enabled:!1}]};s(i)}function V(r,s,l,o){const i={...r,[l]:(r[l]??[]).filter((u,p)=>p!==o)};s(i)}return(r,s)=>{const l=v,o=$,i=D,u=L,p=B,E=S,C=g;return b(),x(P,{section:"integrations",title:"外部系统对接",description:"MES / WMS / RCS / PTL 等标准接口配置(ExternalIntegrations)",defaults:c(z)},{default:a(({payload:d,update:_})=>[t(C,{"model-value":"mes"},{default:a(()=>[(b(),T(h,null,I(["mes","wms","rcs","ptl"],m=>t(E,{key:m,name:m,label:m.toUpperCase()},{default:a(()=>[t(p,{data:d[m]??[],size:"small",border:""},{default:a(()=>[t(o,{label:"ID",width:"120"},{default:a(e=>[t(l,{modelValue:e.row.id,"onUpdate:modelValue":n=>e.row.id=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"名称","min-width":"160"},{default:a(e=>[t(l,{modelValue:e.row.name,"onUpdate:modelValue":n=>e.row.name=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"URL","min-width":"260"},{default:a(e=>[t(l,{modelValue:e.row.url,"onUpdate:modelValue":n=>e.row.url=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"启用",width:"80"},{default:a(e=>[t(i,{modelValue:e.row.enabled,"onUpdate:modelValue":n=>e.row.enabled=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"操作",width:"80"},{default:a(e=>[t(u,{text:"",type:"danger",size:"small",onClick:n=>V(d,_,m,e.$index)},{default:a(()=>[...s[0]||(s[0]=[f("删除",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"]),t(u,{size:"small",icon:c(N),style:{"margin-top":"8px"},onClick:e=>w(d,_,m)},{default:a(()=>[f("新增 "+R(m.toUpperCase())+" 端点",1)]),_:2},1032,["icon","onClick"])]),_:2},1032,["name","label"])),64))]),_:2},1024)]),_:1},8,["defaults"])}}});export{le as default}; +import{aI as U,aC as x,bJ as a,bt as c,b9 as b,aH as t,ac as g,aE as T,ai as h,bj as I,a9 as S,aa as B,ab as $,R as v,a8 as D,r as L,aG as f,bc as N,bq as R,c as z}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as P}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const le=U({__name:"ExternalIntegrationView",setup(A){function w(r,s,l){const o=`${l}-${Date.now()}`,i={...r,[l]:[...r[l]??[],{id:o,name:"新端点",url:"http://",enabled:!1}]};s(i)}function V(r,s,l,o){const i={...r,[l]:(r[l]??[]).filter((u,p)=>p!==o)};s(i)}return(r,s)=>{const l=v,o=$,i=D,u=L,p=B,E=S,C=g;return b(),x(P,{section:"integrations",title:"外部系统对接",description:"MES / WMS / RCS / PTL 等标准接口配置(ExternalIntegrations)",defaults:c(z)},{default:a(({payload:d,update:_})=>[t(C,{"model-value":"mes"},{default:a(()=>[(b(),T(h,null,I(["mes","wms","rcs","ptl"],m=>t(E,{key:m,name:m,label:m.toUpperCase()},{default:a(()=>[t(p,{data:d[m]??[],size:"small",border:""},{default:a(()=>[t(o,{label:"ID",width:"120"},{default:a(e=>[t(l,{modelValue:e.row.id,"onUpdate:modelValue":n=>e.row.id=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"名称","min-width":"160"},{default:a(e=>[t(l,{modelValue:e.row.name,"onUpdate:modelValue":n=>e.row.name=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"URL","min-width":"260"},{default:a(e=>[t(l,{modelValue:e.row.url,"onUpdate:modelValue":n=>e.row.url=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"启用",width:"80"},{default:a(e=>[t(i,{modelValue:e.row.enabled,"onUpdate:modelValue":n=>e.row.enabled=n},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),t(o,{label:"操作",width:"80"},{default:a(e=>[t(u,{text:"",type:"danger",size:"small",onClick:n=>V(d,_,m,e.$index)},{default:a(()=>[...s[0]||(s[0]=[f("删除",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["data"]),t(u,{size:"small",icon:c(N),style:{"margin-top":"8px"},onClick:e=>w(d,_,m)},{default:a(()=>[f("新增 "+R(m.toUpperCase())+" 端点",1)]),_:2},1032,["icon","onClick"])]),_:2},1032,["name","label"])),64))]),_:2},1024)]),_:1},8,["defaults"])}}});export{le as default}; diff --git a/MiGu.Server/wwwroot/assets/LocationView-BH1yvcsy.js b/MiGu.Server/wwwroot/assets/LocationView-r0d4EkyN.js similarity index 86% rename from MiGu.Server/wwwroot/assets/LocationView-BH1yvcsy.js rename to MiGu.Server/wwwroot/assets/LocationView-r0d4EkyN.js index 731ba25..e8f75b4 100644 --- a/MiGu.Server/wwwroot/assets/LocationView-BH1yvcsy.js +++ b/MiGu.Server/wwwroot/assets/LocationView-r0d4EkyN.js @@ -1 +1 @@ -import{aI as s,aC as m,bJ as t,bt as c,b9 as d,aH as e,ac as _,a9 as b,aa as u,ab as f,$ as w,d as h}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{C as g}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const J=s({__name:"LocationView",setup(C){return(T,E)=>{const a=f,i=w,o=u,l=b,n=_;return d(),m(g,{section:"location",title:"库位管理",description:"出入库、库存、库位可视化(LocationManagement)",defaults:c(h)},{default:t(({payload:p})=>[e(n,{"model-value":"locs"},{default:t(()=>[e(l,{name:"locs",label:"库位"},{default:t(()=>[e(o,{data:p.locations,size:"small",border:""},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"编码",prop:"code",width:"120"}),e(a,{label:"名称",prop:"name"}),e(a,{label:"站点",prop:"siteId",width:"100"}),e(a,{label:"容量",prop:"capacity",width:"100"}),e(a,{label:"占用"},{default:t(r=>[e(i,{percentage:Math.round(r.row.occupied/r.row.capacity*100),"stroke-width":10},null,8,["percentage"])]),_:1})]),_:1},8,["data"])]),_:2},1024),e(l,{name:"rules",label:"库存规则"},{default:t(()=>[e(o,{data:p.inventoryRules,size:"small",border:""},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"物料类型",prop:"itemType"}),e(a,{label:"下限",prop:"minQty",width:"100"}),e(a,{label:"上限",prop:"maxQty",width:"100"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{J as default}; +import{aI as s,aC as m,bJ as t,bt as c,b9 as d,aH as e,ac as _,a9 as b,aa as u,ab as f,$ as w,d as h}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{C as g}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const J=s({__name:"LocationView",setup(C){return(T,E)=>{const a=f,i=w,o=u,l=b,n=_;return d(),m(g,{section:"location",title:"库位管理",description:"出入库、库存、库位可视化(LocationManagement)",defaults:c(h)},{default:t(({payload:p})=>[e(n,{"model-value":"locs"},{default:t(()=>[e(l,{name:"locs",label:"库位"},{default:t(()=>[e(o,{data:p.locations,size:"small",border:""},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"编码",prop:"code",width:"120"}),e(a,{label:"名称",prop:"name"}),e(a,{label:"站点",prop:"siteId",width:"100"}),e(a,{label:"容量",prop:"capacity",width:"100"}),e(a,{label:"占用"},{default:t(r=>[e(i,{percentage:Math.round(r.row.occupied/r.row.capacity*100),"stroke-width":10},null,8,["percentage"])]),_:1})]),_:1},8,["data"])]),_:2},1024),e(l,{name:"rules",label:"库存规则"},{default:t(()=>[e(o,{data:p.inventoryRules,size:"small",border:""},{default:t(()=>[e(a,{label:"ID",prop:"id",width:"100"}),e(a,{label:"物料类型",prop:"itemType"}),e(a,{label:"下限",prop:"minQty",width:"100"}),e(a,{label:"上限",prop:"maxQty",width:"100"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{J as default}; diff --git a/MiGu.Server/wwwroot/assets/LoginView-Bg_Hrmmj.js b/MiGu.Server/wwwroot/assets/LoginView-0TaDlGzh.js similarity index 99% rename from MiGu.Server/wwwroot/assets/LoginView-Bg_Hrmmj.js rename to MiGu.Server/wwwroot/assets/LoginView-0TaDlGzh.js index a3dbb69..9a14da0 100644 --- a/MiGu.Server/wwwroot/assets/LoginView-Bg_Hrmmj.js +++ b/MiGu.Server/wwwroot/assets/LoginView-0TaDlGzh.js @@ -1 +1 @@ -import{aI as H,bw as j,bx as J,bv as Q,b9 as u,aE as m,aF as C,aB as a,ai as h,bj as k,b4 as S,bt as r,bq as M,aH as s,bJ as o,O as X,R as Y,Q as K,bz as Z,a_ as ee,b3 as f,bo as ae,b0 as se,ag as te,bf as oe,aG as p,aA as le,ay as ne,u as re,T as de,x as ie,y as ue,S as me,r as pe,N as ce,bh as P,bg as W,ax as ve,X as b,ak as fe}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";import{_ as be}from"./FRLD-logo-white-no_title-BE78iS6n.js";const ge={class:"login-page"},_e={class:"bg-stars","aria-hidden":"true"},ye={class:"login-card"},Ve={class:"hero"},we={class:"hero-stars","aria-hidden":"true"},he={class:"hero-points"},ke={class:"feat"},Me={class:"feat-title"},Pe={class:"feat-desc"},Ee={class:"panel"},xe={class:"scope-wrap"},Ce={class:"launch-mode-head"},Se={class:"scope-wrap launch-wrap"},We={class:"row row-between"},$e={class:"adv-grid"},ze={class:"footer-stamp"},Ie=H({__name:"LoginView",setup(Ae){const $=j(),z=J(),E=Q(),I=[{title:"路径规划与导航",desc:"全局 + 实时双层路径算法,智能寻优路线"},{title:"交通管制",desc:"任务队列 + 优先级动态调度,提前规避路口拥堵冲突"},{title:"安全可靠性",desc:"约束设备运行规范,实现 AGV 与产线设备协同安全作业"},{title:"高级任务调度",desc:"按任务优先级、现场资源动态分配搬运任务"},{title:"插件扩展",desc:"插件化架构,支持功能定制、二次开发适配场景"}],g=P(),_=P(!1),c=P([]),l=W({username:"admin",password:"admin",scope:"Platform",launchMode:"DesktopAndWeb",remember:!0}),d=W({host:"0.0.0.0",apiPort:7001,platformPort:8080,vrPort:8223}),A={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],scope:[{required:!0,message:"请选择 scope",trigger:"change"}],launchMode:[{required:!0,message:"请选择启动模式",trigger:"change"}]},L=ve(()=>new Date().getFullYear());function x(v){return Array.from({length:v},()=>{const e=1.5+Math.random()*2.8;return{top:`${Math.random()*100}%`,left:`${Math.random()*100}%`,width:`${e}px`,height:`${e}px`,opacity:`${.35+Math.random()*.5}`,animationDelay:`${-Math.random()*6}s`,animationDuration:`${2.6+Math.random()*3.4}s`}})}const R=x(48),D=x(22);async function N(){g.value&&await g.value.validate(async v=>{if(v){_.value=!0;try{const e=await E.login({username:l.username,password:l.password,scope:l.scope,launchMode:l.launchMode});b.success(`欢迎,${E.user?.displayName??l.username}`),e.launchWarning?b({message:e.launchWarning,type:"warning",duration:6e3,showClose:!0}):e.runMode==="Detached"&&b({message:"SimpleLite 未启动(Platform.Server 单独运行),/api/sl/* 相关功能将不可用。",type:"warning",duration:6e3,showClose:!0});const n=$.query.redirect??(l.scope==="Platform"?"/admin/dashboard":"/monitor/map");z.push(n)}catch(e){const n=e instanceof Error?e.message:String(e);b.error(`登录失败:${n}`)}finally{_.value=!1}}})}return(v,e)=>{const n=K,y=Y,i=X,q=te,T=re,U=de,V=me,F=ue,B=ie,G=pe,O=ce;return u(),m("div",ge,[e[28]||(e[28]=C('
',5)),a("div",_e,[(u(!0),m(h,null,k(r(R),(t,w)=>(u(),m("span",{key:w,style:S(t)},null,4))),128))]),a("div",ye,[a("div",Ve,[a("div",we,[(u(!0),m(h,null,k(r(D),(t,w)=>(u(),m("span",{key:w,style:S(t)},null,4))),128))]),e[14]||(e[14]=C('
迷毂
迷 毂
智 能 调 度 平 台
INTELLIGENT · DISPATCH · PLATFORM
',4)),a("ul",he,[(u(),m(h,null,k(I,t=>a("li",{key:t.title},[e[13]||(e[13]=a("span",{class:"dot"},null,-1)),a("div",ke,[a("span",Me,M(t.title),1),a("span",Pe,M(t.desc),1)])])),64))]),e[15]||(e[15]=a("div",{class:"hero-footnote"},[a("span",{class:"badge"},"v1.7"),a("span",null,"稳定 · 高效 · 安全的智能调度内核")],-1))]),a("div",Ee,[e[27]||(e[27]=a("div",{class:"panel-head"},[a("div",{class:"panel-title"},"登 录"),a("div",{class:"panel-sub"},"登录以进入智能调度平台")],-1)),s(O,{ref_key:"formRef",ref:g,model:l,rules:A,class:"glass-form","hide-required-asterisk":""},{default:o(()=>[s(i,{prop:"username"},{default:o(()=>[s(y,{modelValue:l.username,"onUpdate:modelValue":e[0]||(e[0]=t=>l.username=t),size:"large",placeholder:"用户名",autocomplete:"username",clearable:""},{prefix:o(()=>[s(n,null,{default:o(()=>[s(r(Z))]),_:1})]),_:1},8,["modelValue"])]),_:1}),s(i,{prop:"password"},{default:o(()=>[s(y,{modelValue:l.password,"onUpdate:modelValue":e[1]||(e[1]=t=>l.password=t),type:"password",size:"large","show-password":"",placeholder:"密码(Mock,任意非空)",autocomplete:"current-password"},{prefix:o(()=>[s(n,null,{default:o(()=>[s(r(ee))]),_:1})]),_:1},8,["modelValue"])]),_:1}),s(i,{prop:"scope",class:"scope-item"},{default:o(()=>[a("div",xe,[a("button",{type:"button",class:f(["scope-tab",{active:l.scope==="Platform"}]),onClick:e[2]||(e[2]=t=>l.scope="Platform")},[s(n,null,{default:o(()=>[s(r(ae))]),_:1}),e[16]||(e[16]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"管理员"),a("div",{class:"scope-desc"},"platform-vue · 全功能")],-1))],2),a("button",{type:"button",class:f(["scope-tab",{active:l.scope==="RCSMonitor"}]),onClick:e[3]||(e[3]=t=>l.scope="RCSMonitor")},[s(n,null,{default:o(()=>[s(r(se))]),_:1}),e[17]||(e[17]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"运营"),a("div",{class:"scope-desc"},"rcsmonitor-vue · 受限")],-1))],2)])]),_:1}),s(i,{prop:"launchMode",class:"scope-item launch-mode-item"},{default:o(()=>[a("div",Ce,[e[19]||(e[19]=a("span",{class:"launch-mode-title"},"SimpleLite 启动模式",-1)),s(q,{placement:"top"},{content:o(()=>[...e[18]||(e[18]=[a("div",{class:"launch-tip"},[a("div",null,[a("b",null,"本地+Web"),p(":登录后由 Platform 后端拉起 SimpleLite,同时打开桌面端 ImGui 窗口与浏览器端 webVRender。")]),a("div",null,[a("b",null,"仅 Web"),p(":只起 WebTerminal,不弹本地桌面窗口,适合远程办公 / 服务器部署。")])],-1)])]),default:o(()=>[s(n,{class:"launch-mode-help"},{default:o(()=>[s(r(oe))]),_:1})]),_:1})]),a("div",Se,[a("button",{type:"button",class:f(["scope-tab",{active:l.launchMode==="DesktopAndWeb"}]),onClick:e[4]||(e[4]=t=>l.launchMode="DesktopAndWeb")},[s(n,null,{default:o(()=>[s(r(le))]),_:1}),e[20]||(e[20]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"本地 + Web"),a("div",{class:"scope-desc"},"桌面窗口 & 浏览器同时启动")],-1))],2),a("button",{type:"button",class:f(["scope-tab",{active:l.launchMode==="WebOnly"}]),onClick:e[5]||(e[5]=t=>l.launchMode="WebOnly")},[s(n,null,{default:o(()=>[s(r(ne))]),_:1}),e[21]||(e[21]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"仅 Web"),a("div",{class:"scope-desc"},"不启桌面窗口 · 浏览器使用")],-1))],2)])]),_:1}),a("div",We,[s(T,{modelValue:l.remember,"onUpdate:modelValue":e[6]||(e[6]=t=>l.remember=t),size:"default",class:"remember"},{default:o(()=>[...e[22]||(e[22]=[p("下次自动按当前 scope 进入",-1)])]),_:1},8,["modelValue"]),s(U,{underline:"never",class:"adv-link",onClick:e[7]||(e[7]=t=>c.value=c.value.length?[]:["adv"])},{default:o(()=>[...e[23]||(e[23]=[p("高级 ›",-1)])]),_:1})]),s(B,{modelValue:c.value,"onUpdate:modelValue":e[12]||(e[12]=t=>c.value=t),class:"adv-collapse"},{default:o(()=>[s(F,{name:"adv"},{title:o(()=>[...e[24]||(e[24]=[a("span",{class:"adv-title"},"Web-Enabled · 端口与监听",-1)])]),default:o(()=>[a("div",$e,[s(i,{label:"监听地址"},{default:o(()=>[s(y,{modelValue:d.host,"onUpdate:modelValue":e[8]||(e[8]=t=>d.host=t),size:"default"},null,8,["modelValue"])]),_:1}),s(i,{label:"WebAPI"},{default:o(()=>[s(V,{modelValue:d.apiPort,"onUpdate:modelValue":e[9]||(e[9]=t=>d.apiPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1}),s(i,{label:"Platform"},{default:o(()=>[s(V,{modelValue:d.platformPort,"onUpdate:modelValue":e[10]||(e[10]=t=>d.platformPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1}),s(i,{label:"webVRender"},{default:o(()=>[s(V,{modelValue:d.vrPort,"onUpdate:modelValue":e[11]||(e[11]=t=>d.vrPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1})])]),_:1})]),_:1},8,["modelValue"]),s(G,{type:"primary",loading:_.value,class:"btn-login",size:"large",onClick:N},{default:o(()=>[...e[25]||(e[25]=[p(" 登 录 ",-1)])]),_:1},8,["loading"]),e[26]||(e[26]=a("div",{class:"bottom-note"}," 任意非空用户名 + 任意密码即可登录;scope 决定进入 admin / monitor 视图;权限按 Mock 表生成。 ",-1))]),_:1},8,["model"])])]),a("div",ze," 迷 毂 · 智能调度平台 · "+M(L.value),1)])}}}),je=fe(Ie,[["__scopeId","data-v-a9a6f95c"]]);export{je as default}; +import{aI as H,bw as j,bx as J,bv as Q,b9 as u,aE as m,aF as C,aB as a,ai as h,bj as k,b4 as S,bt as r,bq as M,aH as s,bJ as o,O as X,R as Y,Q as K,bz as Z,a_ as ee,b3 as f,bo as ae,b0 as se,ag as te,bf as oe,aG as p,aA as le,ay as ne,u as re,T as de,x as ie,y as ue,S as me,r as pe,N as ce,bh as P,bg as W,ax as ve,X as b,ak as fe}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";import{_ as be}from"./FRLD-logo-white-no_title-BE78iS6n.js";const ge={class:"login-page"},_e={class:"bg-stars","aria-hidden":"true"},ye={class:"login-card"},Ve={class:"hero"},we={class:"hero-stars","aria-hidden":"true"},he={class:"hero-points"},ke={class:"feat"},Me={class:"feat-title"},Pe={class:"feat-desc"},Ee={class:"panel"},xe={class:"scope-wrap"},Ce={class:"launch-mode-head"},Se={class:"scope-wrap launch-wrap"},We={class:"row row-between"},$e={class:"adv-grid"},ze={class:"footer-stamp"},Ie=H({__name:"LoginView",setup(Ae){const $=j(),z=J(),E=Q(),I=[{title:"路径规划与导航",desc:"全局 + 实时双层路径算法,智能寻优路线"},{title:"交通管制",desc:"任务队列 + 优先级动态调度,提前规避路口拥堵冲突"},{title:"安全可靠性",desc:"约束设备运行规范,实现 AGV 与产线设备协同安全作业"},{title:"高级任务调度",desc:"按任务优先级、现场资源动态分配搬运任务"},{title:"插件扩展",desc:"插件化架构,支持功能定制、二次开发适配场景"}],g=P(),_=P(!1),c=P([]),l=W({username:"admin",password:"admin",scope:"Platform",launchMode:"DesktopAndWeb",remember:!0}),d=W({host:"0.0.0.0",apiPort:7001,platformPort:8080,vrPort:8223}),A={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}],scope:[{required:!0,message:"请选择 scope",trigger:"change"}],launchMode:[{required:!0,message:"请选择启动模式",trigger:"change"}]},L=ve(()=>new Date().getFullYear());function x(v){return Array.from({length:v},()=>{const e=1.5+Math.random()*2.8;return{top:`${Math.random()*100}%`,left:`${Math.random()*100}%`,width:`${e}px`,height:`${e}px`,opacity:`${.35+Math.random()*.5}`,animationDelay:`${-Math.random()*6}s`,animationDuration:`${2.6+Math.random()*3.4}s`}})}const R=x(48),D=x(22);async function N(){g.value&&await g.value.validate(async v=>{if(v){_.value=!0;try{const e=await E.login({username:l.username,password:l.password,scope:l.scope,launchMode:l.launchMode});b.success(`欢迎,${E.user?.displayName??l.username}`),e.launchWarning?b({message:e.launchWarning,type:"warning",duration:6e3,showClose:!0}):e.runMode==="Detached"&&b({message:"SimpleLite 未启动(Platform.Server 单独运行),/api/sl/* 相关功能将不可用。",type:"warning",duration:6e3,showClose:!0});const n=$.query.redirect??(l.scope==="Platform"?"/admin/dashboard":"/monitor/map");z.push(n)}catch(e){const n=e instanceof Error?e.message:String(e);b.error(`登录失败:${n}`)}finally{_.value=!1}}})}return(v,e)=>{const n=K,y=Y,i=X,q=te,T=re,U=de,V=me,F=ue,B=ie,G=pe,O=ce;return u(),m("div",ge,[e[28]||(e[28]=C('
',5)),a("div",_e,[(u(!0),m(h,null,k(r(R),(t,w)=>(u(),m("span",{key:w,style:S(t)},null,4))),128))]),a("div",ye,[a("div",Ve,[a("div",we,[(u(!0),m(h,null,k(r(D),(t,w)=>(u(),m("span",{key:w,style:S(t)},null,4))),128))]),e[14]||(e[14]=C('
迷毂
迷 毂
智 能 调 度 平 台
INTELLIGENT · DISPATCH · PLATFORM
',4)),a("ul",he,[(u(),m(h,null,k(I,t=>a("li",{key:t.title},[e[13]||(e[13]=a("span",{class:"dot"},null,-1)),a("div",ke,[a("span",Me,M(t.title),1),a("span",Pe,M(t.desc),1)])])),64))]),e[15]||(e[15]=a("div",{class:"hero-footnote"},[a("span",{class:"badge"},"v1.7"),a("span",null,"稳定 · 高效 · 安全的智能调度内核")],-1))]),a("div",Ee,[e[27]||(e[27]=a("div",{class:"panel-head"},[a("div",{class:"panel-title"},"登 录"),a("div",{class:"panel-sub"},"登录以进入智能调度平台")],-1)),s(O,{ref_key:"formRef",ref:g,model:l,rules:A,class:"glass-form","hide-required-asterisk":""},{default:o(()=>[s(i,{prop:"username"},{default:o(()=>[s(y,{modelValue:l.username,"onUpdate:modelValue":e[0]||(e[0]=t=>l.username=t),size:"large",placeholder:"用户名",autocomplete:"username",clearable:""},{prefix:o(()=>[s(n,null,{default:o(()=>[s(r(Z))]),_:1})]),_:1},8,["modelValue"])]),_:1}),s(i,{prop:"password"},{default:o(()=>[s(y,{modelValue:l.password,"onUpdate:modelValue":e[1]||(e[1]=t=>l.password=t),type:"password",size:"large","show-password":"",placeholder:"密码(Mock,任意非空)",autocomplete:"current-password"},{prefix:o(()=>[s(n,null,{default:o(()=>[s(r(ee))]),_:1})]),_:1},8,["modelValue"])]),_:1}),s(i,{prop:"scope",class:"scope-item"},{default:o(()=>[a("div",xe,[a("button",{type:"button",class:f(["scope-tab",{active:l.scope==="Platform"}]),onClick:e[2]||(e[2]=t=>l.scope="Platform")},[s(n,null,{default:o(()=>[s(r(ae))]),_:1}),e[16]||(e[16]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"管理员"),a("div",{class:"scope-desc"},"platform-vue · 全功能")],-1))],2),a("button",{type:"button",class:f(["scope-tab",{active:l.scope==="RCSMonitor"}]),onClick:e[3]||(e[3]=t=>l.scope="RCSMonitor")},[s(n,null,{default:o(()=>[s(r(se))]),_:1}),e[17]||(e[17]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"运营"),a("div",{class:"scope-desc"},"rcsmonitor-vue · 受限")],-1))],2)])]),_:1}),s(i,{prop:"launchMode",class:"scope-item launch-mode-item"},{default:o(()=>[a("div",Ce,[e[19]||(e[19]=a("span",{class:"launch-mode-title"},"SimpleLite 启动模式",-1)),s(q,{placement:"top"},{content:o(()=>[...e[18]||(e[18]=[a("div",{class:"launch-tip"},[a("div",null,[a("b",null,"本地+Web"),p(":登录后由 Platform 后端拉起 SimpleLite,同时打开桌面端 ImGui 窗口与浏览器端 webVRender。")]),a("div",null,[a("b",null,"仅 Web"),p(":只起 WebTerminal,不弹本地桌面窗口,适合远程办公 / 服务器部署。")])],-1)])]),default:o(()=>[s(n,{class:"launch-mode-help"},{default:o(()=>[s(r(oe))]),_:1})]),_:1})]),a("div",Se,[a("button",{type:"button",class:f(["scope-tab",{active:l.launchMode==="DesktopAndWeb"}]),onClick:e[4]||(e[4]=t=>l.launchMode="DesktopAndWeb")},[s(n,null,{default:o(()=>[s(r(le))]),_:1}),e[20]||(e[20]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"本地 + Web"),a("div",{class:"scope-desc"},"桌面窗口 & 浏览器同时启动")],-1))],2),a("button",{type:"button",class:f(["scope-tab",{active:l.launchMode==="WebOnly"}]),onClick:e[5]||(e[5]=t=>l.launchMode="WebOnly")},[s(n,null,{default:o(()=>[s(r(ne))]),_:1}),e[21]||(e[21]=a("div",{class:"scope-meta"},[a("div",{class:"scope-name"},"仅 Web"),a("div",{class:"scope-desc"},"不启桌面窗口 · 浏览器使用")],-1))],2)])]),_:1}),a("div",We,[s(T,{modelValue:l.remember,"onUpdate:modelValue":e[6]||(e[6]=t=>l.remember=t),size:"default",class:"remember"},{default:o(()=>[...e[22]||(e[22]=[p("下次自动按当前 scope 进入",-1)])]),_:1},8,["modelValue"]),s(U,{underline:"never",class:"adv-link",onClick:e[7]||(e[7]=t=>c.value=c.value.length?[]:["adv"])},{default:o(()=>[...e[23]||(e[23]=[p("高级 ›",-1)])]),_:1})]),s(B,{modelValue:c.value,"onUpdate:modelValue":e[12]||(e[12]=t=>c.value=t),class:"adv-collapse"},{default:o(()=>[s(F,{name:"adv"},{title:o(()=>[...e[24]||(e[24]=[a("span",{class:"adv-title"},"Web-Enabled · 端口与监听",-1)])]),default:o(()=>[a("div",$e,[s(i,{label:"监听地址"},{default:o(()=>[s(y,{modelValue:d.host,"onUpdate:modelValue":e[8]||(e[8]=t=>d.host=t),size:"default"},null,8,["modelValue"])]),_:1}),s(i,{label:"WebAPI"},{default:o(()=>[s(V,{modelValue:d.apiPort,"onUpdate:modelValue":e[9]||(e[9]=t=>d.apiPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1}),s(i,{label:"Platform"},{default:o(()=>[s(V,{modelValue:d.platformPort,"onUpdate:modelValue":e[10]||(e[10]=t=>d.platformPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1}),s(i,{label:"webVRender"},{default:o(()=>[s(V,{modelValue:d.vrPort,"onUpdate:modelValue":e[11]||(e[11]=t=>d.vrPort=t),min:1,max:65535,size:"default","controls-position":"right"},null,8,["modelValue"])]),_:1})])]),_:1})]),_:1},8,["modelValue"]),s(G,{type:"primary",loading:_.value,class:"btn-login",size:"large",onClick:N},{default:o(()=>[...e[25]||(e[25]=[p(" 登 录 ",-1)])]),_:1},8,["loading"]),e[26]||(e[26]=a("div",{class:"bottom-note"}," 任意非空用户名 + 任意密码即可登录;scope 决定进入 admin / monitor 视图;权限按 Mock 表生成。 ",-1))]),_:1},8,["model"])])]),a("div",ze," 迷 毂 · 智能调度平台 · "+M(L.value),1)])}}}),je=fe(Ie,[["__scopeId","data-v-a9a6f95c"]]);export{je as default}; diff --git a/MiGu.Server/wwwroot/assets/MapEditorView-DET9bUZJ.js b/MiGu.Server/wwwroot/assets/MapEditorView-Bf_sv8Aw.js similarity index 99% rename from MiGu.Server/wwwroot/assets/MapEditorView-DET9bUZJ.js rename to MiGu.Server/wwwroot/assets/MapEditorView-Bf_sv8Aw.js index 8453b2e..452d8e0 100644 --- a/MiGu.Server/wwwroot/assets/MapEditorView-DET9bUZJ.js +++ b/MiGu.Server/wwwroot/assets/MapEditorView-Bf_sv8Aw.js @@ -1 +1 @@ -import{aI as Ae,aE as U,aH as a,r as Xe,bJ as l,I as wa,aB as r,ag as ut,b9 as _,aG as y,K as ka,J as ha,bq as T,ak as Ne,a3 as xa,ai as de,bj as we,aC as ee,b3 as Se,aD as X,bI as fe,ac as Sa,bh as A,a9 as _a,Q as dt,bt as D,aV as _t,aZ as rt,Z as Va,R as ct,E as pt,N as Ft,O as Tt,S as It,z as Et,a8 as zt,aa as mt,ab as ft,ax as ne,ad as Pt,a4 as Ca,bg as Je,G as Mt,ah as $a,bu as Aa,a1 as Ut,a0 as Lt,x as Na,T as Bt,y as Fa,bx as yt,X as F,b6 as Dt,b4 as Rt,aF as Ta,b2 as Ia,b7 as jt,bv as Ea,b8 as za,bw as Pa,Y}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{W as Ma}from"./Workspace3D-B2WrMPji.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{h as Re,a as je,r as J,n as Ua}from"./reflection-C0K7EJ_N.js";/* empty css *//* empty css *//* empty css *//* empty css */import{m as j,a as st,b as it}from"./mapEdit-BiAzHHno.js";import{u as La}from"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const Ba={class:"edit-top-bar"},Da=Ae({__name:"EditTopBar",props:{canUndo:{type:Boolean},canRedo:{type:Boolean},saving:{type:Boolean},viewFilter:{}},emits:["cmd"],setup(n,{emit:N}){const g=N;function f(C){g("cmd",C)}function h(C){return C?"☑":"☐"}return(C,i)=>{const k=Xe,u=ha,z=ka,$=wa,p=ut;return _(),U("div",Ba,[a(k,{type:"primary",class:"topbar-save-btn",loading:n.saving,onClick:i[0]||(i[0]=m=>f("project.save"))},{default:l(()=>[...i[3]||(i[3]=[y(" 保存 ",-1)])]),_:1},8,["loading"]),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"file.import.dwg"},{default:l(()=>[...i[5]||(i[5]=[y("导入 .dwg/.dxf",-1)])]),_:1}),a(u,{command:"file.import.geojson"},{default:l(()=>[...i[6]||(i[6]=[y("导入 .geojson",-1)])]),_:1}),a(u,{command:"file.upload.image",divided:""},{default:l(()=>[...i[7]||(i[7]=[y("导入图片",-1)])]),_:1}),a(u,{command:"file.upload.model"},{default:l(()=>[...i[8]||(i[8]=[y("导入 CycleGUI 模型",-1)])]),_:1}),a(u,{command:"file.export.png",divided:""},{default:l(()=>[...i[9]||(i[9]=[y("导出 PNG",-1)])]),_:1}),a(u,{command:"file.export.svg"},{default:l(()=>[...i[10]||(i[10]=[y("导出 SVG",-1)])]),_:1}),a(u,{command:"file.export.json"},{default:l(()=>[...i[11]||(i[11]=[y("导出 JSON",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[4]||(i[4]=[y("导入",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.cut"},{default:l(()=>[...i[13]||(i[13]=[y("剪切 (Ctrl+X)",-1)])]),_:1}),a(u,{command:"edit.copy"},{default:l(()=>[...i[14]||(i[14]=[y("复制 (Ctrl+C)",-1)])]),_:1}),a(u,{command:"edit.paste"},{default:l(()=>[...i[15]||(i[15]=[y("粘贴 (Ctrl+V)",-1)])]),_:1}),a(u,{command:"edit.delete"},{default:l(()=>[...i[16]||(i[16]=[y("删除 (Del)",-1)])]),_:1}),a(u,{command:"edit.selectAll",divided:""},{default:l(()=>[...i[17]||(i[17]=[y("全选",-1)])]),_:1}),a(u,{command:"edit.invert"},{default:l(()=>[...i[18]||(i[18]=[y("反选",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[12]||(i[12]=[y("编辑",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.undo",disabled:!n.canUndo},{default:l(()=>[...i[20]||(i[20]=[y("撤销 (Ctrl+Z)",-1)])]),_:1},8,["disabled"]),a(u,{command:"edit.redo",disabled:!n.canRedo},{default:l(()=>[...i[21]||(i[21]=[y("重做 (Ctrl+Y)",-1)])]),_:1},8,["disabled"])]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[19]||(i[19]=[y("撤销",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"view.fitAll"},{default:l(()=>[...i[23]||(i[23]=[y("缩放至全屏",-1)])]),_:1}),a(u,{command:"view.fitSelection"},{default:l(()=>[...i[24]||(i[24]=[y("缩放至选中",-1)])]),_:1}),a(u,{command:"view.toggleGrid",divided:""},{default:l(()=>[...i[25]||(i[25]=[y("显示网格",-1)])]),_:1}),a(u,{command:"view.toggleScale"},{default:l(()=>[...i[26]||(i[26]=[y("显示比例尺",-1)])]),_:1}),a(u,{command:"view.toggle2D"},{default:l(()=>[...i[27]||(i[27]=[y("切换 2D / 3D",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[22]||(i[22]=[y("视图",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"layer.new"},{default:l(()=>[...i[29]||(i[29]=[y("新建图层…",-1)])]),_:1}),a(u,{command:"layer.toggleVisibility"},{default:l(()=>[...i[30]||(i[30]=[y("切换显示图层…",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[28]||(i[28]=[y("图层",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,{class:"topbar-filter-menu"},{default:l(()=>[a(u,{disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[32]||(i[32]=[y("选择(可拾取)",-1)])]),_:1}),a(u,{command:"view.select.sites"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.sites))+" 站点",1)]),_:1}),a(u,{command:"view.select.tracks"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.tracks))+" 路径",1)]),_:1}),a(u,{command:"view.select.cars"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.cars))+" AGV",1)]),_:1}),a(u,{command:"view.select.decor"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.decor))+" 区域 / 装饰",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[33]||(i[33]=[y("对齐(鼠标吸附)",-1)])]),_:1}),a(u,{command:"view.snap.sites"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.sites))+" 吸附站点",1)]),_:1}),a(u,{command:"view.snap.cars"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.cars))+" 吸附 AGV",1)]),_:1}),a(u,{command:"view.snap.tracks"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.tracks))+" 吸附路径",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[34]||(i[34]=[y("显示内容",-1)])]),_:1}),a(u,{command:"view.show.sceneLabels"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.sceneLabels))+" 场景图元标记",1)]),_:1}),a(u,{command:"view.show.scenePrimitives"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.scenePrimitives))+" 场景图元",1)]),_:1}),a(u,{command:"view.show.cars"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.cars))+" 车辆",1)]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[31]||(i[31]=[y("过滤",-1)])]),_:1})]),_:1}),i[37]||(i[37]=r("div",{class:"spacer"},null,-1)),a(p,{content:"撤销 (Ctrl+Z)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!n.canUndo,class:"topbar-icon-btn",onClick:i[1]||(i[1]=m=>f("edit.undo"))},{default:l(()=>[...i[35]||(i[35]=[y("↶",-1)])]),_:1},8,["disabled"])]),_:1}),a(p,{content:"重做 (Ctrl+Y)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!n.canRedo,class:"topbar-icon-btn",onClick:i[2]||(i[2]=m=>f("edit.redo"))},{default:l(()=>[...i[36]||(i[36]=[y("↷",-1)])]),_:1},8,["disabled"])]),_:1})])}}}),Ra=Ne(Da,[["__scopeId","data-v-1082d582"]]),ja={class:"edit-tool-rail"},Oa={class:"rail-group-title"},Ya={class:"rail-group-text"},Ka={class:"rail-group-list"},Ha=["onClick"],Xa={class:"rail-btn-glyph"},Wa={class:"rail-btn-label"},Ga={key:0,class:"rail-divider"},qa={class:"rail-group rail-group-ai"},Za=Ae({__name:"EditToolRail",props:{activeTool:{}},emits:["select-tool","open-ai"],setup(n,{emit:N}){const g=n,f=N,h=[{id:"select",title:"选择",tools:[{id:"select.single",label:"单选",glyph:"⌖",tip:"点击拾取单个对象"},{id:"select.rect",label:"矩形框选",glyph:"▱"},{id:"select.lasso",label:"套索圈选",glyph:"◯"},{id:"select.byType.site",label:"仅站点",glyph:"·"},{id:"select.byType.polyline",label:"仅折线",glyph:"╱",tip:"仅 UITrack(直线/折线)"},{id:"select.byType.bezier",label:"仅贝塞尔",glyph:"∽",tip:"仅 UIBezierTrack"},{id:"select.byType.arc",label:"仅弧形",glyph:"◜",tip:"仅 UICircularArcTrack"},{id:"select.byType.decor",label:"仅装饰",glyph:"★"},{id:"select.byType.currentLayer",label:"当前图层",glyph:"▤",tip:"保留当前图层对象"},{id:"select.invert",label:"反选",glyph:"⇄"},{id:"select.clear",label:"清空选中",glyph:"⊘"}]},{id:"draw",title:"绘制",tools:[{id:"draw.site",label:"添加站点",glyph:"+",tip:"点击工具后在画布单击放置"},{id:"draw.sites.continuous",label:"连续站点",glyph:"⁂",tip:"切换工具或 Esc 退出"},{id:"draw.track.polyline",label:"折线路径",glyph:"─",tip:"依序点击两端站点"},{id:"draw.track.bezier",label:"贝塞尔路径",glyph:"∼",tip:"点两端站点 → 弹框输入中间控制点个数 → 连续点选每个控制点"},{id:"draw.track.arc",label:"弧形路径",glyph:"◜",tip:"点两端站点 → 输入半径(≥ |AB|/2,等于即半圆)"},{id:"draw.decor.line",label:"装饰线段",glyph:"╱"},{id:"draw.decor.rect",label:"装饰矩形",glyph:"▭"},{id:"draw.decor.circle",label:"装饰圆",glyph:"◯"},{id:"draw.decor.text",label:"装饰文本",glyph:"T"},{id:"draw.image",label:"插入图片",glyph:"🖼"},{id:"draw.model",label:"插入模型",glyph:"◎",tip:"CycleGUI 3D 模型 (obj/glb/gltf)"}]},{id:"transform",title:"变换",tools:[{id:"transform.move",label:"移动",glyph:"✥"},{id:"transform.rotate",label:"旋转",glyph:"⟳"},{id:"transform.scale",label:"缩放",glyph:"⤡"},{id:"transform.duplicate",label:"复制副本",glyph:"⎘",tip:"Ctrl+D"},{id:"transform.copy",label:"复制",glyph:"📋",tip:"Ctrl+C"},{id:"transform.paste",label:"粘贴",glyph:"📥",tip:"Ctrl+V"},{id:"transform.delete",label:"删除",glyph:"🗑",tip:"Delete"},{id:"transform.copyFields",label:"复制字段",glyph:"⇉",tip:"多选时第 1 个为源,其余为目标"}]},{id:"align",title:"对齐",tools:[{id:"align.left",label:"左对齐",glyph:"⫷"},{id:"align.right",label:"右对齐",glyph:"⫸"},{id:"align.top",label:"上对齐",glyph:"⫵"},{id:"align.bottom",label:"下对齐",glyph:"⫶"},{id:"align.centerH",label:"水平居中",glyph:"⇔"},{id:"align.centerV",label:"垂直居中",glyph:"⇕"},{id:"align.center",label:"整体居中",glyph:"⊕"},{id:"align.distributeH",label:"水平等距",glyph:"⇿"},{id:"align.distributeV",label:"垂直等距",glyph:"⇳"},{id:"align.toFirst",label:"对齐到首",glyph:"⏮"},{id:"align.toLast",label:"对齐到尾",glyph:"⏭"}]},{id:"batch",title:"批量生成",tools:[{id:"batch.linearH",label:"横向间距",glyph:"⇢"},{id:"batch.linearV",label:"纵向间距",glyph:"⇣"},{id:"batch.matrix",label:"矩阵生成",glyph:"#"},{id:"batch.alongPath",label:"沿路径采样",glyph:"⤳",tip:"先选 1+ 条路径,再点本工具"},{id:"batch.circular",label:"环形阵列",glyph:"◌"}]},{id:"show",title:"显示",tools:[{id:"show.controlPoints",label:"控制点",glyph:"⊙"},{id:"show.controlHandles",label:"控制柄",glyph:"⊝"}]}];function C(k){return k===g.activeTool}function i(k){f("select-tool",k)}return(k,u)=>{const z=ut,$=xa;return _(),U("div",ja,[a($,{class:"rail-scroll"},{default:l(()=>[(_(),U(de,null,we(h,(p,m)=>r("div",{key:p.id,class:"rail-group"},[r("div",Oa,[u[1]||(u[1]=r("span",{class:"rail-group-bar"},null,-1)),r("span",Ya,T(p.title),1),u[2]||(u[2]=r("span",{class:"rail-group-bar"},null,-1))]),r("div",Ka,[(_(!0),U(de,null,we(p.tools,M=>(_(),ee(z,{key:M.id,content:M.tip??M.label,placement:"right","show-after":280},{default:l(()=>[r("button",{class:Se(["rail-btn",{"rail-btn--active":C(M.id)}]),onClick:I=>i(M.id)},[r("span",Xa,T(M.glyph),1),r("span",Wa,T(M.label),1)],10,Ha)]),_:2},1032,["content"]))),128))]),mf("open-ai"))},[...u[3]||(u[3]=[r("span",{class:"rail-btn-glyph"},"✦",-1),r("span",{class:"rail-btn-label"},"AI 生图",-1)])])])]),_:1})])}}}),Ja=Ne(Za,[["__scopeId","data-v-6b284dea"]]),Qa={class:"edit-property-panel"},el={key:0,class:"empty-hint"},tl={key:1,class:"loading-hint"},al={key:2,class:"object-pane"},ll={class:"prop-card prop-card--header"},nl={class:"prop-card-row"},ol={class:"prop-id-block"},sl={class:"prop-id-tag"},il={class:"prop-type-tag"},rl={class:"prop-header-actions"},ul=["disabled"],dl={class:"prop-delete-icon"},cl={class:"prop-card-row prop-name-row"},pl={class:"prop-card-row prop-layer-row"},ml={key:0,class:"prop-card prop-card--geom"},fl={class:"prop-card-header"},yl=["title"],vl={class:"prop-card-flag-text"},bl={class:"prop-card-meta"},gl={class:"prop-grid"},wl={class:"prop-field-label"},kl={key:0,class:"prop-field-unit"},hl={key:1,class:"prop-card prop-card--style"},xl={class:"prop-card-header"},Sl={class:"prop-card-meta"},_l={class:"prop-grid"},Vl={class:"prop-field-label"},Cl={class:"prop-card prop-card--custom"},$l={class:"prop-card-header"},Al={class:"prop-card-meta"},Nl={key:0,class:"prop-grid"},Fl=["title"],Tl={class:"prop-field-row"},Il=["onClick"],El={key:1,class:"prop-empty-row"},zl={key:2,class:"prop-card prop-card--status"},Pl={class:"prop-card-header"},Ml={class:"prop-card-meta"},Ul={class:"prop-status-list"},Ll={class:"prop-status-key"},Bl=["title"],Dl={key:3,class:"prop-card prop-card--actions"},Rl={class:"prop-card-header"},jl={class:"prop-card-meta"},Ol={class:"prop-actions"},Yl=["disabled","onClick"],Kl={key:0,class:"prop-action-spinner"},Hl={class:"prop-action-label"},Xl={class:"defaults-pane"},Wl={key:0,class:"empty-hint defaults-empty"},Gl={class:"prop-card prop-card--style"},ql={class:"prop-card-header"},Zl={class:"prop-card-flag-text"},Jl={class:"prop-card"},Ql={class:"prop-card prop-card--style"},en={class:"prop-card-header"},tn={class:"prop-card-flag-text"},an={class:"prop-card"},ln={key:3,class:"loading-hint"},nn=Ae({__name:"EditPropertyPanel",props:{selectionCount:{},primary:{},fields:{},status:{},methods:{},loading:{type:Boolean},layers:{},defaults:{},layerRows:{},selectionKind:{},viewportStyle:{},viewportStyleLoading:{type:Boolean},viewportSyncing:{type:Boolean}},emits:["rename","change-layer","set-field","add-field","exec-action","save-defaults","layer-toggle","add-layer","delete","patch-viewport"],setup(n,{emit:N}){const g=n,f=N,h=A("object"),C=A(!1);let i=null;const k=A(null),u=A(null);fe(()=>g.viewportStyle,b=>{if(!b){k.value=null,u.value=null;return}k.value={...b.site},u.value={...b.track}},{immediate:!0,deep:!0}),fe(()=>g.selectionKind,b=>{(b==="site"||b==="track")&&(h.value="defaults")});function z(){C.value=!0,i&&clearTimeout(i),i=setTimeout(()=>{C.value=!1},1400)}fe(()=>g.viewportSyncing,(b,d)=>{d&&!b&&z()});function $(b){k.value&&(k.value={...k.value,...b},f("patch-viewport",{site:{...k.value}}))}function p(b){u.value&&(u.value={...u.value,...b},f("patch-viewport",{track:{...u.value}}))}const m=A(null),M=A(""),I=A(!1),v=A(!1);let q=null;function Q(){v.value=!0,q&&clearTimeout(q),q=setTimeout(()=>{v.value=!1},1200)}const ye=new Set(["id","name","layerName"]),W=new Set(["x","y","z","cx","cy","cz","dx","dy","dz","sx","sy","ex","ey","startX","startY","endX","endY","size","width","height","depth","angle","rotation","theta","scale","radius","r","siteA","siteB"]),ve=new Set(["color","displaySetting","direction","typeInfo","mustFree","imagePath","modelPath","fontFamily","fontSize","textColor","lineWidth","opacity"]),O={x:"X",y:"Y",z:"Z",size:"大小",width:"宽",height:"高",depth:"厚",angle:"角度",rotation:"旋转",theta:"θ",scale:"缩放",radius:"半径",siteA:"起点站",siteB:"终点站",startX:"起点 X",startY:"起点 Y",endX:"终点 X",endY:"终点 Y",cx:"中心 X",cy:"中心 Y",color:"颜色",displaySetting:"显示设置",direction:"方向",typeInfo:"类型信息",mustFree:"必须互斥",imagePath:"图片路径",modelPath:"模型路径",fontSize:"字号",textColor:"文字色",lineWidth:"线宽",opacity:"透明度"},se={x:"mm",y:"mm",z:"mm",cx:"mm",cy:"mm",cz:"mm",dx:"mm",dy:"mm",dz:"mm",startX:"mm",startY:"mm",endX:"mm",endY:"mm",width:"mm",height:"mm",depth:"mm",size:"mm",radius:"mm",angle:"°",rotation:"°",theta:"°",fontSize:"px",lineWidth:"px"},ie=ne(()=>g.fields.filter(b=>!ye.has(b.key))),te=ne(()=>ie.value.filter(b=>W.has(b.key))),x=ne(()=>ie.value.filter(b=>ve.has(b.key))),V=ne(()=>ie.value.filter(b=>!W.has(b.key)&&!ve.has(b.key)));function G(b){return O[b]??b}function oe(b){return se[b]??""}function ke(b){if(b==null||b==="")return;const d=Number(b);return Number.isFinite(d)?d:void 0}function re(b){return b.toLowerCase().includes("angle")||b.toLowerCase().includes("rotation")||b==="theta"?1:b==="scale"||b==="opacity"?.1:10}function ce(b){return W.has(b)}function _e(b,d){return b==="color"||b==="textColor"?!0:/^#[0-9a-fA-F]{3,8}$/.test(d)}function B(b,d){return d==="true"||d==="false"||d==="True"||d==="False"}function K(b){return b==="true"||b==="True"||b==="1"}const Z=ne(()=>{const b=(g.primary?.status??"").toLowerCase();return b?b.includes("error")||b.includes("alarm")||b.includes("failed")?"danger":b.includes("warn")||b.includes("idle")?"warning":b.includes("online")||b.includes("running")||b.includes("ready")||b.includes("ok")?"success":"info":"info"}),he=A("");fe(()=>g.primary?.name??"",b=>{he.value=b},{immediate:!0});function Qe(){Oe()}function Oe(){if(!g.primary)return;const b=he.value;b!==(g.primary.name??"")&&f("rename",b)}function Fe(b){f("change-layer",b)}function ae(b,d){f("set-field",b,d),W.has(b)&&Q()}function Ye(){f("add-field")}async function We(b){try{m.value=b,f("exec-action",b)}finally{m.value=null}}function Te(){f("save-defaults")}function Ie(b){f("layer-toggle",b)}function xe(){const b=M.value.trim();b&&(f("add-layer",b),M.value="")}function Ee(){g.selectionCount===0||I.value||(I.value=!0,f("delete"),setTimeout(()=>{I.value=!1},600))}return(b,d)=>{const ze=dt,ue=Pt,Pe=ut,be=ct,Ge=Va,Me=Ca,pe=It,ge=Et,Ue=zt,Le=_a,et=pt,H=Tt,Ve=Ft,Be=Xe,Ce=ft,qe=mt,tt=Sa;return _(),U("div",Qa,[a(tt,{modelValue:h.value,"onUpdate:modelValue":d[20]||(d[20]=c=>h.value=c),class:"prop-tabs"},{default:l(()=>[a(Le,{label:"对象",name:"object"},{default:l(()=>[n.selectionCount===0?(_(),U("div",el,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[21]||(d[21]=r("span",{class:"empty-title"},"未选中对象",-1)),d[22]||(d[22]=r("span",{class:"empty-desc"},"在画布上点击或框选以编辑属性。",-1))])):n.loading?(_(),U("div",tl,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[23]||(d[23]=r("span",null,"加载属性…",-1))])):(_(),U("div",al,[r("section",ll,[r("div",nl,[r("div",ol,[r("span",sl,T(n.selectionCount>1?`多选 ${n.selectionCount}`:`#${n.primary?.id??"-"}`),1),r("span",il,T(n.primary?.typeName??"-"),1)]),r("div",rl,[n.primary?.status?(_(),ee(ue,{key:0,type:Z.value,size:"small",effect:"dark",class:"prop-status-tag"},{default:l(()=>[y(T(n.primary.status),1)]),_:1},8,["type"])):X("",!0),a(Pe,{content:n.selectionCount>1?`删除选中的 ${n.selectionCount} 个对象(可 Ctrl+Z 撤销)`:"删除该对象(可 Ctrl+Z 撤销)",placement:"top","show-after":220},{default:l(()=>[r("button",{type:"button",class:"prop-delete-btn",disabled:I.value,onClick:Ee},[r("span",dl,T(I.value?"⟳":"🗑"),1),d[24]||(d[24]=r("span",null,"删除",-1))],8,ul)]),_:1},8,["content"])])]),r("div",cl,[d[25]||(d[25]=r("label",{class:"prop-name-label"},"名称",-1)),n.primary?(_(),ee(be,{key:0,"model-value":he.value,size:"small",placeholder:"对象名","onUpdate:modelValue":d[0]||(d[0]=c=>he.value=c),onBlur:Qe,onChange:Oe},null,8,["model-value"])):X("",!0)]),r("div",pl,[d[26]||(d[26]=r("label",{class:"prop-name-label"},"图层",-1)),n.primary?(_(),ee(Me,{key:0,"model-value":n.primary.layer??"",size:"small",placeholder:"—",class:"prop-layer-select","onUpdate:modelValue":d[1]||(d[1]=c=>Fe(c))},{default:l(()=>[a(Ge,{label:"(无)",value:""}),(_(!0),U(de,null,we(n.layers,c=>(_(),ee(Ge,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["model-value"])):X("",!0)])]),te.value.length>0?(_(),U("section",ml,[r("header",fl,[d[28]||(d[28]=r("span",{class:"prop-card-title"},"位置 / 几何",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":v.value}]),title:v.value?"已同步到画布":"改动会立即同步到 SimpleLite 画布"},[d[27]||(d[27]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",vl,T(v.value?"已同步":"同步到画布"),1)],10,yl),r("span",bl,T(te.value.length)+" 项",1)]),r("div",gl,[(_(!0),U(de,null,we(te.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",wl,[y(T(G(c.key))+" ",1),oe(c.key)?(_(),U("span",kl,T(oe(c.key)),1)):X("",!0)]),ce(c.key)?(_(),ee(pe,{key:0,"model-value":ke(c.value),controls:!1,step:re(c.key),size:"small",class:"prop-field-num",onChange:R=>ae(c.key,R==null?"":String(R))},null,8,["model-value","step","onChange"])):(_(),ee(be,{key:1,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):X("",!0),x.value.length>0?(_(),U("section",hl,[r("header",xl,[d[29]||(d[29]=r("span",{class:"prop-card-title"},"样式 / 外观",-1)),r("span",Sl,T(x.value.length)+" 项",1)]),r("div",_l,[(_(!0),U(de,null,we(x.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",Vl,T(G(c.key)),1),_e(c.key,c.value)?(_(),ee(ge,{key:0,"model-value":c.value||"#ffffff","show-alpha":"",size:"small",onChange:R=>ae(c.key,R??"")},null,8,["model-value","onChange"])):B(c.key,c.value)?(_(),ee(Ue,{key:1,"model-value":K(c.value),size:"small",onChange:R=>ae(c.key,R?"true":"false")},null,8,["model-value","onChange"])):(_(),ee(be,{key:2,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):X("",!0),r("section",Cl,[r("header",$l,[d[30]||(d[30]=r("span",{class:"prop-card-title"},"其它字段 / 自定义",-1)),r("span",Al,T(V.value.length)+" 项",1)]),V.value.length>0?(_(),U("div",Nl,[(_(!0),U(de,null,we(V.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item prop-grid-item--wide"},[r("label",{class:"prop-field-label",title:c.key},T(c.key),9,Fl),r("div",Tl,[a(be,{"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]),a(Pe,{content:"删除该字段",placement:"top"},{default:l(()=>[r("button",{class:"prop-field-icon-btn",onClick:R=>ae(c.key,"")},"×",8,Il)]),_:2},1024)])]))),128))])):(_(),U("div",El,"无其它字段")),r("button",{class:"prop-add-field-btn",onClick:Ye},"+ 添加字段")]),n.status.length>0?(_(),U("section",zl,[r("header",Pl,[d[31]||(d[31]=r("span",{class:"prop-card-title"},"运行状态",-1)),r("span",Ml,T(n.status.length)+" 项",1)]),r("div",Ul,[(_(!0),U(de,null,we(n.status,c=>(_(),U("div",{key:c.key,class:"prop-status-item"},[r("span",Ll,T(c.key),1),r("span",{class:"prop-status-value",title:c.value},T(c.value),9,Bl)]))),128))])])):X("",!0),n.methods.length>0?(_(),U("section",Dl,[r("header",Rl,[d[32]||(d[32]=r("span",{class:"prop-card-title"},"操作",-1)),r("span",jl,T(n.methods.length)+" 项",1)]),r("div",Ol,[(_(!0),U(de,null,we(n.methods,c=>(_(),ee(Pe,{key:c.methodName,content:c.description||c.label||c.methodName,placement:"top","show-after":220},{default:l(()=>[r("button",{class:"prop-action-btn",disabled:m.value===c.methodName,onClick:R=>We(c.methodName)},[m.value===c.methodName?(_(),U("span",Kl,"⟳")):X("",!0),d[33]||(d[33]=r("span",{class:"prop-action-icon"},"▶",-1)),r("span",Hl,T(c.label||c.methodName),1)],8,Yl)]),_:2},1032,["content"]))),128))])])):X("",!0)]))]),_:1}),a(Le,{label:"类型默认",name:"defaults"},{default:l(()=>[r("div",Xl,[a(et,{type:"info",closable:!1,class:"defaults-alert"},{default:l(()=>[...d[34]||(d[34]=[y(" 视口样式与 SimpleLite「视口样式」对话框同步,修改后即时重绘画布;下方「新建默认」仅影响下次创建对象。 ",-1)])]),_:1}),n.selectionKind?n.selectionKind==="site"&&k.value?(_(),U(de,{key:1},[r("section",Gl,[r("header",ql,[d[38]||(d[38]=r("span",{class:"prop-card-title"},"站点视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":C.value}])},[d[37]||(d[37]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",Zl,T(n.viewportSyncing?"同步中…":C.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"整体大小倍率"},{default:l(()=>[a(pe,{"model-value":k.value.drawScale,min:.25,max:12,step:.1,controls:!0,"onUpdate:modelValue":d[2]||(d[2]=c=>$({drawScale:c??k.value.drawScale}))},null,8,["model-value"])]),_:1}),a(H,{label:"未选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusNormal,min:1,max:24,step:.5,"onUpdate:modelValue":d[3]||(d[3]=c=>$({dotRadiusNormal:c??k.value.dotRadiusNormal}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusSelected,min:1,max:32,step:.5,"onUpdate:modelValue":d[4]||(d[4]=c=>$({dotRadiusSelected:c??k.value.dotRadiusSelected}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中环半径 (m)"},{default:l(()=>[a(pe,{"model-value":k.value.selectionRingM,min:.02,max:.8,step:.01,"onUpdate:modelValue":d[5]||(d[5]=c=>$({selectionRingM:c??k.value.selectionRingM}))},null,8,["model-value"])]),_:1}),a(H,{label:"站点颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorNormalArgb),"onUpdate:modelValue":d[6]||(d[6]=c=>$({colorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"站点颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorSelectedArgb),"onUpdate:modelValue":d[7]||(d[7]=c=>$({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1}),a(H,{label:"标签颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorNormalArgb),"onUpdate:modelValue":d[8]||(d[8]=c=>$({labelColorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"标签颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorSelectedArgb),"onUpdate:modelValue":d[9]||(d[9]=c=>$({labelColorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",Jl,[d[40]||(d[40]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建站点默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:n.defaults.site.layer,"onUpdate:modelValue":d[10]||(d[10]=c=>n.defaults.site.layer=c)},null,8,["modelValue"])]),_:1}),a(H,{label:"名字前缀"},{default:l(()=>[a(be,{modelValue:n.defaults.site.namePrefix,"onUpdate:modelValue":d[11]||(d[11]=c=>n.defaults.site.namePrefix=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[39]||(d[39]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):n.selectionKind==="track"&&u.value?(_(),U(de,{key:2},[r("section",Ql,[r("header",en,[d[42]||(d[42]=r("span",{class:"prop-card-title"},"路径视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":C.value}])},[d[41]||(d[41]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",tn,T(n.viewportSyncing?"同步中…":C.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"线宽倍率"},{default:l(()=>[a(pe,{"model-value":u.value.drawScale,min:.25,max:12,step:.1,"onUpdate:modelValue":d[12]||(d[12]=c=>p({drawScale:c??u.value.drawScale}))},null,8,["model-value"])]),_:1}),a(H,{label:"未选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthNormal,min:.4,max:8,step:.1,"onUpdate:modelValue":d[13]||(d[13]=c=>p({widthNormal:c??u.value.widthNormal}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthSelected,min:.4,max:12,step:.1,"onUpdate:modelValue":d[14]||(d[14]=c=>p({widthSelected:c??u.value.widthSelected}))},null,8,["model-value"])]),_:1}),a(H,{label:"显示方向箭头"},{default:l(()=>[a(Ue,{"model-value":u.value.showDirectionArrows,"onUpdate:modelValue":d[15]||(d[15]=c=>p({showDirectionArrows:!!c}))},null,8,["model-value"])]),_:1}),a(H,{label:"路径颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorNormalArgb),"onUpdate:modelValue":d[16]||(d[16]=c=>p({colorNormalArgb:D(Re)(c??"#00ffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"路径颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorSelectedArgb),"onUpdate:modelValue":d[17]||(d[17]=c=>p({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",an,[d[44]||(d[44]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建路径默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:n.defaults.track.layer,"onUpdate:modelValue":d[18]||(d[18]=c=>n.defaults.track.layer=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[43]||(d[43]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):n.viewportStyleLoading?(_(),U("div",ln,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[45]||(d[45]=r("span",null,"加载视口样式…",-1))])):X("",!0):(_(),U("div",Wl,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[35]||(d[35]=r("span",{class:"empty-title"},"请选中站点或路径",-1)),d[36]||(d[36]=r("span",{class:"empty-desc"},"在画布上选中一个站点或路径后,可在此调整对应视口样式。",-1))]))])]),_:1}),a(Le,{label:"图层",name:"layers"},{default:l(()=>[a(qe,{data:n.layerRows,size:"small",class:"layer-table"},{default:l(()=>[a(Ce,{prop:"name",label:"图层",width:"120"}),a(Ce,{label:"可见",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.visible,"onUpdate:modelValue":R=>c.visible=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"可选",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.selectable,"onUpdate:modelValue":R=>c.selectable=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"颜色"},{default:l(({row:c})=>[a(ge,{modelValue:c.color,"onUpdate:modelValue":R=>c.color=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1})]),_:1},8,["data"]),a(be,{modelValue:M.value,"onUpdate:modelValue":d[19]||(d[19]=c=>M.value=c),size:"small",placeholder:"新图层名",class:"new-layer"},{append:l(()=>[a(Be,{onClick:xe},{default:l(()=>[...d[46]||(d[46]=[y("添加",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["modelValue"])])}}}),on=Ne(nn,[["__scopeId","data-v-781515fe"]]),sn={class:"edit-status-bar"},rn={class:"seg"},un={class:"seg"},dn={class:"seg"},cn={class:"seg"},pn={class:"seg"},mn={key:0,class:"seg ok"},fn={key:1,class:"seg warn"},yn=Ae({__name:"EditStatusBar",props:{selectedCount:{},mouseX:{},mouseY:{},toolLabel:{},snapOn:{type:Boolean},undoSize:{},redoSize:{},connected:{type:Boolean}},setup(n){function N(g){return Number.isFinite(g)?g.toFixed(0):"--"}return(g,f)=>(_(),U("div",sn,[r("span",rn,[f[0]||(f[0]=y(" 选中 ",-1)),r("b",null,T(n.selectedCount),1),f[1]||(f[1]=y(" 个 ",-1))]),r("span",un," 鼠标 ("+T(N(n.mouseX))+", "+T(N(n.mouseY))+") mm ",1),r("span",dn,[f[2]||(f[2]=y(" 当前工具:",-1)),r("b",null,T(n.toolLabel),1)]),r("span",cn,[f[3]||(f[3]=y(" 吸附:",-1)),r("b",{class:Se({on:n.snapOn,off:!n.snapOn})},T(n.snapOn?"开":"关"),3)]),f[4]||(f[4]=r("span",{class:"spacer"},null,-1)),r("span",pn,"历史 "+T(n.undoSize)+" / "+T(n.redoSize),1),n.connected?(_(),U("span",mn,"● 实时通道在线")):(_(),U("span",fn,"● 实时通道断开"))]))}}),vn=Ne(yn,[["__scopeId","data-v-6254b10f"]]),bn={class:"upload-hint"},gn={key:0,class:"ai-text"},wn={class:"ai-stat"},kn=Ae({__name:"AiGenerateDialog",props:{modelValue:{type:Boolean},configured:{type:Boolean},defaultBounds:{},defaultLayer:{}},emits:["update:modelValue","generated"],setup(n,{emit:N}){const g=n,f=N,h=yt(),C=A(!1),i=A(null),k=A(["r"]),u=Je({prompt:"",mode:"sites+tracks",referenceImageBase64:void 0,layer:g.defaultLayer??"ai-generated",constraints:""}),z=A(g.defaultBounds??[-1e4,-1e4,1e4,1e4]);fe(()=>g.defaultBounds,I=>{I&&(z.value=I)}),fe(()=>g.defaultLayer,I=>{I&&(u.layer=I)});function $(){f("update:modelValue",!1)}function p(){f("update:modelValue",!1),h.push("/admin/config/system")}async function m(I){if(!I.raw)return;const v=new FileReader;v.onload=()=>{const q=String(v.result||""),Q=q.includes(",")?q.split(",",2)[1]:q;u.referenceImageBase64=Q},v.readAsDataURL(I.raw)}async function M(){try{C.value=!0,u.bounds=z.value;const I=await j.aiMapGenerate(u);i.value=I,F.success(`AI 已生成 ${I.created?.length??0} 个对象`),f("generated",I)}catch(I){F.error(`AI 生图失败:${I.message}`)}finally{C.value=!1}}return(I,v)=>{const q=Bt,Q=pt,ye=ct,W=Tt,ve=dt,O=$a,se=Lt,ie=Ut,te=It,x=Ft,V=ft,G=Pt,oe=mt,ke=Fa,re=Na,ce=Xe,_e=Mt;return _(),ee(_e,{"model-value":n.modelValue,title:"AI 生图",width:"640px",class:"ai-generate-dialog","onUpdate:modelValue":v[9]||(v[9]=B=>f("update:modelValue",B)),onClose:$},{footer:l(()=>[a(ce,{onClick:$},{default:l(()=>[...v[20]||(v[20]=[y("关闭",-1)])]),_:1}),a(ce,{type:"primary",loading:C.value,disabled:!u.prompt.trim()||!n.configured,onClick:M},{default:l(()=>[...v[21]||(v[21]=[y(" 生成并落地 ",-1)])]),_:1},8,["loading","disabled"])]),default:l(()=>[n.configured?X("",!0):(_(),ee(Q,{key:0,type:"warning",closable:!1,class:"cfg-alert"},{default:l(()=>[v[11]||(v[11]=y(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(q,{type:"primary",onClick:p},{default:l(()=>[...v[10]||(v[10]=[y("系统级配置 → AI 服务",-1)])]),_:1}),v[12]||(v[12]=y(" 完成配置。 ",-1))]),_:1})),a(x,{"label-width":"100px",size:"default"},{default:l(()=>[a(W,{label:"提示词",required:""},{default:l(()=>[a(ye,{modelValue:u.prompt,"onUpdate:modelValue":v[0]||(v[0]=B=>u.prompt=B),type:"textarea",rows:4,placeholder:"一条 U 型生产线,含 5 个工站,间距 2m,方向单向通行..."},null,8,["modelValue"])]),_:1}),a(W,{label:"参考图片"},{default:l(()=>[a(O,{drag:"","auto-upload":!1,"show-file-list":!1,accept:"image/*",onChange:m},{default:l(()=>[r("div",bn,[a(ve,null,{default:l(()=>[a(D(Aa))]),_:1}),r("span",null,T(u.referenceImageBase64?"已选择图片 (点击替换)":"拖入或点击上传参考图(可选,多模态)"),1)])]),_:1})]),_:1}),a(W,{label:"生成模式"},{default:l(()=>[a(ie,{modelValue:u.mode,"onUpdate:modelValue":v[1]||(v[1]=B=>u.mode=B)},{default:l(()=>[a(se,{value:"sites"},{default:l(()=>[...v[13]||(v[13]=[y("仅站点",-1)])]),_:1}),a(se,{value:"tracks"},{default:l(()=>[...v[14]||(v[14]=[y("仅路径",-1)])]),_:1}),a(se,{value:"sites+tracks"},{default:l(()=>[...v[15]||(v[15]=[y("站点+路径",-1)])]),_:1}),a(se,{value:"full"},{default:l(()=>[...v[16]||(v[16]=[y("完整地图",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(W,{label:"范围 (mm)"},{default:l(()=>[a(te,{modelValue:z.value[0],"onUpdate:modelValue":v[2]||(v[2]=B=>z.value[0]=B),placeholder:"x1",step:500},null,8,["modelValue"]),a(te,{modelValue:z.value[1],"onUpdate:modelValue":v[3]||(v[3]=B=>z.value[1]=B),placeholder:"y1",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[2],"onUpdate:modelValue":v[4]||(v[4]=B=>z.value[2]=B),placeholder:"x2",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[3],"onUpdate:modelValue":v[5]||(v[5]=B=>z.value[3]=B),placeholder:"y2",step:500,class:"ml"},null,8,["modelValue"])]),_:1}),a(W,{label:"图层"},{default:l(()=>[a(ye,{modelValue:u.layer,"onUpdate:modelValue":v[6]||(v[6]=B=>u.layer=B),placeholder:"ai-generated(默认)"},null,8,["modelValue"])]),_:1}),a(W,{label:"附加约束"},{default:l(()=>[a(ye,{modelValue:u.constraints,"onUpdate:modelValue":v[7]||(v[7]=B=>u.constraints=B),placeholder:"例如:单向通行、最小转弯半径 1500mm"},null,8,["modelValue"])]),_:1})]),_:1}),i.value?(_(),ee(re,{key:1,modelValue:k.value,"onUpdate:modelValue":v[8]||(v[8]=B=>k.value=B),class:"result-panel"},{default:l(()=>[a(ke,{title:"AI 返回 / 落地结果",name:"r"},{default:l(()=>[i.value.assistantText?(_(),U("div",gn,T(i.value.assistantText),1)):X("",!0),r("div",wn,[v[17]||(v[17]=y(" 落地对象 ",-1)),r("b",null,T(i.value.created?.length??0),1),v[18]||(v[18]=y(",工具调用次数 ",-1)),r("b",null,T(i.value.usedTools),1),v[19]||(v[19]=y("。 ",-1))]),a(oe,{data:i.value.created??[],size:"small","max-height":"220"},{default:l(()=>[a(V,{label:"工具",prop:"tool",width:"160"}),a(V,{label:"kind",prop:"kind",width:"80"}),a(V,{label:"id",prop:"id",width:"80"}),a(V,{label:"typeName",prop:"typeName"}),a(V,{label:"错误"},{default:l(({row:B})=>[B.error?(_(),ee(G,{key:0,type:"danger",size:"small"},{default:l(()=>[y(T(B.error),1)]),_:2},1024)):X("",!0)]),_:1})]),_:1},8,["data"])]),_:1})]),_:1},8,["modelValue"])):X("",!0)]),_:1},8,["model-value"])}}}),hn=Ne(kn,[["__scopeId","data-v-94799737"]]),xn={key:0,class:"aap-empty"},Sn=["onClick"],_n={class:"aap-bubble"},Vn={class:"aap-bubble-text"},Cn={key:0,class:"aap-meta"},$n={key:1,class:"aap-msg aap-msg--assistant"},An={class:"aap-bubble aap-bubble--loading"},Nn={class:"aap-toolbar"},Fn={class:"aap-input"},Vt=300,Ct=720,$t="mapEditor.aiAssistant.mode",Tn=Ae({__name:"AiAssistantPanel",props:{open:{type:Boolean},configured:{type:Boolean},width:{},defaultBounds:{},defaultLayer:{}},emits:["update:open","update:width","generated"],setup(n,{emit:N}){const g=n,f=N,h=ne(()=>Math.min(Ct,Math.max(Vt,g.width??360))),C=yt(),i=A([]),k=A(""),u=A(!1),z=A(null);function $(){const x=localStorage.getItem($t);return x==="sites"||x==="tracks"||x==="sites+tracks"||x==="full"?x:"sites+tracks"}const p=A($());fe(p,x=>{try{localStorage.setItem($t,x)}catch{}});let m=!1,M=0,I=0;function v(x){m=!0,M=x.clientX,I=h.value,x.currentTarget.setPointerCapture?.(x.pointerId),x.preventDefault()}function q(x){if(!m)return;const V=Math.min(Ct,Math.max(Vt,I+(M-x.clientX)));f("update:width",V)}function Q(x){m&&(m=!1,x.currentTarget.releasePointerCapture?.(x.pointerId))}Dt(()=>{m=!1});const ye=["生成一条横向直线,5 个站点,间距 2000mm","画一个 3×3 的站点矩阵,间距 2500mm","一条 U 型产线,含 5 个工站,单向通行"];function W(){f("update:open",!1)}function ve(){W(),C.push("/admin/config/system")}function O(x){k.value=x}function se(x){x instanceof KeyboardEvent&&x.key==="Enter"&&!x.shiftKey&&!x.isComposing&&(x.preventDefault(),te())}async function ie(){await Ia();const x=z.value;x&&(x.scrollTop=x.scrollHeight)}async function te(){const x=k.value.trim();if(!(!x||u.value||!g.configured)){i.value.push({role:"user",text:x}),k.value="",ie(),u.value=!0;try{const V={prompt:x,mode:p.value,bounds:g.defaultBounds,layer:g.defaultLayer},G=await j.aiMapGenerate(V),oe=G.created?.length??0;i.value.push({role:"assistant",text:G.assistantText?.trim()||`已根据你的描述生成并落地 ${oe} 个对象。`,meta:{created:oe,usedTools:G.usedTools??0}}),f("generated",G)}catch(V){const G=V.message;i.value.push({role:"assistant",text:`生成失败:${G}`}),F.error(`AI 助手生成失败:${G}`)}finally{u.value=!1,ie()}}}return(x,V)=>{const G=Bt,oe=pt,ke=dt,re=Lt,ce=Ut,_e=ct,B=Xe;return _(),U("div",{class:Se(["ai-assistant-panel",{"is-open":n.open}]),style:Rt({width:h.value+"px"}),role:"complementary","aria-label":"AI 助手"},[r("div",{class:"aap-resizer",title:"拖拽调整宽度",onPointerdown:v,onPointermove:q,onPointerup:Q,onPointercancel:Q},null,32),r("div",{class:"aap-header"},[V[2]||(V[2]=Ta('
AI 助手
用自然语言描述地图需求,自动生成站点 / 路径
',1)),r("button",{class:"aap-close",type:"button",title:"收起",onClick:W},"✕")]),n.configured?X("",!0):(_(),ee(oe,{key:0,type:"warning",closable:!1,class:"aap-alert"},{default:l(()=>[V[4]||(V[4]=y(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(G,{type:"primary",onClick:ve},{default:l(()=>[...V[3]||(V[3]=[y("系统级配置 → AI 服务",-1)])]),_:1}),V[5]||(V[5]=y(" 完成配置。 ",-1))]),_:1})),r("div",{ref_key:"listRef",ref:z,class:"aap-messages"},[i.value.length===0?(_(),U("div",xn,[V[6]||(V[6]=r("div",{class:"aap-empty-title"},"试着这样说:",-1)),(_(),U(de,null,we(ye,(K,Z)=>r("button",{key:Z,type:"button",class:"aap-example",onClick:he=>O(K)},T(K),9,Sn)),64))])):X("",!0),(_(!0),U(de,null,we(i.value,(K,Z)=>(_(),U("div",{key:Z,class:Se(["aap-msg",`aap-msg--${K.role}`])},[r("div",_n,[r("div",Vn,T(K.text),1),K.role==="assistant"&&K.meta?(_(),U("div",Cn,[V[7]||(V[7]=y(" 落地对象 ",-1)),r("b",null,T(K.meta.created),1),V[8]||(V[8]=y(" · 工具调用 ",-1)),r("b",null,T(K.meta.usedTools),1)])):X("",!0)])],2))),128)),u.value?(_(),U("div",$n,[r("div",An,[a(ke,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),V[9]||(V[9]=r("span",null,"AI 正在生成…",-1))])])):X("",!0)],512),r("div",Nn,[V[14]||(V[14]=r("span",{class:"aap-toolbar-label"},"生成模式",-1)),a(ce,{modelValue:p.value,"onUpdate:modelValue":V[0]||(V[0]=K=>p.value=K),size:"small"},{default:l(()=>[a(re,{value:"sites"},{default:l(()=>[...V[10]||(V[10]=[y("站点",-1)])]),_:1}),a(re,{value:"tracks"},{default:l(()=>[...V[11]||(V[11]=[y("路径",-1)])]),_:1}),a(re,{value:"sites+tracks"},{default:l(()=>[...V[12]||(V[12]=[y("站点+路径",-1)])]),_:1}),a(re,{value:"full"},{default:l(()=>[...V[13]||(V[13]=[y("完整",-1)])]),_:1})]),_:1},8,["modelValue"])]),r("div",Fn,[a(_e,{modelValue:k.value,"onUpdate:modelValue":V[1]||(V[1]=K=>k.value=K),type:"textarea",rows:3,resize:"none",disabled:!n.configured||u.value,placeholder:"例如:一条 U 型生产线,含 5 个工站,间距 2m,单向通行…(Enter 发送,Shift+Enter 换行)",onKeydown:se},null,8,["modelValue","disabled"]),a(B,{type:"primary",class:"aap-send",loading:u.value,disabled:!n.configured||!k.value.trim(),onClick:te},{default:l(()=>[...V[15]||(V[15]=[y("发送",-1)])]),_:1},8,["loading","disabled"])])],6)}}}),In=Ne(Tn,[["__scopeId","data-v-9fed2b0d"]]);function En(){const n=A("transform.move"),N=A({grid:!1,gridSizeMm:100,object:!0,endpoint:!0,midpoint:!1,toAngleDeg:void 0}),g=A(!0),f=A(!0),h=ne(()=>{const u=n.value;return u.startsWith("select.")?"select":u.startsWith("draw.")?"draw":u.startsWith("transform.")?"transform":u.startsWith("align.")?"align":u.startsWith("batch.")?"batch":u.startsWith("snap.")?"snap":"show"}),C=ne(()=>({"select.single":"单选","select.rect":"矩形框选","select.lasso":"圈选","select.byType.site":"按类型选 - 站点","select.byType.bezier":"按类型选 - 贝塞尔","select.byType.polyline":"按类型选 - 折线","select.byType.arc":"按类型选 - 弧","select.byType.decor":"按类型选 - 装饰物","select.byType.currentLayer":"按类型选 - 当前图层","select.invert":"反选","select.clear":"清空选中","draw.site":"添加站点","draw.sites.continuous":"连续添加站点","draw.track.polyline":"添加折线路径","draw.track.bezier":"添加贝塞尔路径","draw.track.arc":"添加弧形路径","draw.track.nurbs":"添加 NURBS 路径","draw.decor.line":"添加线段","draw.decor.rect":"添加矩形","draw.decor.circle":"添加圆","draw.decor.text":"添加文本","draw.image":"插入图片","draw.model":"插入 3D 模型","transform.move":"移动","transform.rotate":"旋转","transform.scale":"缩放","transform.duplicate":"复制副本","transform.copy":"复制","transform.paste":"粘贴","transform.delete":"删除","transform.copyFields":"复制字段","align.left":"左对齐","align.right":"右对齐","align.top":"上对齐","align.bottom":"下对齐","align.centerH":"水平居中","align.centerV":"垂直居中","align.center":"整体居中","align.distributeH":"水平等距","align.distributeV":"垂直等距","align.toFirst":"对齐到第一个","align.toLast":"对齐到最后一个","batch.linearH":"横向间隔生成","batch.linearV":"纵向间隔生成","batch.matrix":"矩阵生成","batch.alongPath":"沿路径采样生成","batch.circular":"环形阵列","snap.grid":"网格吸附","snap.object":"对象吸附","snap.endpoint":"端点吸附","snap.midpoint":"中点吸附","show.controlPoints":"显示控制点","show.controlHandles":"显示控制柄"})[n.value]??n.value);function i(u){n.value=u}function k(u){N.value={...N.value,[u]:!N.value[u]}}return{activeTool:n,snap:N,showControlPoints:g,showControlHandles:f,toolCategory:h,toolLabel:C,setTool:i,toggleSnap:k}}function $e(n,N){return`${n}:${N}`}function zn(){const n=A([]),N=A(null),g=ne(()=>n.value.map(m=>m.id)),f=ne(()=>n.value.length);function h(m,M){const I=$e(m,M);return n.value.some(v=>$e(v.kind,v.id)===I)}function C(m){h(m.kind,m.id)||(n.value=[...n.value,m],N.value=$e(m.kind,m.id))}function i(m,M){const I=$e(m,M);n.value=n.value.filter(v=>$e(v.kind,v.id)!==I),N.value===I&&(N.value=null)}function k(m){h(m.kind,m.id)?i(m.kind,m.id):C(m)}function u(m){n.value=m,N.value=m.length>0?$e(m[m.length-1].kind,m[m.length-1].id):null}function z(){n.value=[],N.value=null}function $(m){n.value=n.value.filter(M=>M.kind===m)}function p(m){n.value=[m],N.value=$e(m.kind,m.id)}return{items:n,ids:g,count:f,lastClickedKey:N,has:h,add:C,remove:i,toggle:k,set:u,clear:z,filterByKind:$,selectSingle:p}}function Pn(n={}){const N=n.maxDepth??20,g=A([]),f=A([]),h=A(!1),C=ne(()=>g.value.length>0&&!h.value),i=ne(()=>f.value.length>0&&!h.value);async function k(m){if(!h.value){h.value=!0;try{await m.apply(),g.value=[...g.value,m].slice(-N),f.value=[],n.onChange?.()}finally{h.value=!1}}}async function u(){if(!C.value)return;const m=g.value[g.value.length-1];h.value=!0;try{await m.revert(),g.value=g.value.slice(0,-1),f.value=[...f.value,m].slice(-N),n.onChange?.()}finally{h.value=!1}}async function z(){if(!i.value)return;const m=f.value[f.value.length-1];h.value=!0;try{await m.apply(),f.value=f.value.slice(0,-1),g.value=[...g.value,m].slice(-N),n.onChange?.()}finally{h.value=!1}}function $(){g.value=[],f.value=[],n.onChange?.()}function p(m,M){return{label:m,apply:async()=>{for(const I of M)await I.apply()},revert:async()=>{for(let I=M.length-1;I>=0;I--)await M[I].revert()}}}return{undoStack:g,redoStack:f,busy:h,canUndo:C,canRedo:i,run:k,undo:u,redo:z,clear:$,composite:p}}function Mn(n={}){function N(g){const f=g?.data;if(!f||typeof f!="object"||typeof f.type!="string")return;const h=f.type,C=f.payload;if(h==="workspace.pick"&&n.onPick&&C&&typeof C=="object"&&"x"in C&&"y"in C){const i=C;n.onPick({x:Number(i.x),y:Number(i.y),siteId:typeof i.siteId=="number"?i.siteId:void 0})}else if(h==="workspace.select"&&n.onSelect&&Array.isArray(C))n.onSelect({names:C});else if(h==="workspace.mouse"&&n.onMouse&&C&&typeof C=="object"&&"x"in C&&"y"in C){const i=C;n.onMouse({x:Number(i.x),y:Number(i.y)})}}jt(()=>window.addEventListener("message",N)),Dt(()=>window.removeEventListener("message",N))}function Un(n,N){if(n.length<2)return[];const g=[],f=n.map(p=>p.x),h=n.map(p=>p.y),C=Math.min(...f),i=Math.max(...f),k=Math.min(...h),u=Math.max(...h),z=f.reduce((p,m)=>p+m,0)/f.length,$=h.reduce((p,m)=>p+m,0)/h.length;switch(N){case"left":for(const p of n)g.push(me(p,{x:C}));break;case"right":for(const p of n)g.push(me(p,{x:i}));break;case"top":for(const p of n)g.push(me(p,{y:u}));break;case"bottom":for(const p of n)g.push(me(p,{y:k}));break;case"centerH":for(const p of n)g.push(me(p,{x:z}));break;case"centerV":for(const p of n)g.push(me(p,{y:$}));break;case"center":for(const p of n)g.push(me(p,{x:z,y:$}));break;case"distributeH":{const p=[...n].sort((M,I)=>M.x-I.x),m=(p[p.length-1].x-p[0].x)/(p.length-1);p.forEach((M,I)=>{const v=p[0].x+m*I;Math.abs(v-M.x)>.5&&g.push(me(M,{x:v}))});break}case"distributeV":{const p=[...n].sort((M,I)=>M.y-I.y),m=(p[p.length-1].y-p[0].y)/(p.length-1);p.forEach((M,I)=>{const v=p[0].y+m*I;Math.abs(v-M.y)>.5&&g.push(me(M,{y:v}))});break}case"toFirst":{const p=n[0];for(const m of n.slice(1))g.push(me(m,{x:p.x,y:p.y}));break}case"toLast":{const p=n[n.length-1];for(const m of n.slice(0,-1))g.push(me(m,{x:p.x,y:p.y}));break}}return g}function me(n,N){return{action:"patch",kind:n.kind,id:n.id,data:N}}function Ln(n,N,g,f){return Ot(n,g,N,g,f)}function Bn(n,N,g,f){return Ot(n,N,n,g,f)}function Ot(n,N,g,f,h){const C=[],i=Math.max(2,Math.floor(h.count));for(let k=0;k{const e=p.items.value;if(e.length!==1)return null;const t=e[0].kind;return t==="site"||t==="track"?t:null}),B=A(["g"]),K=A([{name:"g",visible:!0,selectable:!0,color:"#cccccc"}]),Z=Je({selectFilter:{sites:!0,tracks:!0,cars:!0,decor:!0},alignSnap:{sites:!0,cars:!0,tracks:!0},showViewport:{sceneLabels:!0,scenePrimitives:!0,cars:!0}});function he(){try{localStorage.setItem("mapEditor.viewFilter",JSON.stringify(Z))}catch{}}function Qe(){try{const e=localStorage.getItem("mapEditor.viewFilter");if(!e)return;const t=JSON.parse(e);t.selectFilter&&Object.assign(Z.selectFilter,t.selectFilter),t.alignSnap&&Object.assign(Z.alignSnap,t.alignSnap),t.showViewport&&Object.assign(Z.showViewport,t.showViewport)}catch{}}function Oe(){const e=Z.selectFilter,t=p.items.value.filter(o=>o.kind==="site"?e.sites:o.kind==="track"?e.tracks:o.kind==="car"?e.cars:o.kind==="special"?e.decor:!0);t.length!==p.items.value.length&&p.set(t)}const Fe=A(!1),ae=A({siteA:null}),Ye=A(!1),We=A(!1),Te=A("");function Ie(e){return e.map(t=>`${t.kind}:${t.id}`).sort().join(",")}const xe=A(!1),Ee=["draw.site","draw.sites.continuous","draw.track.polyline","draw.track.bezier","draw.track.arc","draw.track.nurbs"];async function b(){if(!xe.value){for(xe.value=!0;xe.value;){let e=null;try{e=await j.pick()}catch{break}if(!xe.value)break;const t=$.activeTool.value;if(!Ee.includes(t))break;if(t==="draw.site"){await c(e.x,e.y),F.success(`已添加站点 (${e.x.toFixed(0)}, ${e.y.toFixed(0)})`);break}else if(t==="draw.sites.continuous")await c(e.x,e.y);else if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){const o=ae.value.siteA;if(await qe(e.siteId),o!=null&&ae.value.siteA==null){const s=t==="draw.track.bezier"?"贝塞尔路径":t==="draw.track.arc"?"弧形路径":t==="draw.track.nurbs"?"NURBS 路径":"直线路径";F.success(`已添加${s}`);break}}else break}xe.value=!1,Ee.includes($.activeTool.value)&&$.setTool("transform.move")}}const d=ne(()=>$.snap.value.grid||$.snap.value.object||$.snap.value.endpoint||$.snap.value.midpoint);async function ze(e){switch(e){case"edit.undo":await m.undo();break;case"edit.redo":await m.redo();break;case"edit.delete":await R();break;case"edit.selectAll":F.info("全选:请使用工具栏「按类型选」批量选中");break;case"edit.invert":F.info("反选功能后续实现");break;case"project.save":await ra();break;case"ai.open":await wt();break;case"file.upload.image":Ze("image");break;case"file.upload.model":Ze("model");break;case"view.fitAll":F.info("请在 3D 视口右键菜单使用「适配全部」");break;case"view.fitSelection":F.info("请在 3D 视口右键菜单使用「适配选中」");break;case"snap.toGrid":$.toggleSnap("grid");break;case"snap.toObject":$.toggleSnap("object");break;case"layer.new":await Le();break;case"layer.toggleVisibility":Fe.value=!0;break;case"view.select.sites":ue("selectFilter","sites");break;case"view.select.tracks":ue("selectFilter","tracks");break;case"view.select.cars":ue("selectFilter","cars");break;case"view.select.decor":ue("selectFilter","decor");break;case"view.snap.sites":ue("alignSnap","sites");break;case"view.snap.cars":ue("alignSnap","cars");break;case"view.snap.tracks":ue("alignSnap","tracks");break;case"view.show.sceneLabels":ue("showViewport","sceneLabels");break;case"view.show.scenePrimitives":ue("showViewport","scenePrimitives");break;case"view.show.cars":ue("showViewport","cars");break;default:F.info(`暂未实现的命令:${e}`)}}async function ue(e,t){const o=Z[e],s=t,w=o[s];o[s]=!o[s],he(),e==="selectFilter"&&Oe();const S={};S[e]={[s]:o[s]};try{await j.setViewFilter(S)}catch(E){console.warn("[MapEditor] 写后端 viewFilter 失败:",E),o[s]=w,he(),e==="selectFilter"&&Oe(),F({message:"过滤设置写入后端失败,已回滚本地状态;请检查 SimpleLite 是否连通后重试。",type:"warning",duration:5e3,showClose:!0})}}function Pe(e){return e==="bezier"?"贝塞尔路径":e==="nurbs"?"NURBS 路径":e==="arc"?"弧形路径":"直线路径"}async function be(e,t){const o=await Me(e),s=await Me(t);if(!o||!s)return F.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(圆心需手动设置)`),null;const S=Math.hypot(o.x-s.x,o.y-s.y)/2;let E;try{const L=await Y.prompt(`请输入半径 (mm),必须 ≥ ${S.toFixed(1)}(等于即半圆)`,"添加弧形路径",{inputValue:String(Math.ceil(S))});E=Number(L.value)}catch{return"cancelled"}return!Number.isFinite(E)||E0?-S/E:0,va=E>0?w/E:0,St=s==="left"?1:-1,nt=(e.x+t.x)/2+St*le*ya,ot=(e.y+t.y)/2+St*le*va,ba=Math.atan2(e.y-ot,e.x-nt)*180/Math.PI,ga=Math.atan2(t.y-ot,t.x-nt)*180/Math.PI;return["1",nt.toFixed(3),ot.toFixed(3),o.toFixed(3),ba.toFixed(3),ga.toFixed(3)].join(",")}function Ue(e){e&&(x.site.layer=e,x.track.layer=e,F.success(`默认图层已切到 "${e}"`))}async function Le(){try{const t=((await Y.prompt("请输入新图层名(同名会被忽略)","新建图层",{inputValue:""})).value??"").trim();if(!t)return;if(B.value.includes(t)){x.site.layer=t,x.track.layer=t,F.info(`图层 "${t}" 已存在,已切到该层`);return}gt(t),x.site.layer=t,x.track.layer=t,F.success(`已创建图层 "${t}",下次创建对象会落到该层`)}catch{}}async function et(e){if($.setTool(e),ae.value.siteA=null,xe.value=!1,e==="select.clear"){p.clear(),await J.clearSelection().catch(()=>{});return}if(Ee.includes(e)&&b(),e.startsWith("align.")){await Kt(e.replace("align.",""));return}if(e.startsWith("batch.")){await Ht(e);return}if(e==="transform.delete"){await R();return}if(e.startsWith("select.byType.")){const t=e.replace("select.byType.","");H(t);return}if(e==="show.controlPoints"&&($.showControlPoints.value=!$.showControlPoints.value),e==="show.controlHandles"&&($.showControlHandles.value=!$.showControlHandles.value),e==="draw.image"&&Ze("image"),e==="draw.model"&&Ze("model"),e==="transform.copyFields"){await Wt();return}}function H(e){e==="site"?p.filterByKind("site"):e==="polyline"||e==="bezier"||e==="arc"?p.items.value=p.items.value.filter(t=>{if(t.kind!=="track")return!1;const o=t.typeName.toLowerCase();return e==="polyline"?o==="uitrack":e==="bezier"?o.includes("bezier"):e==="arc"?o.includes("arc"):!1}):e==="decor"?p.filterByKind("special"):e==="currentLayer"&&O.value?.layer&&(p.items.value=p.items.value.filter(t=>t.layer===O.value.layer))}async function Ve(e){M.x=e.x,M.y=e.y;const t=$.activeTool.value;if(!(xe.value&&Ee.includes(t))&&!Ye.value){if(t==="draw.site"||t==="draw.sites.continuous"){await c(e.x,e.y);return}if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){try{const o=await j.pick();await qe(o.siteId)}catch{}return}}}function Be(e){p.set(Ce(e))}function Ce(e){const t=[],o=Z.selectFilter;for(const s of e){const w=/^UI([A-Za-z]+)-(\d+)$/.exec(s)??/^([A-Za-z]+)-(\d+)$/.exec(s);if(!w)continue;const S=w[1],E=Number(w[2]),L=S.toLowerCase();let P;L==="site"?P="site":L==="car"||L==="vehicle"?P="car":L.includes("track")?P="track":P="special",!(P==="site"&&!o.sites)&&(P==="track"&&!o.tracks||P==="car"&&!o.cars||P==="special"&&!o.decor||t.push({kind:P,id:E,name:s,typeName:s.startsWith("UI")?`UI${S}`:S}))}return t}async function qe(e){if(e<=0){F.warning("请先拾取一个站点");return}if(ae.value.siteA==null){ae.value.siteA=e,F.success(`已选起点站 #${e},请再拾取终点站`);return}const t=ae.value.siteA,o=e;if(ae.value.siteA=null,t===o){F.warning("起止站点不能相同");return}const s=$.activeTool.value==="draw.track.bezier"?"bezier":$.activeTool.value==="draw.track.arc"?"arc":$.activeTool.value==="draw.track.nurbs"?"nurbs":"track";let w,S="";if(s==="bezier"||s==="nurbs"){const L=await tt(t,o,s);if(L==="cancelled")return;L!=null&&(w=L.typeInfo,S=`(控制点 ${L.midCount})`)}else if(s==="arc"){const L=await be(t,o);if(L==="cancelled")return;L!=null&&(w=L.typeInfo,S=`(半径 ${L.radius.toFixed(0)})`)}let E=-1;await m.run({label:`新建${Pe(s)} (${t}→${o})${S}`,apply:async()=>{const L={siteA:t,siteB:o,layer:x.track.layer};w&&(L.typeInfo=w),E=(await j.createTrack(s,L)).id},revert:async()=>{E>0&&await j.deleteObject("track",E)}}),Ge(s)}async function tt(e,t,o){const s=await Me(e),w=await Me(t);if(!s||!w)return F.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(控制点会用兜底直线)`),null;const S=Pe(o);let E;try{const P=await Y.prompt("请输入中间控制点个数(不含起止站点;默认 2,输入 0 则不带控制点直接连接两站点)",`创建${S}`,{inputValue:"2",inputPattern:/^\d+$/,inputErrorMessage:"请输入非负整数"});E=Math.max(0,Math.floor(Number(P.value)))}catch{return"cancelled"}if(E===0)return{typeInfo:pe([s,w],o==="bezier"?2:3),midCount:0};F.info(`请在画布上依次点选 ${E} 个中间控制点(任意位置;右键取消创建)`),Ye.value=!0;const L=[];try{for(let P=0;P{o=(await j.createSite({x:e,y:t,layer:x.site.layer,name:`${x.site.namePrefix}-${Date.now()%1e5}`})).id},revert:async()=>{o>0&&await j.deleteObject("site",o)}})}async function R(){const e=[...p.items.value];if(e.length===0)return;const t=[];for(const o of e)try{const s=await J.getBundle(o.kind,o.id);t.push({kind:o.kind,typeName:s.typeName,data:{...s.fields??{}}})}catch{}await m.run({label:`删除 ${e.length} 个对象`,apply:async()=>{const o=e.map(s=>({action:"delete",kind:s.kind,id:s.id}));await j.batch(o),p.clear()},revert:async()=>{const o=t.map(s=>({action:"create",kind:Yt(s.kind,s.typeName),data:s.data}));o.length&&(await j.batch(o),F.success(`已恢复 ${o.length} 个对象(注意:id 已重排)`))}})}function Yt(e,t){const o=(t??"").toLowerCase();if(e==="track")return o.includes("bezier")?"bezier":o.includes("arc")?"arc":o.includes("nurbs")?"nurbs":"track";if(e==="special"){if(o.includes("image"))return"image";if(o.includes("text"))return"text";if(o.includes("model"))return"model"}return e}async function Kt(e){const t=[];for(const s of p.items.value)if(s.kind!=="track")try{const w=await J.getBundle(s.kind,s.id),S=Number(w.fields?.x??0),E=Number(w.fields?.y??0);t.push({kind:s.kind,id:s.id,x:S,y:E})}catch{}if(t.length<2){F.warning("对齐需要选中至少 2 个对象");return}const o=Un(t,e);if(o.length===0){F.info("对齐无变化");return}await m.run({label:`对齐 (${e})`,apply:async()=>{await j.batch(o)},revert:async()=>{const s=t.map(w=>({action:"patch",kind:w.kind,id:w.id,data:{x:w.x,y:w.y}}));await j.batch(s)}})}async function Ht(e){if(e==="batch.linearH"||e==="batch.linearV"){const t=e==="batch.linearH"?"横向":"纵向";try{const{value:o}=await Y.prompt(`输入 ${t}站点数量`,"批量生成",{inputValue:"5",inputType:"number"}),s=Math.max(2,Math.floor(Number(o))),w=await Y.prompt("起点 X","批量生成",{inputValue:"0"}),S=await Y.prompt("起点 Y","批量生成",{inputValue:"0"}),E=await Y.prompt("终点 X","批量生成",{inputValue:"5000"}),L=await Y.prompt("终点 Y","批量生成",{inputValue:"0"}),P=e==="batch.linearH"?Ln(Number(w.value),Number(E.value),Number(S.value),{count:s,layer:x.site.layer}):Bn(Number(w.value),Number(S.value),Number(L.value),{count:s,layer:x.site.layer});await at(`${t}间隔生成 ${s}`,P)}catch{}return}if(e==="batch.matrix"){try{const t=Number((await Y.prompt("行数","矩阵生成",{inputValue:"3"})).value),o=Number((await Y.prompt("列数","矩阵生成",{inputValue:"3"})).value),s=Number((await Y.prompt("x1","矩阵生成",{inputValue:"0"})).value),w=Number((await Y.prompt("y1","矩阵生成",{inputValue:"0"})).value),S=Number((await Y.prompt("x2","矩阵生成",{inputValue:"5000"})).value),E=Number((await Y.prompt("y2","矩阵生成",{inputValue:"5000"})).value),L=Dn(s,w,S,E,{rows:t,cols:o,layer:x.site.layer});await at(`矩阵生成 ${t}×${o}`,L)}catch{}return}if(e==="batch.circular"){try{const t=Number((await Y.prompt("圆心 X","环形阵列",{inputValue:"0"})).value),o=Number((await Y.prompt("圆心 Y","环形阵列",{inputValue:"0"})).value),s=Number((await Y.prompt("半径 (mm)","环形阵列",{inputValue:"2000"})).value),w=Number((await Y.prompt("站点数量","环形阵列",{inputValue:"8"})).value),S=Rn(t,o,s,{count:w,layer:x.site.layer});await at(`环形阵列 r=${s} n=${w}`,S)}catch{}return}if(e==="batch.alongPath"){await Xt();return}}async function Xt(){const e=p.items.value.filter(w=>w.kind==="track");if(e.length===0){F.warning("请先选中至少 1 条路径");return}let t=500,o=!1;try{const{value:w}=await Y.prompt("输入采样间距 (mm)","沿路径采样",{inputValue:"500",inputType:"number"});t=Math.max(10,Math.floor(Number(w)));const{value:S}=await Y.prompt("是否包含端点?输入 1 包含,0 不包含","沿路径采样",{inputValue:"0"});o=Number(S)===1}catch{return}const s=[];await m.run({label:`沿 ${e.length} 条路径间距 ${t}mm 采样`,apply:async()=>{for(const w of e){const S=await j.sampleSitesAlongTrack(w.id,{spacingMm:t,includeEndpoints:o,layer:x.site.layer});s.push(...S.ids)}F.success(`已采样生成 ${s.length} 个站点`)},revert:async()=>{if(!s.length)return;const w=s.map(S=>({action:"delete",kind:"site",id:S}));await j.batch(w)}})}async function Wt(){if(p.items.value.length<2){F.warning("字段复制需要 ≥ 2 个选中对象(第 1 个为源,其余为目标)");return}const[e,...t]=p.items.value;try{const{value:o}=await Y.prompt("输入要复制的字段名(逗号分隔),例如:x,y,layerName","字段复制",{inputValue:"x,y"}),s=o.split(",").map(S=>S.trim()).filter(Boolean);if(!s.length)return;const w=new Map;for(const S of t)try{const E=await J.getBundle(S.kind,S.id),L={};for(const P of s)L[P]=String(E.fields?.[P]??"");w.set(`${S.kind}:${S.id}`,L)}catch{}await m.run({label:`字段复制 ${s.join(",")} → ${t.length} 个`,apply:async()=>{const S=await j.copyFieldsTo(e.kind,e.id,s,t.map(E=>({kind:E.kind,id:E.id})));F.success(`已复制 ${S.copied} 项字段`)},revert:async()=>{const S=t.flatMap(E=>{const L=w.get(`${E.kind}:${E.id}`);return L?[{action:"patch",kind:E.kind,id:E.id,data:L}]:[]});S.length&&await j.batch(S)}})}catch{}}async function at(e,t){if(t.length===0)return;let o=[];await m.run({label:e,apply:async()=>{o=(await j.batch(t)).results.filter(w=>w.ok&&w.action==="create"&&w.result?.id).map(w=>({kind:w.result.kind,id:w.result.id}))},revert:async()=>{const s=o.map(w=>({action:"delete",kind:w.kind,id:w.id}));s.length&&await j.batch(s)}}),F.success(`${e} 完成`)}async function Ke(){if(p.items.value.length===0){O.value=null,se.value=[],ie.value=[],te.value=[];return}const e=p.items.value[0];Gt();try{const t=await J.getBundle(e.kind,e.id);O.value=t.summary,se.value=Object.entries(t.fields).map(([o,s])=>({key:o,value:String(s)})),ie.value=t.methods,te.value=(t.status??[]).map(o=>({key:o.key,value:o.value}))}catch(t){F.error(`加载属性失败:${t.message}`)}finally{qt()}}function Gt(){ve.value=!0}function qt(){ve.value=!1}async function Zt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],o=O.value.id,s=O.value.name??"";s!==e&&(await m.run({label:`重命名 ${s||"(无)"} → ${e}`,apply:async()=>{await J.setField(t.kind,o,"name",e)},revert:async()=>{try{await J.setField(t.kind,o,"name",s)}catch(w){F.warning(`回滚名称失败:${w.message}`)}}}),F.success("名称已更新"))}async function Jt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],o=O.value.id,s=O.value.layer??"";s!==e&&(await m.run({label:`修改图层 ${s||"(无)"} → ${e}`,apply:async()=>{await J.setField(t.kind,o,"layerName",e)},revert:async()=>{try{await J.setField(t.kind,o,"layerName",s)}catch(w){F.warning(`回滚图层失败:${w.message}`)}}}),await Ke())}async function vt(e,t){if(!O.value)return;const o=p.items.value[0];let s;try{const w=await J.getBundle(o.kind,O.value.id);s=w.fields?.[e]!=null?String(w.fields[e]):void 0}catch{}await m.run({label:`修改 ${e}`,apply:async()=>{await J.setField(o.kind,O.value.id,e,t)},revert:async()=>{if(s!==void 0)try{await J.setField(o.kind,O.value.id,e,s)}catch(w){F.warning(`回滚 ${e} 失败:${w.message}`)}else F.warning(`回滚 ${e}:没拿到原值快照,仅本地撤销`)}}),await Ke()}async function Qt(){try{const e=(await Y.prompt("字段名","新增字段",{inputPattern:/^[A-Za-z0-9_]+$/})).value,t=(await Y.prompt("字段值","新增字段",{inputValue:""})).value;await vt(e,t)}catch{}}async function ea(e){if(O.value)try{await J.execute(p.items.value[0].kind,O.value.id,e),F.success(`已执行 ${e}`),await Ke()}catch(t){F.error(`执行失败:${t.message}`)}}function ta(){localStorage.setItem("mapEditor.defaults",JSON.stringify(x)),F.success("新建默认已保存(下次创建对象时生效)")}function bt(e){const t=e.site??e.Site,o=e.track??e.Track,s=(S,E,L)=>Number(S?.[E]??S?.[L]??0),w=(S,E,L)=>!!(S?.[E]??S?.[L]);return Ua({site:{drawScale:s(t,"drawScale","DrawScale"),dotRadiusNormal:s(t,"dotRadiusNormal","DotRadiusNormal"),dotRadiusSelected:s(t,"dotRadiusSelected","DotRadiusSelected"),selectionRingM:s(t,"selectionRingM","SelectionRingM"),colorNormalArgb:s(t,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(t,"colorSelectedArgb","ColorSelectedArgb"),labelColorNormalArgb:s(t,"labelColorNormalArgb","LabelColorNormalArgb"),labelColorSelectedArgb:s(t,"labelColorSelectedArgb","LabelColorSelectedArgb")},track:{drawScale:s(o,"drawScale","DrawScale"),widthNormal:s(o,"widthNormal","WidthNormal"),widthSelected:s(o,"widthSelected","WidthSelected"),showDirectionArrows:w(o,"showDirectionArrows","ShowDirectionArrows"),colorNormalArgb:s(o,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(o,"colorSelectedArgb","ColorSelectedArgb")}})}async function lt(){G.value=!0;try{const e=await J.getViewportStyle();V.value=bt(e)}catch(e){console.warn("[MapEditor] 加载视口样式失败:",e)}finally{G.value=!1}}function aa(e){e.site&&(ce.site=e.site,V.value&&(V.value={...V.value,site:{...e.site}})),e.track&&(ce.track=e.track,V.value&&(V.value={...V.value,track:{...e.track}})),ke&&clearTimeout(ke),ke=setTimeout(()=>{const t={...ce};ce={},la(t)},350)}async function la(e){const t=++re;oe.value=!0;try{const o={};e.site&&(o.site=e.site),e.track&&(o.track=e.track);const s=await J.patchViewportStyle(o);if(t!==re)return;V.value=bt(s)}catch(o){F.error(`视口样式更新失败:${o.message}`),await lt()}finally{t===re&&(oe.value=!1)}}function na(e){F.info("图层可见 / 可选切换暂时仅本地生效,后续接入反射 API")}function gt(e){K.value.find(t=>t.name===e)||(K.value=[...K.value,{name:e,visible:!0,selectable:!0,color:"#cccccc"}],B.value=[...B.value,e])}async function wt(){try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}I.value=!0}function oa(){try{v.value=localStorage.getItem(At)==="1";const e=Number(localStorage.getItem(Nt));Number.isFinite(e)&&e>=300&&e<=720&&(q.value=e)}catch{}}fe(v,e=>{try{localStorage.setItem(At,e?"1":"0")}catch{}}),fe(q,e=>{try{localStorage.setItem(Nt,String(Math.round(e)))}catch{}});async function sa(){if(!v.value)try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}v.value=!v.value}async function kt(e){De();const t=(e.created??[]).filter(s=>typeof s=="object"&&s!=null&&typeof s.id=="number"&&!s.error);if(t.length===0)return;const o={label:`AI 生图:落地 ${t.length} 个对象`,apply:async()=>{},revert:async()=>{const s=t.map(w=>({action:"delete",kind:w.kind,id:w.id}));await j.batch(s),F.success(`已撤销 AI 生图(删除 ${s.length} 个对象)`)}};await m.run(o)}function ia(){const e=new Date,t=o=>String(o).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}_${t(e.getHours())}-${t(e.getMinutes())}-${t(e.getSeconds())}`}async function ra(){const e=C.value||ia();W.value=!0;try{let t=await it.save(e,!1);if(!t.ok&&t.conflict){try{await Y.confirm(`地图「${e}」已存在,是否替换原地图文件?`,"替换确认",{type:"warning",confirmButtonText:"替换",cancelButtonText:"取消"})}catch{return}t=await it.save(e,!0)}if(!t.ok){F.error(`保存失败:${t.message}`);return}C.value=t.data.name,F.success(`已保存地图「${t.data.name}」`),await f.push({path:"/admin/maps"})}catch(t){F.error(`保存失败:${t.message}`)}finally{W.value=!1}}function Ze(e){z.value=e,u.value=e==="image"?"image/*":".obj,.glb,.gltf,.fbx,.cyclemodel",k.value?.click()}async function ua(e){const t=e.target,o=t.files?.[0];if(o)try{const s=await o.arrayBuffer(),w=da(s),S=await j.uploadAsset(o.name,w);F.success(`已上传:${S.fileName}`),z.value==="image"?await j.createImage({x:0,y:0,imagePath:S.savedPath,size:1e3}):await j.createModel({x:0,y:0,modelPath:S.savedPath,scale:1}),De()}catch(s){F.error(`上传失败:${s.message}`)}finally{t.value=""}}function da(e){let t="";const o=new Uint8Array(e);for(let s=0;s{M.x=e.x,M.y=e.y},onPick:e=>{Ve(e)},onSelect:e=>Be(e.names)});const ca=La({onWorkspaceShortcut:e=>{He(e.action)},onAlarm:()=>{},onObjectCreated:()=>De(),onObjectDeleted:()=>De(),onObjectPatched:()=>De(),onObjectBatchChanged:()=>De(),onViewportStyleUpdated:()=>{lt()},onSelectionDetail:e=>{if(!Array.isArray(e.names))return;const t=Ce(e.names),o=Ie(t);o!==Te.value&&(Te.value=o,p.set(t))}});function De(){Ke()}fe(()=>ca.connected.value,e=>We.value=e,{immediate:!0}),fe(()=>Ie(p.items.value),e=>{Ke(),Te.value=e,p.items.value.length===1&&J.setSelection(p.items.value[0].kind,p.items.value[0].id).catch(()=>{})});function pa(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.isContentEditable?!0:!!e.closest('.el-input, .el-textarea, .el-select, [contenteditable="true"]')}async function He(e){if(e==="undo"){if(!m.canUndo.value)return;await m.undo()}else if(e==="redo"){if(!m.canRedo.value)return;await m.redo()}else await R()}function ht(e){if(pa(e.target))return;const t=e.ctrlKey||e.metaKey;t&&e.key.toLowerCase()==="z"&&!e.shiftKey?(e.preventDefault(),He("undo")):t&&(e.key.toLowerCase()==="y"||e.key.toLowerCase()==="z"&&e.shiftKey)?(e.preventDefault(),He("redo")):e.key==="Delete"&&(e.preventDefault(),He("delete"))}function xt(e){const t=e.detail?.action;(t==="undo"||t==="redo"||t==="delete")&&He(t)}async function ma(){try{const e=await j.getViewFilter();Object.assign(Z.selectFilter,e.selectFilter),Object.assign(Z.alignSnap,e.alignSnap),Object.assign(Z.showViewport,e.showViewport),he()}catch(e){console.warn("[MapEditor] 拉后端 viewFilter 失败,沿用本地缓存:",e)}}jt(async()=>{document.addEventListener("keydown",ht,!0),window.addEventListener("workspace-shortcut",xt);try{const t=await st.get();Q.value=!!t.configured}catch{}const e=localStorage.getItem("mapEditor.defaults");if(e)try{Object.assign(x,JSON.parse(e))}catch{}oa(),Qe(),await ma(),await lt(),await fa()});async function fa(){const e=typeof g.query.map=="string"?g.query.map:"",t=g.query.new==="1";if(e)try{const o=await it.open(e);C.value=o.name,p.clear(),O.value=null,F.success(`已载入地图「${o.name}」:${o.sites} 站点 / ${o.tracks} 路径`)}catch(o){F.error(`载入地图失败:${o.message}`)}else t&&(C.value="")}return za(()=>{document.removeEventListener("keydown",ht,!0),window.removeEventListener("workspace-shortcut",xt)}),(e,t)=>{const o=ft,s=zt,w=Et,S=Xe,E=mt,L=Mt;return _(),U("div",jn,[a(Ra,{"can-undo":D(m).canUndo.value,"can-redo":D(m).canRedo.value,saving:W.value,"view-filter":Z,onCmd:ze},null,8,["can-undo","can-redo","saving","view-filter"]),r("div",On,[a(Ja,{"active-tool":D($).activeTool.value,onSelectTool:et,onOpenAi:wt},null,8,["active-tool"]),r("div",Yn,[a(Ma,{ref_key:"workspaceRef",ref:i,host:D(h),scope:D(N).scope??"Platform",token:D(N).token??"","read-only":!1,"embed-ui":!1,"canvas-only":!0,"hide-toolbar":!0,onPick:Ve,onSelect:Be},null,8,["host","scope","token"])]),a(on,{"selection-count":D(p).count.value,primary:O.value,fields:se.value,status:te.value,methods:ie.value,loading:ve.value,layers:B.value,defaults:x,"layer-rows":K.value,"selection-kind":_e.value,"viewport-style":V.value,"viewport-style-loading":G.value,"viewport-syncing":oe.value,onRename:Zt,onChangeLayer:Jt,onSetField:vt,onAddField:Qt,onExecAction:ea,onSaveDefaults:ta,onLayerToggle:na,onAddLayer:gt,onDelete:R,onPatchViewport:aa},null,8,["selection-count","primary","fields","status","methods","loading","layers","defaults","layer-rows","selection-kind","viewport-style","viewport-style-loading","viewport-syncing"]),r("button",{class:Se(["ai-assistant-fab",{"is-open":v.value}]),style:Rt(v.value?{right:q.value+"px"}:void 0),type:"button",title:v.value?"收起 AI 助手":"打开 AI 助手",onClick:sa},[...t[5]||(t[5]=[r("span",{class:"fab-glyph"},"✦",-1),r("span",{class:"fab-text"},[y("AI"),r("br"),y("助手")],-1)])],14,Kn),a(In,{open:v.value,"onUpdate:open":t[0]||(t[0]=P=>v.value=P),width:q.value,"onUpdate:width":t[1]||(t[1]=P=>q.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["open","width","configured","default-bounds","default-layer"])]),a(vn,{"selected-count":D(p).count.value,"mouse-x":M.x,"mouse-y":M.y,"tool-label":D($).toolLabel.value,"snap-on":d.value,"undo-size":D(m).undoStack.value.length,"redo-size":D(m).redoStack.value.length,connected:We.value},null,8,["selected-count","mouse-x","mouse-y","tool-label","snap-on","undo-size","redo-size","connected"]),a(hn,{modelValue:I.value,"onUpdate:modelValue":t[2]||(t[2]=P=>I.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["modelValue","configured","default-bounds","default-layer"]),a(L,{modelValue:Fe.value,"onUpdate:modelValue":t[4]||(t[4]=P=>Fe.value=P),title:"切换显示图层",width:"520px"},{footer:l(()=>[a(S,{onClick:t[3]||(t[3]=P=>Fe.value=!1)},{default:l(()=>[...t[6]||(t[6]=[y("关闭",-1)])]),_:1}),a(S,{type:"primary",onClick:Le},{default:l(()=>[...t[7]||(t[7]=[y("新建图层…",-1)])]),_:1})]),default:l(()=>[a(E,{data:K.value,size:"small",style:{width:"100%"}},{default:l(()=>[a(o,{prop:"name",label:"图层","min-width":"120"}),a(o,{label:"可见",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.visible,"onUpdate:modelValue":le=>P.visible=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"可选",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.selectable,"onUpdate:modelValue":le=>P.selectable=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"颜色",width:"100"},{default:l(({row:P})=>[a(w,{modelValue:P.color,"onUpdate:modelValue":le=>P.color=le,size:"small"},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"默认层",width:"110"},{default:l(({row:P})=>[a(S,{size:"small",type:x.site.layer===P.name?"primary":"default",onClick:le=>Ue(P.name)},{default:l(()=>[y(T(x.site.layer===P.name?"当前默认":"设为默认"),1)]),_:2},1032,["type","onClick"])]),_:1})]),_:1},8,["data"])]),_:1},8,["modelValue"]),r("input",{ref_key:"fileInputRef",ref:k,type:"file",style:{display:"none"},accept:u.value,onChange:ua},null,40,Hn)])}}}),_o=Ne(Xn,[["__scopeId","data-v-a13fa1ff"]]);export{_o as default}; +import{aI as Ae,aE as U,aH as a,r as Xe,bJ as l,I as wa,aB as r,ag as ut,b9 as _,aG as y,K as ka,J as ha,bq as T,ak as Ne,a3 as xa,ai as de,bj as we,aC as ee,b3 as Se,aD as X,bI as fe,ac as Sa,bh as A,a9 as _a,Q as dt,bt as D,aV as _t,aZ as rt,Z as Va,R as ct,E as pt,N as Ft,O as Tt,S as It,z as Et,a8 as zt,aa as mt,ab as ft,ax as ne,ad as Pt,a4 as Ca,bg as Je,G as Mt,ah as $a,bu as Aa,a1 as Ut,a0 as Lt,x as Na,T as Bt,y as Fa,bx as yt,X as F,b6 as Dt,b4 as Rt,aF as Ta,b2 as Ia,b7 as jt,bv as Ea,b8 as za,bw as Pa,Y}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{W as Ma}from"./Workspace3D-DpUfTJl7.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{h as Re,a as je,r as J,n as Ua}from"./reflection-B_glb6eT.js";/* empty css *//* empty css *//* empty css *//* empty css */import{m as j,a as st,b as it}from"./mapEdit-TNAQr3Be.js";import{u as La}from"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const Ba={class:"edit-top-bar"},Da=Ae({__name:"EditTopBar",props:{canUndo:{type:Boolean},canRedo:{type:Boolean},saving:{type:Boolean},viewFilter:{}},emits:["cmd"],setup(n,{emit:N}){const g=N;function f(C){g("cmd",C)}function h(C){return C?"☑":"☐"}return(C,i)=>{const k=Xe,u=ha,z=ka,$=wa,p=ut;return _(),U("div",Ba,[a(k,{type:"primary",class:"topbar-save-btn",loading:n.saving,onClick:i[0]||(i[0]=m=>f("project.save"))},{default:l(()=>[...i[3]||(i[3]=[y(" 保存 ",-1)])]),_:1},8,["loading"]),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"file.import.dwg"},{default:l(()=>[...i[5]||(i[5]=[y("导入 .dwg/.dxf",-1)])]),_:1}),a(u,{command:"file.import.geojson"},{default:l(()=>[...i[6]||(i[6]=[y("导入 .geojson",-1)])]),_:1}),a(u,{command:"file.upload.image",divided:""},{default:l(()=>[...i[7]||(i[7]=[y("导入图片",-1)])]),_:1}),a(u,{command:"file.upload.model"},{default:l(()=>[...i[8]||(i[8]=[y("导入 CycleGUI 模型",-1)])]),_:1}),a(u,{command:"file.export.png",divided:""},{default:l(()=>[...i[9]||(i[9]=[y("导出 PNG",-1)])]),_:1}),a(u,{command:"file.export.svg"},{default:l(()=>[...i[10]||(i[10]=[y("导出 SVG",-1)])]),_:1}),a(u,{command:"file.export.json"},{default:l(()=>[...i[11]||(i[11]=[y("导出 JSON",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[4]||(i[4]=[y("导入",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.cut"},{default:l(()=>[...i[13]||(i[13]=[y("剪切 (Ctrl+X)",-1)])]),_:1}),a(u,{command:"edit.copy"},{default:l(()=>[...i[14]||(i[14]=[y("复制 (Ctrl+C)",-1)])]),_:1}),a(u,{command:"edit.paste"},{default:l(()=>[...i[15]||(i[15]=[y("粘贴 (Ctrl+V)",-1)])]),_:1}),a(u,{command:"edit.delete"},{default:l(()=>[...i[16]||(i[16]=[y("删除 (Del)",-1)])]),_:1}),a(u,{command:"edit.selectAll",divided:""},{default:l(()=>[...i[17]||(i[17]=[y("全选",-1)])]),_:1}),a(u,{command:"edit.invert"},{default:l(()=>[...i[18]||(i[18]=[y("反选",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[12]||(i[12]=[y("编辑",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"edit.undo",disabled:!n.canUndo},{default:l(()=>[...i[20]||(i[20]=[y("撤销 (Ctrl+Z)",-1)])]),_:1},8,["disabled"]),a(u,{command:"edit.redo",disabled:!n.canRedo},{default:l(()=>[...i[21]||(i[21]=[y("重做 (Ctrl+Y)",-1)])]),_:1},8,["disabled"])]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[19]||(i[19]=[y("撤销",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"view.fitAll"},{default:l(()=>[...i[23]||(i[23]=[y("缩放至全屏",-1)])]),_:1}),a(u,{command:"view.fitSelection"},{default:l(()=>[...i[24]||(i[24]=[y("缩放至选中",-1)])]),_:1}),a(u,{command:"view.toggleGrid",divided:""},{default:l(()=>[...i[25]||(i[25]=[y("显示网格",-1)])]),_:1}),a(u,{command:"view.toggleScale"},{default:l(()=>[...i[26]||(i[26]=[y("显示比例尺",-1)])]),_:1}),a(u,{command:"view.toggle2D"},{default:l(()=>[...i[27]||(i[27]=[y("切换 2D / 3D",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[22]||(i[22]=[y("视图",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,null,{default:l(()=>[a(u,{command:"layer.new"},{default:l(()=>[...i[29]||(i[29]=[y("新建图层…",-1)])]),_:1}),a(u,{command:"layer.toggleVisibility"},{default:l(()=>[...i[30]||(i[30]=[y("切换显示图层…",-1)])]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[28]||(i[28]=[y("图层",-1)])]),_:1})]),_:1}),a($,{trigger:"click",onCommand:f},{dropdown:l(()=>[a(z,{class:"topbar-filter-menu"},{default:l(()=>[a(u,{disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[32]||(i[32]=[y("选择(可拾取)",-1)])]),_:1}),a(u,{command:"view.select.sites"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.sites))+" 站点",1)]),_:1}),a(u,{command:"view.select.tracks"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.tracks))+" 路径",1)]),_:1}),a(u,{command:"view.select.cars"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.cars))+" AGV",1)]),_:1}),a(u,{command:"view.select.decor"},{default:l(()=>[y(T(h(n.viewFilter.selectFilter.decor))+" 区域 / 装饰",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[33]||(i[33]=[y("对齐(鼠标吸附)",-1)])]),_:1}),a(u,{command:"view.snap.sites"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.sites))+" 吸附站点",1)]),_:1}),a(u,{command:"view.snap.cars"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.cars))+" 吸附 AGV",1)]),_:1}),a(u,{command:"view.snap.tracks"},{default:l(()=>[y(T(h(n.viewFilter.alignSnap.tracks))+" 吸附路径",1)]),_:1}),a(u,{divided:"",disabled:"",class:"topbar-filter-header"},{default:l(()=>[...i[34]||(i[34]=[y("显示内容",-1)])]),_:1}),a(u,{command:"view.show.sceneLabels"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.sceneLabels))+" 场景图元标记",1)]),_:1}),a(u,{command:"view.show.scenePrimitives"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.scenePrimitives))+" 场景图元",1)]),_:1}),a(u,{command:"view.show.cars"},{default:l(()=>[y(T(h(n.viewFilter.showViewport.cars))+" 车辆",1)]),_:1})]),_:1})]),default:l(()=>[a(k,{text:"",class:"topbar-btn"},{default:l(()=>[...i[31]||(i[31]=[y("过滤",-1)])]),_:1})]),_:1}),i[37]||(i[37]=r("div",{class:"spacer"},null,-1)),a(p,{content:"撤销 (Ctrl+Z)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!n.canUndo,class:"topbar-icon-btn",onClick:i[1]||(i[1]=m=>f("edit.undo"))},{default:l(()=>[...i[35]||(i[35]=[y("↶",-1)])]),_:1},8,["disabled"])]),_:1}),a(p,{content:"重做 (Ctrl+Y)",placement:"bottom"},{default:l(()=>[a(k,{size:"small",disabled:!n.canRedo,class:"topbar-icon-btn",onClick:i[2]||(i[2]=m=>f("edit.redo"))},{default:l(()=>[...i[36]||(i[36]=[y("↷",-1)])]),_:1},8,["disabled"])]),_:1})])}}}),Ra=Ne(Da,[["__scopeId","data-v-1082d582"]]),ja={class:"edit-tool-rail"},Oa={class:"rail-group-title"},Ya={class:"rail-group-text"},Ka={class:"rail-group-list"},Ha=["onClick"],Xa={class:"rail-btn-glyph"},Wa={class:"rail-btn-label"},Ga={key:0,class:"rail-divider"},qa={class:"rail-group rail-group-ai"},Za=Ae({__name:"EditToolRail",props:{activeTool:{}},emits:["select-tool","open-ai"],setup(n,{emit:N}){const g=n,f=N,h=[{id:"select",title:"选择",tools:[{id:"select.single",label:"单选",glyph:"⌖",tip:"点击拾取单个对象"},{id:"select.rect",label:"矩形框选",glyph:"▱"},{id:"select.lasso",label:"套索圈选",glyph:"◯"},{id:"select.byType.site",label:"仅站点",glyph:"·"},{id:"select.byType.polyline",label:"仅折线",glyph:"╱",tip:"仅 UITrack(直线/折线)"},{id:"select.byType.bezier",label:"仅贝塞尔",glyph:"∽",tip:"仅 UIBezierTrack"},{id:"select.byType.arc",label:"仅弧形",glyph:"◜",tip:"仅 UICircularArcTrack"},{id:"select.byType.decor",label:"仅装饰",glyph:"★"},{id:"select.byType.currentLayer",label:"当前图层",glyph:"▤",tip:"保留当前图层对象"},{id:"select.invert",label:"反选",glyph:"⇄"},{id:"select.clear",label:"清空选中",glyph:"⊘"}]},{id:"draw",title:"绘制",tools:[{id:"draw.site",label:"添加站点",glyph:"+",tip:"点击工具后在画布单击放置"},{id:"draw.sites.continuous",label:"连续站点",glyph:"⁂",tip:"切换工具或 Esc 退出"},{id:"draw.track.polyline",label:"折线路径",glyph:"─",tip:"依序点击两端站点"},{id:"draw.track.bezier",label:"贝塞尔路径",glyph:"∼",tip:"点两端站点 → 弹框输入中间控制点个数 → 连续点选每个控制点"},{id:"draw.track.arc",label:"弧形路径",glyph:"◜",tip:"点两端站点 → 输入半径(≥ |AB|/2,等于即半圆)"},{id:"draw.decor.line",label:"装饰线段",glyph:"╱"},{id:"draw.decor.rect",label:"装饰矩形",glyph:"▭"},{id:"draw.decor.circle",label:"装饰圆",glyph:"◯"},{id:"draw.decor.text",label:"装饰文本",glyph:"T"},{id:"draw.image",label:"插入图片",glyph:"🖼"},{id:"draw.model",label:"插入模型",glyph:"◎",tip:"CycleGUI 3D 模型 (obj/glb/gltf)"}]},{id:"transform",title:"变换",tools:[{id:"transform.move",label:"移动",glyph:"✥"},{id:"transform.rotate",label:"旋转",glyph:"⟳"},{id:"transform.scale",label:"缩放",glyph:"⤡"},{id:"transform.duplicate",label:"复制副本",glyph:"⎘",tip:"Ctrl+D"},{id:"transform.copy",label:"复制",glyph:"📋",tip:"Ctrl+C"},{id:"transform.paste",label:"粘贴",glyph:"📥",tip:"Ctrl+V"},{id:"transform.delete",label:"删除",glyph:"🗑",tip:"Delete"},{id:"transform.copyFields",label:"复制字段",glyph:"⇉",tip:"多选时第 1 个为源,其余为目标"}]},{id:"align",title:"对齐",tools:[{id:"align.left",label:"左对齐",glyph:"⫷"},{id:"align.right",label:"右对齐",glyph:"⫸"},{id:"align.top",label:"上对齐",glyph:"⫵"},{id:"align.bottom",label:"下对齐",glyph:"⫶"},{id:"align.centerH",label:"水平居中",glyph:"⇔"},{id:"align.centerV",label:"垂直居中",glyph:"⇕"},{id:"align.center",label:"整体居中",glyph:"⊕"},{id:"align.distributeH",label:"水平等距",glyph:"⇿"},{id:"align.distributeV",label:"垂直等距",glyph:"⇳"},{id:"align.toFirst",label:"对齐到首",glyph:"⏮"},{id:"align.toLast",label:"对齐到尾",glyph:"⏭"}]},{id:"batch",title:"批量生成",tools:[{id:"batch.linearH",label:"横向间距",glyph:"⇢"},{id:"batch.linearV",label:"纵向间距",glyph:"⇣"},{id:"batch.matrix",label:"矩阵生成",glyph:"#"},{id:"batch.alongPath",label:"沿路径采样",glyph:"⤳",tip:"先选 1+ 条路径,再点本工具"},{id:"batch.circular",label:"环形阵列",glyph:"◌"}]},{id:"show",title:"显示",tools:[{id:"show.controlPoints",label:"控制点",glyph:"⊙"},{id:"show.controlHandles",label:"控制柄",glyph:"⊝"}]}];function C(k){return k===g.activeTool}function i(k){f("select-tool",k)}return(k,u)=>{const z=ut,$=xa;return _(),U("div",ja,[a($,{class:"rail-scroll"},{default:l(()=>[(_(),U(de,null,we(h,(p,m)=>r("div",{key:p.id,class:"rail-group"},[r("div",Oa,[u[1]||(u[1]=r("span",{class:"rail-group-bar"},null,-1)),r("span",Ya,T(p.title),1),u[2]||(u[2]=r("span",{class:"rail-group-bar"},null,-1))]),r("div",Ka,[(_(!0),U(de,null,we(p.tools,M=>(_(),ee(z,{key:M.id,content:M.tip??M.label,placement:"right","show-after":280},{default:l(()=>[r("button",{class:Se(["rail-btn",{"rail-btn--active":C(M.id)}]),onClick:I=>i(M.id)},[r("span",Xa,T(M.glyph),1),r("span",Wa,T(M.label),1)],10,Ha)]),_:2},1032,["content"]))),128))]),mf("open-ai"))},[...u[3]||(u[3]=[r("span",{class:"rail-btn-glyph"},"✦",-1),r("span",{class:"rail-btn-label"},"AI 生图",-1)])])])]),_:1})])}}}),Ja=Ne(Za,[["__scopeId","data-v-6b284dea"]]),Qa={class:"edit-property-panel"},el={key:0,class:"empty-hint"},tl={key:1,class:"loading-hint"},al={key:2,class:"object-pane"},ll={class:"prop-card prop-card--header"},nl={class:"prop-card-row"},ol={class:"prop-id-block"},sl={class:"prop-id-tag"},il={class:"prop-type-tag"},rl={class:"prop-header-actions"},ul=["disabled"],dl={class:"prop-delete-icon"},cl={class:"prop-card-row prop-name-row"},pl={class:"prop-card-row prop-layer-row"},ml={key:0,class:"prop-card prop-card--geom"},fl={class:"prop-card-header"},yl=["title"],vl={class:"prop-card-flag-text"},bl={class:"prop-card-meta"},gl={class:"prop-grid"},wl={class:"prop-field-label"},kl={key:0,class:"prop-field-unit"},hl={key:1,class:"prop-card prop-card--style"},xl={class:"prop-card-header"},Sl={class:"prop-card-meta"},_l={class:"prop-grid"},Vl={class:"prop-field-label"},Cl={class:"prop-card prop-card--custom"},$l={class:"prop-card-header"},Al={class:"prop-card-meta"},Nl={key:0,class:"prop-grid"},Fl=["title"],Tl={class:"prop-field-row"},Il=["onClick"],El={key:1,class:"prop-empty-row"},zl={key:2,class:"prop-card prop-card--status"},Pl={class:"prop-card-header"},Ml={class:"prop-card-meta"},Ul={class:"prop-status-list"},Ll={class:"prop-status-key"},Bl=["title"],Dl={key:3,class:"prop-card prop-card--actions"},Rl={class:"prop-card-header"},jl={class:"prop-card-meta"},Ol={class:"prop-actions"},Yl=["disabled","onClick"],Kl={key:0,class:"prop-action-spinner"},Hl={class:"prop-action-label"},Xl={class:"defaults-pane"},Wl={key:0,class:"empty-hint defaults-empty"},Gl={class:"prop-card prop-card--style"},ql={class:"prop-card-header"},Zl={class:"prop-card-flag-text"},Jl={class:"prop-card"},Ql={class:"prop-card prop-card--style"},en={class:"prop-card-header"},tn={class:"prop-card-flag-text"},an={class:"prop-card"},ln={key:3,class:"loading-hint"},nn=Ae({__name:"EditPropertyPanel",props:{selectionCount:{},primary:{},fields:{},status:{},methods:{},loading:{type:Boolean},layers:{},defaults:{},layerRows:{},selectionKind:{},viewportStyle:{},viewportStyleLoading:{type:Boolean},viewportSyncing:{type:Boolean}},emits:["rename","change-layer","set-field","add-field","exec-action","save-defaults","layer-toggle","add-layer","delete","patch-viewport"],setup(n,{emit:N}){const g=n,f=N,h=A("object"),C=A(!1);let i=null;const k=A(null),u=A(null);fe(()=>g.viewportStyle,b=>{if(!b){k.value=null,u.value=null;return}k.value={...b.site},u.value={...b.track}},{immediate:!0,deep:!0}),fe(()=>g.selectionKind,b=>{(b==="site"||b==="track")&&(h.value="defaults")});function z(){C.value=!0,i&&clearTimeout(i),i=setTimeout(()=>{C.value=!1},1400)}fe(()=>g.viewportSyncing,(b,d)=>{d&&!b&&z()});function $(b){k.value&&(k.value={...k.value,...b},f("patch-viewport",{site:{...k.value}}))}function p(b){u.value&&(u.value={...u.value,...b},f("patch-viewport",{track:{...u.value}}))}const m=A(null),M=A(""),I=A(!1),v=A(!1);let q=null;function Q(){v.value=!0,q&&clearTimeout(q),q=setTimeout(()=>{v.value=!1},1200)}const ye=new Set(["id","name","layerName"]),W=new Set(["x","y","z","cx","cy","cz","dx","dy","dz","sx","sy","ex","ey","startX","startY","endX","endY","size","width","height","depth","angle","rotation","theta","scale","radius","r","siteA","siteB"]),ve=new Set(["color","displaySetting","direction","typeInfo","mustFree","imagePath","modelPath","fontFamily","fontSize","textColor","lineWidth","opacity"]),O={x:"X",y:"Y",z:"Z",size:"大小",width:"宽",height:"高",depth:"厚",angle:"角度",rotation:"旋转",theta:"θ",scale:"缩放",radius:"半径",siteA:"起点站",siteB:"终点站",startX:"起点 X",startY:"起点 Y",endX:"终点 X",endY:"终点 Y",cx:"中心 X",cy:"中心 Y",color:"颜色",displaySetting:"显示设置",direction:"方向",typeInfo:"类型信息",mustFree:"必须互斥",imagePath:"图片路径",modelPath:"模型路径",fontSize:"字号",textColor:"文字色",lineWidth:"线宽",opacity:"透明度"},se={x:"mm",y:"mm",z:"mm",cx:"mm",cy:"mm",cz:"mm",dx:"mm",dy:"mm",dz:"mm",startX:"mm",startY:"mm",endX:"mm",endY:"mm",width:"mm",height:"mm",depth:"mm",size:"mm",radius:"mm",angle:"°",rotation:"°",theta:"°",fontSize:"px",lineWidth:"px"},ie=ne(()=>g.fields.filter(b=>!ye.has(b.key))),te=ne(()=>ie.value.filter(b=>W.has(b.key))),x=ne(()=>ie.value.filter(b=>ve.has(b.key))),V=ne(()=>ie.value.filter(b=>!W.has(b.key)&&!ve.has(b.key)));function G(b){return O[b]??b}function oe(b){return se[b]??""}function ke(b){if(b==null||b==="")return;const d=Number(b);return Number.isFinite(d)?d:void 0}function re(b){return b.toLowerCase().includes("angle")||b.toLowerCase().includes("rotation")||b==="theta"?1:b==="scale"||b==="opacity"?.1:10}function ce(b){return W.has(b)}function _e(b,d){return b==="color"||b==="textColor"?!0:/^#[0-9a-fA-F]{3,8}$/.test(d)}function B(b,d){return d==="true"||d==="false"||d==="True"||d==="False"}function K(b){return b==="true"||b==="True"||b==="1"}const Z=ne(()=>{const b=(g.primary?.status??"").toLowerCase();return b?b.includes("error")||b.includes("alarm")||b.includes("failed")?"danger":b.includes("warn")||b.includes("idle")?"warning":b.includes("online")||b.includes("running")||b.includes("ready")||b.includes("ok")?"success":"info":"info"}),he=A("");fe(()=>g.primary?.name??"",b=>{he.value=b},{immediate:!0});function Qe(){Oe()}function Oe(){if(!g.primary)return;const b=he.value;b!==(g.primary.name??"")&&f("rename",b)}function Fe(b){f("change-layer",b)}function ae(b,d){f("set-field",b,d),W.has(b)&&Q()}function Ye(){f("add-field")}async function We(b){try{m.value=b,f("exec-action",b)}finally{m.value=null}}function Te(){f("save-defaults")}function Ie(b){f("layer-toggle",b)}function xe(){const b=M.value.trim();b&&(f("add-layer",b),M.value="")}function Ee(){g.selectionCount===0||I.value||(I.value=!0,f("delete"),setTimeout(()=>{I.value=!1},600))}return(b,d)=>{const ze=dt,ue=Pt,Pe=ut,be=ct,Ge=Va,Me=Ca,pe=It,ge=Et,Ue=zt,Le=_a,et=pt,H=Tt,Ve=Ft,Be=Xe,Ce=ft,qe=mt,tt=Sa;return _(),U("div",Qa,[a(tt,{modelValue:h.value,"onUpdate:modelValue":d[20]||(d[20]=c=>h.value=c),class:"prop-tabs"},{default:l(()=>[a(Le,{label:"对象",name:"object"},{default:l(()=>[n.selectionCount===0?(_(),U("div",el,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[21]||(d[21]=r("span",{class:"empty-title"},"未选中对象",-1)),d[22]||(d[22]=r("span",{class:"empty-desc"},"在画布上点击或框选以编辑属性。",-1))])):n.loading?(_(),U("div",tl,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[23]||(d[23]=r("span",null,"加载属性…",-1))])):(_(),U("div",al,[r("section",ll,[r("div",nl,[r("div",ol,[r("span",sl,T(n.selectionCount>1?`多选 ${n.selectionCount}`:`#${n.primary?.id??"-"}`),1),r("span",il,T(n.primary?.typeName??"-"),1)]),r("div",rl,[n.primary?.status?(_(),ee(ue,{key:0,type:Z.value,size:"small",effect:"dark",class:"prop-status-tag"},{default:l(()=>[y(T(n.primary.status),1)]),_:1},8,["type"])):X("",!0),a(Pe,{content:n.selectionCount>1?`删除选中的 ${n.selectionCount} 个对象(可 Ctrl+Z 撤销)`:"删除该对象(可 Ctrl+Z 撤销)",placement:"top","show-after":220},{default:l(()=>[r("button",{type:"button",class:"prop-delete-btn",disabled:I.value,onClick:Ee},[r("span",dl,T(I.value?"⟳":"🗑"),1),d[24]||(d[24]=r("span",null,"删除",-1))],8,ul)]),_:1},8,["content"])])]),r("div",cl,[d[25]||(d[25]=r("label",{class:"prop-name-label"},"名称",-1)),n.primary?(_(),ee(be,{key:0,"model-value":he.value,size:"small",placeholder:"对象名","onUpdate:modelValue":d[0]||(d[0]=c=>he.value=c),onBlur:Qe,onChange:Oe},null,8,["model-value"])):X("",!0)]),r("div",pl,[d[26]||(d[26]=r("label",{class:"prop-name-label"},"图层",-1)),n.primary?(_(),ee(Me,{key:0,"model-value":n.primary.layer??"",size:"small",placeholder:"—",class:"prop-layer-select","onUpdate:modelValue":d[1]||(d[1]=c=>Fe(c))},{default:l(()=>[a(Ge,{label:"(无)",value:""}),(_(!0),U(de,null,we(n.layers,c=>(_(),ee(Ge,{key:c,label:c,value:c},null,8,["label","value"]))),128))]),_:1},8,["model-value"])):X("",!0)])]),te.value.length>0?(_(),U("section",ml,[r("header",fl,[d[28]||(d[28]=r("span",{class:"prop-card-title"},"位置 / 几何",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":v.value}]),title:v.value?"已同步到画布":"改动会立即同步到 SimpleLite 画布"},[d[27]||(d[27]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",vl,T(v.value?"已同步":"同步到画布"),1)],10,yl),r("span",bl,T(te.value.length)+" 项",1)]),r("div",gl,[(_(!0),U(de,null,we(te.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",wl,[y(T(G(c.key))+" ",1),oe(c.key)?(_(),U("span",kl,T(oe(c.key)),1)):X("",!0)]),ce(c.key)?(_(),ee(pe,{key:0,"model-value":ke(c.value),controls:!1,step:re(c.key),size:"small",class:"prop-field-num",onChange:R=>ae(c.key,R==null?"":String(R))},null,8,["model-value","step","onChange"])):(_(),ee(be,{key:1,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):X("",!0),x.value.length>0?(_(),U("section",hl,[r("header",xl,[d[29]||(d[29]=r("span",{class:"prop-card-title"},"样式 / 外观",-1)),r("span",Sl,T(x.value.length)+" 项",1)]),r("div",_l,[(_(!0),U(de,null,we(x.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item"},[r("label",Vl,T(G(c.key)),1),_e(c.key,c.value)?(_(),ee(ge,{key:0,"model-value":c.value||"#ffffff","show-alpha":"",size:"small",onChange:R=>ae(c.key,R??"")},null,8,["model-value","onChange"])):B(c.key,c.value)?(_(),ee(Ue,{key:1,"model-value":K(c.value),size:"small",onChange:R=>ae(c.key,R?"true":"false")},null,8,["model-value","onChange"])):(_(),ee(be,{key:2,"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]))]))),128))])])):X("",!0),r("section",Cl,[r("header",$l,[d[30]||(d[30]=r("span",{class:"prop-card-title"},"其它字段 / 自定义",-1)),r("span",Al,T(V.value.length)+" 项",1)]),V.value.length>0?(_(),U("div",Nl,[(_(!0),U(de,null,we(V.value,c=>(_(),U("div",{key:c.key,class:"prop-grid-item prop-grid-item--wide"},[r("label",{class:"prop-field-label",title:c.key},T(c.key),9,Fl),r("div",Tl,[a(be,{"model-value":c.value,size:"small",spellcheck:"false",onChange:R=>ae(c.key,R)},null,8,["model-value","onChange"]),a(Pe,{content:"删除该字段",placement:"top"},{default:l(()=>[r("button",{class:"prop-field-icon-btn",onClick:R=>ae(c.key,"")},"×",8,Il)]),_:2},1024)])]))),128))])):(_(),U("div",El,"无其它字段")),r("button",{class:"prop-add-field-btn",onClick:Ye},"+ 添加字段")]),n.status.length>0?(_(),U("section",zl,[r("header",Pl,[d[31]||(d[31]=r("span",{class:"prop-card-title"},"运行状态",-1)),r("span",Ml,T(n.status.length)+" 项",1)]),r("div",Ul,[(_(!0),U(de,null,we(n.status,c=>(_(),U("div",{key:c.key,class:"prop-status-item"},[r("span",Ll,T(c.key),1),r("span",{class:"prop-status-value",title:c.value},T(c.value),9,Bl)]))),128))])])):X("",!0),n.methods.length>0?(_(),U("section",Dl,[r("header",Rl,[d[32]||(d[32]=r("span",{class:"prop-card-title"},"操作",-1)),r("span",jl,T(n.methods.length)+" 项",1)]),r("div",Ol,[(_(!0),U(de,null,we(n.methods,c=>(_(),ee(Pe,{key:c.methodName,content:c.description||c.label||c.methodName,placement:"top","show-after":220},{default:l(()=>[r("button",{class:"prop-action-btn",disabled:m.value===c.methodName,onClick:R=>We(c.methodName)},[m.value===c.methodName?(_(),U("span",Kl,"⟳")):X("",!0),d[33]||(d[33]=r("span",{class:"prop-action-icon"},"▶",-1)),r("span",Hl,T(c.label||c.methodName),1)],8,Yl)]),_:2},1032,["content"]))),128))])])):X("",!0)]))]),_:1}),a(Le,{label:"类型默认",name:"defaults"},{default:l(()=>[r("div",Xl,[a(et,{type:"info",closable:!1,class:"defaults-alert"},{default:l(()=>[...d[34]||(d[34]=[y(" 视口样式与 SimpleLite「视口样式」对话框同步,修改后即时重绘画布;下方「新建默认」仅影响下次创建对象。 ",-1)])]),_:1}),n.selectionKind?n.selectionKind==="site"&&k.value?(_(),U(de,{key:1},[r("section",Gl,[r("header",ql,[d[38]||(d[38]=r("span",{class:"prop-card-title"},"站点视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":C.value}])},[d[37]||(d[37]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",Zl,T(n.viewportSyncing?"同步中…":C.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"整体大小倍率"},{default:l(()=>[a(pe,{"model-value":k.value.drawScale,min:.25,max:12,step:.1,controls:!0,"onUpdate:modelValue":d[2]||(d[2]=c=>$({drawScale:c??k.value.drawScale}))},null,8,["model-value"])]),_:1}),a(H,{label:"未选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusNormal,min:1,max:24,step:.5,"onUpdate:modelValue":d[3]||(d[3]=c=>$({dotRadiusNormal:c??k.value.dotRadiusNormal}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中圆点半径"},{default:l(()=>[a(pe,{"model-value":k.value.dotRadiusSelected,min:1,max:32,step:.5,"onUpdate:modelValue":d[4]||(d[4]=c=>$({dotRadiusSelected:c??k.value.dotRadiusSelected}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中环半径 (m)"},{default:l(()=>[a(pe,{"model-value":k.value.selectionRingM,min:.02,max:.8,step:.01,"onUpdate:modelValue":d[5]||(d[5]=c=>$({selectionRingM:c??k.value.selectionRingM}))},null,8,["model-value"])]),_:1}),a(H,{label:"站点颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorNormalArgb),"onUpdate:modelValue":d[6]||(d[6]=c=>$({colorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"站点颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.colorSelectedArgb),"onUpdate:modelValue":d[7]||(d[7]=c=>$({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1}),a(H,{label:"标签颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorNormalArgb),"onUpdate:modelValue":d[8]||(d[8]=c=>$({labelColorNormalArgb:D(Re)(c??"#ffffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"标签颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(k.value.labelColorSelectedArgb),"onUpdate:modelValue":d[9]||(d[9]=c=>$({labelColorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",Jl,[d[40]||(d[40]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建站点默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:n.defaults.site.layer,"onUpdate:modelValue":d[10]||(d[10]=c=>n.defaults.site.layer=c)},null,8,["modelValue"])]),_:1}),a(H,{label:"名字前缀"},{default:l(()=>[a(be,{modelValue:n.defaults.site.namePrefix,"onUpdate:modelValue":d[11]||(d[11]=c=>n.defaults.site.namePrefix=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[39]||(d[39]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):n.selectionKind==="track"&&u.value?(_(),U(de,{key:2},[r("section",Ql,[r("header",en,[d[42]||(d[42]=r("span",{class:"prop-card-title"},"路径视口样式",-1)),r("span",{class:Se(["prop-card-flag",{"is-synced":C.value}])},[d[41]||(d[41]=r("span",{class:"prop-card-flag-dot"},null,-1)),r("span",tn,T(n.viewportSyncing?"同步中…":C.value?"已同步":"实时同步"),1)],2)]),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"线宽倍率"},{default:l(()=>[a(pe,{"model-value":u.value.drawScale,min:.25,max:12,step:.1,"onUpdate:modelValue":d[12]||(d[12]=c=>p({drawScale:c??u.value.drawScale}))},null,8,["model-value"])]),_:1}),a(H,{label:"未选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthNormal,min:.4,max:8,step:.1,"onUpdate:modelValue":d[13]||(d[13]=c=>p({widthNormal:c??u.value.widthNormal}))},null,8,["model-value"])]),_:1}),a(H,{label:"选中线宽"},{default:l(()=>[a(pe,{"model-value":u.value.widthSelected,min:.4,max:12,step:.1,"onUpdate:modelValue":d[14]||(d[14]=c=>p({widthSelected:c??u.value.widthSelected}))},null,8,["model-value"])]),_:1}),a(H,{label:"显示方向箭头"},{default:l(()=>[a(Ue,{"model-value":u.value.showDirectionArrows,"onUpdate:modelValue":d[15]||(d[15]=c=>p({showDirectionArrows:!!c}))},null,8,["model-value"])]),_:1}),a(H,{label:"路径颜色(未选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorNormalArgb),"onUpdate:modelValue":d[16]||(d[16]=c=>p({colorNormalArgb:D(Re)(c??"#00ffff")}))},null,8,["model-value"])]),_:1}),a(H,{label:"路径颜色(选中)"},{default:l(()=>[a(ge,{"model-value":D(je)(u.value.colorSelectedArgb),"onUpdate:modelValue":d[17]||(d[17]=c=>p({colorSelectedArgb:D(Re)(c??"#ff0000")}))},null,8,["model-value"])]),_:1})]),_:1})]),r("section",an,[d[44]||(d[44]=r("header",{class:"prop-card-header"},[r("span",{class:"prop-card-title"},"新建路径默认")],-1)),a(Ve,{"label-width":"132px",size:"small",class:"defaults-form"},{default:l(()=>[a(H,{label:"默认图层"},{default:l(()=>[a(be,{modelValue:n.defaults.track.layer,"onUpdate:modelValue":d[18]||(d[18]=c=>n.defaults.track.layer=c)},null,8,["modelValue"])]),_:1}),a(Be,{size:"small",type:"primary",plain:"",onClick:Te},{default:l(()=>[...d[43]||(d[43]=[y("保存新建默认",-1)])]),_:1})]),_:1})])],64)):n.viewportStyleLoading?(_(),U("div",ln,[a(ze,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),d[45]||(d[45]=r("span",null,"加载视口样式…",-1))])):X("",!0):(_(),U("div",Wl,[a(ze,{class:"empty-icon"},{default:l(()=>[a(D(_t))]),_:1}),d[35]||(d[35]=r("span",{class:"empty-title"},"请选中站点或路径",-1)),d[36]||(d[36]=r("span",{class:"empty-desc"},"在画布上选中一个站点或路径后,可在此调整对应视口样式。",-1))]))])]),_:1}),a(Le,{label:"图层",name:"layers"},{default:l(()=>[a(qe,{data:n.layerRows,size:"small",class:"layer-table"},{default:l(()=>[a(Ce,{prop:"name",label:"图层",width:"120"}),a(Ce,{label:"可见",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.visible,"onUpdate:modelValue":R=>c.visible=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"可选",width:"60"},{default:l(({row:c})=>[a(Ue,{modelValue:c.selectable,"onUpdate:modelValue":R=>c.selectable=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1}),a(Ce,{label:"颜色"},{default:l(({row:c})=>[a(ge,{modelValue:c.color,"onUpdate:modelValue":R=>c.color=R,onChange:R=>Ie(c)},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:1})]),_:1},8,["data"]),a(be,{modelValue:M.value,"onUpdate:modelValue":d[19]||(d[19]=c=>M.value=c),size:"small",placeholder:"新图层名",class:"new-layer"},{append:l(()=>[a(Be,{onClick:xe},{default:l(()=>[...d[46]||(d[46]=[y("添加",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})]),_:1},8,["modelValue"])])}}}),on=Ne(nn,[["__scopeId","data-v-781515fe"]]),sn={class:"edit-status-bar"},rn={class:"seg"},un={class:"seg"},dn={class:"seg"},cn={class:"seg"},pn={class:"seg"},mn={key:0,class:"seg ok"},fn={key:1,class:"seg warn"},yn=Ae({__name:"EditStatusBar",props:{selectedCount:{},mouseX:{},mouseY:{},toolLabel:{},snapOn:{type:Boolean},undoSize:{},redoSize:{},connected:{type:Boolean}},setup(n){function N(g){return Number.isFinite(g)?g.toFixed(0):"--"}return(g,f)=>(_(),U("div",sn,[r("span",rn,[f[0]||(f[0]=y(" 选中 ",-1)),r("b",null,T(n.selectedCount),1),f[1]||(f[1]=y(" 个 ",-1))]),r("span",un," 鼠标 ("+T(N(n.mouseX))+", "+T(N(n.mouseY))+") mm ",1),r("span",dn,[f[2]||(f[2]=y(" 当前工具:",-1)),r("b",null,T(n.toolLabel),1)]),r("span",cn,[f[3]||(f[3]=y(" 吸附:",-1)),r("b",{class:Se({on:n.snapOn,off:!n.snapOn})},T(n.snapOn?"开":"关"),3)]),f[4]||(f[4]=r("span",{class:"spacer"},null,-1)),r("span",pn,"历史 "+T(n.undoSize)+" / "+T(n.redoSize),1),n.connected?(_(),U("span",mn,"● 实时通道在线")):(_(),U("span",fn,"● 实时通道断开"))]))}}),vn=Ne(yn,[["__scopeId","data-v-6254b10f"]]),bn={class:"upload-hint"},gn={key:0,class:"ai-text"},wn={class:"ai-stat"},kn=Ae({__name:"AiGenerateDialog",props:{modelValue:{type:Boolean},configured:{type:Boolean},defaultBounds:{},defaultLayer:{}},emits:["update:modelValue","generated"],setup(n,{emit:N}){const g=n,f=N,h=yt(),C=A(!1),i=A(null),k=A(["r"]),u=Je({prompt:"",mode:"sites+tracks",referenceImageBase64:void 0,layer:g.defaultLayer??"ai-generated",constraints:""}),z=A(g.defaultBounds??[-1e4,-1e4,1e4,1e4]);fe(()=>g.defaultBounds,I=>{I&&(z.value=I)}),fe(()=>g.defaultLayer,I=>{I&&(u.layer=I)});function $(){f("update:modelValue",!1)}function p(){f("update:modelValue",!1),h.push("/admin/config/system")}async function m(I){if(!I.raw)return;const v=new FileReader;v.onload=()=>{const q=String(v.result||""),Q=q.includes(",")?q.split(",",2)[1]:q;u.referenceImageBase64=Q},v.readAsDataURL(I.raw)}async function M(){try{C.value=!0,u.bounds=z.value;const I=await j.aiMapGenerate(u);i.value=I,F.success(`AI 已生成 ${I.created?.length??0} 个对象`),f("generated",I)}catch(I){F.error(`AI 生图失败:${I.message}`)}finally{C.value=!1}}return(I,v)=>{const q=Bt,Q=pt,ye=ct,W=Tt,ve=dt,O=$a,se=Lt,ie=Ut,te=It,x=Ft,V=ft,G=Pt,oe=mt,ke=Fa,re=Na,ce=Xe,_e=Mt;return _(),ee(_e,{"model-value":n.modelValue,title:"AI 生图",width:"640px",class:"ai-generate-dialog","onUpdate:modelValue":v[9]||(v[9]=B=>f("update:modelValue",B)),onClose:$},{footer:l(()=>[a(ce,{onClick:$},{default:l(()=>[...v[20]||(v[20]=[y("关闭",-1)])]),_:1}),a(ce,{type:"primary",loading:C.value,disabled:!u.prompt.trim()||!n.configured,onClick:M},{default:l(()=>[...v[21]||(v[21]=[y(" 生成并落地 ",-1)])]),_:1},8,["loading","disabled"])]),default:l(()=>[n.configured?X("",!0):(_(),ee(Q,{key:0,type:"warning",closable:!1,class:"cfg-alert"},{default:l(()=>[v[11]||(v[11]=y(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(q,{type:"primary",onClick:p},{default:l(()=>[...v[10]||(v[10]=[y("系统级配置 → AI 服务",-1)])]),_:1}),v[12]||(v[12]=y(" 完成配置。 ",-1))]),_:1})),a(x,{"label-width":"100px",size:"default"},{default:l(()=>[a(W,{label:"提示词",required:""},{default:l(()=>[a(ye,{modelValue:u.prompt,"onUpdate:modelValue":v[0]||(v[0]=B=>u.prompt=B),type:"textarea",rows:4,placeholder:"一条 U 型生产线,含 5 个工站,间距 2m,方向单向通行..."},null,8,["modelValue"])]),_:1}),a(W,{label:"参考图片"},{default:l(()=>[a(O,{drag:"","auto-upload":!1,"show-file-list":!1,accept:"image/*",onChange:m},{default:l(()=>[r("div",bn,[a(ve,null,{default:l(()=>[a(D(Aa))]),_:1}),r("span",null,T(u.referenceImageBase64?"已选择图片 (点击替换)":"拖入或点击上传参考图(可选,多模态)"),1)])]),_:1})]),_:1}),a(W,{label:"生成模式"},{default:l(()=>[a(ie,{modelValue:u.mode,"onUpdate:modelValue":v[1]||(v[1]=B=>u.mode=B)},{default:l(()=>[a(se,{value:"sites"},{default:l(()=>[...v[13]||(v[13]=[y("仅站点",-1)])]),_:1}),a(se,{value:"tracks"},{default:l(()=>[...v[14]||(v[14]=[y("仅路径",-1)])]),_:1}),a(se,{value:"sites+tracks"},{default:l(()=>[...v[15]||(v[15]=[y("站点+路径",-1)])]),_:1}),a(se,{value:"full"},{default:l(()=>[...v[16]||(v[16]=[y("完整地图",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),a(W,{label:"范围 (mm)"},{default:l(()=>[a(te,{modelValue:z.value[0],"onUpdate:modelValue":v[2]||(v[2]=B=>z.value[0]=B),placeholder:"x1",step:500},null,8,["modelValue"]),a(te,{modelValue:z.value[1],"onUpdate:modelValue":v[3]||(v[3]=B=>z.value[1]=B),placeholder:"y1",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[2],"onUpdate:modelValue":v[4]||(v[4]=B=>z.value[2]=B),placeholder:"x2",step:500,class:"ml"},null,8,["modelValue"]),a(te,{modelValue:z.value[3],"onUpdate:modelValue":v[5]||(v[5]=B=>z.value[3]=B),placeholder:"y2",step:500,class:"ml"},null,8,["modelValue"])]),_:1}),a(W,{label:"图层"},{default:l(()=>[a(ye,{modelValue:u.layer,"onUpdate:modelValue":v[6]||(v[6]=B=>u.layer=B),placeholder:"ai-generated(默认)"},null,8,["modelValue"])]),_:1}),a(W,{label:"附加约束"},{default:l(()=>[a(ye,{modelValue:u.constraints,"onUpdate:modelValue":v[7]||(v[7]=B=>u.constraints=B),placeholder:"例如:单向通行、最小转弯半径 1500mm"},null,8,["modelValue"])]),_:1})]),_:1}),i.value?(_(),ee(re,{key:1,modelValue:k.value,"onUpdate:modelValue":v[8]||(v[8]=B=>k.value=B),class:"result-panel"},{default:l(()=>[a(ke,{title:"AI 返回 / 落地结果",name:"r"},{default:l(()=>[i.value.assistantText?(_(),U("div",gn,T(i.value.assistantText),1)):X("",!0),r("div",wn,[v[17]||(v[17]=y(" 落地对象 ",-1)),r("b",null,T(i.value.created?.length??0),1),v[18]||(v[18]=y(",工具调用次数 ",-1)),r("b",null,T(i.value.usedTools),1),v[19]||(v[19]=y("。 ",-1))]),a(oe,{data:i.value.created??[],size:"small","max-height":"220"},{default:l(()=>[a(V,{label:"工具",prop:"tool",width:"160"}),a(V,{label:"kind",prop:"kind",width:"80"}),a(V,{label:"id",prop:"id",width:"80"}),a(V,{label:"typeName",prop:"typeName"}),a(V,{label:"错误"},{default:l(({row:B})=>[B.error?(_(),ee(G,{key:0,type:"danger",size:"small"},{default:l(()=>[y(T(B.error),1)]),_:2},1024)):X("",!0)]),_:1})]),_:1},8,["data"])]),_:1})]),_:1},8,["modelValue"])):X("",!0)]),_:1},8,["model-value"])}}}),hn=Ne(kn,[["__scopeId","data-v-47584778"]]),xn={key:0,class:"aap-empty"},Sn=["onClick"],_n={class:"aap-bubble"},Vn={class:"aap-bubble-text"},Cn={key:0,class:"aap-meta"},$n={key:1,class:"aap-msg aap-msg--assistant"},An={class:"aap-bubble aap-bubble--loading"},Nn={class:"aap-toolbar"},Fn={class:"aap-input"},Vt=300,Ct=720,$t="mapEditor.aiAssistant.mode",Tn=Ae({__name:"AiAssistantPanel",props:{open:{type:Boolean},configured:{type:Boolean},width:{},defaultBounds:{},defaultLayer:{}},emits:["update:open","update:width","generated"],setup(n,{emit:N}){const g=n,f=N,h=ne(()=>Math.min(Ct,Math.max(Vt,g.width??360))),C=yt(),i=A([]),k=A(""),u=A(!1),z=A(null);function $(){const x=localStorage.getItem($t);return x==="sites"||x==="tracks"||x==="sites+tracks"||x==="full"?x:"sites+tracks"}const p=A($());fe(p,x=>{try{localStorage.setItem($t,x)}catch{}});let m=!1,M=0,I=0;function v(x){m=!0,M=x.clientX,I=h.value,x.currentTarget.setPointerCapture?.(x.pointerId),x.preventDefault()}function q(x){if(!m)return;const V=Math.min(Ct,Math.max(Vt,I+(M-x.clientX)));f("update:width",V)}function Q(x){m&&(m=!1,x.currentTarget.releasePointerCapture?.(x.pointerId))}Dt(()=>{m=!1});const ye=["生成一条横向直线,5 个站点,间距 2000mm","画一个 3×3 的站点矩阵,间距 2500mm","一条 U 型产线,含 5 个工站,单向通行"];function W(){f("update:open",!1)}function ve(){W(),C.push("/admin/config/system")}function O(x){k.value=x}function se(x){x instanceof KeyboardEvent&&x.key==="Enter"&&!x.shiftKey&&!x.isComposing&&(x.preventDefault(),te())}async function ie(){await Ia();const x=z.value;x&&(x.scrollTop=x.scrollHeight)}async function te(){const x=k.value.trim();if(!(!x||u.value||!g.configured)){i.value.push({role:"user",text:x}),k.value="",ie(),u.value=!0;try{const V={prompt:x,mode:p.value,bounds:g.defaultBounds,layer:g.defaultLayer},G=await j.aiMapGenerate(V),oe=G.created?.length??0;i.value.push({role:"assistant",text:G.assistantText?.trim()||`已根据你的描述生成并落地 ${oe} 个对象。`,meta:{created:oe,usedTools:G.usedTools??0}}),f("generated",G)}catch(V){const G=V.message;i.value.push({role:"assistant",text:`生成失败:${G}`}),F.error(`AI 助手生成失败:${G}`)}finally{u.value=!1,ie()}}}return(x,V)=>{const G=Bt,oe=pt,ke=dt,re=Lt,ce=Ut,_e=ct,B=Xe;return _(),U("div",{class:Se(["ai-assistant-panel",{"is-open":n.open}]),style:Rt({width:h.value+"px"}),role:"complementary","aria-label":"AI 助手"},[r("div",{class:"aap-resizer",title:"拖拽调整宽度",onPointerdown:v,onPointermove:q,onPointerup:Q,onPointercancel:Q},null,32),r("div",{class:"aap-header"},[V[2]||(V[2]=Ta('
AI 助手
用自然语言描述地图需求,自动生成站点 / 路径
',1)),r("button",{class:"aap-close",type:"button",title:"收起",onClick:W},"✕")]),n.configured?X("",!0):(_(),ee(oe,{key:0,type:"warning",closable:!1,class:"aap-alert"},{default:l(()=>[V[4]||(V[4]=y(" 尚未配置 AI 服务(apiKey / endpoint)。请先到 ",-1)),a(G,{type:"primary",onClick:ve},{default:l(()=>[...V[3]||(V[3]=[y("系统级配置 → AI 服务",-1)])]),_:1}),V[5]||(V[5]=y(" 完成配置。 ",-1))]),_:1})),r("div",{ref_key:"listRef",ref:z,class:"aap-messages"},[i.value.length===0?(_(),U("div",xn,[V[6]||(V[6]=r("div",{class:"aap-empty-title"},"试着这样说:",-1)),(_(),U(de,null,we(ye,(K,Z)=>r("button",{key:Z,type:"button",class:"aap-example",onClick:he=>O(K)},T(K),9,Sn)),64))])):X("",!0),(_(!0),U(de,null,we(i.value,(K,Z)=>(_(),U("div",{key:Z,class:Se(["aap-msg",`aap-msg--${K.role}`])},[r("div",_n,[r("div",Vn,T(K.text),1),K.role==="assistant"&&K.meta?(_(),U("div",Cn,[V[7]||(V[7]=y(" 落地对象 ",-1)),r("b",null,T(K.meta.created),1),V[8]||(V[8]=y(" · 工具调用 ",-1)),r("b",null,T(K.meta.usedTools),1)])):X("",!0)])],2))),128)),u.value?(_(),U("div",$n,[r("div",An,[a(ke,{class:"is-loading"},{default:l(()=>[a(D(rt))]),_:1}),V[9]||(V[9]=r("span",null,"AI 正在生成…",-1))])])):X("",!0)],512),r("div",Nn,[V[14]||(V[14]=r("span",{class:"aap-toolbar-label"},"生成模式",-1)),a(ce,{modelValue:p.value,"onUpdate:modelValue":V[0]||(V[0]=K=>p.value=K),size:"small"},{default:l(()=>[a(re,{value:"sites"},{default:l(()=>[...V[10]||(V[10]=[y("站点",-1)])]),_:1}),a(re,{value:"tracks"},{default:l(()=>[...V[11]||(V[11]=[y("路径",-1)])]),_:1}),a(re,{value:"sites+tracks"},{default:l(()=>[...V[12]||(V[12]=[y("站点+路径",-1)])]),_:1}),a(re,{value:"full"},{default:l(()=>[...V[13]||(V[13]=[y("完整",-1)])]),_:1})]),_:1},8,["modelValue"])]),r("div",Fn,[a(_e,{modelValue:k.value,"onUpdate:modelValue":V[1]||(V[1]=K=>k.value=K),type:"textarea",rows:3,resize:"none",disabled:!n.configured||u.value,placeholder:"例如:一条 U 型生产线,含 5 个工站,间距 2m,单向通行…(Enter 发送,Shift+Enter 换行)",onKeydown:se},null,8,["modelValue","disabled"]),a(B,{type:"primary",class:"aap-send",loading:u.value,disabled:!n.configured||!k.value.trim(),onClick:te},{default:l(()=>[...V[15]||(V[15]=[y("发送",-1)])]),_:1},8,["loading","disabled"])])],6)}}}),In=Ne(Tn,[["__scopeId","data-v-9fed2b0d"]]);function En(){const n=A("transform.move"),N=A({grid:!1,gridSizeMm:100,object:!0,endpoint:!0,midpoint:!1,toAngleDeg:void 0}),g=A(!0),f=A(!0),h=ne(()=>{const u=n.value;return u.startsWith("select.")?"select":u.startsWith("draw.")?"draw":u.startsWith("transform.")?"transform":u.startsWith("align.")?"align":u.startsWith("batch.")?"batch":u.startsWith("snap.")?"snap":"show"}),C=ne(()=>({"select.single":"单选","select.rect":"矩形框选","select.lasso":"圈选","select.byType.site":"按类型选 - 站点","select.byType.bezier":"按类型选 - 贝塞尔","select.byType.polyline":"按类型选 - 折线","select.byType.arc":"按类型选 - 弧","select.byType.decor":"按类型选 - 装饰物","select.byType.currentLayer":"按类型选 - 当前图层","select.invert":"反选","select.clear":"清空选中","draw.site":"添加站点","draw.sites.continuous":"连续添加站点","draw.track.polyline":"添加折线路径","draw.track.bezier":"添加贝塞尔路径","draw.track.arc":"添加弧形路径","draw.track.nurbs":"添加 NURBS 路径","draw.decor.line":"添加线段","draw.decor.rect":"添加矩形","draw.decor.circle":"添加圆","draw.decor.text":"添加文本","draw.image":"插入图片","draw.model":"插入 3D 模型","transform.move":"移动","transform.rotate":"旋转","transform.scale":"缩放","transform.duplicate":"复制副本","transform.copy":"复制","transform.paste":"粘贴","transform.delete":"删除","transform.copyFields":"复制字段","align.left":"左对齐","align.right":"右对齐","align.top":"上对齐","align.bottom":"下对齐","align.centerH":"水平居中","align.centerV":"垂直居中","align.center":"整体居中","align.distributeH":"水平等距","align.distributeV":"垂直等距","align.toFirst":"对齐到第一个","align.toLast":"对齐到最后一个","batch.linearH":"横向间隔生成","batch.linearV":"纵向间隔生成","batch.matrix":"矩阵生成","batch.alongPath":"沿路径采样生成","batch.circular":"环形阵列","snap.grid":"网格吸附","snap.object":"对象吸附","snap.endpoint":"端点吸附","snap.midpoint":"中点吸附","show.controlPoints":"显示控制点","show.controlHandles":"显示控制柄"})[n.value]??n.value);function i(u){n.value=u}function k(u){N.value={...N.value,[u]:!N.value[u]}}return{activeTool:n,snap:N,showControlPoints:g,showControlHandles:f,toolCategory:h,toolLabel:C,setTool:i,toggleSnap:k}}function $e(n,N){return`${n}:${N}`}function zn(){const n=A([]),N=A(null),g=ne(()=>n.value.map(m=>m.id)),f=ne(()=>n.value.length);function h(m,M){const I=$e(m,M);return n.value.some(v=>$e(v.kind,v.id)===I)}function C(m){h(m.kind,m.id)||(n.value=[...n.value,m],N.value=$e(m.kind,m.id))}function i(m,M){const I=$e(m,M);n.value=n.value.filter(v=>$e(v.kind,v.id)!==I),N.value===I&&(N.value=null)}function k(m){h(m.kind,m.id)?i(m.kind,m.id):C(m)}function u(m){n.value=m,N.value=m.length>0?$e(m[m.length-1].kind,m[m.length-1].id):null}function z(){n.value=[],N.value=null}function $(m){n.value=n.value.filter(M=>M.kind===m)}function p(m){n.value=[m],N.value=$e(m.kind,m.id)}return{items:n,ids:g,count:f,lastClickedKey:N,has:h,add:C,remove:i,toggle:k,set:u,clear:z,filterByKind:$,selectSingle:p}}function Pn(n={}){const N=n.maxDepth??20,g=A([]),f=A([]),h=A(!1),C=ne(()=>g.value.length>0&&!h.value),i=ne(()=>f.value.length>0&&!h.value);async function k(m){if(!h.value){h.value=!0;try{await m.apply(),g.value=[...g.value,m].slice(-N),f.value=[],n.onChange?.()}finally{h.value=!1}}}async function u(){if(!C.value)return;const m=g.value[g.value.length-1];h.value=!0;try{await m.revert(),g.value=g.value.slice(0,-1),f.value=[...f.value,m].slice(-N),n.onChange?.()}finally{h.value=!1}}async function z(){if(!i.value)return;const m=f.value[f.value.length-1];h.value=!0;try{await m.apply(),f.value=f.value.slice(0,-1),g.value=[...g.value,m].slice(-N),n.onChange?.()}finally{h.value=!1}}function $(){g.value=[],f.value=[],n.onChange?.()}function p(m,M){return{label:m,apply:async()=>{for(const I of M)await I.apply()},revert:async()=>{for(let I=M.length-1;I>=0;I--)await M[I].revert()}}}return{undoStack:g,redoStack:f,busy:h,canUndo:C,canRedo:i,run:k,undo:u,redo:z,clear:$,composite:p}}function Mn(n={}){function N(g){const f=g?.data;if(!f||typeof f!="object"||typeof f.type!="string")return;const h=f.type,C=f.payload;if(h==="workspace.pick"&&n.onPick&&C&&typeof C=="object"&&"x"in C&&"y"in C){const i=C;n.onPick({x:Number(i.x),y:Number(i.y),siteId:typeof i.siteId=="number"?i.siteId:void 0})}else if(h==="workspace.select"&&n.onSelect&&Array.isArray(C))n.onSelect({names:C});else if(h==="workspace.mouse"&&n.onMouse&&C&&typeof C=="object"&&"x"in C&&"y"in C){const i=C;n.onMouse({x:Number(i.x),y:Number(i.y)})}}jt(()=>window.addEventListener("message",N)),Dt(()=>window.removeEventListener("message",N))}function Un(n,N){if(n.length<2)return[];const g=[],f=n.map(p=>p.x),h=n.map(p=>p.y),C=Math.min(...f),i=Math.max(...f),k=Math.min(...h),u=Math.max(...h),z=f.reduce((p,m)=>p+m,0)/f.length,$=h.reduce((p,m)=>p+m,0)/h.length;switch(N){case"left":for(const p of n)g.push(me(p,{x:C}));break;case"right":for(const p of n)g.push(me(p,{x:i}));break;case"top":for(const p of n)g.push(me(p,{y:u}));break;case"bottom":for(const p of n)g.push(me(p,{y:k}));break;case"centerH":for(const p of n)g.push(me(p,{x:z}));break;case"centerV":for(const p of n)g.push(me(p,{y:$}));break;case"center":for(const p of n)g.push(me(p,{x:z,y:$}));break;case"distributeH":{const p=[...n].sort((M,I)=>M.x-I.x),m=(p[p.length-1].x-p[0].x)/(p.length-1);p.forEach((M,I)=>{const v=p[0].x+m*I;Math.abs(v-M.x)>.5&&g.push(me(M,{x:v}))});break}case"distributeV":{const p=[...n].sort((M,I)=>M.y-I.y),m=(p[p.length-1].y-p[0].y)/(p.length-1);p.forEach((M,I)=>{const v=p[0].y+m*I;Math.abs(v-M.y)>.5&&g.push(me(M,{y:v}))});break}case"toFirst":{const p=n[0];for(const m of n.slice(1))g.push(me(m,{x:p.x,y:p.y}));break}case"toLast":{const p=n[n.length-1];for(const m of n.slice(0,-1))g.push(me(m,{x:p.x,y:p.y}));break}}return g}function me(n,N){return{action:"patch",kind:n.kind,id:n.id,data:N}}function Ln(n,N,g,f){return Ot(n,g,N,g,f)}function Bn(n,N,g,f){return Ot(n,N,n,g,f)}function Ot(n,N,g,f,h){const C=[],i=Math.max(2,Math.floor(h.count));for(let k=0;k{const e=p.items.value;if(e.length!==1)return null;const t=e[0].kind;return t==="site"||t==="track"?t:null}),B=A(["g"]),K=A([{name:"g",visible:!0,selectable:!0,color:"#cccccc"}]),Z=Je({selectFilter:{sites:!0,tracks:!0,cars:!0,decor:!0},alignSnap:{sites:!0,cars:!0,tracks:!0},showViewport:{sceneLabels:!0,scenePrimitives:!0,cars:!0}});function he(){try{localStorage.setItem("mapEditor.viewFilter",JSON.stringify(Z))}catch{}}function Qe(){try{const e=localStorage.getItem("mapEditor.viewFilter");if(!e)return;const t=JSON.parse(e);t.selectFilter&&Object.assign(Z.selectFilter,t.selectFilter),t.alignSnap&&Object.assign(Z.alignSnap,t.alignSnap),t.showViewport&&Object.assign(Z.showViewport,t.showViewport)}catch{}}function Oe(){const e=Z.selectFilter,t=p.items.value.filter(o=>o.kind==="site"?e.sites:o.kind==="track"?e.tracks:o.kind==="car"?e.cars:o.kind==="special"?e.decor:!0);t.length!==p.items.value.length&&p.set(t)}const Fe=A(!1),ae=A({siteA:null}),Ye=A(!1),We=A(!1),Te=A("");function Ie(e){return e.map(t=>`${t.kind}:${t.id}`).sort().join(",")}const xe=A(!1),Ee=["draw.site","draw.sites.continuous","draw.track.polyline","draw.track.bezier","draw.track.arc","draw.track.nurbs"];async function b(){if(!xe.value){for(xe.value=!0;xe.value;){let e=null;try{e=await j.pick()}catch{break}if(!xe.value)break;const t=$.activeTool.value;if(!Ee.includes(t))break;if(t==="draw.site"){await c(e.x,e.y),F.success(`已添加站点 (${e.x.toFixed(0)}, ${e.y.toFixed(0)})`);break}else if(t==="draw.sites.continuous")await c(e.x,e.y);else if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){const o=ae.value.siteA;if(await qe(e.siteId),o!=null&&ae.value.siteA==null){const s=t==="draw.track.bezier"?"贝塞尔路径":t==="draw.track.arc"?"弧形路径":t==="draw.track.nurbs"?"NURBS 路径":"直线路径";F.success(`已添加${s}`);break}}else break}xe.value=!1,Ee.includes($.activeTool.value)&&$.setTool("transform.move")}}const d=ne(()=>$.snap.value.grid||$.snap.value.object||$.snap.value.endpoint||$.snap.value.midpoint);async function ze(e){switch(e){case"edit.undo":await m.undo();break;case"edit.redo":await m.redo();break;case"edit.delete":await R();break;case"edit.selectAll":F.info("全选:请使用工具栏「按类型选」批量选中");break;case"edit.invert":F.info("反选功能后续实现");break;case"project.save":await ra();break;case"ai.open":await wt();break;case"file.upload.image":Ze("image");break;case"file.upload.model":Ze("model");break;case"view.fitAll":F.info("请在 3D 视口右键菜单使用「适配全部」");break;case"view.fitSelection":F.info("请在 3D 视口右键菜单使用「适配选中」");break;case"snap.toGrid":$.toggleSnap("grid");break;case"snap.toObject":$.toggleSnap("object");break;case"layer.new":await Le();break;case"layer.toggleVisibility":Fe.value=!0;break;case"view.select.sites":ue("selectFilter","sites");break;case"view.select.tracks":ue("selectFilter","tracks");break;case"view.select.cars":ue("selectFilter","cars");break;case"view.select.decor":ue("selectFilter","decor");break;case"view.snap.sites":ue("alignSnap","sites");break;case"view.snap.cars":ue("alignSnap","cars");break;case"view.snap.tracks":ue("alignSnap","tracks");break;case"view.show.sceneLabels":ue("showViewport","sceneLabels");break;case"view.show.scenePrimitives":ue("showViewport","scenePrimitives");break;case"view.show.cars":ue("showViewport","cars");break;default:F.info(`暂未实现的命令:${e}`)}}async function ue(e,t){const o=Z[e],s=t,w=o[s];o[s]=!o[s],he(),e==="selectFilter"&&Oe();const S={};S[e]={[s]:o[s]};try{await j.setViewFilter(S)}catch(E){console.warn("[MapEditor] 写后端 viewFilter 失败:",E),o[s]=w,he(),e==="selectFilter"&&Oe(),F({message:"过滤设置写入后端失败,已回滚本地状态;请检查 SimpleLite 是否连通后重试。",type:"warning",duration:5e3,showClose:!0})}}function Pe(e){return e==="bezier"?"贝塞尔路径":e==="nurbs"?"NURBS 路径":e==="arc"?"弧形路径":"直线路径"}async function be(e,t){const o=await Me(e),s=await Me(t);if(!o||!s)return F.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(圆心需手动设置)`),null;const S=Math.hypot(o.x-s.x,o.y-s.y)/2;let E;try{const L=await Y.prompt(`请输入半径 (mm),必须 ≥ ${S.toFixed(1)}(等于即半圆)`,"添加弧形路径",{inputValue:String(Math.ceil(S))});E=Number(L.value)}catch{return"cancelled"}return!Number.isFinite(E)||E0?-S/E:0,va=E>0?w/E:0,St=s==="left"?1:-1,nt=(e.x+t.x)/2+St*le*ya,ot=(e.y+t.y)/2+St*le*va,ba=Math.atan2(e.y-ot,e.x-nt)*180/Math.PI,ga=Math.atan2(t.y-ot,t.x-nt)*180/Math.PI;return["1",nt.toFixed(3),ot.toFixed(3),o.toFixed(3),ba.toFixed(3),ga.toFixed(3)].join(",")}function Ue(e){e&&(x.site.layer=e,x.track.layer=e,F.success(`默认图层已切到 "${e}"`))}async function Le(){try{const t=((await Y.prompt("请输入新图层名(同名会被忽略)","新建图层",{inputValue:""})).value??"").trim();if(!t)return;if(B.value.includes(t)){x.site.layer=t,x.track.layer=t,F.info(`图层 "${t}" 已存在,已切到该层`);return}gt(t),x.site.layer=t,x.track.layer=t,F.success(`已创建图层 "${t}",下次创建对象会落到该层`)}catch{}}async function et(e){if($.setTool(e),ae.value.siteA=null,xe.value=!1,e==="select.clear"){p.clear(),await J.clearSelection().catch(()=>{});return}if(Ee.includes(e)&&b(),e.startsWith("align.")){await Kt(e.replace("align.",""));return}if(e.startsWith("batch.")){await Ht(e);return}if(e==="transform.delete"){await R();return}if(e.startsWith("select.byType.")){const t=e.replace("select.byType.","");H(t);return}if(e==="show.controlPoints"&&($.showControlPoints.value=!$.showControlPoints.value),e==="show.controlHandles"&&($.showControlHandles.value=!$.showControlHandles.value),e==="draw.image"&&Ze("image"),e==="draw.model"&&Ze("model"),e==="transform.copyFields"){await Wt();return}}function H(e){e==="site"?p.filterByKind("site"):e==="polyline"||e==="bezier"||e==="arc"?p.items.value=p.items.value.filter(t=>{if(t.kind!=="track")return!1;const o=t.typeName.toLowerCase();return e==="polyline"?o==="uitrack":e==="bezier"?o.includes("bezier"):e==="arc"?o.includes("arc"):!1}):e==="decor"?p.filterByKind("special"):e==="currentLayer"&&O.value?.layer&&(p.items.value=p.items.value.filter(t=>t.layer===O.value.layer))}async function Ve(e){M.x=e.x,M.y=e.y;const t=$.activeTool.value;if(!(xe.value&&Ee.includes(t))&&!Ye.value){if(t==="draw.site"||t==="draw.sites.continuous"){await c(e.x,e.y);return}if(t==="draw.track.polyline"||t==="draw.track.bezier"||t==="draw.track.arc"||t==="draw.track.nurbs"){try{const o=await j.pick();await qe(o.siteId)}catch{}return}}}function Be(e){p.set(Ce(e))}function Ce(e){const t=[],o=Z.selectFilter;for(const s of e){const w=/^UI([A-Za-z]+)-(\d+)$/.exec(s)??/^([A-Za-z]+)-(\d+)$/.exec(s);if(!w)continue;const S=w[1],E=Number(w[2]),L=S.toLowerCase();let P;L==="site"?P="site":L==="car"||L==="vehicle"?P="car":L.includes("track")?P="track":P="special",!(P==="site"&&!o.sites)&&(P==="track"&&!o.tracks||P==="car"&&!o.cars||P==="special"&&!o.decor||t.push({kind:P,id:E,name:s,typeName:s.startsWith("UI")?`UI${S}`:S}))}return t}async function qe(e){if(e<=0){F.warning("请先拾取一个站点");return}if(ae.value.siteA==null){ae.value.siteA=e,F.success(`已选起点站 #${e},请再拾取终点站`);return}const t=ae.value.siteA,o=e;if(ae.value.siteA=null,t===o){F.warning("起止站点不能相同");return}const s=$.activeTool.value==="draw.track.bezier"?"bezier":$.activeTool.value==="draw.track.arc"?"arc":$.activeTool.value==="draw.track.nurbs"?"nurbs":"track";let w,S="";if(s==="bezier"||s==="nurbs"){const L=await tt(t,o,s);if(L==="cancelled")return;L!=null&&(w=L.typeInfo,S=`(控制点 ${L.midCount})`)}else if(s==="arc"){const L=await be(t,o);if(L==="cancelled")return;L!=null&&(w=L.typeInfo,S=`(半径 ${L.radius.toFixed(0)})`)}let E=-1;await m.run({label:`新建${Pe(s)} (${t}→${o})${S}`,apply:async()=>{const L={siteA:t,siteB:o,layer:x.track.layer};w&&(L.typeInfo=w),E=(await j.createTrack(s,L)).id},revert:async()=>{E>0&&await j.deleteObject("track",E)}}),Ge(s)}async function tt(e,t,o){const s=await Me(e),w=await Me(t);if(!s||!w)return F.warning(`无法拉到 site #${e} / #${t} 的 x,y,将不带 typeInfo 创建 track(控制点会用兜底直线)`),null;const S=Pe(o);let E;try{const P=await Y.prompt("请输入中间控制点个数(不含起止站点;默认 2,输入 0 则不带控制点直接连接两站点)",`创建${S}`,{inputValue:"2",inputPattern:/^\d+$/,inputErrorMessage:"请输入非负整数"});E=Math.max(0,Math.floor(Number(P.value)))}catch{return"cancelled"}if(E===0)return{typeInfo:pe([s,w],o==="bezier"?2:3),midCount:0};F.info(`请在画布上依次点选 ${E} 个中间控制点(任意位置;右键取消创建)`),Ye.value=!0;const L=[];try{for(let P=0;P{o=(await j.createSite({x:e,y:t,layer:x.site.layer,name:`${x.site.namePrefix}-${Date.now()%1e5}`})).id},revert:async()=>{o>0&&await j.deleteObject("site",o)}})}async function R(){const e=[...p.items.value];if(e.length===0)return;const t=[];for(const o of e)try{const s=await J.getBundle(o.kind,o.id);t.push({kind:o.kind,typeName:s.typeName,data:{...s.fields??{}}})}catch{}await m.run({label:`删除 ${e.length} 个对象`,apply:async()=>{const o=e.map(s=>({action:"delete",kind:s.kind,id:s.id}));await j.batch(o),p.clear()},revert:async()=>{const o=t.map(s=>({action:"create",kind:Yt(s.kind,s.typeName),data:s.data}));o.length&&(await j.batch(o),F.success(`已恢复 ${o.length} 个对象(注意:id 已重排)`))}})}function Yt(e,t){const o=(t??"").toLowerCase();if(e==="track")return o.includes("bezier")?"bezier":o.includes("arc")?"arc":o.includes("nurbs")?"nurbs":"track";if(e==="special"){if(o.includes("image"))return"image";if(o.includes("text"))return"text";if(o.includes("model"))return"model"}return e}async function Kt(e){const t=[];for(const s of p.items.value)if(s.kind!=="track")try{const w=await J.getBundle(s.kind,s.id),S=Number(w.fields?.x??0),E=Number(w.fields?.y??0);t.push({kind:s.kind,id:s.id,x:S,y:E})}catch{}if(t.length<2){F.warning("对齐需要选中至少 2 个对象");return}const o=Un(t,e);if(o.length===0){F.info("对齐无变化");return}await m.run({label:`对齐 (${e})`,apply:async()=>{await j.batch(o)},revert:async()=>{const s=t.map(w=>({action:"patch",kind:w.kind,id:w.id,data:{x:w.x,y:w.y}}));await j.batch(s)}})}async function Ht(e){if(e==="batch.linearH"||e==="batch.linearV"){const t=e==="batch.linearH"?"横向":"纵向";try{const{value:o}=await Y.prompt(`输入 ${t}站点数量`,"批量生成",{inputValue:"5",inputType:"number"}),s=Math.max(2,Math.floor(Number(o))),w=await Y.prompt("起点 X","批量生成",{inputValue:"0"}),S=await Y.prompt("起点 Y","批量生成",{inputValue:"0"}),E=await Y.prompt("终点 X","批量生成",{inputValue:"5000"}),L=await Y.prompt("终点 Y","批量生成",{inputValue:"0"}),P=e==="batch.linearH"?Ln(Number(w.value),Number(E.value),Number(S.value),{count:s,layer:x.site.layer}):Bn(Number(w.value),Number(S.value),Number(L.value),{count:s,layer:x.site.layer});await at(`${t}间隔生成 ${s}`,P)}catch{}return}if(e==="batch.matrix"){try{const t=Number((await Y.prompt("行数","矩阵生成",{inputValue:"3"})).value),o=Number((await Y.prompt("列数","矩阵生成",{inputValue:"3"})).value),s=Number((await Y.prompt("x1","矩阵生成",{inputValue:"0"})).value),w=Number((await Y.prompt("y1","矩阵生成",{inputValue:"0"})).value),S=Number((await Y.prompt("x2","矩阵生成",{inputValue:"5000"})).value),E=Number((await Y.prompt("y2","矩阵生成",{inputValue:"5000"})).value),L=Dn(s,w,S,E,{rows:t,cols:o,layer:x.site.layer});await at(`矩阵生成 ${t}×${o}`,L)}catch{}return}if(e==="batch.circular"){try{const t=Number((await Y.prompt("圆心 X","环形阵列",{inputValue:"0"})).value),o=Number((await Y.prompt("圆心 Y","环形阵列",{inputValue:"0"})).value),s=Number((await Y.prompt("半径 (mm)","环形阵列",{inputValue:"2000"})).value),w=Number((await Y.prompt("站点数量","环形阵列",{inputValue:"8"})).value),S=Rn(t,o,s,{count:w,layer:x.site.layer});await at(`环形阵列 r=${s} n=${w}`,S)}catch{}return}if(e==="batch.alongPath"){await Xt();return}}async function Xt(){const e=p.items.value.filter(w=>w.kind==="track");if(e.length===0){F.warning("请先选中至少 1 条路径");return}let t=500,o=!1;try{const{value:w}=await Y.prompt("输入采样间距 (mm)","沿路径采样",{inputValue:"500",inputType:"number"});t=Math.max(10,Math.floor(Number(w)));const{value:S}=await Y.prompt("是否包含端点?输入 1 包含,0 不包含","沿路径采样",{inputValue:"0"});o=Number(S)===1}catch{return}const s=[];await m.run({label:`沿 ${e.length} 条路径间距 ${t}mm 采样`,apply:async()=>{for(const w of e){const S=await j.sampleSitesAlongTrack(w.id,{spacingMm:t,includeEndpoints:o,layer:x.site.layer});s.push(...S.ids)}F.success(`已采样生成 ${s.length} 个站点`)},revert:async()=>{if(!s.length)return;const w=s.map(S=>({action:"delete",kind:"site",id:S}));await j.batch(w)}})}async function Wt(){if(p.items.value.length<2){F.warning("字段复制需要 ≥ 2 个选中对象(第 1 个为源,其余为目标)");return}const[e,...t]=p.items.value;try{const{value:o}=await Y.prompt("输入要复制的字段名(逗号分隔),例如:x,y,layerName","字段复制",{inputValue:"x,y"}),s=o.split(",").map(S=>S.trim()).filter(Boolean);if(!s.length)return;const w=new Map;for(const S of t)try{const E=await J.getBundle(S.kind,S.id),L={};for(const P of s)L[P]=String(E.fields?.[P]??"");w.set(`${S.kind}:${S.id}`,L)}catch{}await m.run({label:`字段复制 ${s.join(",")} → ${t.length} 个`,apply:async()=>{const S=await j.copyFieldsTo(e.kind,e.id,s,t.map(E=>({kind:E.kind,id:E.id})));F.success(`已复制 ${S.copied} 项字段`)},revert:async()=>{const S=t.flatMap(E=>{const L=w.get(`${E.kind}:${E.id}`);return L?[{action:"patch",kind:E.kind,id:E.id,data:L}]:[]});S.length&&await j.batch(S)}})}catch{}}async function at(e,t){if(t.length===0)return;let o=[];await m.run({label:e,apply:async()=>{o=(await j.batch(t)).results.filter(w=>w.ok&&w.action==="create"&&w.result?.id).map(w=>({kind:w.result.kind,id:w.result.id}))},revert:async()=>{const s=o.map(w=>({action:"delete",kind:w.kind,id:w.id}));s.length&&await j.batch(s)}}),F.success(`${e} 完成`)}async function Ke(){if(p.items.value.length===0){O.value=null,se.value=[],ie.value=[],te.value=[];return}const e=p.items.value[0];Gt();try{const t=await J.getBundle(e.kind,e.id);O.value=t.summary,se.value=Object.entries(t.fields).map(([o,s])=>({key:o,value:String(s)})),ie.value=t.methods,te.value=(t.status??[]).map(o=>({key:o.key,value:o.value}))}catch(t){F.error(`加载属性失败:${t.message}`)}finally{qt()}}function Gt(){ve.value=!0}function qt(){ve.value=!1}async function Zt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],o=O.value.id,s=O.value.name??"";s!==e&&(await m.run({label:`重命名 ${s||"(无)"} → ${e}`,apply:async()=>{await J.setField(t.kind,o,"name",e)},revert:async()=>{try{await J.setField(t.kind,o,"name",s)}catch(w){F.warning(`回滚名称失败:${w.message}`)}}}),F.success("名称已更新"))}async function Jt(e){if(!O.value||p.items.value.length===0)return;const t=p.items.value[0],o=O.value.id,s=O.value.layer??"";s!==e&&(await m.run({label:`修改图层 ${s||"(无)"} → ${e}`,apply:async()=>{await J.setField(t.kind,o,"layerName",e)},revert:async()=>{try{await J.setField(t.kind,o,"layerName",s)}catch(w){F.warning(`回滚图层失败:${w.message}`)}}}),await Ke())}async function vt(e,t){if(!O.value)return;const o=p.items.value[0];let s;try{const w=await J.getBundle(o.kind,O.value.id);s=w.fields?.[e]!=null?String(w.fields[e]):void 0}catch{}await m.run({label:`修改 ${e}`,apply:async()=>{await J.setField(o.kind,O.value.id,e,t)},revert:async()=>{if(s!==void 0)try{await J.setField(o.kind,O.value.id,e,s)}catch(w){F.warning(`回滚 ${e} 失败:${w.message}`)}else F.warning(`回滚 ${e}:没拿到原值快照,仅本地撤销`)}}),await Ke()}async function Qt(){try{const e=(await Y.prompt("字段名","新增字段",{inputPattern:/^[A-Za-z0-9_]+$/})).value,t=(await Y.prompt("字段值","新增字段",{inputValue:""})).value;await vt(e,t)}catch{}}async function ea(e){if(O.value)try{await J.execute(p.items.value[0].kind,O.value.id,e),F.success(`已执行 ${e}`),await Ke()}catch(t){F.error(`执行失败:${t.message}`)}}function ta(){localStorage.setItem("mapEditor.defaults",JSON.stringify(x)),F.success("新建默认已保存(下次创建对象时生效)")}function bt(e){const t=e.site??e.Site,o=e.track??e.Track,s=(S,E,L)=>Number(S?.[E]??S?.[L]??0),w=(S,E,L)=>!!(S?.[E]??S?.[L]);return Ua({site:{drawScale:s(t,"drawScale","DrawScale"),dotRadiusNormal:s(t,"dotRadiusNormal","DotRadiusNormal"),dotRadiusSelected:s(t,"dotRadiusSelected","DotRadiusSelected"),selectionRingM:s(t,"selectionRingM","SelectionRingM"),colorNormalArgb:s(t,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(t,"colorSelectedArgb","ColorSelectedArgb"),labelColorNormalArgb:s(t,"labelColorNormalArgb","LabelColorNormalArgb"),labelColorSelectedArgb:s(t,"labelColorSelectedArgb","LabelColorSelectedArgb")},track:{drawScale:s(o,"drawScale","DrawScale"),widthNormal:s(o,"widthNormal","WidthNormal"),widthSelected:s(o,"widthSelected","WidthSelected"),showDirectionArrows:w(o,"showDirectionArrows","ShowDirectionArrows"),colorNormalArgb:s(o,"colorNormalArgb","ColorNormalArgb"),colorSelectedArgb:s(o,"colorSelectedArgb","ColorSelectedArgb")}})}async function lt(){G.value=!0;try{const e=await J.getViewportStyle();V.value=bt(e)}catch(e){console.warn("[MapEditor] 加载视口样式失败:",e)}finally{G.value=!1}}function aa(e){e.site&&(ce.site=e.site,V.value&&(V.value={...V.value,site:{...e.site}})),e.track&&(ce.track=e.track,V.value&&(V.value={...V.value,track:{...e.track}})),ke&&clearTimeout(ke),ke=setTimeout(()=>{const t={...ce};ce={},la(t)},350)}async function la(e){const t=++re;oe.value=!0;try{const o={};e.site&&(o.site=e.site),e.track&&(o.track=e.track);const s=await J.patchViewportStyle(o);if(t!==re)return;V.value=bt(s)}catch(o){F.error(`视口样式更新失败:${o.message}`),await lt()}finally{t===re&&(oe.value=!1)}}function na(e){F.info("图层可见 / 可选切换暂时仅本地生效,后续接入反射 API")}function gt(e){K.value.find(t=>t.name===e)||(K.value=[...K.value,{name:e,visible:!0,selectable:!0,color:"#cccccc"}],B.value=[...B.value,e])}async function wt(){try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}I.value=!0}function oa(){try{v.value=localStorage.getItem(At)==="1";const e=Number(localStorage.getItem(Nt));Number.isFinite(e)&&e>=300&&e<=720&&(q.value=e)}catch{}}fe(v,e=>{try{localStorage.setItem(At,e?"1":"0")}catch{}}),fe(q,e=>{try{localStorage.setItem(Nt,String(Math.round(e)))}catch{}});async function sa(){if(!v.value)try{const e=await st.get();Q.value=!!e.configured}catch{Q.value=!1}v.value=!v.value}async function kt(e){De();const t=(e.created??[]).filter(s=>typeof s=="object"&&s!=null&&typeof s.id=="number"&&!s.error);if(t.length===0)return;const o={label:`AI 生图:落地 ${t.length} 个对象`,apply:async()=>{},revert:async()=>{const s=t.map(w=>({action:"delete",kind:w.kind,id:w.id}));await j.batch(s),F.success(`已撤销 AI 生图(删除 ${s.length} 个对象)`)}};await m.run(o)}function ia(){const e=new Date,t=o=>String(o).padStart(2,"0");return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}_${t(e.getHours())}-${t(e.getMinutes())}-${t(e.getSeconds())}`}async function ra(){const e=C.value||ia();W.value=!0;try{let t=await it.save(e,!1);if(!t.ok&&t.conflict){try{await Y.confirm(`地图「${e}」已存在,是否替换原地图文件?`,"替换确认",{type:"warning",confirmButtonText:"替换",cancelButtonText:"取消"})}catch{return}t=await it.save(e,!0)}if(!t.ok){F.error(`保存失败:${t.message}`);return}C.value=t.data.name,F.success(`已保存地图「${t.data.name}」`),await f.push({path:"/admin/maps"})}catch(t){F.error(`保存失败:${t.message}`)}finally{W.value=!1}}function Ze(e){z.value=e,u.value=e==="image"?"image/*":".obj,.glb,.gltf,.fbx,.cyclemodel",k.value?.click()}async function ua(e){const t=e.target,o=t.files?.[0];if(o)try{const s=await o.arrayBuffer(),w=da(s),S=await j.uploadAsset(o.name,w);F.success(`已上传:${S.fileName}`),z.value==="image"?await j.createImage({x:0,y:0,imagePath:S.savedPath,size:1e3}):await j.createModel({x:0,y:0,modelPath:S.savedPath,scale:1}),De()}catch(s){F.error(`上传失败:${s.message}`)}finally{t.value=""}}function da(e){let t="";const o=new Uint8Array(e);for(let s=0;s{M.x=e.x,M.y=e.y},onPick:e=>{Ve(e)},onSelect:e=>Be(e.names)});const ca=La({onWorkspaceShortcut:e=>{He(e.action)},onAlarm:()=>{},onObjectCreated:()=>De(),onObjectDeleted:()=>De(),onObjectPatched:()=>De(),onObjectBatchChanged:()=>De(),onViewportStyleUpdated:()=>{lt()},onSelectionDetail:e=>{if(!Array.isArray(e.names))return;const t=Ce(e.names),o=Ie(t);o!==Te.value&&(Te.value=o,p.set(t))}});function De(){Ke()}fe(()=>ca.connected.value,e=>We.value=e,{immediate:!0}),fe(()=>Ie(p.items.value),e=>{Ke(),Te.value=e,p.items.value.length===1&&J.setSelection(p.items.value[0].kind,p.items.value[0].id).catch(()=>{})});function pa(e){if(!(e instanceof HTMLElement))return!1;const t=e.tagName;return t==="INPUT"||t==="TEXTAREA"||t==="SELECT"||e.isContentEditable?!0:!!e.closest('.el-input, .el-textarea, .el-select, [contenteditable="true"]')}async function He(e){if(e==="undo"){if(!m.canUndo.value)return;await m.undo()}else if(e==="redo"){if(!m.canRedo.value)return;await m.redo()}else await R()}function ht(e){if(pa(e.target))return;const t=e.ctrlKey||e.metaKey;t&&e.key.toLowerCase()==="z"&&!e.shiftKey?(e.preventDefault(),He("undo")):t&&(e.key.toLowerCase()==="y"||e.key.toLowerCase()==="z"&&e.shiftKey)?(e.preventDefault(),He("redo")):e.key==="Delete"&&(e.preventDefault(),He("delete"))}function xt(e){const t=e.detail?.action;(t==="undo"||t==="redo"||t==="delete")&&He(t)}async function ma(){try{const e=await j.getViewFilter();Object.assign(Z.selectFilter,e.selectFilter),Object.assign(Z.alignSnap,e.alignSnap),Object.assign(Z.showViewport,e.showViewport),he()}catch(e){console.warn("[MapEditor] 拉后端 viewFilter 失败,沿用本地缓存:",e)}}jt(async()=>{document.addEventListener("keydown",ht,!0),window.addEventListener("workspace-shortcut",xt);try{const t=await st.get();Q.value=!!t.configured}catch{}const e=localStorage.getItem("mapEditor.defaults");if(e)try{Object.assign(x,JSON.parse(e))}catch{}oa(),Qe(),await ma(),await lt(),await fa()});async function fa(){const e=typeof g.query.map=="string"?g.query.map:"",t=g.query.new==="1";if(e)try{const o=await it.open(e);C.value=o.name,p.clear(),O.value=null,F.success(`已载入地图「${o.name}」:${o.sites} 站点 / ${o.tracks} 路径`)}catch(o){F.error(`载入地图失败:${o.message}`)}else t&&(C.value="")}return za(()=>{document.removeEventListener("keydown",ht,!0),window.removeEventListener("workspace-shortcut",xt)}),(e,t)=>{const o=ft,s=zt,w=Et,S=Xe,E=mt,L=Mt;return _(),U("div",jn,[a(Ra,{"can-undo":D(m).canUndo.value,"can-redo":D(m).canRedo.value,saving:W.value,"view-filter":Z,onCmd:ze},null,8,["can-undo","can-redo","saving","view-filter"]),r("div",On,[a(Ja,{"active-tool":D($).activeTool.value,onSelectTool:et,onOpenAi:wt},null,8,["active-tool"]),r("div",Yn,[a(Ma,{ref_key:"workspaceRef",ref:i,host:D(h),scope:D(N).scope??"Platform",token:D(N).token??"","read-only":!1,"embed-ui":!1,"canvas-only":!0,"hide-toolbar":!0,onPick:Ve,onSelect:Be},null,8,["host","scope","token"])]),a(on,{"selection-count":D(p).count.value,primary:O.value,fields:se.value,status:te.value,methods:ie.value,loading:ve.value,layers:B.value,defaults:x,"layer-rows":K.value,"selection-kind":_e.value,"viewport-style":V.value,"viewport-style-loading":G.value,"viewport-syncing":oe.value,onRename:Zt,onChangeLayer:Jt,onSetField:vt,onAddField:Qt,onExecAction:ea,onSaveDefaults:ta,onLayerToggle:na,onAddLayer:gt,onDelete:R,onPatchViewport:aa},null,8,["selection-count","primary","fields","status","methods","loading","layers","defaults","layer-rows","selection-kind","viewport-style","viewport-style-loading","viewport-syncing"]),r("button",{class:Se(["ai-assistant-fab",{"is-open":v.value}]),style:Rt(v.value?{right:q.value+"px"}:void 0),type:"button",title:v.value?"收起 AI 助手":"打开 AI 助手",onClick:sa},[...t[5]||(t[5]=[r("span",{class:"fab-glyph"},"✦",-1),r("span",{class:"fab-text"},[y("AI"),r("br"),y("助手")],-1)])],14,Kn),a(In,{open:v.value,"onUpdate:open":t[0]||(t[0]=P=>v.value=P),width:q.value,"onUpdate:width":t[1]||(t[1]=P=>q.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["open","width","configured","default-bounds","default-layer"])]),a(vn,{"selected-count":D(p).count.value,"mouse-x":M.x,"mouse-y":M.y,"tool-label":D($).toolLabel.value,"snap-on":d.value,"undo-size":D(m).undoStack.value.length,"redo-size":D(m).redoStack.value.length,connected:We.value},null,8,["selected-count","mouse-x","mouse-y","tool-label","snap-on","undo-size","redo-size","connected"]),a(hn,{modelValue:I.value,"onUpdate:modelValue":t[2]||(t[2]=P=>I.value=P),configured:Q.value,"default-bounds":ye.value,"default-layer":x.site.layer,onGenerated:kt},null,8,["modelValue","configured","default-bounds","default-layer"]),a(L,{modelValue:Fe.value,"onUpdate:modelValue":t[4]||(t[4]=P=>Fe.value=P),title:"切换显示图层",width:"520px"},{footer:l(()=>[a(S,{onClick:t[3]||(t[3]=P=>Fe.value=!1)},{default:l(()=>[...t[6]||(t[6]=[y("关闭",-1)])]),_:1}),a(S,{type:"primary",onClick:Le},{default:l(()=>[...t[7]||(t[7]=[y("新建图层…",-1)])]),_:1})]),default:l(()=>[a(E,{data:K.value,size:"small",style:{width:"100%"}},{default:l(()=>[a(o,{prop:"name",label:"图层","min-width":"120"}),a(o,{label:"可见",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.visible,"onUpdate:modelValue":le=>P.visible=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"可选",width:"80"},{default:l(({row:P})=>[a(s,{modelValue:P.selectable,"onUpdate:modelValue":le=>P.selectable=le},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"颜色",width:"100"},{default:l(({row:P})=>[a(w,{modelValue:P.color,"onUpdate:modelValue":le=>P.color=le,size:"small"},null,8,["modelValue","onUpdate:modelValue"])]),_:1}),a(o,{label:"默认层",width:"110"},{default:l(({row:P})=>[a(S,{size:"small",type:x.site.layer===P.name?"primary":"default",onClick:le=>Ue(P.name)},{default:l(()=>[y(T(x.site.layer===P.name?"当前默认":"设为默认"),1)]),_:2},1032,["type","onClick"])]),_:1})]),_:1},8,["data"])]),_:1},8,["modelValue"]),r("input",{ref_key:"fileInputRef",ref:k,type:"file",style:{display:"none"},accept:u.value,onChange:ua},null,40,Hn)])}}}),_o=Ne(Xn,[["__scopeId","data-v-704ddb94"]]);export{_o as default}; diff --git a/MiGu.Server/wwwroot/assets/MapEditorView-Bw6vCiWq.css b/MiGu.Server/wwwroot/assets/MapEditorView-DTrk0FFM.css similarity index 96% rename from MiGu.Server/wwwroot/assets/MapEditorView-Bw6vCiWq.css rename to MiGu.Server/wwwroot/assets/MapEditorView-DTrk0FFM.css index 86deb03..46d5f36 100644 --- a/MiGu.Server/wwwroot/assets/MapEditorView-Bw6vCiWq.css +++ b/MiGu.Server/wwwroot/assets/MapEditorView-DTrk0FFM.css @@ -1 +1 @@ -.edit-top-bar[data-v-1082d582]{display:flex;align-items:center;gap:4px;padding:8px 14px;background:linear-gradient(180deg,#321658f2,#220e40f2);border-bottom:1px solid rgba(255,255,255,.12);backdrop-filter:blur(10px);box-shadow:0 2px 8px #00000040}.spacer[data-v-1082d582]{flex:1}.el-divider--vertical[data-v-1082d582]{margin:0 6px;background:#ffffff26}.topbar-btn[data-v-1082d582]{color:#fdf6ff!important;font-weight:600;font-size:13.5px;padding:6px 12px;height:auto;border-radius:6px;transition:background .15s ease,color .15s ease}.topbar-btn[data-v-1082d582]:hover{color:#fff!important;background:#aa6efa47!important}.topbar-btn[data-v-1082d582]:focus{background:#aa6efa4d!important}.topbar-icon-btn[data-v-1082d582]{color:#fdf6ffeb!important;background:#ffffff0d!important;border:1px solid rgba(255,255,255,.15)!important;font-size:15px}.topbar-icon-btn[data-v-1082d582]:hover:not(.is-disabled){background:#aa6efa4d!important;border-color:#aa6efa8c!important}.topbar-icon-btn.is-disabled[data-v-1082d582]{opacity:.4}.topbar-save-btn[data-v-1082d582]{font-weight:600;font-size:13.5px;padding:6px 18px;height:auto;border-radius:6px;margin-right:4px}.topbar-filter-menu[data-v-1082d582] .topbar-filter-header{font-size:11px;color:#e8d7f58c;cursor:default;pointer-events:none;padding-top:6px;padding-bottom:2px;text-transform:none;letter-spacing:.4px}.edit-tool-rail[data-v-6b284dea]{height:100%;width:170px;background:linear-gradient(180deg,#1c0c38d9,#120624f2);border-right:1px solid rgba(255,255,255,.1);padding:4px 0 12px;backdrop-filter:blur(10px);display:flex;flex-direction:column;box-shadow:inset -1px 0 #ffffff0a}.rail-scroll[data-v-6b284dea]{height:100%}.rail-group[data-v-6b284dea]{display:flex;flex-direction:column;padding:4px 8px 2px}.rail-group-title[data-v-6b284dea]{display:flex;align-items:center;gap:6px;font-size:10px;letter-spacing:2px;color:#bea0e6b3;text-transform:uppercase;margin:4px 0 6px;font-weight:600}.rail-group-bar[data-v-6b284dea]{flex:1;height:1px;background:#bea0e633}.rail-group-list[data-v-6b284dea]{display:flex;flex-direction:column;gap:2px}.rail-divider[data-v-6b284dea]{width:100%;height:1px;background:linear-gradient(90deg,#fff0,#ffffff14,#fff0);margin:6px 0 2px}.rail-btn[data-v-6b284dea]{appearance:none;border:0;cursor:pointer;width:100%;min-height:32px;padding:0 8px;border-radius:6px;background:#ffffff0a;color:#e8d7f5eb;display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:500;text-align:left;transition:background .14s ease,color .14s ease,box-shadow .14s ease,transform .12s ease}.rail-btn[data-v-6b284dea]:hover{background:#965ae633;color:#fff}.rail-btn[data-v-6b284dea]:active{transform:scale(.985)}.rail-btn.rail-btn--active[data-v-6b284dea]{background:linear-gradient(120deg,#aa6efaeb,#7846dceb);color:#fff;box-shadow:0 3px 10px #8c50e673,inset 0 0 0 1px #ffffff2e}.rail-btn-glyph[data-v-6b284dea]{width:20px;display:inline-flex;justify-content:center;align-items:center;font-size:15px;line-height:1;flex:none}.rail-btn-label[data-v-6b284dea]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rail-group-ai[data-v-6b284dea]{margin-top:14px;padding-bottom:10px;position:relative}.rail-group-ai[data-v-6b284dea]:before{content:"";position:absolute;left:8px;right:8px;top:0;height:1px;background:linear-gradient(90deg,#fff0,#dc8ce659,#fff0)}.rail-btn--ai[data-v-6b284dea]{background:linear-gradient(135deg,#7846dc8c,#ff5ac88c);color:#fff;font-weight:600;box-shadow:0 2px 10px #dc5adc4d,inset 0 0 0 1px #fff3}.rail-btn--ai[data-v-6b284dea]:hover{background:linear-gradient(135deg,#965af0d9,#ff6edcd9);color:#fff;box-shadow:0 4px 14px #e66ee68c,inset 0 0 0 1px #ffffff4d}.rail-btn--ai .rail-btn-glyph[data-v-6b284dea]{font-size:16px;text-shadow:0 0 8px rgba(255,200,250,.6)}.edit-property-panel[data-v-781515fe]{height:100%;width:360px;background:linear-gradient(180deg,#1c0c38d9,#120624f2);border-left:1px solid rgba(255,255,255,.1);padding:0;backdrop-filter:blur(10px);overflow:hidden;display:flex;flex-direction:column;color:#e8d7f5eb}.prop-tabs[data-v-781515fe]{height:100%;display:flex;flex-direction:column}.prop-tabs[data-v-781515fe] .el-tabs__header{margin:0;padding:0 8px;border-bottom:1px solid rgba(255,255,255,.08)}.prop-tabs[data-v-781515fe] .el-tabs__nav-wrap:after{background:transparent}.prop-tabs[data-v-781515fe] .el-tabs__item{color:#dcc8f0b3;font-weight:500;font-size:13px;height:36px;line-height:36px}.prop-tabs[data-v-781515fe] .el-tabs__item.is-active{color:#fff}.prop-tabs[data-v-781515fe] .el-tabs__active-bar{background:linear-gradient(90deg,#aa6efa,#ff6edc);height:2px}.prop-tabs[data-v-781515fe] .el-tabs__content{flex:1;overflow:auto;padding:10px 12px 14px}.empty-hint[data-v-781515fe]{display:flex;align-items:center;gap:6px;padding:56px 16px;text-align:center;color:#dcc8f08c;flex-direction:column}.empty-icon[data-v-781515fe]{font-size:28px;color:#b482dc73}.empty-title[data-v-781515fe]{font-size:13px;color:#e8d7f5bf;font-weight:500}.empty-desc[data-v-781515fe]{font-size:11.5px;color:#dcc8f080}.loading-hint[data-v-781515fe]{display:flex;align-items:center;gap:8px;padding:32px 16px;text-align:center;color:#e8d7f5a6;font-size:12.5px;justify-content:center}.object-pane[data-v-781515fe]{display:flex;flex-direction:column;gap:10px}.prop-card[data-v-781515fe]{background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:10px 12px;box-shadow:0 1px 4px #0003}.prop-card--header[data-v-781515fe]{background:linear-gradient(140deg,#aa6efa2e,#461e6e1a);border-color:#aa6efa47}.prop-card--geom[data-v-781515fe]{background:linear-gradient(140deg,#508cdc1a,#2846820f);border-color:#78aae638}.prop-card--style[data-v-781515fe]{background:linear-gradient(140deg,#dc6ec81a,#9646820f);border-color:#e682c838}.prop-card--custom[data-v-781515fe]{background:#ffffff08;border-color:#aa6efa2e}.prop-card--status[data-v-781515fe]{background:#508cdc0f;border-color:#78aae62e}.prop-card--actions[data-v-781515fe]{background:#8c50c80f;border-color:#aa6efa2e}.prop-card-header[data-v-781515fe]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.prop-card-title[data-v-781515fe]{font-size:11.5px;font-weight:600;letter-spacing:1px;color:#dcb4fad9;text-transform:uppercase}.prop-card-meta[data-v-781515fe]{font-size:10.5px;color:#c8b4dc80}.prop-card-flag[data-v-781515fe]{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;color:#b4c8f099;padding:2px 7px;border-radius:10px;background:#78a0dc1a;transition:background .25s ease,color .25s ease,box-shadow .25s ease;margin-left:auto}.prop-card-flag.is-synced[data-v-781515fe]{background:linear-gradient(120deg,#50c88252,#78dcc852);color:#dcffe6f2;box-shadow:0 0 8px #50c88273}.prop-card-flag-dot[data-v-781515fe]{width:6px;height:6px;border-radius:50%;background:#b4c8f099;transition:background .25s ease,box-shadow .25s ease}.prop-card-flag.is-synced .prop-card-flag-dot[data-v-781515fe]{background:#6ce7a8;box-shadow:0 0 6px #6ce7a8d9}.prop-card-row[data-v-781515fe]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.prop-card-row[data-v-781515fe]:last-child{margin-bottom:0}.prop-id-block[data-v-781515fe]{display:flex;align-items:center;gap:6px}.prop-id-tag[data-v-781515fe]{background:#aa6efa4d;color:#fff;padding:2px 8px;font-size:11.5px;font-weight:600;border-radius:4px;letter-spacing:.5px}.prop-type-tag[data-v-781515fe]{color:#e8d7f5bf;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.prop-status-tag[data-v-781515fe]{font-weight:500}.prop-header-actions[data-v-781515fe]{display:flex;align-items:center;gap:6px}.prop-delete-btn[data-v-781515fe]{appearance:none;cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:5px;font-size:11.5px;font-weight:500;letter-spacing:.4px;color:#ffc8d2f2;background:linear-gradient(135deg,#ff5a782e,#dc3c6e38);border:1px solid rgba(255,110,140,.45);transition:background .14s ease,border-color .14s ease,color .14s ease,box-shadow .14s ease,transform .12s ease}.prop-delete-btn[data-v-781515fe]:hover:not(:disabled){background:linear-gradient(135deg,#ff5a788c,#dc3c6ea6);border-color:#ff8caad9;color:#fff;box-shadow:0 3px 10px #dc466e73}.prop-delete-btn[data-v-781515fe]:active:not(:disabled){transform:scale(.96)}.prop-delete-btn[data-v-781515fe]:disabled{opacity:.55;cursor:progress}.prop-delete-icon[data-v-781515fe]{font-size:12px;line-height:1}.prop-name-row[data-v-781515fe],.prop-layer-row[data-v-781515fe]{gap:8px}.prop-name-label[data-v-781515fe]{width:36px;font-size:11.5px;color:#c8b4dcb3;flex:none}.prop-layer-select[data-v-781515fe]{flex:1}.prop-grid[data-v-781515fe]{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:8px}.prop-grid-item[data-v-781515fe]{display:flex;flex-direction:column;gap:3px;min-width:0}.prop-grid-item--wide[data-v-781515fe]{grid-column:1 / -1}.prop-field-label[data-v-781515fe]{font-size:11px;color:#c8b4e6c7;letter-spacing:.3px;display:flex;justify-content:space-between;align-items:baseline;gap:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prop-field-unit[data-v-781515fe]{font-size:10px;color:#aa96c88c;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;flex:none}.prop-field-num[data-v-781515fe] .el-input-number{width:100%}.prop-field-num[data-v-781515fe] .el-input__wrapper{background:#ffffff0f;box-shadow:inset 0 0 0 1px #aa6efa2e}.prop-field-row[data-v-781515fe]{display:flex;align-items:center;gap:4px}.prop-field-icon-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;width:22px;height:22px;border-radius:4px;background:#ff64821f;color:#ffb4c8d9;font-size:14px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex:none;transition:background .14s,color .14s}.prop-field-icon-btn[data-v-781515fe]:hover{background:#ff648252;color:#fff}.prop-empty-row[data-v-781515fe]{font-size:11.5px;color:#c8b4dc66;text-align:center;padding:8px 0}.prop-add-field-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;width:100%;margin-top:8px;padding:6px 10px;border-radius:6px;background:#aa6efa24;border:1px dashed rgba(170,110,250,.4);color:#dcb4faeb;font-size:12px;font-weight:500;transition:background .14s ease,border-color .14s ease,color .14s ease}.prop-add-field-btn[data-v-781515fe]:hover{background:#aa6efa42;border-color:#aa6efaa6;color:#fff}.prop-status-list[data-v-781515fe]{display:flex;flex-direction:column;gap:4px}.prop-status-item[data-v-781515fe]{display:flex;justify-content:space-between;align-items:center;padding:5px 8px;border-radius:4px;background:#ffffff08;font-size:11.5px}.prop-status-key[data-v-781515fe]{color:#aac8f0d9;font-weight:500}.prop-status-value[data-v-781515fe]{color:#e8f5fff2;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prop-actions[data-v-781515fe]{display:grid;grid-template-columns:1fr 1fr;gap:6px}.prop-action-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;padding:7px 10px;border-radius:7px;background:linear-gradient(135deg,#aa6efa33,#7846dc33);border:1px solid rgba(170,110,250,.35);color:#e8d7f5f2;font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:flex-start;gap:6px;transition:background .14s ease,border-color .14s ease,transform .12s ease,box-shadow .14s ease;text-align:left}.prop-action-btn[data-v-781515fe]:hover:not(:disabled){background:linear-gradient(135deg,#aa6efa9e,#ff6edc8c);border-color:#ff82dcb3;color:#fff;box-shadow:0 4px 12px #b45adc66}.prop-action-btn[data-v-781515fe]:active:not(:disabled){transform:scale(.985)}.prop-action-btn[data-v-781515fe]:disabled{opacity:.6;cursor:progress}.prop-action-icon[data-v-781515fe]{font-size:9px;color:#ffc8fad9;flex:none}.prop-action-spinner[data-v-781515fe]{display:inline-block;animation:prop-spin-781515fe .8s linear infinite;font-size:13px}.prop-action-label[data-v-781515fe]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes prop-spin-781515fe{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.defaults-pane[data-v-781515fe]{display:flex;flex-direction:column;gap:10px}.defaults-alert[data-v-781515fe]{margin-bottom:4px}.defaults-empty[data-v-781515fe]{padding:40px 12px}.defaults-form .el-button[data-v-781515fe]{margin-top:8px}.defaults-form[data-v-781515fe] .el-form-item{margin-bottom:10px}.layer-table[data-v-781515fe]{margin:6px 0;border-radius:8px;overflow:hidden;background:#fff;box-shadow:0 0 0 1px #7c3aed24}.layer-table[data-v-781515fe] .el-table__inner-wrapper{background:#fff}.layer-table[data-v-781515fe] th.el-table__cell{background:#f5f3ff!important;color:#2d1b69!important;font-weight:600}.layer-table[data-v-781515fe] td.el-table__cell{background:#fff!important;color:#1a0f3d!important;font-weight:500}.layer-table[data-v-781515fe] .cell{color:#1a0f3d!important}.layer-table[data-v-781515fe] tr:hover>td.el-table__cell{background:#ede9fe!important}.new-layer[data-v-781515fe]{margin-top:8px}.new-layer[data-v-781515fe] .el-input__inner{color:#1a0f3d;font-weight:500}.new-layer[data-v-781515fe] .el-input__inner::placeholder{color:#7a6b9a}.new-layer[data-v-781515fe] .el-input-group__append .el-button{color:#5b21b6;font-weight:600}.edit-status-bar[data-v-6254b10f]{display:flex;align-items:center;gap:16px;padding:4px 14px;background:#140828d9;border-top:1px solid rgba(255,255,255,.08);color:#e8d7f5d9;font-size:12px;font-family:ui-monospace,Menlo,Consolas,monospace;height:28px}.spacer[data-v-6254b10f]{flex:1}.seg b[data-v-6254b10f]{color:var(--mg-accent, #c4a4ff)}.seg .on[data-v-6254b10f]{color:#67c23a}.seg .off[data-v-6254b10f]{color:#a0a0a0}.seg.ok[data-v-6254b10f]{color:#67c23a}.seg.warn[data-v-6254b10f]{color:#f56c6c}.el-upload{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;cursor:pointer;outline:none;justify-content:center;align-items:center;display:inline-flex}.el-upload.is-disabled{cursor:not-allowed}.el-upload.is-disabled:focus{border-color:var(--el-border-color-darker);color:inherit}.el-upload.is-disabled:focus .el-upload-dragger{border-color:var(--el-border-color-darker)}.el-upload.is-disabled .el-upload-dragger{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-upload.is-disabled .el-upload-dragger .el-upload__text{color:var(--el-text-color-placeholder)}.el-upload.is-disabled .el-upload-dragger .el-upload__text em{color:var(--el-disabled-text-color)}.el-upload.is-disabled .el-upload-dragger:hover{border-color:var(--el-border-color-darker)}.el-upload__input{display:none}.el-upload__tip{color:var(--el-text-color-regular);margin-top:7px;font-size:12px}.el-upload iframe{z-index:-1;opacity:0;filter:alpha(opacity=0);position:absolute;top:0;left:0}.el-upload--picture-card{background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);box-sizing:border-box;width:var(--el-upload-picture-card-size);height:var(--el-upload-picture-card-size);cursor:pointer;vertical-align:top;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.el-upload--picture-card>i{color:var(--el-text-color-secondary);font-size:28px}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{padding:var(--el-upload-dragger-padding-vertical) var(--el-upload-dragger-padding-horizontal);background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);box-sizing:border-box;text-align:center;cursor:pointer;border-radius:6px;position:relative;overflow:hidden}.el-upload-dragger .el-icon--upload{color:var(--el-text-color-placeholder);margin-bottom:16px;font-size:67px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);text-align:center;font-size:14px}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{padding:calc(var(--el-upload-dragger-padding-vertical) - 1px) calc(var(--el-upload-dragger-padding-horizontal) - 1px);background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary)}.el-upload-list{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;margin:10px 0 0;padding:0;list-style:none;position:relative}.el-upload-list__item{color:var(--el-text-color-regular);box-sizing:border-box;border-radius:4px;width:100%;margin-bottom:5px;font-size:14px;transition:all .5s cubic-bezier(.55,0,.1,1);position:relative}.el-upload-list__item .el-progress{width:100%;position:absolute;top:20px}.el-upload-list__item .el-progress__text{position:absolute;top:-13px;right:0}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{cursor:pointer;opacity:.75;color:var(--el-text-color-regular);transition:opacity var(--el-transition-duration);display:none;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.el-upload-list__item .el-icon--close:hover{opacity:1;color:var(--el-color-primary)}.el-upload-list__item .el-icon--close-tip{cursor:pointer;opacity:1;color:var(--el-color-primary);font-size:12px;font-style:normal;display:none;position:absolute;top:1px;right:5px}.el-upload-list__item:hover,.el-upload-list__item:focus-within{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close,.el-upload-list__item:focus-within .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-icon--close-tip,.el-upload-list__item:focus-within .el-icon--close-tip{right:24px}.el-upload-list__item:hover .el-progress__text,.el-upload-list__item:focus-within .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{flex-direction:column;justify-content:center;width:calc(100% - 30px);margin-left:4px;display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:hover,.el-upload-list__item.is-success .el-upload-list__item-name:focus{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:not(.focusing):focus,.el-upload-list__item.is-success:active{outline-width:0}.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip,.el-upload-list__item.is-success:active .el-icon--close-tip{display:none}.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus-within .el-upload-list__item-status-label{opacity:0;display:none}.el-upload-list__item-name{color:var(--el-text-color-regular);text-align:center;transition:color var(--el-transition-duration);font-size:var(--el-font-size-base);align-items:center;padding:0 4px;display:inline-flex}.el-upload-list__item-name .el-icon{color:var(--el-text-color-secondary);margin-right:6px}.el-upload-list__item-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.el-upload-list__item-status-label{line-height:inherit;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;display:none;position:absolute;top:0;right:5px}.el-upload-list__item-delete{color:var(--el-text-color-regular);font-size:12px;display:none;position:absolute;top:0;right:10px}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{flex-wrap:wrap;margin:0;display:inline-flex}.el-upload-list--picture-card .el-upload-list__item{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;width:var(--el-upload-list-picture-card-size);height:var(--el-upload-list-picture-card-size);border-radius:6px;margin:0 8px 8px 0;padding:0;display:inline-flex;overflow:hidden}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{object-fit:contain;width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-list--picture-card .el-upload-list__item-status-label i{margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{cursor:default;color:#fff;opacity:0;background-color:var(--el-overlay-color-lighter);width:100%;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;font-size:20px;display:inline-flex;position:absolute;top:0;left:0}.el-upload-list--picture-card .el-upload-list__item-actions span{cursor:pointer;display:none}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:16px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{font-size:inherit;color:inherit;position:static}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{width:126px;top:50%;bottom:auto;left:50%;transform:translate(-50%,-50%)}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{z-index:0;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;border-radius:6px;align-items:center;margin-top:10px;padding:10px;display:flex;overflow:hidden}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:inline-flex}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{object-fit:contain;z-index:1;background-color:var(--el-color-white);justify-content:center;align-items:center;width:70px;height:70px;display:inline-flex;position:relative}.el-upload-list--picture .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:46px;height:26px;position:absolute;top:-7px;right:-17px;transform:rotate(45deg)}.el-upload-list--picture .el-upload-list__item-status-label i{margin-top:12px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{z-index:10;cursor:default;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.el-upload-cover:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-upload-cover img{width:100%;height:100%;display:block}.el-upload-cover__label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-cover__label i{color:#fff;margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-cover__progress{vertical-align:middle;width:243px;display:inline-block;position:static}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{width:100%;height:100%;position:absolute;top:0;left:0}.el-upload-cover__interact{background-color:var(--el-overlay-color-light);text-align:center;width:100%;height:100%;position:absolute;bottom:0;left:0}.el-upload-cover__interact .btn{color:#fff;cursor:pointer;vertical-align:middle;transition:var(--el-transition-md-fade);margin-top:60px;font-size:14px;display:inline-block}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;font-size:24px;line-height:inherit;margin:0 auto 5px;display:block}.el-upload-cover__title{text-overflow:ellipsis;white-space:nowrap;text-align:left;width:100%;height:36px;color:var(--el-text-color-primary);background-color:#fff;margin:0;padding:0 10px;font-size:14px;font-weight:400;line-height:36px;position:absolute;bottom:0;left:0;overflow:hidden}.el-upload-cover+.el-upload__inner{opacity:0;z-index:1;position:relative}.cfg-alert[data-v-94799737]{margin-bottom:12px}.ml[data-v-94799737]{margin-left:6px}.upload-hint[data-v-94799737]{display:flex;align-items:center;gap:8px;padding:12px;color:var(--el-text-color-regular, rgba(232,215,245,.7))}.result-panel[data-v-94799737]{margin-top:8px}.ai-text[data-v-94799737]{color:var(--el-text-color-primary, rgba(232,215,245,.85));padding:6px 0;white-space:pre-wrap}.ai-stat[data-v-94799737]{padding:6px 0;color:var(--el-text-color-primary, rgba(232,215,245,.85))}.ai-stat b[data-v-94799737]{color:var(--mg-accent, #c4a4ff)}.ai-generate-dialog.el-dialog,.ai-generate-dialog .el-dialog{background-color:rgb(var(--mg-bg-card-rgb))!important;box-shadow:0 24px 60px #08021099!important}.ai-assistant-panel[data-v-9fed2b0d]{position:absolute;top:0;right:0;bottom:0;z-index:30;display:flex;flex-direction:column;background:linear-gradient(180deg,#1c0c38fa,#100622fc);border-left:1px solid rgba(190,140,240,.28);box-shadow:-10px 0 30px #0802108c;color:#ece0faf2;transform:translate(100%);opacity:0;visibility:hidden;transition:transform .26s cubic-bezier(.25,.8,.25,1),opacity .26s ease,visibility .26s}.ai-assistant-panel.is-open[data-v-9fed2b0d]{transform:translate(0);opacity:1;visibility:visible}.aap-resizer[data-v-9fed2b0d]{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:ew-resize;z-index:5;background:transparent;transition:background .15s ease;touch-action:none}.aap-resizer[data-v-9fed2b0d]:hover{background:#be8cf073}.aap-header[data-v-9fed2b0d]{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;background:linear-gradient(135deg,#7846dc80,#ff5ac866);border-bottom:1px solid rgba(255,255,255,.12)}.aap-title[data-v-9fed2b0d]{display:flex;align-items:center;gap:10px;min-width:0}.aap-glyph[data-v-9fed2b0d]{font-size:20px;color:#fff;text-shadow:0 0 10px rgba(255,200,250,.7);flex:none}.aap-title-text[data-v-9fed2b0d]{min-width:0}.aap-title-main[data-v-9fed2b0d]{font-size:15px;font-weight:700;color:#fff;line-height:1.2}.aap-title-sub[data-v-9fed2b0d]{font-size:11px;color:#f0deffc7;margin-top:2px}.aap-close[data-v-9fed2b0d]{appearance:none;border:0;background:#ffffff1f;color:#fff;width:26px;height:26px;border-radius:6px;cursor:pointer;font-size:13px;line-height:1;flex:none;transition:background .15s ease}.aap-close[data-v-9fed2b0d]:hover{background:#ffffff3d}.aap-alert[data-v-9fed2b0d]{margin:10px 12px 0}.aap-messages[data-v-9fed2b0d]{flex:1 1 0;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px}.aap-empty[data-v-9fed2b0d]{padding:8px 2px;display:flex;flex-direction:column;gap:8px}.aap-empty-title[data-v-9fed2b0d]{font-size:12px;color:#d2bcf0b3}.aap-example[data-v-9fed2b0d]{appearance:none;text-align:left;border:1px dashed rgba(190,140,240,.4);background:#ffffff0a;color:#e8d7f5e6;border-radius:8px;padding:8px 10px;font-size:12.5px;cursor:pointer;transition:all .15s ease}.aap-example[data-v-9fed2b0d]:hover{background:#965ae638;border-color:#be8cf0b3;color:#fff}.aap-msg[data-v-9fed2b0d]{display:flex}.aap-msg--user[data-v-9fed2b0d]{justify-content:flex-end}.aap-msg--assistant[data-v-9fed2b0d]{justify-content:flex-start}.aap-bubble[data-v-9fed2b0d]{max-width:86%;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.5}.aap-msg--user .aap-bubble[data-v-9fed2b0d]{background:linear-gradient(135deg,#965af0f2,#7846dcf2);color:#fff;border-bottom-right-radius:4px}.aap-msg--assistant .aap-bubble[data-v-9fed2b0d]{background:#ffffff12;border:1px solid rgba(255,255,255,.1);color:#ece0faf2;border-bottom-left-radius:4px}.aap-bubble-text[data-v-9fed2b0d]{white-space:pre-wrap;word-break:break-word}.aap-meta[data-v-9fed2b0d]{margin-top:6px;padding-top:6px;border-top:1px dashed rgba(255,255,255,.14);font-size:11.5px;color:#d2bcf0cc}.aap-meta b[data-v-9fed2b0d]{color:var(--mg-accent, #c4a4ff)}.aap-bubble--loading[data-v-9fed2b0d]{display:inline-flex;align-items:center;gap:8px;color:#d2bcf0d9}.aap-toolbar[data-v-9fed2b0d]{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px 0;flex-wrap:wrap}.aap-toolbar-label[data-v-9fed2b0d]{font-size:11.5px;color:#d2bcf0b3;flex:none}.aap-toolbar[data-v-9fed2b0d] .el-radio-button__inner{padding:5px 9px;font-size:12px}.aap-input[data-v-9fed2b0d]{flex:none;padding:8px 12px 12px;display:flex;flex-direction:column;gap:8px}.aap-send[data-v-9fed2b0d]{align-self:flex-end;min-width:84px}.map-editor-page[data-v-a13fa1ff]{height:calc(100vh - 56px);display:flex;flex-direction:column;background:radial-gradient(ellipse at 50% 40%,#2d1456,#1a0930,#0f0420);color:#e8d7f5e6}.me-body[data-v-a13fa1ff]{flex:1;display:flex;min-height:0;position:relative}.ai-assistant-fab[data-v-a13fa1ff]{position:absolute;top:50%;right:0;transform:translateY(-50%);z-index:31;display:flex;flex-direction:column;align-items:center;gap:5px;width:42px;padding:14px 0;border:none;border-radius:12px 0 0 12px;cursor:pointer;color:#fff;background:linear-gradient(135deg,#965af0f5,#ff5ac8eb);box-shadow:-4px 0 16px #7828c873;transition:right .26s cubic-bezier(.25,.8,.25,1),filter .15s ease,box-shadow .15s ease}.ai-assistant-fab[data-v-a13fa1ff]:hover{filter:brightness(1.08);box-shadow:-6px 0 22px #963ce699}.ai-assistant-fab.is-open[data-v-a13fa1ff]{right:360px}.ai-assistant-fab .fab-glyph[data-v-a13fa1ff]{font-size:18px;line-height:1;text-shadow:0 0 10px rgba(255,220,255,.85)}.ai-assistant-fab .fab-text[data-v-a13fa1ff]{font-size:12px;font-weight:700;line-height:1.18;letter-spacing:1px;text-align:center}.me-center[data-v-a13fa1ff]{flex:1;min-width:0;display:flex}.me-center[data-v-a13fa1ff] .workspace-3d-wrap{flex:1;height:100%;border:0;border-radius:0;min-height:0} +.edit-top-bar[data-v-1082d582]{display:flex;align-items:center;gap:4px;padding:8px 14px;background:linear-gradient(180deg,#321658f2,#220e40f2);border-bottom:1px solid rgba(255,255,255,.12);backdrop-filter:blur(10px);box-shadow:0 2px 8px #00000040}.spacer[data-v-1082d582]{flex:1}.el-divider--vertical[data-v-1082d582]{margin:0 6px;background:#ffffff26}.topbar-btn[data-v-1082d582]{color:#fdf6ff!important;font-weight:600;font-size:13.5px;padding:6px 12px;height:auto;border-radius:6px;transition:background .15s ease,color .15s ease}.topbar-btn[data-v-1082d582]:hover{color:#fff!important;background:#aa6efa47!important}.topbar-btn[data-v-1082d582]:focus{background:#aa6efa4d!important}.topbar-icon-btn[data-v-1082d582]{color:#fdf6ffeb!important;background:#ffffff0d!important;border:1px solid rgba(255,255,255,.15)!important;font-size:15px}.topbar-icon-btn[data-v-1082d582]:hover:not(.is-disabled){background:#aa6efa4d!important;border-color:#aa6efa8c!important}.topbar-icon-btn.is-disabled[data-v-1082d582]{opacity:.4}.topbar-save-btn[data-v-1082d582]{font-weight:600;font-size:13.5px;padding:6px 18px;height:auto;border-radius:6px;margin-right:4px}.topbar-filter-menu[data-v-1082d582] .topbar-filter-header{font-size:11px;color:#e8d7f58c;cursor:default;pointer-events:none;padding-top:6px;padding-bottom:2px;text-transform:none;letter-spacing:.4px}.edit-tool-rail[data-v-6b284dea]{height:100%;width:170px;background:linear-gradient(180deg,#1c0c38d9,#120624f2);border-right:1px solid rgba(255,255,255,.1);padding:4px 0 12px;backdrop-filter:blur(10px);display:flex;flex-direction:column;box-shadow:inset -1px 0 #ffffff0a}.rail-scroll[data-v-6b284dea]{height:100%}.rail-group[data-v-6b284dea]{display:flex;flex-direction:column;padding:4px 8px 2px}.rail-group-title[data-v-6b284dea]{display:flex;align-items:center;gap:6px;font-size:10px;letter-spacing:2px;color:#bea0e6b3;text-transform:uppercase;margin:4px 0 6px;font-weight:600}.rail-group-bar[data-v-6b284dea]{flex:1;height:1px;background:#bea0e633}.rail-group-list[data-v-6b284dea]{display:flex;flex-direction:column;gap:2px}.rail-divider[data-v-6b284dea]{width:100%;height:1px;background:linear-gradient(90deg,#fff0,#ffffff14,#fff0);margin:6px 0 2px}.rail-btn[data-v-6b284dea]{appearance:none;border:0;cursor:pointer;width:100%;min-height:32px;padding:0 8px;border-radius:6px;background:#ffffff0a;color:#e8d7f5eb;display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:500;text-align:left;transition:background .14s ease,color .14s ease,box-shadow .14s ease,transform .12s ease}.rail-btn[data-v-6b284dea]:hover{background:#965ae633;color:#fff}.rail-btn[data-v-6b284dea]:active{transform:scale(.985)}.rail-btn.rail-btn--active[data-v-6b284dea]{background:linear-gradient(120deg,#aa6efaeb,#7846dceb);color:#fff;box-shadow:0 3px 10px #8c50e673,inset 0 0 0 1px #ffffff2e}.rail-btn-glyph[data-v-6b284dea]{width:20px;display:inline-flex;justify-content:center;align-items:center;font-size:15px;line-height:1;flex:none}.rail-btn-label[data-v-6b284dea]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rail-group-ai[data-v-6b284dea]{margin-top:14px;padding-bottom:10px;position:relative}.rail-group-ai[data-v-6b284dea]:before{content:"";position:absolute;left:8px;right:8px;top:0;height:1px;background:linear-gradient(90deg,#fff0,#dc8ce659,#fff0)}.rail-btn--ai[data-v-6b284dea]{background:linear-gradient(135deg,#7846dc8c,#ff5ac88c);color:#fff;font-weight:600;box-shadow:0 2px 10px #dc5adc4d,inset 0 0 0 1px #fff3}.rail-btn--ai[data-v-6b284dea]:hover{background:linear-gradient(135deg,#965af0d9,#ff6edcd9);color:#fff;box-shadow:0 4px 14px #e66ee68c,inset 0 0 0 1px #ffffff4d}.rail-btn--ai .rail-btn-glyph[data-v-6b284dea]{font-size:16px;text-shadow:0 0 8px rgba(255,200,250,.6)}.edit-property-panel[data-v-781515fe]{height:100%;width:360px;background:linear-gradient(180deg,#1c0c38d9,#120624f2);border-left:1px solid rgba(255,255,255,.1);padding:0;backdrop-filter:blur(10px);overflow:hidden;display:flex;flex-direction:column;color:#e8d7f5eb}.prop-tabs[data-v-781515fe]{height:100%;display:flex;flex-direction:column}.prop-tabs[data-v-781515fe] .el-tabs__header{margin:0;padding:0 8px;border-bottom:1px solid rgba(255,255,255,.08)}.prop-tabs[data-v-781515fe] .el-tabs__nav-wrap:after{background:transparent}.prop-tabs[data-v-781515fe] .el-tabs__item{color:#dcc8f0b3;font-weight:500;font-size:13px;height:36px;line-height:36px}.prop-tabs[data-v-781515fe] .el-tabs__item.is-active{color:#fff}.prop-tabs[data-v-781515fe] .el-tabs__active-bar{background:linear-gradient(90deg,#aa6efa,#ff6edc);height:2px}.prop-tabs[data-v-781515fe] .el-tabs__content{flex:1;overflow:auto;padding:10px 12px 14px}.empty-hint[data-v-781515fe]{display:flex;align-items:center;gap:6px;padding:56px 16px;text-align:center;color:#dcc8f08c;flex-direction:column}.empty-icon[data-v-781515fe]{font-size:28px;color:#b482dc73}.empty-title[data-v-781515fe]{font-size:13px;color:#e8d7f5bf;font-weight:500}.empty-desc[data-v-781515fe]{font-size:11.5px;color:#dcc8f080}.loading-hint[data-v-781515fe]{display:flex;align-items:center;gap:8px;padding:32px 16px;text-align:center;color:#e8d7f5a6;font-size:12.5px;justify-content:center}.object-pane[data-v-781515fe]{display:flex;flex-direction:column;gap:10px}.prop-card[data-v-781515fe]{background:#ffffff0a;border:1px solid rgba(255,255,255,.08);border-radius:8px;padding:10px 12px;box-shadow:0 1px 4px #0003}.prop-card--header[data-v-781515fe]{background:linear-gradient(140deg,#aa6efa2e,#461e6e1a);border-color:#aa6efa47}.prop-card--geom[data-v-781515fe]{background:linear-gradient(140deg,#508cdc1a,#2846820f);border-color:#78aae638}.prop-card--style[data-v-781515fe]{background:linear-gradient(140deg,#dc6ec81a,#9646820f);border-color:#e682c838}.prop-card--custom[data-v-781515fe]{background:#ffffff08;border-color:#aa6efa2e}.prop-card--status[data-v-781515fe]{background:#508cdc0f;border-color:#78aae62e}.prop-card--actions[data-v-781515fe]{background:#8c50c80f;border-color:#aa6efa2e}.prop-card-header[data-v-781515fe]{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.prop-card-title[data-v-781515fe]{font-size:11.5px;font-weight:600;letter-spacing:1px;color:#dcb4fad9;text-transform:uppercase}.prop-card-meta[data-v-781515fe]{font-size:10.5px;color:#c8b4dc80}.prop-card-flag[data-v-781515fe]{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;color:#b4c8f099;padding:2px 7px;border-radius:10px;background:#78a0dc1a;transition:background .25s ease,color .25s ease,box-shadow .25s ease;margin-left:auto}.prop-card-flag.is-synced[data-v-781515fe]{background:linear-gradient(120deg,#50c88252,#78dcc852);color:#dcffe6f2;box-shadow:0 0 8px #50c88273}.prop-card-flag-dot[data-v-781515fe]{width:6px;height:6px;border-radius:50%;background:#b4c8f099;transition:background .25s ease,box-shadow .25s ease}.prop-card-flag.is-synced .prop-card-flag-dot[data-v-781515fe]{background:#6ce7a8;box-shadow:0 0 6px #6ce7a8d9}.prop-card-row[data-v-781515fe]{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.prop-card-row[data-v-781515fe]:last-child{margin-bottom:0}.prop-id-block[data-v-781515fe]{display:flex;align-items:center;gap:6px}.prop-id-tag[data-v-781515fe]{background:#aa6efa4d;color:#fff;padding:2px 8px;font-size:11.5px;font-weight:600;border-radius:4px;letter-spacing:.5px}.prop-type-tag[data-v-781515fe]{color:#e8d7f5bf;font-size:11.5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.prop-status-tag[data-v-781515fe]{font-weight:500}.prop-header-actions[data-v-781515fe]{display:flex;align-items:center;gap:6px}.prop-delete-btn[data-v-781515fe]{appearance:none;cursor:pointer;display:inline-flex;align-items:center;gap:4px;padding:3px 9px;border-radius:5px;font-size:11.5px;font-weight:500;letter-spacing:.4px;color:#ffc8d2f2;background:linear-gradient(135deg,#ff5a782e,#dc3c6e38);border:1px solid rgba(255,110,140,.45);transition:background .14s ease,border-color .14s ease,color .14s ease,box-shadow .14s ease,transform .12s ease}.prop-delete-btn[data-v-781515fe]:hover:not(:disabled){background:linear-gradient(135deg,#ff5a788c,#dc3c6ea6);border-color:#ff8caad9;color:#fff;box-shadow:0 3px 10px #dc466e73}.prop-delete-btn[data-v-781515fe]:active:not(:disabled){transform:scale(.96)}.prop-delete-btn[data-v-781515fe]:disabled{opacity:.55;cursor:progress}.prop-delete-icon[data-v-781515fe]{font-size:12px;line-height:1}.prop-name-row[data-v-781515fe],.prop-layer-row[data-v-781515fe]{gap:8px}.prop-name-label[data-v-781515fe]{width:36px;font-size:11.5px;color:#c8b4dcb3;flex:none}.prop-layer-select[data-v-781515fe]{flex:1}.prop-grid[data-v-781515fe]{display:grid;grid-template-columns:1fr 1fr;column-gap:8px;row-gap:8px}.prop-grid-item[data-v-781515fe]{display:flex;flex-direction:column;gap:3px;min-width:0}.prop-grid-item--wide[data-v-781515fe]{grid-column:1 / -1}.prop-field-label[data-v-781515fe]{font-size:11px;color:#c8b4e6c7;letter-spacing:.3px;display:flex;justify-content:space-between;align-items:baseline;gap:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prop-field-unit[data-v-781515fe]{font-size:10px;color:#aa96c88c;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;flex:none}.prop-field-num[data-v-781515fe] .el-input-number{width:100%}.prop-field-num[data-v-781515fe] .el-input__wrapper{background:#ffffff0f;box-shadow:inset 0 0 0 1px #aa6efa2e}.prop-field-row[data-v-781515fe]{display:flex;align-items:center;gap:4px}.prop-field-icon-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;width:22px;height:22px;border-radius:4px;background:#ff64821f;color:#ffb4c8d9;font-size:14px;line-height:1;display:inline-flex;align-items:center;justify-content:center;flex:none;transition:background .14s,color .14s}.prop-field-icon-btn[data-v-781515fe]:hover{background:#ff648252;color:#fff}.prop-empty-row[data-v-781515fe]{font-size:11.5px;color:#c8b4dc66;text-align:center;padding:8px 0}.prop-add-field-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;width:100%;margin-top:8px;padding:6px 10px;border-radius:6px;background:#aa6efa24;border:1px dashed rgba(170,110,250,.4);color:#dcb4faeb;font-size:12px;font-weight:500;transition:background .14s ease,border-color .14s ease,color .14s ease}.prop-add-field-btn[data-v-781515fe]:hover{background:#aa6efa42;border-color:#aa6efaa6;color:#fff}.prop-status-list[data-v-781515fe]{display:flex;flex-direction:column;gap:4px}.prop-status-item[data-v-781515fe]{display:flex;justify-content:space-between;align-items:center;padding:5px 8px;border-radius:4px;background:#ffffff08;font-size:11.5px}.prop-status-key[data-v-781515fe]{color:#aac8f0d9;font-weight:500}.prop-status-value[data-v-781515fe]{color:#e8f5fff2;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.prop-actions[data-v-781515fe]{display:grid;grid-template-columns:1fr 1fr;gap:6px}.prop-action-btn[data-v-781515fe]{appearance:none;border:0;cursor:pointer;padding:7px 10px;border-radius:7px;background:linear-gradient(135deg,#aa6efa33,#7846dc33);border:1px solid rgba(170,110,250,.35);color:#e8d7f5f2;font-size:12px;font-weight:500;display:flex;align-items:center;justify-content:flex-start;gap:6px;transition:background .14s ease,border-color .14s ease,transform .12s ease,box-shadow .14s ease;text-align:left}.prop-action-btn[data-v-781515fe]:hover:not(:disabled){background:linear-gradient(135deg,#aa6efa9e,#ff6edc8c);border-color:#ff82dcb3;color:#fff;box-shadow:0 4px 12px #b45adc66}.prop-action-btn[data-v-781515fe]:active:not(:disabled){transform:scale(.985)}.prop-action-btn[data-v-781515fe]:disabled{opacity:.6;cursor:progress}.prop-action-icon[data-v-781515fe]{font-size:9px;color:#ffc8fad9;flex:none}.prop-action-spinner[data-v-781515fe]{display:inline-block;animation:prop-spin-781515fe .8s linear infinite;font-size:13px}.prop-action-label[data-v-781515fe]{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@keyframes prop-spin-781515fe{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.defaults-pane[data-v-781515fe]{display:flex;flex-direction:column;gap:10px}.defaults-alert[data-v-781515fe]{margin-bottom:4px}.defaults-empty[data-v-781515fe]{padding:40px 12px}.defaults-form .el-button[data-v-781515fe]{margin-top:8px}.defaults-form[data-v-781515fe] .el-form-item{margin-bottom:10px}.layer-table[data-v-781515fe]{margin:6px 0;border-radius:8px;overflow:hidden;background:#fff;box-shadow:0 0 0 1px #7c3aed24}.layer-table[data-v-781515fe] .el-table__inner-wrapper{background:#fff}.layer-table[data-v-781515fe] th.el-table__cell{background:#f5f3ff!important;color:#2d1b69!important;font-weight:600}.layer-table[data-v-781515fe] td.el-table__cell{background:#fff!important;color:#1a0f3d!important;font-weight:500}.layer-table[data-v-781515fe] .cell{color:#1a0f3d!important}.layer-table[data-v-781515fe] tr:hover>td.el-table__cell{background:#ede9fe!important}.new-layer[data-v-781515fe]{margin-top:8px}.new-layer[data-v-781515fe] .el-input__inner{color:#1a0f3d;font-weight:500}.new-layer[data-v-781515fe] .el-input__inner::placeholder{color:#7a6b9a}.new-layer[data-v-781515fe] .el-input-group__append .el-button{color:#5b21b6;font-weight:600}.edit-status-bar[data-v-6254b10f]{display:flex;align-items:center;gap:16px;padding:4px 14px;background:#140828d9;border-top:1px solid rgba(255,255,255,.08);color:#e8d7f5d9;font-size:12px;font-family:ui-monospace,Menlo,Consolas,monospace;height:28px}.spacer[data-v-6254b10f]{flex:1}.seg b[data-v-6254b10f]{color:var(--mg-accent, #c4a4ff)}.seg .on[data-v-6254b10f]{color:#67c23a}.seg .off[data-v-6254b10f]{color:#a0a0a0}.seg.ok[data-v-6254b10f]{color:#67c23a}.seg.warn[data-v-6254b10f]{color:#f56c6c}.el-upload{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;cursor:pointer;outline:none;justify-content:center;align-items:center;display:inline-flex}.el-upload.is-disabled{cursor:not-allowed}.el-upload.is-disabled:focus{border-color:var(--el-border-color-darker);color:inherit}.el-upload.is-disabled:focus .el-upload-dragger{border-color:var(--el-border-color-darker)}.el-upload.is-disabled .el-upload-dragger{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-upload.is-disabled .el-upload-dragger .el-upload__text{color:var(--el-text-color-placeholder)}.el-upload.is-disabled .el-upload-dragger .el-upload__text em{color:var(--el-disabled-text-color)}.el-upload.is-disabled .el-upload-dragger:hover{border-color:var(--el-border-color-darker)}.el-upload__input{display:none}.el-upload__tip{color:var(--el-text-color-regular);margin-top:7px;font-size:12px}.el-upload iframe{z-index:-1;opacity:0;filter:alpha(opacity=0);position:absolute;top:0;left:0}.el-upload--picture-card{background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);box-sizing:border-box;width:var(--el-upload-picture-card-size);height:var(--el-upload-picture-card-size);cursor:pointer;vertical-align:top;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.el-upload--picture-card>i{color:var(--el-text-color-secondary);font-size:28px}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{padding:var(--el-upload-dragger-padding-vertical) var(--el-upload-dragger-padding-horizontal);background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);box-sizing:border-box;text-align:center;cursor:pointer;border-radius:6px;position:relative;overflow:hidden}.el-upload-dragger .el-icon--upload{color:var(--el-text-color-placeholder);margin-bottom:16px;font-size:67px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);text-align:center;font-size:14px}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{padding:calc(var(--el-upload-dragger-padding-vertical) - 1px) calc(var(--el-upload-dragger-padding-horizontal) - 1px);background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary)}.el-upload-list{--el-upload-dragger-padding-horizontal:10px;--el-upload-dragger-padding-vertical:40px;--el-upload-list-picture-card-size:var(--el-upload-picture-card-size);--el-upload-picture-card-size:148px;margin:10px 0 0;padding:0;list-style:none;position:relative}.el-upload-list__item{color:var(--el-text-color-regular);box-sizing:border-box;border-radius:4px;width:100%;margin-bottom:5px;font-size:14px;transition:all .5s cubic-bezier(.55,0,.1,1);position:relative}.el-upload-list__item .el-progress{width:100%;position:absolute;top:20px}.el-upload-list__item .el-progress__text{position:absolute;top:-13px;right:0}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{cursor:pointer;opacity:.75;color:var(--el-text-color-regular);transition:opacity var(--el-transition-duration);display:none;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.el-upload-list__item .el-icon--close:hover{opacity:1;color:var(--el-color-primary)}.el-upload-list__item .el-icon--close-tip{cursor:pointer;opacity:1;color:var(--el-color-primary);font-size:12px;font-style:normal;display:none;position:absolute;top:1px;right:5px}.el-upload-list__item:hover,.el-upload-list__item:focus-within{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close,.el-upload-list__item:focus-within .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-icon--close-tip,.el-upload-list__item:focus-within .el-icon--close-tip{right:24px}.el-upload-list__item:hover .el-progress__text,.el-upload-list__item:focus-within .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{flex-direction:column;justify-content:center;width:calc(100% - 30px);margin-left:4px;display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:hover,.el-upload-list__item.is-success .el-upload-list__item-name:focus{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:not(.focusing):focus,.el-upload-list__item.is-success:active{outline-width:0}.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip,.el-upload-list__item.is-success:active .el-icon--close-tip{display:none}.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:focus-within .el-upload-list__item-status-label{opacity:0;display:none}.el-upload-list__item-name{color:var(--el-text-color-regular);text-align:center;transition:color var(--el-transition-duration);font-size:var(--el-font-size-base);align-items:center;padding:0 4px;display:inline-flex}.el-upload-list__item-name .el-icon{color:var(--el-text-color-secondary);margin-right:6px}.el-upload-list__item-file-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.el-upload-list__item-status-label{line-height:inherit;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;display:none;position:absolute;top:0;right:5px}.el-upload-list__item-delete{color:var(--el-text-color-regular);font-size:12px;display:none;position:absolute;top:0;right:10px}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{flex-wrap:wrap;margin:0;display:inline-flex}.el-upload-list--picture-card .el-upload-list__item{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;width:var(--el-upload-list-picture-card-size);height:var(--el-upload-list-picture-card-size);border-radius:6px;margin:0 8px 8px 0;padding:0;display:inline-flex;overflow:hidden}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{object-fit:contain;width:100%;height:100%}.el-upload-list--picture-card .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-list--picture-card .el-upload-list__item-status-label i{margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{cursor:default;color:#fff;opacity:0;background-color:var(--el-overlay-color-lighter);width:100%;height:100%;transition:opacity var(--el-transition-duration);justify-content:center;align-items:center;font-size:20px;display:inline-flex;position:absolute;top:0;left:0}.el-upload-list--picture-card .el-upload-list__item-actions span{cursor:pointer;display:none}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:16px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{font-size:inherit;color:inherit;position:static}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{width:126px;top:50%;bottom:auto;left:50%;transform:translate(-50%,-50%)}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{z-index:0;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);box-sizing:border-box;border-radius:6px;align-items:center;margin-top:10px;padding:10px;display:flex;overflow:hidden}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:inline-flex}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{object-fit:contain;z-index:1;background-color:var(--el-color-white);justify-content:center;align-items:center;width:70px;height:70px;display:inline-flex;position:relative}.el-upload-list--picture .el-upload-list__item-status-label{background:var(--el-color-success);text-align:center;width:46px;height:26px;position:absolute;top:-7px;right:-17px;transform:rotate(45deg)}.el-upload-list--picture .el-upload-list__item-status-label i{margin-top:12px;font-size:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{z-index:10;cursor:default;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden}.el-upload-cover:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-upload-cover img{width:100%;height:100%;display:block}.el-upload-cover__label{background:var(--el-color-success);text-align:center;width:40px;height:24px;top:-6px;right:-15px;transform:rotate(45deg)}.el-upload-cover__label i{color:#fff;margin-top:11px;font-size:12px;transform:rotate(-45deg)}.el-upload-cover__progress{vertical-align:middle;width:243px;display:inline-block;position:static}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{width:100%;height:100%;position:absolute;top:0;left:0}.el-upload-cover__interact{background-color:var(--el-overlay-color-light);text-align:center;width:100%;height:100%;position:absolute;bottom:0;left:0}.el-upload-cover__interact .btn{color:#fff;cursor:pointer;vertical-align:middle;transition:var(--el-transition-md-fade);margin-top:60px;font-size:14px;display:inline-block}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;font-size:24px;line-height:inherit;margin:0 auto 5px;display:block}.el-upload-cover__title{text-overflow:ellipsis;white-space:nowrap;text-align:left;width:100%;height:36px;color:var(--el-text-color-primary);background-color:#fff;margin:0;padding:0 10px;font-size:14px;font-weight:400;line-height:36px;position:absolute;bottom:0;left:0;overflow:hidden}.el-upload-cover+.el-upload__inner{opacity:0;z-index:1;position:relative}.cfg-alert[data-v-47584778]{margin-bottom:12px}.ml[data-v-47584778]{margin-left:6px}.upload-hint[data-v-47584778]{display:flex;align-items:center;gap:8px;padding:12px;color:var(--el-text-color-regular, rgba(232,215,245,.7))}.result-panel[data-v-47584778]{margin-top:8px}.ai-text[data-v-47584778]{color:var(--el-text-color-primary, rgba(232,215,245,.85));padding:6px 0;white-space:pre-wrap}.ai-stat[data-v-47584778]{padding:6px 0;color:var(--el-text-color-primary, rgba(232,215,245,.85))}.ai-stat b[data-v-47584778]{color:var(--mg-accent, #c4a4ff)}.ai-generate-dialog.el-dialog,.ai-generate-dialog .el-dialog{background-color:rgb(var(--mg-bg-card-rgb))!important;box-shadow:0 24px 60px #08021099!important}.ai-assistant-panel[data-v-9fed2b0d]{position:absolute;top:0;right:0;bottom:0;z-index:30;display:flex;flex-direction:column;background:linear-gradient(180deg,#1c0c38fa,#100622fc);border-left:1px solid rgba(190,140,240,.28);box-shadow:-10px 0 30px #0802108c;color:#ece0faf2;transform:translate(100%);opacity:0;visibility:hidden;transition:transform .26s cubic-bezier(.25,.8,.25,1),opacity .26s ease,visibility .26s}.ai-assistant-panel.is-open[data-v-9fed2b0d]{transform:translate(0);opacity:1;visibility:visible}.aap-resizer[data-v-9fed2b0d]{position:absolute;left:0;top:0;bottom:0;width:6px;cursor:ew-resize;z-index:5;background:transparent;transition:background .15s ease;touch-action:none}.aap-resizer[data-v-9fed2b0d]:hover{background:#be8cf073}.aap-header[data-v-9fed2b0d]{flex:none;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 14px;background:linear-gradient(135deg,#7846dc80,#ff5ac866);border-bottom:1px solid rgba(255,255,255,.12)}.aap-title[data-v-9fed2b0d]{display:flex;align-items:center;gap:10px;min-width:0}.aap-glyph[data-v-9fed2b0d]{font-size:20px;color:#fff;text-shadow:0 0 10px rgba(255,200,250,.7);flex:none}.aap-title-text[data-v-9fed2b0d]{min-width:0}.aap-title-main[data-v-9fed2b0d]{font-size:15px;font-weight:700;color:#fff;line-height:1.2}.aap-title-sub[data-v-9fed2b0d]{font-size:11px;color:#f0deffc7;margin-top:2px}.aap-close[data-v-9fed2b0d]{appearance:none;border:0;background:#ffffff1f;color:#fff;width:26px;height:26px;border-radius:6px;cursor:pointer;font-size:13px;line-height:1;flex:none;transition:background .15s ease}.aap-close[data-v-9fed2b0d]:hover{background:#ffffff3d}.aap-alert[data-v-9fed2b0d]{margin:10px 12px 0}.aap-messages[data-v-9fed2b0d]{flex:1 1 0;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px}.aap-empty[data-v-9fed2b0d]{padding:8px 2px;display:flex;flex-direction:column;gap:8px}.aap-empty-title[data-v-9fed2b0d]{font-size:12px;color:#d2bcf0b3}.aap-example[data-v-9fed2b0d]{appearance:none;text-align:left;border:1px dashed rgba(190,140,240,.4);background:#ffffff0a;color:#e8d7f5e6;border-radius:8px;padding:8px 10px;font-size:12.5px;cursor:pointer;transition:all .15s ease}.aap-example[data-v-9fed2b0d]:hover{background:#965ae638;border-color:#be8cf0b3;color:#fff}.aap-msg[data-v-9fed2b0d]{display:flex}.aap-msg--user[data-v-9fed2b0d]{justify-content:flex-end}.aap-msg--assistant[data-v-9fed2b0d]{justify-content:flex-start}.aap-bubble[data-v-9fed2b0d]{max-width:86%;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.5}.aap-msg--user .aap-bubble[data-v-9fed2b0d]{background:linear-gradient(135deg,#965af0f2,#7846dcf2);color:#fff;border-bottom-right-radius:4px}.aap-msg--assistant .aap-bubble[data-v-9fed2b0d]{background:#ffffff12;border:1px solid rgba(255,255,255,.1);color:#ece0faf2;border-bottom-left-radius:4px}.aap-bubble-text[data-v-9fed2b0d]{white-space:pre-wrap;word-break:break-word}.aap-meta[data-v-9fed2b0d]{margin-top:6px;padding-top:6px;border-top:1px dashed rgba(255,255,255,.14);font-size:11.5px;color:#d2bcf0cc}.aap-meta b[data-v-9fed2b0d]{color:var(--mg-accent, #c4a4ff)}.aap-bubble--loading[data-v-9fed2b0d]{display:inline-flex;align-items:center;gap:8px;color:#d2bcf0d9}.aap-toolbar[data-v-9fed2b0d]{flex:none;display:flex;align-items:center;gap:8px;padding:8px 12px 0;flex-wrap:wrap}.aap-toolbar-label[data-v-9fed2b0d]{font-size:11.5px;color:#d2bcf0b3;flex:none}.aap-toolbar[data-v-9fed2b0d] .el-radio-button__inner{padding:5px 9px;font-size:12px}.aap-input[data-v-9fed2b0d]{flex:none;padding:8px 12px 12px;display:flex;flex-direction:column;gap:8px}.aap-send[data-v-9fed2b0d]{align-self:flex-end;min-width:84px}.map-editor-page[data-v-704ddb94]{height:calc(100vh - 56px);display:flex;flex-direction:column;background:radial-gradient(ellipse at 50% 40%,#2d1456,#1a0930,#0f0420);color:#e8d7f5e6}.me-body[data-v-704ddb94]{flex:1;display:flex;min-height:0;position:relative}.ai-assistant-fab[data-v-704ddb94]{position:absolute;top:50%;right:0;transform:translateY(-50%);z-index:31;display:flex;flex-direction:column;align-items:center;gap:5px;width:42px;padding:14px 0;border:none;border-radius:12px 0 0 12px;cursor:pointer;color:#fff;background:linear-gradient(135deg,#965af0f5,#ff5ac8eb);box-shadow:-4px 0 16px #7828c873;transition:right .26s cubic-bezier(.25,.8,.25,1),filter .15s ease,box-shadow .15s ease}.ai-assistant-fab[data-v-704ddb94]:hover{filter:brightness(1.08);box-shadow:-6px 0 22px #963ce699}.ai-assistant-fab.is-open[data-v-704ddb94]{right:360px}.ai-assistant-fab .fab-glyph[data-v-704ddb94]{font-size:18px;line-height:1;text-shadow:0 0 10px rgba(255,220,255,.85)}.ai-assistant-fab .fab-text[data-v-704ddb94]{font-size:12px;font-weight:700;line-height:1.18;letter-spacing:1px;text-align:center}.me-center[data-v-704ddb94]{flex:1;min-width:0;display:flex}.me-center[data-v-704ddb94] .workspace-3d-wrap{flex:1;height:100%;border:0;border-radius:0;min-height:0} diff --git a/MiGu.Server/wwwroot/assets/MapManagementView-D5EJh6kt.js b/MiGu.Server/wwwroot/assets/MapManagementView-CccyKhbv.js similarity index 99% rename from MiGu.Server/wwwroot/assets/MapManagementView-D5EJh6kt.js rename to MiGu.Server/wwwroot/assets/MapManagementView-CccyKhbv.js index fec1392..2014a12 100644 --- a/MiGu.Server/wwwroot/assets/MapManagementView-D5EJh6kt.js +++ b/MiGu.Server/wwwroot/assets/MapManagementView-CccyKhbv.js @@ -1,4 +1,4 @@ -import{aI as te,bI as he,b7 as ae,b9 as d,aE as h,aB as _,aH as t,R as se,bt as oe,bn as xe,r as le,bc as Ve,bJ as n,aG as g,bK as re,bA as ie,aC as E,ab as ue,bq as B,_ as Ee,G as Ie,N as ce,O as de,a4 as pe,ai as L,bj as J,S as Te,bh as p,bg as Be,ax as Q,X as M,Y as j,aa as me,Z as fe,ak as ne,E as ge,aD as W,bL as Ne,ad as ve,ac as ze,bx as Oe,a9 as Ue}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{b as A}from"./mapEdit-BiAzHHno.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const _e="mapEditor.mapConnections.v1",be="mapEditor.mapIdRegistry.v1";function K(){try{const i=localStorage.getItem(_e);if(!i)return[];const s=JSON.parse(i);return Array.isArray(s)?s:[]}catch{return[]}}function ee(i){localStorage.setItem(_e,JSON.stringify(i))}function Ae(){try{return JSON.parse(localStorage.getItem(be)??"{}")||{}}catch{return{}}}function De(i){localStorage.setItem(be,JSON.stringify(i))}function X(i){if(!i)return 0;const s=Ae();if(s[i]!=null)return s[i];const b=Object.values(s).reduce((S,v)=>Math.max(S,v),0)+1;return s[i]=b,De(s),b}function Z(i){return new Promise(s=>setTimeout(()=>s(i),60))}const P={list(){return Z(K().slice().sort((i,s)=>s.id-i.id))},create(i){const s=K(),S={id:s.reduce((v,$)=>Math.max(v,$.id),0)+1,...i,sourceMapId:X(i.sourceMap),targetMapId:X(i.targetMap)};return s.push(S),ee(s),Z(S)},update(i,s){const b=K(),S=b.findIndex($=>$.id===i);if(S<0)return Promise.reject(new Error("连接不存在或已被删除"));const v={id:i,...s,sourceMapId:X(s.sourceMap),targetMapId:X(s.targetMap)};return b[S]=v,ee(b),Z(v)},remove(i){return ee(K().filter(s=>s.id!==i)),Z({id:i,deleted:!0})},stationSuggestions(){const i=new Set;for(const s of K())s.sourceStation&&i.add(s.sourceStation),s.targetStation&&i.add(s.targetStation);return Array.from(i)}},Pe={class:"mc-panel"},Re={class:"mc-toolbar"},qe={class:"mc-cost mg-mono"},Le={class:"mc-pager"},Je=te({__name:"MapConnectionPanel",setup(i,{expose:s}){const b=p(!1),S=p(!1),v=p([]),$=p([]),V=p([]),f=p(""),m=p(1),x=p(10),y=p(!1),I=p(null),T=p(),u=Be({sourceMap:"",sourceStation:"",targetMap:"",targetStation:"",cost:1e3}),R={sourceMap:[{required:!0,message:"请选择起始地图",trigger:"change"}],sourceStation:[{required:!0,message:"请选择起始切换点站点",trigger:"change"}],targetMap:[{required:!0,message:"请选择目的地图",trigger:"change"}],targetStation:[{required:!0,message:"请选择目的切换点站点",trigger:"change"}],cost:[{required:!0,message:"请输入转移代价",trigger:"blur"}]},q=Q(()=>{const c=f.value.trim().toLowerCase();return c?v.value.filter(e=>e.sourceMap.toLowerCase().includes(c)||e.targetMap.toLowerCase().includes(c)):v.value}),k=Q(()=>{const c=(m.value-1)*x.value;return q.value.slice(c,c+x.value)});he([f,x],()=>{m.value=1});async function a(){b.value=!0;try{v.value=await P.list(),V.value=P.stationSuggestions()}catch(c){M.error(`加载地图连接失败:${c.message}`)}finally{b.value=!1}}async function l(){try{const c=await A.list();$.value=c.maps.map(e=>e.name)}catch{$.value=[]}}function r(){u.sourceMap="",u.sourceStation="",u.targetMap="",u.targetStation="",u.cost=1e3}function C(){I.value=null,r(),V.value=P.stationSuggestions(),y.value=!0}function N(c){I.value=c.id,u.sourceMap=c.sourceMap,u.sourceStation=c.sourceStation,u.targetMap=c.targetMap,u.targetStation=c.targetStation,u.cost=c.cost,V.value=P.stationSuggestions(),y.value=!0}function D(){T.value?.clearValidate()}async function F(){T.value&&await T.value.validate(async c=>{if(c){S.value=!0;try{const e={sourceMap:u.sourceMap,sourceStation:u.sourceStation,targetMap:u.targetMap,targetStation:u.targetStation,cost:u.cost};I.value===null?(await P.create(e),M.success("已添加地图连接")):(await P.update(I.value,e),M.success("已更新地图连接")),y.value=!1,await a()}catch(e){M.error(`保存失败:${e.message}`)}finally{S.value=!1}}})}async function U(c){try{await j.confirm(`确认删除「${c.sourceMap} → ${c.targetMap}」这条地图连接?`,"删除地图连接",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"}),await P.remove(c.id),M.success("已删除"),k.value.length===1&&m.value>1&&(m.value-=1),await a()}catch(e){if(e==="cancel"||e==="close")return;M.error(`删除失败:${e.message}`)}}return ae(()=>{a(),l()}),s({refresh:a}),(c,e)=>{const w=se,z=le,O=ue,ye=me,we=Ee,Y=fe,H=pe,G=de,Me=Te,Se=ce,$e=Ie,ke=ie;return d(),h("div",Pe,[_("div",Re,[t(w,{modelValue:f.value,"onUpdate:modelValue":e[0]||(e[0]=o=>f.value=o),class:"mc-search",placeholder:"请输入地图名称搜索",clearable:"","prefix-icon":oe(xe)},null,8,["modelValue","prefix-icon"]),t(z,{type:"primary",icon:oe(Ve),onClick:C},{default:n(()=>[...e[10]||(e[10]=[g("添加地图关系",-1)])]),_:1},8,["icon"])]),re((d(),E(ye,{data:k.value,class:"mc-table",border:"","empty-text":"还没有地图连接关系,点击右上角「添加地图关系」创建跨楼层 / 拼接连接。"},{default:n(()=>[t(O,{prop:"id",label:"ID",width:"80",sortable:""}),t(O,{prop:"sourceMap",label:"起始地图名称","min-width":"160","show-overflow-tooltip":""}),t(O,{prop:"sourceMapId",label:"起始地图ID",width:"110"}),t(O,{prop:"sourceStation",label:"起始切换点站点","min-width":"150","show-overflow-tooltip":""}),t(O,{prop:"targetMap",label:"目的地图名称","min-width":"160","show-overflow-tooltip":""}),t(O,{prop:"targetMapId",label:"目的地图ID",width:"110"}),t(O,{prop:"targetStation",label:"目的切换点站点","min-width":"150","show-overflow-tooltip":""}),t(O,{label:"转移代价(cm)",width:"130"},{default:n(({row:o})=>[_("span",qe,B(o.cost),1)]),_:1}),t(O,{label:"操作",width:"130",align:"right",fixed:"right"},{default:n(({row:o})=>[t(z,{link:"",type:"primary",onClick:Ce=>N(o)},{default:n(()=>[...e[11]||(e[11]=[g("编辑",-1)])]),_:1},8,["onClick"]),t(z,{link:"",type:"danger",onClick:Ce=>U(o)},{default:n(()=>[...e[12]||(e[12]=[g("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[ke,b.value]]),_("div",Le,[t(we,{"current-page":m.value,"onUpdate:currentPage":e[1]||(e[1]=o=>m.value=o),"page-size":x.value,"onUpdate:pageSize":e[2]||(e[2]=o=>x.value=o),total:q.value.length,"page-sizes":[10,20,50],layout:"total, sizes, prev, pager, next, jumper",background:""},null,8,["current-page","page-size","total"])]),t($e,{modelValue:y.value,"onUpdate:modelValue":e[9]||(e[9]=o=>y.value=o),title:I.value===null?"添加地图关系":"编辑地图关系",width:"520px",class:"map-conn-dialog","append-to-body":"",onClosed:D},{footer:n(()=>[t(z,{onClick:e[8]||(e[8]=o=>y.value=!1)},{default:n(()=>[...e[13]||(e[13]=[g("取消",-1)])]),_:1}),t(z,{type:"primary",loading:S.value,onClick:F},{default:n(()=>[...e[14]||(e[14]=[g("确定",-1)])]),_:1},8,["loading"])]),default:n(()=>[t(Se,{ref_key:"formRef",ref:T,model:u,rules:R,"label-width":"120px","label-position":"right"},{default:n(()=>[t(G,{label:"起始地图",prop:"sourceMap"},{default:n(()=>[t(H,{modelValue:u.sourceMap,"onUpdate:modelValue":e[3]||(e[3]=o=>u.sourceMap=o),placeholder:"请选择起始地图",filterable:"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J($.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"起始切换点站点",prop:"sourceStation"},{default:n(()=>[t(H,{modelValue:u.sourceStation,"onUpdate:modelValue":e[4]||(e[4]=o=>u.sourceStation=o),placeholder:"请选择起始切换点站点",filterable:"","allow-create":"","default-first-option":"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(V.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"目的地图",prop:"targetMap"},{default:n(()=>[t(H,{modelValue:u.targetMap,"onUpdate:modelValue":e[5]||(e[5]=o=>u.targetMap=o),placeholder:"请选择目的地图",filterable:"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J($.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"目的切换点站点",prop:"targetStation"},{default:n(()=>[t(H,{modelValue:u.targetStation,"onUpdate:modelValue":e[6]||(e[6]=o=>u.targetStation=o),placeholder:"请选择目的切换点站点",filterable:"","allow-create":"","default-first-option":"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(V.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"转移代价(cm)",prop:"cost"},{default:n(()=>[t(Me,{modelValue:u.cost,"onUpdate:modelValue":e[7]||(e[7]=o=>u.cost=o),min:0,step:100,controls:!1,style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])])}}}),je=ne(Je,[["__scopeId","data-v-bad72017"]]),Fe={class:"mm-merge"},Ge={class:"merge-body"},Ke={key:1,class:"merge-hint"},Ye={class:"merge-hint"},He={key:0,class:"merge-order"},Xe={class:"order-list"},Ze={class:"order-item"},Qe={class:"order-name"},We={class:"order-name"},et=te({__name:"MapMergePanel",emits:["merged"],setup(i,{expose:s,emit:b}){const S=b,v=p(!1),$=p(!1),V=p([]),f=p(""),m=p([]),x=p(""),y=Q(()=>V.value.filter(k=>k!==f.value)),I=Q(()=>!!f.value&&m.value.length>=1&&x.value.trim().length>0);async function T(){v.value=!0;try{const k=await A.list();V.value=k.maps.map(a=>a.name),f.value=k.maps.find(a=>a.isCurrent)?.name??"",m.value=m.value.filter(a=>y.value.includes(a))}catch(k){M.error(`加载地图列表失败:${k.message}`)}finally{v.value=!1}}function u(){m.value=[],x.value=""}async function R(k){const a=[...m.value],l=x.value.trim(),r=await A.merge(a,l,k);if(r.ok){const C=r.data.overwroteCurrent?"(已覆盖当前地图)":"";M.success(`已把 ${r.data.sourceCount} 张地图合并进「${r.data.baseMap}」并另存为「${r.data.name}」${C}(站点 ${r.data.sites} · 路径 ${r.data.tracks})`),u(),await T(),S("merged",l);return}if(r.conflict){const C=l===f.value?`目标与当前地图「${l}」同名,将用合并结果覆盖当前地图,是否继续?`:`地图「${l}」已存在,是否替换原地图?`;try{await j.confirm(C,"目标地图已存在",{type:"warning",confirmButtonText:"替换",cancelButtonText:"取消"})}catch{return}await R(!0);return}M.error(r.message)}async function q(){if(I.value){$.value=!0;try{await R(!1)}finally{$.value=!1}}}return ae(T),s({refresh:T}),(k,a)=>{const l=ge,r=ve,C=de,N=fe,D=pe,F=se,U=le,c=ce;return d(),h("div",Fe,[t(l,{class:"merge-tip",type:"info",closable:!1,"show-icon":""},{title:n(()=>[...a[3]||(a[3]=[g(" 与桌面端「合并」一致:以",-1),_("strong",null,"当前使用地图",-1),g("为底图,把选中的地图依次合并进来(自动分配独立图层、 站点 / 路径 ID 自动避让,互不冲突),再另存为目标地图。可用于多楼层汇总、多区域拼接。 ",-1)])]),_:1}),!v.value&&!f.value?(d(),E(l,{key:0,class:"merge-tip",type:"warning",closable:!1,"show-icon":"",title:"当前未设置「使用中」地图。请先到「服务器地图」页对某张地图点「使用」,再来执行合并。"})):W("",!0),_("div",Ge,[t(c,{"label-width":"120px","label-position":"right",class:"merge-form",onSubmit:a[2]||(a[2]=Ne(()=>{},["prevent"]))},{default:n(()=>[t(C,{label:"底图(当前地图)"},{default:n(()=>[f.value?(d(),E(r,{key:0,type:"success",effect:"plain"},{default:n(()=>[g(B(f.value),1)]),_:1})):(d(),h("span",Ke,"未设置"))]),_:1}),t(C,{label:"合并进来的地图",required:""},{default:n(()=>[t(D,{modelValue:m.value,"onUpdate:modelValue":a[0]||(a[0]=e=>m.value=e),multiple:"",filterable:"",loading:v.value,disabled:!f.value,placeholder:"选择 1 张及以上要合并进当前地图的地图",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(y.value,e=>(d(),E(N,{key:e,label:e,value:e},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"])]),_:1}),t(C,{label:"另存为",required:""},{default:n(()=>[t(F,{modelValue:x.value,"onUpdate:modelValue":a[1]||(a[1]=e=>x.value=e),disabled:!f.value,placeholder:"目标地图名称(与当前地图同名则覆盖当前地图)",clearable:"",maxlength:"60"},null,8,["modelValue","disabled"])]),_:1}),t(C,null,{default:n(()=>[t(U,{type:"primary",loading:$.value,disabled:!I.value,onClick:q},{default:n(()=>[...a[4]||(a[4]=[g("开始合并",-1)])]),_:1},8,["loading","disabled"]),t(U,{text:"",disabled:!f.value,onClick:u},{default:n(()=>[...a[5]||(a[5]=[g("重置",-1)])]),_:1},8,["disabled"]),_("span",Ye,"已选 "+B(m.value.length)+" 张",1)]),_:1})]),_:1}),f.value?(d(),h("div",He,[a[7]||(a[7]=_("div",{class:"order-title"},"叠加顺序",-1)),_("ol",Xe,[_("li",Ze,[t(r,{size:"small",type:"success",effect:"plain"},{default:n(()=>[...a[6]||(a[6]=[g("底图",-1)])]),_:1}),_("span",Qe,B(f.value),1)]),(d(!0),h(L,null,J(m.value,(e,w)=>(d(),h("li",{key:e,class:"order-item"},[t(r,{size:"small",type:"info",effect:"plain"},{default:n(()=>[g("叠加 "+B(w+1),1)]),_:2},1024),_("span",We,B(e),1)]))),128))])])):W("",!0)])])}}}),tt=ne(et,[["__scopeId","data-v-bd67282a"]]),at={class:"map-mgr-page"},lt={class:"mm-section"},nt={class:"map-mgr-header"},ot={class:"actions"},st={key:0},rt={key:1},it={class:"map-name"},ut=te({__name:"MapManagementView",setup(i){const s=Oe(),b=p("maps");function S(){b.value="maps",y()}const v=p(!1),$=p([]),V=p(""),f=p(""),m=p("");function x({row:a}){return a.isCurrent?"current-row":""}async function y(){v.value=!0;try{const a=await A.list();$.value=a.maps,V.value=a.directory;const l=a.maps.find(r=>r.isCurrent);f.value=l?.name??""}catch(a){M.error(`加载地图列表失败:${a.message}`)}finally{v.value=!1}}function I(){s.push({path:"/admin/map-editor",query:{new:"1"}})}function T(a){s.push({path:"/admin/map-editor",query:{map:a.name}})}async function u(a){if(!a.isCurrent){m.value=a.name;try{const l=await A.sceneTaskStatus();if(l.hasTask){const C=l.busyCars.slice(0,5).map(N=>`${N.name}(#${N.id}):${N.reasons.join("、")}`).join(` +import{aI as te,bI as he,b7 as ae,b9 as d,aE as h,aB as _,aH as t,R as se,bt as oe,bn as xe,r as le,bc as Ve,bJ as n,aG as g,bK as re,bA as ie,aC as E,ab as ue,bq as B,_ as Ee,G as Ie,N as ce,O as de,a4 as pe,ai as L,bj as J,S as Te,bh as p,bg as Be,ax as Q,X as M,Y as j,aa as me,Z as fe,ak as ne,E as ge,aD as W,bL as Ne,ad as ve,ac as ze,bx as Oe,a9 as Ue}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{b as A}from"./mapEdit-TNAQr3Be.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const _e="mapEditor.mapConnections.v1",be="mapEditor.mapIdRegistry.v1";function K(){try{const i=localStorage.getItem(_e);if(!i)return[];const s=JSON.parse(i);return Array.isArray(s)?s:[]}catch{return[]}}function ee(i){localStorage.setItem(_e,JSON.stringify(i))}function Ae(){try{return JSON.parse(localStorage.getItem(be)??"{}")||{}}catch{return{}}}function De(i){localStorage.setItem(be,JSON.stringify(i))}function X(i){if(!i)return 0;const s=Ae();if(s[i]!=null)return s[i];const b=Object.values(s).reduce((S,v)=>Math.max(S,v),0)+1;return s[i]=b,De(s),b}function Z(i){return new Promise(s=>setTimeout(()=>s(i),60))}const P={list(){return Z(K().slice().sort((i,s)=>s.id-i.id))},create(i){const s=K(),S={id:s.reduce((v,$)=>Math.max(v,$.id),0)+1,...i,sourceMapId:X(i.sourceMap),targetMapId:X(i.targetMap)};return s.push(S),ee(s),Z(S)},update(i,s){const b=K(),S=b.findIndex($=>$.id===i);if(S<0)return Promise.reject(new Error("连接不存在或已被删除"));const v={id:i,...s,sourceMapId:X(s.sourceMap),targetMapId:X(s.targetMap)};return b[S]=v,ee(b),Z(v)},remove(i){return ee(K().filter(s=>s.id!==i)),Z({id:i,deleted:!0})},stationSuggestions(){const i=new Set;for(const s of K())s.sourceStation&&i.add(s.sourceStation),s.targetStation&&i.add(s.targetStation);return Array.from(i)}},Pe={class:"mc-panel"},Re={class:"mc-toolbar"},qe={class:"mc-cost mg-mono"},Le={class:"mc-pager"},Je=te({__name:"MapConnectionPanel",setup(i,{expose:s}){const b=p(!1),S=p(!1),v=p([]),$=p([]),V=p([]),f=p(""),m=p(1),x=p(10),y=p(!1),I=p(null),T=p(),u=Be({sourceMap:"",sourceStation:"",targetMap:"",targetStation:"",cost:1e3}),R={sourceMap:[{required:!0,message:"请选择起始地图",trigger:"change"}],sourceStation:[{required:!0,message:"请选择起始切换点站点",trigger:"change"}],targetMap:[{required:!0,message:"请选择目的地图",trigger:"change"}],targetStation:[{required:!0,message:"请选择目的切换点站点",trigger:"change"}],cost:[{required:!0,message:"请输入转移代价",trigger:"blur"}]},q=Q(()=>{const c=f.value.trim().toLowerCase();return c?v.value.filter(e=>e.sourceMap.toLowerCase().includes(c)||e.targetMap.toLowerCase().includes(c)):v.value}),k=Q(()=>{const c=(m.value-1)*x.value;return q.value.slice(c,c+x.value)});he([f,x],()=>{m.value=1});async function a(){b.value=!0;try{v.value=await P.list(),V.value=P.stationSuggestions()}catch(c){M.error(`加载地图连接失败:${c.message}`)}finally{b.value=!1}}async function l(){try{const c=await A.list();$.value=c.maps.map(e=>e.name)}catch{$.value=[]}}function r(){u.sourceMap="",u.sourceStation="",u.targetMap="",u.targetStation="",u.cost=1e3}function C(){I.value=null,r(),V.value=P.stationSuggestions(),y.value=!0}function N(c){I.value=c.id,u.sourceMap=c.sourceMap,u.sourceStation=c.sourceStation,u.targetMap=c.targetMap,u.targetStation=c.targetStation,u.cost=c.cost,V.value=P.stationSuggestions(),y.value=!0}function D(){T.value?.clearValidate()}async function F(){T.value&&await T.value.validate(async c=>{if(c){S.value=!0;try{const e={sourceMap:u.sourceMap,sourceStation:u.sourceStation,targetMap:u.targetMap,targetStation:u.targetStation,cost:u.cost};I.value===null?(await P.create(e),M.success("已添加地图连接")):(await P.update(I.value,e),M.success("已更新地图连接")),y.value=!1,await a()}catch(e){M.error(`保存失败:${e.message}`)}finally{S.value=!1}}})}async function U(c){try{await j.confirm(`确认删除「${c.sourceMap} → ${c.targetMap}」这条地图连接?`,"删除地图连接",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"}),await P.remove(c.id),M.success("已删除"),k.value.length===1&&m.value>1&&(m.value-=1),await a()}catch(e){if(e==="cancel"||e==="close")return;M.error(`删除失败:${e.message}`)}}return ae(()=>{a(),l()}),s({refresh:a}),(c,e)=>{const w=se,z=le,O=ue,ye=me,we=Ee,Y=fe,H=pe,G=de,Me=Te,Se=ce,$e=Ie,ke=ie;return d(),h("div",Pe,[_("div",Re,[t(w,{modelValue:f.value,"onUpdate:modelValue":e[0]||(e[0]=o=>f.value=o),class:"mc-search",placeholder:"请输入地图名称搜索",clearable:"","prefix-icon":oe(xe)},null,8,["modelValue","prefix-icon"]),t(z,{type:"primary",icon:oe(Ve),onClick:C},{default:n(()=>[...e[10]||(e[10]=[g("添加地图关系",-1)])]),_:1},8,["icon"])]),re((d(),E(ye,{data:k.value,class:"mc-table",border:"","empty-text":"还没有地图连接关系,点击右上角「添加地图关系」创建跨楼层 / 拼接连接。"},{default:n(()=>[t(O,{prop:"id",label:"ID",width:"80",sortable:""}),t(O,{prop:"sourceMap",label:"起始地图名称","min-width":"160","show-overflow-tooltip":""}),t(O,{prop:"sourceMapId",label:"起始地图ID",width:"110"}),t(O,{prop:"sourceStation",label:"起始切换点站点","min-width":"150","show-overflow-tooltip":""}),t(O,{prop:"targetMap",label:"目的地图名称","min-width":"160","show-overflow-tooltip":""}),t(O,{prop:"targetMapId",label:"目的地图ID",width:"110"}),t(O,{prop:"targetStation",label:"目的切换点站点","min-width":"150","show-overflow-tooltip":""}),t(O,{label:"转移代价(cm)",width:"130"},{default:n(({row:o})=>[_("span",qe,B(o.cost),1)]),_:1}),t(O,{label:"操作",width:"130",align:"right",fixed:"right"},{default:n(({row:o})=>[t(z,{link:"",type:"primary",onClick:Ce=>N(o)},{default:n(()=>[...e[11]||(e[11]=[g("编辑",-1)])]),_:1},8,["onClick"]),t(z,{link:"",type:"danger",onClick:Ce=>U(o)},{default:n(()=>[...e[12]||(e[12]=[g("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[ke,b.value]]),_("div",Le,[t(we,{"current-page":m.value,"onUpdate:currentPage":e[1]||(e[1]=o=>m.value=o),"page-size":x.value,"onUpdate:pageSize":e[2]||(e[2]=o=>x.value=o),total:q.value.length,"page-sizes":[10,20,50],layout:"total, sizes, prev, pager, next, jumper",background:""},null,8,["current-page","page-size","total"])]),t($e,{modelValue:y.value,"onUpdate:modelValue":e[9]||(e[9]=o=>y.value=o),title:I.value===null?"添加地图关系":"编辑地图关系",width:"520px",class:"map-conn-dialog","append-to-body":"",onClosed:D},{footer:n(()=>[t(z,{onClick:e[8]||(e[8]=o=>y.value=!1)},{default:n(()=>[...e[13]||(e[13]=[g("取消",-1)])]),_:1}),t(z,{type:"primary",loading:S.value,onClick:F},{default:n(()=>[...e[14]||(e[14]=[g("确定",-1)])]),_:1},8,["loading"])]),default:n(()=>[t(Se,{ref_key:"formRef",ref:T,model:u,rules:R,"label-width":"120px","label-position":"right"},{default:n(()=>[t(G,{label:"起始地图",prop:"sourceMap"},{default:n(()=>[t(H,{modelValue:u.sourceMap,"onUpdate:modelValue":e[3]||(e[3]=o=>u.sourceMap=o),placeholder:"请选择起始地图",filterable:"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J($.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"起始切换点站点",prop:"sourceStation"},{default:n(()=>[t(H,{modelValue:u.sourceStation,"onUpdate:modelValue":e[4]||(e[4]=o=>u.sourceStation=o),placeholder:"请选择起始切换点站点",filterable:"","allow-create":"","default-first-option":"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(V.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"目的地图",prop:"targetMap"},{default:n(()=>[t(H,{modelValue:u.targetMap,"onUpdate:modelValue":e[5]||(e[5]=o=>u.targetMap=o),placeholder:"请选择目的地图",filterable:"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J($.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"目的切换点站点",prop:"targetStation"},{default:n(()=>[t(H,{modelValue:u.targetStation,"onUpdate:modelValue":e[6]||(e[6]=o=>u.targetStation=o),placeholder:"请选择目的切换点站点",filterable:"","allow-create":"","default-first-option":"",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(V.value,o=>(d(),E(Y,{key:o,label:o,value:o},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])]),_:1}),t(G,{label:"转移代价(cm)",prop:"cost"},{default:n(()=>[t(Me,{modelValue:u.cost,"onUpdate:modelValue":e[7]||(e[7]=o=>u.cost=o),min:0,step:100,controls:!1,style:{width:"100%"}},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),_:1},8,["modelValue","title"])])}}}),je=ne(Je,[["__scopeId","data-v-bad72017"]]),Fe={class:"mm-merge"},Ge={class:"merge-body"},Ke={key:1,class:"merge-hint"},Ye={class:"merge-hint"},He={key:0,class:"merge-order"},Xe={class:"order-list"},Ze={class:"order-item"},Qe={class:"order-name"},We={class:"order-name"},et=te({__name:"MapMergePanel",emits:["merged"],setup(i,{expose:s,emit:b}){const S=b,v=p(!1),$=p(!1),V=p([]),f=p(""),m=p([]),x=p(""),y=Q(()=>V.value.filter(k=>k!==f.value)),I=Q(()=>!!f.value&&m.value.length>=1&&x.value.trim().length>0);async function T(){v.value=!0;try{const k=await A.list();V.value=k.maps.map(a=>a.name),f.value=k.maps.find(a=>a.isCurrent)?.name??"",m.value=m.value.filter(a=>y.value.includes(a))}catch(k){M.error(`加载地图列表失败:${k.message}`)}finally{v.value=!1}}function u(){m.value=[],x.value=""}async function R(k){const a=[...m.value],l=x.value.trim(),r=await A.merge(a,l,k);if(r.ok){const C=r.data.overwroteCurrent?"(已覆盖当前地图)":"";M.success(`已把 ${r.data.sourceCount} 张地图合并进「${r.data.baseMap}」并另存为「${r.data.name}」${C}(站点 ${r.data.sites} · 路径 ${r.data.tracks})`),u(),await T(),S("merged",l);return}if(r.conflict){const C=l===f.value?`目标与当前地图「${l}」同名,将用合并结果覆盖当前地图,是否继续?`:`地图「${l}」已存在,是否替换原地图?`;try{await j.confirm(C,"目标地图已存在",{type:"warning",confirmButtonText:"替换",cancelButtonText:"取消"})}catch{return}await R(!0);return}M.error(r.message)}async function q(){if(I.value){$.value=!0;try{await R(!1)}finally{$.value=!1}}}return ae(T),s({refresh:T}),(k,a)=>{const l=ge,r=ve,C=de,N=fe,D=pe,F=se,U=le,c=ce;return d(),h("div",Fe,[t(l,{class:"merge-tip",type:"info",closable:!1,"show-icon":""},{title:n(()=>[...a[3]||(a[3]=[g(" 与桌面端「合并」一致:以",-1),_("strong",null,"当前使用地图",-1),g("为底图,把选中的地图依次合并进来(自动分配独立图层、 站点 / 路径 ID 自动避让,互不冲突),再另存为目标地图。可用于多楼层汇总、多区域拼接。 ",-1)])]),_:1}),!v.value&&!f.value?(d(),E(l,{key:0,class:"merge-tip",type:"warning",closable:!1,"show-icon":"",title:"当前未设置「使用中」地图。请先到「服务器地图」页对某张地图点「使用」,再来执行合并。"})):W("",!0),_("div",Ge,[t(c,{"label-width":"120px","label-position":"right",class:"merge-form",onSubmit:a[2]||(a[2]=Ne(()=>{},["prevent"]))},{default:n(()=>[t(C,{label:"底图(当前地图)"},{default:n(()=>[f.value?(d(),E(r,{key:0,type:"success",effect:"plain"},{default:n(()=>[g(B(f.value),1)]),_:1})):(d(),h("span",Ke,"未设置"))]),_:1}),t(C,{label:"合并进来的地图",required:""},{default:n(()=>[t(D,{modelValue:m.value,"onUpdate:modelValue":a[0]||(a[0]=e=>m.value=e),multiple:"",filterable:"",loading:v.value,disabled:!f.value,placeholder:"选择 1 张及以上要合并进当前地图的地图",style:{width:"100%"}},{default:n(()=>[(d(!0),h(L,null,J(y.value,e=>(d(),E(N,{key:e,label:e,value:e},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"])]),_:1}),t(C,{label:"另存为",required:""},{default:n(()=>[t(F,{modelValue:x.value,"onUpdate:modelValue":a[1]||(a[1]=e=>x.value=e),disabled:!f.value,placeholder:"目标地图名称(与当前地图同名则覆盖当前地图)",clearable:"",maxlength:"60"},null,8,["modelValue","disabled"])]),_:1}),t(C,null,{default:n(()=>[t(U,{type:"primary",loading:$.value,disabled:!I.value,onClick:q},{default:n(()=>[...a[4]||(a[4]=[g("开始合并",-1)])]),_:1},8,["loading","disabled"]),t(U,{text:"",disabled:!f.value,onClick:u},{default:n(()=>[...a[5]||(a[5]=[g("重置",-1)])]),_:1},8,["disabled"]),_("span",Ye,"已选 "+B(m.value.length)+" 张",1)]),_:1})]),_:1}),f.value?(d(),h("div",He,[a[7]||(a[7]=_("div",{class:"order-title"},"叠加顺序",-1)),_("ol",Xe,[_("li",Ze,[t(r,{size:"small",type:"success",effect:"plain"},{default:n(()=>[...a[6]||(a[6]=[g("底图",-1)])]),_:1}),_("span",Qe,B(f.value),1)]),(d(!0),h(L,null,J(m.value,(e,w)=>(d(),h("li",{key:e,class:"order-item"},[t(r,{size:"small",type:"info",effect:"plain"},{default:n(()=>[g("叠加 "+B(w+1),1)]),_:2},1024),_("span",We,B(e),1)]))),128))])])):W("",!0)])])}}}),tt=ne(et,[["__scopeId","data-v-bd67282a"]]),at={class:"map-mgr-page"},lt={class:"mm-section"},nt={class:"map-mgr-header"},ot={class:"actions"},st={key:0},rt={key:1},it={class:"map-name"},ut=te({__name:"MapManagementView",setup(i){const s=Oe(),b=p("maps");function S(){b.value="maps",y()}const v=p(!1),$=p([]),V=p(""),f=p(""),m=p("");function x({row:a}){return a.isCurrent?"current-row":""}async function y(){v.value=!0;try{const a=await A.list();$.value=a.maps,V.value=a.directory;const l=a.maps.find(r=>r.isCurrent);f.value=l?.name??""}catch(a){M.error(`加载地图列表失败:${a.message}`)}finally{v.value=!1}}function I(){s.push({path:"/admin/map-editor",query:{new:"1"}})}function T(a){s.push({path:"/admin/map-editor",query:{map:a.name}})}async function u(a){if(!a.isCurrent){m.value=a.name;try{const l=await A.sceneTaskStatus();if(l.hasTask){const C=l.busyCars.slice(0,5).map(N=>`${N.name}(#${N.id}):${N.reasons.join("、")}`).join(` `);await j.alert(`场景内仍有 ${l.busyCount} 台车辆存在任务,无法切换当前地图。 -${C}`,"禁止切换地图",{type:"warning",confirmButtonText:"我知道了"});return}await j.confirm(`确认将「${a.name}」设为当前项目默认使用的地图?切换会重新加载场景。`,"切换使用地图",{type:"warning",confirmButtonText:"确认切换",cancelButtonText:"取消"});const r=await A.use(a.name);M.success(`已切换到「${r.name}」:${r.sites} 站点 / ${r.tracks} 路径`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`切换失败:${l.message}`)}finally{m.value=""}}}const R=/^[^\\/:*?"<>|]+$/;async function q(a){try{const r=((await j.prompt("请输入新的地图名称","重命名地图",{inputValue:a.name,inputPattern:R,inputErrorMessage:'名称不能包含 \\ / : * ? " < > | 等字符',confirmButtonText:"确定",cancelButtonText:"取消"})).value??"").trim();if(!r||r===a.name)return;m.value=a.name,await A.rename(a.name,r),M.success(`已重命名为「${r}」`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`重命名失败:${l.message}`)}finally{m.value=""}}async function k(a){try{await j.confirm(`确认删除地图「${a.name}」?该操作会从固定文件夹中移除对应 JSON 文件,不可恢复。`,"删除地图",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"}),await A.delete(a.name),M.success(`已删除「${a.name}」`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`删除失败:${l.message}`)}}return ae(y),(a,l)=>{const r=le,C=ge,N=ve,D=ue,F=me,U=Ue,c=ze,e=ie;return d(),h("div",at,[t(c,{modelValue:b.value,"onUpdate:modelValue":l[0]||(l[0]=w=>b.value=w),type:"border-card",class:"map-mgr-tabs admin-tabs"},{default:n(()=>[t(U,{label:"服务器地图",name:"maps"},{default:n(()=>[_("div",lt,[_("div",nt,[l[3]||(l[3]=_("span",{class:"subtitle"}," 统一维护后台所有地图资源(固定文件夹 / JSON),可新增 / 使用 / 重命名 / 编辑 / 删除。 ",-1)),_("div",ot,[t(r,{loading:v.value,onClick:y},{default:n(()=>[...l[1]||(l[1]=[g("刷新",-1)])]),_:1},8,["loading"]),t(r,{type:"primary",onClick:I},{default:n(()=>[...l[2]||(l[2]=[g("新增地图",-1)])]),_:1})])]),V.value?(d(),E(C,{key:0,class:"dir-tip",type:"info",closable:!1,"show-icon":""},{title:n(()=>[l[5]||(l[5]=g(" 地图文件夹:",-1)),_("code",null,B(V.value),1),f.value?(d(),h("span",st,[l[4]||(l[4]=g(" · 当前使用:",-1)),_("strong",null,B(f.value),1)])):(d(),h("span",rt," · 当前未设置默认使用地图"))]),_:1})):W("",!0),re((d(),E(F,{data:$.value,class:"map-table",border:"","row-class-name":x,"empty-text":"固定文件夹内还没有地图,点击右上角「新增地图」创建。"},{default:n(()=>[t(D,{label:"地图名称","min-width":"220"},{default:n(({row:w})=>[_("span",it,B(w.name),1),w.isCurrent?(d(),E(N,{key:0,size:"small",type:"success",effect:"dark",class:"current-tag"},{default:n(()=>[...l[6]||(l[6]=[g(" 使用中 ",-1)])]),_:1})):W("",!0)]),_:1}),t(D,{label:"修改时间",prop:"modified",width:"190"}),t(D,{label:"操作",width:"360",align:"right"},{default:n(({row:w})=>[t(r,{size:"small",type:"primary",disabled:w.isCurrent,loading:m.value===w.name,onClick:z=>u(w)},{default:n(()=>[g(B(w.isCurrent?"使用中":"使用"),1)]),_:2},1032,["disabled","loading","onClick"]),t(r,{size:"small",onClick:z=>q(w)},{default:n(()=>[...l[7]||(l[7]=[g("重命名",-1)])]),_:1},8,["onClick"]),t(r,{size:"small",onClick:z=>T(w)},{default:n(()=>[...l[8]||(l[8]=[g("编辑",-1)])]),_:1},8,["onClick"]),t(r,{size:"small",type:"danger",plain:"",onClick:z=>k(w)},{default:n(()=>[...l[9]||(l[9]=[g("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[e,v.value]])])]),_:1}),t(U,{label:"多地图连接管理",name:"connections"},{default:n(()=>[t(je)]),_:1}),t(U,{label:"地图合并",name:"merge"},{default:n(()=>[t(tt,{onMerged:S})]),_:1})]),_:1},8,["modelValue"])])}}}),Vt=ne(ut,[["__scopeId","data-v-53fcec5b"]]);export{Vt as default}; +${C}`,"禁止切换地图",{type:"warning",confirmButtonText:"我知道了"});return}await j.confirm(`确认将「${a.name}」设为当前项目默认使用的地图?切换会重新加载场景。`,"切换使用地图",{type:"warning",confirmButtonText:"确认切换",cancelButtonText:"取消"});const r=await A.use(a.name);M.success(`已切换到「${r.name}」:${r.sites} 站点 / ${r.tracks} 路径`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`切换失败:${l.message}`)}finally{m.value=""}}}const R=/^[^\\/:*?"<>|]+$/;async function q(a){try{const r=((await j.prompt("请输入新的地图名称","重命名地图",{inputValue:a.name,inputPattern:R,inputErrorMessage:'名称不能包含 \\ / : * ? " < > | 等字符',confirmButtonText:"确定",cancelButtonText:"取消"})).value??"").trim();if(!r||r===a.name)return;m.value=a.name,await A.rename(a.name,r),M.success(`已重命名为「${r}」`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`重命名失败:${l.message}`)}finally{m.value=""}}async function k(a){try{await j.confirm(`确认删除地图「${a.name}」?该操作会从固定文件夹中移除对应 JSON 文件,不可恢复。`,"删除地图",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消",confirmButtonClass:"el-button--danger"}),await A.delete(a.name),M.success(`已删除「${a.name}」`),await y()}catch(l){if(l==="cancel"||l==="close")return;M.error(`删除失败:${l.message}`)}}return ae(y),(a,l)=>{const r=le,C=ge,N=ve,D=ue,F=me,U=Ue,c=ze,e=ie;return d(),h("div",at,[t(c,{modelValue:b.value,"onUpdate:modelValue":l[0]||(l[0]=w=>b.value=w),type:"border-card",class:"map-mgr-tabs admin-tabs"},{default:n(()=>[t(U,{label:"服务器地图",name:"maps"},{default:n(()=>[_("div",lt,[_("div",nt,[l[3]||(l[3]=_("span",{class:"subtitle"}," 统一维护后台所有地图资源(固定文件夹 / JSON),可新增 / 使用 / 重命名 / 编辑 / 删除。 ",-1)),_("div",ot,[t(r,{loading:v.value,onClick:y},{default:n(()=>[...l[1]||(l[1]=[g("刷新",-1)])]),_:1},8,["loading"]),t(r,{type:"primary",onClick:I},{default:n(()=>[...l[2]||(l[2]=[g("新增地图",-1)])]),_:1})])]),V.value?(d(),E(C,{key:0,class:"dir-tip",type:"info",closable:!1,"show-icon":""},{title:n(()=>[l[5]||(l[5]=g(" 地图文件夹:",-1)),_("code",null,B(V.value),1),f.value?(d(),h("span",st,[l[4]||(l[4]=g(" · 当前使用:",-1)),_("strong",null,B(f.value),1)])):(d(),h("span",rt," · 当前未设置默认使用地图"))]),_:1})):W("",!0),re((d(),E(F,{data:$.value,class:"map-table",border:"","row-class-name":x,"empty-text":"固定文件夹内还没有地图,点击右上角「新增地图」创建。"},{default:n(()=>[t(D,{label:"地图名称","min-width":"220"},{default:n(({row:w})=>[_("span",it,B(w.name),1),w.isCurrent?(d(),E(N,{key:0,size:"small",type:"success",effect:"dark",class:"current-tag"},{default:n(()=>[...l[6]||(l[6]=[g(" 使用中 ",-1)])]),_:1})):W("",!0)]),_:1}),t(D,{label:"修改时间",prop:"modified",width:"190"}),t(D,{label:"操作",width:"360",align:"right"},{default:n(({row:w})=>[t(r,{size:"small",type:"primary",disabled:w.isCurrent,loading:m.value===w.name,onClick:z=>u(w)},{default:n(()=>[g(B(w.isCurrent?"使用中":"使用"),1)]),_:2},1032,["disabled","loading","onClick"]),t(r,{size:"small",onClick:z=>q(w)},{default:n(()=>[...l[7]||(l[7]=[g("重命名",-1)])]),_:1},8,["onClick"]),t(r,{size:"small",onClick:z=>T(w)},{default:n(()=>[...l[8]||(l[8]=[g("编辑",-1)])]),_:1},8,["onClick"]),t(r,{size:"small",type:"danger",plain:"",onClick:z=>k(w)},{default:n(()=>[...l[9]||(l[9]=[g("删除",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[e,v.value]])])]),_:1}),t(U,{label:"多地图连接管理",name:"connections"},{default:n(()=>[t(je)]),_:1}),t(U,{label:"地图合并",name:"merge"},{default:n(()=>[t(tt,{onMerged:S})]),_:1})]),_:1},8,["modelValue"])])}}}),Vt=ne(ut,[["__scopeId","data-v-9727d426"]]);export{Vt as default}; diff --git a/MiGu.Server/wwwroot/assets/MapManagementView-AlLVMANn.css b/MiGu.Server/wwwroot/assets/MapManagementView-DJMxI8po.css similarity index 93% rename from MiGu.Server/wwwroot/assets/MapManagementView-AlLVMANn.css rename to MiGu.Server/wwwroot/assets/MapManagementView-DJMxI8po.css index 4773b5b..fe235ec 100644 --- a/MiGu.Server/wwwroot/assets/MapManagementView-AlLVMANn.css +++ b/MiGu.Server/wwwroot/assets/MapManagementView-DJMxI8po.css @@ -1 +1 @@ -.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-button-width-large:40px;--el-pagination-button-height-large:40px;--el-pagination-item-gap:16px;white-space:nowrap;color:var(--el-pagination-text-color);font-size:var(--el-pagination-font-size);align-items:center;font-weight:400;display:flex}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield}.el-pagination .el-select{width:128px}.el-pagination .btn-prev,.el-pagination .btn-next{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pagination .btn-prev *,.el-pagination .btn-next *{pointer-events:none}.el-pagination .btn-prev:focus,.el-pagination .btn-next:focus{outline:none}.el-pagination .btn-prev:hover,.el-pagination .btn-next:hover{color:var(--el-pagination-hover-color)}.el-pagination .btn-prev.is-active,.el-pagination .btn-next.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination .btn-prev.is-active.is-disabled,.el-pagination .btn-next.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pagination .btn-prev:disabled,.el-pagination .btn-prev.is-disabled,.el-pagination .btn-next:disabled,.el-pagination .btn-next.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-prev .el-icon,.el-pagination .btn-next .el-icon{width:inherit;font-size:12px;font-weight:700;display:block}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);font-weight:400}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);align-items:center;font-weight:400;display:flex}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{text-align:center;box-sizing:border-box}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{flex:1;justify-content:flex-end;align-items:center;display:flex}.el-pagination.is-background .btn-prev,.el-pagination.is-background .btn-next,.el-pagination.is-background .el-pager li{background-color:var(--el-pagination-button-bg-color);margin:0 4px}.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .el-pager li:disabled,.el-pagination.is-background .el-pager li.is-disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active{color:var(--el-text-color-secondary);background-color:var(--el-fill-color-dark)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-prev,.el-pagination--small .btn-next,.el-pagination--small .el-pager li{height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);font-size:var(--el-pagination-font-size-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small span:not([class*=suffix]),.el-pagination--small button{font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select{width:100px}.el-pagination--large .btn-prev,.el-pagination--large .btn-next,.el-pagination--large .el-pager li{height:var(--el-pagination-button-height-large);line-height:var(--el-pagination-button-height-large);min-width:var(--el-pagination-button-width-large)}.el-pagination--large .el-select .el-input{width:160px}.el-pager{-webkit-user-select:none;user-select:none;align-items:center;margin:0;padding:0;font-size:0;list-style:none;display:flex}.el-pager li{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:none}.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pager li:disabled,.el-pager li.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.mc-panel[data-v-bad72017]{height:100%;display:flex;flex-direction:column;gap:12px;min-height:0}.mc-toolbar[data-v-bad72017]{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-shrink:0}.mc-search[data-v-bad72017]{width:300px;max-width:60%}.mc-table[data-v-bad72017]{flex:1;min-height:0}.mc-cost[data-v-bad72017]{font-variant-numeric:tabular-nums}.mc-pager[data-v-bad72017]{flex-shrink:0;display:flex;justify-content:center;padding-top:2px}.mm-merge[data-v-bd67282a]{height:100%;display:flex;flex-direction:column;gap:14px;min-height:0;overflow:auto}.merge-tip[data-v-bd67282a]{flex-shrink:0}.merge-body[data-v-bd67282a]{display:flex;flex-wrap:wrap;gap:24px;align-items:flex-start}.merge-form[data-v-bd67282a]{flex:1 1 440px;max-width:580px}.merge-hint[data-v-bd67282a]{margin-left:12px;font-size:12.5px;color:var(--mg-text-muted)}.merge-order[data-v-bd67282a]{flex:0 1 280px;min-width:220px;padding:12px 16px;border-radius:var(--mg-radius);background:rgba(var(--mg-accent-rgb),.08);border:1px solid var(--mg-veil-border)}.order-title[data-v-bd67282a]{font-size:13px;font-weight:600;color:var(--mg-text-light);margin-bottom:10px}.order-list[data-v-bd67282a]{margin:0;padding-left:0;list-style:none;display:flex;flex-direction:column;gap:8px}.order-item[data-v-bd67282a]{display:flex;align-items:center;gap:8px}.order-name[data-v-bd67282a]{color:var(--mg-text-light);font-size:13px;word-break:break-all}.map-mgr-page[data-v-53fcec5b]{flex:1;min-height:0;display:flex;flex-direction:column;box-sizing:border-box}.map-mgr-tabs[data-v-53fcec5b]{flex:1;min-height:0;display:flex;flex-direction:column}.mm-section[data-v-53fcec5b]{height:100%;display:flex;flex-direction:column;gap:14px;min-height:0}.map-mgr-header[data-v-53fcec5b]{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0}.subtitle[data-v-53fcec5b]{font-size:12.5px;line-height:1.5;color:var(--mg-text-muted)}.dir-tip[data-v-53fcec5b]{flex-shrink:0}.dir-tip code[data-v-53fcec5b]{font-family:var(--mg-font-mono, monospace);padding:1px 6px;border-radius:4px;background:var(--mg-veil-2);color:var(--mg-text-light)}.map-table[data-v-53fcec5b]{flex:1;min-height:0}.map-name[data-v-53fcec5b]{font-weight:500;color:var(--mg-text-light)}.current-tag[data-v-53fcec5b]{margin-left:8px}.map-table[data-v-53fcec5b] .current-row>td.el-table__cell{background:rgba(var(--mg-status-success-rgb),.16)!important}.map-table[data-v-53fcec5b] .current-row:hover>td.el-table__cell{background:rgba(var(--mg-status-success-rgb),.24)!important} +.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:2px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-font-size-small:12px;--el-pagination-button-width-small:24px;--el-pagination-button-height-small:24px;--el-pagination-button-width-large:40px;--el-pagination-button-height-large:40px;--el-pagination-item-gap:16px;white-space:nowrap;color:var(--el-pagination-text-color);font-size:var(--el-pagination-font-size);align-items:center;font-weight:400;display:flex}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield}.el-pagination .el-select{width:128px}.el-pagination .btn-prev,.el-pagination .btn-next{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pagination .btn-prev *,.el-pagination .btn-next *{pointer-events:none}.el-pagination .btn-prev:focus,.el-pagination .btn-next:focus{outline:none}.el-pagination .btn-prev:hover,.el-pagination .btn-next:hover{color:var(--el-pagination-hover-color)}.el-pagination .btn-prev.is-active,.el-pagination .btn-next.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pagination .btn-prev.is-active.is-disabled,.el-pagination .btn-next.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pagination .btn-prev:disabled,.el-pagination .btn-prev.is-disabled,.el-pagination .btn-next:disabled,.el-pagination .btn-next.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-next:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.el-pagination .btn-prev .el-icon,.el-pagination .btn-next .el-icon{width:inherit;font-size:12px;font-weight:700;display:block}.el-pagination>.is-first{margin-left:0!important}.el-pagination>.is-last{margin-right:0!important}.el-pagination .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination__sizes,.el-pagination__total{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);font-weight:400}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{margin-left:var(--el-pagination-item-gap);color:var(--el-text-color-regular);align-items:center;font-weight:400;display:flex}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__goto{margin-right:8px}.el-pagination__editor{text-align:center;box-sizing:border-box}.el-pagination__editor.el-input{width:56px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination__classifier{margin-left:8px}.el-pagination__rightwrapper{flex:1;justify-content:flex-end;align-items:center;display:flex}.el-pagination.is-background .btn-prev,.el-pagination.is-background .btn-next,.el-pagination.is-background .el-pager li{background-color:var(--el-pagination-button-bg-color);margin:0 4px}.el-pagination.is-background .btn-prev.is-active,.el-pagination.is-background .btn-next.is-active,.el-pagination.is-background .el-pager li.is-active{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .el-pager li:disabled,.el-pagination.is-background .el-pager li.is-disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-prev:disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .btn-next:disabled.is-active,.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .el-pager li:disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active{color:var(--el-text-color-secondary);background-color:var(--el-fill-color-dark)}.el-pagination.is-background .btn-prev{margin-left:var(--el-pagination-item-gap)}.el-pagination--small .btn-prev,.el-pagination--small .btn-next,.el-pagination--small .el-pager li{height:var(--el-pagination-button-height-small);line-height:var(--el-pagination-button-height-small);font-size:var(--el-pagination-font-size-small);min-width:var(--el-pagination-button-width-small)}.el-pagination--small span:not([class*=suffix]),.el-pagination--small button{font-size:var(--el-pagination-font-size-small)}.el-pagination--small .el-select{width:100px}.el-pagination--large .btn-prev,.el-pagination--large .btn-next,.el-pagination--large .el-pager li{height:var(--el-pagination-button-height-large);line-height:var(--el-pagination-button-height-large);min-width:var(--el-pagination-button-width-large)}.el-pagination--large .el-select .el-input{width:160px}.el-pager{-webkit-user-select:none;user-select:none;align-items:center;margin:0;padding:0;font-size:0;list-style:none;display:flex}.el-pager li{font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);color:var(--el-pagination-button-color);background:var(--el-pagination-bg-color);border-radius:var(--el-pagination-border-radius);cursor:pointer;text-align:center;box-sizing:border-box;border:none;justify-content:center;align-items:center;padding:0 4px;display:flex}.el-pager li *{pointer-events:none}.el-pager li:focus{outline:none}.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{color:var(--el-pagination-hover-color);cursor:default;font-weight:700}.el-pager li.is-active.is-disabled{color:var(--el-text-color-secondary);font-weight:700}.el-pager li:disabled,.el-pager li.is-disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color);outline-offset:-1px}.mc-panel[data-v-bad72017]{height:100%;display:flex;flex-direction:column;gap:12px;min-height:0}.mc-toolbar[data-v-bad72017]{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-shrink:0}.mc-search[data-v-bad72017]{width:300px;max-width:60%}.mc-table[data-v-bad72017]{flex:1;min-height:0}.mc-cost[data-v-bad72017]{font-variant-numeric:tabular-nums}.mc-pager[data-v-bad72017]{flex-shrink:0;display:flex;justify-content:center;padding-top:2px}.mm-merge[data-v-bd67282a]{height:100%;display:flex;flex-direction:column;gap:14px;min-height:0;overflow:auto}.merge-tip[data-v-bd67282a]{flex-shrink:0}.merge-body[data-v-bd67282a]{display:flex;flex-wrap:wrap;gap:24px;align-items:flex-start}.merge-form[data-v-bd67282a]{flex:1 1 440px;max-width:580px}.merge-hint[data-v-bd67282a]{margin-left:12px;font-size:12.5px;color:var(--mg-text-muted)}.merge-order[data-v-bd67282a]{flex:0 1 280px;min-width:220px;padding:12px 16px;border-radius:var(--mg-radius);background:rgba(var(--mg-accent-rgb),.08);border:1px solid var(--mg-veil-border)}.order-title[data-v-bd67282a]{font-size:13px;font-weight:600;color:var(--mg-text-light);margin-bottom:10px}.order-list[data-v-bd67282a]{margin:0;padding-left:0;list-style:none;display:flex;flex-direction:column;gap:8px}.order-item[data-v-bd67282a]{display:flex;align-items:center;gap:8px}.order-name[data-v-bd67282a]{color:var(--mg-text-light);font-size:13px;word-break:break-all}.map-mgr-page[data-v-9727d426]{flex:1;min-height:0;display:flex;flex-direction:column;box-sizing:border-box}.map-mgr-tabs[data-v-9727d426]{flex:1;min-height:0;display:flex;flex-direction:column}.mm-section[data-v-9727d426]{height:100%;display:flex;flex-direction:column;gap:14px;min-height:0}.map-mgr-header[data-v-9727d426]{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0}.subtitle[data-v-9727d426]{font-size:12.5px;line-height:1.5;color:var(--mg-text-muted)}.dir-tip[data-v-9727d426]{flex-shrink:0}.dir-tip code[data-v-9727d426]{font-family:var(--mg-font-mono, monospace);padding:1px 6px;border-radius:4px;background:var(--mg-veil-2);color:var(--mg-text-light)}.map-table[data-v-9727d426]{flex:1;min-height:0}.map-name[data-v-9727d426]{font-weight:500;color:var(--mg-text-light)}.current-tag[data-v-9727d426]{margin-left:8px}.map-table[data-v-9727d426] .current-row>td.el-table__cell{background:rgba(var(--mg-status-success-rgb),.16)!important}.map-table[data-v-9727d426] .current-row:hover>td.el-table__cell{background:rgba(var(--mg-status-success-rgb),.24)!important} diff --git a/MiGu.Server/wwwroot/assets/MapMonitorConfigView-16D4TNib.js b/MiGu.Server/wwwroot/assets/MapMonitorConfigView-CYlZhPX2.js similarity index 96% rename from MiGu.Server/wwwroot/assets/MapMonitorConfigView-16D4TNib.js rename to MiGu.Server/wwwroot/assets/MapMonitorConfigView-CYlZhPX2.js index bc3213e..5a1f588 100644 --- a/MiGu.Server/wwwroot/assets/MapMonitorConfigView-16D4TNib.js +++ b/MiGu.Server/wwwroot/assets/MapMonitorConfigView-CYlZhPX2.js @@ -1 +1 @@ -import{aI as K,b9 as c,aE as f,aB as r,bq as S,aH as d,bJ as s,aG as i,ad as L,aC as g,s as q,r as P,aD as B,v as H,ai as G,bj as O,u as X,E as Q,ax as $,ak as F,bh as k,b7 as R,X as V,bg as J,t as W,ac as Y,a9 as Z,bK as ee,bA as te,bt as j,bi as ae,as as le}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as se}from"./PermissionGuard-DUg2FNrM.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as D,r as I,e as ne}from"./reflection-C0K7EJ_N.js";/* empty css */const oe={class:"mmcg"},ie={class:"mmcg-head"},de={class:"mmcg-title"},ce={key:0,class:"mmcg-empty muted"},re={key:2,class:"mmcg-orphans"},ue={class:"orphan-list"},me=K({__name:"MapMonitorConfigGroup",props:{title:{},available:{},selected:{},emptyTip:{}},emits:["update:selected"],setup(p,{emit:M}){const n=p,m=M,_=$(()=>n.available.length?n.selected.length?`${n.selected.length} / ${n.available.length}`:`白名单空 = 显示全部 (${n.available.length})`:"空"),a=$(()=>n.selected.filter(u=>!n.available.includes(u))),b=$(()=>n.available.length>n.selected.length);function y(u){const e=[...u.filter(l=>typeof l=="string"),...a.value];m("update:selected",e)}function E(){m("update:selected",[...n.available,...a.value])}function h(){m("update:selected",[...a.value])}function x(u){m("update:selected",n.selected.filter(t=>t!==u))}function z(){m("update:selected",n.selected.filter(u=>n.available.includes(u)))}return(u,t)=>{const e=L,l=P,w=q,N=X,T=H,U=Q;return c(),f("section",oe,[r("header",ie,[r("span",de,S(p.title),1),d(e,{size:"small",effect:"plain",type:"info"},{default:s(()=>[i(S(_.value),1)]),_:1}),t[2]||(t[2]=r("div",{class:"spacer"},null,-1)),p.available.length?(c(),g(w,{key:0},{default:s(()=>[d(l,{size:"small",disabled:!b.value,onClick:E},{default:s(()=>[...t[0]||(t[0]=[i("全选",-1)])]),_:1},8,["disabled"]),d(l,{size:"small",disabled:!p.selected.length,onClick:h},{default:s(()=>[...t[1]||(t[1]=[i("清空",-1)])]),_:1},8,["disabled"])]),_:1})):B("",!0)]),p.available.length?(c(),g(T,{key:1,"model-value":p.selected,class:"mmcg-grid","onUpdate:modelValue":y},{default:s(()=>[(c(!0),f(G,null,O(p.available,v=>(c(),g(N,{key:v,value:v,label:v,class:"mmcg-cb"},null,8,["value","label"]))),128))]),_:1},8,["model-value"])):(c(),f("p",ce,S(p.emptyTip),1)),a.value.length?(c(),f("div",re,[d(U,{type:"warning",closable:!1,"show-icon":"",title:`检测到 ${a.value.length} 个残留键(后端已经不再暴露,但仍在白名单中)`},{default:s(()=>[r("div",ue,[(c(!0),f(G,null,O(a.value,v=>(c(),g(e,{key:v,type:"warning",size:"small",closable:"",onClose:o=>x(v)},{default:s(()=>[i(S(v),1)]),_:2},1032,["onClose"]))),128)),d(l,{link:"",type:"warning",size:"small",onClick:z},{default:s(()=>[...t[3]||(t[3]=[i("一键清理全部残留",-1)])]),_:1})])]),_:1},8,["title"])])):B("",!0)])}}}),A=F(me,[["__scopeId","data-v-242bdaa0"]]),pe={class:"mmc-header"},ve={class:"mmc-tab-body"},fe=K({__name:"MapMonitorConfigView",setup(p){const M=[{value:"car",label:"车辆 (Car)"},{value:"site",label:"站点 (Site)"},{value:"track",label:"路径 (Track)"}],n=k("car"),m=k(!1),_=k(!1),a=J(D()),b=J(ne()),y=k(JSON.stringify(D())),E=$(()=>y.value!==JSON.stringify(a));function h(t,e){for(const l of M)t[l.value].fields=[...e[l.value]?.fields??[]],t[l.value].status=[...e[l.value]?.status??[]],t[l.value].methods=[...e[l.value]?.methods??[]]}async function x(t=!1){m.value=!0;try{const e=await I.getMonitorConfig();h(a,e.config),h(b,e.available),y.value=JSON.stringify(a),t&&V.success("已重载")}catch(e){V.error(`加载失败:${e instanceof Error?e.message:String(e)}`)}finally{m.value=!1}}async function z(){_.value=!0;try{const t=await I.saveMonitorConfig({car:{...a.car},site:{...a.site},track:{...a.track}});h(a,t),y.value=JSON.stringify(a),V.success("已保存(已写入 simple.json)")}catch(t){V.error(`保存失败:${t instanceof Error?t.message:String(t)}`)}finally{_.value=!1}}function u(t,e,l){a[t][e]=[...l]}return R(()=>x()),(t,e)=>{const l=L,w=P,N=Z,T=Y,U=W,v=te;return c(),g(se,{"widget-id":"ConfigCenter"},{default:s(()=>[d(U,{shadow:"never",class:"mmc-card"},{header:s(()=>[r("div",pe,[e[6]||(e[6]=r("span",{class:"mmc-title"},"地图监控配置",-1)),d(l,{size:"small",effect:"plain"},{default:s(()=>[...e[2]||(e[2]=[i("section=map-monitor",-1)])]),_:1}),E.value?(c(),g(l,{key:0,size:"small",type:"warning",effect:"dark"},{default:s(()=>[...e[3]||(e[3]=[i("未保存",-1)])]),_:1})):B("",!0),e[7]||(e[7]=r("div",{class:"spacer"},null,-1)),d(w,{size:"small",icon:j(ae),loading:m.value,onClick:e[0]||(e[0]=o=>x(!0))},{default:s(()=>[...e[4]||(e[4]=[i("重载",-1)])]),_:1},8,["icon","loading"]),d(w,{size:"small",type:"primary",icon:j(le),loading:_.value,disabled:!E.value,onClick:z},{default:s(()=>[...e[5]||(e[5]=[i(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])])]),default:s(()=>[e[8]||(e[8]=r("p",{class:"mmc-desc"},[i(" 勾选「地图监控」右侧选中信息面板要展示的内容白名单(按对象类型 - 车辆 / 站点 / 路径 分组)。 三组分别控制 "),r("b",null,"属性"),i("、"),r("b",null,"状态"),i("、"),r("b",null,"动作"),i(" Tab 里可见的字段 / 状态项 / 可执行方法。 每组留空 = 显示全部;勾选任何一项即进入白名单模式(仅显示已勾选)。保存后直接写入 SimpleLite 的 "),r("code",null,"simple.json"),i(" ("),r("code",null,"Configuration.conf.monitorVisibility"),i(")。 ")],-1)),d(T,{modelValue:n.value,"onUpdate:modelValue":e[1]||(e[1]=o=>n.value=o),class:"mmc-tabs"},{default:s(()=>[(c(),f(G,null,O(M,o=>d(N,{key:o.value,label:o.label,name:o.value},{default:s(()=>[ee((c(),f("div",ve,[d(A,{title:"属性字段(Properties)",available:b[o.value].fields,selected:a[o.value].fields,"empty-tip":"该类型暂未发现任何 [FieldMember]。在 SimpleLite 端添加字段后点重载会刷新。","onUpdate:selected":C=>u(o.value,"fields",C)},null,8,["available","selected","onUpdate:selected"]),d(A,{title:"状态项(Status)",available:b[o.value].status,selected:a[o.value].status,"empty-tip":"该类型暂未发现任何 status 字段(来自 obj.status 反射)。","onUpdate:selected":C=>u(o.value,"status",C)},null,8,["available","selected","onUpdate:selected"]),d(A,{title:"可执行动作(Methods)",available:b[o.value].methods,selected:a[o.value].methods,"empty-tip":"该类型暂未发现任何 [MethodMember] 方法。","onUpdate:selected":C=>u(o.value,"methods",C)},null,8,["available","selected","onUpdate:selected"])])),[[v,m.value]])]),_:2},1032,["label","name"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1})}}}),ze=F(fe,[["__scopeId","data-v-4d3be43b"]]);export{ze as default}; +import{aI as K,b9 as c,aE as f,aB as r,bq as S,aH as d,bJ as s,aG as i,ad as L,aC as g,s as q,r as P,aD as B,v as H,ai as G,bj as O,u as X,E as Q,ax as $,ak as F,bh as k,b7 as R,X as V,bg as J,t as W,ac as Y,a9 as Z,bK as ee,bA as te,bt as j,bi as ae,as as le}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as se}from"./PermissionGuard-BlMEkqrL.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as D,r as I,e as ne}from"./reflection-B_glb6eT.js";/* empty css */const oe={class:"mmcg"},ie={class:"mmcg-head"},de={class:"mmcg-title"},ce={key:0,class:"mmcg-empty muted"},re={key:2,class:"mmcg-orphans"},ue={class:"orphan-list"},me=K({__name:"MapMonitorConfigGroup",props:{title:{},available:{},selected:{},emptyTip:{}},emits:["update:selected"],setup(p,{emit:M}){const n=p,m=M,_=$(()=>n.available.length?n.selected.length?`${n.selected.length} / ${n.available.length}`:`白名单空 = 显示全部 (${n.available.length})`:"空"),a=$(()=>n.selected.filter(u=>!n.available.includes(u))),b=$(()=>n.available.length>n.selected.length);function y(u){const e=[...u.filter(l=>typeof l=="string"),...a.value];m("update:selected",e)}function E(){m("update:selected",[...n.available,...a.value])}function h(){m("update:selected",[...a.value])}function x(u){m("update:selected",n.selected.filter(t=>t!==u))}function z(){m("update:selected",n.selected.filter(u=>n.available.includes(u)))}return(u,t)=>{const e=L,l=P,w=q,N=X,T=H,U=Q;return c(),f("section",oe,[r("header",ie,[r("span",de,S(p.title),1),d(e,{size:"small",effect:"plain",type:"info"},{default:s(()=>[i(S(_.value),1)]),_:1}),t[2]||(t[2]=r("div",{class:"spacer"},null,-1)),p.available.length?(c(),g(w,{key:0},{default:s(()=>[d(l,{size:"small",disabled:!b.value,onClick:E},{default:s(()=>[...t[0]||(t[0]=[i("全选",-1)])]),_:1},8,["disabled"]),d(l,{size:"small",disabled:!p.selected.length,onClick:h},{default:s(()=>[...t[1]||(t[1]=[i("清空",-1)])]),_:1},8,["disabled"])]),_:1})):B("",!0)]),p.available.length?(c(),g(T,{key:1,"model-value":p.selected,class:"mmcg-grid","onUpdate:modelValue":y},{default:s(()=>[(c(!0),f(G,null,O(p.available,v=>(c(),g(N,{key:v,value:v,label:v,class:"mmcg-cb"},null,8,["value","label"]))),128))]),_:1},8,["model-value"])):(c(),f("p",ce,S(p.emptyTip),1)),a.value.length?(c(),f("div",re,[d(U,{type:"warning",closable:!1,"show-icon":"",title:`检测到 ${a.value.length} 个残留键(后端已经不再暴露,但仍在白名单中)`},{default:s(()=>[r("div",ue,[(c(!0),f(G,null,O(a.value,v=>(c(),g(e,{key:v,type:"warning",size:"small",closable:"",onClose:o=>x(v)},{default:s(()=>[i(S(v),1)]),_:2},1032,["onClose"]))),128)),d(l,{link:"",type:"warning",size:"small",onClick:z},{default:s(()=>[...t[3]||(t[3]=[i("一键清理全部残留",-1)])]),_:1})])]),_:1},8,["title"])])):B("",!0)])}}}),A=F(me,[["__scopeId","data-v-242bdaa0"]]),pe={class:"mmc-header"},ve={class:"mmc-tab-body"},fe=K({__name:"MapMonitorConfigView",setup(p){const M=[{value:"car",label:"车辆 (Car)"},{value:"site",label:"站点 (Site)"},{value:"track",label:"路径 (Track)"}],n=k("car"),m=k(!1),_=k(!1),a=J(D()),b=J(ne()),y=k(JSON.stringify(D())),E=$(()=>y.value!==JSON.stringify(a));function h(t,e){for(const l of M)t[l.value].fields=[...e[l.value]?.fields??[]],t[l.value].status=[...e[l.value]?.status??[]],t[l.value].methods=[...e[l.value]?.methods??[]]}async function x(t=!1){m.value=!0;try{const e=await I.getMonitorConfig();h(a,e.config),h(b,e.available),y.value=JSON.stringify(a),t&&V.success("已重载")}catch(e){V.error(`加载失败:${e instanceof Error?e.message:String(e)}`)}finally{m.value=!1}}async function z(){_.value=!0;try{const t=await I.saveMonitorConfig({car:{...a.car},site:{...a.site},track:{...a.track}});h(a,t),y.value=JSON.stringify(a),V.success("已保存(已写入 simple.json)")}catch(t){V.error(`保存失败:${t instanceof Error?t.message:String(t)}`)}finally{_.value=!1}}function u(t,e,l){a[t][e]=[...l]}return R(()=>x()),(t,e)=>{const l=L,w=P,N=Z,T=Y,U=W,v=te;return c(),g(se,{"widget-id":"ConfigCenter"},{default:s(()=>[d(U,{shadow:"never",class:"mmc-card"},{header:s(()=>[r("div",pe,[e[6]||(e[6]=r("span",{class:"mmc-title"},"地图监控配置",-1)),d(l,{size:"small",effect:"plain"},{default:s(()=>[...e[2]||(e[2]=[i("section=map-monitor",-1)])]),_:1}),E.value?(c(),g(l,{key:0,size:"small",type:"warning",effect:"dark"},{default:s(()=>[...e[3]||(e[3]=[i("未保存",-1)])]),_:1})):B("",!0),e[7]||(e[7]=r("div",{class:"spacer"},null,-1)),d(w,{size:"small",icon:j(ae),loading:m.value,onClick:e[0]||(e[0]=o=>x(!0))},{default:s(()=>[...e[4]||(e[4]=[i("重载",-1)])]),_:1},8,["icon","loading"]),d(w,{size:"small",type:"primary",icon:j(le),loading:_.value,disabled:!E.value,onClick:z},{default:s(()=>[...e[5]||(e[5]=[i(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])])]),default:s(()=>[e[8]||(e[8]=r("p",{class:"mmc-desc"},[i(" 勾选「地图监控」右侧选中信息面板要展示的内容白名单(按对象类型 - 车辆 / 站点 / 路径 分组)。 三组分别控制 "),r("b",null,"属性"),i("、"),r("b",null,"状态"),i("、"),r("b",null,"动作"),i(" Tab 里可见的字段 / 状态项 / 可执行方法。 每组留空 = 显示全部;勾选任何一项即进入白名单模式(仅显示已勾选)。保存后直接写入 SimpleLite 的 "),r("code",null,"simple.json"),i(" ("),r("code",null,"Configuration.conf.monitorVisibility"),i(")。 ")],-1)),d(T,{modelValue:n.value,"onUpdate:modelValue":e[1]||(e[1]=o=>n.value=o),class:"mmc-tabs"},{default:s(()=>[(c(),f(G,null,O(M,o=>d(N,{key:o.value,label:o.label,name:o.value},{default:s(()=>[ee((c(),f("div",ve,[d(A,{title:"属性字段(Properties)",available:b[o.value].fields,selected:a[o.value].fields,"empty-tip":"该类型暂未发现任何 [FieldMember]。在 SimpleLite 端添加字段后点重载会刷新。","onUpdate:selected":C=>u(o.value,"fields",C)},null,8,["available","selected","onUpdate:selected"]),d(A,{title:"状态项(Status)",available:b[o.value].status,selected:a[o.value].status,"empty-tip":"该类型暂未发现任何 status 字段(来自 obj.status 反射)。","onUpdate:selected":C=>u(o.value,"status",C)},null,8,["available","selected","onUpdate:selected"]),d(A,{title:"可执行动作(Methods)",available:b[o.value].methods,selected:a[o.value].methods,"empty-tip":"该类型暂未发现任何 [MethodMember] 方法。","onUpdate:selected":C=>u(o.value,"methods",C)},null,8,["available","selected","onUpdate:selected"])])),[[v,m.value]])]),_:2},1032,["label","name"])),64))]),_:1},8,["modelValue"])]),_:1})]),_:1})}}}),ze=F(fe,[["__scopeId","data-v-4d3be43b"]]);export{ze as default}; diff --git a/MiGu.Server/wwwroot/assets/MapMonitorView-DEfDktpd.js b/MiGu.Server/wwwroot/assets/MapMonitorView-Bc6X9WQO.js similarity index 99% rename from MiGu.Server/wwwroot/assets/MapMonitorView-DEfDktpd.js rename to MiGu.Server/wwwroot/assets/MapMonitorView-Bc6X9WQO.js index 4146b86..1b6a665 100644 --- a/MiGu.Server/wwwroot/assets/MapMonitorView-DEfDktpd.js +++ b/MiGu.Server/wwwroot/assets/MapMonitorView-Bc6X9WQO.js @@ -1,2 +1,2 @@ -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-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{W as Rt}from"./Workspace3D-B2WrMPji.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-C0K7EJ_N.js";import{m as zt}from"./mapEdit-BiAzHHno.js";import{O as Bt}from"./ops-BCeFEEjY.js";import{e as Ut}from"./ops-DA63t9Ed.js";import{f as rt,i as Wt}from"./monitorConfigCache-BtW5W6GI.js";/* empty css *//* empty css *//* empty css */import{l as jt,a as Kt}from"./projection-nWPnmoX1.js";import{u as Gt}from"./useProjectionStream-C94Y5UgX.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)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}]? +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)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}; diff --git a/MiGu.Server/wwwroot/assets/MissionEditorView-Cq1tHD-Z.js b/MiGu.Server/wwwroot/assets/MissionEditorView-BNUdM9Ij.js similarity index 81% rename from MiGu.Server/wwwroot/assets/MissionEditorView-Cq1tHD-Z.js rename to MiGu.Server/wwwroot/assets/MissionEditorView-BNUdM9Ij.js index 10ba15b..eed830e 100644 --- a/MiGu.Server/wwwroot/assets/MissionEditorView-Cq1tHD-Z.js +++ b/MiGu.Server/wwwroot/assets/MissionEditorView-BNUdM9Ij.js @@ -1 +1 @@ -import{R as o}from"./ReflectionManagerPanel-CKQWtKhJ.js";import{aI as i,aE as t,aH as r,b9 as p,ak as e}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-C0K7EJ_N.js";import"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const m={class:"mission-page"},s=i({__name:"MissionEditorView",setup(a){return(n,c)=>(p(),t("div",m,[r(o,{kind:"process","kind-label":"任务",title:"任务编排(Mission / 进程,含插件 MissionType 实例化)","empty-text":"当前没有任务;点击右上角「新建任务」从已加载的 MissionType 中选一个实例化。"})]))}}),z=e(s,[["__scopeId","data-v-40f885f1"]]);export{z as default}; +import{R as o}from"./ReflectionManagerPanel-BZQZIz4T.js";import{aI as i,aE as t,aH as r,b9 as p,ak as e}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-B_glb6eT.js";import"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const m={class:"mission-page"},s=i({__name:"MissionEditorView",setup(a){return(n,c)=>(p(),t("div",m,[r(o,{kind:"process","kind-label":"任务",title:"任务编排(Mission / 进程,含插件 MissionType 实例化)","empty-text":"当前没有任务;点击右上角「新建任务」从已加载的 MissionType 中选一个实例化。"})]))}}),z=e(s,[["__scopeId","data-v-40f885f1"]]);export{z as default}; diff --git a/MiGu.Server/wwwroot/assets/MonitorDashboardView-9UzVNNbL.js b/MiGu.Server/wwwroot/assets/MonitorDashboardView-Dl0hq3jL.js similarity index 94% rename from MiGu.Server/wwwroot/assets/MonitorDashboardView-9UzVNNbL.js rename to MiGu.Server/wwwroot/assets/MonitorDashboardView-Dl0hq3jL.js index d4d9d31..5c4c31e 100644 --- a/MiGu.Server/wwwroot/assets/MonitorDashboardView-9UzVNNbL.js +++ b/MiGu.Server/wwwroot/assets/MonitorDashboardView-Dl0hq3jL.js @@ -1 +1 @@ -import{aI as k,b7 as M,aE as T,aH as t,bJ as e,bh as p,a2 as V,b9 as z,w as B,a6 as D,aB as d,bq as c,t as I,aa as N,ab as S,ad as P,aG as v,$ as q,ax as _,ak as A}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{l as G,a as H}from"./projection-nWPnmoX1.js";import{l as J}from"./ops-DA63t9Ed.js";import"./reflection-C0K7EJ_N.js";const R={class:"muted"},$=k({__name:"MonitorDashboardView",setup(j){const n=p([]),m=p([]),i=p([]),b=_(()=>n.value.filter(l=>l.state!=="offline").length),x=_(()=>m.value.filter(l=>l.status==="running").length),C=_(()=>n.value.filter(l=>l.state==="fault").length);function E(l){switch(l){case"running":return"success";case"idle":return"info";case"charging":return"warning";case"paused":return"warning";case"fault":return"danger";case"offline":return"info";default:return"info"}}return M(async()=>{[n.value,m.value,i.value]=await Promise.all([G(),H(),J()])}),(l,r)=>{const u=D,o=B,f=V,a=S,g=P,y=q,h=N,w=I;return z(),T("div",null,[t(f,{gutter:14,class:"kpi-row"},{default:e(()=>[t(o,{span:6},{default:e(()=>[t(u,{title:"车辆在线",value:b.value},{suffix:e(()=>[d("span",R,"/ "+c(n.value.length),1)]),_:1},8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"任务进行中",value:x.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"故障车辆",value:C.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"今日运维动作",value:i.value.length},null,8,["value"])]),_:1})]),_:1}),t(f,{gutter:14,style:{"margin-top":"14px"}},{default:e(()=>[t(o,{span:14},{default:e(()=>[t(w,{shadow:"never"},{header:e(()=>[...r[0]||(r[0]=[d("span",null,"实时车辆",-1)])]),default:e(()=>[t(h,{data:n.value,size:"small","max-height":"360",stripe:""},{default:e(()=>[t(a,{prop:"name",label:"名称",width:"100"}),t(a,{prop:"state",label:"状态",width:"90"},{default:e(s=>[t(g,{size:"small",type:E(s.row.state)},{default:e(()=>[v(c(s.row.state),1)]),_:2},1032,["type"])]),_:1}),t(a,{prop:"group",label:"分组",width:"100"}),t(a,{label:"电量",width:"160"},{default:e(s=>[t(y,{percentage:Math.round(s.row.batterySoc*100),"stroke-width":8},null,8,["percentage"])]),_:1}),t(a,{prop:"missionId",label:"当前任务"})]),_:1},8,["data"])]),_:1})]),_:1}),t(o,{span:10},{default:e(()=>[t(w,{shadow:"never"},{header:e(()=>[...r[1]||(r[1]=[d("span",null,"最近运维动作",-1)])]),default:e(()=>[t(h,{data:i.value,size:"small","max-height":"360",stripe:""},{default:e(()=>[t(a,{prop:"ts",label:"时间",width:"180"}),t(a,{prop:"opCode",label:"动作"}),t(a,{prop:"target",label:"目标",width:"100"}),t(a,{prop:"result",label:"结果",width:"80"},{default:e(s=>[t(g,{size:"small",type:s.row.result==="ok"?"success":"danger"},{default:e(()=>[v(c(s.row.result),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])]),_:1})]),_:1})]),_:1})])}}}),ot=A($,[["__scopeId","data-v-53088435"]]);export{ot as default}; +import{aI as k,b7 as M,aE as T,aH as t,bJ as e,bh as p,a2 as V,b9 as z,w as B,a6 as D,aB as d,bq as c,t as I,aa as N,ab as S,ad as P,aG as v,$ as q,ax as _,ak as A}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{l as G,a as H}from"./projection-BMms551H.js";import{l as J}from"./ops-CsVl7GhE.js";import"./reflection-B_glb6eT.js";const R={class:"muted"},$=k({__name:"MonitorDashboardView",setup(j){const n=p([]),m=p([]),i=p([]),b=_(()=>n.value.filter(l=>l.state!=="offline").length),x=_(()=>m.value.filter(l=>l.status==="running").length),C=_(()=>n.value.filter(l=>l.state==="fault").length);function E(l){switch(l){case"running":return"success";case"idle":return"info";case"charging":return"warning";case"paused":return"warning";case"fault":return"danger";case"offline":return"info";default:return"info"}}return M(async()=>{[n.value,m.value,i.value]=await Promise.all([G(),H(),J()])}),(l,r)=>{const u=D,o=B,f=V,a=S,g=P,y=q,h=N,w=I;return z(),T("div",null,[t(f,{gutter:14,class:"kpi-row"},{default:e(()=>[t(o,{span:6},{default:e(()=>[t(u,{title:"车辆在线",value:b.value},{suffix:e(()=>[d("span",R,"/ "+c(n.value.length),1)]),_:1},8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"任务进行中",value:x.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"故障车辆",value:C.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"今日运维动作",value:i.value.length},null,8,["value"])]),_:1})]),_:1}),t(f,{gutter:14,style:{"margin-top":"14px"}},{default:e(()=>[t(o,{span:14},{default:e(()=>[t(w,{shadow:"never"},{header:e(()=>[...r[0]||(r[0]=[d("span",null,"实时车辆",-1)])]),default:e(()=>[t(h,{data:n.value,size:"small","max-height":"360",stripe:""},{default:e(()=>[t(a,{prop:"name",label:"名称",width:"100"}),t(a,{prop:"state",label:"状态",width:"90"},{default:e(s=>[t(g,{size:"small",type:E(s.row.state)},{default:e(()=>[v(c(s.row.state),1)]),_:2},1032,["type"])]),_:1}),t(a,{prop:"group",label:"分组",width:"100"}),t(a,{label:"电量",width:"160"},{default:e(s=>[t(y,{percentage:Math.round(s.row.batterySoc*100),"stroke-width":8},null,8,["percentage"])]),_:1}),t(a,{prop:"missionId",label:"当前任务"})]),_:1},8,["data"])]),_:1})]),_:1}),t(o,{span:10},{default:e(()=>[t(w,{shadow:"never"},{header:e(()=>[...r[1]||(r[1]=[d("span",null,"最近运维动作",-1)])]),default:e(()=>[t(h,{data:i.value,size:"small","max-height":"360",stripe:""},{default:e(()=>[t(a,{prop:"ts",label:"时间",width:"180"}),t(a,{prop:"opCode",label:"动作"}),t(a,{prop:"target",label:"目标",width:"100"}),t(a,{prop:"result",label:"结果",width:"80"},{default:e(s=>[t(g,{size:"small",type:s.row.result==="ok"?"success":"danger"},{default:e(()=>[v(c(s.row.result),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])]),_:1})]),_:1})]),_:1})])}}}),ot=A($,[["__scopeId","data-v-53088435"]]);export{ot as default}; diff --git a/MiGu.Server/wwwroot/assets/MonitorMapView-h38_wi8I.js b/MiGu.Server/wwwroot/assets/MonitorMapView-OvNLwhYc.js similarity index 53% rename from MiGu.Server/wwwroot/assets/MonitorMapView-h38_wi8I.js rename to MiGu.Server/wwwroot/assets/MonitorMapView-OvNLwhYc.js index e7be238..c1f384b 100644 --- a/MiGu.Server/wwwroot/assets/MonitorMapView-h38_wi8I.js +++ b/MiGu.Server/wwwroot/assets/MonitorMapView-OvNLwhYc.js @@ -1 +1 @@ -import o from"./MapMonitorView-DEfDktpd.js";import{aI as r,aC as t,b9 as p}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./Workspace3D-B2WrMPji.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"./reflection-C0K7EJ_N.js";import"./mapEdit-BiAzHHno.js";import"./ops-BCeFEEjY.js";import"./ops-DA63t9Ed.js";import"./monitorConfigCache-BtW5W6GI.js";/* empty css *//* empty css *//* empty css */import"./projection-nWPnmoX1.js";import"./useProjectionStream-C94Y5UgX.js";const G=r({__name:"MonitorMapView",setup(i){return(m,e)=>(p(),t(o,{"read-only":""}))}});export{G as default}; +import o from"./MapMonitorView-Bc6X9WQO.js";import{aI as r,aC as t,b9 as p}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./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"./reflection-B_glb6eT.js";import"./mapEdit-TNAQr3Be.js";import"./ops-BCeFEEjY.js";import"./ops-CsVl7GhE.js";import"./monitorConfigCache-BigdkiFw.js";/* empty css *//* empty css *//* empty css */import"./projection-BMms551H.js";import"./useProjectionStream-BBHmpNXC.js";const G=r({__name:"MonitorMapView",setup(i){return(m,e)=>(p(),t(o,{"read-only":""}))}});export{G as default}; diff --git a/MiGu.Server/wwwroot/assets/OpsActionPanelView-DP5WSM1Z.js b/MiGu.Server/wwwroot/assets/OpsActionPanelView-CgLT81Kn.js similarity index 94% rename from MiGu.Server/wwwroot/assets/OpsActionPanelView-DP5WSM1Z.js rename to MiGu.Server/wwwroot/assets/OpsActionPanelView-CgLT81Kn.js index b4707c0..5da9a2f 100644 --- a/MiGu.Server/wwwroot/assets/OpsActionPanelView-DP5WSM1Z.js +++ b/MiGu.Server/wwwroot/assets/OpsActionPanelView-CgLT81Kn.js @@ -1,2 +1,2 @@ -import{aI as T,bv as V,b7 as z,aC as m,bJ as a,bh as B,b9 as d,aH as o,t as S,aa as M,bt as _,ab as P,aB as p,bq as r,ad as $,aG as i,R as A,r as D,ae as N,aE as G,ai as H,bj as L,af as R,bg as U,ax as j,X as f,Y as q}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as F}from"./PermissionGuard-DUg2FNrM.js";import{O as g}from"./ops-BCeFEEjY.js";import{l as C,e as J}from"./ops-DA63t9Ed.js";/* empty css */const W={style:{display:"flex","align-items":"center",gap:"8px"}},me=T({__name:"OpsActionPanelView",setup(X){const w=V(),u=U({}),c=B([]),E=j(()=>g.filter(n=>w.hasOp(n.code)));async function x(n){const e=u[n.code];if(!e&&n.target!=="note"){f.warning("请填写目标 ID");return}if(n.needConfirm)try{await q.confirm(`确认执行 [${n.label}]? +import{aI as T,bv as V,b7 as z,aC as m,bJ as a,bh as B,b9 as d,aH as o,t as S,aa as M,bt as _,ab as P,aB as p,bq as r,ad as $,aG as i,R as A,r as D,ae as N,aE as G,ai as H,bj as L,af as R,bg as U,ax as j,X as f,Y as q}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{P as F}from"./PermissionGuard-BlMEkqrL.js";import{O as g}from"./ops-BCeFEEjY.js";import{l as C,e as J}from"./ops-CsVl7GhE.js";/* empty css */const W={style:{display:"flex","align-items":"center",gap:"8px"}},me=T({__name:"OpsActionPanelView",setup(X){const w=V(),u=U({}),c=B([]),E=j(()=>g.filter(n=>w.hasOp(n.code)));async function x(n){const e=u[n.code];if(!e&&n.target!=="note"){f.warning("请填写目标 ID");return}if(n.needConfirm)try{await q.confirm(`确认执行 [${n.label}]? 目标:${e}`,"二次确认",{type:"warning"})}catch{return}try{const l=await J({opCode:n.code,targetId:e});f.success(`成功,auditId=${l.auditId}`),c.value=await C()}catch(l){f.error(`失败:${l instanceof Error?l.message:String(l)}`)}}return z(async()=>{c.value=await C()}),(n,e)=>{const l=$,s=P,h=A,k=D,v=M,b=S,I=R,O=N;return d(),m(F,{"widget-id":"OpsActionPanel"},{default:a(()=>[o(b,{shadow:"never"},{header:a(()=>[p("div",W,[e[1]||(e[1]=p("span",null,"运维操作(架构 §5.1 白名单)",-1)),o(l,{size:"small",type:"info"},{default:a(()=>[...e[0]||(e[0]=[i("scope=RCSMonitor",-1)])]),_:1}),o(l,{size:"small",type:"success"},{default:a(()=>[i(r(E.value.length)+" / "+r(_(g).length)+" 可用",1)]),_:1})])]),default:a(()=>[o(v,{data:_(g),size:"small",border:""},{default:a(()=>[o(s,{prop:"code",label:"权限码",width:"200"},{default:a(t=>[p("code",null,r(t.row.code),1)]),_:1}),o(s,{prop:"label",label:"操作",width:"140"}),o(s,{prop:"target",label:"目标",width:"80"}),o(s,{prop:"needConfirm",label:"二次确认",width:"100"},{default:a(t=>[t.row.needConfirm?(d(),m(l,{key:0,size:"small",type:"warning"},{default:a(()=>[...e[2]||(e[2]=[i("是",-1)])]),_:1})):(d(),m(l,{key:1,size:"small",effect:"plain"},{default:a(()=>[...e[3]||(e[3]=[i("否",-1)])]),_:1}))]),_:1}),o(s,{prop:"description",label:"说明"}),o(s,{label:"操作",width:"200"},{default:a(t=>[o(h,{modelValue:u[t.row.code],"onUpdate:modelValue":y=>u[t.row.code]=y,placeholder:"目标 ID",size:"small",style:{width:"100px","margin-right":"6px"}},null,8,["modelValue","onUpdate:modelValue"]),o(k,{size:"small",type:t.row.needConfirm?"warning":"primary",disabled:!_(w).hasOp(t.row.code),onClick:y=>x(t.row)},{default:a(()=>[...e[4]||(e[4]=[i("执行",-1)])]),_:1},8,["type","disabled","onClick"])]),_:1})]),_:1},8,["data"])]),_:1}),o(b,{shadow:"never",style:{"margin-top":"12px"}},{header:a(()=>[...e[5]||(e[5]=[p("span",null,"本地操作记录(占位 Mock)",-1)])]),default:a(()=>[o(O,null,{default:a(()=>[(d(!0),G(H,null,L(c.value,t=>(d(),m(I,{key:t.id,timestamp:t.ts,type:t.result==="ok"?"success":"danger"},{default:a(()=>[p("strong",null,r(t.opCode),1),i(" → "+r(t.target)+"("+r(t.user)+") ",1)]),_:2},1032,["timestamp","type"]))),128))]),_:1})]),_:1})]),_:1})}}});export{me as default}; diff --git a/MiGu.Server/wwwroot/assets/OpsConfigView-Cx4yfu4M.js b/MiGu.Server/wwwroot/assets/OpsConfigView-Ch6itZUF.js similarity index 95% rename from MiGu.Server/wwwroot/assets/OpsConfigView-Cx4yfu4M.js rename to MiGu.Server/wwwroot/assets/OpsConfigView-Ch6itZUF.js index 5d109b3..084b1aa 100644 --- a/MiGu.Server/wwwroot/assets/OpsConfigView-Cx4yfu4M.js +++ b/MiGu.Server/wwwroot/assets/OpsConfigView-Ch6itZUF.js @@ -1 +1 @@ -import{aI as te,b6 as oe,aC as b,bJ as n,bt as P,b9 as u,aH as s,N as le,H as ae,aG as h,O as ne,S as se,bK as R,aE as C,E as ie,x as re,ai as E,bj as T,y as ue,aB as ce,v as me,u as de,bq as D,bB as fe,aD as pe,bA as ve,e as _e,bp as $,bh as S,X as j,ak as ye}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as be,n as w,c as he,d as ge,s as W,l as ke}from"./ConfigPageBase-CT6BdvCe.js";import{r as Ce}from"./reflection-C0K7EJ_N.js";import{f as Ve}from"./monitorConfigCache-BtW5W6GI.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */function Ne(V,m,d){if(!V)return[];const g=V[m]??V[d];if(g?.length)return[...g];for(const[c,f]of Object.entries(V))if(f?.length){if(c===m||c===d)return[...f];if(m.endsWith("."+c)||c.endsWith("."+d))return[...f];if(m.endsWith("."+d)&&(c===d||c.endsWith("."+d)))return[...f]}return[]}const xe={class:"monitor-section"},Ae={key:0,class:"muted empty-hint"},G="simple-platform-methods-by-type-car-v1",Se=500,Ee=te({__name:"OpsConfigView",setup(V){const m=$([]),d=$([]),g=$([]),c=S(!1),f=S(!1),U=S([]),N=S(null),x=S(!1);let _=null,k=null;function M(l){k=l,_&&clearTimeout(_),_=setTimeout(()=>{K()},Se)}async function K(){if(_=null,x.value){_=setTimeout(()=>{K()},200);return}const l=k;if(k=null,!!l){x.value=!0;try{const e=await W(l,{cachedRoot:N.value});N.value=e,j.success({message:"地图监控配置已自动保存",duration:1200,grouping:!0})}catch(e){j.error(`地图监控配置自动保存失败:${e instanceof Error?e.message:String(e)}`)}finally{x.value=!1,k&&M(k)}}}oe(()=>{_&&(clearTimeout(_),_=null),k&&!x.value&&K()});async function J(l,e){c.value=!0,f.value=!0;try{const t=await Ve(),[{config:i,cache:r},p]=await Promise.all([ke(l,t),L()]);N.value=r,d.value=I(t.available.site.methods),g.value=I(t.available.track.methods),e(i)}catch{e(w(l)),d.value=[],g.value=[],await L()}finally{c.value=!1,f.value=!1}}async function Y(l){N.value=await W(l,{cachedRoot:N.value})}async function L(){try{const l=sessionStorage.getItem(G);if(l){const e=JSON.parse(l);if(Array.isArray(e)&&e.length){m.value=e;return}}}catch{}try{const e=(await Ce.listMethodsByType("car")).map(t=>({typeKey:t.fullTypeName??t.typeName,shortTypeName:t.typeName,title:`${t.typeLabel??t.typeName} / ${t.fullTypeName??t.typeName} [${t.assemblyName}]`,methods:t.methods.map(i=>({methodName:i.methodName,label:i.label||i.methodName})).filter(i=>!!i.methodName)})).filter(t=>t.methods.length>0).sort((t,i)=>t.title.localeCompare(i.title));m.value=e;try{sessionStorage.setItem(G,JSON.stringify(e))}catch{}}catch{m.value=[]}}function I(l){return l?.length?l.map(e=>({methodName:e,label:e})):[]}function O(l){return l.monitor??ge()}function F(l,e){const t=O(l).carActionByType;return Ne(t,e.typeKey,e.shortTypeName)}function q(l,e){const t=F(l,e).slice().sort().join("\0");return`${e.typeKey}\0${t}`}function H(l,e,t,i,r){const p=O(e),v={...e,monitor:{...p,[t]:{...p[t],[i]:[...r]}}};l(v),M(v)}function X(l,e,t,i){const r=O(e),p=he(r.carActionByType);p[t.typeKey]=[...i],t.shortTypeName!==t.typeKey&&delete p[t.shortTypeName];const v={...e,monitor:{...r,carActionByType:p}};l(v),M(v)}return(l,e)=>{const t=ae,i=se,r=ne,p=ie,v=de,B=me,Q=ue,Z=re,ee=le,z=ve;return u(),b(be,{section:"ops",title:"运营维护",description:"调度回放、日志管理、版本维护(OpsConfig)",defaults:P(_e),"normalize-payload":P(w),"after-load":J,"before-save":Y},{default:n(({payload:a,update:y})=>[s(ee,{"label-width":"200px",model:a},{default:n(()=>[s(t,{"content-position":"left"},{default:n(()=>[...e[1]||(e[1]=[h("调度回放",-1)])]),_:1}),s(r,{label:"保留时长 (天)"},{default:n(()=>[s(i,{"model-value":a.playback.retentionDays,min:1,max:3650,"onUpdate:modelValue":o=>y({...a,playback:{...a.playback,retentionDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"采样频率 (Hz)"},{default:n(()=>[s(i,{"model-value":a.playback.samplingHz,min:1,max:100,"onUpdate:modelValue":o=>y({...a,playback:{...a.playback,samplingHz:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[2]||(e[2]=[h("日志保留",-1)])]),_:1}),s(r,{label:"热数据 (天)"},{default:n(()=>[s(i,{"model-value":a.logRetention.hotDays,min:1,max:365,"onUpdate:modelValue":o=>y({...a,logRetention:{...a.logRetention,hotDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"冷数据 (天)"},{default:n(()=>[s(i,{"model-value":a.logRetention.coldDays,min:1,max:3650,"onUpdate:modelValue":o=>y({...a,logRetention:{...a.logRetention,coldDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[3]||(e[3]=[h("版本维护",-1)])]),_:1}),s(r,{label:"保留发布版本"},{default:n(()=>[s(i,{"model-value":a.version.keepReleases,min:1,max:100,"onUpdate:modelValue":o=>y({...a,version:{keepReleases:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[4]||(e[4]=[h("地图监控信息与动作管理",-1)])]),_:1}),R((u(),C("div",xe,[s(p,{type:"info",closable:!1,"show-icon":"",title:x.value?"正在自动保存…":"支持直接多选,修改后会自动保存到地图监控(simple.json),无需点击上方「保存」。若某组不勾选,表示该组在地图监控中显示全部。",style:{"margin-bottom":"10px"}},null,8,["title"]),R((u(),b(r,{label:"按车型动作配置"},{default:n(()=>[s(Z,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),class:"type-actions"},{default:n(()=>[(u(!0),C(E,null,T(m.value,o=>(u(),b(Q,{key:o.typeKey,name:o.typeKey,title:`${o.title}(${o.methods.length})`},{default:n(()=>[R(ce("div",null,[(u(),b(B,{key:q(a,o),"model-value":F(a,o),class:"cfg-check-grid","onUpdate:modelValue":A=>X(y,a,o,A)},{default:n(()=>[(u(!0),C(E,null,T(o.methods,A=>(u(),b(v,{key:`${o.typeKey}-${A.methodName}`,label:A.methodName},{default:n(()=>[h(D(A.label),1)]),_:2},1032,["label"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"]))],512),[[fe,U.value.includes(o.typeKey)]])]),_:2},1032,["name","title"]))),128))]),_:2},1032,["modelValue"]),!c.value&&!f.value&&!m.value.length?(u(),C("p",Ae," 暂未扫描到带 MethodMember 的车型(请确认 SimpleLite 已连接并已加载插件)。 ")):pe("",!0)]),_:2},1024)),[[z,f.value]]),s(r,{label:"站点动作显示项"},{default:n(()=>[s(B,{"model-value":a.monitor?.site?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":o=>H(y,a,"site","actionKeys",o)},{default:n(()=>[(u(!0),C(E,null,T(d.value,o=>(u(),b(v,{key:`sa-${o.methodName}`,label:o.methodName},{default:n(()=>[h(D(o.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"路径动作显示项"},{default:n(()=>[s(B,{"model-value":a.monitor?.track?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":o=>H(y,a,"track","actionKeys",o)},{default:n(()=>[(u(!0),C(E,null,T(g.value,o=>(u(),b(v,{key:`ta-${o.methodName}`,label:o.methodName},{default:n(()=>[h(D(o.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024)])),[[z,c.value]])]),_:2},1032,["model"])]),_:1},8,["defaults","normalize-payload"])}}}),Ye=ye(Ee,[["__scopeId","data-v-bf134df3"]]);export{Ye as default}; +import{aI as te,b6 as oe,aC as b,bJ as n,bt as P,b9 as u,aH as s,N as le,H as ae,aG as h,O as ne,S as se,bK as R,aE as C,E as ie,x as re,ai as E,bj as T,y as ue,aB as ce,v as me,u as de,bq as D,bB as fe,aD as pe,bA as ve,e as _e,bp as $,bh as S,X as j,ak as ye}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as be,n as w,c as he,d as ge,s as W,l as ke}from"./ConfigPageBase-MHa7yfOO.js";import{r as Ce}from"./reflection-B_glb6eT.js";import{f as Ve}from"./monitorConfigCache-BigdkiFw.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */function Ne(V,m,d){if(!V)return[];const g=V[m]??V[d];if(g?.length)return[...g];for(const[c,f]of Object.entries(V))if(f?.length){if(c===m||c===d)return[...f];if(m.endsWith("."+c)||c.endsWith("."+d))return[...f];if(m.endsWith("."+d)&&(c===d||c.endsWith("."+d)))return[...f]}return[]}const xe={class:"monitor-section"},Ae={key:0,class:"muted empty-hint"},G="simple-platform-methods-by-type-car-v1",Se=500,Ee=te({__name:"OpsConfigView",setup(V){const m=$([]),d=$([]),g=$([]),c=S(!1),f=S(!1),U=S([]),N=S(null),x=S(!1);let _=null,k=null;function M(l){k=l,_&&clearTimeout(_),_=setTimeout(()=>{K()},Se)}async function K(){if(_=null,x.value){_=setTimeout(()=>{K()},200);return}const l=k;if(k=null,!!l){x.value=!0;try{const e=await W(l,{cachedRoot:N.value});N.value=e,j.success({message:"地图监控配置已自动保存",duration:1200,grouping:!0})}catch(e){j.error(`地图监控配置自动保存失败:${e instanceof Error?e.message:String(e)}`)}finally{x.value=!1,k&&M(k)}}}oe(()=>{_&&(clearTimeout(_),_=null),k&&!x.value&&K()});async function J(l,e){c.value=!0,f.value=!0;try{const t=await Ve(),[{config:i,cache:r},p]=await Promise.all([ke(l,t),L()]);N.value=r,d.value=I(t.available.site.methods),g.value=I(t.available.track.methods),e(i)}catch{e(w(l)),d.value=[],g.value=[],await L()}finally{c.value=!1,f.value=!1}}async function Y(l){N.value=await W(l,{cachedRoot:N.value})}async function L(){try{const l=sessionStorage.getItem(G);if(l){const e=JSON.parse(l);if(Array.isArray(e)&&e.length){m.value=e;return}}}catch{}try{const e=(await Ce.listMethodsByType("car")).map(t=>({typeKey:t.fullTypeName??t.typeName,shortTypeName:t.typeName,title:`${t.typeLabel??t.typeName} / ${t.fullTypeName??t.typeName} [${t.assemblyName}]`,methods:t.methods.map(i=>({methodName:i.methodName,label:i.label||i.methodName})).filter(i=>!!i.methodName)})).filter(t=>t.methods.length>0).sort((t,i)=>t.title.localeCompare(i.title));m.value=e;try{sessionStorage.setItem(G,JSON.stringify(e))}catch{}}catch{m.value=[]}}function I(l){return l?.length?l.map(e=>({methodName:e,label:e})):[]}function O(l){return l.monitor??ge()}function F(l,e){const t=O(l).carActionByType;return Ne(t,e.typeKey,e.shortTypeName)}function q(l,e){const t=F(l,e).slice().sort().join("\0");return`${e.typeKey}\0${t}`}function H(l,e,t,i,r){const p=O(e),v={...e,monitor:{...p,[t]:{...p[t],[i]:[...r]}}};l(v),M(v)}function X(l,e,t,i){const r=O(e),p=he(r.carActionByType);p[t.typeKey]=[...i],t.shortTypeName!==t.typeKey&&delete p[t.shortTypeName];const v={...e,monitor:{...r,carActionByType:p}};l(v),M(v)}return(l,e)=>{const t=ae,i=se,r=ne,p=ie,v=de,B=me,Q=ue,Z=re,ee=le,z=ve;return u(),b(be,{section:"ops",title:"运营维护",description:"调度回放、日志管理、版本维护(OpsConfig)",defaults:P(_e),"normalize-payload":P(w),"after-load":J,"before-save":Y},{default:n(({payload:a,update:y})=>[s(ee,{"label-width":"200px",model:a},{default:n(()=>[s(t,{"content-position":"left"},{default:n(()=>[...e[1]||(e[1]=[h("调度回放",-1)])]),_:1}),s(r,{label:"保留时长 (天)"},{default:n(()=>[s(i,{"model-value":a.playback.retentionDays,min:1,max:3650,"onUpdate:modelValue":o=>y({...a,playback:{...a.playback,retentionDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"采样频率 (Hz)"},{default:n(()=>[s(i,{"model-value":a.playback.samplingHz,min:1,max:100,"onUpdate:modelValue":o=>y({...a,playback:{...a.playback,samplingHz:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[2]||(e[2]=[h("日志保留",-1)])]),_:1}),s(r,{label:"热数据 (天)"},{default:n(()=>[s(i,{"model-value":a.logRetention.hotDays,min:1,max:365,"onUpdate:modelValue":o=>y({...a,logRetention:{...a.logRetention,hotDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"冷数据 (天)"},{default:n(()=>[s(i,{"model-value":a.logRetention.coldDays,min:1,max:3650,"onUpdate:modelValue":o=>y({...a,logRetention:{...a.logRetention,coldDays:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[3]||(e[3]=[h("版本维护",-1)])]),_:1}),s(r,{label:"保留发布版本"},{default:n(()=>[s(i,{"model-value":a.version.keepReleases,min:1,max:100,"onUpdate:modelValue":o=>y({...a,version:{keepReleases:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(t,{"content-position":"left"},{default:n(()=>[...e[4]||(e[4]=[h("地图监控信息与动作管理",-1)])]),_:1}),R((u(),C("div",xe,[s(p,{type:"info",closable:!1,"show-icon":"",title:x.value?"正在自动保存…":"支持直接多选,修改后会自动保存到地图监控(simple.json),无需点击上方「保存」。若某组不勾选,表示该组在地图监控中显示全部。",style:{"margin-bottom":"10px"}},null,8,["title"]),R((u(),b(r,{label:"按车型动作配置"},{default:n(()=>[s(Z,{modelValue:U.value,"onUpdate:modelValue":e[0]||(e[0]=o=>U.value=o),class:"type-actions"},{default:n(()=>[(u(!0),C(E,null,T(m.value,o=>(u(),b(Q,{key:o.typeKey,name:o.typeKey,title:`${o.title}(${o.methods.length})`},{default:n(()=>[R(ce("div",null,[(u(),b(B,{key:q(a,o),"model-value":F(a,o),class:"cfg-check-grid","onUpdate:modelValue":A=>X(y,a,o,A)},{default:n(()=>[(u(!0),C(E,null,T(o.methods,A=>(u(),b(v,{key:`${o.typeKey}-${A.methodName}`,label:A.methodName},{default:n(()=>[h(D(A.label),1)]),_:2},1032,["label"]))),128))]),_:2},1032,["model-value","onUpdate:modelValue"]))],512),[[fe,U.value.includes(o.typeKey)]])]),_:2},1032,["name","title"]))),128))]),_:2},1032,["modelValue"]),!c.value&&!f.value&&!m.value.length?(u(),C("p",Ae," 暂未扫描到带 MethodMember 的车型(请确认 SimpleLite 已连接并已加载插件)。 ")):pe("",!0)]),_:2},1024)),[[z,f.value]]),s(r,{label:"站点动作显示项"},{default:n(()=>[s(B,{"model-value":a.monitor?.site?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":o=>H(y,a,"site","actionKeys",o)},{default:n(()=>[(u(!0),C(E,null,T(d.value,o=>(u(),b(v,{key:`sa-${o.methodName}`,label:o.methodName},{default:n(()=>[h(D(o.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),s(r,{label:"路径动作显示项"},{default:n(()=>[s(B,{"model-value":a.monitor?.track?.actionKeys??[],class:"cfg-check-grid","onUpdate:modelValue":o=>H(y,a,"track","actionKeys",o)},{default:n(()=>[(u(!0),C(E,null,T(g.value,o=>(u(),b(v,{key:`ta-${o.methodName}`,label:o.methodName},{default:n(()=>[h(D(o.label),1)]),_:2},1032,["label"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024)])),[[z,c.value]])]),_:2},1032,["model"])]),_:1},8,["defaults","normalize-payload"])}}}),Ye=ye(Ee,[["__scopeId","data-v-bf134df3"]]);export{Ye as default}; diff --git a/MiGu.Server/wwwroot/assets/PermissionGuard-DUg2FNrM.js b/MiGu.Server/wwwroot/assets/PermissionGuard-BlMEkqrL.js similarity index 93% rename from MiGu.Server/wwwroot/assets/PermissionGuard-DUg2FNrM.js rename to MiGu.Server/wwwroot/assets/PermissionGuard-BlMEkqrL.js index 03d0795..c73d434 100644 --- a/MiGu.Server/wwwroot/assets/PermissionGuard-DUg2FNrM.js +++ b/MiGu.Server/wwwroot/assets/PermissionGuard-BlMEkqrL.js @@ -1 +1 @@ -import{aI as p,bv as c,bk as i,aE as u,aB as s,aC as m,L as g,bJ as v,ax as k,b9 as d,bq as y,ak as _}from"./index-368apsQG.js";/* empty css *//* empty css */const f=["title"],b={class:"pg-hidden-hint"},h=p({__name:"PermissionGuard",props:{widgetId:{}},setup(e){const n=e,l=c(),a=k(()=>l.widgetOf(n.widgetId));return(o,t)=>{const r=g;return a.value==="interactive"?i(o.$slots,"default",{key:0},void 0,!0):a.value==="readonly"?(d(),u("div",{key:1,class:"pg-readonly",title:`${e.widgetId} 当前为只读`},[i(o.$slots,"default",{},void 0,!0),t[0]||(t[0]=s("div",{class:"pg-mask"},null,-1))],8,f)):(d(),m(r,{key:2,class:"pg-hidden"},{description:v(()=>[t[1]||(t[1]=s("p",{class:"pg-hidden-title"},"当前账号无权查看此功能",-1)),s("p",b,"控件:"+y(e.widgetId)+"。若应为管理员可见,请尝试顶部切换「管理员/运营」或刷新页面。",1)]),_:1}))}}}),E=_(h,[["__scopeId","data-v-4766a149"]]);export{E as P}; +import{aI as p,bv as c,bk as i,aE as u,aB as s,aC as m,L as g,bJ as v,ax as k,b9 as d,bq as y,ak as _}from"./index-Dg4NaXsE.js";/* empty css *//* empty css */const f=["title"],b={class:"pg-hidden-hint"},h=p({__name:"PermissionGuard",props:{widgetId:{}},setup(e){const n=e,l=c(),a=k(()=>l.widgetOf(n.widgetId));return(o,t)=>{const r=g;return a.value==="interactive"?i(o.$slots,"default",{key:0},void 0,!0):a.value==="readonly"?(d(),u("div",{key:1,class:"pg-readonly",title:`${e.widgetId} 当前为只读`},[i(o.$slots,"default",{},void 0,!0),t[0]||(t[0]=s("div",{class:"pg-mask"},null,-1))],8,f)):(d(),m(r,{key:2,class:"pg-hidden"},{description:v(()=>[t[1]||(t[1]=s("p",{class:"pg-hidden-title"},"当前账号无权查看此功能",-1)),s("p",b,"控件:"+y(e.widgetId)+"。若应为管理员可见,请尝试顶部切换「管理员/运营」或刷新页面。",1)]),_:1}))}}}),E=_(h,[["__scopeId","data-v-4766a149"]]);export{E as P}; diff --git a/MiGu.Server/wwwroot/assets/PlaybackView-CSBKNt4K.js b/MiGu.Server/wwwroot/assets/PlaybackView-DVrgp4e4.js similarity index 97% rename from MiGu.Server/wwwroot/assets/PlaybackView-CSBKNt4K.js rename to MiGu.Server/wwwroot/assets/PlaybackView-DVrgp4e4.js index 969dbbe..a1f8ea0 100644 --- a/MiGu.Server/wwwroot/assets/PlaybackView-CSBKNt4K.js +++ b/MiGu.Server/wwwroot/assets/PlaybackView-DVrgp4e4.js @@ -1 +1 @@ -import{aI as c,aC as y,bJ as a,t as w,b9 as V,aH as e,a2 as E,w as k,R as B,B as g,r as x,aG as n,bt as N,bF as P,H as v,aa as z,ab as C,aB as D,bq as S,bg as A,bh as I}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const K=30,X=c({__name:"PlaybackView",setup(T){const s=A({kw:"",range:null}),i=I([{id:"SNAP-001",ts:"2026-05-19 10:21:33",type:"调度异常",summary:"AGV-005 上线超时 → 故障",size:"128 KB"},{id:"SNAP-002",ts:"2026-05-19 14:05:17",type:"路口死锁",summary:"路口-N 等待链 3 节点 30s",size:"64 KB"},{id:"SNAP-003",ts:"2026-05-20 09:11:02",type:"手动快照",summary:"用户 admin 触发 SnapshotExport",size:"420 KB"}]);return(G,t)=>{const d=B,r=k,m=g,o=x,u=E,_=v,l=C,b=z,f=w;return V(),y(f,{shadow:"never"},{header:a(()=>[D("span",null,"调度回放(PlaybackPolicy.retentionDays="+S(K)+" 天)")]),default:a(()=>[e(u,{gutter:12},{default:a(()=>[e(r,{span:6},{default:a(()=>[e(d,{modelValue:s.kw,"onUpdate:modelValue":t[0]||(t[0]=p=>s.kw=p),placeholder:"按任务 / 车辆检索",clearable:""},null,8,["modelValue"])]),_:1}),e(r,{span:8},{default:a(()=>[e(m,{modelValue:s.range,"onUpdate:modelValue":t[1]||(t[1]=p=>s.range=p),type:"datetimerange","range-separator":"→","start-placeholder":"开始","end-placeholder":"结束",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),e(r,{span:10},{default:a(()=>[e(o,{type:"primary"},{default:a(()=>[...t[2]||(t[2]=[n("检索快照",-1)])]),_:1}),e(o,null,{default:a(()=>[...t[3]||(t[3]=[n("下载日志",-1)])]),_:1}),e(o,{icon:N(P),plain:""},{default:a(()=>[...t[4]||(t[4]=[n("回放选中",-1)])]),_:1},8,["icon"])]),_:1})]),_:1}),e(_),e(b,{data:i.value,stripe:""},{default:a(()=>[e(l,{prop:"id",label:"ID",width:"100"}),e(l,{prop:"ts",label:"时间",width:"180"}),e(l,{prop:"type",label:"类型",width:"140"}),e(l,{prop:"summary",label:"概要"}),e(l,{prop:"size",label:"大小",width:"100"}),e(l,{label:"操作",width:"160"},{default:a(()=>[e(o,{text:"",size:"small"},{default:a(()=>[...t[5]||(t[5]=[n("回放",-1)])]),_:1}),e(o,{text:"",size:"small"},{default:a(()=>[...t[6]||(t[6]=[n("下载",-1)])]),_:1})]),_:1})]),_:1},8,["data"])]),_:1})}}});export{X as default}; +import{aI as c,aC as y,bJ as a,t as w,b9 as V,aH as e,a2 as E,w as k,R as B,B as g,r as x,aG as n,bt as N,bF as P,H as v,aa as z,ab as C,aB as D,bq as S,bg as A,bh as I}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const K=30,X=c({__name:"PlaybackView",setup(T){const s=A({kw:"",range:null}),i=I([{id:"SNAP-001",ts:"2026-05-19 10:21:33",type:"调度异常",summary:"AGV-005 上线超时 → 故障",size:"128 KB"},{id:"SNAP-002",ts:"2026-05-19 14:05:17",type:"路口死锁",summary:"路口-N 等待链 3 节点 30s",size:"64 KB"},{id:"SNAP-003",ts:"2026-05-20 09:11:02",type:"手动快照",summary:"用户 admin 触发 SnapshotExport",size:"420 KB"}]);return(G,t)=>{const d=B,r=k,m=g,o=x,u=E,_=v,l=C,b=z,f=w;return V(),y(f,{shadow:"never"},{header:a(()=>[D("span",null,"调度回放(PlaybackPolicy.retentionDays="+S(K)+" 天)")]),default:a(()=>[e(u,{gutter:12},{default:a(()=>[e(r,{span:6},{default:a(()=>[e(d,{modelValue:s.kw,"onUpdate:modelValue":t[0]||(t[0]=p=>s.kw=p),placeholder:"按任务 / 车辆检索",clearable:""},null,8,["modelValue"])]),_:1}),e(r,{span:8},{default:a(()=>[e(m,{modelValue:s.range,"onUpdate:modelValue":t[1]||(t[1]=p=>s.range=p),type:"datetimerange","range-separator":"→","start-placeholder":"开始","end-placeholder":"结束",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),e(r,{span:10},{default:a(()=>[e(o,{type:"primary"},{default:a(()=>[...t[2]||(t[2]=[n("检索快照",-1)])]),_:1}),e(o,null,{default:a(()=>[...t[3]||(t[3]=[n("下载日志",-1)])]),_:1}),e(o,{icon:N(P),plain:""},{default:a(()=>[...t[4]||(t[4]=[n("回放选中",-1)])]),_:1},8,["icon"])]),_:1})]),_:1}),e(_),e(b,{data:i.value,stripe:""},{default:a(()=>[e(l,{prop:"id",label:"ID",width:"100"}),e(l,{prop:"ts",label:"时间",width:"180"}),e(l,{prop:"type",label:"类型",width:"140"}),e(l,{prop:"summary",label:"概要"}),e(l,{prop:"size",label:"大小",width:"100"}),e(l,{label:"操作",width:"160"},{default:a(()=>[e(o,{text:"",size:"small"},{default:a(()=>[...t[5]||(t[5]=[n("回放",-1)])]),_:1}),e(o,{text:"",size:"small"},{default:a(()=>[...t[6]||(t[6]=[n("下载",-1)])]),_:1})]),_:1})]),_:1},8,["data"])]),_:1})}}});export{X as default}; diff --git a/MiGu.Server/wwwroot/assets/ProcessPanelView-BaRn0PJa.js b/MiGu.Server/wwwroot/assets/ProcessPanelView-DoD_u6oD.js similarity index 80% rename from MiGu.Server/wwwroot/assets/ProcessPanelView-BaRn0PJa.js rename to MiGu.Server/wwwroot/assets/ProcessPanelView-DoD_u6oD.js index 629ef67..46d8e5d 100644 --- a/MiGu.Server/wwwroot/assets/ProcessPanelView-BaRn0PJa.js +++ b/MiGu.Server/wwwroot/assets/ProcessPanelView-DoD_u6oD.js @@ -1 +1 @@ -import{R as o}from"./ReflectionManagerPanel-CKQWtKhJ.js";import{aI as t,aE as r,aH as e,b9 as i,ak as p}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-C0K7EJ_N.js";import"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const m={class:"process-page"},s=t({__name:"ProcessPanelView",setup(a){return(n,c)=>(i(),r("div",m,[e(o,{kind:"process","kind-label":"进程",title:"进程管理(Mission / Process)","empty-text":"当前没有进程;点击右上角「新建进程」即可基于已加载的 MissionType 实例化一个。"})]))}}),z=p(s,[["__scopeId","data-v-6a85813e"]]);export{z as default}; +import{R as o}from"./ReflectionManagerPanel-BZQZIz4T.js";import{aI as t,aE as r,aH as e,b9 as i,ak as p}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-B_glb6eT.js";import"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const m={class:"process-page"},s=t({__name:"ProcessPanelView",setup(a){return(n,c)=>(i(),r("div",m,[e(o,{kind:"process","kind-label":"进程",title:"进程管理(Mission / Process)","empty-text":"当前没有进程;点击右上角「新建进程」即可基于已加载的 MissionType 实例化一个。"})]))}}),z=p(s,[["__scopeId","data-v-6a85813e"]]);export{z as default}; diff --git a/MiGu.Server/wwwroot/assets/ProjectPropertiesView-4-x-FH30.js b/MiGu.Server/wwwroot/assets/ProjectPropertiesView-DxQyu0yl.js similarity index 98% rename from MiGu.Server/wwwroot/assets/ProjectPropertiesView-4-x-FH30.js rename to MiGu.Server/wwwroot/assets/ProjectPropertiesView-DxQyu0yl.js index bcec61a..6f678ef 100644 --- a/MiGu.Server/wwwroot/assets/ProjectPropertiesView-4-x-FH30.js +++ b/MiGu.Server/wwwroot/assets/ProjectPropertiesView-DxQyu0yl.js @@ -1,2 +1,2 @@ -import{aI as R,bI as se,b7 as ie,b9 as l,aE as C,aB as V,bq as h,aC as i,bJ as o,ai as re,bj as ce,F as ue,aD as F,aH as n,R as de,Q as pe,bt as O,bn as me,r as fe,bi as _e,aL as ve,aG as N,bK as ye,bA as be,aa as ge,ab as ke,a8 as he,S as Ee,ad as Ce,L as we,bh as d,ax as M,X as P,Y as je,C as Le,t as Se,bg as Ve,ak as G,ac as Fe,a9 as Be}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as E}from"./reflection-C0K7EJ_N.js";const $e={class:"fme-root"},Ie={class:"fme-header"},xe={class:"fme-desc"},Ne={key:0,class:"fme-path"},Pe={key:1,class:"fme-path-empty"},ze={class:"fme-toolbar"},Te={class:"fme-btn-text"},De={key:0,class:"fme-locked"},Ue=R({__name:"FieldMemberEditor",props:{targetLabel:{},description:{},loader:{type:Function},onSet:{type:Function},onSave:{type:Function}},setup(B,{expose:f}){const _=B,v=d(!1),y=d(!1),w=d(""),p=d([]),j=d([]),$=d("保存"),c=Ve({}),z=d(!1),s=M(()=>{const e=w.value.trim().toLowerCase();return e?p.value.filter(t=>t.key.toLowerCase().includes(e)||t.label.toLowerCase().includes(e)):p.value}),m=M(()=>p.value.reduce((e,t)=>t.locked?e:c[t.key]!==t.value?e+1:e,0)),g=M(()=>m.value>0);function T(e){return e==="Boolean"}function D(e){return e==="Int32"||e==="Int64"||e==="Int16"||e==="Byte"}function K(e){return e==="Single"||e==="Double"||e==="Decimal"}function Q(e){const t=(e??"").trim().toLowerCase();return t==="true"||t==="1"||t==="yes"}function X(e){const t=parseInt(e,10);return Number.isFinite(t)?t:0}function Y(e){const t=parseFloat(e);return Number.isFinite(t)?t:0}function I(e){return c[e.key]??e.value}function x(e,t){c[e.key]=t}function W(e){if(e.locked)return!1;const t=c[e.key];return t!==void 0&&t!==e.value}async function k(){v.value=!0;try{const e=await _.loader();p.value=e.fields,j.value=e.pathInfos??[],e.saveButtonLabel&&($.value=e.saveButtonLabel);for(const t of e.fields)c[t.key]=t.value;for(const t of Object.keys(c))e.fields.find(u=>u.key===t)||delete c[t]}catch(e){P.error(`加载${_.targetLabel}失败:${e.message}`)}finally{v.value=!1}}function Z(){for(const e of p.value)c[e.key]=e.value}async function ee(){const e=p.value.filter(r=>!r.locked&&c[r.key]!==r.value);y.value=!0;let t=0;const u=[];for(const r of e)try{await _.onSet(r.key,c[r.key]??""),t+=1}catch(L){u.push({key:r.key,reason:L.message})}if(u.length>0){y.value=!1;try{await je.confirm(`共 ${e.length} 项改动:成功 ${t},失败 ${u.length}(首项: ${u[0].key} → ${u[0].reason})。 +import{aI as R,bI as se,b7 as ie,b9 as l,aE as C,aB as V,bq as h,aC as i,bJ as o,ai as re,bj as ce,F as ue,aD as F,aH as n,R as de,Q as pe,bt as O,bn as me,r as fe,bi as _e,aL as ve,aG as N,bK as ye,bA as be,aa as ge,ab as ke,a8 as he,S as Ee,ad as Ce,L as we,bh as d,ax as M,X as P,Y as je,C as Le,t as Se,bg as Ve,ak as G,ac as Fe,a9 as Be}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as E}from"./reflection-B_glb6eT.js";const $e={class:"fme-root"},Ie={class:"fme-header"},xe={class:"fme-desc"},Ne={key:0,class:"fme-path"},Pe={key:1,class:"fme-path-empty"},ze={class:"fme-toolbar"},Te={class:"fme-btn-text"},De={key:0,class:"fme-locked"},Ue=R({__name:"FieldMemberEditor",props:{targetLabel:{},description:{},loader:{type:Function},onSet:{type:Function},onSave:{type:Function}},setup(B,{expose:f}){const _=B,v=d(!1),y=d(!1),w=d(""),p=d([]),j=d([]),$=d("保存"),c=Ve({}),z=d(!1),s=M(()=>{const e=w.value.trim().toLowerCase();return e?p.value.filter(t=>t.key.toLowerCase().includes(e)||t.label.toLowerCase().includes(e)):p.value}),m=M(()=>p.value.reduce((e,t)=>t.locked?e:c[t.key]!==t.value?e+1:e,0)),g=M(()=>m.value>0);function T(e){return e==="Boolean"}function D(e){return e==="Int32"||e==="Int64"||e==="Int16"||e==="Byte"}function K(e){return e==="Single"||e==="Double"||e==="Decimal"}function Q(e){const t=(e??"").trim().toLowerCase();return t==="true"||t==="1"||t==="yes"}function X(e){const t=parseInt(e,10);return Number.isFinite(t)?t:0}function Y(e){const t=parseFloat(e);return Number.isFinite(t)?t:0}function I(e){return c[e.key]??e.value}function x(e,t){c[e.key]=t}function W(e){if(e.locked)return!1;const t=c[e.key];return t!==void 0&&t!==e.value}async function k(){v.value=!0;try{const e=await _.loader();p.value=e.fields,j.value=e.pathInfos??[],e.saveButtonLabel&&($.value=e.saveButtonLabel);for(const t of e.fields)c[t.key]=t.value;for(const t of Object.keys(c))e.fields.find(u=>u.key===t)||delete c[t]}catch(e){P.error(`加载${_.targetLabel}失败:${e.message}`)}finally{v.value=!1}}function Z(){for(const e of p.value)c[e.key]=e.value}async function ee(){const e=p.value.filter(r=>!r.locked&&c[r.key]!==r.value);y.value=!0;let t=0;const u=[];for(const r of e)try{await _.onSet(r.key,c[r.key]??""),t+=1}catch(L){u.push({key:r.key,reason:L.message})}if(u.length>0){y.value=!1;try{await je.confirm(`共 ${e.length} 项改动:成功 ${t},失败 ${u.length}(首项: ${u[0].key} → ${u[0].reason})。 是否仍要把已成功应用的改动持久化到磁盘?`,"部分字段写入失败",{confirmButtonText:"仍然保存",cancelButtonText:"取消",type:"warning"})}catch{P.warning(`已取消保存(${t} 项已写入内存,${u.length} 项未生效)`),await k();return}y.value=!0}try{const r=await _.onSave();P.success(`已保存到:${r.path}(应用 ${t} 项改动${u.length>0?`;${u.length} 项失败已忽略`:""})`),await k()}catch(r){P.error(`保存失败:${r.message}`)}finally{y.value=!1}}return se(()=>_.loader,()=>{k()}),ie(k),f({refresh:k}),(e,t)=>{const u=ue,r=Le,L=pe,H=de,U=fe,S=ke,te=he,J=Ee,A=Ce,ae=ge,le=we,oe=Se,ne=be;return l(),C("div",$e,[V("div",Ie,[V("p",xe,h(B.description),1),j.value.length>0?(l(),i(r,{key:0,column:1,size:"small",border:"",class:"fme-paths"},{default:o(()=>[(l(!0),C(re,null,ce(j.value,a=>(l(),i(u,{key:a.label,label:a.label},{default:o(()=>[a.value?(l(),C("code",Ne,h(a.value),1)):(l(),C("span",Pe,"("+h(a.emptyHint??"空")+")",1))]),_:2},1032,["label"]))),128))]),_:1})):F("",!0),V("div",ze,[n(H,{modelValue:w.value,"onUpdate:modelValue":t[0]||(t[0]=a=>w.value=a),placeholder:"按中文/英文键过滤",size:"small",clearable:"",class:"fme-search"},{prefix:o(()=>[n(L,null,{default:o(()=>[n(O(me))]),_:1})]),_:1},8,["modelValue"]),n(U,{size:"small",loading:v.value,onClick:k},{default:o(()=>[n(L,null,{default:o(()=>[n(O(_e))]),_:1}),t[1]||(t[1]=V("span",{class:"fme-btn-text"},"刷新",-1))]),_:1},8,["loading"]),n(U,{size:"small",type:"primary",disabled:!g.value&&!z.value,loading:y.value,onClick:ee},{default:o(()=>[n(L,null,{default:o(()=>[n(O(ve))]),_:1}),V("span",Te,h($.value)+h(g.value?`(${m.value} 项未应用)`:""),1)]),_:1},8,["disabled","loading"]),g.value?(l(),i(U,{key:0,size:"small",link:"",type:"warning",onClick:Z},{default:o(()=>[...t[2]||(t[2]=[N(" 放弃未应用的改动 ",-1)])]),_:1})):F("",!0)])]),ye((l(),i(oe,{shadow:"never",class:"fme-table-card"},{default:o(()=>[n(ae,{data:s.value,stripe:"",border:"",size:"small",height:"100%",class:"fme-table","row-key":"key"},{default:o(()=>[n(S,{label:"中文说明",prop:"label","min-width":"240","show-overflow-tooltip":""}),n(S,{label:"英文键",prop:"key",width:"240","show-overflow-tooltip":""}),n(S,{label:"类型",prop:"typeName",width:"100"}),n(S,{label:"当前值(可编辑)","min-width":"260"},{default:o(({row:a})=>[a.locked?(l(),C("span",De,h(a.value)+"(🔒 锁定)",1)):T(a.typeName)?(l(),i(te,{key:1,"model-value":Q(I(a)),"onUpdate:modelValue":b=>x(a,String(!!b))},null,8,["model-value","onUpdate:modelValue"])):D(a.typeName)?(l(),i(J,{key:2,"model-value":X(I(a)),controls:!1,step:1,precision:0,size:"small",class:"fme-input","onUpdate:modelValue":b=>x(a,String(b??0))},null,8,["model-value","onUpdate:modelValue"])):K(a.typeName)?(l(),i(J,{key:3,"model-value":Y(I(a)),controls:!1,step:.1,size:"small",class:"fme-input","onUpdate:modelValue":b=>x(a,String(b??0))},null,8,["model-value","onUpdate:modelValue"])):(l(),i(H,{key:4,"model-value":I(a),size:"small",class:"fme-input","onUpdate:modelValue":b=>x(a,b)},null,8,["model-value","onUpdate:modelValue"]))]),_:1}),n(S,{label:"状态",width:"100",align:"center"},{default:o(({row:a})=>[a.locked?(l(),i(A,{key:0,size:"small",type:"info",effect:"plain"},{default:o(()=>[...t[3]||(t[3]=[N("只读",-1)])]),_:1})):W(a)?(l(),i(A,{key:1,size:"small",type:"warning",effect:"dark"},{default:o(()=>[...t[4]||(t[4]=[N("已修改",-1)])]),_:1})):(l(),i(A,{key:2,size:"small",type:"success",effect:"plain"},{default:o(()=>[...t[5]||(t[5]=[N("同步",-1)])]),_:1}))]),_:1})]),_:1},8,["data"]),!v.value&&p.value.length===0?(l(),i(le,{key:0,description:`未发现可编辑的 [FieldMember] 字段(target: ${B.targetLabel})`},null,8,["description"])):F("",!0)]),_:1})),[[ne,v.value]])])}}}),q=G(Ue,[["__scopeId","data-v-708f3ec1"]]),Ae={class:"pp-page"},Oe=R({__name:"ProjectPropertiesView",setup(B){const f=d("project"),_=d(null),v=d(null);function y(s){f.value=s}async function w(){const s=await E.getProjectFields();return{fields:s.fields,pathInfos:[{label:"最近加载/保存的项目 JSON",value:s.lastLoadedPath,emptyHint:"尚未通过 SimpleLite 加载或保存过项目"},{label:"simple.json autoload",value:s.autoloadPath,emptyHint:"未配置"}],saveButtonLabel:"保存(写回项目 JSON)"}}function p(s,m){return E.setProjectField(s,m)}async function j(){return{path:(await E.saveProject()).path}}async function $(){const s=await E.getAppConfigFields();return{fields:s.fields,pathInfos:[{label:"保存目标",value:s.savePath,emptyHint:"simple.json"}],saveButtonLabel:"保存(写入 simple.json)"}}function c(s,m){return E.setAppConfigField(s,m)}async function z(){return{path:(await E.saveAppConfig()).path}}return(s,m)=>{const g=Be,T=Fe;return l(),C("div",Ae,[n(T,{modelValue:f.value,"onUpdate:modelValue":m[0]||(m[0]=D=>f.value=D),type:"border-card",class:"pp-tabs admin-tabs",onTabChange:y},{default:o(()=>[n(g,{label:"项目属性 (Scene.conf)",name:"project"},{default:o(()=>[f.value==="project"?(l(),i(q,{key:0,ref_key:"projectEditor",ref:_,"target-label":"项目属性",description:"对应 SimpleLite 桌面端主菜单「项目属性…」。编辑字段后点「保存」即可一次完成内存生效 + 写回项目 JSON 文件(含全部场景/车辆/路径/属性)。",loader:w,"on-set":p,"on-save":j},null,512)):F("",!0)]),_:1}),n(g,{label:"核心配置 (simple.json)",name:"app-config"},{default:o(()=>[f.value==="app-config"?(l(),i(q,{key:0,ref_key:"appConfigEditor",ref:v,"target-label":"核心配置",description:"对应 SimpleLite 桌面端主菜单「核心配置 → 编辑配置…」。修改后点「保存」即可一次完成内存生效 + 写入可执行目录下的 simple.json。",loader:$,"on-set":c,"on-save":z},null,512)):F("",!0)]),_:1})]),_:1},8,["modelValue"])])}}}),st=G(Oe,[["__scopeId","data-v-b5a5a932"]]);export{st as default}; diff --git a/MiGu.Server/wwwroot/assets/ReflectionManagerPanel-CKQWtKhJ.js b/MiGu.Server/wwwroot/assets/ReflectionManagerPanel-BZQZIz4T.js similarity index 99% rename from MiGu.Server/wwwroot/assets/ReflectionManagerPanel-CKQWtKhJ.js rename to MiGu.Server/wwwroot/assets/ReflectionManagerPanel-BZQZIz4T.js index 8c60c4a..692617f 100644 --- a/MiGu.Server/wwwroot/assets/ReflectionManagerPanel-CKQWtKhJ.js +++ b/MiGu.Server/wwwroot/assets/ReflectionManagerPanel-BZQZIz4T.js @@ -1,4 +1,4 @@ -import{aI as xe,bI as Ce,b7 as Ve,b9 as o,aC as r,bJ as a,aE as v,L as Ne,bK as Se,bA as ze,aa as Be,aH as n,ab as De,ad as Te,aG as p,bq as w,ag as Le,r as Pe,aD as _,aB as c,bt as W,am as fl,bi as Ee,ax as j,bh as f,X as m,Y,t as Fe,ak as Ue,R as yl,Q as bl,bn as gl,ai as D,bc as $e,ar as _l,K as kl,bj as ae,J as hl,ay as wl,bL as ne,F as $l,a8 as xl,z as Cl,S as Vl,C as Nl,b3 as Sl,G as zl,N as Bl,a1 as Dl,a0 as Tl,O as Ll,bg as Pl,I as El}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{r as C}from"./reflection-C0K7EJ_N.js";import{u as Fl}from"./useMapEditStream-CoKaGT-a.js";const Ul={class:"plg-header"},Al={class:"plg-title"},Il={key:0},Kl=xe({__name:"PluginListPanel",props:{visible:{type:Boolean}},emits:["changed"],setup($,{expose:ie,emit:g}){const A=$,H=g,T=j(()=>A.visible!==!1),I=f([]),L=f(!1),S=f(!0),G=f(null);async function P(){L.value=!0;try{I.value=await C.listPlugins()}catch(y){m.warning(`插件列表加载失败:${y.message}(旧版 SimpleLite 可能未带 /plugins 接口,请重启)`)}finally{L.value=!1}}async function J(y){try{await Y.confirm(`确认卸载插件 ${y.name}? +import{aI as xe,bI as Ce,b7 as Ve,b9 as o,aC as r,bJ as a,aE as v,L as Ne,bK as Se,bA as ze,aa as Be,aH as n,ab as De,ad as Te,aG as p,bq as w,ag as Le,r as Pe,aD as _,aB as c,bt as W,am as fl,bi as Ee,ax as j,bh as f,X as m,Y,t as Fe,ak as Ue,R as yl,Q as bl,bn as gl,ai as D,bc as $e,ar as _l,K as kl,bj as ae,J as hl,ay as wl,bL as ne,F as $l,a8 as xl,z as Cl,S as Vl,C as Nl,b3 as Sl,G as zl,N as Bl,a1 as Dl,a0 as Tl,O as Ll,bg as Pl,I as El}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{r as C}from"./reflection-B_glb6eT.js";import{u as Fl}from"./useMapEditStream-BgR6WvRg.js";const Ul={class:"plg-header"},Al={class:"plg-title"},Il={key:0},Kl=xe({__name:"PluginListPanel",props:{visible:{type:Boolean}},emits:["changed"],setup($,{expose:ie,emit:g}){const A=$,H=g,T=j(()=>A.visible!==!1),I=f([]),L=f(!1),S=f(!0),G=f(null);async function P(){L.value=!0;try{I.value=await C.listPlugins()}catch(y){m.warning(`插件列表加载失败:${y.message}(旧版 SimpleLite 可能未带 /plugins 接口,请重启)`)}finally{L.value=!1}}async function J(y){try{await Y.confirm(`确认卸载插件 ${y.name}? 此插件贡献了 ${y.missionTypes} 个进程类型 / ${y.carTypes} 个车/脚本类型;如果当前还有这些类型的实例存在,卸载会失败(请先在管理面板里删除)。`,"卸载插件",{type:"warning",confirmButtonText:"卸载",cancelButtonText:"取消"})}catch{return}G.value=y.name;try{const k=await C.unloadPlugin(y.name);m.success(k.message??`已卸载 ${y.name}`),H("changed"),await P()}catch(k){m.error(`卸载失败:${k.message}`)}finally{G.value=null}}return Ce(()=>A.visible,y=>{y&&P()}),Ve(()=>{T.value&&P()}),ie({refresh:P}),(y,k)=>{const E=Pe,Q=Ne,B=De,K=Te,R=Le,X=Be,u=Fe,F=ze;return T.value?(o(),r(u,{key:0,shadow:"never",class:"plugin-list-card"},{header:a(()=>[c("div",Ul,[c("span",Al,"已加载插件 ("+w(I.value.length)+")",1),n(E,{text:"",size:"small",icon:W(fl),class:"plg-collapse",onClick:k[0]||(k[0]=x=>S.value=!S.value)},{default:a(()=>[p(w(S.value?"展开":"折叠"),1)]),_:1},8,["icon"]),n(E,{size:"small",loading:L.value,icon:W(Ee),onClick:P},{default:a(()=>[...k[1]||(k[1]=[p("刷新",-1)])]),_:1},8,["loading","icon"])])]),default:a(()=>[S.value?_("",!0):(o(),v("div",Il,[!L.value&&I.value.length===0?(o(),r(Q,{key:0,description:"尚未通过 PluginManager 加载任何插件 (重启 SimpleLite 后会自动迁移现有 plugins/ 内的 dll)"})):Se((o(),r(X,{key:1,data:I.value,size:"small",stripe:"",border:"",class:"plg-table"},{default:a(()=>[n(B,{prop:"name",label:"插件名",width:"200","show-overflow-tooltip":""}),n(B,{prop:"assemblyVersion",label:"版本",width:"120"}),n(B,{label:"类型贡献",width:"200"},{default:a(({row:x})=>[n(K,{size:"small",type:"success",effect:"plain",class:"plg-tag"},{default:a(()=>[p(" 进程 "+w(x.missionTypes),1)]),_:2},1024),n(K,{size:"small",type:"primary",effect:"plain",class:"plg-tag"},{default:a(()=>[p(" 车/脚本 "+w(x.carTypes),1)]),_:2},1024),n(K,{size:"small",type:"info",effect:"plain",class:"plg-tag"},{default:a(()=>[p(" 共 "+w(x.loadedTypes)+" type ",1)]),_:2},1024)]),_:1}),n(B,{prop:"dllPath",label:"路径","min-width":"240","show-overflow-tooltip":""}),n(B,{label:"状态",width:"120"},{default:a(({row:x})=>[x.collectible?(o(),r(K,{key:0,size:"small",type:"success"},{default:a(()=>[...k[2]||(k[2]=[p("可卸载",-1)])]),_:1})):(o(),r(R,{key:1,content:"此插件被加到 default ALC(旧路径加载),重启 SimpleLite 后会自动迁移到 collectible",placement:"top"},{default:a(()=>[n(K,{size:"small",type:"warning"},{default:a(()=>[...k[3]||(k[3]=[p("不可卸载",-1)])]),_:1})]),_:1}))]),_:1}),n(B,{label:"操作",width:"100"},{default:a(({row:x})=>[n(E,{text:"",size:"small",type:"danger",disabled:!x.collectible,loading:G.value===x.name,onClick:M=>J(x)},{default:a(()=>[...k[4]||(k[4]=[p(" 卸载 ",-1)])]),_:1},8,["disabled","loading","onClick"])]),_:1})]),_:1},8,["data"])),[[F,L.value]])]))]),_:1})):_("",!0)}}}),Rl=Ue(Kl,[["__scopeId","data-v-d89a2aa6"]]),Ml={class:"ref-mgr-page"},Ol={class:"ref-mgr-header"},jl={class:"ref-mgr-title"},Wl={class:"ref-mgr-actions"},Gl={class:"ref-type-asm"},Xl={class:"ref-mgr-body"},Yl={class:"detail-header"},Zl={class:"detail-title"},ql={class:"detail-id"},Hl={class:"detail-name"},Jl={class:"detail-actions"},Ql={class:"field-section"},et={class:"field-section-title"},lt={key:1,class:"field-empty"},tt={class:"field-section"},at={class:"field-section-title"},nt={class:"dyn-row"},ot={key:1,class:"field-empty"},st={key:0,class:"field-section"},it={class:"field-section-title"},ut=["title"],dt={class:"field-section"},rt={class:"field-section-title"},ct={key:0,class:"field-empty"},mt={key:0,class:"method-grid script-method-grid"},pt=["disabled"],vt={key:0,class:"method-btn-spin"},ft={key:1,class:"method-btn-icon"},yt=["disabled"],bt={key:0,class:"method-btn-spin"},gt={key:1,class:"method-btn-icon"},_t={key:1,class:"field-empty"},kt={key:2,class:"method-grid"},ht=["disabled","onClick"],wt={key:0,class:"method-btn-spin"},$t={key:1,class:"method-btn-icon"},xt={class:"method-btn-label"},Ct={key:2,class:"method-btn-tag"},Vt=xe({__name:"ReflectionManagerPanel",props:{kind:{},kindLabel:{},title:{},emptyText:{},disableCreate:{type:Boolean},disableDelete:{type:Boolean},showSummaryColumn:{type:Boolean},summaryLabel:{},showStatusColumn:{type:Boolean},statusLabel:{},showScriptActions:{type:Boolean}},setup($,{expose:ie}){const g=$,A=f(!1),H=f(!1),T=f(null),I=f(null),L=f(null),S=f(null),G=f(!1),P=f(!1),J=f(""),y=f(null),k=f(null),E=f(!1),Q=f(""),B=f(""),K=f(null),R=f([]),X=f([]),u=f(null),F=f([]),x=f([]),M=f([]),ue=j(()=>F.value.filter(l=>l.source!=="dynamic")),de=j(()=>F.value.filter(l=>l.source==="dynamic")),re=j(()=>!!g.showScriptActions&&g.kind==="script"&&!!u.value),Ae=j(()=>M.value.length+(re.value?2:0)),Ie=j(()=>{let l=110;return g.showScriptActions&&g.kind==="script"&&(l+=130),g.disableDelete||(l+=60),l}),pe=j(()=>{const l=J.value.trim().toLowerCase();return l?R.value.filter(e=>String(e.id).includes(l)||(e.name??"").toLowerCase().includes(l)||(e.typeName??"").toLowerCase().includes(l)):R.value}),Ke=new Set(["process","mission","car","vehicle"]),Re=j(()=>Ke.has(g.kind));async function z(){A.value=!0;try{const[l,e]=await Promise.all([C.listObjects(g.kind),C.listCreatableTypes(g.kind).catch(()=>[])]);R.value=l,X.value=e,u.value&&!R.value.find(i=>i.id===u.value.id)&&(u.value=null,F.value=[],M.value=[],x.value=[])}catch(l){m.error(`加载 ${g.kindLabel} 失败:${l.message}`)}finally{A.value=!1}}async function U(l){if(u.value=l,F.value=[],M.value=[],x.value=[],!!l){H.value=!0;try{const e=l.subKind??g.kind,i=await C.getBundle(e,l.id);i.fieldList&&i.fieldList.length>0?F.value=i.fieldList.map(d=>({...d})):F.value=Object.entries(i.fields??{}).map(([d,b])=>({key:d,value:String(b),source:"dynamic"})),M.value=i.methods??[],x.value=i.status??[]}catch(e){m.error(`加载详情失败:${e.message}`)}finally{H.value=!1}}}function ee(l){return l?.subKind??g.kind}async function Me(){G.value=!0;try{const l=await C.reloadPlugins();m.success(`已扫描 plugins/ 目录:发现 ${l.totalDlls} dll,新加载 ${l.newlyLoaded};进程类型 ${l.missionTypes}、车辆/脚本类型 ${l.carTypes}`),await z(),K.value?.refresh()}catch(l){m.error(`刷新插件失败:${l.message}`)}finally{G.value=!1}}const le=f(!1),V=f(""),s=Pl({name:"",layer:"",x:0,y:0,z:0,siteA:0,siteB:0,trackKind:"line",imagePath:"",modelPath:"",content:"Text"});function Oe(l){switch(l){case"site":return"站点";case"track":return"路径";case"image":return"图片";case"text":return"文本";case"model":return"模型";case"car":return"车辆";default:return l}}function ve(l){const e=l??(g.kind==="special"?"image":g.kind==="scene"?"site":g.kind==="vehicle"?"car":g.kind);V.value=e,s.name="",s.layer="",s.x=0,s.y=0,s.z=0,s.siteA=0,s.siteB=0,s.trackKind="line",s.imagePath="",s.modelPath="",s.content="Text",le.value=!0}ie({openCreateForm:ve,refresh:z});async function fe(){P.value=!0;try{const l=V.value;let e=l;const i={name:s.name||void 0,layer:s.layer||void 0};l==="site"?(i.x=s.x,i.y=s.y,i.z=s.z):l==="track"?(e=s.trackKind==="line"?"track":s.trackKind,i.siteA=s.siteA,i.siteB=s.siteB):l==="image"?(i.x=s.x,i.y=s.y,i.imagePath=s.imagePath):l==="text"?(i.x=s.x,i.y=s.y,i.content=s.content):l==="model"?(i.x=s.x,i.y=s.y,i.modelPath=s.modelPath):l==="car"&&(i.x=s.x,i.y=s.y);const d=await C.createObject(e,"",i);m.success(`已创建 ${d.typeName??l} #${d.id}`),le.value=!1,await z();const b=R.value.find(oe=>oe.id===d.id);b&&await U(b)}catch(l){m.error(`创建失败:${l.message}`)}finally{P.value=!1}}async function je(l){try{let e;try{e=(await Y.prompt(`为新${g.kindLabel}指定名称(可空,留空使用默认名)`,`新建${g.kindLabel}`,{inputValue:"",confirmButtonText:"创建",cancelButtonText:"取消"})).value||void 0}catch{return}const i=await C.createObject(g.kind,l,{name:e});m.success(`已创建 ${i.typeName} #${i.id}`),await z();const d=R.value.find(b=>b.id===i.id);d&&await U(d)}catch(e){m.error(`创建失败:${e.message}`)}}async function We(l){try{await Y.confirm(`确认删除 ${l.typeName} #${l.id} (${l.name})?该操作无法撤销。`,`删除${g.kindLabel}`,{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"})}catch{return}I.value=l.id;try{const e=ee(l);await C.deleteObject(e,l.id),m.success(`已删除 ${l.typeName} #${l.id}`),u.value?.id===l.id&&(u.value=null),await z()}catch(e){m.error(`删除失败:${e.message}`)}finally{I.value=null}}async function Z(l,e){if(u.value){S.value=l;try{const i=ee(u.value);await C.setField(i,u.value.id,l,e),m.success(`已更新 ${l}`)}catch(i){m.error(`更新 ${l} 失败:${i.message}`),await U(u.value)}finally{S.value=null}}}async function Ge(l){if(u.value){try{await Y.confirm(`确认删除动态字段 "${l}"?`,"删除字段",{type:"warning",confirmButtonText:"删除",cancelButtonText:"取消"})}catch{return}L.value=l;try{const e=ee(u.value);await C.deleteField(e,u.value.id,l),m.success(`已删除字段 ${l}`),await U(u.value)}catch(e){m.error(`删除字段失败:${e.message}`)}finally{L.value=null}}}async function Xe(){if(!u.value)return;let l="";try{l=(await Y.prompt("字段名(key)","添加动态字段",{inputValidator:d=>!!d&&/^[A-Za-z_][A-Za-z0-9_\-]*$/.test(d)||"只允许字母/数字/下划线/横线,且首字符非数字",confirmButtonText:"下一步",cancelButtonText:"取消"})).value}catch{return}let e="";try{e=(await Y.prompt(`字段 "${l}" 的初始值(可空)`,"添加动态字段",{inputValue:"",confirmButtonText:"保存",cancelButtonText:"取消"})).value}catch{return}if(F.value.find(i=>i.key===l)){m.warning(`字段 ${l} 已存在,请直接编辑`);return}await Z(l,e),await U(u.value)}async function ye(l){if(l)try{const e=ee(l);await C.setSelection(e,l.id),m.success(`已在 3D 视口高亮 ${l.typeName??e} #${l.id}`)}catch(e){m.error(`高亮失败:${e.message}`)}}async function be(l){if(l){y.value="source",k.value=l.id;try{const e=await C.getScriptSource(l.id);Q.value=`脚本 ${e.name||e.typeName}(#${e.id}) 内容`,B.value=e.script||"(无脚本)",E.value=!0}catch(e){m.error(`查看脚本失败:${e.message}`)}finally{y.value=null,k.value=null}}}async function ge(l){if(l){y.value="status",k.value=l.id;try{const e=await C.getScriptExceptionStatus(l.id);Q.value=`脚本 ${e.name||e.typeName}(#${e.id}) 异常状态`,B.value=e.report||"(无异常状态)",E.value=!0}catch(e){m.error(`查看异常状态失败:${e.message}`)}finally{y.value=null,k.value=null}}}function Ye(){u.value&&be(u.value)}function Ze(){u.value&&ge(u.value)}function _e(l,e){return k.value===l.id&&y.value===e}async function qe(){try{await navigator.clipboard.writeText(B.value),m.success("已复制到剪贴板")}catch{m.warning("复制失败,请手动选择文本复制")}}async function He(l){if(!u.value)return;const e=ee(u.value);if(l.hasParams){const i={};for(const d of l.params)try{const b=await Y.prompt(`参数 ${d.name} (${d.typeName})`+(d.hasDefault?` 默认: ${d.defaultValue}`:""),`调用 ${l.label??l.methodName}`,{inputValue:d.defaultValue??""});i[d.name]=b.value}catch{return}T.value=l.methodName;try{const d=await C.execute(e,u.value.id,l.methodName,i);m.success(`${l.label??l.methodName} 完成${d.returnValue?`:${d.returnValue}`:""}`),await U(u.value)}catch(d){m.error(`执行失败:${d.message}`)}finally{T.value=null}return}T.value=l.methodName;try{const i=await C.execute(e,u.value.id,l.methodName);m.success(`${l.label??l.methodName} 完成${i.returnValue?`:${i.returnValue}`:""}`),await U(u.value)}catch(i){m.error(`执行失败:${i.message}`)}finally{T.value=null}}function Je(l){return l.typeName==="Boolean"?!0:l.value==="true"||l.value==="false"||l.value==="True"||l.value==="False"}function Qe(l){return l.key==="color"||l.key==="textColor"?!0:/^#[0-9a-fA-F]{3,8}$/.test(l.value)}function el(l){return l.typeName?["Int32","Int64","Single","Double","Decimal","UInt32","UInt64"].includes(l.typeName):!1}function ll(l){return l==="true"||l==="True"||l==="1"}function tl(l){if(l==null||l==="")return;const e=Number(l);return Number.isFinite(e)?e:void 0}function al(l){const e=l.typeName?.trim();return e&&e!=="String"?`${l.key} (${e})`:l.key}function nl(l){const e=(l.value??"").trim();return e||(l.typeName?`(空 · ${l.typeName})`:"(空)")}function ol(l){if((l.typeName??"").endsWith("[]"))return!0;const i=(l.value??"").trim();return i.startsWith("[")||i.startsWith("{")}return Fl({onObjectCreated:()=>z(),onObjectDeleted:()=>z(),onObjectPatched:()=>{u.value&&U(u.value)},onObjectBatchChanged:()=>z()}),Ce(()=>g.kind,z),Ve(z),(l,e)=>{const i=bl,d=yl,b=Pe,oe=hl,sl=kl,il=El,te=Le,q=De,ul=Be,ke=Ne,he=Fe,dl=Te,rl=xl,cl=Cl,O=Vl,ce=$l,me=Nl,se=Tl,ml=Dl,N=Ll,pl=Bl,we=zl,vl=ze;return o(),v("div",Ml,[n(Rl,{ref_key:"pluginPanelRef",ref:K,visible:!0,onChanged:z},null,512),c("div",Ol,[c("h2",jl,w($.title),1),c("div",Wl,[n(d,{modelValue:J.value,"onUpdate:modelValue":e[0]||(e[0]=t=>J.value=t),placeholder:`搜索 ${$.kindLabel} (id / 名称 / 类型)`,size:"small",clearable:"",class:"ref-mgr-search"},{prefix:a(()=>[n(i,null,{default:a(()=>[n(W(gl))]),_:1})]),_:1},8,["modelValue","placeholder"]),$.disableCreate?_("",!0):(o(),v(D,{key:0},[Re.value?(o(),r(il,{key:0,trigger:"click",disabled:X.value.length===0,onCommand:je},{dropdown:a(()=>[n(sl,null,{default:a(()=>[(o(!0),v(D,null,ae(X.value,t=>(o(),r(oe,{key:t.typeName,command:t.typeName},{default:a(()=>[p(w(t.label)+" ",1),c("span",Gl,"· "+w(t.shortName),1)]),_:2},1032,["command"]))),128)),X.value.length===0?(o(),r(oe,{key:0,disabled:""},{default:a(()=>[...e[20]||(e[20]=[p(" 未发现可创建的子类型 ",-1)])]),_:1})):_("",!0)]),_:1})]),default:a(()=>[n(b,{type:"primary",size:"small",icon:W($e),disabled:X.value.length===0},{default:a(()=>[p(" 新建"+w($.kindLabel),1),n(i,{class:"el-icon--right"},{default:a(()=>[n(W(_l))]),_:1})]),_:1},8,["icon","disabled"])]),_:1},8,["disabled"])):(o(),r(b,{key:1,type:"primary",size:"small",icon:W($e),onClick:e[1]||(e[1]=t=>ve())},{default:a(()=>[p(" 新建"+w($.kindLabel),1)]),_:1},8,["icon"]))],64)),n(te,{content:"重新扫描 ./plugins 目录加载新增 .dll,并重建可创建类型列表",placement:"bottom"},{default:a(()=>[n(b,{size:"small",loading:G.value,icon:W(wl),onClick:Me},{default:a(()=>[...e[21]||(e[21]=[p(" 刷新插件 ",-1)])]),_:1},8,["loading","icon"])]),_:1}),n(b,{size:"small",loading:A.value,icon:W(Ee),onClick:z},{default:a(()=>[...e[22]||(e[22]=[p("刷新",-1)])]),_:1},8,["loading","icon"])])]),c("div",Xl,[n(he,{shadow:"never",class:"ref-mgr-list-card"},{default:a(()=>[Se((o(),r(ul,{data:pe.value,stripe:"",border:"",size:"small","highlight-current-row":"",class:"ref-mgr-table",onCurrentChange:U},{default:a(()=>[n(q,{prop:"id",label:"ID",width:"70"}),n(q,{prop:"name",label:"名称","min-width":"160"}),n(q,{prop:"typeName",label:"类型",width:"160","show-overflow-tooltip":""}),$.showSummaryColumn?(o(),r(q,{key:0,prop:"summary",label:$.summaryLabel??"概况","min-width":"160","show-overflow-tooltip":""},null,8,["label"])):_("",!0),$.showStatusColumn?(o(),r(q,{key:1,prop:"status",label:$.statusLabel??"状态",width:"120","show-overflow-tooltip":""},null,8,["label"])):_("",!0),n(q,{label:"操作",width:Ie.value},{default:a(({row:t})=>[n(b,{text:"",size:"small",onClick:ne(h=>ye(t),["stop"])},{default:a(()=>[...e[23]||(e[23]=[p(" 3D 高亮 ",-1)])]),_:1},8,["onClick"]),$.showScriptActions&&$.kind==="script"?(o(),v(D,{key:0},[n(b,{text:"",size:"small",loading:_e(t,"source"),disabled:y.value!==null,onClick:ne(h=>be(t),["stop"])},{default:a(()=>[...e[24]||(e[24]=[p(" 查看脚本 ",-1)])]),_:1},8,["loading","disabled","onClick"]),n(b,{text:"",size:"small",loading:_e(t,"status"),disabled:y.value!==null,onClick:ne(h=>ge(t),["stop"])},{default:a(()=>[...e[25]||(e[25]=[p(" 异常状态 ",-1)])]),_:1},8,["loading","disabled","onClick"])],64)):_("",!0),$.disableDelete?_("",!0):(o(),r(b,{key:1,text:"",size:"small",type:"danger",loading:I.value===t.id,onClick:ne(h=>We(t),["stop"])},{default:a(()=>[...e[26]||(e[26]=[p(" 删除 ",-1)])]),_:1},8,["loading","onClick"]))]),_:1},8,["width"])]),_:1},8,["data"])),[[vl,A.value]]),!A.value&&pe.value.length===0?(o(),r(ke,{key:0,description:$.emptyText},null,8,["description"])):_("",!0)]),_:1}),n(he,{shadow:"never",class:"ref-mgr-detail-card"},{default:a(()=>[u.value?(o(),v(D,{key:1},[c("div",Yl,[c("div",Zl,[n(dl,{size:"small",type:"info"},{default:a(()=>[p(w(u.value.typeName),1)]),_:1}),c("span",ql,"#"+w(u.value.id),1),c("span",Hl,w(u.value.name),1)]),c("div",Jl,[c("button",{class:"header-action-btn",onClick:e[2]||(e[2]=t=>ye(u.value))},"在 3D 中高亮")])]),c("div",Ql,[c("div",et,"强类型字段 ("+w(ue.value.length)+")",1),ue.value.length>0?(o(),r(me,{key:0,column:2,border:"",size:"small"},{default:a(()=>[(o(!0),v(D,null,ae(ue.value,t=>(o(),r(ce,{key:t.key,label:t.key,"label-style":t.locked?{color:"#aaa"}:void 0},{default:a(()=>[Je(t)?(o(),r(rl,{key:0,"model-value":ll(t.value),disabled:!!t.locked||S.value===t.key,size:"small",onChange:h=>Z(t.key,h?"true":"false")},null,8,["model-value","disabled","onChange"])):Qe(t)?(o(),r(cl,{key:1,"model-value":t.value||"#ffffff",disabled:!!t.locked||S.value===t.key,"show-alpha":"",size:"small",onChange:h=>Z(t.key,h??"")},null,8,["model-value","disabled","onChange"])):el(t)?(o(),r(O,{key:2,"model-value":tl(t.value),controls:!1,disabled:!!t.locked||S.value===t.key,size:"small",class:"field-num",onChange:h=>Z(t.key,h==null?"":String(h))},null,8,["model-value","disabled","onChange"])):(o(),r(d,{key:3,modelValue:t.value,"onUpdate:modelValue":h=>t.value=h,size:"small",disabled:!!t.locked||S.value===t.key,onChange:h=>Z(t.key,h)},null,8,["modelValue","onUpdate:modelValue","disabled","onChange"]))]),_:2},1032,["label","label-style"]))),128))]),_:1})):(o(),v("div",lt,"该对象未声明任何 [FieldMember]"))]),c("div",tt,[c("div",at,[c("span",null,"动态字段 ("+w(de.value.length)+")",1),c("button",{class:"add-field-btn",onClick:Xe},"+ 添加字段")]),de.value.length>0?(o(),r(me,{key:0,column:1,border:"",size:"small"},{default:a(()=>[(o(!0),v(D,null,ae(de.value,t=>(o(),r(ce,{key:t.key,label:t.key},{default:a(()=>[c("div",nt,[n(d,{modelValue:t.value,"onUpdate:modelValue":h=>t.value=h,size:"small",disabled:S.value===t.key,onChange:h=>Z(t.key,h)},null,8,["modelValue","onUpdate:modelValue","disabled","onChange"]),n(te,{content:"删除该字段",placement:"top"},{default:a(()=>[n(b,{size:"small",text:"",type:"danger",loading:L.value===t.key,onClick:h=>Ge(t.key)},{default:a(()=>[...e[27]||(e[27]=[p(" 删除 ",-1)])]),_:1},8,["loading","onClick"])]),_:2},1024)])]),_:2},1032,["label"]))),128))]),_:1})):(o(),v("div",ot,"尚无动态字段;点击右上角「+ 添加字段」"))]),x.value.length>0?(o(),v("div",st,[c("div",it,"运行状态 (只读, "+w(x.value.length)+")",1),n(me,{column:1,border:"",size:"small"},{default:a(()=>[(o(!0),v(D,null,ae(x.value,t=>(o(),r(ce,{key:t.key,label:al(t)},{default:a(()=>[c("span",{class:Sl(["status-value",{"status-value--array":ol(t)}]),title:t.typeName},w(nl(t)),11,ut)]),_:2},1032,["label"]))),128))]),_:1})])):_("",!0),c("div",dt,[c("div",rt,"动作 / 方法 ("+w(Ae.value)+")",1),H.value?(o(),v("div",ct,"加载方法中…")):(o(),v(D,{key:1},[re.value?(o(),v("div",mt,[n(te,{content:"弹窗展示当前 CarProgram 的完整 script 内容",placement:"top"},{default:a(()=>[c("button",{class:"method-btn",disabled:y.value!==null,onClick:Ye},[y.value==="source"?(o(),v("span",vt,"⟳")):(o(),v("span",ft,"▶")),e[28]||(e[28]=c("span",{class:"method-btn-label"},"查看脚本",-1))],8,pt)]),_:1}),n(te,{content:"弹窗展示 state、exception、notifies 等异常状态报告",placement:"top"},{default:a(()=>[c("button",{class:"method-btn",disabled:y.value!==null,onClick:Ze},[y.value==="status"?(o(),v("span",bt,"⟳")):(o(),v("span",gt,"▶")),e[29]||(e[29]=c("span",{class:"method-btn-label"},"查看异常状态",-1))],8,yt)]),_:1})])):_("",!0),M.value.length===0&&!re.value?(o(),v("div",_t,"该类型未暴露 [MethodMember]")):M.value.length>0?(o(),v("div",kt,[(o(!0),v(D,null,ae(M.value,t=>(o(),r(te,{key:t.methodName,content:t.description??t.hint??"",disabled:!t.description&&!t.hint,placement:"top"},{default:a(()=>[c("button",{class:"method-btn",disabled:T.value===t.methodName,onClick:h=>He(t)},[T.value===t.methodName?(o(),v("span",wt,"⟳")):(o(),v("span",$t,"▶")),c("span",xt,w(t.label??t.methodName),1),t.hasParams?(o(),v("span",Ct,"带参")):_("",!0)],8,ht)]),_:2},1032,["content","disabled"]))),128))])):_("",!0)],64))])],64)):(o(),r(ke,{key:0,description:"左侧选中一行查看 / 编辑详情"}))]),_:1})]),n(we,{modelValue:le.value,"onUpdate:modelValue":e[17]||(e[17]=t=>le.value=t),title:`新建 ${$.kindLabel}${V.value?" · "+Oe(V.value):""}`,width:"480px","append-to-body":""},{footer:a(()=>[n(b,{onClick:e[16]||(e[16]=t=>le.value=!1)},{default:a(()=>[...e[34]||(e[34]=[p("取消",-1)])]),_:1}),n(b,{type:"primary",loading:P.value,onClick:fe},{default:a(()=>[...e[35]||(e[35]=[p("创建",-1)])]),_:1},8,["loading"])]),default:a(()=>[n(pl,{model:s,size:"small","label-width":"100px",onSubmit:ne(fe,["prevent"])},{default:a(()=>[V.value==="track"?(o(),r(N,{key:0,label:"路径类型"},{default:a(()=>[n(ml,{modelValue:s.trackKind,"onUpdate:modelValue":e[3]||(e[3]=t=>s.trackKind=t)},{default:a(()=>[n(se,{value:"line"},{default:a(()=>[...e[30]||(e[30]=[p("直线",-1)])]),_:1}),n(se,{value:"bezier"},{default:a(()=>[...e[31]||(e[31]=[p("贝塞尔",-1)])]),_:1}),n(se,{value:"arc"},{default:a(()=>[...e[32]||(e[32]=[p("圆弧",-1)])]),_:1}),n(se,{value:"nurbs"},{default:a(()=>[...e[33]||(e[33]=[p("NURBS",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1})):_("",!0),n(N,{label:"名称"},{default:a(()=>[n(d,{modelValue:s.name,"onUpdate:modelValue":e[4]||(e[4]=t=>s.name=t),placeholder:"(可空,留空走默认名)"},null,8,["modelValue"])]),_:1}),n(N,{label:"图层"},{default:a(()=>[n(d,{modelValue:s.layer,"onUpdate:modelValue":e[5]||(e[5]=t=>s.layer=t),placeholder:"g / main / ..."},null,8,["modelValue"])]),_:1}),["site","image","text","model"].includes(V.value)?(o(),v(D,{key:1},[n(N,{label:"X (mm)"},{default:a(()=>[n(O,{modelValue:s.x,"onUpdate:modelValue":e[6]||(e[6]=t=>s.x=t),controls:!1},null,8,["modelValue"])]),_:1}),n(N,{label:"Y (mm)"},{default:a(()=>[n(O,{modelValue:s.y,"onUpdate:modelValue":e[7]||(e[7]=t=>s.y=t),controls:!1},null,8,["modelValue"])]),_:1}),V.value==="site"?(o(),r(N,{key:0,label:"Z (mm)"},{default:a(()=>[n(O,{modelValue:s.z,"onUpdate:modelValue":e[8]||(e[8]=t=>s.z=t),controls:!1},null,8,["modelValue"])]),_:1})):_("",!0)],64)):_("",!0),V.value==="track"?(o(),v(D,{key:2},[n(N,{label:"起点站 ID"},{default:a(()=>[n(O,{modelValue:s.siteA,"onUpdate:modelValue":e[9]||(e[9]=t=>s.siteA=t),controls:!1,min:1},null,8,["modelValue"])]),_:1}),n(N,{label:"终点站 ID"},{default:a(()=>[n(O,{modelValue:s.siteB,"onUpdate:modelValue":e[10]||(e[10]=t=>s.siteB=t),controls:!1,min:1},null,8,["modelValue"])]),_:1})],64)):_("",!0),V.value==="image"?(o(),r(N,{key:3,label:"图片路径"},{default:a(()=>[n(d,{modelValue:s.imagePath,"onUpdate:modelValue":e[11]||(e[11]=t=>s.imagePath=t),placeholder:"/uploads/xxxxx.png"},null,8,["modelValue"])]),_:1})):_("",!0),V.value==="model"?(o(),r(N,{key:4,label:"模型路径"},{default:a(()=>[n(d,{modelValue:s.modelPath,"onUpdate:modelValue":e[12]||(e[12]=t=>s.modelPath=t),placeholder:"/uploads/xxxxx.glb"},null,8,["modelValue"])]),_:1})):_("",!0),V.value==="text"?(o(),r(N,{key:5,label:"文本"},{default:a(()=>[n(d,{modelValue:s.content,"onUpdate:modelValue":e[13]||(e[13]=t=>s.content=t),placeholder:"Text"},null,8,["modelValue"])]),_:1})):_("",!0),V.value==="car"?(o(),r(N,{key:6,label:"X (mm)"},{default:a(()=>[n(O,{modelValue:s.x,"onUpdate:modelValue":e[14]||(e[14]=t=>s.x=t),controls:!1},null,8,["modelValue"])]),_:1})):_("",!0),V.value==="car"?(o(),r(N,{key:7,label:"Y (mm)"},{default:a(()=>[n(O,{modelValue:s.y,"onUpdate:modelValue":e[15]||(e[15]=t=>s.y=t),controls:!1},null,8,["modelValue"])]),_:1})):_("",!0)]),_:1},8,["model"])]),_:1},8,["modelValue","title"]),n(we,{modelValue:E.value,"onUpdate:modelValue":e[19]||(e[19]=t=>E.value=t),title:Q.value,width:"720px","append-to-body":""},{footer:a(()=>[n(b,{onClick:qe},{default:a(()=>[...e[36]||(e[36]=[p("复制",-1)])]),_:1}),n(b,{type:"primary",onClick:e[18]||(e[18]=t=>E.value=!1)},{default:a(()=>[...e[37]||(e[37]=[p("关闭",-1)])]),_:1})]),default:a(()=>[n(d,{"model-value":B.value,type:"textarea",autosize:{minRows:16,maxRows:26},readonly:"",class:"script-dialog-textarea"},null,8,["model-value"])]),_:1},8,["modelValue","title"])])}}}),Ht=Ue(Vt,[["__scopeId","data-v-ddd8ee18"]]);export{Ht as R}; diff --git a/MiGu.Server/wwwroot/assets/RoutingPolicyView-EphbUSUM.js b/MiGu.Server/wwwroot/assets/RoutingPolicyView-vyV201zY.js similarity index 84% rename from MiGu.Server/wwwroot/assets/RoutingPolicyView-EphbUSUM.js rename to MiGu.Server/wwwroot/assets/RoutingPolicyView-vyV201zY.js index 16eeb69..1ecc9e8 100644 --- a/MiGu.Server/wwwroot/assets/RoutingPolicyView-EphbUSUM.js +++ b/MiGu.Server/wwwroot/assets/RoutingPolicyView-vyV201zY.js @@ -1 +1 @@ -import{aI as f,aC as w,bJ as t,bt as h,b9 as g,aH as e,N as v,O as E,a4 as I,Z as k,aa as x,ab as z,S as C,f as U}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as V}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const X=f({__name:"RoutingPolicyView",setup(D){function _(r){return Object.entries(r).map(([p,a])=>({k:p,v:a}))}return(r,p)=>{const a=k,u=I,m=E,o=z,d=C,n=x,c=v;return g(),w(V,{section:"routing",title:"路径规划策略",description:"算法选择、权重、避障规则、区域限速(RoutingPolicy)",defaults:h(U)},{default:t(({payload:l,update:s})=>[e(c,{"label-width":"140px",model:l},{default:t(()=>[e(m,{label:"算法"},{default:t(()=>[e(u,{"model-value":l.algorithm,"onUpdate:modelValue":i=>s({...l,algorithm:i})},{default:t(()=>[e(a,{label:"Dijkstra",value:"dijkstra"}),e(a,{label:"A*",value:"astar"}),e(a,{label:"自定义",value:"custom"})]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(m,{label:"权重"},{default:t(()=>[e(n,{data:_(l.weights),size:"small"},{default:t(()=>[e(o,{label:"维度",prop:"k",width:"140"}),e(o,{label:"权重"},{default:t(i=>[e(d,{"model-value":i.row.v,min:0,max:10,step:.1,"onUpdate:modelValue":b=>s({...l,weights:{...l.weights,[i.row.k]:b??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["data"])]),_:2},1024),e(m,{label:"避障规则"},{default:t(()=>[e(n,{data:l.avoidance,size:"small"},{default:t(()=>[e(o,{label:"ID",prop:"id",width:"100"}),e(o,{label:"区域 ID",prop:"zoneId",width:"140"}),e(o,{label:"规则",prop:"rule"})]),_:1},8,["data"])]),_:2},1024),e(m,{label:"区域限速"},{default:t(()=>[e(n,{data:l.zoneSpeedLimits,size:"small"},{default:t(()=>[e(o,{label:"区域",prop:"zoneId",width:"140"}),e(o,{label:"最大速度 (m/s)",prop:"maxSpeedMps"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{X as default}; +import{aI as f,aC as w,bJ as t,bt as h,b9 as g,aH as e,N as v,O as E,a4 as I,Z as k,aa as x,ab as z,S as C,f as U}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as V}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const X=f({__name:"RoutingPolicyView",setup(D){function _(r){return Object.entries(r).map(([p,a])=>({k:p,v:a}))}return(r,p)=>{const a=k,u=I,m=E,o=z,d=C,n=x,c=v;return g(),w(V,{section:"routing",title:"路径规划策略",description:"算法选择、权重、避障规则、区域限速(RoutingPolicy)",defaults:h(U)},{default:t(({payload:l,update:s})=>[e(c,{"label-width":"140px",model:l},{default:t(()=>[e(m,{label:"算法"},{default:t(()=>[e(u,{"model-value":l.algorithm,"onUpdate:modelValue":i=>s({...l,algorithm:i})},{default:t(()=>[e(a,{label:"Dijkstra",value:"dijkstra"}),e(a,{label:"A*",value:"astar"}),e(a,{label:"自定义",value:"custom"})]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(m,{label:"权重"},{default:t(()=>[e(n,{data:_(l.weights),size:"small"},{default:t(()=>[e(o,{label:"维度",prop:"k",width:"140"}),e(o,{label:"权重"},{default:t(i=>[e(d,{"model-value":i.row.v,min:0,max:10,step:.1,"onUpdate:modelValue":b=>s({...l,weights:{...l.weights,[i.row.k]:b??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["data"])]),_:2},1024),e(m,{label:"避障规则"},{default:t(()=>[e(n,{data:l.avoidance,size:"small"},{default:t(()=>[e(o,{label:"ID",prop:"id",width:"100"}),e(o,{label:"区域 ID",prop:"zoneId",width:"140"}),e(o,{label:"规则",prop:"rule"})]),_:1},8,["data"])]),_:2},1024),e(m,{label:"区域限速"},{default:t(()=>[e(n,{data:l.zoneSpeedLimits,size:"small"},{default:t(()=>[e(o,{label:"区域",prop:"zoneId",width:"140"}),e(o,{label:"最大速度 (m/s)",prop:"maxSpeedMps"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{X as default}; diff --git a/MiGu.Server/wwwroot/assets/ScenarioTemplateView-2tn-jb3L.js b/MiGu.Server/wwwroot/assets/ScenarioTemplateView-CmTU4kEH.js similarity index 84% rename from MiGu.Server/wwwroot/assets/ScenarioTemplateView-2tn-jb3L.js rename to MiGu.Server/wwwroot/assets/ScenarioTemplateView-CmTU4kEH.js index 19c52bf..99f6ed4 100644 --- a/MiGu.Server/wwwroot/assets/ScenarioTemplateView-2tn-jb3L.js +++ b/MiGu.Server/wwwroot/assets/ScenarioTemplateView-CmTU4kEH.js @@ -1 +1 @@ -import{aI as b,aC as _,bJ as e,bt as C,b9 as n,aH as t,a2 as E,aE as g,ai as v,bj as w,w as S,t as h,aB as r,bq as a,ad as k,aG as o,H as D,C as P,F as V,g as B,ak as T}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as x}from"./ConfigPageBase-CT6BdvCe.js";/* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const I={class:"tpl-title"},L={class:"tpl-meta"},N={class:"tpl-baseline"},F=b({__name:"ScenarioTemplateView",setup(R){return(y,z)=>{const c=k,d=h,m=S,p=E,f=D,l=V,u=P;return n(),_(x,{section:"scenario",title:"业务场景模板化",description:"SPS / Pack / 环线 / 点对点;DSL/低代码扩展(ScenarioTemplateConfig)",defaults:C(B)},{default:e(({payload:s})=>[t(p,{gutter:12},{default:e(()=>[(n(!0),g(v,null,w(s.templates,i=>(n(),_(m,{key:i.id,span:6},{default:e(()=>[t(d,{shadow:"hover",class:"tpl-card"},{default:e(()=>[r("div",I,a(i.name),1),r("div",L,[t(c,{size:"small"},{default:e(()=>[o(a(i.category),1)]),_:2},1024),t(c,{size:"small",type:"info"},{default:e(()=>[o("v"+a(i.version),1)]),_:2},1024)]),r("pre",N,a(i.baselineJson||"{}"),1)]),_:2},1024)]),_:2},1024))),128))]),_:2},1024),t(f),t(u,{column:2,border:""},{default:e(()=>[t(l,{label:"DSL 启用"},{default:e(()=>[o(a(s.dslPolicy.enabled?"是":"否"),1)]),_:2},1024),t(l,{label:"Schema 版本"},{default:e(()=>[o(a(s.dslPolicy.schemaVersion),1)]),_:2},1024),t(l,{label:"低代码"},{default:e(()=>[o(a(s.lowCode.enabled?"启用":"关闭"),1)]),_:2},1024),t(l,{label:"编辑器"},{default:e(()=>[o(a(s.lowCode.editor),1)]),_:2},1024),t(l,{label:"保留版本"},{default:e(()=>[o(a(s.versionPolicy.keepVersions),1)]),_:2},1024),t(l,{label:"允许回滚"},{default:e(()=>[o(a(s.versionPolicy.allowRollback?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}}),Y=T(F,[["__scopeId","data-v-4faf66a8"]]);export{Y as default}; +import{aI as b,aC as _,bJ as e,bt as C,b9 as n,aH as t,a2 as E,aE as g,ai as v,bj as w,w as S,t as h,aB as r,bq as a,ad as k,aG as o,H as D,C as P,F as V,g as B,ak as T}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as x}from"./ConfigPageBase-MHa7yfOO.js";/* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const I={class:"tpl-title"},L={class:"tpl-meta"},N={class:"tpl-baseline"},F=b({__name:"ScenarioTemplateView",setup(R){return(y,z)=>{const c=k,d=h,m=S,p=E,f=D,l=V,u=P;return n(),_(x,{section:"scenario",title:"业务场景模板化",description:"SPS / Pack / 环线 / 点对点;DSL/低代码扩展(ScenarioTemplateConfig)",defaults:C(B)},{default:e(({payload:s})=>[t(p,{gutter:12},{default:e(()=>[(n(!0),g(v,null,w(s.templates,i=>(n(),_(m,{key:i.id,span:6},{default:e(()=>[t(d,{shadow:"hover",class:"tpl-card"},{default:e(()=>[r("div",I,a(i.name),1),r("div",L,[t(c,{size:"small"},{default:e(()=>[o(a(i.category),1)]),_:2},1024),t(c,{size:"small",type:"info"},{default:e(()=>[o("v"+a(i.version),1)]),_:2},1024)]),r("pre",N,a(i.baselineJson||"{}"),1)]),_:2},1024)]),_:2},1024))),128))]),_:2},1024),t(f),t(u,{column:2,border:""},{default:e(()=>[t(l,{label:"DSL 启用"},{default:e(()=>[o(a(s.dslPolicy.enabled?"是":"否"),1)]),_:2},1024),t(l,{label:"Schema 版本"},{default:e(()=>[o(a(s.dslPolicy.schemaVersion),1)]),_:2},1024),t(l,{label:"低代码"},{default:e(()=>[o(a(s.lowCode.enabled?"启用":"关闭"),1)]),_:2},1024),t(l,{label:"编辑器"},{default:e(()=>[o(a(s.lowCode.editor),1)]),_:2},1024),t(l,{label:"保留版本"},{default:e(()=>[o(a(s.versionPolicy.keepVersions),1)]),_:2},1024),t(l,{label:"允许回滚"},{default:e(()=>[o(a(s.versionPolicy.allowRollback?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}}),Y=T(F,[["__scopeId","data-v-4faf66a8"]]);export{Y as default}; diff --git a/MiGu.Server/wwwroot/assets/ScriptPanelView-BNpYhbAt.js b/MiGu.Server/wwwroot/assets/ScriptPanelView-DMd6Dq7p.js similarity index 84% rename from MiGu.Server/wwwroot/assets/ScriptPanelView-BNpYhbAt.js rename to MiGu.Server/wwwroot/assets/ScriptPanelView-DMd6Dq7p.js index 72c5d5a..e245cea 100644 --- a/MiGu.Server/wwwroot/assets/ScriptPanelView-BNpYhbAt.js +++ b/MiGu.Server/wwwroot/assets/ScriptPanelView-DMd6Dq7p.js @@ -1 +1 @@ -import{R as t}from"./ReflectionManagerPanel-CKQWtKhJ.js";import{aI as r,aE as o,aH as i,b9 as e,ak as a}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-C0K7EJ_N.js";import"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const m={class:"script-page"},p=r({__name:"ScriptPanelView",setup(s){return(c,n)=>(e(),o("div",m,[i(t,{kind:"script","kind-label":"脚本",title:"脚本管理(CarProgram 运行实例 · 与 SimpleLite 工作台「脚本」页对齐)","empty-text":"当前无 CarProgram 实例。CarProgram 是 Mission 运行时编译用户脚本后产生的对象,要创建脚本请到「任务编排」页新建 Mission。","disable-create":"","disable-delete":"","show-summary-column":"","summary-label":"车辆","show-status-column":"","status-label":"状态","show-script-actions":""})]))}}),q=a(p,[["__scopeId","data-v-40d1e5dd"]]);export{q as default}; +import{R as t}from"./ReflectionManagerPanel-BZQZIz4T.js";import{aI as r,aE as o,aH as i,b9 as e,ak as a}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-B_glb6eT.js";import"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const m={class:"script-page"},p=r({__name:"ScriptPanelView",setup(s){return(c,n)=>(e(),o("div",m,[i(t,{kind:"script","kind-label":"脚本",title:"脚本管理(CarProgram 运行实例 · 与 SimpleLite 工作台「脚本」页对齐)","empty-text":"当前无 CarProgram 实例。CarProgram 是 Mission 运行时编译用户脚本后产生的对象,要创建脚本请到「任务编排」页新建 Mission。","disable-create":"","disable-delete":"","show-summary-column":"","summary-label":"车辆","show-status-column":"","status-label":"状态","show-script-actions":""})]))}}),q=a(p,[["__scopeId","data-v-40d1e5dd"]]);export{q as default}; diff --git a/MiGu.Server/wwwroot/assets/ServiceStatusView-COa3vbpj.js b/MiGu.Server/wwwroot/assets/ServiceStatusView-CiTg6q_Q.js similarity index 97% rename from MiGu.Server/wwwroot/assets/ServiceStatusView-COa3vbpj.js rename to MiGu.Server/wwwroot/assets/ServiceStatusView-CiTg6q_Q.js index f4b997a..73d1b4c 100644 --- a/MiGu.Server/wwwroot/assets/ServiceStatusView-COa3vbpj.js +++ b/MiGu.Server/wwwroot/assets/ServiceStatusView-CiTg6q_Q.js @@ -1 +1 @@ -import{aI as w,b7 as k,b8 as E,aE as x,aH as s,bJ as e,t as y,bh as V,bx as C,b9 as D,C as I,F as z,aG as a,bq as f,bt as B,ad as M,aB as m,r as W,ak as N}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const O={class:"status-page mg-content"},K={class:"status-actions"},R=w({__name:"ServiceStatusView",setup(T){const b=C(),_=new Date().toLocaleString("zh-CN"),i=V("00:00:00");let r;const S=Date.now();function u(){const p=Date.now()-S,t=Math.floor(p/1e3),o=String(Math.floor(t/3600)).padStart(2,"0"),l=String(Math.floor(t%3600/60)).padStart(2,"0"),d=String(t%60).padStart(2,"0");i.value=`${o}:${l}:${d}`}k(()=>{u(),r=window.setInterval(u,1e3)}),E(()=>{r&&clearInterval(r)});function v(){b.back()}return(p,t)=>{const o=M,l=z,d=I,n=W,g=y;return D(),x("div",O,[s(g,{shadow:"never",class:"status-card"},{header:e(()=>[t[1]||(t[1]=m("span",null,"SimpleLite Service Status",-1)),s(o,{type:"success",effect:"dark",style:{"margin-left":"8px"}},{default:e(()=>[...t[0]||(t[0]=[a("Web-Enabled (Mock)",-1)])]),_:1})]),default:e(()=>[s(d,{column:2,border:""},{default:e(()=>[s(l,{label:"模式"},{default:e(()=>[...t[2]||(t[2]=[a("Web-Enabled",-1)])]),_:1}),s(l,{label:"启动时间"},{default:e(()=>[a(f(B(_)),1)]),_:1}),s(l,{label:"运行时长"},{default:e(()=>[a(f(i.value),1)]),_:1}),s(l,{label:"节点角色"},{default:e(()=>[s(o,{type:"success"},{default:e(()=>[...t[3]||(t[3]=[a("Active (ROSE)",-1)])]),_:1})]),_:1}),s(l,{label:"WebAPI"},{default:e(()=>[t[5]||(t[5]=a("http://0.0.0.0:7001 ",-1)),s(o,{size:"small"},{default:e(()=>[...t[4]||(t[4]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"WebSocket"},{default:e(()=>[t[7]||(t[7]=a("ws://0.0.0.0:7002 ",-1)),s(o,{size:"small"},{default:e(()=>[...t[6]||(t[6]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"webVRender"},{default:e(()=>[t[9]||(t[9]=a("http://0.0.0.0:8223 ",-1)),s(o,{size:"small",type:"success"},{default:e(()=>[...t[8]||(t[8]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"Platform.Server"},{default:e(()=>[...t[10]||(t[10]=[a(":8080 (pid=12345)",-1)])]),_:1}),s(l,{label:"在线 Vue 客户端"},{default:e(()=>[...t[11]||(t[11]=[a("admin=3, monitor=4",-1)])]),_:1}),s(l,{label:"调度循环 / 任务"},{default:e(()=>[...t[12]||(t[12]=[a("50 Hz · 14 / 32",-1)])]),_:1})]),_:1}),m("div",K,[s(n,null,{default:e(()=>[...t[13]||(t[13]=[a("查看日志",-1)])]),_:1}),s(n,{type:"warning",plain:""},{default:e(()=>[...t[14]||(t[14]=[a("重启 Web",-1)])]),_:1}),s(n,{type:"danger",plain:""},{default:e(()=>[...t[15]||(t[15]=[a("关闭服务",-1)])]),_:1}),s(n,{onClick:v},{default:e(()=>[...t[16]||(t[16]=[a("返回",-1)])]),_:1})])]),_:1})])}}}),q=N(R,[["__scopeId","data-v-ddc086d3"]]);export{q as default}; +import{aI as w,b7 as k,b8 as E,aE as x,aH as s,bJ as e,t as y,bh as V,bx as C,b9 as D,C as I,F as z,aG as a,bq as f,bt as B,ad as M,aB as m,r as W,ak as N}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */const O={class:"status-page mg-content"},K={class:"status-actions"},R=w({__name:"ServiceStatusView",setup(T){const b=C(),_=new Date().toLocaleString("zh-CN"),i=V("00:00:00");let r;const S=Date.now();function u(){const p=Date.now()-S,t=Math.floor(p/1e3),o=String(Math.floor(t/3600)).padStart(2,"0"),l=String(Math.floor(t%3600/60)).padStart(2,"0"),d=String(t%60).padStart(2,"0");i.value=`${o}:${l}:${d}`}k(()=>{u(),r=window.setInterval(u,1e3)}),E(()=>{r&&clearInterval(r)});function v(){b.back()}return(p,t)=>{const o=M,l=z,d=I,n=W,g=y;return D(),x("div",O,[s(g,{shadow:"never",class:"status-card"},{header:e(()=>[t[1]||(t[1]=m("span",null,"SimpleLite Service Status",-1)),s(o,{type:"success",effect:"dark",style:{"margin-left":"8px"}},{default:e(()=>[...t[0]||(t[0]=[a("Web-Enabled (Mock)",-1)])]),_:1})]),default:e(()=>[s(d,{column:2,border:""},{default:e(()=>[s(l,{label:"模式"},{default:e(()=>[...t[2]||(t[2]=[a("Web-Enabled",-1)])]),_:1}),s(l,{label:"启动时间"},{default:e(()=>[a(f(B(_)),1)]),_:1}),s(l,{label:"运行时长"},{default:e(()=>[a(f(i.value),1)]),_:1}),s(l,{label:"节点角色"},{default:e(()=>[s(o,{type:"success"},{default:e(()=>[...t[3]||(t[3]=[a("Active (ROSE)",-1)])]),_:1})]),_:1}),s(l,{label:"WebAPI"},{default:e(()=>[t[5]||(t[5]=a("http://0.0.0.0:7001 ",-1)),s(o,{size:"small"},{default:e(()=>[...t[4]||(t[4]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"WebSocket"},{default:e(()=>[t[7]||(t[7]=a("ws://0.0.0.0:7002 ",-1)),s(o,{size:"small"},{default:e(()=>[...t[6]||(t[6]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"webVRender"},{default:e(()=>[t[9]||(t[9]=a("http://0.0.0.0:8223 ",-1)),s(o,{size:"small",type:"success"},{default:e(()=>[...t[8]||(t[8]=[a("OK",-1)])]),_:1})]),_:1}),s(l,{label:"Platform.Server"},{default:e(()=>[...t[10]||(t[10]=[a(":8080 (pid=12345)",-1)])]),_:1}),s(l,{label:"在线 Vue 客户端"},{default:e(()=>[...t[11]||(t[11]=[a("admin=3, monitor=4",-1)])]),_:1}),s(l,{label:"调度循环 / 任务"},{default:e(()=>[...t[12]||(t[12]=[a("50 Hz · 14 / 32",-1)])]),_:1})]),_:1}),m("div",K,[s(n,null,{default:e(()=>[...t[13]||(t[13]=[a("查看日志",-1)])]),_:1}),s(n,{type:"warning",plain:""},{default:e(()=>[...t[14]||(t[14]=[a("重启 Web",-1)])]),_:1}),s(n,{type:"danger",plain:""},{default:e(()=>[...t[15]||(t[15]=[a("关闭服务",-1)])]),_:1}),s(n,{onClick:v},{default:e(()=>[...t[16]||(t[16]=[a("返回",-1)])]),_:1})])]),_:1})])}}}),q=N(R,[["__scopeId","data-v-ddc086d3"]]);export{q as default}; diff --git a/MiGu.Server/wwwroot/assets/SystemConfigView-4Mxf2af4.js b/MiGu.Server/wwwroot/assets/SystemConfigView-Cy7YXbTA.js similarity index 95% rename from MiGu.Server/wwwroot/assets/SystemConfigView-4Mxf2af4.js rename to MiGu.Server/wwwroot/assets/SystemConfigView-Cy7YXbTA.js index 3acd0f7..4f617c3 100644 --- a/MiGu.Server/wwwroot/assets/SystemConfigView-4Mxf2af4.js +++ b/MiGu.Server/wwwroot/assets/SystemConfigView-Cy7YXbTA.js @@ -1,2 +1,2 @@ -import{aI as P,by as F,bh as A,b9 as c,aE as x,aB as p,aH as l,x as K,bJ as t,ai as U,bj as B,aC as k,N as $,bt as v,aj as G,O as j,z as R,bq as h,r as D,aG as u,b4 as W,ad as H,aD as M,ax as J,aP as q,X as _,y as X,ak as L,b7 as Y,bg as Z,t as Q,S as ee,H as le,a4 as te,Z as oe,a8 as ae,R as ne,h as se}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as ie}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css */import{a as O,m as me}from"./mapEdit-BiAzHHno.js";/* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const de={class:"theme-customizer"},re={class:"tc-title-row"},ue={class:"tc-name"},pe={class:"tc-panel"},ce={class:"tc-picker-row"},fe={class:"tc-hex"},_e={class:"tc-field-hint"},ge={class:"tc-actions"},be={class:"tc-footer"},ve=P({__name:"ThemeCustomizer",setup(N){const o=F(),V=A(o.themeId),w=["#7c3aed","#8b5cf6","#c4b5fd","#5b21b6","#4c1d95","#6366f1","#a855f7","#9333ea","#1565c0","#00796b","#b71c1c","#455a64","#e65100"],S=J(()=>o.availableThemes.some(d=>C(d.id)));function C(d){const n=o.themeOverrides[d];return!!n&&Object.keys(n).length>0}function r(d){const n=o.getMergedTheme(q(d));return{background:`linear-gradient(135deg, ${n.preview} 0%, ${n.previewAccent} 100%)`}}function a(d,n,g){g&&(o.setThemeColor(d,n,g),d===o.themeId&&_.success("已应用当前主题配色"))}function f(d){o.clearThemeOverrides(d),_.info("已恢复该主题默认配色")}function i(){o.clearAllThemeOverrides(),_.info("已恢复全部主题默认配色")}return(d,n)=>{const g=H,z=R,b=j,E=$,y=D,T=X,I=K;return c(),x("div",de,[n[6]||(n[6]=p("p",{class:"tc-hint"}," 为各主题单独调色;修改后立即预览。当前生效主题会同步应用到全站。保存系统配置时一并写入本地。 ",-1)),l(I,{modelValue:V.value,"onUpdate:modelValue":n[0]||(n[0]=e=>V.value=e),accordion:""},{default:t(()=>[(c(!0),x(U,null,B(v(o).availableThemes,e=>(c(),k(T,{key:e.id,name:e.id},{title:t(()=>[p("div",re,[p("span",{class:"tc-swatch",style:W(r(e.id))},null,4),p("span",ue,h(e.name),1),C(e.id)?(c(),k(g,{key:0,size:"small",type:"warning",effect:"plain"},{default:t(()=>[...n[1]||(n[1]=[u("已自定义",-1)])]),_:1})):M("",!0),e.id===v(o).themeId?(c(),k(g,{key:1,size:"small",type:"success",effect:"plain"},{default:t(()=>[...n[2]||(n[2]=[u("当前",-1)])]),_:1})):M("",!0)])]),default:t(()=>[p("div",pe,[l(E,{"label-width":"100px",class:"tc-form"},{default:t(()=>[(c(!0),x(U,null,B(v(G),m=>(c(),k(b,{key:m.key,label:m.label},{default:t(()=>[p("div",ce,[l(z,{"model-value":v(o).getThemeColor(e.id,m.key),"color-format":"hex",predefine:w,"onUpdate:modelValue":s=>a(e.id,m.key,s)},null,8,["model-value","onUpdate:modelValue"]),p("span",fe,h(v(o).getThemeColor(e.id,m.key)),1),p("span",_e,h(m.hint),1)])]),_:2},1032,["label"]))),128))]),_:2},1024),p("div",ge,[l(y,{size:"small",onClick:m=>v(o).setThemeId(e.id)},{default:t(()=>[...n[3]||(n[3]=[u("切换到此主题",-1)])]),_:1},8,["onClick"]),l(y,{size:"small",disabled:!C(e.id),onClick:m=>f(e.id)},{default:t(()=>[...n[4]||(n[4]=[u("恢复默认",-1)])]),_:1},8,["disabled","onClick"])])])]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"]),p("div",be,[l(y,{size:"small",type:"warning",plain:"",disabled:!S.value,onClick:i},{default:t(()=>[...n[5]||(n[5]=[u(" 重置全部主题配色 ",-1)])]),_:1},8,["disabled"])])])}}}),Ve=L(ve,[["__scopeId","data-v-8a725bd2"]]),ye=P({__name:"SystemConfigView",setup(N){const o=Z({endpoint:"https://api.openai.com/v1/chat/completions",apiKey:"",model:"gpt-4o-mini",systemPrompt:"你是一个 AGV 路网设计师。",temperature:.4,maxTokens:4096,timeoutSec:60,configured:!1}),V=A(!1),w=A(!1);Y(async()=>{try{const r=await O.get();Object.assign(o,r)}catch(r){_.warning(`无法读取 AI 配置:${r.message}`)}});async function S(){try{V.value=!0,await O.save({...o}),_.success("AI 配置已保存"),o.configured=!!o.apiKey}catch(r){_.error(`保存失败:${r.message}`)}finally{V.value=!1}}async function C(){try{w.value=!0;const r=await me.aiMapGenerate({prompt:'测试连通:仅返回 "ok",不要生成任何站点或路径。',mode:"sites",bounds:[0,0,0,0]});_.success(`AI 服务连通正常:返回工具调用 ${r.usedTools} 次`)}catch(r){_.error(`连通失败:${r.message}`)}finally{w.value=!1}}return(r,a)=>{const f=ee,i=j,d=le,n=oe,g=te,z=ae,b=ne,E=$,y=H,T=D,I=Q;return c(),x(U,null,[l(ie,{section:"system",title:"系统级配置",description:"运行参数、日志策略、安全策略(对齐 SystemConfig)",defaults:v(se)},{default:t(({payload:e,update:m})=>[l(E,{"label-width":"160px",model:e},{default:t(()=>[l(i,{label:"调度循环 (Hz)"},{default:t(()=>[l(f,{"model-value":e.dispatchLoopHz,min:1,max:200,"onUpdate:modelValue":s=>m({...e,dispatchLoopHz:s??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(d,{"content-position":"left"},{default:t(()=>[...a[7]||(a[7]=[u("日志策略",-1)])]),_:1}),l(i,{label:"日志级别"},{default:t(()=>[l(g,{"model-value":e.log.level,"onUpdate:modelValue":s=>m({...e,log:{...e.log,level:s}})},{default:t(()=>[(c(),x(U,null,B(["trace","debug","info","warn","error"],s=>l(n,{key:s,label:s,value:s},null,8,["label","value"])),64))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"日志保留 (天)"},{default:t(()=>[l(f,{"model-value":e.log.rollDays,min:1,max:365,"onUpdate:modelValue":s=>m({...e,log:{...e.log,rollDays:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"单文件上限 (MB)"},{default:t(()=>[l(f,{"model-value":e.log.maxSizeMB,min:1,max:4096,"onUpdate:modelValue":s=>m({...e,log:{...e.log,maxSizeMB:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(d,{"content-position":"left"},{default:t(()=>[...a[8]||(a[8]=[u("安全策略",-1)])]),_:1}),l(i,{label:"JWT 过期 (分钟)"},{default:t(()=>[l(f,{"model-value":e.security.jwtExpireMin,min:5,max:43200,"onUpdate:modelValue":s=>m({...e,security:{...e.security,jwtExpireMin:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"启用 Swagger"},{default:t(()=>[l(z,{"model-value":e.security.enableSwagger,"onUpdate:modelValue":s=>m({...e,security:{...e.security,enableSwagger:!!s}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"CORS 白名单"},{default:t(()=>[l(b,{type:"textarea",rows:3,"model-value":e.security.corsWhitelist.join(` +import{aI as P,by as F,bh as A,b9 as c,aE as x,aB as p,aH as l,x as K,bJ as t,ai as U,bj as B,aC as k,N as $,bt as v,aj as G,O as j,z as R,bq as h,r as D,aG as u,b4 as W,ad as H,aD as M,ax as J,aP as q,X as _,y as X,ak as L,b7 as Y,bg as Z,t as Q,S as ee,H as le,a4 as te,Z as oe,a8 as ae,R as ne,h as se}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as ie}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css */import{a as O,m as me}from"./mapEdit-TNAQr3Be.js";/* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const de={class:"theme-customizer"},re={class:"tc-title-row"},ue={class:"tc-name"},pe={class:"tc-panel"},ce={class:"tc-picker-row"},fe={class:"tc-hex"},_e={class:"tc-field-hint"},ge={class:"tc-actions"},be={class:"tc-footer"},ve=P({__name:"ThemeCustomizer",setup(N){const o=F(),V=A(o.themeId),w=["#7c3aed","#8b5cf6","#c4b5fd","#5b21b6","#4c1d95","#6366f1","#a855f7","#9333ea","#1565c0","#00796b","#b71c1c","#455a64","#e65100"],S=J(()=>o.availableThemes.some(d=>C(d.id)));function C(d){const n=o.themeOverrides[d];return!!n&&Object.keys(n).length>0}function r(d){const n=o.getMergedTheme(q(d));return{background:`linear-gradient(135deg, ${n.preview} 0%, ${n.previewAccent} 100%)`}}function a(d,n,g){g&&(o.setThemeColor(d,n,g),d===o.themeId&&_.success("已应用当前主题配色"))}function f(d){o.clearThemeOverrides(d),_.info("已恢复该主题默认配色")}function i(){o.clearAllThemeOverrides(),_.info("已恢复全部主题默认配色")}return(d,n)=>{const g=H,z=R,b=j,E=$,y=D,T=X,I=K;return c(),x("div",de,[n[6]||(n[6]=p("p",{class:"tc-hint"}," 为各主题单独调色;修改后立即预览。当前生效主题会同步应用到全站。保存系统配置时一并写入本地。 ",-1)),l(I,{modelValue:V.value,"onUpdate:modelValue":n[0]||(n[0]=e=>V.value=e),accordion:""},{default:t(()=>[(c(!0),x(U,null,B(v(o).availableThemes,e=>(c(),k(T,{key:e.id,name:e.id},{title:t(()=>[p("div",re,[p("span",{class:"tc-swatch",style:W(r(e.id))},null,4),p("span",ue,h(e.name),1),C(e.id)?(c(),k(g,{key:0,size:"small",type:"warning",effect:"plain"},{default:t(()=>[...n[1]||(n[1]=[u("已自定义",-1)])]),_:1})):M("",!0),e.id===v(o).themeId?(c(),k(g,{key:1,size:"small",type:"success",effect:"plain"},{default:t(()=>[...n[2]||(n[2]=[u("当前",-1)])]),_:1})):M("",!0)])]),default:t(()=>[p("div",pe,[l(E,{"label-width":"100px",class:"tc-form"},{default:t(()=>[(c(!0),x(U,null,B(v(G),m=>(c(),k(b,{key:m.key,label:m.label},{default:t(()=>[p("div",ce,[l(z,{"model-value":v(o).getThemeColor(e.id,m.key),"color-format":"hex",predefine:w,"onUpdate:modelValue":s=>a(e.id,m.key,s)},null,8,["model-value","onUpdate:modelValue"]),p("span",fe,h(v(o).getThemeColor(e.id,m.key)),1),p("span",_e,h(m.hint),1)])]),_:2},1032,["label"]))),128))]),_:2},1024),p("div",ge,[l(y,{size:"small",onClick:m=>v(o).setThemeId(e.id)},{default:t(()=>[...n[3]||(n[3]=[u("切换到此主题",-1)])]),_:1},8,["onClick"]),l(y,{size:"small",disabled:!C(e.id),onClick:m=>f(e.id)},{default:t(()=>[...n[4]||(n[4]=[u("恢复默认",-1)])]),_:1},8,["disabled","onClick"])])])]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"]),p("div",be,[l(y,{size:"small",type:"warning",plain:"",disabled:!S.value,onClick:i},{default:t(()=>[...n[5]||(n[5]=[u(" 重置全部主题配色 ",-1)])]),_:1},8,["disabled"])])])}}}),Ve=L(ve,[["__scopeId","data-v-8a725bd2"]]),ye=P({__name:"SystemConfigView",setup(N){const o=Z({endpoint:"https://api.openai.com/v1/chat/completions",apiKey:"",model:"gpt-4o-mini",systemPrompt:"你是一个 AGV 路网设计师。",temperature:.4,maxTokens:4096,timeoutSec:60,configured:!1}),V=A(!1),w=A(!1);Y(async()=>{try{const r=await O.get();Object.assign(o,r)}catch(r){_.warning(`无法读取 AI 配置:${r.message}`)}});async function S(){try{V.value=!0,await O.save({...o}),_.success("AI 配置已保存"),o.configured=!!o.apiKey}catch(r){_.error(`保存失败:${r.message}`)}finally{V.value=!1}}async function C(){try{w.value=!0;const r=await me.aiMapGenerate({prompt:'测试连通:仅返回 "ok",不要生成任何站点或路径。',mode:"sites",bounds:[0,0,0,0]});_.success(`AI 服务连通正常:返回工具调用 ${r.usedTools} 次`)}catch(r){_.error(`连通失败:${r.message}`)}finally{w.value=!1}}return(r,a)=>{const f=ee,i=j,d=le,n=oe,g=te,z=ae,b=ne,E=$,y=H,T=D,I=Q;return c(),x(U,null,[l(ie,{section:"system",title:"系统级配置",description:"运行参数、日志策略、安全策略(对齐 SystemConfig)",defaults:v(se)},{default:t(({payload:e,update:m})=>[l(E,{"label-width":"160px",model:e},{default:t(()=>[l(i,{label:"调度循环 (Hz)"},{default:t(()=>[l(f,{"model-value":e.dispatchLoopHz,min:1,max:200,"onUpdate:modelValue":s=>m({...e,dispatchLoopHz:s??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(d,{"content-position":"left"},{default:t(()=>[...a[7]||(a[7]=[u("日志策略",-1)])]),_:1}),l(i,{label:"日志级别"},{default:t(()=>[l(g,{"model-value":e.log.level,"onUpdate:modelValue":s=>m({...e,log:{...e.log,level:s}})},{default:t(()=>[(c(),x(U,null,B(["trace","debug","info","warn","error"],s=>l(n,{key:s,label:s,value:s},null,8,["label","value"])),64))]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"日志保留 (天)"},{default:t(()=>[l(f,{"model-value":e.log.rollDays,min:1,max:365,"onUpdate:modelValue":s=>m({...e,log:{...e.log,rollDays:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"单文件上限 (MB)"},{default:t(()=>[l(f,{"model-value":e.log.maxSizeMB,min:1,max:4096,"onUpdate:modelValue":s=>m({...e,log:{...e.log,maxSizeMB:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(d,{"content-position":"left"},{default:t(()=>[...a[8]||(a[8]=[u("安全策略",-1)])]),_:1}),l(i,{label:"JWT 过期 (分钟)"},{default:t(()=>[l(f,{"model-value":e.security.jwtExpireMin,min:5,max:43200,"onUpdate:modelValue":s=>m({...e,security:{...e.security,jwtExpireMin:s??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"启用 Swagger"},{default:t(()=>[l(z,{"model-value":e.security.enableSwagger,"onUpdate:modelValue":s=>m({...e,security:{...e.security,enableSwagger:!!s}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(i,{label:"CORS 白名单"},{default:t(()=>[l(b,{type:"textarea",rows:3,"model-value":e.security.corsWhitelist.join(` `),"onUpdate:modelValue":s=>m({...e,security:{...e.security,corsWhitelist:s.split(/\s+/).filter(Boolean)}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),l(d,{"content-position":"left"},{default:t(()=>[...a[9]||(a[9]=[u("界面主题配色",-1)])]),_:1}),l(i,{label:"主题取色盘"},{default:t(()=>[l(Ve)]),_:1})]),_:2},1032,["model"])]),_:1},8,["defaults"]),l(I,{class:"ai-service-card",shadow:"never"},{header:t(()=>[a[12]||(a[12]=p("span",null,"AI 服务(地图编辑器「AI 生图」依赖)",-1)),o.configured?(c(),k(y,{key:0,type:"success",size:"small",effect:"dark",class:"ml-8"},{default:t(()=>[...a[10]||(a[10]=[u("已配置",-1)])]),_:1})):(c(),k(y,{key:1,type:"warning",size:"small",effect:"dark",class:"ml-8"},{default:t(()=>[...a[11]||(a[11]=[u("未配置",-1)])]),_:1}))]),default:t(()=>[l(E,{"label-width":"140px",size:"default"},{default:t(()=>[l(i,{label:"Endpoint"},{default:t(()=>[l(b,{modelValue:o.endpoint,"onUpdate:modelValue":a[0]||(a[0]=e=>o.endpoint=e),placeholder:"https://api.openai.com/v1/chat/completions"},null,8,["modelValue"])]),_:1}),l(i,{label:"API Key"},{default:t(()=>[l(b,{modelValue:o.apiKey,"onUpdate:modelValue":a[1]||(a[1]=e=>o.apiKey=e),type:"password","show-password":"",placeholder:"sk-..."},null,8,["modelValue"])]),_:1}),l(i,{label:"模型"},{default:t(()=>[l(b,{modelValue:o.model,"onUpdate:modelValue":a[2]||(a[2]=e=>o.model=e),placeholder:"gpt-4o-mini"},null,8,["modelValue"])]),_:1}),l(i,{label:"System Prompt"},{default:t(()=>[l(b,{modelValue:o.systemPrompt,"onUpdate:modelValue":a[3]||(a[3]=e=>o.systemPrompt=e),type:"textarea",rows:4},null,8,["modelValue"])]),_:1}),l(i,{label:"Temperature"},{default:t(()=>[l(f,{modelValue:o.temperature,"onUpdate:modelValue":a[4]||(a[4]=e=>o.temperature=e),min:0,max:2,step:.1},null,8,["modelValue"])]),_:1}),l(i,{label:"Max Tokens"},{default:t(()=>[l(f,{modelValue:o.maxTokens,"onUpdate:modelValue":a[5]||(a[5]=e=>o.maxTokens=e),min:64,max:32e3,step:64},null,8,["modelValue"])]),_:1}),l(i,{label:"超时 (秒)"},{default:t(()=>[l(f,{modelValue:o.timeoutSec,"onUpdate:modelValue":a[6]||(a[6]=e=>o.timeoutSec=e),min:5,max:600},null,8,["modelValue"])]),_:1}),l(i,null,{default:t(()=>[l(T,{type:"primary",loading:V.value,onClick:S},{default:t(()=>[...a[13]||(a[13]=[u("保存 AI 配置",-1)])]),_:1},8,["loading"]),l(T,{loading:w.value,onClick:C},{default:t(()=>[...a[14]||(a[14]=[u("测试连通",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1})],64)}}}),Fe=L(ye,[["__scopeId","data-v-b66101c5"]]);export{Fe as default}; diff --git a/MiGu.Server/wwwroot/assets/TaskAllocationView-Dm9F_jCO.js b/MiGu.Server/wwwroot/assets/TaskAllocationView-BoGL3AmK.js similarity index 80% rename from MiGu.Server/wwwroot/assets/TaskAllocationView-Dm9F_jCO.js rename to MiGu.Server/wwwroot/assets/TaskAllocationView-BoGL3AmK.js index f05a368..d33dd73 100644 --- a/MiGu.Server/wwwroot/assets/TaskAllocationView-Dm9F_jCO.js +++ b/MiGu.Server/wwwroot/assets/TaskAllocationView-BoGL3AmK.js @@ -1 +1 @@ -import{aI as p,aC as f,bJ as o,bt as c,b9 as b,aH as e,N as v,O as V,a1 as x,a0 as B,aG as n,a8 as C,S as E,i as U}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as k}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const j=p({__name:"TaskAllocationView",setup(w){return(T,t)=>{const m=B,d=x,u=V,i=C,s=E,_=v;return b(),f(k,{section:"task",title:"任务分配机制",description:"负载均衡、就近分配、优先级调度(TaskAllocationPolicy)",defaults:c(U)},{default:o(({payload:l,update:r})=>[e(_,{"label-width":"160px",model:l},{default:o(()=>[e(u,{label:"分配模式"},{default:o(()=>[e(d,{"model-value":l.mode,"onUpdate:modelValue":a=>r({...l,mode:a})},{default:o(()=>[e(m,{value:"roundRobin"},{default:o(()=>[...t[0]||(t[0]=[n("轮询",-1)])]),_:1}),e(m,{value:"nearest"},{default:o(()=>[...t[1]||(t[1]=[n("就近",-1)])]),_:1}),e(m,{value:"leastLoad"},{default:o(()=>[...t[2]||(t[2]=[n("最少负载",-1)])]),_:1}),e(m,{value:"custom"},{default:o(()=>[...t[3]||(t[3]=[n("自定义",-1)])]),_:1})]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(u,{label:"启用负载均衡"},{default:o(()=>[e(i,{"model-value":l.loadBalance,"onUpdate:modelValue":a=>r({...l,loadBalance:!!a})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(u,{label:"单车队列上限"},{default:o(()=>[e(s,{"model-value":l.maxQueuePerCar,min:1,max:100,"onUpdate:modelValue":a=>r({...l,maxQueuePerCar:a??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{j as default}; +import{aI as p,aC as f,bJ as o,bt as c,b9 as b,aH as e,N as v,O as V,a1 as x,a0 as B,aG as n,a8 as C,S as E,i as U}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as k}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const j=p({__name:"TaskAllocationView",setup(w){return(T,t)=>{const m=B,d=x,u=V,i=C,s=E,_=v;return b(),f(k,{section:"task",title:"任务分配机制",description:"负载均衡、就近分配、优先级调度(TaskAllocationPolicy)",defaults:c(U)},{default:o(({payload:l,update:r})=>[e(_,{"label-width":"160px",model:l},{default:o(()=>[e(u,{label:"分配模式"},{default:o(()=>[e(d,{"model-value":l.mode,"onUpdate:modelValue":a=>r({...l,mode:a})},{default:o(()=>[e(m,{value:"roundRobin"},{default:o(()=>[...t[0]||(t[0]=[n("轮询",-1)])]),_:1}),e(m,{value:"nearest"},{default:o(()=>[...t[1]||(t[1]=[n("就近",-1)])]),_:1}),e(m,{value:"leastLoad"},{default:o(()=>[...t[2]||(t[2]=[n("最少负载",-1)])]),_:1}),e(m,{value:"custom"},{default:o(()=>[...t[3]||(t[3]=[n("自定义",-1)])]),_:1})]),_:1},8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(u,{label:"启用负载均衡"},{default:o(()=>[e(i,{"model-value":l.loadBalance,"onUpdate:modelValue":a=>r({...l,loadBalance:!!a})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),e(u,{label:"单车队列上限"},{default:o(()=>[e(s,{"model-value":l.maxQueuePerCar,min:1,max:100,"onUpdate:modelValue":a=>r({...l,maxQueuePerCar:a??0})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{j as default}; diff --git a/MiGu.Server/wwwroot/assets/TrackTableView-BEdpBnup.js b/MiGu.Server/wwwroot/assets/TrackTableView-CKv4G01-.js similarity index 87% rename from MiGu.Server/wwwroot/assets/TrackTableView-BEdpBnup.js rename to MiGu.Server/wwwroot/assets/TrackTableView-CKv4G01-.js index 11a439c..0b5274b 100644 --- a/MiGu.Server/wwwroot/assets/TrackTableView-BEdpBnup.js +++ b/MiGu.Server/wwwroot/assets/TrackTableView-CKv4G01-.js @@ -1 +1 @@ -import{aI as m,b9 as _,aE as b,aH as e,bJ as a,a9 as x,ac as g,bh as l,ak as T,aC as v}from"./index-368apsQG.js";/* empty css *//* empty css */import{R as s}from"./ReflectionManagerPanel-CKQWtKhJ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-C0K7EJ_N.js";import"./useMapEditStream-CoKaGT-a.js";import"./useProjectionStream-C94Y5UgX.js";const y={class:"scene-mgr-page"},I=m({__name:"SceneManagerView",setup(f){const r=l("site"),o=l(null),p=l(null),c=l(null);function u(t){(t==="site"?o.value:t==="track"?p.value:t==="special"?c.value:null)?.refresh?.()}return(t,n)=>{const i=x,d=g;return _(),b("div",y,[e(d,{modelValue:r.value,"onUpdate:modelValue":n[0]||(n[0]=k=>r.value=k),type:"border-card",class:"scene-tabs admin-tabs",onTabChange:u},{default:a(()=>[e(i,{label:"站点",name:"site"},{default:a(()=>[e(s,{ref_key:"sitePanelRef",ref:o,kind:"site","kind-label":"站点",title:"站点管理(Site / UISite,含禁用/启用、必空点等动作)","empty-text":"当前没有站点;点击右上角「新建站点」按 x/y 坐标添加。"},null,512)]),_:1}),e(i,{label:"路径",name:"track"},{default:a(()=>[e(s,{ref_key:"trackPanelRef",ref:p,kind:"track","kind-label":"路径",title:"路径管理(Track / UITrack,含方向、冲突、投影、二分等动作)","empty-text":"当前没有路径;点击右上角「新建路径」选起止站点添加。"},null,512)]),_:1}),e(i,{label:"装饰物",name:"special"},{default:a(()=>[e(s,{ref_key:"specialPanelRef",ref:c,kind:"special","kind-label":"装饰物",title:"装饰物管理(UI_Image / UI_Text / UI_Model)","empty-text":"当前没有装饰物;新建图片/文本/模型可用底部按钮,或先在地图编辑里上传资产。"},null,512)]),_:1})]),_:1},8,["modelValue"])])}}}),P=T(I,[["__scopeId","data-v-ce41515a"]]),Y=m({__name:"TrackTableView",setup(f){return(r,o)=>(_(),v(P))}});export{Y as default}; +import{aI as m,b9 as _,aE as b,aH as e,bJ as a,a9 as x,ac as g,bh as l,ak as T,aC as v}from"./index-Dg4NaXsE.js";/* empty css *//* empty css */import{R as s}from"./ReflectionManagerPanel-BZQZIz4T.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./reflection-B_glb6eT.js";import"./useMapEditStream-BgR6WvRg.js";import"./useProjectionStream-BBHmpNXC.js";const y={class:"scene-mgr-page"},I=m({__name:"SceneManagerView",setup(f){const r=l("site"),o=l(null),p=l(null),c=l(null);function u(t){(t==="site"?o.value:t==="track"?p.value:t==="special"?c.value:null)?.refresh?.()}return(t,n)=>{const i=x,d=g;return _(),b("div",y,[e(d,{modelValue:r.value,"onUpdate:modelValue":n[0]||(n[0]=k=>r.value=k),type:"border-card",class:"scene-tabs admin-tabs",onTabChange:u},{default:a(()=>[e(i,{label:"站点",name:"site"},{default:a(()=>[e(s,{ref_key:"sitePanelRef",ref:o,kind:"site","kind-label":"站点",title:"站点管理(Site / UISite,含禁用/启用、必空点等动作)","empty-text":"当前没有站点;点击右上角「新建站点」按 x/y 坐标添加。"},null,512)]),_:1}),e(i,{label:"路径",name:"track"},{default:a(()=>[e(s,{ref_key:"trackPanelRef",ref:p,kind:"track","kind-label":"路径",title:"路径管理(Track / UITrack,含方向、冲突、投影、二分等动作)","empty-text":"当前没有路径;点击右上角「新建路径」选起止站点添加。"},null,512)]),_:1}),e(i,{label:"装饰物",name:"special"},{default:a(()=>[e(s,{ref_key:"specialPanelRef",ref:c,kind:"special","kind-label":"装饰物",title:"装饰物管理(UI_Image / UI_Text / UI_Model)","empty-text":"当前没有装饰物;新建图片/文本/模型可用底部按钮,或先在地图编辑里上传资产。"},null,512)]),_:1})]),_:1},8,["modelValue"])])}}}),P=T(I,[["__scopeId","data-v-ce41515a"]]),Y=m({__name:"TrackTableView",setup(f){return(r,o)=>(_(),v(P))}});export{Y as default}; diff --git a/MiGu.Server/wwwroot/assets/TrafficRuleView-zSMLh9vH.js b/MiGu.Server/wwwroot/assets/TrafficRuleView-CZpyEJOL.js similarity index 80% rename from MiGu.Server/wwwroot/assets/TrafficRuleView-zSMLh9vH.js rename to MiGu.Server/wwwroot/assets/TrafficRuleView-CZpyEJOL.js index ca5194e..3eab714 100644 --- a/MiGu.Server/wwwroot/assets/TrafficRuleView-zSMLh9vH.js +++ b/MiGu.Server/wwwroot/assets/TrafficRuleView-CZpyEJOL.js @@ -1 +1 @@ -import{aI as m,aC as d,bJ as e,bt as _,b9 as c,aH as a,ac as f,a9 as b,aa as u,ab as I,aG as s,bq as p,j as w}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as T}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";/* empty css */import"./reflection-C0K7EJ_N.js";import"./monitorConfigCache-BtW5W6GI.js";const H=m({__name:"TrafficRuleView",setup(h){return(x,C)=>{const t=I,o=u,l=b,n=f;return c(),d(T,{section:"traffic",title:"交通管制规则",description:"路口策略、区域互斥、动态让行(TrafficRule)",defaults:_(w)},{default:e(({payload:i})=>[a(n,{"model-value":"ix"},{default:e(()=>[a(l,{name:"ix",label:"路口策略"},{default:e(()=>[a(o,{data:i.intersections,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"站点 IDs",prop:"siteIds"},{default:e(r=>[s(p(r.row.siteIds.join(", ")),1)]),_:1}),a(t,{label:"模式",prop:"mode",width:"100"})]),_:1},8,["data"])]),_:2},1024),a(l,{name:"mz",label:"区域互斥"},{default:e(()=>[a(o,{data:i.mutex,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"区域 IDs",prop:"zoneIds"},{default:e(r=>[s(p(r.row.zoneIds.join(", ")),1)]),_:1})]),_:1},8,["data"])]),_:2},1024),a(l,{name:"yd",label:"动态让行"},{default:e(()=>[a(o,{data:i.yields,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"From",prop:"from",width:"140"}),a(t,{label:"To",prop:"to",width:"140"}),a(t,{label:"条件",prop:"condition"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{H as default}; +import{aI as m,aC as d,bJ as e,bt as _,b9 as c,aH as a,ac as f,a9 as b,aa as u,ab as I,aG as s,bq as p,j as w}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as T}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";/* empty css */import"./reflection-B_glb6eT.js";import"./monitorConfigCache-BigdkiFw.js";const H=m({__name:"TrafficRuleView",setup(h){return(x,C)=>{const t=I,o=u,l=b,n=f;return c(),d(T,{section:"traffic",title:"交通管制规则",description:"路口策略、区域互斥、动态让行(TrafficRule)",defaults:_(w)},{default:e(({payload:i})=>[a(n,{"model-value":"ix"},{default:e(()=>[a(l,{name:"ix",label:"路口策略"},{default:e(()=>[a(o,{data:i.intersections,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"站点 IDs",prop:"siteIds"},{default:e(r=>[s(p(r.row.siteIds.join(", ")),1)]),_:1}),a(t,{label:"模式",prop:"mode",width:"100"})]),_:1},8,["data"])]),_:2},1024),a(l,{name:"mz",label:"区域互斥"},{default:e(()=>[a(o,{data:i.mutex,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"区域 IDs",prop:"zoneIds"},{default:e(r=>[s(p(r.row.zoneIds.join(", ")),1)]),_:1})]),_:1},8,["data"])]),_:2},1024),a(l,{name:"yd",label:"动态让行"},{default:e(()=>[a(o,{data:i.yields,size:"small"},{default:e(()=>[a(t,{label:"ID",prop:"id",width:"100"}),a(t,{label:"From",prop:"from",width:"140"}),a(t,{label:"To",prop:"to",width:"140"}),a(t,{label:"条件",prop:"condition"})]),_:1},8,["data"])]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{H as default}; diff --git a/MiGu.Server/wwwroot/assets/VehicleHubView-CG4ybiip.js b/MiGu.Server/wwwroot/assets/VehicleHubView-1cdDkq5N.js similarity index 98% rename from MiGu.Server/wwwroot/assets/VehicleHubView-CG4ybiip.js rename to MiGu.Server/wwwroot/assets/VehicleHubView-1cdDkq5N.js index c5db6c9..8ecb1c4 100644 --- a/MiGu.Server/wwwroot/assets/VehicleHubView-CG4ybiip.js +++ b/MiGu.Server/wwwroot/assets/VehicleHubView-1cdDkq5N.js @@ -1 +1 @@ -import{aI as ee,b9 as M,aE as B,b3 as X,aB as l,aH as t,$ as Le,bq as b,bL as Pe,I as ve,bJ as n,r as ce,bt as p,b1 as Re,K as _e,J as be,aG as _,a8 as he,Q as we,bC as ze,aA as Ne,av as He,bH as We,ay as qe,ax as C,Y as le,X as q,ak as de,b as R,bh as F,b7 as ue,ad as je,bi as ge,bc as Je,as as Ge,bK as ye,bA as Ce,aC as j,aD as re,ai as Y,bj as Z,R as fe,aK as Ke,a4 as Ie,Z as Ve,L as ke,N as Qe,O as Xe,a5 as Ye,H as Ze,S as et,k as tt,E as at,ac as $e,a9 as Me,C as lt,F as nt,aU as ot,b8 as st,bp as me,bv as it,bI as pe,bw as rt,bx as ct,bn as dt,am as ut}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as ft}from"./reflection-C0K7EJ_N.js";import{u as xe,C as Ee}from"./ConfigPageBase-CT6BdvCe.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css */import{l as mt}from"./projection-nWPnmoX1.js";import{u as pt}from"./useProjectionStream-C94Y5UgX.js";/* empty css *//* empty css */import"./PermissionGuard-DUg2FNrM.js";import"./monitorConfigCache-BtW5W6GI.js";const vt={online:"OnlineCar",offline:"OfflineCar",repair:"Repair",blown:"Blown"};async function Ae(s,d){const o=vt[d];if(!o)return!1;try{return await ft.execute("car",s,o),!0}catch{return!1}}function _t(s,d){const o=s??(d?`http://${d}:8081`:null);o&&window.open(o,"_blank","noopener,noreferrer")}const bt={class:"battery-strip"},ht={class:"card-head"},wt={class:"title-block"},gt={class:"vid"},yt=["title"],Ct={class:"card-body"},It={class:"thumb"},Vt={class:"metrics"},kt={class:"metric-row"},$t={class:"value mono"},Mt={class:"metric-row"},xt={class:"metric-row"},Et={class:"metric-row"},At={class:"value"},Ft={class:"metric-row"},St={class:"value"},Ut={class:"icon-grid"},Bt={class:"icon-cell",title:"CPU"},Ot={class:"icon-cell",title:"内存"},Tt={class:"icon-cell",title:"报警"},Dt={class:"icon-cell",title:"连接"},Lt={class:"card-foot"},Pt=ee({__name:"VehicleHealthCard",props:{vehicle:{},selected:{type:Boolean},canWrite:{type:Boolean}},emits:["select","maintenanceChanged"],setup(s,{emit:d}){const o=s,k=d,f={idle:"空闲",running:"运行",charging:"充电",paused:"暂停",fault:"故障",offline:"离线"},w=C(()=>f[o.vehicle.state]??o.vehicle.state),g=C(()=>{const e=o.vehicle.batterySoc??0,a=e>1?e:e*100;return Math.max(0,Math.min(100,Math.round(a)))}),x=C(()=>{const e=g.value;return e<20?"#f56c6c":e<50?"#e6a23c":"#67c23a"}),v=C(()=>o.vehicle.maintenanceMode==="online"),U=C(()=>({"is-selected":o.selected,"is-alarm":o.vehicle.isAlarmActive,"is-offline":o.vehicle.maintenanceMode==="offline"||o.vehicle.state==="offline","is-maintenance":o.vehicle.maintenanceMode==="repair"||o.vehicle.maintenanceMode==="blown","is-unreachable":o.vehicle.reachable===!1})),u=C(()=>{const e=o.vehicle.latencyMs;return e==null?"—":o.vehicle.reachable===!1?"超时":`${e} ms`}),y=C(()=>{const e=o.vehicle.latencyMs;return o.vehicle.reachable===!1?"danger":e!=null&&e>80?"warn":""}),I=C(()=>{const e=o.vehicle.faultRatePercent;return e==null?"—":`${e.toFixed(2)}%`}),H=C(()=>{const e=o.vehicle.faultRatePercent??0;return e>=5?"danger":e>=1?"warn":""}),O=C(()=>{const e=o.vehicle.cpuPercent;return e!=null?`${Math.round(e)}%`:"—"}),L=C(()=>{const e=o.vehicle.memPercent;return e!=null?`${Math.round(e)}%`:"—"});function z(){k("select",o.vehicle.id)}function T(e){e.target.closest(".head-actions")||_t(o.vehicle.onboardUrl,o.vehicle.ip)}async function S(e){const a=o.vehicle.rawId??parseInt(o.vehicle.id.replace(/\D/g,""),10);if(!Number.isFinite(a))return;await Ae(a,e)?(q.success("维护状态已更新"),k("maintenanceChanged")):q.error("维护操作失败")}async function c(e){if(!o.canWrite)return;const a=e?"online":"offline";try{await le.confirm(e?"确认将车辆上线?":"确认将车辆下线维护?","维护确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await S(a)}catch{}}async function i(e){if(!o.canWrite)return;const a=e;if(a==="blown"){try{await le.confirm("返厂检修将停止调度并清空站点,确认?","危险操作",{type:"error",confirmButtonText:"确定",cancelButtonText:"取消"}),await S(a)}catch{}return}if(a==="repair"){try{await le.confirm("现场检修:不调度但仍刷新状态,确认?","维护确认",{type:"warning"}),await S(a)}catch{}return}await S(a)}return(e,a)=>{const m=Le,N=ce,D=be,G=_e,K=ve,Q=he,V=we;return M(),B("div",{class:X(["vehicle-health-card",U.value]),onClick:z,onDblclick:T},[l("div",bt,[t(m,{percentage:g.value,"stroke-width":4,"show-text":!1,color:x.value},null,8,["percentage","color"])]),l("div",ht,[l("div",wt,[l("span",gt,b(s.vehicle.id),1),l("span",{class:"vname",title:s.vehicle.name},b(s.vehicle.name),9,yt)]),l("div",{class:"head-actions",onClick:a[1]||(a[1]=Pe(()=>{},["stop"]))},[t(K,{trigger:"click",onCommand:i},{dropdown:n(()=>[t(G,null,{default:n(()=>[t(D,{command:"online"},{default:n(()=>[...a[2]||(a[2]=[_("上线",-1)])]),_:1}),t(D,{command:"offline"},{default:n(()=>[...a[3]||(a[3]=[_("下线维护",-1)])]),_:1}),t(D,{command:"repair"},{default:n(()=>[...a[4]||(a[4]=[_("现场检修",-1)])]),_:1}),t(D,{command:"blown",divided:""},{default:n(()=>[...a[5]||(a[5]=[_("返厂检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(N,{size:"small",text:"",icon:p(Re)},null,8,["icon"])]),_:1}),t(Q,{"model-value":v.value,size:"small",disabled:!s.canWrite,"inline-prompt":"","active-text":"开","inactive-text":"关",onChange:a[0]||(a[0]=J=>c(!!J))},null,8,["model-value","disabled"])])]),l("div",Ct,[l("div",It,[t(V,{size:36},{default:n(()=>[t(p(ze))]),_:1})]),l("div",Vt,[l("div",kt,[a[6]||(a[6]=l("span",{class:"label"},"IP",-1)),l("span",$t,b(s.vehicle.ip??"—"),1)]),l("div",Mt,[a[7]||(a[7]=l("span",{class:"label"},"延迟",-1)),l("span",{class:X(["value",y.value])},b(u.value),3)]),l("div",xt,[a[8]||(a[8]=l("span",{class:"label"},"故障率",-1)),l("span",{class:X(["value",H.value])},b(I.value),3)]),l("div",Et,[a[9]||(a[9]=l("span",{class:"label"},"群组",-1)),l("span",At,b(s.vehicle.group??"—"),1)]),l("div",Ft,[a[10]||(a[10]=l("span",{class:"label"},"状态",-1)),l("span",St,b(s.vehicle.lstatus??w.value),1)])])]),l("div",Ut,[l("div",Bt,[t(V,null,{default:n(()=>[t(p(Ne))]),_:1}),l("span",null,b(O.value),1)]),l("div",Ot,[t(V,null,{default:n(()=>[t(p(He))]),_:1}),l("span",null,b(L.value),1)]),l("div",Tt,[t(V,{class:X({"is-alarm":s.vehicle.isAlarmActive})},{default:n(()=>[t(p(We))]),_:1},8,["class"]),l("span",null,b(s.vehicle.isAlarmActive?"报警":"正常"),1)]),l("div",Dt,[t(V,{class:X({"is-down":s.vehicle.reachable===!1})},{default:n(()=>[t(p(qe))]),_:1},8,["class"]),l("span",null,b(s.vehicle.reachable===!1?"不可达":"可达"),1)])]),l("div",Lt,[l("span",null,"电量 "+b(g.value)+"%",1),a[11]||(a[11]=l("span",{class:"hint"},"双击打开车载界面",-1))])],34)}}}),Rt=de(Pt,[["__scopeId","data-v-30c5a691"]]),ae=F([]),ie=F(!1);function Fe(){const s=xe();async function d(f=!1){ie.value=!0;try{const g=(await s.load("fleet",f)).payload??R;ae.value=JSON.parse(JSON.stringify(g.groups??[]))}finally{ie.value=!1}}function o(f){for(const w of ae.value)if(w.carIds.includes(f))return w.name||w.id}function k(f){for(const w of ae.value)if(w.carIds.includes(f))return w.region||void 0}return{groups:ae,loading:ie,reload:d,fleetNameForCarId:o,regionForCarId:k}}const zt={class:"fleet-alloc"},Nt={class:"fa-header"},Ht={class:"fa-body"},Wt={class:"fc-row"},qt={key:0,class:"fa-note"},jt=ee({__name:"FleetAllocationPanel",props:{cars:{},canWrite:{type:Boolean}},emits:["saved"],setup(s,{emit:d}){const o=s,k=d,f=xe(),{reload:w}=Fe(),g=F(!1),x=F(!1),v=F(!1),U=F({ota:R.ota,batchOps:R.batchOps,networkDiag:R.networkDiag}),u=F([]);function y(){v.value=!0}const I=C(()=>{const i=new Map;for(const e of o.cars)i.set(e.id,e.name??e.id);return i});function H(i){const e=new Set;for(const a of u.value)if(a!==i)for(const m of a.carIds)e.add(m);return o.cars.map(a=>({id:a.id,label:a.name&&a.name!==a.id?`${a.id} · ${a.name}`:a.id,takenByOther:e.has(a.id)}))}const O=C(()=>{const i=I.value,e=[];for(const a of u.value)for(const m of a.carIds)!i.has(m)&&!e.includes(m)&&e.push(m);return e});function L(){const i=new Set(u.value.map(m=>m.id));let e=u.value.length+1,a=`G-${e}`;for(;i.has(a);)e+=1,a=`G-${e}`;return a}function z(){u.value.push({id:L(),name:"新车队",floor:"",region:"",carIds:[]}),y()}function T(i){u.value.splice(i,1),y()}async function S(i=!1){g.value=!0;try{const a=(await f.load("fleet",i)).payload??R;U.value={ota:a.ota??R.ota,batchOps:a.batchOps??R.batchOps,networkDiag:a.networkDiag??R.networkDiag},u.value=JSON.parse(JSON.stringify(a.groups??[])),v.value=!1,i&&q.success("已重载车队配置")}catch(e){q.error(`加载车队配置失败:${e instanceof Error?e.message:String(e)}`)}finally{g.value=!1}}async function c(){x.value=!0;try{const i={...U.value,groups:JSON.parse(JSON.stringify(u.value))},e=await f.save("fleet",i);v.value=!1,await w(!0),k("saved"),q.success(`车队分配已保存 v${e.version}`)}catch(i){q.error(`保存失败:${i instanceof Error?i.message:String(i)}`)}finally{x.value=!1}}return ue(()=>S()),(i,e)=>{const a=je,m=ce,N=ke,D=fe,G=Ve,K=Ie,Q=Ce;return M(),B("section",zt,[l("div",Nt,[e[5]||(e[5]=l("span",{class:"fa-title"},"车队分配",-1)),t(a,{size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[1]||(e[1]=[_("区域管理",-1)])]),_:1}),e[6]||(e[6]=l("span",{class:"fa-sub"},"将车辆分配到车队,并设定车队名称 / 区域 / 楼层",-1)),e[7]||(e[7]=l("div",{class:"spacer"},null,-1)),t(m,{size:"small",icon:p(ge),loading:g.value,onClick:e[0]||(e[0]=V=>S(!0))},{default:n(()=>[...e[2]||(e[2]=[_("重载",-1)])]),_:1},8,["icon","loading"]),t(m,{size:"small",icon:p(Je),disabled:!s.canWrite,onClick:z},{default:n(()=>[...e[3]||(e[3]=[_("新建车队",-1)])]),_:1},8,["icon","disabled"]),t(m,{size:"small",type:"primary",icon:p(Ge),loading:x.value,disabled:!s.canWrite||!v.value,onClick:c},{default:n(()=>[...e[4]||(e[4]=[_(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])]),ye((M(),B("div",Ht,[u.value.length?re("",!0):(M(),j(N,{key:0,description:"暂无车队,点击「新建车队」开始分配"})),(M(!0),B(Y,null,Z(u.value,(V,J)=>(M(),B("div",{key:V.id,class:"fleet-card"},[l("div",Wt,[t(D,{modelValue:V.name,"onUpdate:modelValue":A=>V.name=A,size:"small",class:"fc-name",placeholder:"车队名称",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[8]||(e[8]=[_("名称",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.region,"onUpdate:modelValue":A=>V.region=A,size:"small",class:"fc-region",placeholder:"区域",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[9]||(e[9]=[_("区域",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.floor,"onUpdate:modelValue":A=>V.floor=A,size:"small",class:"fc-floor",placeholder:"楼层",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[10]||(e[10]=[_("楼层",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(a,{size:"small",effect:"plain"},{default:n(()=>[_(b(V.carIds.length)+" 辆",1)]),_:2},1024),t(m,{size:"small",type:"danger",text:"",icon:p(Ke),disabled:!s.canWrite,onClick:A=>T(J)},{default:n(()=>[...e[11]||(e[11]=[_(" 删除 ",-1)])]),_:1},8,["icon","disabled","onClick"])]),t(K,{modelValue:V.carIds,"onUpdate:modelValue":A=>V.carIds=A,size:"small",multiple:"",filterable:"","collapse-tags":"","collapse-tags-tooltip":"",class:"fc-cars",placeholder:"选择要分配到该车队的车辆",disabled:!s.canWrite,onChange:y},{default:n(()=>[(M(!0),B(Y,null,Z(H(V),A=>(M(),j(G,{key:A.id,label:A.label,value:A.id,disabled:A.takenByOther},null,8,["label","value","disabled"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled"])]))),128))])),[[Q,g.value]]),O.value.length?(M(),B("p",qt," 提示:以下已分配的车辆 ID 不在当前在册车辆中:"+b(O.value.join("、")),1)):re("",!0)])}}}),Jt=de(jt,[["__scopeId","data-v-f299c1d2"]]),Gt=ee({__name:"VehicleMaintenanceView",setup(s){return(d,o)=>{const k=Ye,f=Xe,w=Ze,g=he,x=fe,v=et,U=Qe;return M(),j(Ee,{section:"vehicle",title:"车辆维护策略",description:"电量阈值、故障上报、自动报修(VehicleMaintenancePolicy)",defaults:p(tt)},{default:n(({payload:u,update:y})=>[t(U,{"label-width":"160px",model:u},{default:n(()=>[t(f,{label:"低电量阈值"},{default:n(()=>[t(k,{"model-value":u.lowBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,lowBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"临界电量阈值"},{default:n(()=>[t(k,{"model-value":u.criticalBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,criticalBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[0]||(o[0]=[_("故障上报",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.faultReport.enabled,"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"接收邮箱"},{default:n(()=>[t(x,{"model-value":u.faultReport.emailTo.join(", "),"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,emailTo:I.split(/[,\s]+/).filter(Boolean)}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[1]||(o[1]=[_("自动报修",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.autoRepair.enabled,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"冷却时间 (秒)"},{default:n(()=>[t(v,{"model-value":u.autoRepair.cooldownSec,min:0,max:86400,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,cooldownSec:I??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}}),Kt=ee({__name:"FleetLifecycleView",setup(s){return(d,o)=>{const k=at,f=nt,w=lt,g=Me,x=$e;return M(),j(Ee,{section:"fleet",title:"车队全生命周期",description:"分区域/跨楼层/多车协作;OTA、批量操作、网络诊断(FleetLifecycleConfig)",defaults:p(R)},{default:n(({payload:v})=>[t(k,{type:"info",closable:!1,"show-icon":"",title:"车队分配已移至「车辆运维 → 运维总览」",description:"在运维总览中可新建车队、设定名称/区域/楼层,并将车辆分配到各车队。",style:{"margin-bottom":"12px"}}),t(x,{"model-value":"ota"},{default:n(()=>[t(g,{name:"ota",label:"OTA 升级"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"启用"},{default:n(()=>[_(b(v.ota.enabled?"是":"否"),1)]),_:2},1024),t(f,{label:"批次大小"},{default:n(()=>[_(b(v.ota.batchSize),1)]),_:2},1024),t(f,{label:"失败回滚"},{default:n(()=>[_(b(v.ota.rollbackOnFail?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"batch",label:"批量操作"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"需确认"},{default:n(()=>[_(b(v.batchOps.confirmationRequired?"是":"否"),1)]),_:2},1024),t(f,{label:"最大批量"},{default:n(()=>[_(b(v.batchOps.maxBatch),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"diag",label:"网络诊断"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"RTT 阈值 (ms)"},{default:n(()=>[_(b(v.networkDiag.rttThresholdMs),1)]),_:2},1024),t(f,{label:"丢包阈值"},{default:n(()=>[_(b(v.networkDiag.packetLossThreshold),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});async function Qt(){const{data:s}=await ot.get("/sl/projection/fleet/health");return Array.isArray(s)?s:[]}const Xt=5e3,Yt=2e4;function Zt(s){const d=(s.lstatus??"").toLowerCase();return/返厂|blown/.test(d)?"blown":/现场检修|repair/.test(d)?"repair":/下线|offline/.test(d)||s.state==="offline"?"offline":"online"}function ea(s,d){return{...s,ip:d?.ip??s.ip,onboardUrl:d?.onboardUrl??s.onboardUrl??(s.ip?`http://${s.ip}:8081`:void 0),latencyMs:d?.latencyMs,reachable:d?.reachable,faultRatePercent:d?.faultRatePercent,isAlarmActive:d?.isAlarmActive??s.state==="fault",cpuPercent:d?.cpuPercent,memPercent:d?.memPercent,maintenanceMode:Zt(s)}}function ta(){const s=me([]),d=me([]),o=F(!1),k=F(!1),f=F(null);let w=null,g=null;const x=C(()=>{const c=new Map;for(const i of d.value)c.set(i.carId,i);return c}),v=C(()=>s.value.map(c=>{const i=c.rawId??parseInt(c.id.replace(/\D/g,""),10),e=Number.isFinite(i)?x.value.get(i):void 0;return ea(c,e)})),U=C(()=>v.value.length),u=C(()=>v.value.filter(c=>c.state!=="offline"&&c.maintenanceMode==="online").length),y=C(()=>v.value.filter(c=>c.maintenanceMode==="offline"||c.maintenanceMode==="repair"||c.maintenanceMode==="blown").length),I=C(()=>v.value.filter(c=>c.isAlarmActive).length),H=C(()=>v.value.filter(c=>c.reachable===!1).length);async function O(){o.value=!0;try{s.value=await mt()}finally{o.value=!1}}async function L(){k.value=!0;try{d.value=await Qt()}finally{k.value=!1}}async function z(){await Promise.all([O(),L()])}function T(c,i){const e=s.value.findIndex(m=>(m.rawId??parseInt(m.id.replace(/\D/g,""),10))===c);if(e<0)return;const a=[...s.value];a[e]={...a[e],...i,lastUpdate:new Date().toISOString()},s.value=a}const S=pt({extraEventKinds:["alarm","car-state"],autoConnect:!0});return S.on(c=>{if(c.kind==="car-state"&&c.payload&&typeof c.payload=="object"){const i=c.payload,e=i.rawId;e!=null&&T(e,{state:i.state,lstatus:i.lstatus})}if(c.kind==="alarm"&&c.payload&&typeof c.payload=="object"){const i=c.payload;if(i.carId!=null){const e=i.action==="raise"||i.action==="update",a=d.value.findIndex(m=>m.carId===i.carId);if(a>=0){const m=[...d.value];m[a]={...m[a],isAlarmActive:e},d.value=m}T(i.carId,{state:e?"fault":void 0})}}}),ue(()=>{z(),w=setInterval(()=>void O(),Xt),g=setInterval(()=>void L(),Yt)}),st(()=>{w&&clearInterval(w),g&&clearInterval(g),S.disconnect()}),{cardModels:v,loading:o,healthLoading:k,selectedId:f,totalCount:U,onlineCount:u,maintenanceCount:y,alarmCount:I,unreachableCount:H,refreshAll:z,loadCars:O,loadHealth:L}}const aa={class:"vehicle-hub-page"},la={class:"overview-pane"},na={class:"hub-toolbar"},oa={class:"stats-row"},sa={class:"stat"},ia={class:"num"},ra={class:"stat online"},ca={class:"num"},da={class:"stat warn"},ua={class:"num"},fa={class:"stat danger"},ma={class:"num"},pa={class:"stat muted"},va={class:"num"},_a={class:"filters-row"},ba={class:"card-grid"},ha={class:"config-pane"},wa={class:"config-pane"},ga=ee({__name:"VehicleHubView",setup(s){const d=it(),o=C(()=>d.scope==="Platform"||(d.effectivePermissions?.allowedOps??[]).includes("*")),k=rt(),f=ct(),w=["overview","maintenance","fleet"];function g(){const h=k.query.tab;return typeof h=="string"&&w.includes(h)?h:"overview"}const x=F(g());pe(x,h=>{k.query.tab!==h&&f.replace({query:{...k.query,tab:h}})}),pe(()=>k.query.tab,()=>{const h=g();h!==x.value&&(x.value=h)});const{cardModels:v,loading:U,healthLoading:u,selectedId:y,totalCount:I,onlineCount:H,maintenanceCount:O,alarmCount:L,unreachableCount:z,refreshAll:T}=ta(),{groups:S,reload:c,fleetNameForCarId:i,regionForCarId:e}=Fe();ue(()=>void c());const a=F(""),m=F(""),N=F(""),D=[{value:"idle",label:"空闲"},{value:"running",label:"运行"},{value:"charging",label:"充电"},{value:"paused",label:"暂停"},{value:"fault",label:"故障"},{value:"offline",label:"离线"}],G=C(()=>S.value.map(h=>({value:h.id,label:h.region?`${h.name}(${h.region})`:h.name||h.id})));function K(){c(!0)}function Q(h){if(!N.value)return!0;const r=S.value.find(E=>E.id===N.value);return r?r.carIds.includes(h):!1}const V=C(()=>{const h=a.value.trim().toLowerCase(),r=h?h.split(/\s+/).filter(Boolean):[];return v.value.filter(E=>{if(m.value&&E.state!==m.value||!Q(E.id))return!1;if(!r.length)return!0;const P=i(E.id),W=e(E.id),ne=[E.id,E.name,E.ip,E.group,P,W,E.lstatus].filter(Boolean).join(" ").toLowerCase();return r.every(te=>ne.includes(te))})}),J=C(()=>y.value?[y.value]:[]);async function A(h){const r=h,E=V.value.filter(P=>y.value?P.id===y.value:!0);if(E.length)try{await le.confirm(`对 ${E.length} 辆车执行「${h}」?`,"批量维护",{type:"warning"});for(const P of E){const W=P.rawId??parseInt(P.id.replace(/\D/g,""),10);Number.isFinite(W)&&await Ae(W,r)}q.success("批量操作已提交"),await T()}catch{}}return(h,r)=>{const E=fe,P=Ve,W=Ie,ne=we,te=ce,oe=be,Se=_e,Ue=ve,Be=ke,se=Me,Oe=$e,Te=Ce;return M(),B("div",aa,[t(Oe,{modelValue:x.value,"onUpdate:modelValue":r[4]||(r[4]=$=>x.value=$),class:"hub-tabs"},{default:n(()=>[t(se,{name:"overview",label:"运维总览"},{default:n(()=>[l("div",la,[l("div",na,[l("div",oa,[l("div",sa,[l("span",ia,b(p(I)),1),r[5]||(r[5]=l("span",{class:"label"},"总数",-1))]),l("div",ra,[l("span",ca,b(p(H)),1),r[6]||(r[6]=l("span",{class:"label"},"在线",-1))]),l("div",da,[l("span",ua,b(p(O)),1),r[7]||(r[7]=l("span",{class:"label"},"维护中",-1))]),l("div",fa,[l("span",ma,b(p(L)),1),r[8]||(r[8]=l("span",{class:"label"},"报警",-1))]),l("div",pa,[l("span",va,b(p(z)),1),r[9]||(r[9]=l("span",{class:"label"},"不可达",-1))])]),l("div",_a,[t(E,{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=$=>a.value=$),size:"small",clearable:"",placeholder:"搜索 ID / 名称 / IP",class:"search-input","prefix-icon":p(dt)},null,8,["modelValue","prefix-icon"]),t(W,{modelValue:m.value,"onUpdate:modelValue":r[1]||(r[1]=$=>m.value=$),size:"small",clearable:"",placeholder:"状态",class:"filter-select"},{default:n(()=>[(M(),B(Y,null,Z(D,$=>t(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),t(W,{modelValue:N.value,"onUpdate:modelValue":r[2]||(r[2]=$=>N.value=$),size:"small",clearable:"",placeholder:"车队",class:"filter-select fleet-filter"},{default:n(()=>[(M(!0),B(Y,null,Z(G.value,$=>(M(),j(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(Ue,{disabled:!o.value||!J.value.length,onCommand:A},{dropdown:n(()=>[t(Se,null,{default:n(()=>[t(oe,{command:"online"},{default:n(()=>[...r[11]||(r[11]=[_("批量上线",-1)])]),_:1}),t(oe,{command:"offline"},{default:n(()=>[...r[12]||(r[12]=[_("批量下线",-1)])]),_:1}),t(oe,{command:"repair"},{default:n(()=>[...r[13]||(r[13]=[_("批量现场检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(te,{size:"small",disabled:!o.value||!J.value.length},{default:n(()=>[r[10]||(r[10]=_(" 批量维护 ",-1)),t(ne,{class:"el-icon--right"},{default:n(()=>[t(p(ut))]),_:1})]),_:1},8,["disabled"])]),_:1},8,["disabled"]),t(te,{size:"small",icon:p(ge),loading:p(U)||p(u),onClick:p(T)},{default:n(()=>[...r[14]||(r[14]=[_(" 刷新 ",-1)])]),_:1},8,["icon","loading","onClick"])])]),ye((M(),B("div",ba,[(M(!0),B(Y,null,Z(V.value,$=>(M(),j(Rt,{key:$.id,vehicle:$,selected:p(y)===$.id,"can-write":o.value,onSelect:r[3]||(r[3]=De=>y.value=De),onMaintenanceChanged:p(T)},null,8,["vehicle","selected","can-write","onMaintenanceChanged"]))),128)),!V.value.length&&!p(U)?(M(),j(Be,{key:0,description:"无匹配车辆"})):re("",!0)])),[[Te,p(U)&&!p(v).length]]),t(Jt,{cars:p(v),"can-write":o.value,onSaved:K},null,8,["cars","can-write"]),r[15]||(r[15]=l("p",{class:"footnote"},"故障率 = 报警占用时长 ÷ 自上线以来运行时长(SimpleLite 进程内累计)",-1))])]),_:1}),t(se,{name:"maintenance",label:"维护策略",lazy:""},{default:n(()=>[l("div",ha,[t(Gt)])]),_:1}),t(se,{name:"fleet",label:"车队生命周期",lazy:""},{default:n(()=>[l("div",wa,[t(Kt)])]),_:1})]),_:1},8,["modelValue"])])}}}),Qa=de(ga,[["__scopeId","data-v-0caa3fa5"]]);export{Qa as default}; +import{aI as ee,b9 as M,aE as B,b3 as X,aB as l,aH as t,$ as Le,bq as b,bL as Pe,I as ve,bJ as n,r as ce,bt as p,b1 as Re,K as _e,J as be,aG as _,a8 as he,Q as we,bC as ze,aA as Ne,av as He,bH as We,ay as qe,ax as C,Y as le,X as q,ak as de,b as R,bh as F,b7 as ue,ad as je,bi as ge,bc as Je,as as Ge,bK as ye,bA as Ce,aC as j,aD as re,ai as Y,bj as Z,R as fe,aK as Ke,a4 as Ie,Z as Ve,L as ke,N as Qe,O as Xe,a5 as Ye,H as Ze,S as et,k as tt,E as at,ac as $e,a9 as Me,C as lt,F as nt,aU as ot,b8 as st,bp as me,bv as it,bI as pe,bw as rt,bx as ct,bn as dt,am as ut}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as ft}from"./reflection-B_glb6eT.js";import{u as xe,C as Ee}from"./ConfigPageBase-MHa7yfOO.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css */import{l as mt}from"./projection-BMms551H.js";import{u as pt}from"./useProjectionStream-BBHmpNXC.js";/* empty css *//* empty css */import"./PermissionGuard-BlMEkqrL.js";import"./monitorConfigCache-BigdkiFw.js";const vt={online:"OnlineCar",offline:"OfflineCar",repair:"Repair",blown:"Blown"};async function Ae(s,d){const o=vt[d];if(!o)return!1;try{return await ft.execute("car",s,o),!0}catch{return!1}}function _t(s,d){const o=s??(d?`http://${d}:8081`:null);o&&window.open(o,"_blank","noopener,noreferrer")}const bt={class:"battery-strip"},ht={class:"card-head"},wt={class:"title-block"},gt={class:"vid"},yt=["title"],Ct={class:"card-body"},It={class:"thumb"},Vt={class:"metrics"},kt={class:"metric-row"},$t={class:"value mono"},Mt={class:"metric-row"},xt={class:"metric-row"},Et={class:"metric-row"},At={class:"value"},Ft={class:"metric-row"},St={class:"value"},Ut={class:"icon-grid"},Bt={class:"icon-cell",title:"CPU"},Ot={class:"icon-cell",title:"内存"},Tt={class:"icon-cell",title:"报警"},Dt={class:"icon-cell",title:"连接"},Lt={class:"card-foot"},Pt=ee({__name:"VehicleHealthCard",props:{vehicle:{},selected:{type:Boolean},canWrite:{type:Boolean}},emits:["select","maintenanceChanged"],setup(s,{emit:d}){const o=s,k=d,f={idle:"空闲",running:"运行",charging:"充电",paused:"暂停",fault:"故障",offline:"离线"},w=C(()=>f[o.vehicle.state]??o.vehicle.state),g=C(()=>{const e=o.vehicle.batterySoc??0,a=e>1?e:e*100;return Math.max(0,Math.min(100,Math.round(a)))}),x=C(()=>{const e=g.value;return e<20?"#f56c6c":e<50?"#e6a23c":"#67c23a"}),v=C(()=>o.vehicle.maintenanceMode==="online"),U=C(()=>({"is-selected":o.selected,"is-alarm":o.vehicle.isAlarmActive,"is-offline":o.vehicle.maintenanceMode==="offline"||o.vehicle.state==="offline","is-maintenance":o.vehicle.maintenanceMode==="repair"||o.vehicle.maintenanceMode==="blown","is-unreachable":o.vehicle.reachable===!1})),u=C(()=>{const e=o.vehicle.latencyMs;return e==null?"—":o.vehicle.reachable===!1?"超时":`${e} ms`}),y=C(()=>{const e=o.vehicle.latencyMs;return o.vehicle.reachable===!1?"danger":e!=null&&e>80?"warn":""}),I=C(()=>{const e=o.vehicle.faultRatePercent;return e==null?"—":`${e.toFixed(2)}%`}),H=C(()=>{const e=o.vehicle.faultRatePercent??0;return e>=5?"danger":e>=1?"warn":""}),O=C(()=>{const e=o.vehicle.cpuPercent;return e!=null?`${Math.round(e)}%`:"—"}),L=C(()=>{const e=o.vehicle.memPercent;return e!=null?`${Math.round(e)}%`:"—"});function z(){k("select",o.vehicle.id)}function T(e){e.target.closest(".head-actions")||_t(o.vehicle.onboardUrl,o.vehicle.ip)}async function S(e){const a=o.vehicle.rawId??parseInt(o.vehicle.id.replace(/\D/g,""),10);if(!Number.isFinite(a))return;await Ae(a,e)?(q.success("维护状态已更新"),k("maintenanceChanged")):q.error("维护操作失败")}async function c(e){if(!o.canWrite)return;const a=e?"online":"offline";try{await le.confirm(e?"确认将车辆上线?":"确认将车辆下线维护?","维护确认",{type:"warning",confirmButtonText:"确定",cancelButtonText:"取消"}),await S(a)}catch{}}async function i(e){if(!o.canWrite)return;const a=e;if(a==="blown"){try{await le.confirm("返厂检修将停止调度并清空站点,确认?","危险操作",{type:"error",confirmButtonText:"确定",cancelButtonText:"取消"}),await S(a)}catch{}return}if(a==="repair"){try{await le.confirm("现场检修:不调度但仍刷新状态,确认?","维护确认",{type:"warning"}),await S(a)}catch{}return}await S(a)}return(e,a)=>{const m=Le,N=ce,D=be,G=_e,K=ve,Q=he,V=we;return M(),B("div",{class:X(["vehicle-health-card",U.value]),onClick:z,onDblclick:T},[l("div",bt,[t(m,{percentage:g.value,"stroke-width":4,"show-text":!1,color:x.value},null,8,["percentage","color"])]),l("div",ht,[l("div",wt,[l("span",gt,b(s.vehicle.id),1),l("span",{class:"vname",title:s.vehicle.name},b(s.vehicle.name),9,yt)]),l("div",{class:"head-actions",onClick:a[1]||(a[1]=Pe(()=>{},["stop"]))},[t(K,{trigger:"click",onCommand:i},{dropdown:n(()=>[t(G,null,{default:n(()=>[t(D,{command:"online"},{default:n(()=>[...a[2]||(a[2]=[_("上线",-1)])]),_:1}),t(D,{command:"offline"},{default:n(()=>[...a[3]||(a[3]=[_("下线维护",-1)])]),_:1}),t(D,{command:"repair"},{default:n(()=>[...a[4]||(a[4]=[_("现场检修",-1)])]),_:1}),t(D,{command:"blown",divided:""},{default:n(()=>[...a[5]||(a[5]=[_("返厂检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(N,{size:"small",text:"",icon:p(Re)},null,8,["icon"])]),_:1}),t(Q,{"model-value":v.value,size:"small",disabled:!s.canWrite,"inline-prompt":"","active-text":"开","inactive-text":"关",onChange:a[0]||(a[0]=J=>c(!!J))},null,8,["model-value","disabled"])])]),l("div",Ct,[l("div",It,[t(V,{size:36},{default:n(()=>[t(p(ze))]),_:1})]),l("div",Vt,[l("div",kt,[a[6]||(a[6]=l("span",{class:"label"},"IP",-1)),l("span",$t,b(s.vehicle.ip??"—"),1)]),l("div",Mt,[a[7]||(a[7]=l("span",{class:"label"},"延迟",-1)),l("span",{class:X(["value",y.value])},b(u.value),3)]),l("div",xt,[a[8]||(a[8]=l("span",{class:"label"},"故障率",-1)),l("span",{class:X(["value",H.value])},b(I.value),3)]),l("div",Et,[a[9]||(a[9]=l("span",{class:"label"},"群组",-1)),l("span",At,b(s.vehicle.group??"—"),1)]),l("div",Ft,[a[10]||(a[10]=l("span",{class:"label"},"状态",-1)),l("span",St,b(s.vehicle.lstatus??w.value),1)])])]),l("div",Ut,[l("div",Bt,[t(V,null,{default:n(()=>[t(p(Ne))]),_:1}),l("span",null,b(O.value),1)]),l("div",Ot,[t(V,null,{default:n(()=>[t(p(He))]),_:1}),l("span",null,b(L.value),1)]),l("div",Tt,[t(V,{class:X({"is-alarm":s.vehicle.isAlarmActive})},{default:n(()=>[t(p(We))]),_:1},8,["class"]),l("span",null,b(s.vehicle.isAlarmActive?"报警":"正常"),1)]),l("div",Dt,[t(V,{class:X({"is-down":s.vehicle.reachable===!1})},{default:n(()=>[t(p(qe))]),_:1},8,["class"]),l("span",null,b(s.vehicle.reachable===!1?"不可达":"可达"),1)])]),l("div",Lt,[l("span",null,"电量 "+b(g.value)+"%",1),a[11]||(a[11]=l("span",{class:"hint"},"双击打开车载界面",-1))])],34)}}}),Rt=de(Pt,[["__scopeId","data-v-30c5a691"]]),ae=F([]),ie=F(!1);function Fe(){const s=xe();async function d(f=!1){ie.value=!0;try{const g=(await s.load("fleet",f)).payload??R;ae.value=JSON.parse(JSON.stringify(g.groups??[]))}finally{ie.value=!1}}function o(f){for(const w of ae.value)if(w.carIds.includes(f))return w.name||w.id}function k(f){for(const w of ae.value)if(w.carIds.includes(f))return w.region||void 0}return{groups:ae,loading:ie,reload:d,fleetNameForCarId:o,regionForCarId:k}}const zt={class:"fleet-alloc"},Nt={class:"fa-header"},Ht={class:"fa-body"},Wt={class:"fc-row"},qt={key:0,class:"fa-note"},jt=ee({__name:"FleetAllocationPanel",props:{cars:{},canWrite:{type:Boolean}},emits:["saved"],setup(s,{emit:d}){const o=s,k=d,f=xe(),{reload:w}=Fe(),g=F(!1),x=F(!1),v=F(!1),U=F({ota:R.ota,batchOps:R.batchOps,networkDiag:R.networkDiag}),u=F([]);function y(){v.value=!0}const I=C(()=>{const i=new Map;for(const e of o.cars)i.set(e.id,e.name??e.id);return i});function H(i){const e=new Set;for(const a of u.value)if(a!==i)for(const m of a.carIds)e.add(m);return o.cars.map(a=>({id:a.id,label:a.name&&a.name!==a.id?`${a.id} · ${a.name}`:a.id,takenByOther:e.has(a.id)}))}const O=C(()=>{const i=I.value,e=[];for(const a of u.value)for(const m of a.carIds)!i.has(m)&&!e.includes(m)&&e.push(m);return e});function L(){const i=new Set(u.value.map(m=>m.id));let e=u.value.length+1,a=`G-${e}`;for(;i.has(a);)e+=1,a=`G-${e}`;return a}function z(){u.value.push({id:L(),name:"新车队",floor:"",region:"",carIds:[]}),y()}function T(i){u.value.splice(i,1),y()}async function S(i=!1){g.value=!0;try{const a=(await f.load("fleet",i)).payload??R;U.value={ota:a.ota??R.ota,batchOps:a.batchOps??R.batchOps,networkDiag:a.networkDiag??R.networkDiag},u.value=JSON.parse(JSON.stringify(a.groups??[])),v.value=!1,i&&q.success("已重载车队配置")}catch(e){q.error(`加载车队配置失败:${e instanceof Error?e.message:String(e)}`)}finally{g.value=!1}}async function c(){x.value=!0;try{const i={...U.value,groups:JSON.parse(JSON.stringify(u.value))},e=await f.save("fleet",i);v.value=!1,await w(!0),k("saved"),q.success(`车队分配已保存 v${e.version}`)}catch(i){q.error(`保存失败:${i instanceof Error?i.message:String(i)}`)}finally{x.value=!1}}return ue(()=>S()),(i,e)=>{const a=je,m=ce,N=ke,D=fe,G=Ve,K=Ie,Q=Ce;return M(),B("section",zt,[l("div",Nt,[e[5]||(e[5]=l("span",{class:"fa-title"},"车队分配",-1)),t(a,{size:"small",type:"info",effect:"plain"},{default:n(()=>[...e[1]||(e[1]=[_("区域管理",-1)])]),_:1}),e[6]||(e[6]=l("span",{class:"fa-sub"},"将车辆分配到车队,并设定车队名称 / 区域 / 楼层",-1)),e[7]||(e[7]=l("div",{class:"spacer"},null,-1)),t(m,{size:"small",icon:p(ge),loading:g.value,onClick:e[0]||(e[0]=V=>S(!0))},{default:n(()=>[...e[2]||(e[2]=[_("重载",-1)])]),_:1},8,["icon","loading"]),t(m,{size:"small",icon:p(Je),disabled:!s.canWrite,onClick:z},{default:n(()=>[...e[3]||(e[3]=[_("新建车队",-1)])]),_:1},8,["icon","disabled"]),t(m,{size:"small",type:"primary",icon:p(Ge),loading:x.value,disabled:!s.canWrite||!v.value,onClick:c},{default:n(()=>[...e[4]||(e[4]=[_(" 保存 ",-1)])]),_:1},8,["icon","loading","disabled"])]),ye((M(),B("div",Ht,[u.value.length?re("",!0):(M(),j(N,{key:0,description:"暂无车队,点击「新建车队」开始分配"})),(M(!0),B(Y,null,Z(u.value,(V,J)=>(M(),B("div",{key:V.id,class:"fleet-card"},[l("div",Wt,[t(D,{modelValue:V.name,"onUpdate:modelValue":A=>V.name=A,size:"small",class:"fc-name",placeholder:"车队名称",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[8]||(e[8]=[_("名称",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.region,"onUpdate:modelValue":A=>V.region=A,size:"small",class:"fc-region",placeholder:"区域",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[9]||(e[9]=[_("区域",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(D,{modelValue:V.floor,"onUpdate:modelValue":A=>V.floor=A,size:"small",class:"fc-floor",placeholder:"楼层",disabled:!s.canWrite,onInput:y},{prepend:n(()=>[...e[10]||(e[10]=[_("楼层",-1)])]),_:1},8,["modelValue","onUpdate:modelValue","disabled"]),t(a,{size:"small",effect:"plain"},{default:n(()=>[_(b(V.carIds.length)+" 辆",1)]),_:2},1024),t(m,{size:"small",type:"danger",text:"",icon:p(Ke),disabled:!s.canWrite,onClick:A=>T(J)},{default:n(()=>[...e[11]||(e[11]=[_(" 删除 ",-1)])]),_:1},8,["icon","disabled","onClick"])]),t(K,{modelValue:V.carIds,"onUpdate:modelValue":A=>V.carIds=A,size:"small",multiple:"",filterable:"","collapse-tags":"","collapse-tags-tooltip":"",class:"fc-cars",placeholder:"选择要分配到该车队的车辆",disabled:!s.canWrite,onChange:y},{default:n(()=>[(M(!0),B(Y,null,Z(H(V),A=>(M(),j(G,{key:A.id,label:A.label,value:A.id,disabled:A.takenByOther},null,8,["label","value","disabled"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue","disabled"])]))),128))])),[[Q,g.value]]),O.value.length?(M(),B("p",qt," 提示:以下已分配的车辆 ID 不在当前在册车辆中:"+b(O.value.join("、")),1)):re("",!0)])}}}),Jt=de(jt,[["__scopeId","data-v-f299c1d2"]]),Gt=ee({__name:"VehicleMaintenanceView",setup(s){return(d,o)=>{const k=Ye,f=Xe,w=Ze,g=he,x=fe,v=et,U=Qe;return M(),j(Ee,{section:"vehicle",title:"车辆维护策略",description:"电量阈值、故障上报、自动报修(VehicleMaintenancePolicy)",defaults:p(tt)},{default:n(({payload:u,update:y})=>[t(U,{"label-width":"160px",model:u},{default:n(()=>[t(f,{label:"低电量阈值"},{default:n(()=>[t(k,{"model-value":u.lowBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,lowBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"临界电量阈值"},{default:n(()=>[t(k,{"model-value":u.criticalBatteryThreshold*100,min:0,max:100,"format-tooltip":I=>`${I}%`,"onUpdate:modelValue":I=>y({...u,criticalBatteryThreshold:(Number(I)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[0]||(o[0]=[_("故障上报",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.faultReport.enabled,"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"接收邮箱"},{default:n(()=>[t(x,{"model-value":u.faultReport.emailTo.join(", "),"onUpdate:modelValue":I=>y({...u,faultReport:{...u.faultReport,emailTo:I.split(/[,\s]+/).filter(Boolean)}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(w,{"content-position":"left"},{default:n(()=>[...o[1]||(o[1]=[_("自动报修",-1)])]),_:1}),t(f,{label:"启用"},{default:n(()=>[t(g,{"model-value":u.autoRepair.enabled,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,enabled:!!I}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(f,{label:"冷却时间 (秒)"},{default:n(()=>[t(v,{"model-value":u.autoRepair.cooldownSec,min:0,max:86400,"onUpdate:modelValue":I=>y({...u,autoRepair:{...u.autoRepair,cooldownSec:I??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}}),Kt=ee({__name:"FleetLifecycleView",setup(s){return(d,o)=>{const k=at,f=nt,w=lt,g=Me,x=$e;return M(),j(Ee,{section:"fleet",title:"车队全生命周期",description:"分区域/跨楼层/多车协作;OTA、批量操作、网络诊断(FleetLifecycleConfig)",defaults:p(R)},{default:n(({payload:v})=>[t(k,{type:"info",closable:!1,"show-icon":"",title:"车队分配已移至「车辆运维 → 运维总览」",description:"在运维总览中可新建车队、设定名称/区域/楼层,并将车辆分配到各车队。",style:{"margin-bottom":"12px"}}),t(x,{"model-value":"ota"},{default:n(()=>[t(g,{name:"ota",label:"OTA 升级"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"启用"},{default:n(()=>[_(b(v.ota.enabled?"是":"否"),1)]),_:2},1024),t(f,{label:"批次大小"},{default:n(()=>[_(b(v.ota.batchSize),1)]),_:2},1024),t(f,{label:"失败回滚"},{default:n(()=>[_(b(v.ota.rollbackOnFail?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"batch",label:"批量操作"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"需确认"},{default:n(()=>[_(b(v.batchOps.confirmationRequired?"是":"否"),1)]),_:2},1024),t(f,{label:"最大批量"},{default:n(()=>[_(b(v.batchOps.maxBatch),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),t(g,{name:"diag",label:"网络诊断"},{default:n(()=>[t(w,{column:2,border:""},{default:n(()=>[t(f,{label:"RTT 阈值 (ms)"},{default:n(()=>[_(b(v.networkDiag.rttThresholdMs),1)]),_:2},1024),t(f,{label:"丢包阈值"},{default:n(()=>[_(b(v.networkDiag.packetLossThreshold),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});async function Qt(){const{data:s}=await ot.get("/sl/projection/fleet/health");return Array.isArray(s)?s:[]}const Xt=5e3,Yt=2e4;function Zt(s){const d=(s.lstatus??"").toLowerCase();return/返厂|blown/.test(d)?"blown":/现场检修|repair/.test(d)?"repair":/下线|offline/.test(d)||s.state==="offline"?"offline":"online"}function ea(s,d){return{...s,ip:d?.ip??s.ip,onboardUrl:d?.onboardUrl??s.onboardUrl??(s.ip?`http://${s.ip}:8081`:void 0),latencyMs:d?.latencyMs,reachable:d?.reachable,faultRatePercent:d?.faultRatePercent,isAlarmActive:d?.isAlarmActive??s.state==="fault",cpuPercent:d?.cpuPercent,memPercent:d?.memPercent,maintenanceMode:Zt(s)}}function ta(){const s=me([]),d=me([]),o=F(!1),k=F(!1),f=F(null);let w=null,g=null;const x=C(()=>{const c=new Map;for(const i of d.value)c.set(i.carId,i);return c}),v=C(()=>s.value.map(c=>{const i=c.rawId??parseInt(c.id.replace(/\D/g,""),10),e=Number.isFinite(i)?x.value.get(i):void 0;return ea(c,e)})),U=C(()=>v.value.length),u=C(()=>v.value.filter(c=>c.state!=="offline"&&c.maintenanceMode==="online").length),y=C(()=>v.value.filter(c=>c.maintenanceMode==="offline"||c.maintenanceMode==="repair"||c.maintenanceMode==="blown").length),I=C(()=>v.value.filter(c=>c.isAlarmActive).length),H=C(()=>v.value.filter(c=>c.reachable===!1).length);async function O(){o.value=!0;try{s.value=await mt()}finally{o.value=!1}}async function L(){k.value=!0;try{d.value=await Qt()}finally{k.value=!1}}async function z(){await Promise.all([O(),L()])}function T(c,i){const e=s.value.findIndex(m=>(m.rawId??parseInt(m.id.replace(/\D/g,""),10))===c);if(e<0)return;const a=[...s.value];a[e]={...a[e],...i,lastUpdate:new Date().toISOString()},s.value=a}const S=pt({extraEventKinds:["alarm","car-state"],autoConnect:!0});return S.on(c=>{if(c.kind==="car-state"&&c.payload&&typeof c.payload=="object"){const i=c.payload,e=i.rawId;e!=null&&T(e,{state:i.state,lstatus:i.lstatus})}if(c.kind==="alarm"&&c.payload&&typeof c.payload=="object"){const i=c.payload;if(i.carId!=null){const e=i.action==="raise"||i.action==="update",a=d.value.findIndex(m=>m.carId===i.carId);if(a>=0){const m=[...d.value];m[a]={...m[a],isAlarmActive:e},d.value=m}T(i.carId,{state:e?"fault":void 0})}}}),ue(()=>{z(),w=setInterval(()=>void O(),Xt),g=setInterval(()=>void L(),Yt)}),st(()=>{w&&clearInterval(w),g&&clearInterval(g),S.disconnect()}),{cardModels:v,loading:o,healthLoading:k,selectedId:f,totalCount:U,onlineCount:u,maintenanceCount:y,alarmCount:I,unreachableCount:H,refreshAll:z,loadCars:O,loadHealth:L}}const aa={class:"vehicle-hub-page"},la={class:"overview-pane"},na={class:"hub-toolbar"},oa={class:"stats-row"},sa={class:"stat"},ia={class:"num"},ra={class:"stat online"},ca={class:"num"},da={class:"stat warn"},ua={class:"num"},fa={class:"stat danger"},ma={class:"num"},pa={class:"stat muted"},va={class:"num"},_a={class:"filters-row"},ba={class:"card-grid"},ha={class:"config-pane"},wa={class:"config-pane"},ga=ee({__name:"VehicleHubView",setup(s){const d=it(),o=C(()=>d.scope==="Platform"||(d.effectivePermissions?.allowedOps??[]).includes("*")),k=rt(),f=ct(),w=["overview","maintenance","fleet"];function g(){const h=k.query.tab;return typeof h=="string"&&w.includes(h)?h:"overview"}const x=F(g());pe(x,h=>{k.query.tab!==h&&f.replace({query:{...k.query,tab:h}})}),pe(()=>k.query.tab,()=>{const h=g();h!==x.value&&(x.value=h)});const{cardModels:v,loading:U,healthLoading:u,selectedId:y,totalCount:I,onlineCount:H,maintenanceCount:O,alarmCount:L,unreachableCount:z,refreshAll:T}=ta(),{groups:S,reload:c,fleetNameForCarId:i,regionForCarId:e}=Fe();ue(()=>void c());const a=F(""),m=F(""),N=F(""),D=[{value:"idle",label:"空闲"},{value:"running",label:"运行"},{value:"charging",label:"充电"},{value:"paused",label:"暂停"},{value:"fault",label:"故障"},{value:"offline",label:"离线"}],G=C(()=>S.value.map(h=>({value:h.id,label:h.region?`${h.name}(${h.region})`:h.name||h.id})));function K(){c(!0)}function Q(h){if(!N.value)return!0;const r=S.value.find(E=>E.id===N.value);return r?r.carIds.includes(h):!1}const V=C(()=>{const h=a.value.trim().toLowerCase(),r=h?h.split(/\s+/).filter(Boolean):[];return v.value.filter(E=>{if(m.value&&E.state!==m.value||!Q(E.id))return!1;if(!r.length)return!0;const P=i(E.id),W=e(E.id),ne=[E.id,E.name,E.ip,E.group,P,W,E.lstatus].filter(Boolean).join(" ").toLowerCase();return r.every(te=>ne.includes(te))})}),J=C(()=>y.value?[y.value]:[]);async function A(h){const r=h,E=V.value.filter(P=>y.value?P.id===y.value:!0);if(E.length)try{await le.confirm(`对 ${E.length} 辆车执行「${h}」?`,"批量维护",{type:"warning"});for(const P of E){const W=P.rawId??parseInt(P.id.replace(/\D/g,""),10);Number.isFinite(W)&&await Ae(W,r)}q.success("批量操作已提交"),await T()}catch{}}return(h,r)=>{const E=fe,P=Ve,W=Ie,ne=we,te=ce,oe=be,Se=_e,Ue=ve,Be=ke,se=Me,Oe=$e,Te=Ce;return M(),B("div",aa,[t(Oe,{modelValue:x.value,"onUpdate:modelValue":r[4]||(r[4]=$=>x.value=$),class:"hub-tabs"},{default:n(()=>[t(se,{name:"overview",label:"运维总览"},{default:n(()=>[l("div",la,[l("div",na,[l("div",oa,[l("div",sa,[l("span",ia,b(p(I)),1),r[5]||(r[5]=l("span",{class:"label"},"总数",-1))]),l("div",ra,[l("span",ca,b(p(H)),1),r[6]||(r[6]=l("span",{class:"label"},"在线",-1))]),l("div",da,[l("span",ua,b(p(O)),1),r[7]||(r[7]=l("span",{class:"label"},"维护中",-1))]),l("div",fa,[l("span",ma,b(p(L)),1),r[8]||(r[8]=l("span",{class:"label"},"报警",-1))]),l("div",pa,[l("span",va,b(p(z)),1),r[9]||(r[9]=l("span",{class:"label"},"不可达",-1))])]),l("div",_a,[t(E,{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=$=>a.value=$),size:"small",clearable:"",placeholder:"搜索 ID / 名称 / IP",class:"search-input","prefix-icon":p(dt)},null,8,["modelValue","prefix-icon"]),t(W,{modelValue:m.value,"onUpdate:modelValue":r[1]||(r[1]=$=>m.value=$),size:"small",clearable:"",placeholder:"状态",class:"filter-select"},{default:n(()=>[(M(),B(Y,null,Z(D,$=>t(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"])),64))]),_:1},8,["modelValue"]),t(W,{modelValue:N.value,"onUpdate:modelValue":r[2]||(r[2]=$=>N.value=$),size:"small",clearable:"",placeholder:"车队",class:"filter-select fleet-filter"},{default:n(()=>[(M(!0),B(Y,null,Z(G.value,$=>(M(),j(P,{key:$.value,label:$.label,value:$.value},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),t(Ue,{disabled:!o.value||!J.value.length,onCommand:A},{dropdown:n(()=>[t(Se,null,{default:n(()=>[t(oe,{command:"online"},{default:n(()=>[...r[11]||(r[11]=[_("批量上线",-1)])]),_:1}),t(oe,{command:"offline"},{default:n(()=>[...r[12]||(r[12]=[_("批量下线",-1)])]),_:1}),t(oe,{command:"repair"},{default:n(()=>[...r[13]||(r[13]=[_("批量现场检修",-1)])]),_:1})]),_:1})]),default:n(()=>[t(te,{size:"small",disabled:!o.value||!J.value.length},{default:n(()=>[r[10]||(r[10]=_(" 批量维护 ",-1)),t(ne,{class:"el-icon--right"},{default:n(()=>[t(p(ut))]),_:1})]),_:1},8,["disabled"])]),_:1},8,["disabled"]),t(te,{size:"small",icon:p(ge),loading:p(U)||p(u),onClick:p(T)},{default:n(()=>[...r[14]||(r[14]=[_(" 刷新 ",-1)])]),_:1},8,["icon","loading","onClick"])])]),ye((M(),B("div",ba,[(M(!0),B(Y,null,Z(V.value,$=>(M(),j(Rt,{key:$.id,vehicle:$,selected:p(y)===$.id,"can-write":o.value,onSelect:r[3]||(r[3]=De=>y.value=De),onMaintenanceChanged:p(T)},null,8,["vehicle","selected","can-write","onMaintenanceChanged"]))),128)),!V.value.length&&!p(U)?(M(),j(Be,{key:0,description:"无匹配车辆"})):re("",!0)])),[[Te,p(U)&&!p(v).length]]),t(Jt,{cars:p(v),"can-write":o.value,onSaved:K},null,8,["cars","can-write"]),r[15]||(r[15]=l("p",{class:"footnote"},"故障率 = 报警占用时长 ÷ 自上线以来运行时长(SimpleLite 进程内累计)",-1))])]),_:1}),t(se,{name:"maintenance",label:"维护策略",lazy:""},{default:n(()=>[l("div",ha,[t(Gt)])]),_:1}),t(se,{name:"fleet",label:"车队生命周期",lazy:""},{default:n(()=>[l("div",wa,[t(Kt)])]),_:1})]),_:1},8,["modelValue"])])}}}),Qa=de(ga,[["__scopeId","data-v-0caa3fa5"]]);export{Qa as default}; diff --git a/MiGu.Server/wwwroot/assets/WizardView-DniZ4Y5l.js b/MiGu.Server/wwwroot/assets/WizardView-C7EOtEcB.js similarity index 98% rename from MiGu.Server/wwwroot/assets/WizardView-DniZ4Y5l.js rename to MiGu.Server/wwwroot/assets/WizardView-C7EOtEcB.js index 4c6f874..adddd03 100644 --- a/MiGu.Server/wwwroot/assets/WizardView-DniZ4Y5l.js +++ b/MiGu.Server/wwwroot/assets/WizardView-C7EOtEcB.js @@ -1 +1 @@ -import{aU as x,aI as L,bv as M,b7 as P,X as f,aE as o,aB as t,aF as A,bq as l,bt as v,aH as d,bJ as r,ai as h,bj as b,aD as z,bh as y,bg as F,ax as k,Q as O,r as R,bx as j,b9 as i,aw as G,b3 as C,aq as H,aT as J,aC as W,aG as K,as as Q,ad as U,ak as X}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css */import{_ as Y}from"./FRLD-logo-white-no_title-BE78iS6n.js";async function Z(){const{data:u}=await x.get("/wizard/options");return u}async function ss(){const{data:u}=await x.get("/wizard/profile");return u}async function ts(u){const{data:p}=await x.put("/wizard/profile",u);return p}const as={class:"wizard-page"},es={class:"wz-card"},ns={class:"wz-head"},is={class:"wz-user"},os={key:0,class:"wz-loading"},ls={key:1,class:"wz-grid"},ds={class:"wz-main"},cs={class:"wz-section"},rs={class:"wz-section-head"},us={class:"chip-grid"},vs=["onClick"],ms={class:"chip-name"},ps={class:"chip-desc"},_s={class:"wz-section"},gs={class:"wz-section-head"},fs={class:"chip-grid"},hs=["onClick"],bs={class:"chip-name"},ws={class:"chip-desc"},zs={key:0,class:"wz-section"},ys={class:"wz-section-head"},ks={class:"chip-grid"},Cs=["onClick"],Ks={class:"chip-name"},xs={class:"chip-desc"},Es={class:"wz-summary"},Ss={class:"sum-row"},Ts={class:"sum-row"},Ns={class:"sum-row"},Vs={class:"sum-scenes"},Bs={key:0,class:"sum-empty"},Ws={class:"wz-foot"},$s={class:"foot-right"},qs=L({__name:"WizardView",setup(u){const p=j(),m=M(),E=y(!0),_=y(!1),g=y(null),e=F({platformType:"standard",navigationKinds:[],modules:[],scenarios:[]}),S=k(()=>g.value?.scenarios?.templates??[]),$={magnetic:"scene.magnetic",qrcode:"scene.qrcode",laser:"scene.laser"},T=k(()=>e.navigationKinds.map(n=>$[n]??`scene.${n}`)),N=k(()=>e.navigationKinds.length>0);function w(n,s){const c=n.indexOf(s);c>=0?n.splice(c,1):n.push(s)}P(async()=>{try{const[n,s]=await Promise.all([Z(),ss()]);g.value=n,e.platformType=s.platformType||"standard",e.navigationKinds=[...s.navigationKinds??[]],e.modules=s.modules?.length?[...s.modules]:["wms"],e.scenarios=[...s.scenarios??[]]}catch(n){f.error(`加载向导失败:${n instanceof Error?n.message:String(n)}`)}finally{E.value=!1}});async function q(){if(!N.value){f.warning("请至少选择一种导航方式");return}_.value=!0;try{await ts({platformType:e.platformType,modules:e.modules,navigationKinds:e.navigationKinds,scenarios:e.scenarios}),m.markWizardDone(),f.success("部署配置已保存"),p.push(m.scope==="RCSMonitor"?"/monitor/map":"/admin/dashboard")}catch(n){f.error(`保存失败:${n instanceof Error?n.message:String(n)}`)}finally{_.value=!1}}function D(){m.logout(),p.push("/login")}return(n,s)=>{const c=O,I=U,V=R;return i(),o("div",as,[s[14]||(s[14]=t("div",{class:"wz-orb wz-orb-a","aria-hidden":"true"},null,-1)),s[15]||(s[15]=t("div",{class:"wz-orb wz-orb-b","aria-hidden":"true"},null,-1)),t("div",es,[t("header",ns,[s[0]||(s[0]=A('
迷毂
平台配置向导
按需选择导航方式与功能模块,系统据此裁剪界面并按需加载内核能力
',1)),t("div",is,l(v(m).user?.displayName??v(m).user?.username??""),1)]),E.value?(i(),o("div",os,"正在加载配置选项…")):(i(),o("div",ls,[t("div",ds,[t("section",cs,[t("div",rs,[d(c,null,{default:r(()=>[d(v(G))]),_:1}),s[1]||(s[1]=t("h3",null,"导航方式",-1)),s[2]||(s[2]=t("span",{class:"req"},"至少选 1 项",-1))]),t("div",us,[(i(!0),o(h,null,b(g.value?.navigationKinds??[],a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.navigationKinds.includes(a.id)}]),onClick:B=>w(e.navigationKinds,a.id)},[t("div",ms,l(a.name),1),t("div",ps,l(a.description),1)],10,vs))),128))])]),t("section",_s,[t("div",gs,[d(c,null,{default:r(()=>[d(v(H))]),_:1}),s[3]||(s[3]=t("h3",null,"功能模块",-1))]),t("div",fs,[(i(!0),o(h,null,b(g.value?.modules??[],a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.modules.includes(a.id)}]),onClick:B=>w(e.modules,a.id)},[t("div",bs,l(a.name),1),t("div",ws,l(a.description),1)],10,hs))),128))])]),S.value.length?(i(),o("section",zs,[t("div",ys,[d(c,null,{default:r(()=>[d(v(J))]),_:1}),s[4]||(s[4]=t("h3",null,"业务场景",-1))]),t("div",ks,[(i(!0),o(h,null,b(S.value,a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.scenarios.includes(a.id)}]),onClick:B=>w(e.scenarios,a.id)},[t("div",Ks,l(a.name),1),t("div",xs,l(a.category),1)],10,Cs))),128))])])):z("",!0)]),t("aside",Es,[s[8]||(s[8]=t("div",{class:"sum-title"},"已选概览",-1)),t("div",Ss,[s[5]||(s[5]=t("span",null,"导航方式",-1)),t("b",null,l(e.navigationKinds.length),1)]),t("div",Ts,[s[6]||(s[6]=t("span",null,"功能模块",-1)),t("b",null,l(e.modules.length),1)]),t("div",Ns,[s[7]||(s[7]=t("span",null,"业务场景",-1)),t("b",null,l(e.scenarios.length),1)]),s[9]||(s[9]=t("div",{class:"sum-divider"},null,-1)),s[10]||(s[10]=t("div",{class:"sum-label"},"将激活的内核场景插件",-1)),t("div",Vs,[(i(!0),o(h,null,b(T.value,a=>(i(),W(I,{key:a,size:"small",effect:"dark",class:"sum-tag"},{default:r(()=>[K(l(a),1)]),_:2},1024))),128)),T.value.length?z("",!0):(i(),o("span",Bs,"(请先选择导航方式)"))])])])),t("footer",Ws,[d(V,{text:"",class:"logout-btn",onClick:D},{default:r(()=>[...s[11]||(s[11]=[K("退出登录",-1)])]),_:1}),t("div",$s,[s[13]||(s[13]=t("span",{class:"foot-hint"},"保存后写入部署画像并联动 SimpleLite 选择性加载导航场景",-1)),d(V,{type:"primary",loading:_.value,disabled:!N.value,onClick:q},{default:r(()=>[_.value?z("",!0):(i(),W(c,{key:0,class:"btn-ic"},{default:r(()=>[d(v(Q))]),_:1})),s[12]||(s[12]=K("完成并进入平台 ",-1))]),_:1},8,["loading","disabled"])])])])])}}}),As=X(qs,[["__scopeId","data-v-a4c5be60"]]);export{As as default}; +import{aU as x,aI as L,bv as M,b7 as P,X as f,aE as o,aB as t,aF as A,bq as l,bt as v,aH as d,bJ as r,ai as h,bj as b,aD as z,bh as y,bg as F,ax as k,Q as O,r as R,bx as j,b9 as i,aw as G,b3 as C,aq as H,aT as J,aC as W,aG as K,as as Q,ad as U,ak as X}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css */import{_ as Y}from"./FRLD-logo-white-no_title-BE78iS6n.js";async function Z(){const{data:u}=await x.get("/wizard/options");return u}async function ss(){const{data:u}=await x.get("/wizard/profile");return u}async function ts(u){const{data:p}=await x.put("/wizard/profile",u);return p}const as={class:"wizard-page"},es={class:"wz-card"},ns={class:"wz-head"},is={class:"wz-user"},os={key:0,class:"wz-loading"},ls={key:1,class:"wz-grid"},ds={class:"wz-main"},cs={class:"wz-section"},rs={class:"wz-section-head"},us={class:"chip-grid"},vs=["onClick"],ms={class:"chip-name"},ps={class:"chip-desc"},_s={class:"wz-section"},gs={class:"wz-section-head"},fs={class:"chip-grid"},hs=["onClick"],bs={class:"chip-name"},ws={class:"chip-desc"},zs={key:0,class:"wz-section"},ys={class:"wz-section-head"},ks={class:"chip-grid"},Cs=["onClick"],Ks={class:"chip-name"},xs={class:"chip-desc"},Es={class:"wz-summary"},Ss={class:"sum-row"},Ts={class:"sum-row"},Ns={class:"sum-row"},Vs={class:"sum-scenes"},Bs={key:0,class:"sum-empty"},Ws={class:"wz-foot"},$s={class:"foot-right"},qs=L({__name:"WizardView",setup(u){const p=j(),m=M(),E=y(!0),_=y(!1),g=y(null),e=F({platformType:"standard",navigationKinds:[],modules:[],scenarios:[]}),S=k(()=>g.value?.scenarios?.templates??[]),$={magnetic:"scene.magnetic",qrcode:"scene.qrcode",laser:"scene.laser"},T=k(()=>e.navigationKinds.map(n=>$[n]??`scene.${n}`)),N=k(()=>e.navigationKinds.length>0);function w(n,s){const c=n.indexOf(s);c>=0?n.splice(c,1):n.push(s)}P(async()=>{try{const[n,s]=await Promise.all([Z(),ss()]);g.value=n,e.platformType=s.platformType||"standard",e.navigationKinds=[...s.navigationKinds??[]],e.modules=s.modules?.length?[...s.modules]:["wms"],e.scenarios=[...s.scenarios??[]]}catch(n){f.error(`加载向导失败:${n instanceof Error?n.message:String(n)}`)}finally{E.value=!1}});async function q(){if(!N.value){f.warning("请至少选择一种导航方式");return}_.value=!0;try{await ts({platformType:e.platformType,modules:e.modules,navigationKinds:e.navigationKinds,scenarios:e.scenarios}),m.markWizardDone(),f.success("部署配置已保存"),p.push(m.scope==="RCSMonitor"?"/monitor/map":"/admin/dashboard")}catch(n){f.error(`保存失败:${n instanceof Error?n.message:String(n)}`)}finally{_.value=!1}}function D(){m.logout(),p.push("/login")}return(n,s)=>{const c=O,I=U,V=R;return i(),o("div",as,[s[14]||(s[14]=t("div",{class:"wz-orb wz-orb-a","aria-hidden":"true"},null,-1)),s[15]||(s[15]=t("div",{class:"wz-orb wz-orb-b","aria-hidden":"true"},null,-1)),t("div",es,[t("header",ns,[s[0]||(s[0]=A('
迷毂
平台配置向导
按需选择导航方式与功能模块,系统据此裁剪界面并按需加载内核能力
',1)),t("div",is,l(v(m).user?.displayName??v(m).user?.username??""),1)]),E.value?(i(),o("div",os,"正在加载配置选项…")):(i(),o("div",ls,[t("div",ds,[t("section",cs,[t("div",rs,[d(c,null,{default:r(()=>[d(v(G))]),_:1}),s[1]||(s[1]=t("h3",null,"导航方式",-1)),s[2]||(s[2]=t("span",{class:"req"},"至少选 1 项",-1))]),t("div",us,[(i(!0),o(h,null,b(g.value?.navigationKinds??[],a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.navigationKinds.includes(a.id)}]),onClick:B=>w(e.navigationKinds,a.id)},[t("div",ms,l(a.name),1),t("div",ps,l(a.description),1)],10,vs))),128))])]),t("section",_s,[t("div",gs,[d(c,null,{default:r(()=>[d(v(H))]),_:1}),s[3]||(s[3]=t("h3",null,"功能模块",-1))]),t("div",fs,[(i(!0),o(h,null,b(g.value?.modules??[],a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.modules.includes(a.id)}]),onClick:B=>w(e.modules,a.id)},[t("div",bs,l(a.name),1),t("div",ws,l(a.description),1)],10,hs))),128))])]),S.value.length?(i(),o("section",zs,[t("div",ys,[d(c,null,{default:r(()=>[d(v(J))]),_:1}),s[4]||(s[4]=t("h3",null,"业务场景",-1))]),t("div",ks,[(i(!0),o(h,null,b(S.value,a=>(i(),o("button",{key:a.id,type:"button",class:C(["chip",{on:e.scenarios.includes(a.id)}]),onClick:B=>w(e.scenarios,a.id)},[t("div",Ks,l(a.name),1),t("div",xs,l(a.category),1)],10,Cs))),128))])])):z("",!0)]),t("aside",Es,[s[8]||(s[8]=t("div",{class:"sum-title"},"已选概览",-1)),t("div",Ss,[s[5]||(s[5]=t("span",null,"导航方式",-1)),t("b",null,l(e.navigationKinds.length),1)]),t("div",Ts,[s[6]||(s[6]=t("span",null,"功能模块",-1)),t("b",null,l(e.modules.length),1)]),t("div",Ns,[s[7]||(s[7]=t("span",null,"业务场景",-1)),t("b",null,l(e.scenarios.length),1)]),s[9]||(s[9]=t("div",{class:"sum-divider"},null,-1)),s[10]||(s[10]=t("div",{class:"sum-label"},"将激活的内核场景插件",-1)),t("div",Vs,[(i(!0),o(h,null,b(T.value,a=>(i(),W(I,{key:a,size:"small",effect:"dark",class:"sum-tag"},{default:r(()=>[K(l(a),1)]),_:2},1024))),128)),T.value.length?z("",!0):(i(),o("span",Bs,"(请先选择导航方式)"))])])])),t("footer",Ws,[d(V,{text:"",class:"logout-btn",onClick:D},{default:r(()=>[...s[11]||(s[11]=[K("退出登录",-1)])]),_:1}),t("div",$s,[s[13]||(s[13]=t("span",{class:"foot-hint"},"保存后写入部署画像并联动 SimpleLite 选择性加载导航场景",-1)),d(V,{type:"primary",loading:_.value,disabled:!N.value,onClick:q},{default:r(()=>[_.value?z("",!0):(i(),W(c,{key:0,class:"btn-ic"},{default:r(()=>[d(v(Q))]),_:1})),s[12]||(s[12]=K("完成并进入平台 ",-1))]),_:1},8,["loading","disabled"])])])])])}}}),As=X(qs,[["__scopeId","data-v-a4c5be60"]]);export{As as default}; diff --git a/MiGu.Server/wwwroot/assets/Workspace3D-B2WrMPji.js b/MiGu.Server/wwwroot/assets/Workspace3D-DpUfTJl7.js similarity index 98% rename from MiGu.Server/wwwroot/assets/Workspace3D-B2WrMPji.js rename to MiGu.Server/wwwroot/assets/Workspace3D-DpUfTJl7.js index 8a21876..4375c94 100644 --- a/MiGu.Server/wwwroot/assets/Workspace3D-B2WrMPji.js +++ b/MiGu.Server/wwwroot/assets/Workspace3D-DpUfTJl7.js @@ -1 +1 @@ -import{aI as J,b7 as Q,b6 as X,aE as b,b3 as Z,aH as u,ad as K,bJ as c,aB as f,bq as s,aC as V,aD as p,r as Y,bt as T,Q as ee,bh as l,ax as A,b9 as i,aG as m,bi as ae,aS as te,aZ as ne,ak as oe}from"./index-368apsQG.js";/* empty css *//* empty css *//* empty css */const se={key:0,class:"workspace-3d-toolbar"},le={class:"hint"},re=["src"],ce={key:1,class:"workspace-3d-mask"},ie=1800,de=4,ue=18e3,fe=J({__name:"Workspace3D",props:{host:{default:void 0},scope:{default:"Platform"},token:{default:""},readOnly:{type:Boolean,default:!1},embedUi:{type:Boolean,default:!1},canvasOnly:{type:Boolean,default:!1},hideToolbar:{type:Boolean,default:!1}},emits:["pick","select","ready"],setup(o,{expose:M,emit:R}){const n=o,h=R,_=l(),O=l(),y=l(!1),v=l("正在连接 webVRender ..."),w=l(null),g=l([]),r=l(""),d=A(()=>n.host??"localhost:8223"??"localhost:8223"),z=A(()=>{const a=new URLSearchParams;return a.set("scope",n.scope??"Platform"),n.token&&a.set("token",n.token),a.set("ro",n.readOnly?"1":"0"),n.canvasOnly?a.set("ui","canvas-only"):n.embedUi&&a.set("ui","embed"),`http://${d.value}/?${a.toString()}`});let k=null,E=0;function F(){return`http://${d.value}`}function B(a){return new Promise(e=>setTimeout(e,a))}function P(){return n.canvasOnly||n.embedUi}function H(){return n.canvasOnly?"/declareCanvasOnly":n.embedUi?"/declareEmbedUi":null}async function D(a){try{return(await fetch(`${F()}${a}`,{method:"GET",cache:"no-store",credentials:"omit",signal:AbortSignal.timeout(ie)})).ok}catch{return!1}}async function I(){const a=H();if(a){for(let e=0;e{a!==E||y.value||(v.value=`连接超时 (http://${d.value}),请确认 SimpleLite 已启动`)},ue)}function L(a){const e=z.value;if(!a)return e;const t=e.includes("?")?"&":"?";return`${e}${t}_=${Date.now()}`}async function x(a=!1){const e=++E;if(y.value=!1,v.value=`正在连接 webVRender (http://${d.value}) ...`,N(e),P())I(),r.value=L(a||!!r.value);else{if(v.value="正在等待 SimpleLite webVRender 就绪 ...",await G(),e!==E)return;r.value=L(a||!!r.value)}}function q(){y.value=!0,S(),h("ready")}function C(a){if(!_.value||a.source!==_.value.contentWindow)return;const e=a.data;if(!(!e||typeof e!="object")){if(e.type==="workspace.pick"&&e.payload&&typeof e.payload.x=="number")w.value=e.payload,h("pick",e.payload);else if(e.type==="workspace.select"&&Array.isArray(e.payload))g.value=e.payload,h("select",e.payload);else if(e.type==="workspace.shortcut"&&e.payload&&typeof e.payload=="object"){const t=e.payload.action;(t==="undo"||t==="redo"||t==="delete")&&window.dispatchEvent(new CustomEvent("workspace-shortcut",{detail:{action:t}}))}}}function W(){x(!0)}function $(){const a=O.value;a&&(document.fullscreenElement?document.exitFullscreen():a.requestFullscreen())}return Q(()=>{window.addEventListener("message",C),x(!1)}),X(()=>{window.removeEventListener("message",C),S()}),M({reload:W,enterFullscreen:$}),(a,e)=>{const t=K,U=Y,j=ee;return i(),b("div",{class:Z(["workspace-3d-wrap",{"workspace-3d--canvas-only":o.canvasOnly||o.hideToolbar}])},[o.canvasOnly||o.hideToolbar?p("",!0):(i(),b("div",se,[u(t,{type:o.readOnly?"info":"success",effect:"dark",size:"small"},{default:c(()=>[m(s(o.readOnly?"只读":"可交互"),1)]),_:1},8,["type"]),f("span",le,"webVRender · http://"+s(d.value)+" · scope="+s(o.scope),1),e[2]||(e[2]=f("div",{class:"spacer"},null,-1)),w.value?(i(),V(t,{key:0,type:"warning",size:"small"},{default:c(()=>[m(" Pick ("+s(w.value.x.toFixed(0))+", "+s(w.value.y.toFixed(0))+") ",1)]),_:1})):p("",!0),g.value.length?(i(),V(t,{key:1,type:"primary",size:"small"},{default:c(()=>[m(" Selected: "+s(g.value.length),1)]),_:1})):p("",!0),u(U,{size:"small",icon:T(ae),onClick:W},{default:c(()=>[...e[0]||(e[0]=[m("重载",-1)])]),_:1},8,["icon"]),u(U,{size:"small",icon:T(te),onClick:$},{default:c(()=>[...e[1]||(e[1]=[m("全屏",-1)])]),_:1},8,["icon"])])),f("div",{ref_key:"frameWrap",ref:O,class:"workspace-3d-frame"},[r.value?(i(),b("iframe",{key:0,ref_key:"frame",ref:_,src:r.value,class:"workspace-3d-iframe",allow:"fullscreen",onLoad:q},null,40,re)):p("",!0),y.value?p("",!0):(i(),b("div",ce,[u(j,{class:"is-loading",size:"32"},{default:c(()=>[u(T(ne))]),_:1}),f("span",null,s(v.value),1),e[3]||(e[3]=f("span",{class:"muted"},"如长时间未加载,请确认 SimpleLite 已以 Web-Enabled 模式启动且 8223 端口可达。",-1))]))],512)],2)}}}),we=oe(fe,[["__scopeId","data-v-17efa15d"]]);export{we as W}; +import{aI as J,b7 as Q,b6 as X,aE as b,b3 as Z,aH as u,ad as K,bJ as c,aB as f,bq as s,aC as V,aD as p,r as Y,bt as T,Q as ee,bh as l,ax as A,b9 as i,aG as m,bi as ae,aS as te,aZ as ne,ak as oe}from"./index-Dg4NaXsE.js";/* empty css *//* empty css *//* empty css */const se={key:0,class:"workspace-3d-toolbar"},le={class:"hint"},re=["src"],ce={key:1,class:"workspace-3d-mask"},ie=1800,de=4,ue=18e3,fe=J({__name:"Workspace3D",props:{host:{default:void 0},scope:{default:"Platform"},token:{default:""},readOnly:{type:Boolean,default:!1},embedUi:{type:Boolean,default:!1},canvasOnly:{type:Boolean,default:!1},hideToolbar:{type:Boolean,default:!1}},emits:["pick","select","ready"],setup(o,{expose:M,emit:R}){const n=o,h=R,_=l(),O=l(),y=l(!1),v=l("正在连接 webVRender ..."),w=l(null),g=l([]),r=l(""),d=A(()=>n.host??"localhost:8223"??"localhost:8223"),z=A(()=>{const a=new URLSearchParams;return a.set("scope",n.scope??"Platform"),n.token&&a.set("token",n.token),a.set("ro",n.readOnly?"1":"0"),n.canvasOnly?a.set("ui","canvas-only"):n.embedUi&&a.set("ui","embed"),`http://${d.value}/?${a.toString()}`});let k=null,E=0;function F(){return`http://${d.value}`}function B(a){return new Promise(e=>setTimeout(e,a))}function P(){return n.canvasOnly||n.embedUi}function H(){return n.canvasOnly?"/declareCanvasOnly":n.embedUi?"/declareEmbedUi":null}async function D(a){try{return(await fetch(`${F()}${a}`,{method:"GET",cache:"no-store",credentials:"omit",signal:AbortSignal.timeout(ie)})).ok}catch{return!1}}async function I(){const a=H();if(a){for(let e=0;e{a!==E||y.value||(v.value=`连接超时 (http://${d.value}),请确认 SimpleLite 已启动`)},ue)}function L(a){const e=z.value;if(!a)return e;const t=e.includes("?")?"&":"?";return`${e}${t}_=${Date.now()}`}async function x(a=!1){const e=++E;if(y.value=!1,v.value=`正在连接 webVRender (http://${d.value}) ...`,N(e),P())I(),r.value=L(a||!!r.value);else{if(v.value="正在等待 SimpleLite webVRender 就绪 ...",await G(),e!==E)return;r.value=L(a||!!r.value)}}function q(){y.value=!0,S(),h("ready")}function C(a){if(!_.value||a.source!==_.value.contentWindow)return;const e=a.data;if(!(!e||typeof e!="object")){if(e.type==="workspace.pick"&&e.payload&&typeof e.payload.x=="number")w.value=e.payload,h("pick",e.payload);else if(e.type==="workspace.select"&&Array.isArray(e.payload))g.value=e.payload,h("select",e.payload);else if(e.type==="workspace.shortcut"&&e.payload&&typeof e.payload=="object"){const t=e.payload.action;(t==="undo"||t==="redo"||t==="delete")&&window.dispatchEvent(new CustomEvent("workspace-shortcut",{detail:{action:t}}))}}}function W(){x(!0)}function $(){const a=O.value;a&&(document.fullscreenElement?document.exitFullscreen():a.requestFullscreen())}return Q(()=>{window.addEventListener("message",C),x(!1)}),X(()=>{window.removeEventListener("message",C),S()}),M({reload:W,enterFullscreen:$}),(a,e)=>{const t=K,U=Y,j=ee;return i(),b("div",{class:Z(["workspace-3d-wrap",{"workspace-3d--canvas-only":o.canvasOnly||o.hideToolbar}])},[o.canvasOnly||o.hideToolbar?p("",!0):(i(),b("div",se,[u(t,{type:o.readOnly?"info":"success",effect:"dark",size:"small"},{default:c(()=>[m(s(o.readOnly?"只读":"可交互"),1)]),_:1},8,["type"]),f("span",le,"webVRender · http://"+s(d.value)+" · scope="+s(o.scope),1),e[2]||(e[2]=f("div",{class:"spacer"},null,-1)),w.value?(i(),V(t,{key:0,type:"warning",size:"small"},{default:c(()=>[m(" Pick ("+s(w.value.x.toFixed(0))+", "+s(w.value.y.toFixed(0))+") ",1)]),_:1})):p("",!0),g.value.length?(i(),V(t,{key:1,type:"primary",size:"small"},{default:c(()=>[m(" Selected: "+s(g.value.length),1)]),_:1})):p("",!0),u(U,{size:"small",icon:T(ae),onClick:W},{default:c(()=>[...e[0]||(e[0]=[m("重载",-1)])]),_:1},8,["icon"]),u(U,{size:"small",icon:T(te),onClick:$},{default:c(()=>[...e[1]||(e[1]=[m("全屏",-1)])]),_:1},8,["icon"])])),f("div",{ref_key:"frameWrap",ref:O,class:"workspace-3d-frame"},[r.value?(i(),b("iframe",{key:0,ref_key:"frame",ref:_,src:r.value,class:"workspace-3d-iframe",allow:"fullscreen",onLoad:q},null,40,re)):p("",!0),y.value?p("",!0):(i(),b("div",ce,[u(j,{class:"is-loading",size:"32"},{default:c(()=>[u(T(ne))]),_:1}),f("span",null,s(v.value),1),e[3]||(e[3]=f("span",{class:"muted"},"如长时间未加载,请确认 SimpleLite 已以 Web-Enabled 模式启动且 8223 端口可达。",-1))]))],512)],2)}}}),we=oe(fe,[["__scopeId","data-v-17efa15d"]]);export{we as W}; diff --git a/MiGu.Server/wwwroot/assets/index-368apsQG.js b/MiGu.Server/wwwroot/assets/index-Dg4NaXsE.js similarity index 99% rename from MiGu.Server/wwwroot/assets/index-368apsQG.js rename to MiGu.Server/wwwroot/assets/index-Dg4NaXsE.js index 1804cac..a05ebf9 100644 --- a/MiGu.Server/wwwroot/assets/index-368apsQG.js +++ b/MiGu.Server/wwwroot/assets/index-Dg4NaXsE.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-Bg_Hrmmj.js","assets/el-tooltip-l0sNRNKZ.js","assets/FRLD-logo-white-no_title-BE78iS6n.js","assets/LoginView-DKfiSb8w.css","assets/base-BhyKBIh7.css","assets/el-form-item-D_relxjU.css","assets/el-button-ZSOkJyjJ.css","assets/el-collapse-item-BvmEG8Qn.css","assets/el-input-BddTPWVI.css","assets/el-input-number-DExoAqKP.css","assets/el-link-CPQZ-olG.css","assets/el-checkbox-CzNtyWdF.css","assets/el-popper-Wf_ds9r7.css","assets/ServiceStatusView-COa3vbpj.js","assets/ServiceStatusView-IGba4H4q.css","assets/el-card-BAyktVMS.css","assets/el-descriptions-BpDzfuC8.css","assets/el-tag-1VV9QMa7.css","assets/WizardView-DniZ4Y5l.js","assets/WizardView-D_EJbvb2.css","assets/AppShell-BqTC0xJK.js","assets/AppShell-D28lCBtn.css","assets/el-scrollbar-GF-yQkxY.css","assets/el-button-group-B09mLjuS.css","assets/el-dropdown-item-CtcKg9JC.css","assets/el-radio-button-TYBaCPcE.css","assets/DashboardView-fmEPf2c4.js","assets/projection-nWPnmoX1.js","assets/reflection-C0K7EJ_N.js","assets/DashboardView-C22mCfRB.css","assets/el-tab-pane-C5lGmld3.css","assets/MapMonitorView-DEfDktpd.js","assets/Workspace3D-B2WrMPji.js","assets/Workspace3D-mhI80n5T.css","assets/mapEdit-BiAzHHno.js","assets/ops-BCeFEEjY.js","assets/ops-DA63t9Ed.js","assets/monitorConfigCache-BtW5W6GI.js","assets/useProjectionStream-C94Y5UgX.js","assets/MapMonitorView-Du9_ePeE.css","assets/el-col-BWEC13sA.css","assets/el-statistic-D5_dVssE.css","assets/el-progress-B7X4OvaL.css","assets/el-select-CK58rX4v.css","assets/el-table-column-Dp73S2HR.css","assets/el-dialog-TSZfE1b8.css","assets/el-empty-S7fQQ3B8.css","assets/MapManagementView-D5EJh6kt.js","assets/MapManagementView-AlLVMANn.css","assets/el-loading-Dq8WDDkr.css","assets/el-alert-B6UgayC7.css","assets/MapEditorView-DET9bUZJ.js","assets/useMapEditStream-CoKaGT-a.js","assets/MapEditorView-Bw6vCiWq.css","assets/el-color-picker-DRNdOQmm.css","assets/el-switch-DpR9-s4E.css","assets/TrackTableView-BEdpBnup.js","assets/ReflectionManagerPanel-CKQWtKhJ.js","assets/ReflectionManagerPanel-Btm77NGt.css","assets/TrackTableView-C-Cp6740.css","assets/CarPanelView-DpfkXBoo.js","assets/CarPanelView-CYaApbj9.css","assets/ProcessPanelView-BaRn0PJa.js","assets/ProcessPanelView-DLKKlZA4.css","assets/ScriptPanelView-BNpYhbAt.js","assets/ScriptPanelView-zM2-1jjH.css","assets/MissionEditorView-Cq1tHD-Z.js","assets/MissionEditorView-DOR5c4wb.css","assets/ProjectPropertiesView-4-x-FH30.js","assets/ProjectPropertiesView-CvKuii5E.css","assets/PlaybackView-CSBKNt4K.js","assets/PlaybackView-BsrAVvYx.css","assets/el-divider-B0pQhKGi.css","assets/SystemConfigView-4Mxf2af4.js","assets/ConfigPageBase-CT6BdvCe.js","assets/PermissionGuard-DUg2FNrM.js","assets/PermissionGuard-B-YLUKV0.css","assets/ConfigPageBase-DOgE48Ff.css","assets/SystemConfigView-zK_tPjiF.css","assets/ExternalIntegrationView-CRYMen0m.js","assets/RoutingPolicyView-EphbUSUM.js","assets/VehicleHubView-CG4ybiip.js","assets/VehicleHubView-BySAdLFB.css","assets/ChargePolicyView-BMq754im.js","assets/TaskAllocationView-Dm9F_jCO.js","assets/TrafficRuleView-zSMLh9vH.js","assets/AuthRoleView-94zjdzbD.js","assets/AuthRoleView-CTEbfTF-.css","assets/el-checkbox-group-D_6SYB2i.css","assets/DeviceHubView-6kHSU9g1.js","assets/ScenarioTemplateView-2tn-jb3L.js","assets/ScenarioTemplateView-rv7Jf-RX.css","assets/LocationView-BH1yvcsy.js","assets/OpsConfigView-Cx4yfu4M.js","assets/OpsConfigView-Dn7upUIu.css","assets/CustomWidgetView-BKa7U3FY.js","assets/CustomWidgetView-Ch0BQYzJ.css","assets/MapMonitorConfigView-16D4TNib.js","assets/MapMonitorConfigView-BC-sAP6v.css","assets/MonitorDashboardView-9UzVNNbL.js","assets/MonitorDashboardView-CzA4Ot5V.css","assets/MonitorMapView-h38_wi8I.js","assets/OpsActionPanelView-DP5WSM1Z.js","assets/OpsActionPanelView-C3hWMI-V.css","assets/AnnotationView-W73nG5X1.js"])))=>i.map(i=>d[i]); +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LoginView-0TaDlGzh.js","assets/el-tooltip-l0sNRNKZ.js","assets/FRLD-logo-white-no_title-BE78iS6n.js","assets/LoginView-DKfiSb8w.css","assets/base-BhyKBIh7.css","assets/el-form-item-D_relxjU.css","assets/el-button-ZSOkJyjJ.css","assets/el-collapse-item-BvmEG8Qn.css","assets/el-input-BddTPWVI.css","assets/el-input-number-DExoAqKP.css","assets/el-link-CPQZ-olG.css","assets/el-checkbox-CzNtyWdF.css","assets/el-popper-Wf_ds9r7.css","assets/ServiceStatusView-CiTg6q_Q.js","assets/ServiceStatusView-IGba4H4q.css","assets/el-card-BAyktVMS.css","assets/el-descriptions-BpDzfuC8.css","assets/el-tag-1VV9QMa7.css","assets/WizardView-C7EOtEcB.js","assets/WizardView-D_EJbvb2.css","assets/AppShell-CAX-HJ2b.js","assets/AppShell-D28lCBtn.css","assets/el-scrollbar-GF-yQkxY.css","assets/el-button-group-B09mLjuS.css","assets/el-dropdown-item-CtcKg9JC.css","assets/el-radio-button-TYBaCPcE.css","assets/DashboardView-C5o_Ttf4.js","assets/projection-BMms551H.js","assets/reflection-B_glb6eT.js","assets/DashboardView-C22mCfRB.css","assets/el-tab-pane-C5lGmld3.css","assets/MapMonitorView-Bc6X9WQO.js","assets/Workspace3D-DpUfTJl7.js","assets/Workspace3D-mhI80n5T.css","assets/mapEdit-TNAQr3Be.js","assets/ops-BCeFEEjY.js","assets/ops-CsVl7GhE.js","assets/monitorConfigCache-BigdkiFw.js","assets/useProjectionStream-BBHmpNXC.js","assets/MapMonitorView-Du9_ePeE.css","assets/el-col-BWEC13sA.css","assets/el-statistic-D5_dVssE.css","assets/el-progress-B7X4OvaL.css","assets/el-select-CK58rX4v.css","assets/el-table-column-Dp73S2HR.css","assets/el-dialog-TSZfE1b8.css","assets/el-empty-S7fQQ3B8.css","assets/MapManagementView-CccyKhbv.js","assets/MapManagementView-DJMxI8po.css","assets/el-loading-Dq8WDDkr.css","assets/el-alert-B6UgayC7.css","assets/MapEditorView-Bf_sv8Aw.js","assets/useMapEditStream-BgR6WvRg.js","assets/MapEditorView-DTrk0FFM.css","assets/el-color-picker-DRNdOQmm.css","assets/el-switch-DpR9-s4E.css","assets/TrackTableView-CKv4G01-.js","assets/ReflectionManagerPanel-BZQZIz4T.js","assets/ReflectionManagerPanel-Btm77NGt.css","assets/TrackTableView-C-Cp6740.css","assets/CarPanelView-DfcvV1b9.js","assets/CarPanelView-CYaApbj9.css","assets/ProcessPanelView-DoD_u6oD.js","assets/ProcessPanelView-DLKKlZA4.css","assets/ScriptPanelView-DMd6Dq7p.js","assets/ScriptPanelView-zM2-1jjH.css","assets/MissionEditorView-BNUdM9Ij.js","assets/MissionEditorView-DOR5c4wb.css","assets/ProjectPropertiesView-DxQyu0yl.js","assets/ProjectPropertiesView-CvKuii5E.css","assets/PlaybackView-DVrgp4e4.js","assets/PlaybackView-BsrAVvYx.css","assets/el-divider-B0pQhKGi.css","assets/SystemConfigView-Cy7YXbTA.js","assets/ConfigPageBase-MHa7yfOO.js","assets/PermissionGuard-BlMEkqrL.js","assets/PermissionGuard-B-YLUKV0.css","assets/ConfigPageBase-DOgE48Ff.css","assets/SystemConfigView-zK_tPjiF.css","assets/ExternalIntegrationView-CVrzHPs8.js","assets/RoutingPolicyView-vyV201zY.js","assets/VehicleHubView-1cdDkq5N.js","assets/VehicleHubView-BySAdLFB.css","assets/ChargePolicyView-fgYXxU-T.js","assets/TaskAllocationView-BoGL3AmK.js","assets/TrafficRuleView-CZpyEJOL.js","assets/AuthRoleView-BW7bVuKX.js","assets/AuthRoleView-CTEbfTF-.css","assets/el-checkbox-group-D_6SYB2i.css","assets/DeviceHubView-D6W4gbr_.js","assets/ScenarioTemplateView-CmTU4kEH.js","assets/ScenarioTemplateView-rv7Jf-RX.css","assets/LocationView-r0d4EkyN.js","assets/OpsConfigView-Ch6itZUF.js","assets/OpsConfigView-Dn7upUIu.css","assets/CustomWidgetView-Ch7DIGUj.js","assets/CustomWidgetView-Ch0BQYzJ.css","assets/MapMonitorConfigView-CYlZhPX2.js","assets/MapMonitorConfigView-BC-sAP6v.css","assets/MonitorDashboardView-Dl0hq3jL.js","assets/MonitorDashboardView-CzA4Ot5V.css","assets/MonitorMapView-OvNLwhYc.js","assets/OpsActionPanelView-CgLT81Kn.js","assets/OpsActionPanelView-C3hWMI-V.css","assets/AnnotationView-DixiuHnc.js"])))=>i.map(i=>d[i]); (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))a(o);new MutationObserver(o=>{for(const r of o)if(r.type==="childList")for(const s of r.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&a(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const r={};return o.integrity&&(r.integrity=o.integrity),o.referrerPolicy&&(r.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?r.credentials="include":o.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(o){if(o.ep)return;o.ep=!0;const r=n(o);fetch(o.href,r)}})();/** * @vue/shared v3.5.34 * (c) 2018-present Yuxi (Evan) You and Vue contributors @@ -97,4 +97,4 @@ usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:a,curr `);return s===-1?"":o.stack.slice(s+1)})();try{if(!a.stack)a.stack=r;else if(r){const s=r.indexOf(` `),l=s===-1?-1:r.indexOf(` `,s+1),u=l===-1?"":r.slice(l+1);String(a.stack).endsWith(u)||(a.stack+=` -`+r)}}catch{}}throw a}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ds(this.defaults,n);const{transitional:a,paramsSerializer:o,headers:r}=n;a!==void 0&&Fc.assertOptions(a,{silentJSONParsing:Ka.transitional(Ka.boolean),forcedJSONParsing:Ka.transitional(Ka.boolean),clarifyTimeoutError:Ka.transitional(Ka.boolean),legacyInterceptorReqResOrdering:Ka.transitional(Ka.boolean)},!1),o!=null&&(ke.isFunction(o)?n.paramsSerializer={serialize:o}:Fc.assertOptions(o,{encode:Ka.function,serialize:Ka.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Fc.assertOptions(n,{baseUrl:Ka.spelling("baseURL"),withXsrfToken:Ka.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let s=r&&ke.merge(r.common,r[n.method]);r&&ke.forEach(["delete","get","head","post","put","patch","query","common"],h=>{delete r[h]}),n.headers=va.concat(s,r);const l=[];let u=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;u=u&&v.synchronous;const m=n.transitional||Dg;m&&m.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const c=[];this.interceptors.response.forEach(function(v){c.push(v.fulfilled,v.rejected)});let d,f=0,p;if(!u){const h=[ew.bind(this),void 0];for(h.unshift(...l),h.push(...c),p=h.length,d=Promise.resolve(n);f{if(!a._listeners)return;let r=a._listeners.length;for(;r-- >0;)a._listeners[r](o);a._listeners=null}),this.promise.then=o=>{let r;const s=new Promise(l=>{a.subscribe(l),r=l}).then(o);return s.cancel=function(){a.unsubscribe(r)},s},t(function(r,s,l){a.reason||(a.reason=new Uu(r,s,l),n(a.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=a=>{t.abort(a)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new F4(function(o){t=o}),cancel:t}}};function Eae(e){return function(n){return e.apply(null,n)}}function xae(e){return ke.isObject(e)&&e.isAxiosError===!0}const yv={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(yv).forEach(([e,t])=>{yv[t]=e});function z4(e){const t=new xs(e),n=w4(xs.prototype.request,t);return ke.extend(n,xs.prototype,t,{allOwnKeys:!0}),ke.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return z4(Ds(e,o))},n}const An=z4(ju);An.Axios=xs;An.CanceledError=Uu;An.CancelToken=kae;An.isCancel=P4;An.VERSION=Vg;An.toFormData=If;An.AxiosError=Ct;An.Cancel=An.CanceledError;An.all=function(t){return Promise.all(t)};An.spread=Eae;An.isAxiosError=xae;An.mergeConfig=Ds;An.AxiosHeaders=va;An.formToJSON=e=>M4(ke.isHTMLForm(e)?new FormData(e):e);An.getAdapter=V4.getAdapter;An.HttpStatusCode=yv;An.default=An;const{Axios:Xoe,AxiosError:Joe,CanceledError:Zoe,isCancel:Qoe,CancelToken:ere,VERSION:tre,all:nre,Cancel:are,isAxiosError:ore,spread:rre,toFormData:sre,AxiosHeaders:lre,HttpStatusCode:ire,formToJSON:ure,getAdapter:cre,mergeConfig:dre,create:fre}=An,Tae="/api",Xl=An.create({baseURL:Tae,timeout:15e3,headers:{"Content-Type":"application/json"},withCredentials:!0});Xl.interceptors.request.use(e=>{const t=localStorage.getItem("simple.auth.token");t&&e.headers.set("Authorization",`Bearer ${t}`);const n=localStorage.getItem("simple.auth.scope");return n&&e.headers.set("X-Scope",n),e});function Oae(e){const t=e.response?.status,n=e.config?.url??"",a=n.startsWith("/sl/")||n.startsWith("sl/");if(t===502||t===504||e.code==="ECONNABORTED"||e.code==="ERR_NETWORK")return a?"SimpleLite 未连接:请先启动 SimpleLite 后端(监听端口 8222)后重试。":`网关无法连接到下游服务(${t??e.code??"network"})。`;const o=e.response?.data;return o?.message?o.message:e.message}Xl.interceptors.response.use(e=>e,e=>{if(e.response?.status===401){try{localStorage.removeItem("simple.auth.token"),localStorage.removeItem("simple.auth.user"),localStorage.removeItem("simple.auth.scope"),localStorage.removeItem("simple.auth.runMode"),localStorage.removeItem("simple.auth.perm")}catch{}location.pathname!=="/login"&&location.assign("/login")}const t=Oae(e);try{Object.defineProperty(e,"message",{value:t,configurable:!0})}catch{}return Promise.reject(e)});new Date().toISOString();new Date().toISOString();const _ae={dispatchLoopHz:50,log:{level:"info",rollDays:7,maxSizeMB:256},security:{jwtExpireMin:1440,enableSwagger:!1,corsWhitelist:["http://localhost:5173","https://*.intra"]}},Rae={mes:[{id:"mes-1",name:"MES 主线",url:"http://mes.lan/api",enabled:!0}],wms:[{id:"wms-1",name:"WMS 仓储",url:"http://wms.lan/api",enabled:!0}],rcs:[],ptl:[{id:"ptl-1",name:"PTL 拣选",url:"http://ptl.lan/api",enabled:!0}]},Iae={algorithm:"astar",weights:{distance:1,congestion:.5,turnPenalty:.2},avoidance:[{id:"AV1",zoneId:"Z-NORTH",rule:"no-entry-while-loading"}],zoneSpeedLimits:[{zoneId:"Z-NARROW",maxSpeedMps:.5}]},$ae={lowBatteryThreshold:.3,criticalBatteryThreshold:.15,faultReport:{enabled:!0,emailTo:["ops@example.com"]},autoRepair:{enabled:!1,cooldownSec:600}},Nae={allowMidTaskCharge:!1,idleChargeAfterSec:300,priority:[{id:"CP1",condition:"soc<0.2",weight:100},{id:"CP2",condition:"idle>5min",weight:30}]},Mae={mode:"leastLoad",loadBalance:!0,maxQueuePerCar:3},Pae={intersections:[{id:"IX1",siteIds:["S006","S007"],mode:"mutex"}],mutex:[{id:"MZ1",zoneIds:["Z-CROSS"]}],yields:[{id:"YD1",from:"A 区",to:"B 区",condition:"priority30s"},{level:"error",condition:"driverException"}]}},Dae={groups:[{id:"G-A",name:"A 区车队",floor:"F1",region:"A",carIds:["C01","C02","C03"]},{id:"G-B",name:"B 区车队",floor:"F1",region:"B",carIds:["C04","C05"]}],ota:{enabled:!0,batchSize:2,rollbackOnFail:!0},batchOps:{confirmationRequired:!0,maxBatch:10},networkDiag:{rttThresholdMs:80,packetLossThreshold:.02}},Bae={templates:[{id:"tpl-sps",name:"SPS 物料配送",category:"SPS",version:"1.0.0",baselineJson:"{}"},{id:"tpl-pack",name:"电池 Pack 自动化产线",category:"BatteryPack",version:"1.0.0",baselineJson:"{}"},{id:"tpl-loop",name:"环线运行",category:"Loop",version:"1.0.0",baselineJson:"{}"},{id:"tpl-p2p",name:"点对点柔性搬运",category:"P2P",version:"1.0.0",baselineJson:"{}"}],dslPolicy:{enabled:!0,schemaVersion:"1"},lowCode:{enabled:!1,editor:"json"},versionPolicy:{keepVersions:10,allowRollback:!0}},Vae={locations:[{id:"L01",code:"A-01",name:"A 区货架 1",siteId:"S001",capacity:20,occupied:12},{id:"L02",code:"A-02",name:"A 区货架 2",siteId:"S002",capacity:20,occupied:7},{id:"L03",code:"B-01",name:"B 区缓存",siteId:"S003",capacity:30,occupied:25}],inventoryRules:[{id:"IR1",itemType:"PalletA",minQty:5,maxQty:30}]},Fae={playback:{retentionDays:30,samplingHz:5},logRetention:{hotDays:7,coldDays:180},version:{keepReleases:5},monitor:{car:{propertyKeys:[],statusKeys:[],actionKeys:[]},site:{propertyKeys:[],statusKeys:[],actionKeys:[]},track:{propertyKeys:[],statusKeys:[],actionKeys:[]},carActionByType:{}}},zae={items:[{id:"widget-call-button",name:"呼叫按钮",schemaJson:'{"fields":[{"name":"siteId"}]}',layoutJson:'{"x":0,"y":0,"w":2,"h":1}',bindToScopes:["RCSMonitor"]}]},H4={system:_ae,integrations:Rae,routing:Iae,vehicle:$ae,charge:Nae,task:Mae,traffic:Pae,auth:Aae,device:Lae,fleet:Dae,scenario:Bae,location:Vae,ops:Fae,widget:zae},K4="simple-platform-mock-rbac";function Hae(){return{roles:[{id:"role-admin",name:"超级管理员",description:"拥有全部页面与操作权限的内置角色",scope:"*",pages:["*"],ops:["*"],widgetGrants:[],system:!0},{id:"role-ops",name:"运营人员",description:"运营监控端默认角色:可执行运维操作、查看监控",scope:"RCSMonitor",pages:["monitor-dashboard","monitor-map","monitor-ops","monitor-notes","monitor-vehicle-hub"],ops:["ops.car.pause","ops.car.resume","ops.car.gohome","ops.car.resetSession","ops.car.manualCharge","ops.task.pause","ops.task.cancel","ops.task.reassign","ops.task.boostPriority","monitor.note.write"],widgetGrants:[{widgetId:"MapEditor",visibility:"readonly"},{widgetId:"CadToolbar",visibility:"hidden"},{widgetId:"CarPanel",visibility:"readonly"},{widgetId:"MissionEditor",visibility:"readonly"},{widgetId:"OpsActionPanel",visibility:"interactive"},{widgetId:"ConfigCenter",visibility:"hidden"}],system:!0}],users:[{id:"u-admin",username:"admin",displayName:"系统管理员",enabled:!0,roleIds:["role-admin"],scopes:[]},{id:"u-ops",username:"ops",displayName:"运营人员",enabled:!0,roleIds:["role-ops"],scopes:[]}]}}function Kae(){try{const t=localStorage.getItem(K4);if(t)return JSON.parse(t)}catch{}const e=Hae();return jae(e),e}let Wae=Kae();function jae(e=Wae){try{localStorage.setItem(K4,JSON.stringify(e))}catch{}}function wv(){return new Date().toISOString()}const Uae="simple-platform-mock-config",nw=new Map;function qae(){try{const e=localStorage.getItem(Uae);if(e)return JSON.parse(e)}catch{}return{}}function Yae(e){let t=nw.get(e);return t||(t=qae()[e]??{section:e,version:1,updatedAt:wv(),payload:H4[e]},nw.set(e,t)),t}for(const e of Object.keys(H4))Yae(e);wv(),wv();async function Gae(e){const{data:t}=await Xl.post("/auth/login",e);return t}async function Xae(){await Xl.post("/auth/logout")}async function Jae(e){const{data:t}=await Xl.post("/auth/switch-scope",{scope:e});return t}async function Zae(){const{data:e}=await Xl.get("/auth/me");return e}const xd="simple.auth.token",Pi="simple.auth.user",Ai="simple.auth.scope",Li="simple.auth.runMode",Di="simple.auth.perm";function aw(e){try{const t=localStorage.getItem(e);return t==null?null:JSON.parse(t)}catch{return null}}function zp(e){try{return localStorage.getItem(e)}catch{return null}}function Qae(){return{token:zp(xd),user:aw(Pi),scope:zp(Ai),runMode:zp(Li),effectivePermissions:aw(Di),validated:!1,needsWizard:!1}}function Hp(e){e.token=null,e.user=null,e.scope=null,e.runMode=null,e.effectivePermissions=null,e.validated=!1,e.needsWizard=!1;try{localStorage.removeItem(xd),localStorage.removeItem(Pi),localStorage.removeItem(Ai),localStorage.removeItem(Li),localStorage.removeItem(Di)}catch{}}const eoe=F2("auth",{state:()=>Qae(),getters:{isAuthed:e=>!!e.token,hasOp:e=>t=>{const n=e.effectivePermissions?.allowedOps??[];return n.includes("*")||n.includes(t)},widgetOf:e=>t=>e.effectivePermissions?.visibleWidgets.find(a=>a.widgetId===t)?.visibility??"interactive",hasPage:e=>t=>{const n=e.effectivePermissions?.allowedPages??[];return n.includes("*")||n.includes(t)}},actions:{async login(e){const t=await Gae(e);return this.token=t.token,this.user=t.user,this.scope=t.scope,this.runMode=t.runMode,this.effectivePermissions=t.effectivePermissions,this.needsWizard=t.needsWizard??!1,this.validated=!0,localStorage.setItem(xd,t.token),localStorage.setItem(Pi,JSON.stringify(t.user)),localStorage.setItem(Ai,t.scope),localStorage.setItem(Li,t.runMode),localStorage.setItem(Di,JSON.stringify(t.effectivePermissions)),t},async logout(){try{await Xae()}catch{}Hp(this)},async validate(){if(!this.token)throw Hp(this),new Error("no-token");try{const e=await Zae();this.user=e.user,this.scope=e.scope,this.runMode=e.runMode,this.effectivePermissions=e.effectivePermissions,this.needsWizard=e.needsWizard??!1,this.validated=!0,localStorage.setItem(Pi,JSON.stringify(e.user)),localStorage.setItem(Ai,e.scope),localStorage.setItem(Li,e.runMode),localStorage.setItem(Di,JSON.stringify(e.effectivePermissions))}catch(e){if(e instanceof Error&&e.message==="mock-mode-skip-me-validation"){this.validated=!0;return}throw Hp(this),e}},async switchScope(e){const t=await Jae(e);return this.token=t.token,this.user=t.user,this.scope=t.scope,this.runMode=t.runMode,this.effectivePermissions=t.effectivePermissions,this.needsWizard=t.needsWizard??!1,this.validated=!0,localStorage.setItem(xd,t.token),localStorage.setItem(Pi,JSON.stringify(t.user)),localStorage.setItem(Ai,t.scope),localStorage.setItem(Li,t.runMode),localStorage.setItem(Di,JSON.stringify(t.effectivePermissions)),t},markWizardDone(){this.needsWizard=!1}}}),W4=[{path:"/login",name:"login",component:()=>nn(()=>import("./LoginView-Bg_Hrmmj.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),meta:{layout:"blank",public:!0,title:"登录"}},{path:"/status",name:"status",component:()=>nn(()=>import("./ServiceStatusView-COa3vbpj.js"),__vite__mapDeps([13,14,4,15,6,16,17])),meta:{layout:"blank",public:!0,title:"服务状态"}},{path:"/wizard",name:"wizard",component:()=>nn(()=>import("./WizardView-DniZ4Y5l.js"),__vite__mapDeps([18,2,19,4,6,17])),meta:{layout:"blank",title:"配置向导"}},{path:"/admin",component:()=>nn(()=>import("./AppShell-BqTC0xJK.js"),__vite__mapDeps([20,1,2,21,4,22,12,6,23,24,25])),meta:{scope:"Platform"},redirect:"/admin/dashboard",children:[{path:"dashboard",name:"admin-dashboard",component:()=>nn(()=>import("./DashboardView-fmEPf2c4.js"),__vite__mapDeps([26,27,28,29,4,30,10,15])),meta:{title:"总览"}},{path:"map-monitor",name:"admin-map-monitor",component:()=>nn(()=>import("./MapMonitorView-DEfDktpd.js"),__vite__mapDeps([31,32,33,4,6,17,1,28,34,35,36,37,27,38,39,15,30,40,41,42,22,12,43,8,11,44,45,46,24,23])),meta:{title:"地图监控"}},{path:"maps",name:"admin-maps",component:()=>nn(()=>import("./MapManagementView-D5EJh6kt.js"),__vite__mapDeps([47,1,34,48,4,49,30,22,12,11,44,17,50,6,45,5,8,9,43])),meta:{title:"地图管理"}},{path:"map-editor",name:"admin-map-editor",component:()=>nn(()=>import("./MapEditorView-DET9bUZJ.js"),__vite__mapDeps([51,1,32,33,4,6,17,28,34,52,38,53,45,22,12,11,44,8,54,55,23,24,30,5,50,9,43,7,25,42,10])),meta:{title:"地图编辑"}},{path:"tracks",name:"admin-tracks",component:()=>nn(()=>import("./TrackTableView-BEdpBnup.js"),__vite__mapDeps([56,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,59,30])),meta:{title:"场景管理"}},{path:"cars",name:"admin-cars",component:()=>nn(()=>import("./CarPanelView-DpfkXBoo.js"),__vite__mapDeps([60,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,61,30,7,40])),meta:{title:"车辆管理"}},{path:"processes",name:"admin-processes",component:()=>nn(()=>import("./ProcessPanelView-BaRn0PJa.js"),__vite__mapDeps([62,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,63])),meta:{title:"进程管理"}},{path:"scripts",name:"admin-scripts",component:()=>nn(()=>import("./ScriptPanelView-BNpYhbAt.js"),__vite__mapDeps([64,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,65])),meta:{title:"脚本管理"}},{path:"missions",name:"admin-missions",component:()=>nn(()=>import("./MissionEditorView-Cq1tHD-Z.js"),__vite__mapDeps([66,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,67])),meta:{title:"任务编排"}},{path:"project-properties",name:"admin-project-properties",component:()=>nn(()=>import("./ProjectPropertiesView-4-x-FH30.js"),__vite__mapDeps([68,1,28,69,4,30,49,15,46,22,12,11,44,17,8,9,55,6,16])),meta:{title:"项目属性"}},{path:"playback",name:"admin-playback",component:()=>nn(()=>import("./PlaybackView-CSBKNt4K.js"),__vite__mapDeps([70,1,71,4,15,22,12,11,44,17,72,40,6,8])),meta:{title:"调度回放"}},{path:"config/system",name:"admin-config-system",component:()=>nn(()=>import("./SystemConfigView-4Mxf2af4.js"),__vite__mapDeps([73,74,75,76,4,46,28,37,77,40,15,6,17,34,78,5,8,55,22,12,43,72,9,7,54])),meta:{title:"系统级配置"}},{path:"config/integrations",name:"admin-config-integrations",component:()=>nn(()=>import("./ExternalIntegrationView-CRYMen0m.js"),__vite__mapDeps([79,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44,55,8])),meta:{title:"外部系统对接"}},{path:"config/routing",name:"admin-config-routing",component:()=>nn(()=>import("./RoutingPolicyView-EphbUSUM.js"),__vite__mapDeps([80,1,74,75,76,4,46,28,37,77,40,15,6,17,5,22,12,11,44,8,9,43])),meta:{title:"路径规划策略"}},{path:"config/vehicle-hub",name:"admin-vehicle-hub",component:()=>nn(()=>import("./VehicleHubView-CG4ybiip.js"),__vite__mapDeps([81,28,74,75,76,4,46,37,77,40,15,6,17,1,27,38,82,49,30,22,12,23,24,43,8,55,42,5,9,72,16,50])),meta:{title:"车辆运维"}},{path:"vehicle-hub",redirect:"/admin/config/vehicle-hub"},{path:"config/vehicle",redirect:{path:"/admin/config/vehicle-hub",query:{tab:"maintenance"}}},{path:"config/fleet",redirect:{path:"/admin/config/vehicle-hub",query:{tab:"fleet"}}},{path:"config/charge",name:"admin-config-charge",component:()=>nn(()=>import("./ChargePolicyView-BMq754im.js"),__vite__mapDeps([83,1,74,75,76,4,46,28,37,77,40,15,6,17,5,22,12,11,44,8,9,55])),meta:{title:"充电逻辑"}},{path:"config/task",name:"admin-config-task",component:()=>nn(()=>import("./TaskAllocationView-Dm9F_jCO.js"),__vite__mapDeps([84,74,75,76,4,46,28,37,77,40,15,6,17,5,8,9,55,25])),meta:{title:"任务分配"}},{path:"config/traffic",name:"admin-config-traffic",component:()=>nn(()=>import("./TrafficRuleView-zSMLh9vH.js"),__vite__mapDeps([85,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44])),meta:{title:"交通管制"}},{path:"config/auth",name:"admin-config-auth",component:()=>nn(()=>import("./AuthRoleView-94zjdzbD.js"),__vite__mapDeps([86,1,87,4,49,46,11,88,72,40,45,5,22,12,17,43,8,15,30,44,55,6])),meta:{title:"权限角色"}},{path:"config/device",name:"admin-config-device",component:()=>nn(()=>import("./DeviceHubView-6kHSU9g1.js"),__vite__mapDeps([89,1,74,75,76,4,46,28,37,77,40,15,6,17,30,16,55,22,12,11,44])),meta:{title:"设备接入"}},{path:"config/scenario",name:"admin-config-scenario",component:()=>nn(()=>import("./ScenarioTemplateView-2tn-jb3L.js"),__vite__mapDeps([90,74,75,76,4,46,28,37,77,40,15,6,17,91,16,72])),meta:{title:"场景模板"}},{path:"config/location",name:"admin-config-location",component:()=>nn(()=>import("./LocationView-BH1yvcsy.js"),__vite__mapDeps([92,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44,42])),meta:{title:"库位管理"}},{path:"config/ops",name:"admin-config-ops",component:()=>nn(()=>import("./OpsConfigView-Cx4yfu4M.js"),__vite__mapDeps([93,74,75,76,4,46,28,37,77,40,15,6,17,94,49,5,7,11,88,50,8,9,72])),meta:{title:"运营维护"}},{path:"config/widget",name:"admin-config-widget",component:()=>nn(()=>import("./CustomWidgetView-BKa7U3FY.js"),__vite__mapDeps([95,1,74,75,76,4,46,28,37,77,40,15,6,17,96,22,12,11,44])),meta:{title:"自定义控件"}},{path:"config/map-monitor",name:"admin-config-map-monitor",component:()=>nn(()=>import("./MapMonitorConfigView-16D4TNib.js"),__vite__mapDeps([97,75,76,4,46,28,98,49,15,30,6,17,50,11,88,23])),meta:{title:"地图监控配置"}}]},{path:"/monitor",component:()=>nn(()=>import("./AppShell-BqTC0xJK.js"),__vite__mapDeps([20,1,2,21,4,22,12,6,23,24,25])),meta:{scope:"RCSMonitor"},redirect:"/monitor/map",children:[{path:"dashboard",name:"monitor-dashboard",component:()=>nn(()=>import("./MonitorDashboardView-9UzVNNbL.js"),__vite__mapDeps([99,1,27,28,36,100,4,15,22,12,11,44,42,17,40,41])),meta:{title:"运营总览"}},{path:"vehicle-hub",name:"monitor-vehicle-hub",component:()=>nn(()=>import("./VehicleHubView-CG4ybiip.js"),__vite__mapDeps([81,28,74,75,76,4,46,37,77,40,15,6,17,1,27,38,82,49,30,22,12,23,24,43,8,55,42,5,9,72,16,50])),meta:{title:"车辆运维"}},{path:"map",name:"monitor-map",component:()=>nn(()=>import("./MonitorMapView-h38_wi8I.js"),__vite__mapDeps([101,31,32,33,4,6,17,1,28,34,35,36,37,27,38,39,15,30,40,41,42,22,12,43,8,11,44,45,46,24,23])),meta:{title:"地图监控"}},{path:"ops",name:"monitor-ops",component:()=>nn(()=>import("./OpsActionPanelView-DP5WSM1Z.js"),__vite__mapDeps([102,1,75,76,4,46,35,36,103,15,22,12,11,44,6,8,17])),meta:{title:"运维操作"}},{path:"notes",name:"monitor-notes",component:()=>nn(()=>import("./AnnotationView-W73nG5X1.js"),__vite__mapDeps([104,1,4,15,22,12,11,44,17,72,5,6,43,8])),meta:{title:"运营备注"}}]},{path:"/",redirect:"/login"},{path:"/:pathMatch(.*)*",redirect:"/login"}];function j4(e){return(W4.find(n=>n.path===e)?.children??[]).filter(n=>typeof n.name=="string").map(n=>({name:String(n.name),path:`${e}/${n.path}`}))}const U4=j4("/admin"),q4=j4("/monitor"),toe=new Set([...U4,...q4].map(e=>e.name)),Nf=Lte({history:hte(),routes:W4});Nf.beforeEach(async e=>{const t=eoe();if(e.meta.public)return!0;if(!t.isAuthed)return{path:"/login",query:{redirect:e.fullPath}};if(!t.validated)try{await t.validate()}catch{return{path:"/login",query:{redirect:e.fullPath}}}if(t.needsWizard&&e.name!=="wizard")return{name:"wizard"};const n=e.path.startsWith("/admin")?"Platform":e.path.startsWith("/monitor")?"RCSMonitor":null;if(n&&t.scope!==n)try{await t.switchScope(n)}catch{try{await t.switchScope(n)}catch{}}const a=typeof e.name=="string"?e.name:"";if(a&&toe.has(a)&&!t.hasPage(a)){const r=(t.scope==="RCSMonitor"?q4:U4).find(s=>t.hasPage(s.name))?.path;if(r&&r!==e.path)return cv.warning("无权访问该页面,已跳转到可访问页面"),r;if(!r)return cv.error("当前账号在该区域没有任何可访问页面,请联系管理员分配权限"),{path:"/status"}}return!0});Nf.afterEach(e=>{const t="迷毂";document.title=e.meta.title?`${e.meta.title} · ${t}`:t});Nf.onError((e,t)=>{const n=e?.message??"";/dynamically imported module|Loading (chunk|CSS chunk)|module script failed|Failed to fetch/i.test(n)&&(t?.fullPath?window.location.assign(t.fullPath):window.location.reload())});const noe="fame-lavender",zc=[{id:"fame-lavender",name:"迷毂浅紫",description:"参考 FAME 系统:深紫侧栏 + 浅紫白主区,柔和耐看,长时间使用不刺眼",preview:"#7c3aed",previewAccent:"#a855f7",vars:{"--mg-primary":"#7c3aed","--mg-primary-rgb":"124, 58, 237","--mg-primary-hover":"#8b5cf6","--mg-primary-hover-rgb":"139, 92, 246","--mg-primary-active":"#5b21b6","--mg-accent":"#a855f7","--mg-accent-rgb":"168, 85, 247","--mg-primary-light-3":"#a78bfa","--mg-primary-light-5":"#c4b5fd","--mg-primary-light-7":"#ddd6fe","--mg-primary-light-8":"#ede9fe","--mg-primary-light-9":"#f5f3ff","--mg-primary-dark-2":"#6d28d9","--mg-bg-app-1":"#edeaf5","--mg-bg-app-2":"#e7e4f1","--mg-bg-app-3":"#f1eef8","--mg-bg-app-deep-rgb":"231, 228, 241","--mg-bg-aside-1":"#2d1b69","--mg-bg-aside-2":"#1a1040","--mg-bg-aside-rgb":"45, 27, 105","--mg-bg-card-rgb":"255, 255, 255","--mg-bg-card-hi-rgb":"249, 246, 255","--mg-bg-card-darker-rgb":"245, 240, 251","--mg-shadow-rgb":"124, 58, 237","--mg-text-tint-rgb":"45, 27, 105","--mg-text-hi-rgb":"96, 98, 102","--mg-orb-a-opacity":"0","--mg-orb-b-opacity":"0","--mg-orb-c-opacity":"0"}},{id:"industrial-purple",name:"星云紫",description:"科幻紫主色,辅以蓝紫渐变,磨砂玻璃 · 霓虹辉光",preview:"#7c3aed",previewAccent:"#c4b5fd",vars:{"--mg-primary":"#7c3aed","--mg-primary-rgb":"124, 58, 237","--mg-primary-hover":"#8b5cf6","--mg-primary-hover-rgb":"139, 92, 246","--mg-primary-active":"#5b21b6","--mg-accent":"#c4b5fd","--mg-accent-rgb":"196, 181, 253","--mg-primary-light-3":"#9d6cf2","--mg-primary-light-5":"#b594f7","--mg-primary-light-7":"#6f4eab","--mg-primary-light-8":"#4c357a","--mg-primary-light-9":"#2d1f55","--mg-primary-dark-2":"#4c1d95","--mg-bg-app-1":"#0e0a24","--mg-bg-app-2":"#1f1147","--mg-bg-app-3":"#06031a","--mg-bg-app-deep-rgb":"6, 3, 26","--mg-bg-aside-1":"#0c0820","--mg-bg-aside-2":"#03020e","--mg-bg-aside-rgb":"10, 6, 30","--mg-bg-card-rgb":"38, 24, 78","--mg-bg-card-hi-rgb":"58, 38, 110","--mg-bg-card-darker-rgb":"20, 12, 48","--mg-shadow-rgb":"8, 2, 24","--mg-text-tint-rgb":"242, 232, 255","--mg-text-hi-rgb":"220, 200, 252","--mg-orb-a-opacity":"0.55","--mg-orb-b-opacity":"0.50","--mg-orb-c-opacity":"0.40"}},{id:"deep-azure",name:"深邃蓝",description:"科技感深蓝,沉静稳重",preview:"#1565c0",previewAccent:"#82b1ff",vars:{"--mg-primary":"#1565c0","--mg-primary-rgb":"21, 101, 192","--mg-primary-hover":"#1976d2","--mg-primary-hover-rgb":"25, 118, 210","--mg-primary-active":"#0d47a1","--mg-accent":"#82b1ff","--mg-accent-rgb":"130, 177, 255","--mg-primary-light-3":"#5a8fce","--mg-primary-light-5":"#83aedb","--mg-primary-light-7":"#adcde7","--mg-primary-light-8":"#c4dbed","--mg-primary-light-9":"#e3eef8","--mg-primary-dark-2":"#0d47a1","--mg-bg-app-1":"#051a3a","--mg-bg-app-2":"#0a2f6b","--mg-bg-app-3":"#020a1f","--mg-bg-app-deep-rgb":"2, 8, 26","--mg-bg-aside-1":"#06122a","--mg-bg-aside-2":"#02060f","--mg-bg-aside-rgb":"8, 18, 42","--mg-bg-card-rgb":"12, 36, 80","--mg-bg-card-hi-rgb":"18, 50, 110","--mg-bg-card-darker-rgb":"6, 18, 44","--mg-shadow-rgb":"2, 4, 14","--mg-text-tint-rgb":"218, 234, 252","--mg-text-hi-rgb":"170, 200, 240"}},{id:"emerald-forge",name:"翡翠绿",description:"机械翡翠绿,沉稳活力",preview:"#00796b",previewAccent:"#80cbc4",vars:{"--mg-primary":"#00796b","--mg-primary-rgb":"0, 121, 107","--mg-primary-hover":"#00897b","--mg-primary-hover-rgb":"0, 137, 123","--mg-primary-active":"#004d40","--mg-accent":"#80cbc4","--mg-accent-rgb":"128, 203, 196","--mg-primary-light-3":"#4ca094","--mg-primary-light-5":"#79b9b0","--mg-primary-light-7":"#a6d2cc","--mg-primary-light-8":"#bfdfdb","--mg-primary-light-9":"#e1f0ee","--mg-primary-dark-2":"#004d40","--mg-bg-app-1":"#06241f","--mg-bg-app-2":"#0a4538","--mg-bg-app-3":"#020f0c","--mg-bg-app-deep-rgb":"2, 12, 10","--mg-bg-aside-1":"#061a16","--mg-bg-aside-2":"#020a08","--mg-bg-aside-rgb":"8, 26, 22","--mg-bg-card-rgb":"10, 50, 42","--mg-bg-card-hi-rgb":"14, 66, 56","--mg-bg-card-darker-rgb":"6, 28, 24","--mg-shadow-rgb":"2, 10, 8","--mg-text-tint-rgb":"220, 244, 240","--mg-text-hi-rgb":"170, 220, 210"}},{id:"crimson-iron",name:"熔铁赤",description:"熔铁炉火般的暗红工业风",preview:"#b71c1c",previewAccent:"#ff8a80",vars:{"--mg-primary":"#b71c1c","--mg-primary-rgb":"183, 28, 28","--mg-primary-hover":"#d32f2f","--mg-primary-hover-rgb":"211, 47, 47","--mg-primary-active":"#8a0c0c","--mg-accent":"#ff8a80","--mg-accent-rgb":"255, 138, 128","--mg-primary-light-3":"#c95a5a","--mg-primary-light-5":"#d68585","--mg-primary-light-7":"#e4afaf","--mg-primary-light-8":"#edc8c8","--mg-primary-light-9":"#f7e6e6","--mg-primary-dark-2":"#8a0c0c","--mg-bg-app-1":"#2a0606","--mg-bg-app-2":"#4a0c0c","--mg-bg-app-3":"#150303","--mg-bg-app-deep-rgb":"20, 4, 4","--mg-bg-aside-1":"#200505","--mg-bg-aside-2":"#0c0202","--mg-bg-aside-rgb":"36, 6, 6","--mg-bg-card-rgb":"60, 10, 10","--mg-bg-card-hi-rgb":"80, 14, 14","--mg-bg-card-darker-rgb":"34, 5, 5","--mg-shadow-rgb":"10, 1, 1","--mg-text-tint-rgb":"252, 220, 220","--mg-text-hi-rgb":"240, 175, 175"}},{id:"graphite-steel",name:"石墨钢",description:"中性冷灰,纯粹工业",preview:"#455a64",previewAccent:"#b0bec5",vars:{"--mg-primary":"#455a64","--mg-primary-rgb":"69, 90, 100","--mg-primary-hover":"#607d8b","--mg-primary-hover-rgb":"96, 125, 139","--mg-primary-active":"#263238","--mg-accent":"#b0bec5","--mg-accent-rgb":"176, 190, 197","--mg-primary-light-3":"#7a8a92","--mg-primary-light-5":"#9aa6ac","--mg-primary-light-7":"#bac2c7","--mg-primary-light-8":"#ccd2d6","--mg-primary-light-9":"#e8ebed","--mg-primary-dark-2":"#263238","--mg-bg-app-1":"#161e24","--mg-bg-app-2":"#243038","--mg-bg-app-3":"#0a0e12","--mg-bg-app-deep-rgb":"10, 14, 18","--mg-bg-aside-1":"#11181d","--mg-bg-aside-2":"#060a0d","--mg-bg-aside-rgb":"18, 26, 32","--mg-bg-card-rgb":"30, 42, 50","--mg-bg-card-hi-rgb":"42, 56, 66","--mg-bg-card-darker-rgb":"16, 22, 28","--mg-shadow-rgb":"4, 6, 10","--mg-text-tint-rgb":"226, 232, 238","--mg-text-hi-rgb":"186, 198, 210"}},{id:"amber-forge",name:"琥珀金",description:"高对比的橙金调,警示与活力并存",preview:"#e65100",previewAccent:"#ffb74d",vars:{"--mg-primary":"#e65100","--mg-primary-rgb":"230, 81, 0","--mg-primary-hover":"#f57c00","--mg-primary-hover-rgb":"245, 124, 0","--mg-primary-active":"#bf360c","--mg-accent":"#ffb74d","--mg-accent-rgb":"255, 183, 77","--mg-primary-light-3":"#ec8344","--mg-primary-light-5":"#f2a474","--mg-primary-light-7":"#f7c4a3","--mg-primary-light-8":"#fad6bc","--mg-primary-light-9":"#fdeadd","--mg-primary-dark-2":"#bf360c","--mg-bg-app-1":"#2a1404","--mg-bg-app-2":"#4a2a0c","--mg-bg-app-3":"#150a02","--mg-bg-app-deep-rgb":"20, 10, 4","--mg-bg-aside-1":"#200f04","--mg-bg-aside-2":"#0c0602","--mg-bg-aside-rgb":"34, 16, 6","--mg-bg-card-rgb":"62, 32, 8","--mg-bg-card-hi-rgb":"82, 44, 12","--mg-bg-card-darker-rgb":"34, 16, 4","--mg-shadow-rgb":"10, 4, 1","--mg-text-tint-rgb":"252, 232, 210","--mg-text-hi-rgb":"240, 196, 140"}}];function ui(e){return e?zc.find(t=>t.id===e)??zc[0]:zc[0]}function ci(e){const t=document.documentElement;for(const[n,a]of Object.entries(e.vars))t.style.setProperty(n,a);t.setAttribute("data-theme",e.id)}const pre=[{key:"--mg-primary",label:"主色(背景基色)",hint:"全页背景、左侧导航、卡片底色、按钮"},{key:"--mg-primary-hover",label:"悬停/辉光",hint:"背景光晕、菜单高亮、悬停态"},{key:"--mg-accent",label:"强调/高光",hint:"点缀、边框高光、Logo 光晕"}];function Sv(e){const t=e.trim().replace(/^#/,"");return/^[0-9a-f]{6}$/i.test(t)?[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]:null}function Zo(e){const t=Sv(e);return t?`${t[0]}, ${t[1]}, ${t[2]}`:"0, 0, 0"}function Bi(e,t,n){const a=Sv(e),o=Sv(t);if(!a||!o)return e;const r=l=>Math.round(a[l]+(o[l]-a[l])*n),s=l=>l.toString(16).padStart(2,"0");return`#${s(r(0))}${s(r(1))}${s(r(2))}`}function ow(e,t){return Bi(e,"#ffffff",t)}function no(e,t){return Bi(e,"#000000",t)}function aoe(e,t){const n={...e.vars},a=t["--mg-primary"]??n["--mg-primary"],o=t["--mg-primary-hover"]??n["--mg-primary-hover"],r=t["--mg-accent"]??n["--mg-accent"];if(t["--mg-primary"]){const s=no(a,.72),l=no(a,.48),u=no(a,.58),c=no(a,.54),d=no(a,.7),f=no(a,.38),p=no(a,.28),g=no(a,.62);n["--mg-primary"]=a,n["--mg-primary-rgb"]=Zo(a),n["--mg-primary-active"]=no(a,.35),n["--mg-primary-dark-2"]=no(a,.35),n["--mg-primary-light-3"]=ow(a,.22),n["--mg-primary-light-5"]=ow(a,.35),n["--mg-primary-light-7"]=Bi(a,"#888888",.45),n["--mg-primary-light-8"]=Bi(a,"#666666",.55),n["--mg-primary-light-9"]=Bi(a,"#444444",.65),n["--mg-bg-app-1"]=u,n["--mg-bg-app-2"]=l,n["--mg-bg-app-3"]=s,n["--mg-bg-app-deep-rgb"]=Zo(s),n["--mg-bg-aside-1"]=c,n["--mg-bg-aside-2"]=d,n["--mg-bg-aside-rgb"]=Zo(c),n["--mg-bg-card-rgb"]=Zo(f),n["--mg-bg-card-hi-rgb"]=Zo(p),n["--mg-bg-card-darker-rgb"]=Zo(g),n["--mg-shadow-rgb"]=Zo(no(a,.78))}return t["--mg-primary-hover"]&&(n["--mg-primary-hover"]=o,n["--mg-primary-hover-rgb"]=Zo(o)),t["--mg-accent"]&&(n["--mg-accent"]=r,n["--mg-accent-rgb"]=Zo(r)),n}function rw(e,t){if(!t||Object.keys(t).length===0)return e;const n=aoe(e,t);return{...e,preview:t["--mg-primary"]??e.preview,previewAccent:t["--mg-accent"]??e.previewAccent,vars:n}}const Y4="simple.ui.state",yc={sidebarCollapsed:!1,theme:"light",themeId:noe,themeOverrides:{}};function ooe(){try{const e=localStorage.getItem(Y4);if(!e)return{...yc};const t=JSON.parse(e);return{sidebarCollapsed:t.sidebarCollapsed??yc.sidebarCollapsed,theme:t.theme==="dark"?"dark":"light",themeId:t.themeId??yc.themeId,themeOverrides:t.themeOverrides??{}}}catch(e){return console.warn("[ui.store] localStorage 中的 UI 状态解析失败,已回退默认:",e),{...yc}}}const roe=F2("ui",{state:()=>ooe(),getters:{activeTheme(e){return rw(ui(e.themeId),e.themeOverrides[e.themeId])},availableThemes(){return zc}},actions:{toggleSidebar(){this.sidebarCollapsed=!this.sidebarCollapsed,this.persist()},setTheme(e){this.theme=e,document.documentElement.classList.toggle("dark",e==="dark"),this.persist()},getMergedTheme(e){return rw(e,this.themeOverrides[e.id])},getThemeColor(e,t){const n=ui(e);return this.themeOverrides[e]?.[t]??n.vars[t]},setThemeColor(e,t,n){this.themeOverrides[e]||(this.themeOverrides[e]={}),this.themeOverrides[e][t]=n,this.themeId===e&&ci(this.getMergedTheme(ui(e))),this.persist()},clearThemeOverrides(e){delete this.themeOverrides[e],this.themeId===e&&ci(ui(e)),this.persist()},clearAllThemeOverrides(){this.themeOverrides={},ci(this.activeTheme),this.persist()},setThemeId(e){const t=ui(e);this.themeId=t.id,ci(this.getMergedTheme(t)),this.persist()},applyCurrentTheme(){ci(this.activeTheme)},persist(){const e={sidebarCollapsed:this.sidebarCollapsed,theme:this.theme,themeId:this.themeId,themeOverrides:this.themeOverrides};try{localStorage.setItem(Y4,JSON.stringify(e))}catch(t){console.warn("[ui.store] 持久化 UI 状态失败:",t)}}}}),Mf=A2(_ee),G4=wO();Mf.use(G4);roe(G4).applyCurrentTheme();Mf.use(Nf);Mf.use(kee,{locale:Eee});Mf.mount("#app");export{tx as $,C9 as A,h7 as B,k7 as C,Nae as D,nL as E,E7 as F,V7 as G,BE as H,VK as I,FK as J,zK as K,qE as L,E9 as M,QL as N,eD as O,x9 as P,De as Q,Un as R,GE as S,oj as T,T9 as U,wj as V,Sj as W,cv as X,JQ as Y,ud as Z,uU as _,Lae as a,Ooe as a$,KF as a0,HF as a1,Cz as a2,vo as a3,es as a4,_q as a5,CE as a6,kj as a7,Jq as a8,eX as a9,moe as aA,z as aB,le as aC,re as aD,D as aE,soe as aF,wt as aG,X as aH,se as aI,F2 as aJ,MP as aK,AP as aL,goe as aM,boe as aN,yoe as aO,ui as aP,woe as aQ,Soe as aR,HP as aS,Coe as aT,Xl as aU,tu as aV,koe as aW,Eoe as aX,xoe as aY,ho as aZ,Toe as a_,rG as aa,sG as ab,QG as ac,cr as ad,pX as ae,hX as af,Wn as ag,BJ as ah,Ve as ai,pre as aj,xee as ak,loe as al,qo as am,ff as an,ioe as ao,uoe as ap,coe as aq,doe as ar,Il as as,Yo as at,Qa as au,foe as av,poe as aw,C as ax,hoe as ay,voe as az,Dae as b,_oe as b0,L0 as b1,Ne as b2,R as b3,ze as b4,Roe as b5,Vt as b6,ht as b7,Vl as b8,E as b9,Ni as bA,$t as bB,Foe as bC,zoe as bD,Hoe as bE,Koe as bF,HA as bG,Woe as bH,pe as bI,ne as bJ,ct as bK,Xe as bL,Ioe as ba,$oe as bb,xC as bc,Noe as bd,Moe as be,hA as bf,Dt as bg,M as bh,Poe as bi,kt as bj,oe as bk,Mt as bl,it as bm,kA as bn,Aoe as bo,Tt as bp,Ce as bq,Loe as br,Doe as bs,i as bt,Boe as bu,eoe as bv,Uoe as bw,joe as bx,roe as by,Voe as bz,Rae as c,Vae as d,Fae as e,Iae as f,Bae as g,_ae as h,Mae as i,Pae as j,$ae as k,zae as l,k9 as m,m5 as n,UC as o,M5 as p,P5 as q,Bn as r,QC as s,PV as t,mo as u,qm as v,xz as w,Fz as x,zz as y,v9 as z}; +`+r)}}catch{}}throw a}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Ds(this.defaults,n);const{transitional:a,paramsSerializer:o,headers:r}=n;a!==void 0&&Fc.assertOptions(a,{silentJSONParsing:Ka.transitional(Ka.boolean),forcedJSONParsing:Ka.transitional(Ka.boolean),clarifyTimeoutError:Ka.transitional(Ka.boolean),legacyInterceptorReqResOrdering:Ka.transitional(Ka.boolean)},!1),o!=null&&(ke.isFunction(o)?n.paramsSerializer={serialize:o}:Fc.assertOptions(o,{encode:Ka.function,serialize:Ka.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Fc.assertOptions(n,{baseUrl:Ka.spelling("baseURL"),withXsrfToken:Ka.spelling("withXSRFToken")},!0),n.method=(n.method||this.defaults.method||"get").toLowerCase();let s=r&&ke.merge(r.common,r[n.method]);r&&ke.forEach(["delete","get","head","post","put","patch","query","common"],h=>{delete r[h]}),n.headers=va.concat(s,r);const l=[];let u=!0;this.interceptors.request.forEach(function(v){if(typeof v.runWhen=="function"&&v.runWhen(n)===!1)return;u=u&&v.synchronous;const m=n.transitional||Dg;m&&m.legacyInterceptorReqResOrdering?l.unshift(v.fulfilled,v.rejected):l.push(v.fulfilled,v.rejected)});const c=[];this.interceptors.response.forEach(function(v){c.push(v.fulfilled,v.rejected)});let d,f=0,p;if(!u){const h=[ew.bind(this),void 0];for(h.unshift(...l),h.push(...c),p=h.length,d=Promise.resolve(n);f{if(!a._listeners)return;let r=a._listeners.length;for(;r-- >0;)a._listeners[r](o);a._listeners=null}),this.promise.then=o=>{let r;const s=new Promise(l=>{a.subscribe(l),r=l}).then(o);return s.cancel=function(){a.unsubscribe(r)},s},t(function(r,s,l){a.reason||(a.reason=new Uu(r,s,l),n(a.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=a=>{t.abort(a)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new F4(function(o){t=o}),cancel:t}}};function Eae(e){return function(n){return e.apply(null,n)}}function xae(e){return ke.isObject(e)&&e.isAxiosError===!0}const yv={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(yv).forEach(([e,t])=>{yv[t]=e});function z4(e){const t=new xs(e),n=w4(xs.prototype.request,t);return ke.extend(n,xs.prototype,t,{allOwnKeys:!0}),ke.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return z4(Ds(e,o))},n}const An=z4(ju);An.Axios=xs;An.CanceledError=Uu;An.CancelToken=kae;An.isCancel=P4;An.VERSION=Vg;An.toFormData=If;An.AxiosError=Ct;An.Cancel=An.CanceledError;An.all=function(t){return Promise.all(t)};An.spread=Eae;An.isAxiosError=xae;An.mergeConfig=Ds;An.AxiosHeaders=va;An.formToJSON=e=>M4(ke.isHTMLForm(e)?new FormData(e):e);An.getAdapter=V4.getAdapter;An.HttpStatusCode=yv;An.default=An;const{Axios:Xoe,AxiosError:Joe,CanceledError:Zoe,isCancel:Qoe,CancelToken:ere,VERSION:tre,all:nre,Cancel:are,isAxiosError:ore,spread:rre,toFormData:sre,AxiosHeaders:lre,HttpStatusCode:ire,formToJSON:ure,getAdapter:cre,mergeConfig:dre,create:fre}=An,Tae="/api",Xl=An.create({baseURL:Tae,timeout:15e3,headers:{"Content-Type":"application/json"},withCredentials:!0});Xl.interceptors.request.use(e=>{const t=localStorage.getItem("simple.auth.token");t&&e.headers.set("Authorization",`Bearer ${t}`);const n=localStorage.getItem("simple.auth.scope");return n&&e.headers.set("X-Scope",n),e});function Oae(e){const t=e.response?.status,n=e.config?.url??"",a=n.startsWith("/sl/")||n.startsWith("sl/");if(t===502||t===504||e.code==="ECONNABORTED"||e.code==="ERR_NETWORK")return a?"SimpleLite 未连接:请先启动 SimpleLite 后端(监听端口 8222)后重试。":`网关无法连接到下游服务(${t??e.code??"network"})。`;const o=e.response?.data;return o?.message?o.message:e.message}Xl.interceptors.response.use(e=>e,e=>{if(e.response?.status===401){try{localStorage.removeItem("simple.auth.token"),localStorage.removeItem("simple.auth.user"),localStorage.removeItem("simple.auth.scope"),localStorage.removeItem("simple.auth.runMode"),localStorage.removeItem("simple.auth.perm")}catch{}location.pathname!=="/login"&&location.assign("/login")}const t=Oae(e);try{Object.defineProperty(e,"message",{value:t,configurable:!0})}catch{}return Promise.reject(e)});new Date().toISOString();new Date().toISOString();const _ae={dispatchLoopHz:50,log:{level:"info",rollDays:7,maxSizeMB:256},security:{jwtExpireMin:1440,enableSwagger:!1,corsWhitelist:["http://localhost:5173","https://*.intra"]}},Rae={mes:[{id:"mes-1",name:"MES 主线",url:"http://mes.lan/api",enabled:!0}],wms:[{id:"wms-1",name:"WMS 仓储",url:"http://wms.lan/api",enabled:!0}],rcs:[],ptl:[{id:"ptl-1",name:"PTL 拣选",url:"http://ptl.lan/api",enabled:!0}]},Iae={algorithm:"astar",weights:{distance:1,congestion:.5,turnPenalty:.2},avoidance:[{id:"AV1",zoneId:"Z-NORTH",rule:"no-entry-while-loading"}],zoneSpeedLimits:[{zoneId:"Z-NARROW",maxSpeedMps:.5}]},$ae={lowBatteryThreshold:.3,criticalBatteryThreshold:.15,faultReport:{enabled:!0,emailTo:["ops@example.com"]},autoRepair:{enabled:!1,cooldownSec:600}},Nae={allowMidTaskCharge:!1,idleChargeAfterSec:300,priority:[{id:"CP1",condition:"soc<0.2",weight:100},{id:"CP2",condition:"idle>5min",weight:30}]},Mae={mode:"leastLoad",loadBalance:!0,maxQueuePerCar:3},Pae={intersections:[{id:"IX1",siteIds:["S006","S007"],mode:"mutex"}],mutex:[{id:"MZ1",zoneIds:["Z-CROSS"]}],yields:[{id:"YD1",from:"A 区",to:"B 区",condition:"priority30s"},{level:"error",condition:"driverException"}]}},Dae={groups:[{id:"G-A",name:"A 区车队",floor:"F1",region:"A",carIds:["C01","C02","C03"]},{id:"G-B",name:"B 区车队",floor:"F1",region:"B",carIds:["C04","C05"]}],ota:{enabled:!0,batchSize:2,rollbackOnFail:!0},batchOps:{confirmationRequired:!0,maxBatch:10},networkDiag:{rttThresholdMs:80,packetLossThreshold:.02}},Bae={templates:[{id:"tpl-sps",name:"SPS 物料配送",category:"SPS",version:"1.0.0",baselineJson:"{}"},{id:"tpl-pack",name:"电池 Pack 自动化产线",category:"BatteryPack",version:"1.0.0",baselineJson:"{}"},{id:"tpl-loop",name:"环线运行",category:"Loop",version:"1.0.0",baselineJson:"{}"},{id:"tpl-p2p",name:"点对点柔性搬运",category:"P2P",version:"1.0.0",baselineJson:"{}"}],dslPolicy:{enabled:!0,schemaVersion:"1"},lowCode:{enabled:!1,editor:"json"},versionPolicy:{keepVersions:10,allowRollback:!0}},Vae={locations:[{id:"L01",code:"A-01",name:"A 区货架 1",siteId:"S001",capacity:20,occupied:12},{id:"L02",code:"A-02",name:"A 区货架 2",siteId:"S002",capacity:20,occupied:7},{id:"L03",code:"B-01",name:"B 区缓存",siteId:"S003",capacity:30,occupied:25}],inventoryRules:[{id:"IR1",itemType:"PalletA",minQty:5,maxQty:30}]},Fae={playback:{retentionDays:30,samplingHz:5},logRetention:{hotDays:7,coldDays:180},version:{keepReleases:5},monitor:{car:{propertyKeys:[],statusKeys:[],actionKeys:[]},site:{propertyKeys:[],statusKeys:[],actionKeys:[]},track:{propertyKeys:[],statusKeys:[],actionKeys:[]},carActionByType:{}}},zae={items:[{id:"widget-call-button",name:"呼叫按钮",schemaJson:'{"fields":[{"name":"siteId"}]}',layoutJson:'{"x":0,"y":0,"w":2,"h":1}',bindToScopes:["RCSMonitor"]}]},H4={system:_ae,integrations:Rae,routing:Iae,vehicle:$ae,charge:Nae,task:Mae,traffic:Pae,auth:Aae,device:Lae,fleet:Dae,scenario:Bae,location:Vae,ops:Fae,widget:zae},K4="simple-platform-mock-rbac";function Hae(){return{roles:[{id:"role-admin",name:"超级管理员",description:"拥有全部页面与操作权限的内置角色",scope:"*",pages:["*"],ops:["*"],widgetGrants:[],system:!0},{id:"role-ops",name:"运营人员",description:"运营监控端默认角色:可执行运维操作、查看监控",scope:"RCSMonitor",pages:["monitor-dashboard","monitor-map","monitor-ops","monitor-notes","monitor-vehicle-hub"],ops:["ops.car.pause","ops.car.resume","ops.car.gohome","ops.car.resetSession","ops.car.manualCharge","ops.task.pause","ops.task.cancel","ops.task.reassign","ops.task.boostPriority","monitor.note.write"],widgetGrants:[{widgetId:"MapEditor",visibility:"readonly"},{widgetId:"CadToolbar",visibility:"hidden"},{widgetId:"CarPanel",visibility:"readonly"},{widgetId:"MissionEditor",visibility:"readonly"},{widgetId:"OpsActionPanel",visibility:"interactive"},{widgetId:"ConfigCenter",visibility:"hidden"}],system:!0}],users:[{id:"u-admin",username:"admin",displayName:"系统管理员",enabled:!0,roleIds:["role-admin"],scopes:[]},{id:"u-ops",username:"ops",displayName:"运营人员",enabled:!0,roleIds:["role-ops"],scopes:[]}]}}function Kae(){try{const t=localStorage.getItem(K4);if(t)return JSON.parse(t)}catch{}const e=Hae();return jae(e),e}let Wae=Kae();function jae(e=Wae){try{localStorage.setItem(K4,JSON.stringify(e))}catch{}}function wv(){return new Date().toISOString()}const Uae="simple-platform-mock-config",nw=new Map;function qae(){try{const e=localStorage.getItem(Uae);if(e)return JSON.parse(e)}catch{}return{}}function Yae(e){let t=nw.get(e);return t||(t=qae()[e]??{section:e,version:1,updatedAt:wv(),payload:H4[e]},nw.set(e,t)),t}for(const e of Object.keys(H4))Yae(e);wv(),wv();async function Gae(e){const{data:t}=await Xl.post("/auth/login",e);return t}async function Xae(){await Xl.post("/auth/logout")}async function Jae(e){const{data:t}=await Xl.post("/auth/switch-scope",{scope:e});return t}async function Zae(){const{data:e}=await Xl.get("/auth/me");return e}const xd="simple.auth.token",Pi="simple.auth.user",Ai="simple.auth.scope",Li="simple.auth.runMode",Di="simple.auth.perm";function aw(e){try{const t=localStorage.getItem(e);return t==null?null:JSON.parse(t)}catch{return null}}function zp(e){try{return localStorage.getItem(e)}catch{return null}}function Qae(){return{token:zp(xd),user:aw(Pi),scope:zp(Ai),runMode:zp(Li),effectivePermissions:aw(Di),validated:!1,needsWizard:!1}}function Hp(e){e.token=null,e.user=null,e.scope=null,e.runMode=null,e.effectivePermissions=null,e.validated=!1,e.needsWizard=!1;try{localStorage.removeItem(xd),localStorage.removeItem(Pi),localStorage.removeItem(Ai),localStorage.removeItem(Li),localStorage.removeItem(Di)}catch{}}const eoe=F2("auth",{state:()=>Qae(),getters:{isAuthed:e=>!!e.token,hasOp:e=>t=>{const n=e.effectivePermissions?.allowedOps??[];return n.includes("*")||n.includes(t)},widgetOf:e=>t=>e.effectivePermissions?.visibleWidgets.find(a=>a.widgetId===t)?.visibility??"interactive",hasPage:e=>t=>{const n=e.effectivePermissions?.allowedPages??[];return n.includes("*")||n.includes(t)}},actions:{async login(e){const t=await Gae(e);return this.token=t.token,this.user=t.user,this.scope=t.scope,this.runMode=t.runMode,this.effectivePermissions=t.effectivePermissions,this.needsWizard=t.needsWizard??!1,this.validated=!0,localStorage.setItem(xd,t.token),localStorage.setItem(Pi,JSON.stringify(t.user)),localStorage.setItem(Ai,t.scope),localStorage.setItem(Li,t.runMode),localStorage.setItem(Di,JSON.stringify(t.effectivePermissions)),t},async logout(){try{await Xae()}catch{}Hp(this)},async validate(){if(!this.token)throw Hp(this),new Error("no-token");try{const e=await Zae();this.user=e.user,this.scope=e.scope,this.runMode=e.runMode,this.effectivePermissions=e.effectivePermissions,this.needsWizard=e.needsWizard??!1,this.validated=!0,localStorage.setItem(Pi,JSON.stringify(e.user)),localStorage.setItem(Ai,e.scope),localStorage.setItem(Li,e.runMode),localStorage.setItem(Di,JSON.stringify(e.effectivePermissions))}catch(e){if(e instanceof Error&&e.message==="mock-mode-skip-me-validation"){this.validated=!0;return}throw Hp(this),e}},async switchScope(e){const t=await Jae(e);return this.token=t.token,this.user=t.user,this.scope=t.scope,this.runMode=t.runMode,this.effectivePermissions=t.effectivePermissions,this.needsWizard=t.needsWizard??!1,this.validated=!0,localStorage.setItem(xd,t.token),localStorage.setItem(Pi,JSON.stringify(t.user)),localStorage.setItem(Ai,t.scope),localStorage.setItem(Li,t.runMode),localStorage.setItem(Di,JSON.stringify(t.effectivePermissions)),t},markWizardDone(){this.needsWizard=!1}}}),W4=[{path:"/login",name:"login",component:()=>nn(()=>import("./LoginView-0TaDlGzh.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12])),meta:{layout:"blank",public:!0,title:"登录"}},{path:"/status",name:"status",component:()=>nn(()=>import("./ServiceStatusView-CiTg6q_Q.js"),__vite__mapDeps([13,14,4,15,6,16,17])),meta:{layout:"blank",public:!0,title:"服务状态"}},{path:"/wizard",name:"wizard",component:()=>nn(()=>import("./WizardView-C7EOtEcB.js"),__vite__mapDeps([18,2,19,4,6,17])),meta:{layout:"blank",title:"配置向导"}},{path:"/admin",component:()=>nn(()=>import("./AppShell-CAX-HJ2b.js"),__vite__mapDeps([20,1,2,21,4,22,12,6,23,24,25])),meta:{scope:"Platform"},redirect:"/admin/dashboard",children:[{path:"dashboard",name:"admin-dashboard",component:()=>nn(()=>import("./DashboardView-C5o_Ttf4.js"),__vite__mapDeps([26,27,28,29,4,30,10,15])),meta:{title:"总览"}},{path:"map-monitor",name:"admin-map-monitor",component:()=>nn(()=>import("./MapMonitorView-Bc6X9WQO.js"),__vite__mapDeps([31,32,33,4,6,17,1,28,34,35,36,37,27,38,39,15,30,40,41,42,22,12,43,8,11,44,45,46,24,23])),meta:{title:"地图监控"}},{path:"maps",name:"admin-maps",component:()=>nn(()=>import("./MapManagementView-CccyKhbv.js"),__vite__mapDeps([47,1,34,48,4,49,30,22,12,11,44,17,50,6,45,5,8,9,43])),meta:{title:"地图管理"}},{path:"map-editor",name:"admin-map-editor",component:()=>nn(()=>import("./MapEditorView-Bf_sv8Aw.js"),__vite__mapDeps([51,1,32,33,4,6,17,28,34,52,38,53,45,22,12,11,44,8,54,55,23,24,30,5,50,9,43,7,25,42,10])),meta:{title:"地图编辑"}},{path:"tracks",name:"admin-tracks",component:()=>nn(()=>import("./TrackTableView-CKv4G01-.js"),__vite__mapDeps([56,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,59,30])),meta:{title:"场景管理"}},{path:"cars",name:"admin-cars",component:()=>nn(()=>import("./CarPanelView-DfcvV1b9.js"),__vite__mapDeps([60,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,61,30,7,40])),meta:{title:"车辆管理"}},{path:"processes",name:"admin-processes",component:()=>nn(()=>import("./ProcessPanelView-DoD_u6oD.js"),__vite__mapDeps([62,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,63])),meta:{title:"进程管理"}},{path:"scripts",name:"admin-scripts",component:()=>nn(()=>import("./ScriptPanelView-DMd6Dq7p.js"),__vite__mapDeps([64,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,65])),meta:{title:"脚本管理"}},{path:"missions",name:"admin-missions",component:()=>nn(()=>import("./MissionEditorView-BNUdM9Ij.js"),__vite__mapDeps([66,57,1,28,52,38,58,4,49,45,5,25,16,8,9,6,54,55,17,15,46,22,12,11,44,23,24,67])),meta:{title:"任务编排"}},{path:"project-properties",name:"admin-project-properties",component:()=>nn(()=>import("./ProjectPropertiesView-DxQyu0yl.js"),__vite__mapDeps([68,1,28,69,4,30,49,15,46,22,12,11,44,17,8,9,55,6,16])),meta:{title:"项目属性"}},{path:"playback",name:"admin-playback",component:()=>nn(()=>import("./PlaybackView-DVrgp4e4.js"),__vite__mapDeps([70,1,71,4,15,22,12,11,44,17,72,40,6,8])),meta:{title:"调度回放"}},{path:"config/system",name:"admin-config-system",component:()=>nn(()=>import("./SystemConfigView-Cy7YXbTA.js"),__vite__mapDeps([73,74,75,76,4,46,28,37,77,40,15,6,17,34,78,5,8,55,22,12,43,72,9,7,54])),meta:{title:"系统级配置"}},{path:"config/integrations",name:"admin-config-integrations",component:()=>nn(()=>import("./ExternalIntegrationView-CVrzHPs8.js"),__vite__mapDeps([79,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44,55,8])),meta:{title:"外部系统对接"}},{path:"config/routing",name:"admin-config-routing",component:()=>nn(()=>import("./RoutingPolicyView-vyV201zY.js"),__vite__mapDeps([80,1,74,75,76,4,46,28,37,77,40,15,6,17,5,22,12,11,44,8,9,43])),meta:{title:"路径规划策略"}},{path:"config/vehicle-hub",name:"admin-vehicle-hub",component:()=>nn(()=>import("./VehicleHubView-1cdDkq5N.js"),__vite__mapDeps([81,28,74,75,76,4,46,37,77,40,15,6,17,1,27,38,82,49,30,22,12,23,24,43,8,55,42,5,9,72,16,50])),meta:{title:"车辆运维"}},{path:"vehicle-hub",redirect:"/admin/config/vehicle-hub"},{path:"config/vehicle",redirect:{path:"/admin/config/vehicle-hub",query:{tab:"maintenance"}}},{path:"config/fleet",redirect:{path:"/admin/config/vehicle-hub",query:{tab:"fleet"}}},{path:"config/charge",name:"admin-config-charge",component:()=>nn(()=>import("./ChargePolicyView-fgYXxU-T.js"),__vite__mapDeps([83,1,74,75,76,4,46,28,37,77,40,15,6,17,5,22,12,11,44,8,9,55])),meta:{title:"充电逻辑"}},{path:"config/task",name:"admin-config-task",component:()=>nn(()=>import("./TaskAllocationView-BoGL3AmK.js"),__vite__mapDeps([84,74,75,76,4,46,28,37,77,40,15,6,17,5,8,9,55,25])),meta:{title:"任务分配"}},{path:"config/traffic",name:"admin-config-traffic",component:()=>nn(()=>import("./TrafficRuleView-CZpyEJOL.js"),__vite__mapDeps([85,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44])),meta:{title:"交通管制"}},{path:"config/auth",name:"admin-config-auth",component:()=>nn(()=>import("./AuthRoleView-BW7bVuKX.js"),__vite__mapDeps([86,1,87,4,49,46,11,88,72,40,45,5,22,12,17,43,8,15,30,44,55,6])),meta:{title:"权限角色"}},{path:"config/device",name:"admin-config-device",component:()=>nn(()=>import("./DeviceHubView-D6W4gbr_.js"),__vite__mapDeps([89,1,74,75,76,4,46,28,37,77,40,15,6,17,30,16,55,22,12,11,44])),meta:{title:"设备接入"}},{path:"config/scenario",name:"admin-config-scenario",component:()=>nn(()=>import("./ScenarioTemplateView-CmTU4kEH.js"),__vite__mapDeps([90,74,75,76,4,46,28,37,77,40,15,6,17,91,16,72])),meta:{title:"场景模板"}},{path:"config/location",name:"admin-config-location",component:()=>nn(()=>import("./LocationView-r0d4EkyN.js"),__vite__mapDeps([92,1,74,75,76,4,46,28,37,77,40,15,6,17,30,22,12,11,44,42])),meta:{title:"库位管理"}},{path:"config/ops",name:"admin-config-ops",component:()=>nn(()=>import("./OpsConfigView-Ch6itZUF.js"),__vite__mapDeps([93,74,75,76,4,46,28,37,77,40,15,6,17,94,49,5,7,11,88,50,8,9,72])),meta:{title:"运营维护"}},{path:"config/widget",name:"admin-config-widget",component:()=>nn(()=>import("./CustomWidgetView-Ch7DIGUj.js"),__vite__mapDeps([95,1,74,75,76,4,46,28,37,77,40,15,6,17,96,22,12,11,44])),meta:{title:"自定义控件"}},{path:"config/map-monitor",name:"admin-config-map-monitor",component:()=>nn(()=>import("./MapMonitorConfigView-CYlZhPX2.js"),__vite__mapDeps([97,75,76,4,46,28,98,49,15,30,6,17,50,11,88,23])),meta:{title:"地图监控配置"}}]},{path:"/monitor",component:()=>nn(()=>import("./AppShell-CAX-HJ2b.js"),__vite__mapDeps([20,1,2,21,4,22,12,6,23,24,25])),meta:{scope:"RCSMonitor"},redirect:"/monitor/map",children:[{path:"dashboard",name:"monitor-dashboard",component:()=>nn(()=>import("./MonitorDashboardView-Dl0hq3jL.js"),__vite__mapDeps([99,1,27,28,36,100,4,15,22,12,11,44,42,17,40,41])),meta:{title:"运营总览"}},{path:"vehicle-hub",name:"monitor-vehicle-hub",component:()=>nn(()=>import("./VehicleHubView-1cdDkq5N.js"),__vite__mapDeps([81,28,74,75,76,4,46,37,77,40,15,6,17,1,27,38,82,49,30,22,12,23,24,43,8,55,42,5,9,72,16,50])),meta:{title:"车辆运维"}},{path:"map",name:"monitor-map",component:()=>nn(()=>import("./MonitorMapView-OvNLwhYc.js"),__vite__mapDeps([101,31,32,33,4,6,17,1,28,34,35,36,37,27,38,39,15,30,40,41,42,22,12,43,8,11,44,45,46,24,23])),meta:{title:"地图监控"}},{path:"ops",name:"monitor-ops",component:()=>nn(()=>import("./OpsActionPanelView-CgLT81Kn.js"),__vite__mapDeps([102,1,75,76,4,46,35,36,103,15,22,12,11,44,6,8,17])),meta:{title:"运维操作"}},{path:"notes",name:"monitor-notes",component:()=>nn(()=>import("./AnnotationView-DixiuHnc.js"),__vite__mapDeps([104,1,4,15,22,12,11,44,17,72,5,6,43,8])),meta:{title:"运营备注"}}]},{path:"/",redirect:"/login"},{path:"/:pathMatch(.*)*",redirect:"/login"}];function j4(e){return(W4.find(n=>n.path===e)?.children??[]).filter(n=>typeof n.name=="string").map(n=>({name:String(n.name),path:`${e}/${n.path}`}))}const U4=j4("/admin"),q4=j4("/monitor"),toe=new Set([...U4,...q4].map(e=>e.name)),Nf=Lte({history:hte(),routes:W4});Nf.beforeEach(async e=>{const t=eoe();if(e.meta.public)return!0;if(!t.isAuthed)return{path:"/login",query:{redirect:e.fullPath}};if(!t.validated)try{await t.validate()}catch{return{path:"/login",query:{redirect:e.fullPath}}}if(t.needsWizard&&e.name!=="wizard")return{name:"wizard"};const n=e.path.startsWith("/admin")?"Platform":e.path.startsWith("/monitor")?"RCSMonitor":null;if(n&&t.scope!==n)try{await t.switchScope(n)}catch{try{await t.switchScope(n)}catch{}}const a=typeof e.name=="string"?e.name:"";if(a&&toe.has(a)&&!t.hasPage(a)){const r=(t.scope==="RCSMonitor"?q4:U4).find(s=>t.hasPage(s.name))?.path;if(r&&r!==e.path)return cv.warning("无权访问该页面,已跳转到可访问页面"),r;if(!r)return cv.error("当前账号在该区域没有任何可访问页面,请联系管理员分配权限"),{path:"/status"}}return!0});Nf.afterEach(e=>{const t="迷毂";document.title=e.meta.title?`${e.meta.title} · ${t}`:t});Nf.onError((e,t)=>{const n=e?.message??"";/dynamically imported module|Loading (chunk|CSS chunk)|module script failed|Failed to fetch/i.test(n)&&(t?.fullPath?window.location.assign(t.fullPath):window.location.reload())});const noe="fame-lavender",zc=[{id:"fame-lavender",name:"迷毂浅紫",description:"参考 FAME 系统:深紫侧栏 + 浅紫白主区,柔和耐看,长时间使用不刺眼",preview:"#7c3aed",previewAccent:"#a855f7",vars:{"--mg-primary":"#7c3aed","--mg-primary-rgb":"124, 58, 237","--mg-primary-hover":"#8b5cf6","--mg-primary-hover-rgb":"139, 92, 246","--mg-primary-active":"#5b21b6","--mg-accent":"#a855f7","--mg-accent-rgb":"168, 85, 247","--mg-primary-light-3":"#a78bfa","--mg-primary-light-5":"#c4b5fd","--mg-primary-light-7":"#ddd6fe","--mg-primary-light-8":"#ede9fe","--mg-primary-light-9":"#f5f3ff","--mg-primary-dark-2":"#6d28d9","--mg-bg-app-1":"#edeaf5","--mg-bg-app-2":"#e7e4f1","--mg-bg-app-3":"#f1eef8","--mg-bg-app-deep-rgb":"231, 228, 241","--mg-bg-aside-1":"#2d1b69","--mg-bg-aside-2":"#1a1040","--mg-bg-aside-rgb":"45, 27, 105","--mg-bg-card-rgb":"255, 255, 255","--mg-bg-card-hi-rgb":"249, 246, 255","--mg-bg-card-darker-rgb":"245, 240, 251","--mg-shadow-rgb":"124, 58, 237","--mg-text-tint-rgb":"45, 27, 105","--mg-text-hi-rgb":"96, 98, 102","--mg-orb-a-opacity":"0","--mg-orb-b-opacity":"0","--mg-orb-c-opacity":"0"}},{id:"industrial-purple",name:"星云紫",description:"科幻紫主色,辅以蓝紫渐变,磨砂玻璃 · 霓虹辉光",preview:"#7c3aed",previewAccent:"#c4b5fd",vars:{"--mg-primary":"#7c3aed","--mg-primary-rgb":"124, 58, 237","--mg-primary-hover":"#8b5cf6","--mg-primary-hover-rgb":"139, 92, 246","--mg-primary-active":"#5b21b6","--mg-accent":"#c4b5fd","--mg-accent-rgb":"196, 181, 253","--mg-primary-light-3":"#9d6cf2","--mg-primary-light-5":"#b594f7","--mg-primary-light-7":"#6f4eab","--mg-primary-light-8":"#4c357a","--mg-primary-light-9":"#2d1f55","--mg-primary-dark-2":"#4c1d95","--mg-bg-app-1":"#0e0a24","--mg-bg-app-2":"#1f1147","--mg-bg-app-3":"#06031a","--mg-bg-app-deep-rgb":"6, 3, 26","--mg-bg-aside-1":"#0c0820","--mg-bg-aside-2":"#03020e","--mg-bg-aside-rgb":"10, 6, 30","--mg-bg-card-rgb":"38, 24, 78","--mg-bg-card-hi-rgb":"58, 38, 110","--mg-bg-card-darker-rgb":"20, 12, 48","--mg-shadow-rgb":"8, 2, 24","--mg-text-tint-rgb":"242, 232, 255","--mg-text-hi-rgb":"220, 200, 252","--mg-orb-a-opacity":"0.55","--mg-orb-b-opacity":"0.50","--mg-orb-c-opacity":"0.40"}},{id:"deep-azure",name:"深邃蓝",description:"科技感深蓝,沉静稳重",preview:"#1565c0",previewAccent:"#82b1ff",vars:{"--mg-primary":"#1565c0","--mg-primary-rgb":"21, 101, 192","--mg-primary-hover":"#1976d2","--mg-primary-hover-rgb":"25, 118, 210","--mg-primary-active":"#0d47a1","--mg-accent":"#82b1ff","--mg-accent-rgb":"130, 177, 255","--mg-primary-light-3":"#5a8fce","--mg-primary-light-5":"#83aedb","--mg-primary-light-7":"#adcde7","--mg-primary-light-8":"#c4dbed","--mg-primary-light-9":"#e3eef8","--mg-primary-dark-2":"#0d47a1","--mg-bg-app-1":"#051a3a","--mg-bg-app-2":"#0a2f6b","--mg-bg-app-3":"#020a1f","--mg-bg-app-deep-rgb":"2, 8, 26","--mg-bg-aside-1":"#06122a","--mg-bg-aside-2":"#02060f","--mg-bg-aside-rgb":"8, 18, 42","--mg-bg-card-rgb":"12, 36, 80","--mg-bg-card-hi-rgb":"18, 50, 110","--mg-bg-card-darker-rgb":"6, 18, 44","--mg-shadow-rgb":"2, 4, 14","--mg-text-tint-rgb":"218, 234, 252","--mg-text-hi-rgb":"170, 200, 240"}},{id:"emerald-forge",name:"翡翠绿",description:"机械翡翠绿,沉稳活力",preview:"#00796b",previewAccent:"#80cbc4",vars:{"--mg-primary":"#00796b","--mg-primary-rgb":"0, 121, 107","--mg-primary-hover":"#00897b","--mg-primary-hover-rgb":"0, 137, 123","--mg-primary-active":"#004d40","--mg-accent":"#80cbc4","--mg-accent-rgb":"128, 203, 196","--mg-primary-light-3":"#4ca094","--mg-primary-light-5":"#79b9b0","--mg-primary-light-7":"#a6d2cc","--mg-primary-light-8":"#bfdfdb","--mg-primary-light-9":"#e1f0ee","--mg-primary-dark-2":"#004d40","--mg-bg-app-1":"#06241f","--mg-bg-app-2":"#0a4538","--mg-bg-app-3":"#020f0c","--mg-bg-app-deep-rgb":"2, 12, 10","--mg-bg-aside-1":"#061a16","--mg-bg-aside-2":"#020a08","--mg-bg-aside-rgb":"8, 26, 22","--mg-bg-card-rgb":"10, 50, 42","--mg-bg-card-hi-rgb":"14, 66, 56","--mg-bg-card-darker-rgb":"6, 28, 24","--mg-shadow-rgb":"2, 10, 8","--mg-text-tint-rgb":"220, 244, 240","--mg-text-hi-rgb":"170, 220, 210"}},{id:"crimson-iron",name:"熔铁赤",description:"熔铁炉火般的暗红工业风",preview:"#b71c1c",previewAccent:"#ff8a80",vars:{"--mg-primary":"#b71c1c","--mg-primary-rgb":"183, 28, 28","--mg-primary-hover":"#d32f2f","--mg-primary-hover-rgb":"211, 47, 47","--mg-primary-active":"#8a0c0c","--mg-accent":"#ff8a80","--mg-accent-rgb":"255, 138, 128","--mg-primary-light-3":"#c95a5a","--mg-primary-light-5":"#d68585","--mg-primary-light-7":"#e4afaf","--mg-primary-light-8":"#edc8c8","--mg-primary-light-9":"#f7e6e6","--mg-primary-dark-2":"#8a0c0c","--mg-bg-app-1":"#2a0606","--mg-bg-app-2":"#4a0c0c","--mg-bg-app-3":"#150303","--mg-bg-app-deep-rgb":"20, 4, 4","--mg-bg-aside-1":"#200505","--mg-bg-aside-2":"#0c0202","--mg-bg-aside-rgb":"36, 6, 6","--mg-bg-card-rgb":"60, 10, 10","--mg-bg-card-hi-rgb":"80, 14, 14","--mg-bg-card-darker-rgb":"34, 5, 5","--mg-shadow-rgb":"10, 1, 1","--mg-text-tint-rgb":"252, 220, 220","--mg-text-hi-rgb":"240, 175, 175"}},{id:"graphite-steel",name:"石墨钢",description:"中性冷灰,纯粹工业",preview:"#455a64",previewAccent:"#b0bec5",vars:{"--mg-primary":"#455a64","--mg-primary-rgb":"69, 90, 100","--mg-primary-hover":"#607d8b","--mg-primary-hover-rgb":"96, 125, 139","--mg-primary-active":"#263238","--mg-accent":"#b0bec5","--mg-accent-rgb":"176, 190, 197","--mg-primary-light-3":"#7a8a92","--mg-primary-light-5":"#9aa6ac","--mg-primary-light-7":"#bac2c7","--mg-primary-light-8":"#ccd2d6","--mg-primary-light-9":"#e8ebed","--mg-primary-dark-2":"#263238","--mg-bg-app-1":"#161e24","--mg-bg-app-2":"#243038","--mg-bg-app-3":"#0a0e12","--mg-bg-app-deep-rgb":"10, 14, 18","--mg-bg-aside-1":"#11181d","--mg-bg-aside-2":"#060a0d","--mg-bg-aside-rgb":"18, 26, 32","--mg-bg-card-rgb":"30, 42, 50","--mg-bg-card-hi-rgb":"42, 56, 66","--mg-bg-card-darker-rgb":"16, 22, 28","--mg-shadow-rgb":"4, 6, 10","--mg-text-tint-rgb":"226, 232, 238","--mg-text-hi-rgb":"186, 198, 210"}},{id:"amber-forge",name:"琥珀金",description:"高对比的橙金调,警示与活力并存",preview:"#e65100",previewAccent:"#ffb74d",vars:{"--mg-primary":"#e65100","--mg-primary-rgb":"230, 81, 0","--mg-primary-hover":"#f57c00","--mg-primary-hover-rgb":"245, 124, 0","--mg-primary-active":"#bf360c","--mg-accent":"#ffb74d","--mg-accent-rgb":"255, 183, 77","--mg-primary-light-3":"#ec8344","--mg-primary-light-5":"#f2a474","--mg-primary-light-7":"#f7c4a3","--mg-primary-light-8":"#fad6bc","--mg-primary-light-9":"#fdeadd","--mg-primary-dark-2":"#bf360c","--mg-bg-app-1":"#2a1404","--mg-bg-app-2":"#4a2a0c","--mg-bg-app-3":"#150a02","--mg-bg-app-deep-rgb":"20, 10, 4","--mg-bg-aside-1":"#200f04","--mg-bg-aside-2":"#0c0602","--mg-bg-aside-rgb":"34, 16, 6","--mg-bg-card-rgb":"62, 32, 8","--mg-bg-card-hi-rgb":"82, 44, 12","--mg-bg-card-darker-rgb":"34, 16, 4","--mg-shadow-rgb":"10, 4, 1","--mg-text-tint-rgb":"252, 232, 210","--mg-text-hi-rgb":"240, 196, 140"}}];function ui(e){return e?zc.find(t=>t.id===e)??zc[0]:zc[0]}function ci(e){const t=document.documentElement;for(const[n,a]of Object.entries(e.vars))t.style.setProperty(n,a);t.setAttribute("data-theme",e.id)}const pre=[{key:"--mg-primary",label:"主色(背景基色)",hint:"全页背景、左侧导航、卡片底色、按钮"},{key:"--mg-primary-hover",label:"悬停/辉光",hint:"背景光晕、菜单高亮、悬停态"},{key:"--mg-accent",label:"强调/高光",hint:"点缀、边框高光、Logo 光晕"}];function Sv(e){const t=e.trim().replace(/^#/,"");return/^[0-9a-f]{6}$/i.test(t)?[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]:null}function Zo(e){const t=Sv(e);return t?`${t[0]}, ${t[1]}, ${t[2]}`:"0, 0, 0"}function Bi(e,t,n){const a=Sv(e),o=Sv(t);if(!a||!o)return e;const r=l=>Math.round(a[l]+(o[l]-a[l])*n),s=l=>l.toString(16).padStart(2,"0");return`#${s(r(0))}${s(r(1))}${s(r(2))}`}function ow(e,t){return Bi(e,"#ffffff",t)}function no(e,t){return Bi(e,"#000000",t)}function aoe(e,t){const n={...e.vars},a=t["--mg-primary"]??n["--mg-primary"],o=t["--mg-primary-hover"]??n["--mg-primary-hover"],r=t["--mg-accent"]??n["--mg-accent"];if(t["--mg-primary"]){const s=no(a,.72),l=no(a,.48),u=no(a,.58),c=no(a,.54),d=no(a,.7),f=no(a,.38),p=no(a,.28),g=no(a,.62);n["--mg-primary"]=a,n["--mg-primary-rgb"]=Zo(a),n["--mg-primary-active"]=no(a,.35),n["--mg-primary-dark-2"]=no(a,.35),n["--mg-primary-light-3"]=ow(a,.22),n["--mg-primary-light-5"]=ow(a,.35),n["--mg-primary-light-7"]=Bi(a,"#888888",.45),n["--mg-primary-light-8"]=Bi(a,"#666666",.55),n["--mg-primary-light-9"]=Bi(a,"#444444",.65),n["--mg-bg-app-1"]=u,n["--mg-bg-app-2"]=l,n["--mg-bg-app-3"]=s,n["--mg-bg-app-deep-rgb"]=Zo(s),n["--mg-bg-aside-1"]=c,n["--mg-bg-aside-2"]=d,n["--mg-bg-aside-rgb"]=Zo(c),n["--mg-bg-card-rgb"]=Zo(f),n["--mg-bg-card-hi-rgb"]=Zo(p),n["--mg-bg-card-darker-rgb"]=Zo(g),n["--mg-shadow-rgb"]=Zo(no(a,.78))}return t["--mg-primary-hover"]&&(n["--mg-primary-hover"]=o,n["--mg-primary-hover-rgb"]=Zo(o)),t["--mg-accent"]&&(n["--mg-accent"]=r,n["--mg-accent-rgb"]=Zo(r)),n}function rw(e,t){if(!t||Object.keys(t).length===0)return e;const n=aoe(e,t);return{...e,preview:t["--mg-primary"]??e.preview,previewAccent:t["--mg-accent"]??e.previewAccent,vars:n}}const Y4="simple.ui.state",yc={sidebarCollapsed:!1,theme:"light",themeId:noe,themeOverrides:{}};function ooe(){try{const e=localStorage.getItem(Y4);if(!e)return{...yc};const t=JSON.parse(e);return{sidebarCollapsed:t.sidebarCollapsed??yc.sidebarCollapsed,theme:t.theme==="dark"?"dark":"light",themeId:t.themeId??yc.themeId,themeOverrides:t.themeOverrides??{}}}catch(e){return console.warn("[ui.store] localStorage 中的 UI 状态解析失败,已回退默认:",e),{...yc}}}const roe=F2("ui",{state:()=>ooe(),getters:{activeTheme(e){return rw(ui(e.themeId),e.themeOverrides[e.themeId])},availableThemes(){return zc}},actions:{toggleSidebar(){this.sidebarCollapsed=!this.sidebarCollapsed,this.persist()},setTheme(e){this.theme=e,document.documentElement.classList.toggle("dark",e==="dark"),this.persist()},getMergedTheme(e){return rw(e,this.themeOverrides[e.id])},getThemeColor(e,t){const n=ui(e);return this.themeOverrides[e]?.[t]??n.vars[t]},setThemeColor(e,t,n){this.themeOverrides[e]||(this.themeOverrides[e]={}),this.themeOverrides[e][t]=n,this.themeId===e&&ci(this.getMergedTheme(ui(e))),this.persist()},clearThemeOverrides(e){delete this.themeOverrides[e],this.themeId===e&&ci(ui(e)),this.persist()},clearAllThemeOverrides(){this.themeOverrides={},ci(this.activeTheme),this.persist()},setThemeId(e){const t=ui(e);this.themeId=t.id,ci(this.getMergedTheme(t)),this.persist()},applyCurrentTheme(){ci(this.activeTheme)},persist(){const e={sidebarCollapsed:this.sidebarCollapsed,theme:this.theme,themeId:this.themeId,themeOverrides:this.themeOverrides};try{localStorage.setItem(Y4,JSON.stringify(e))}catch(t){console.warn("[ui.store] 持久化 UI 状态失败:",t)}}}}),Mf=A2(_ee),G4=wO();Mf.use(G4);roe(G4).applyCurrentTheme();Mf.use(Nf);Mf.use(kee,{locale:Eee});Mf.mount("#app");export{tx as $,C9 as A,h7 as B,k7 as C,Nae as D,nL as E,E7 as F,V7 as G,BE as H,VK as I,FK as J,zK as K,qE as L,E9 as M,QL as N,eD as O,x9 as P,De as Q,Un as R,GE as S,oj as T,T9 as U,wj as V,Sj as W,cv as X,JQ as Y,ud as Z,uU as _,Lae as a,Ooe as a$,KF as a0,HF as a1,Cz as a2,vo as a3,es as a4,_q as a5,CE as a6,kj as a7,Jq as a8,eX as a9,moe as aA,z as aB,le as aC,re as aD,D as aE,soe as aF,wt as aG,X as aH,se as aI,F2 as aJ,MP as aK,AP as aL,goe as aM,boe as aN,yoe as aO,ui as aP,woe as aQ,Soe as aR,HP as aS,Coe as aT,Xl as aU,tu as aV,koe as aW,Eoe as aX,xoe as aY,ho as aZ,Toe as a_,rG as aa,sG as ab,QG as ac,cr as ad,pX as ae,hX as af,Wn as ag,BJ as ah,Ve as ai,pre as aj,xee as ak,loe as al,qo as am,ff as an,ioe as ao,uoe as ap,coe as aq,doe as ar,Il as as,Yo as at,Qa as au,foe as av,poe as aw,C as ax,hoe as ay,voe as az,Dae as b,_oe as b0,L0 as b1,Ne as b2,R as b3,ze as b4,Roe as b5,Vt as b6,ht as b7,Vl as b8,E as b9,Ni as bA,$t as bB,Foe as bC,zoe as bD,Hoe as bE,Koe as bF,HA as bG,Woe as bH,pe as bI,ne as bJ,ct as bK,Xe as bL,Ioe as ba,$oe as bb,xC as bc,Noe as bd,Moe as be,hA as bf,Dt as bg,M as bh,Poe as bi,kt as bj,oe as bk,Mt as bl,it as bm,kA as bn,Aoe as bo,Tt as bp,Ce as bq,Loe as br,Doe as bs,i as bt,Boe as bu,eoe as bv,Uoe as bw,joe as bx,roe as by,Voe as bz,Rae as c,Vae as d,Fae as e,Iae as f,Bae as g,_ae as h,Mae as i,Pae as j,$ae as k,zae as l,k9 as m,m5 as n,UC as o,M5 as p,P5 as q,Bn as r,QC as s,PV as t,mo as u,qm as v,xz as w,Fz as x,zz as y,v9 as z}; diff --git a/MiGu.Server/wwwroot/assets/mapEdit-BiAzHHno.js b/MiGu.Server/wwwroot/assets/mapEdit-TNAQr3Be.js similarity index 97% rename from MiGu.Server/wwwroot/assets/mapEdit-BiAzHHno.js rename to MiGu.Server/wwwroot/assets/mapEdit-TNAQr3Be.js index a9af6c8..24ae265 100644 --- a/MiGu.Server/wwwroot/assets/mapEdit-BiAzHHno.js +++ b/MiGu.Server/wwwroot/assets/mapEdit-TNAQr3Be.js @@ -1 +1 @@ -import{aU as t}from"./index-368apsQG.js";const s="/sl/projection/map-edit",r="/sl/projection/ai-config";async function a(e){const{data:o}=await e;if(!o?.success)throw new Error(o?.message??"request failed");return o.data}const m={createSite:e=>a(t.post(`${s}/objects/site`,e)),createTrack:(e,o)=>a(t.post(`${s}/objects/${e}`,o)),createImage:e=>a(t.post(`${s}/objects/image`,e)),createText:e=>a(t.post(`${s}/objects/text`,e)),createModel:e=>a(t.post(`${s}/objects/model`,e)),createCar:e=>a(t.post(`${s}/objects/car`,e)),deleteObject:(e,o)=>a(t.delete(`${s}/objects/${e}/${o}`)),batch:e=>a(t.post(`${s}/objects/batch`,{ops:e})),copyFieldsTo:(e,o,c,p)=>a(t.post(`${s}/objects/${e}/${o}/fields/copy-to`,{fieldNames:c,targets:p})),pick:()=>a(t.post(`${s}/pick`)),dashboardSummary:()=>a(t.get(`${s}/dashboard/summary`)),uploadAsset:(e,o)=>a(t.post(`${s}/assets/upload`,{filename:e,data:o},{headers:{"Content-Type":"multipart/form-data"}})),aiMapGenerate:e=>a(t.post(`${s}/ai/map-generate`,e)),projectSave:e=>a(t.post(`${s}/project/save`,{path:e??""})),projectLoad:e=>a(t.post(`${s}/project/load`,{path:e})),projectCurrent:()=>a(t.get(`${s}/project/current`)),projectBrowse:e=>a(t.get(`${s}/project/browse`,{params:e?{dir:e}:{}})),projectNativePickOpen:e=>a(t.post(`${s}/project/native-pick-open`,{initialDir:e??""})),projectNativePickSave:(e,o)=>a(t.post(`${s}/project/native-pick-save`,{initialDir:e??"",suggestedFileName:o??"project.current.json"})),sampleSitesAlongTrack:(e,o)=>a(t.post(`${s}/objects/track/${e}/sample-sites`,o)),getViewFilter:()=>a(t.get(`${s}/view-filter`)),setViewFilter:e=>a(t.post(`${s}/view-filter`,e))},$={get:()=>a(t.get(`${r}/`)),save:e=>a(t.post(`${r}/`,e))},d={list:()=>a(t.get(`${s}/maps`)),sceneTaskStatus:()=>a(t.get(`${s}/maps/scene-task-status`)),async save(e,o=!1){const{data:c}=await t.post(`${s}/maps/save`,{name:e,overwrite:o});return c?.success?{ok:!0,data:c.data}:{ok:!1,conflict:c?.code===409,message:c?.message??"保存失败"}},open:e=>a(t.post(`${s}/maps/open`,{name:e})),use:e=>a(t.post(`${s}/maps/use`,{name:e})),delete:e=>a(t.delete(`${s}/maps/${encodeURIComponent(e)}`)),rename:(e,o)=>a(t.post(`${s}/maps/rename`,{from:e,to:o})),async merge(e,o,c=!1){const{data:p}=await t.post(`${s}/maps/merge`,{sources:e,target:o,overwrite:c});return p?.success?{ok:!0,data:p.data}:{ok:!1,conflict:p?.code===409&&(p?.message??"").includes("已存在"),message:p?.message??"合并失败"}}};export{$ as a,d as b,m}; +import{aU as t}from"./index-Dg4NaXsE.js";const s="/sl/projection/map-edit",r="/sl/projection/ai-config";async function a(e){const{data:o}=await e;if(!o?.success)throw new Error(o?.message??"request failed");return o.data}const m={createSite:e=>a(t.post(`${s}/objects/site`,e)),createTrack:(e,o)=>a(t.post(`${s}/objects/${e}`,o)),createImage:e=>a(t.post(`${s}/objects/image`,e)),createText:e=>a(t.post(`${s}/objects/text`,e)),createModel:e=>a(t.post(`${s}/objects/model`,e)),createCar:e=>a(t.post(`${s}/objects/car`,e)),deleteObject:(e,o)=>a(t.delete(`${s}/objects/${e}/${o}`)),batch:e=>a(t.post(`${s}/objects/batch`,{ops:e})),copyFieldsTo:(e,o,c,p)=>a(t.post(`${s}/objects/${e}/${o}/fields/copy-to`,{fieldNames:c,targets:p})),pick:()=>a(t.post(`${s}/pick`)),dashboardSummary:()=>a(t.get(`${s}/dashboard/summary`)),uploadAsset:(e,o)=>a(t.post(`${s}/assets/upload`,{filename:e,data:o},{headers:{"Content-Type":"multipart/form-data"}})),aiMapGenerate:e=>a(t.post(`${s}/ai/map-generate`,e)),projectSave:e=>a(t.post(`${s}/project/save`,{path:e??""})),projectLoad:e=>a(t.post(`${s}/project/load`,{path:e})),projectCurrent:()=>a(t.get(`${s}/project/current`)),projectBrowse:e=>a(t.get(`${s}/project/browse`,{params:e?{dir:e}:{}})),projectNativePickOpen:e=>a(t.post(`${s}/project/native-pick-open`,{initialDir:e??""})),projectNativePickSave:(e,o)=>a(t.post(`${s}/project/native-pick-save`,{initialDir:e??"",suggestedFileName:o??"project.current.json"})),sampleSitesAlongTrack:(e,o)=>a(t.post(`${s}/objects/track/${e}/sample-sites`,o)),getViewFilter:()=>a(t.get(`${s}/view-filter`)),setViewFilter:e=>a(t.post(`${s}/view-filter`,e))},$={get:()=>a(t.get(`${r}/`)),save:e=>a(t.post(`${r}/`,e))},d={list:()=>a(t.get(`${s}/maps`)),sceneTaskStatus:()=>a(t.get(`${s}/maps/scene-task-status`)),async save(e,o=!1){const{data:c}=await t.post(`${s}/maps/save`,{name:e,overwrite:o});return c?.success?{ok:!0,data:c.data}:{ok:!1,conflict:c?.code===409,message:c?.message??"保存失败"}},open:e=>a(t.post(`${s}/maps/open`,{name:e})),use:e=>a(t.post(`${s}/maps/use`,{name:e})),delete:e=>a(t.delete(`${s}/maps/${encodeURIComponent(e)}`)),rename:(e,o)=>a(t.post(`${s}/maps/rename`,{from:e,to:o})),async merge(e,o,c=!1){const{data:p}=await t.post(`${s}/maps/merge`,{sources:e,target:o,overwrite:c});return p?.success?{ok:!0,data:p.data}:{ok:!1,conflict:p?.code===409&&(p?.message??"").includes("已存在"),message:p?.message??"合并失败"}}};export{$ as a,d as b,m}; diff --git a/MiGu.Server/wwwroot/assets/monitorConfigCache-BtW5W6GI.js b/MiGu.Server/wwwroot/assets/monitorConfigCache-BigdkiFw.js similarity index 72% rename from MiGu.Server/wwwroot/assets/monitorConfigCache-BtW5W6GI.js rename to MiGu.Server/wwwroot/assets/monitorConfigCache-BigdkiFw.js index 46d4ef5..27e7280 100644 --- a/MiGu.Server/wwwroot/assets/monitorConfigCache-BtW5W6GI.js +++ b/MiGu.Server/wwwroot/assets/monitorConfigCache-BigdkiFw.js @@ -1 +1 @@ -import{r as e}from"./reflection-C0K7EJ_N.js";let i=null,n=null;function o(){i=null,n=null}async function f(l=!1){return!l&&i?i:(!l&&n||(n=e.getMonitorConfig().then(t=>(i=t,n=null,t)).catch(t=>{throw n=null,t})),n)}export{f,o as i}; +import{r as e}from"./reflection-B_glb6eT.js";let i=null,n=null;function o(){i=null,n=null}async function f(l=!1){return!l&&i?i:(!l&&n||(n=e.getMonitorConfig().then(t=>(i=t,n=null,t)).catch(t=>{throw n=null,t})),n)}export{f,o as i}; diff --git a/MiGu.Server/wwwroot/assets/ops-DA63t9Ed.js b/MiGu.Server/wwwroot/assets/ops-CsVl7GhE.js similarity index 69% rename from MiGu.Server/wwwroot/assets/ops-DA63t9Ed.js rename to MiGu.Server/wwwroot/assets/ops-CsVl7GhE.js index 8c6e9bb..f55283d 100644 --- a/MiGu.Server/wwwroot/assets/ops-DA63t9Ed.js +++ b/MiGu.Server/wwwroot/assets/ops-CsVl7GhE.js @@ -1 +1 @@ -import{aU as a}from"./index-368apsQG.js";async function n(t){const{data:s}=await a.post("/sl/ops/execute",t);return s}async function o(){const{data:t}=await a.get("/sl/ops/audits");return t}export{n as e,o as l}; +import{aU as a}from"./index-Dg4NaXsE.js";async function n(t){const{data:s}=await a.post("/sl/ops/execute",t);return s}async function o(){const{data:t}=await a.get("/sl/ops/audits");return t}export{n as e,o as l}; diff --git a/MiGu.Server/wwwroot/assets/projection-nWPnmoX1.js b/MiGu.Server/wwwroot/assets/projection-BMms551H.js similarity index 92% rename from MiGu.Server/wwwroot/assets/projection-nWPnmoX1.js rename to MiGu.Server/wwwroot/assets/projection-BMms551H.js index 4b749ce..4491abc 100644 --- a/MiGu.Server/wwwroot/assets/projection-nWPnmoX1.js +++ b/MiGu.Server/wwwroot/assets/projection-BMms551H.js @@ -1 +1 @@ -import{aU as e}from"./index-368apsQG.js";import{r as s}from"./reflection-C0K7EJ_N.js";async function p(){const{data:t}=await e.get("/sl/projection/sites");return t}async function d(){const{data:t}=await e.get("/sl/projection/tracks");return t}function i(t){if(!t)return"idle";const r=t.toLowerCase();return/fault|error|failed|故障|异常|失联|超时|检修/.test(r)?"fault":/charg|充电/.test(r)?"charging":/pause|暂停|挂起/.test(r)?"paused":/offline|离线/.test(r)?"offline":/run|busy|working|运行|工作|执行|忙/.test(r)?"running":"idle"}function o(t){if(!t)return"queued";const r=t.toLowerCase();return/run|运行|执行/.test(r)?"running":/pause|暂停|挂起/.test(r)?"paused":/complete|done|完成|成功/.test(r)?"completed":/cancel|取消|中止/.test(r)?"cancelled":/fail|error|fault|失败|异常/.test(r)?"failed":/assign|分配/.test(r)?"assigned":"queued"}function u(t){return{id:`C${String(t.id).padStart(2,"0")}`,rawId:t.id,name:t.name,typeName:t.typeName,x:0,y:0,theta:0,batterySoc:.8,state:i(t.status),lastUpdate:new Date().toISOString(),group:t.layer??void 0}}function c(t){return{id:`M${String(t.id).padStart(2,"0")}`,name:t.name,typeName:t.typeName,priority:50,status:o(t.status),steps:[],createdAt:new Date().toISOString()}}async function n(){return(await s.listObjects("car")).map(u)}async function a(){return(await s.listObjects("mission")).map(c)}async function m(){try{const{data:t}=await e.get("/sl/projection/cars");if(Array.isArray(t)&&t.length>0)return t;const r=await n();return r.length>0?r:Array.isArray(t)?t:[]}catch{return n()}}async function y(){try{const{data:t}=await e.get("/sl/projection/missions");if(Array.isArray(t)&&t.length>0)return t;const r=await a();return r.length>0?r:Array.isArray(t)?t:[]}catch{return a()}}export{y as a,p as b,d as c,m as l}; +import{aU as e}from"./index-Dg4NaXsE.js";import{r as s}from"./reflection-B_glb6eT.js";async function p(){const{data:t}=await e.get("/sl/projection/sites");return t}async function d(){const{data:t}=await e.get("/sl/projection/tracks");return t}function i(t){if(!t)return"idle";const r=t.toLowerCase();return/fault|error|failed|故障|异常|失联|超时|检修/.test(r)?"fault":/charg|充电/.test(r)?"charging":/pause|暂停|挂起/.test(r)?"paused":/offline|离线/.test(r)?"offline":/run|busy|working|运行|工作|执行|忙/.test(r)?"running":"idle"}function o(t){if(!t)return"queued";const r=t.toLowerCase();return/run|运行|执行/.test(r)?"running":/pause|暂停|挂起/.test(r)?"paused":/complete|done|完成|成功/.test(r)?"completed":/cancel|取消|中止/.test(r)?"cancelled":/fail|error|fault|失败|异常/.test(r)?"failed":/assign|分配/.test(r)?"assigned":"queued"}function u(t){return{id:`C${String(t.id).padStart(2,"0")}`,rawId:t.id,name:t.name,typeName:t.typeName,x:0,y:0,theta:0,batterySoc:.8,state:i(t.status),lastUpdate:new Date().toISOString(),group:t.layer??void 0}}function c(t){return{id:`M${String(t.id).padStart(2,"0")}`,name:t.name,typeName:t.typeName,priority:50,status:o(t.status),steps:[],createdAt:new Date().toISOString()}}async function n(){return(await s.listObjects("car")).map(u)}async function a(){return(await s.listObjects("mission")).map(c)}async function m(){try{const{data:t}=await e.get("/sl/projection/cars");if(Array.isArray(t)&&t.length>0)return t;const r=await n();return r.length>0?r:Array.isArray(t)?t:[]}catch{return n()}}async function y(){try{const{data:t}=await e.get("/sl/projection/missions");if(Array.isArray(t)&&t.length>0)return t;const r=await a();return r.length>0?r:Array.isArray(t)?t:[]}catch{return a()}}export{y as a,p as b,d as c,m as l}; diff --git a/MiGu.Server/wwwroot/assets/reflection-C0K7EJ_N.js b/MiGu.Server/wwwroot/assets/reflection-B_glb6eT.js similarity index 98% rename from MiGu.Server/wwwroot/assets/reflection-C0K7EJ_N.js rename to MiGu.Server/wwwroot/assets/reflection-B_glb6eT.js index 3ea156c..45923fd 100644 --- a/MiGu.Server/wwwroot/assets/reflection-C0K7EJ_N.js +++ b/MiGu.Server/wwwroot/assets/reflection-B_glb6eT.js @@ -1 +1 @@ -import{aU as l}from"./index-368apsQG.js";const d="/sl/projection/reflection";function p(){return{fields:[],status:[],methods:[]}}function f(){return{car:p(),site:p(),track:p()}}const y=f;async function s(e){const{data:t}=await l.get(`${d}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function n(e,t){const{data:o}=await l.post(`${d}${e}`,null,{params:t});if(!o?.success)throw new Error(o?.message??`reflection ${e} failed`);return o.data}async function g(e){const{data:t}=await l.delete(`${d}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function u(e,t){const{data:o}=await l.patch(`${d}${e}`,t);if(!o?.success)throw new Error(o?.message??`reflection PATCH ${e} failed`);return o.data}const A={listKinds:()=>s("/kinds"),listAssemblies:()=>s("/assemblies"),listObjects:e=>s(`/objects/${e}`),listCreatableTypes:e=>s(`/types/${e}`),createObject:(e,t,o)=>{const r={};if(t&&(r.typeName=t),o)for(const[c,a]of Object.entries(o))a==null||a===""||(r[c]=a);return n(`/objects/${e}`,r)},deleteObject:(e,t)=>g(`/objects/${e}/${t}`),reloadPlugins:()=>n("/plugins/reload"),listPlugins:()=>s("/plugins"),unloadPlugin:e=>n(`/plugins/${encodeURIComponent(e)}/unload`),listMethods:(e,t)=>s(`/methods/${e}/${t}`),listMethodsByType:e=>s(`/methods-by-type/${e}`),getStatus:(e,t)=>s(`/status/${e}/${t}`),getFields:(e,t)=>s(`/fields/${e}/${t}`),setField:(e,t,o,r)=>n(`/fields/${e}/${t}/${encodeURIComponent(o)}`,{value:r}),deleteField:(e,t,o)=>g(`/fields/${e}/${t}/${encodeURIComponent(o)}`),getBundle:(e,t)=>s(`/bundle/${e}/${t}`),execute:(e,t,o,r)=>n(`/execute/${e}/${t}/${encodeURIComponent(o)}`,r),gotoCarSite:(e,t)=>n(`/car/${e}/goto-site`,{siteId:t}),getScriptSource:e=>s(`/scripts/${e}/source`),getScriptExceptionStatus:e=>s(`/scripts/${e}/exception-status`),getMonitorConfig:()=>s("/monitor-config"),saveMonitorConfig:async e=>{const{data:t}=await l.post(`${d}/monitor-config`,e);if(!t?.success)throw new Error(t?.message??"saveMonitorConfig failed");return t.data},getSelection:()=>s("/selection"),setSelection:(e,t)=>n("/selection",{kind:e,id:t}),clearSelection:()=>n("/selection/clear"),getProjectFields:()=>s("/project/fields"),setProjectField:(e,t)=>n(`/project/fields/${encodeURIComponent(e)}`,{value:t}),saveProject:e=>n("/project/save",e?{path:e}:void 0),getAppConfigFields:()=>s("/app-config/fields"),setAppConfigField:(e,t)=>n(`/app-config/fields/${encodeURIComponent(e)}`,{value:t}),saveAppConfig:()=>n("/app-config/save"),getViewportStyle:()=>s("/viewport-style"),patchViewportStyle:e=>u("/viewport-style",b(e)),getCarStyleTypes:()=>s("/car-style/types"),getCarStyle:e=>s(`/car-style/${encodeURIComponent(e)}`),putCarStyle:async(e,t)=>{const{data:o}=await l.post(`${d}/car-style/${encodeURIComponent(e)}`,t);if(!o?.success)throw new Error(o?.message??"putCarStyle failed");return o.data},deleteCarStyle:e=>g(`/car-style/${encodeURIComponent(e)}`),getAlarmColors:()=>s("/car-style/alarm-colors"),putAlarmColors:async e=>{const{data:t}=await l.post(`${d}/car-style/alarm-colors`,e);if(!t?.success)throw new Error(t?.message??"putAlarmColors failed");return t.data},saveCarStyle:()=>n("/car-style/save")};function i(e){return Number.isFinite(e)?e>>>0:0}function C(e){const t=i(e),o=t>>>24&255,r=t>>>16&255,c=t>>>8&255,a=t&255;return o>=255?`#${r.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`:`#${o.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function w(e){const t=e.replace("#","").trim();if(t.length===6){const o=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),c=parseInt(t.slice(4,6),16);return i(255<<24|o<<16|r<<8|c)}if(t.length===8){const o=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),c=parseInt(t.slice(4,6),16),a=parseInt(t.slice(6,8),16);return i(o<<24|r<<16|c<<8|a)}return 4294967295}const $=["colorNormalArgb","colorSelectedArgb","labelColorNormalArgb","labelColorSelectedArgb"],m=["colorNormalArgb","colorSelectedArgb"];function b(e){const t={};if(e.site){const o={...e.site};for(const r of $)o[r]!=null&&(o[r]=i(o[r]));t.site=o}if(e.track){const o={...e.track};for(const r of m)o[r]!=null&&(o[r]=i(o[r]));t.track=o}return t}function I(e){return{site:{...e.site,colorNormalArgb:i(e.site.colorNormalArgb),colorSelectedArgb:i(e.site.colorSelectedArgb),labelColorNormalArgb:i(e.site.labelColorNormalArgb),labelColorSelectedArgb:i(e.site.labelColorSelectedArgb)},track:{...e.track,colorNormalArgb:i(e.track.colorNormalArgb),colorSelectedArgb:i(e.track.colorSelectedArgb)}}}export{C as a,f as b,y as e,w as h,I as n,A as r}; +import{aU as l}from"./index-Dg4NaXsE.js";const d="/sl/projection/reflection";function p(){return{fields:[],status:[],methods:[]}}function f(){return{car:p(),site:p(),track:p()}}const y=f;async function s(e){const{data:t}=await l.get(`${d}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function n(e,t){const{data:o}=await l.post(`${d}${e}`,null,{params:t});if(!o?.success)throw new Error(o?.message??`reflection ${e} failed`);return o.data}async function g(e){const{data:t}=await l.delete(`${d}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function u(e,t){const{data:o}=await l.patch(`${d}${e}`,t);if(!o?.success)throw new Error(o?.message??`reflection PATCH ${e} failed`);return o.data}const A={listKinds:()=>s("/kinds"),listAssemblies:()=>s("/assemblies"),listObjects:e=>s(`/objects/${e}`),listCreatableTypes:e=>s(`/types/${e}`),createObject:(e,t,o)=>{const r={};if(t&&(r.typeName=t),o)for(const[c,a]of Object.entries(o))a==null||a===""||(r[c]=a);return n(`/objects/${e}`,r)},deleteObject:(e,t)=>g(`/objects/${e}/${t}`),reloadPlugins:()=>n("/plugins/reload"),listPlugins:()=>s("/plugins"),unloadPlugin:e=>n(`/plugins/${encodeURIComponent(e)}/unload`),listMethods:(e,t)=>s(`/methods/${e}/${t}`),listMethodsByType:e=>s(`/methods-by-type/${e}`),getStatus:(e,t)=>s(`/status/${e}/${t}`),getFields:(e,t)=>s(`/fields/${e}/${t}`),setField:(e,t,o,r)=>n(`/fields/${e}/${t}/${encodeURIComponent(o)}`,{value:r}),deleteField:(e,t,o)=>g(`/fields/${e}/${t}/${encodeURIComponent(o)}`),getBundle:(e,t)=>s(`/bundle/${e}/${t}`),execute:(e,t,o,r)=>n(`/execute/${e}/${t}/${encodeURIComponent(o)}`,r),gotoCarSite:(e,t)=>n(`/car/${e}/goto-site`,{siteId:t}),getScriptSource:e=>s(`/scripts/${e}/source`),getScriptExceptionStatus:e=>s(`/scripts/${e}/exception-status`),getMonitorConfig:()=>s("/monitor-config"),saveMonitorConfig:async e=>{const{data:t}=await l.post(`${d}/monitor-config`,e);if(!t?.success)throw new Error(t?.message??"saveMonitorConfig failed");return t.data},getSelection:()=>s("/selection"),setSelection:(e,t)=>n("/selection",{kind:e,id:t}),clearSelection:()=>n("/selection/clear"),getProjectFields:()=>s("/project/fields"),setProjectField:(e,t)=>n(`/project/fields/${encodeURIComponent(e)}`,{value:t}),saveProject:e=>n("/project/save",e?{path:e}:void 0),getAppConfigFields:()=>s("/app-config/fields"),setAppConfigField:(e,t)=>n(`/app-config/fields/${encodeURIComponent(e)}`,{value:t}),saveAppConfig:()=>n("/app-config/save"),getViewportStyle:()=>s("/viewport-style"),patchViewportStyle:e=>u("/viewport-style",b(e)),getCarStyleTypes:()=>s("/car-style/types"),getCarStyle:e=>s(`/car-style/${encodeURIComponent(e)}`),putCarStyle:async(e,t)=>{const{data:o}=await l.post(`${d}/car-style/${encodeURIComponent(e)}`,t);if(!o?.success)throw new Error(o?.message??"putCarStyle failed");return o.data},deleteCarStyle:e=>g(`/car-style/${encodeURIComponent(e)}`),getAlarmColors:()=>s("/car-style/alarm-colors"),putAlarmColors:async e=>{const{data:t}=await l.post(`${d}/car-style/alarm-colors`,e);if(!t?.success)throw new Error(t?.message??"putAlarmColors failed");return t.data},saveCarStyle:()=>n("/car-style/save")};function i(e){return Number.isFinite(e)?e>>>0:0}function C(e){const t=i(e),o=t>>>24&255,r=t>>>16&255,c=t>>>8&255,a=t&255;return o>=255?`#${r.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`:`#${o.toString(16).padStart(2,"0")}${r.toString(16).padStart(2,"0")}${c.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function w(e){const t=e.replace("#","").trim();if(t.length===6){const o=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),c=parseInt(t.slice(4,6),16);return i(255<<24|o<<16|r<<8|c)}if(t.length===8){const o=parseInt(t.slice(0,2),16),r=parseInt(t.slice(2,4),16),c=parseInt(t.slice(4,6),16),a=parseInt(t.slice(6,8),16);return i(o<<24|r<<16|c<<8|a)}return 4294967295}const $=["colorNormalArgb","colorSelectedArgb","labelColorNormalArgb","labelColorSelectedArgb"],m=["colorNormalArgb","colorSelectedArgb"];function b(e){const t={};if(e.site){const o={...e.site};for(const r of $)o[r]!=null&&(o[r]=i(o[r]));t.site=o}if(e.track){const o={...e.track};for(const r of m)o[r]!=null&&(o[r]=i(o[r]));t.track=o}return t}function I(e){return{site:{...e.site,colorNormalArgb:i(e.site.colorNormalArgb),colorSelectedArgb:i(e.site.colorSelectedArgb),labelColorNormalArgb:i(e.site.labelColorNormalArgb),labelColorSelectedArgb:i(e.site.labelColorSelectedArgb)},track:{...e.track,colorNormalArgb:i(e.track.colorNormalArgb),colorSelectedArgb:i(e.track.colorSelectedArgb)}}}export{C as a,f as b,y as e,w as h,I as n,A as r}; diff --git a/MiGu.Server/wwwroot/assets/useMapEditStream-CoKaGT-a.js b/MiGu.Server/wwwroot/assets/useMapEditStream-BgR6WvRg.js similarity index 83% rename from MiGu.Server/wwwroot/assets/useMapEditStream-CoKaGT-a.js rename to MiGu.Server/wwwroot/assets/useMapEditStream-BgR6WvRg.js index 7cb0c7f..2db06f2 100644 --- a/MiGu.Server/wwwroot/assets/useMapEditStream-CoKaGT-a.js +++ b/MiGu.Server/wwwroot/assets/useMapEditStream-BgR6WvRg.js @@ -1 +1 @@ -import{u as n}from"./useProjectionStream-C94Y5UgX.js";import{b7 as r,b6 as s}from"./index-368apsQG.js";function u(e){const c=n({autoConnect:!1});function o(a){const t=a?.payload;if(t)switch(a.kind){case"alarm":e.onAlarm?.(t);break;case"object-created":e.onObjectCreated?.(t);break;case"object-deleted":e.onObjectDeleted?.(t);break;case"object-patched":e.onObjectPatched?.(t);break;case"object-batch-changed":e.onObjectBatchChanged?.(t);break;case"pick-result":e.onPickResult?.(t);break;case"selection-detail":e.onSelectionDetail?.(t);break;case"workspace-shortcut":e.onWorkspaceShortcut?.(t);break;case"viewport-style-updated":e.onViewportStyleUpdated?.();break}}return r(()=>{c.on(o),c.connect()}),s(()=>{c.off(o),c.disconnect()}),{connected:c.connected}}export{u}; +import{u as n}from"./useProjectionStream-BBHmpNXC.js";import{b7 as r,b6 as s}from"./index-Dg4NaXsE.js";function u(e){const c=n({autoConnect:!1});function o(a){const t=a?.payload;if(t)switch(a.kind){case"alarm":e.onAlarm?.(t);break;case"object-created":e.onObjectCreated?.(t);break;case"object-deleted":e.onObjectDeleted?.(t);break;case"object-patched":e.onObjectPatched?.(t);break;case"object-batch-changed":e.onObjectBatchChanged?.(t);break;case"pick-result":e.onPickResult?.(t);break;case"selection-detail":e.onSelectionDetail?.(t);break;case"workspace-shortcut":e.onWorkspaceShortcut?.(t);break;case"viewport-style-updated":e.onViewportStyleUpdated?.();break}}return r(()=>{c.on(o),c.connect()}),s(()=>{c.off(o),c.disconnect()}),{connected:c.connected}}export{u}; diff --git a/MiGu.Server/wwwroot/assets/useProjectionStream-C94Y5UgX.js b/MiGu.Server/wwwroot/assets/useProjectionStream-BBHmpNXC.js similarity index 94% rename from MiGu.Server/wwwroot/assets/useProjectionStream-C94Y5UgX.js rename to MiGu.Server/wwwroot/assets/useProjectionStream-BBHmpNXC.js index f20b6a1..d558b57 100644 --- a/MiGu.Server/wwwroot/assets/useProjectionStream-C94Y5UgX.js +++ b/MiGu.Server/wwwroot/assets/useProjectionStream-BBHmpNXC.js @@ -1 +1 @@ -import{b8 as S,bh as v}from"./index-368apsQG.js";const g=["snapshot-tick","selection-detail","alarm","object-created","object-deleted","object-patched","object-batch-changed","pick-result","project-saved","project-loaded","car-state","mission-status","monitor-config-updated","workspace-shortcut","viewport-style-updated"];function w(a={}){const y=a.url??"/api/sl/projection/stream",j=a.reconnectDelayMs??3e3,r=v(!1),u=v(null),s=new Set;let e=null,c=null,l=!1;function i(){if(l||e)return;try{e=new EventSource(y)}catch{p();return}e.onopen=()=>{r.value=!0},e.onerror=()=>{r.value=!1,f(),p()},e.onmessage=t=>{d(void 0,t.data)};const n=new Set([...g,...a.extraEventKinds??[]]);for(const t of n)e.addEventListener(t,o=>{d(t,o.data)})}function d(n,t){if(!(typeof t!="string"||!t))try{const o=JSON.parse(t),m=typeof o=="object"&&o!==null&&"kind"in o?o:{kind:n??"message",payload:o};u.value=m,s.forEach(k=>{try{k(m)}catch{}})}catch{}}function f(){if(e){try{e.close()}catch{}e=null}}function p(){l||c||(c=setTimeout(()=>{c=null,i()},j))}function h(){l=!0,c&&(clearTimeout(c),c=null),f(),r.value=!1}function b(n){s.add(n)}function E(n){s.delete(n)}return a.autoConnect!==!1&&i(),S(()=>{h(),s.clear()}),{connected:r,lastEvent:u,connect:i,disconnect:h,on:b,off:E}}export{w as u}; +import{b8 as S,bh as v}from"./index-Dg4NaXsE.js";const g=["snapshot-tick","selection-detail","alarm","object-created","object-deleted","object-patched","object-batch-changed","pick-result","project-saved","project-loaded","car-state","mission-status","monitor-config-updated","workspace-shortcut","viewport-style-updated"];function w(a={}){const y=a.url??"/api/sl/projection/stream",j=a.reconnectDelayMs??3e3,r=v(!1),u=v(null),s=new Set;let e=null,c=null,l=!1;function i(){if(l||e)return;try{e=new EventSource(y)}catch{p();return}e.onopen=()=>{r.value=!0},e.onerror=()=>{r.value=!1,f(),p()},e.onmessage=t=>{d(void 0,t.data)};const n=new Set([...g,...a.extraEventKinds??[]]);for(const t of n)e.addEventListener(t,o=>{d(t,o.data)})}function d(n,t){if(!(typeof t!="string"||!t))try{const o=JSON.parse(t),m=typeof o=="object"&&o!==null&&"kind"in o?o:{kind:n??"message",payload:o};u.value=m,s.forEach(k=>{try{k(m)}catch{}})}catch{}}function f(){if(e){try{e.close()}catch{}e=null}}function p(){l||c||(c=setTimeout(()=>{c=null,i()},j))}function h(){l=!0,c&&(clearTimeout(c),c=null),f(),r.value=!1}function b(n){s.add(n)}function E(n){s.delete(n)}return a.autoConnect!==!1&&i(),S(()=>{h(),s.clear()}),{connected:r,lastEvent:u,connect:i,disconnect:h,on:b,off:E}}export{w as u}; diff --git a/MiGu.Server/wwwroot/index.html b/MiGu.Server/wwwroot/index.html index 4ac1ef4..9223522 100644 --- a/MiGu.Server/wwwroot/index.html +++ b/MiGu.Server/wwwroot/index.html @@ -6,7 +6,7 @@ 迷毂 · 智能调度平台 - + diff --git a/frontends/apps/simple-platform-vue/components.d.ts b/frontends/apps/simple-platform-vue/components.d.ts index 4d757ef..1892a7c 100644 --- a/frontends/apps/simple-platform-vue/components.d.ts +++ b/frontends/apps/simple-platform-vue/components.d.ts @@ -11,6 +11,7 @@ declare module 'vue' { AiGenerateDialog: typeof import('./src/components/map-editor/AiGenerateDialog.vue')['default'] ConfigPageBase: typeof import('./src/components/ConfigPageBase.vue')['default'] DataTablePro: typeof import('./src/components/DataTablePro.vue')['default'] + EdgeInspector: typeof import('./src/components/workflow/EdgeInspector.vue')['default'] EditPropertyPanel: typeof import('./src/components/map-editor/EditPropertyPanel.vue')['default'] EditStatusBar: typeof import('./src/components/map-editor/EditStatusBar.vue')['default'] EditToolRail: typeof import('./src/components/map-editor/EditToolRail.vue')['default'] @@ -81,6 +82,8 @@ declare module 'vue' { MapMonitorConfigGroup: typeof import('./src/components/config/MapMonitorConfigGroup.vue')['default'] MissionListPanel: typeof import('./src/components/workbench/MissionListPanel.vue')['default'] MonitorSelectionPanel: typeof import('./src/components/workbench/MonitorSelectionPanel.vue')['default'] + NodeInspector: typeof import('./src/components/workflow/NodeInspector.vue')['default'] + NodePalette: typeof import('./src/components/workflow/NodePalette.vue')['default'] PermissionGuard: typeof import('./src/components/PermissionGuard.vue')['default'] PluginListPanel: typeof import('./src/components/reflection/PluginListPanel.vue')['default'] ProjectBrowseDialog: typeof import('./src/components/map-editor/ProjectBrowseDialog.vue')['default'] @@ -96,6 +99,9 @@ declare module 'vue' { VehicleHealthCard: typeof import('./src/components/fleet/VehicleHealthCard.vue')['default'] VehicleMonitorPanel: typeof import('./src/components/workbench/VehicleMonitorPanel.vue')['default'] WorkbenchSidePanel: typeof import('./src/components/workbench/WorkbenchSidePanel.vue')['default'] + WorkflowEditor: typeof import('./src/components/workflow/WorkflowEditor.vue')['default'] + WorkflowListPanel: typeof import('./src/components/workflow/WorkflowListPanel.vue')['default'] + WorkflowNode: typeof import('./src/components/workflow/WorkflowNode.vue')['default'] Workspace3D: typeof import('./src/components/Workspace3D.vue')['default'] WorkspaceCanvasToolbar: typeof import('./src/components/workspace/WorkspaceCanvasToolbar.vue')['default'] }