Files
Migu2.0/MiGu.Server/wwwroot/assets/ProjectPropertiesView-4-x-FH30.js
T
zhaowei.huangandCursor 7382e85598 feat(platform): 部署配置向导 + 地图管理,地图编辑器接入统一存取与 AI 助手
- 配置向导:登录按 deployment 画像引导平台选型(导航方式/模块/场景),未完成则路由守卫强制进入 /wizard;选型驱动菜单按需裁剪,并联动 SimpleLite 写 plugins/active-scenes.json + 透传 --scenes 选择性加载导航场景插件
- 地图管理页:服务器地图列表/使用/重命名/删除、地图合并、多地图连接管理
- 地图编辑器:项目存取改为存入地图管理统一目录(同名替换确认),支持 ?map=/?new= 进入,新增右侧可停靠 AI 助手面板
- 集成 PTL 拣选模块;新增车队分配面板(运维总览/筛选联动)
- SimpleLiteBuildSync 同步运行时依赖 DLL;重新构建前端静态资源

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 09:37:07 +08:00

3 lines
8.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{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})。
是否仍要把已成功应用的改动持久化到磁盘?`,"部分字段写入失败",{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};