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-9727d426"]]);export{Vt as default};