feat(platform): 合并车辆运维页并优化 3D 画布嵌入体验
将维护策略与车队生命周期并入车辆运维 Tab,补充旧路由重定向与 RBAC 页面 key 迁移;改进 Workspace3D 就绪探测与 wwwroot 静态资源。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -45,14 +45,12 @@ public static class PageCatalog
|
||||
new("admin-config-system", "系统级配置", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-integrations", "外部系统对接", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-routing", "路径规划", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-vehicle", "车辆维护策略", "平台配置中心", ScopePlatform),
|
||||
new("admin-vehicle-hub", "车辆运维", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-charge", "充电策略", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-task", "任务分配", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-traffic", "交通管制", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-auth", "权限与角色", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-device", "设备接入", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-fleet", "车队生命周期", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-scenario", "场景模板", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-location", "库位管理", "平台配置中心", ScopePlatform),
|
||||
new("admin-config-ops", "运营维护", "平台配置中心", ScopePlatform),
|
||||
@@ -70,9 +68,21 @@ public static class PageCatalog
|
||||
private static readonly HashSet<string> _keys =
|
||||
All.Select(p => p.Key).ToHashSet(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
/// <summary>已下线页面 Key → 合并后的新 Key(角色数据迁移用)。</summary>
|
||||
private static readonly IReadOnlyDictionary<string, string> LegacyKeyAliases =
|
||||
new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["admin-config-vehicle"] = "admin-vehicle-hub",
|
||||
["admin-config-fleet"] = "admin-vehicle-hub",
|
||||
};
|
||||
|
||||
/// <summary>判断页面 Key 是否合法(用于角色保存时过滤掉脏数据 / 已下线页面)。</summary>
|
||||
public static bool IsValidKey(string key) => _keys.Contains(key);
|
||||
|
||||
/// <summary>将旧页面 Key 映射为当前有效 Key;未知 Key 原样返回。</summary>
|
||||
public static string NormalizeKey(string key) =>
|
||||
LegacyKeyAliases.TryGetValue(key, out var mapped) ? mapped : key;
|
||||
|
||||
/// <summary>列出某 scope 下的全部页面 Key(用于把角色的 "*" 通配展开成具体页面集合)。</summary>
|
||||
public static IReadOnlyList<string> KeysForScope(string scope) =>
|
||||
All.Where(p => string.Equals(p.Scope, scope, StringComparison.OrdinalIgnoreCase))
|
||||
|
||||
@@ -82,7 +82,11 @@ public sealed class RbacStore
|
||||
snap.Users ??= new();
|
||||
foreach (var r in snap.Roles)
|
||||
{
|
||||
r.Pages = (r.Pages ?? new()).Where(p => p == PageCatalog.Wildcard || PageCatalog.IsValidKey(p)).Distinct().ToList();
|
||||
r.Pages = (r.Pages ?? new())
|
||||
.Select(p => p == PageCatalog.Wildcard ? p : PageCatalog.NormalizeKey(p))
|
||||
.Where(p => p == PageCatalog.Wildcard || PageCatalog.IsValidKey(p))
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
r.Ops = (r.Ops ?? new()).Distinct().ToList();
|
||||
r.WidgetGrants ??= new();
|
||||
if (string.IsNullOrWhiteSpace(r.Scope)) r.Scope = PageCatalog.ScopePlatform;
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as S,bt as N,aA as f,bH as a,t as z,b7 as p,aF as e,N as A,bK as B,O,R as T,a3 as F,aC as M,ah as U,bh as D,Z as G,r as H,br as b,aE as d,H as I,a9 as L,aa as K,ac as R,bo as X,az as c,be as Z,bf as $,X as g}from"./index-D5OuyicD.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 j={style:{display:"flex","align-items":"center",gap:"8px"}},pe=S({__name:"AnnotationView",setup(q){const s=N(),l=Z({title:"",target:"",level:"info",content:""}),m=$([{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=R,_=T,i=O,V=G,y=F,E=H,h=A,x=I,n=K,k=L,C=z;return p(),f(C,{shadow:"never"},{header:a(()=>[c("div",j,[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]=B(()=>{},["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(),M(U,null,D(["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(X(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{aG as S,bt as N,aA as f,bH as a,t as z,b7 as p,aF as e,N as A,bK as B,O,R as T,a3 as F,aC as M,ah as U,bh as D,Z as G,r as H,br as b,aE as d,H as I,a9 as L,aa as K,ac as R,bo as X,az as c,be as Z,bf as $,X as g}from"./index-CC_hCGHZ.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 j={style:{display:"flex","align-items":"center",gap:"8px"}},pe=S({__name:"AnnotationView",setup(q){const s=N(),l=Z({title:"",target:"",level:"info",content:""}),m=$([{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=R,_=T,i=O,V=G,y=F,E=H,h=A,x=I,n=K,k=L,C=z;return p(),f(C,{shadow:"never"},{header:a(()=>[c("div",j,[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]=B(()=>{},["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(),M(U,null,D(["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(X(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};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aG as s,aA as c,bH as t,br as d,b7 as u,aF as e,N as f,O as b,a7 as h,S as C,a9 as g,aa as w,D as E}from"./index-D5OuyicD.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-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const K=s({__name:"ChargePolicyView",setup(x){return(A,T)=>{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{aG as s,aA as c,bH as t,br as d,b7 as u,aF as e,N as f,O as b,a7 as h,S as C,a9 as g,aa as w,D as E}from"./index-CC_hCGHZ.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-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const K=s({__name:"ChargePolicyView",setup(x){return(A,T)=>{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};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aG as _,aA as i,bH as e,br as d,b7 as s,aF as t,a9 as u,aa as f,az as n,bo as r,aC as b,ah as h,bh as g,ac as w,aE as C,l as E,aj as T}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as y}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const x={class:"js-mini"},B={class:"js-mini"},S=_({__name:"CustomWidgetView",setup(V){return(k,D)=>{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",x,r(o.row.schemaJson),1)]),_:1}),t(a,{label:"Layout",prop:"layoutJson"},{default:e(o=>[n("pre",B,r(o.row.layoutJson),1)]),_:1}),t(a,{label:"绑定 Scope"},{default:e(o=>[(s(!0),b(h,null,g(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(S,[["__scopeId","data-v-96b90481"]]);export{M as default};
|
||||
import{aG as _,aA as i,bH as e,br as d,b7 as s,aF as t,a9 as u,aa as f,az as n,bo as r,aC as b,ah as h,bh as g,ac as w,aE as C,l as E,aj as T}from"./index-CC_hCGHZ.js";/* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as y}from"./ConfigPageBase-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const x={class:"js-mini"},B={class:"js-mini"},S=_({__name:"CustomWidgetView",setup(V){return(k,D)=>{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",x,r(o.row.schemaJson),1)]),_:1}),t(a,{label:"Layout",prop:"layoutJson"},{default:e(o=>[n("pre",B,r(o.row.layoutJson),1)]),_:1}),t(a,{label:"绑定 Scope"},{default:e(o=>[(s(!0),b(h,null,g(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(S,[["__scopeId","data-v-96b90481"]]);export{M as default};
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import{aG as iL,bf as yr,b5 as oL,b0 as sL,b6 as lL,aC as Kt,az as $,b1 as mr,bo as Wt,aE as Da,ah as Ma,bh as La,aD as pm,aF as me,bH as fe,av as _e,t as uL,bv as fL,b7 as $t,b2 as Yh,aA as $h,bk as gm,Q as hL,br as Vl,bq as vL,bA as ym,aB as mm,b9 as cL,ab as dL,a8 as pL,ao as gL,T as yL,bm as mL,b8 as Xh,an as _L,bp as SL,bF as xL,aW as bL,ba as wL,X as TL,ay as AL,ax as CL,ap as DL,aV as ML,aj as LL}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as IL,c as PL,l as RL,a as EL}from"./projection-BVk2tEkj.js";import"./reflection-BmVSriDn.js";/*! *****************************************************************************
|
||||
import{aG as iL,bf as yr,b5 as oL,b0 as sL,b6 as lL,aC as Kt,az as $,b1 as mr,bo as Wt,aE as Da,ah as Ma,bh as La,aD as pm,aF as me,bH as fe,av as _e,t as uL,bv as fL,b7 as $t,b2 as Yh,aA as $h,bk as gm,Q as hL,br as Vl,bq as vL,bA as ym,aB as mm,b9 as cL,ab as dL,a8 as pL,ao as gL,T as yL,bm as mL,b8 as Xh,an as _L,bp as SL,bF as xL,aW as bL,ba as wL,X as TL,ay as AL,ax as CL,ap as DL,aV as ML,aj as LL}from"./index-CC_hCGHZ.js";/* empty css *//* empty css *//* empty css *//* empty css */import{b as IL,c as PL,l as RL,a as EL}from"./projection-D6ulMg5U.js";import"./reflection-CTDOoTn5.js";/*! *****************************************************************************
|
||||
Copyright (c) Microsoft Corporation.
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as b,aA as u,bH as a,br as f,b7 as h,aF as e,ab as w,a8 as v,a9 as E,aa as C,a7 as D,C as P,F as T,aE as i,bo as r,a as V}from"./index-D5OuyicD.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-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const W=b({__name:"DeviceHubView",setup(x){return(I,S)=>{const l=C,s=E,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{aG as b,aA as u,bH as a,br as f,b7 as h,aF as e,ab as w,a8 as v,a9 as E,aa as C,a7 as D,C as P,F as T,aE as i,bo as r,a as V}from"./index-CC_hCGHZ.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-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const W=b({__name:"DeviceHubView",setup(x){return(I,S)=>{const l=C,s=E,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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as U,aA as x,bH as a,br as c,b7 as b,aF as t,ab as h,aC as g,ah as T,bh as I,a8 as S,a9 as B,aa as $,R as v,a7 as D,r as N,aE as f,ba as R,bo as z,c as A}from"./index-D5OuyicD.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 F}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const le=U({__name:"ExternalIntegrationView",setup(L){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,d)=>d!==o)};s(i)}return(r,s)=>{const l=v,o=$,i=D,u=N,d=B,E=S,C=h;return b(),x(F,{section:"integrations",title:"外部系统对接",description:"MES / WMS / RCS 等标准接口配置(ExternalIntegrations)",defaults:c(A)},{default:a(({payload:p,update:_})=>[t(C,{"model-value":"mes"},{default:a(()=>[(b(),g(T,null,I(["mes","wms","rcs"],m=>t(E,{key:m,name:m,label:m.toUpperCase()},{default:a(()=>[t(d,{data:p[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(p,_,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(R),style:{"margin-top":"8px"},onClick:e=>w(p,_,m)},{default:a(()=>[f("新增 "+z(m.toUpperCase())+" 端点",1)]),_:2},1032,["icon","onClick"])]),_:2},1032,["name","label"])),64))]),_:2},1024)]),_:1},8,["defaults"])}}});export{le as default};
|
||||
import{aG as U,aA as x,bH as a,br as c,b7 as b,aF as t,ab as h,aC as g,ah as T,bh as I,a8 as S,a9 as B,aa as $,R as v,a7 as D,r as N,aE as f,ba as R,bo as z,c as A}from"./index-CC_hCGHZ.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 F}from"./ConfigPageBase-B4fOVsSK.js";/* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const le=U({__name:"ExternalIntegrationView",setup(L){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,d)=>d!==o)};s(i)}return(r,s)=>{const l=v,o=$,i=D,u=N,d=B,E=S,C=h;return b(),x(F,{section:"integrations",title:"外部系统对接",description:"MES / WMS / RCS 等标准接口配置(ExternalIntegrations)",defaults:c(A)},{default:a(({payload:p,update:_})=>[t(C,{"model-value":"mes"},{default:a(()=>[(b(),g(T,null,I(["mes","wms","rcs"],m=>t(E,{key:m,name:m,label:m.toUpperCase()},{default:a(()=>[t(d,{data:p[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(p,_,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(R),style:{"margin-top":"8px"},onClick:e=>w(p,_,m)},{default:a(()=>[f("新增 "+z(m.toUpperCase())+" 端点",1)]),_:2},1032,["icon","onClick"])]),_:2},1032,["name","label"])),64))]),_:2},1024)]),_:1},8,["defaults"])}}});export{le as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{aG as f,aA as c,bH as t,br as h,b7 as _,aF as e,ab as g,a8 as T,a9 as E,aa as w,aC as k,ah as C,bh as F,ac as D,aE as l,bo as o,C as x,F as L,b as B}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css */import{C as O}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const Z=f({__name:"FleetLifecycleView",setup(A){return(z,I)=>{const s=w,p=D,b=E,n=T,r=L,i=x,d=g;return _(),c(O,{section:"fleet",title:"车队全生命周期",description:"分区域/跨楼层/多车协作;OTA、批量操作、网络诊断(FleetLifecycleConfig)",defaults:h(B)},{default:t(({payload:a})=>[e(d,{"model-value":"groups"},{default:t(()=>[e(n,{name:"groups",label:"车队分组"},{default:t(()=>[e(b,{data:a.groups,size:"small",border:""},{default:t(()=>[e(s,{label:"ID",prop:"id",width:"100"}),e(s,{label:"名称",prop:"name",width:"140"}),e(s,{label:"楼层",prop:"floor",width:"80"}),e(s,{label:"区域",prop:"region",width:"80"}),e(s,{label:"车辆"},{default:t(u=>[(_(!0),k(C,null,F(u.row.carIds,m=>(_(),c(p,{key:m,size:"small",style:{margin:"2px"}},{default:t(()=>[l(o(m),1)]),_:2},1024))),128))]),_:1})]),_:1},8,["data"])]),_:2},1024),e(n,{name:"ota",label:"OTA 升级"},{default:t(()=>[e(i,{column:2,border:""},{default:t(()=>[e(r,{label:"启用"},{default:t(()=>[l(o(a.ota.enabled?"是":"否"),1)]),_:2},1024),e(r,{label:"批次大小"},{default:t(()=>[l(o(a.ota.batchSize),1)]),_:2},1024),e(r,{label:"失败回滚"},{default:t(()=>[l(o(a.ota.rollbackOnFail?"是":"否"),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),e(n,{name:"batch",label:"批量操作"},{default:t(()=>[e(i,{column:2,border:""},{default:t(()=>[e(r,{label:"需确认"},{default:t(()=>[l(o(a.batchOps.confirmationRequired?"是":"否"),1)]),_:2},1024),e(r,{label:"最大批量"},{default:t(()=>[l(o(a.batchOps.maxBatch),1)]),_:2},1024)]),_:2},1024)]),_:2},1024),e(n,{name:"diag",label:"网络诊断"},{default:t(()=>[e(i,{column:2,border:""},{default:t(()=>[e(r,{label:"RTT 阈值 (ms)"},{default:t(()=>[l(o(a.networkDiag.rttThresholdMs),1)]),_:2},1024),e(r,{label:"丢包阈值"},{default:t(()=>[l(o(a.networkDiag.packetLossThreshold),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1},8,["defaults"])}}});export{Z as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as s,aA as m,bH as t,br as c,b7 as d,aF as e,ab as _,a8 as b,a9 as u,aa as f,_ as w,d as h}from"./index-D5OuyicD.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-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const H=s({__name:"LocationView",setup(T){return(C,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:r})=>[e(n,{"model-value":"locs"},{default:t(()=>[e(l,{name:"locs",label:"库位"},{default:t(()=>[e(o,{data:r.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(p=>[e(i,{percentage:Math.round(p.row.occupied/p.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:r.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{H as default};
|
||||
import{aG as s,aA as m,bH as t,br as c,b7 as d,aF as e,ab as _,a8 as b,a9 as u,aa as f,_ as w,d as h}from"./index-CC_hCGHZ.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-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const H=s({__name:"LocationView",setup(T){return(C,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:r})=>[e(n,{"model-value":"locs"},{default:t(()=>[e(l,{name:"locs",label:"库位"},{default:t(()=>[e(o,{data:r.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(p=>[e(i,{percentage:Math.round(p.row.occupied/p.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:r.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{H as default};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{R as o}from"./ReflectionManagerPanel-Hhb-p5RK.js";import{aG as i,aC as t,aF as r,b7 as p,aj as e}from"./index-D5OuyicD.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-BmVSriDn.js";import"./useMapEditStream-DunazsxD.js";import"./useProjectionStream-DvMLcpMm.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 中选一个实例化。"})]))}}),q=e(s,[["__scopeId","data-v-40f885f1"]]);export{q as default};
|
||||
import{R as o}from"./ReflectionManagerPanel-CpDwI_uG.js";import{aG as i,aC as t,aF as r,b7 as p,aj as e}from"./index-CC_hCGHZ.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-CTDOoTn5.js";import"./useMapEditStream-BAGhVPpt.js";import"./useProjectionStream-C_klWvmm.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 中选一个实例化。"})]))}}),q=e(s,[["__scopeId","data-v-40f885f1"]]);export{q as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as k,b5 as z,aC as M,aF as t,bH as e,bf as p,a1 as T,b7 as V,w as B,a5 as D,az as d,bo as c,t as N,a9 as S,aa as I,ac as P,aE as h,_ as j,av as _,aj as A}from"./index-D5OuyicD.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 F,a as G}from"./projection-BVk2tEkj.js";import{l as H}from"./ops-DFVCciZx.js";import"./reflection-BmVSriDn.js";const R={class:"muted"},q=k({__name:"MonitorDashboardView",setup(J){const n=p([]),m=p([]),i=p([]),b=_(()=>n.value.filter(l=>l.state!=="offline").length),C=_(()=>m.value.filter(l=>l.status==="running").length),E=_(()=>n.value.filter(l=>l.state==="fault").length);function x(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 z(async()=>{[n.value,m.value,i.value]=await Promise.all([F(),G(),H()])}),(l,r)=>{const u=D,o=B,f=T,a=I,g=P,y=j,v=S,w=N;return V(),M("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:C.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"故障车辆",value:E.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(v,{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:x(s.row.state)},{default:e(()=>[h(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(v,{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(()=>[h(c(s.row.result),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])]),_:1})]),_:1})]),_:1})])}}}),ot=A(q,[["__scopeId","data-v-53088435"]]);export{ot as default};
|
||||
import{aG as k,b5 as z,aC as M,aF as t,bH as e,bf as p,a1 as T,b7 as V,w as B,a5 as D,az as d,bo as c,t as N,a9 as S,aa as I,ac as P,aE as h,_ as j,av as _,aj as A}from"./index-CC_hCGHZ.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 F,a as G}from"./projection-D6ulMg5U.js";import{l as H}from"./ops-DQIK15vn.js";import"./reflection-CTDOoTn5.js";const R={class:"muted"},q=k({__name:"MonitorDashboardView",setup(J){const n=p([]),m=p([]),i=p([]),b=_(()=>n.value.filter(l=>l.state!=="offline").length),C=_(()=>m.value.filter(l=>l.status==="running").length),E=_(()=>n.value.filter(l=>l.state==="fault").length);function x(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 z(async()=>{[n.value,m.value,i.value]=await Promise.all([F(),G(),H()])}),(l,r)=>{const u=D,o=B,f=T,a=I,g=P,y=j,v=S,w=N;return V(),M("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:C.value},null,8,["value"])]),_:1}),t(o,{span:6},{default:e(()=>[t(u,{title:"故障车辆",value:E.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(v,{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:x(s.row.state)},{default:e(()=>[h(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(v,{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(()=>[h(c(s.row.result),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])]),_:1})]),_:1})]),_:1})])}}}),ot=A(q,[["__scopeId","data-v-53088435"]]);export{ot as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import o from"./MapMonitorView-BSY4Dsk8.js";import{aG as r,aA as t,b7 as p}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./Workspace3D-PfDes8bN.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-BmVSriDn.js";import"./mapEdit-Di5ggA7K.js";import"./ops-BCeFEEjY.js";import"./ops-DFVCciZx.js";import"./monitorConfigCache-deAxNrzx.js";/* empty css *//* empty css *//* empty css */import"./projection-BVk2tEkj.js";import"./useProjectionStream-DvMLcpMm.js";const H=r({__name:"MonitorMapView",setup(i){return(m,e)=>(p(),t(o,{"read-only":""}))}});export{H as default};
|
||||
import o from"./MapMonitorView-oh-hd20C.js";import{aG as r,aA as t,b7 as p}from"./index-CC_hCGHZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./Workspace3D-CE3B9LLc.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-CTDOoTn5.js";import"./mapEdit-Z_uHqZwy.js";import"./ops-BCeFEEjY.js";import"./ops-DQIK15vn.js";import"./monitorConfigCache-B5CZXjjB.js";/* empty css *//* empty css *//* empty css */import"./projection-D6ulMg5U.js";import"./useProjectionStream-C_klWvmm.js";const H=r({__name:"MonitorMapView",setup(i){return(m,e)=>(p(),t(o,{"read-only":""}))}});export{H as default};
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
import{aG as O,bt as T,b5 as V,aA as m,bH as a,bf as B,b7 as d,aF as o,t as S,a9 as A,br as _,aa as M,az as p,bo as r,ac as P,aE as i,R as $,r as D,ad as N,aC as F,ah as G,bh as H,ae as L,be as R,av as U,X as f,Y as W}from"./index-D5OuyicD.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 X}from"./PermissionGuard-DhAzkl-X.js";import{O as g}from"./ops-BCeFEEjY.js";import{l as C,e as Y}from"./ops-DFVCciZx.js";/* empty css */const j={style:{display:"flex","align-items":"center",gap:"8px"}},me=O({__name:"OpsActionPanelView",setup(q){const w=T(),u=R({}),c=B([]),E=U(()=>g.filter(n=>w.hasOp(n.code)));async function h(n){const e=u[n.code];if(!e&&n.target!=="note"){f.warning("请填写目标 ID");return}if(n.needConfirm)try{await W.confirm(`确认执行 [${n.label}]?
|
||||
import{aG as O,bt as T,b5 as V,aA as m,bH as a,bf as B,b7 as d,aF as o,t as S,a9 as A,br as _,aa as M,az as p,bo as r,ac as P,aE as i,R as $,r as D,ad as N,aC as F,ah as G,bh as H,ae as L,be as R,av as U,X as f,Y as W}from"./index-CC_hCGHZ.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 X}from"./PermissionGuard-DxbOGfWF.js";import{O as g}from"./ops-BCeFEEjY.js";import{l as C,e as Y}from"./ops-DQIK15vn.js";/* empty css */const j={style:{display:"flex","align-items":"center",gap:"8px"}},me=O({__name:"OpsActionPanelView",setup(q){const w=T(),u=R({}),c=B([]),E=U(()=>g.filter(n=>w.hasOp(n.code)));async function h(n){const e=u[n.code];if(!e&&n.target!=="note"){f.warning("请填写目标 ID");return}if(n.needConfirm)try{await W.confirm(`确认执行 [${n.label}]?
|
||||
目标:${e}`,"二次确认",{type:"warning"})}catch{return}try{const l=await Y({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 V(async()=>{c.value=await C()}),(n,e)=>{const l=P,s=M,x=$,k=D,v=A,b=S,I=L,z=N;return d(),m(X,{"widget-id":"OpsActionPanel"},{default:a(()=>[o(b,{shadow:"never"},{header:a(()=>[p("div",j,[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(x,{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=>h(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(z,null,{default:a(()=>[(d(!0),F(G,null,H(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};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aG as p,bt as c,bi as i,aC as u,az as s,aA as m,L as g,bH as v,av as y,b7 as d,bo as _,aj as f}from"./index-D5OuyicD.js";/* empty css *//* empty css */const k=["title"],b={class:"pg-hidden-hint"},h=p({__name:"PermissionGuard",props:{widgetId:{}},setup(e){const n=e,l=c(),a=y(()=>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,k)):(d(),m(r,{key:2,class:"pg-hidden"},{description:v(()=>[t[1]||(t[1]=s("p",{class:"pg-hidden-title"},"当前账号无权查看此功能",-1)),s("p",b,"控件:"+_(e.widgetId)+"。若应为管理员可见,请尝试顶部切换「管理员/运营」或刷新页面。",1)]),_:1}))}}}),C=f(h,[["__scopeId","data-v-4766a149"]]);export{C as P};
|
||||
import{aG as p,bt as c,bi as i,aC as u,az as s,aA as m,L as g,bH as v,av as y,b7 as d,bo as _,aj as f}from"./index-CC_hCGHZ.js";/* empty css *//* empty css */const k=["title"],b={class:"pg-hidden-hint"},h=p({__name:"PermissionGuard",props:{widgetId:{}},setup(e){const n=e,l=c(),a=y(()=>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,k)):(d(),m(r,{key:2,class:"pg-hidden"},{description:v(()=>[t[1]||(t[1]=s("p",{class:"pg-hidden-title"},"当前账号无权查看此功能",-1)),s("p",b,"控件:"+_(e.widgetId)+"。若应为管理员可见,请尝试顶部切换「管理员/运营」或刷新页面。",1)]),_:1}))}}}),C=f(h,[["__scopeId","data-v-4766a149"]]);export{C as P};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as c,aA as y,bH as a,t as w,b7 as E,aF as e,a1 as V,w as k,R as B,B as g,r as x,aE as n,br as z,bD as N,H as P,a9 as v,aa as D,az as A,bo as C,be as S,bf as K}from"./index-D5OuyicD.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 T=30,X=c({__name:"PlaybackView",setup(G){const r=S({kw:"",range:null}),i=K([{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(H,t)=>{const d=B,s=k,m=g,o=x,u=V,_=P,l=D,b=v,f=w;return E(),y(f,{shadow:"never"},{header:a(()=>[A("span",null,"调度回放(PlaybackPolicy.retentionDays="+C(T)+" 天)")]),default:a(()=>[e(u,{gutter:12},{default:a(()=>[e(s,{span:6},{default:a(()=>[e(d,{modelValue:r.kw,"onUpdate:modelValue":t[0]||(t[0]=p=>r.kw=p),placeholder:"按任务 / 车辆检索",clearable:""},null,8,["modelValue"])]),_:1}),e(s,{span:8},{default:a(()=>[e(m,{modelValue:r.range,"onUpdate:modelValue":t[1]||(t[1]=p=>r.range=p),type:"datetimerange","range-separator":"→","start-placeholder":"开始","end-placeholder":"结束",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),e(s,{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:z(N),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{aG as c,aA as y,bH as a,t as w,b7 as E,aF as e,a1 as V,w as k,R as B,B as g,r as x,aE as n,br as z,bD as N,H as P,a9 as v,aa as D,az as A,bo as C,be as S,bf as K}from"./index-CC_hCGHZ.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 T=30,X=c({__name:"PlaybackView",setup(G){const r=S({kw:"",range:null}),i=K([{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(H,t)=>{const d=B,s=k,m=g,o=x,u=V,_=P,l=D,b=v,f=w;return E(),y(f,{shadow:"never"},{header:a(()=>[A("span",null,"调度回放(PlaybackPolicy.retentionDays="+C(T)+" 天)")]),default:a(()=>[e(u,{gutter:12},{default:a(()=>[e(s,{span:6},{default:a(()=>[e(d,{modelValue:r.kw,"onUpdate:modelValue":t[0]||(t[0]=p=>r.kw=p),placeholder:"按任务 / 车辆检索",clearable:""},null,8,["modelValue"])]),_:1}),e(s,{span:8},{default:a(()=>[e(m,{modelValue:r.range,"onUpdate:modelValue":t[1]||(t[1]=p=>r.range=p),type:"datetimerange","range-separator":"→","start-placeholder":"开始","end-placeholder":"结束",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),e(s,{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:z(N),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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{R as o}from"./ReflectionManagerPanel-Hhb-p5RK.js";import{aG as t,aC as r,aF as e,b7 as i,aj as p}from"./index-D5OuyicD.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-BmVSriDn.js";import"./useMapEditStream-DunazsxD.js";import"./useProjectionStream-DvMLcpMm.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 实例化一个。"})]))}}),q=p(s,[["__scopeId","data-v-6a85813e"]]);export{q as default};
|
||||
import{R as o}from"./ReflectionManagerPanel-CpDwI_uG.js";import{aG as t,aC as r,aF as e,b7 as i,aj as p}from"./index-CC_hCGHZ.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-CTDOoTn5.js";import"./useMapEditStream-BAGhVPpt.js";import"./useProjectionStream-C_klWvmm.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 实例化一个。"})]))}}),q=p(s,[["__scopeId","data-v-6a85813e"]]);export{q as default};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aG as f,aA as w,bH as t,br as h,b7 as g,aF as e,N as v,O as E,a3 as I,Z as k,a9 as x,aa as z,S as U,f as V}from"./index-D5OuyicD.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}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.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=U,n=x,c=v;return g(),w(C,{section:"routing",title:"路径规划策略",description:"算法选择、权重、避障规则、区域限速(RoutingPolicy)",defaults:h(V)},{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{aG as f,aA as w,bH as t,br as h,b7 as g,aF as e,N as v,O as E,a3 as I,Z as k,a9 as x,aa as z,S as U,f as V}from"./index-CC_hCGHZ.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}from"./ConfigPageBase-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.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=U,n=x,c=v;return g(),w(C,{section:"routing",title:"路径规划策略",description:"算法选择、权重、避障规则、区域限速(RoutingPolicy)",defaults:h(V)},{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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as b,aA as _,bH as e,br as C,b7 as i,aF as t,a1 as h,aC as E,ah as g,bh as v,w,t as S,az as r,bo as a,ac as k,aE as o,H as D,C as P,F as V,g as T,aj as x}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as B}from"./ConfigPageBase-DYlmkUIy.js";/* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const F={class:"tpl-title"},L={class:"tpl-meta"},N={class:"tpl-baseline"},z=b({__name:"ScenarioTemplateView",setup(A){return(I,R)=>{const c=k,d=S,m=w,p=h,f=D,l=V,u=P;return i(),_(B,{section:"scenario",title:"业务场景模板化",description:"SPS / Pack / 环线 / 点对点;DSL/低代码扩展(ScenarioTemplateConfig)",defaults:C(T)},{default:e(({payload:s})=>[t(p,{gutter:12},{default:e(()=>[(i(!0),E(g,null,v(s.templates,n=>(i(),_(m,{key:n.id,span:6},{default:e(()=>[t(d,{shadow:"hover",class:"tpl-card"},{default:e(()=>[r("div",F,a(n.name),1),r("div",L,[t(c,{size:"small"},{default:e(()=>[o(a(n.category),1)]),_:2},1024),t(c,{size:"small",type:"info"},{default:e(()=>[o("v"+a(n.version),1)]),_:2},1024)]),r("pre",N,a(n.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=x(z,[["__scopeId","data-v-4faf66a8"]]);export{Y as default};
|
||||
import{aG as b,aA as _,bH as e,br as C,b7 as i,aF as t,a1 as h,aC as E,ah as g,bh as v,w,t as S,az as r,bo as a,ac as k,aE as o,H as D,C as P,F as V,g as T,aj as x}from"./index-CC_hCGHZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as B}from"./ConfigPageBase-B4fOVsSK.js";/* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const F={class:"tpl-title"},L={class:"tpl-meta"},N={class:"tpl-baseline"},z=b({__name:"ScenarioTemplateView",setup(A){return(I,R)=>{const c=k,d=S,m=w,p=h,f=D,l=V,u=P;return i(),_(B,{section:"scenario",title:"业务场景模板化",description:"SPS / Pack / 环线 / 点对点;DSL/低代码扩展(ScenarioTemplateConfig)",defaults:C(T)},{default:e(({payload:s})=>[t(p,{gutter:12},{default:e(()=>[(i(!0),E(g,null,v(s.templates,n=>(i(),_(m,{key:n.id,span:6},{default:e(()=>[t(d,{shadow:"hover",class:"tpl-card"},{default:e(()=>[r("div",F,a(n.name),1),r("div",L,[t(c,{size:"small"},{default:e(()=>[o(a(n.category),1)]),_:2},1024),t(c,{size:"small",type:"info"},{default:e(()=>[o("v"+a(n.version),1)]),_:2},1024)]),r("pre",N,a(n.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=x(z,[["__scopeId","data-v-4faf66a8"]]);export{Y as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{R as t}from"./ReflectionManagerPanel-Hhb-p5RK.js";import{aG as r,aC as o,aF as i,b7 as e,aj as a}from"./index-D5OuyicD.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-BmVSriDn.js";import"./useMapEditStream-DunazsxD.js";import"./useProjectionStream-DvMLcpMm.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":""})]))}}),N=a(p,[["__scopeId","data-v-40d1e5dd"]]);export{N as default};
|
||||
import{R as t}from"./ReflectionManagerPanel-CpDwI_uG.js";import{aG as r,aC as o,aF as i,b7 as e,aj as a}from"./index-CC_hCGHZ.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-CTDOoTn5.js";import"./useMapEditStream-BAGhVPpt.js";import"./useProjectionStream-C_klWvmm.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":""})]))}}),N=a(p,[["__scopeId","data-v-40d1e5dd"]]);export{N as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as w,b5 as E,b6 as k,aC as y,aF as s,bH as e,t as C,bf as V,bv as x,b7 as z,C as D,F as I,aE as a,bo as f,br as M,ac as W,az as m,r as B,aj as N}from"./index-D5OuyicD.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=x(),_=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}`}E(()=>{u(),r=window.setInterval(u,1e3)}),k(()=>{r&&clearInterval(r)});function v(){b.back()}return(p,t)=>{const o=W,l=I,d=D,n=B,g=C;return z(),y("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(M(_)),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})])}}}),P=N(R,[["__scopeId","data-v-ddc086d3"]]);export{P as default};
|
||||
import{aG as w,b5 as E,b6 as k,aC as y,aF as s,bH as e,t as C,bf as V,bv as x,b7 as z,C as D,F as I,aE as a,bo as f,br as M,ac as W,az as m,r as B,aj as N}from"./index-CC_hCGHZ.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=x(),_=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}`}E(()=>{u(),r=window.setInterval(u,1e3)}),k(()=>{r&&clearInterval(r)});function v(){b.back()}return(p,t)=>{const o=W,l=I,d=D,n=B,g=C;return z(),y("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(M(_)),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})])}}}),P=N(R,[["__scopeId","data-v-ddc086d3"]]);export{P as default};
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aG as p,aA as f,bH as o,br as c,b7 as b,aF as e,N as v,O as V,a0 as x,$ as E,aE as n,a7 as B,S as U,i as C}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as k}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const j=p({__name:"TaskAllocationView",setup(w){return(A,t)=>{const m=E,d=x,u=V,i=B,s=U,_=v;return b(),f(k,{section:"task",title:"任务分配机制",description:"负载均衡、就近分配、优先级调度(TaskAllocationPolicy)",defaults:c(C)},{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{aG as p,aA as f,bH as o,br as c,b7 as b,aF as e,N as v,O as V,a0 as x,$ as E,aE as n,a7 as B,S as U,i as C}from"./index-CC_hCGHZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{C as k}from"./ConfigPageBase-B4fOVsSK.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const j=p({__name:"TaskAllocationView",setup(w){return(A,t)=>{const m=E,d=x,u=V,i=B,s=U,_=v;return b(),f(k,{section:"task",title:"任务分配机制",description:"负载均衡、就近分配、优先级调度(TaskAllocationPolicy)",defaults:c(C)},{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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as m,b7 as _,aC as k,aF as e,bH as a,a8 as x,ab as g,bf as l,aj as T,aA as v}from"./index-D5OuyicD.js";/* empty css *//* empty css */import{R as s}from"./ReflectionManagerPanel-Hhb-p5RK.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-BmVSriDn.js";import"./useMapEditStream-DunazsxD.js";import"./useProjectionStream-DvMLcpMm.js";const y={class:"scene-mgr-page"},P=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 _(),k("div",y,[e(d,{modelValue:r.value,"onUpdate:modelValue":n[0]||(n[0]=b=>r.value=b),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"])])}}}),R=T(P,[["__scopeId","data-v-ce41515a"]]),Y=m({__name:"TrackTableView",setup(f){return(r,o)=>(_(),v(R))}});export{Y as default};
|
||||
import{aG as m,b7 as _,aC as k,aF as e,bH as a,a8 as x,ab as g,bf as l,aj as T,aA as v}from"./index-CC_hCGHZ.js";/* empty css *//* empty css */import{R as s}from"./ReflectionManagerPanel-CpDwI_uG.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-CTDOoTn5.js";import"./useMapEditStream-BAGhVPpt.js";import"./useProjectionStream-C_klWvmm.js";const y={class:"scene-mgr-page"},P=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 _(),k("div",y,[e(d,{modelValue:r.value,"onUpdate:modelValue":n[0]||(n[0]=b=>r.value=b),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"])])}}}),R=T(P,[["__scopeId","data-v-ce41515a"]]),Y=m({__name:"TrackTableView",setup(f){return(r,o)=>(_(),v(R))}});export{Y as default};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aG as m,aA as d,bH as e,br as _,b7 as c,aF as a,ab as f,a8 as b,a9 as u,aa as w,aE as s,bo as p,j as I}from"./index-D5OuyicD.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-DYlmkUIy.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const L=m({__name:"TrafficRuleView",setup(h){return(x,D)=>{const t=w,o=u,l=b,n=f;return c(),d(T,{section:"traffic",title:"交通管制规则",description:"路口策略、区域互斥、动态让行(TrafficRule)",defaults:_(I)},{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{L as default};
|
||||
import{aG as m,aA as d,bH as e,br as _,b7 as c,aF as a,ab as f,a8 as b,a9 as u,aa as w,aE as s,bo as p,j as I}from"./index-CC_hCGHZ.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-B4fOVsSK.js";/* empty css *//* empty css *//* empty css */import"./PermissionGuard-DxbOGfWF.js";/* empty css */import"./reflection-CTDOoTn5.js";import"./monitorConfigCache-B5CZXjjB.js";const L=m({__name:"TrafficRuleView",setup(h){return(x,D)=>{const t=w,o=u,l=b,n=f;return c(),d(T,{section:"traffic",title:"交通管制规则",description:"路口策略、区域互斥、动态让行(TrafficRule)",defaults:_(I)},{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{L as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.vehicle-health-card[data-v-30c5a691]{border:1px solid var(--el-border-color-light);border-radius:8px;background:var(--el-bg-color);overflow:hidden;cursor:pointer;transition:box-shadow .15s ease,border-color .15s ease}.vehicle-health-card[data-v-30c5a691]:hover{box-shadow:0 2px 12px #00000014}.vehicle-health-card.is-selected[data-v-30c5a691]{border-color:var(--el-color-primary);box-shadow:0 0 0 1px var(--el-color-primary-light-7)}.vehicle-health-card.is-alarm[data-v-30c5a691]{border-color:var(--el-color-danger-light-5)}.vehicle-health-card.is-offline[data-v-30c5a691],.vehicle-health-card.is-maintenance[data-v-30c5a691]{border-color:var(--el-color-warning-light-5)}.vehicle-health-card.is-unreachable[data-v-30c5a691]{opacity:.85}.battery-strip[data-v-30c5a691]{height:4px}.card-head[data-v-30c5a691]{display:flex;align-items:center;justify-content:space-between;padding:8px 10px 4px;gap:8px}.title-block[data-v-30c5a691]{min-width:0;display:flex;flex-direction:column;gap:2px}.vid[data-v-30c5a691]{font-size:12px;color:var(--el-text-color-secondary);font-family:ui-monospace,monospace}.vname[data-v-30c5a691]{font-weight:600;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.head-actions[data-v-30c5a691]{display:flex;align-items:center;gap:4px;flex-shrink:0}.card-body[data-v-30c5a691]{display:flex;gap:10px;padding:4px 10px 8px}.thumb[data-v-30c5a691]{width:56px;height:56px;border-radius:6px;background:var(--el-fill-color-light);display:flex;align-items:center;justify-content:center;color:var(--el-text-color-secondary);flex-shrink:0}.metrics[data-v-30c5a691]{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px;font-size:12px}.metric-row[data-v-30c5a691]{display:flex;justify-content:space-between;gap:8px}.metric-row .label[data-v-30c5a691]{color:var(--el-text-color-secondary)}.metric-row .value[data-v-30c5a691]{font-weight:500}.metric-row .value.mono[data-v-30c5a691]{font-family:ui-monospace,monospace}.metric-row .value.danger[data-v-30c5a691]{color:var(--el-color-danger)}.metric-row .value.warn[data-v-30c5a691]{color:var(--el-color-warning)}.icon-grid[data-v-30c5a691]{display:grid;grid-template-columns:repeat(4,1fr);gap:4px;padding:0 10px 8px}.icon-cell[data-v-30c5a691]{display:flex;flex-direction:column;align-items:center;gap:2px;font-size:10px;color:var(--el-text-color-secondary)}.icon-cell .is-alarm[data-v-30c5a691]{color:var(--el-color-danger)}.icon-cell .is-down[data-v-30c5a691]{color:var(--el-color-info)}.card-foot[data-v-30c5a691]{display:flex;justify-content:space-between;padding:6px 10px;font-size:11px;color:var(--el-text-color-secondary);background:var(--el-fill-color-lighter);border-top:1px solid var(--el-border-color-lighter)}.card-foot .hint[data-v-30c5a691]{opacity:.7}.vehicle-hub-page[data-v-16eb28f6]{padding:16px;height:100%;display:flex;flex-direction:column;gap:12px;overflow:hidden}.hub-toolbar[data-v-16eb28f6]{display:flex;flex-direction:column;gap:12px;flex-shrink:0}.stats-row[data-v-16eb28f6]{display:flex;flex-wrap:wrap;gap:16px}.stat[data-v-16eb28f6]{display:flex;flex-direction:column;align-items:center;min-width:64px}.stat .num[data-v-16eb28f6]{font-size:22px;font-weight:700;line-height:1.2}.stat .label[data-v-16eb28f6]{font-size:12px;color:var(--el-text-color-secondary)}.stat.online .num[data-v-16eb28f6]{color:var(--el-color-success)}.stat.warn .num[data-v-16eb28f6]{color:var(--el-color-warning)}.stat.danger .num[data-v-16eb28f6]{color:var(--el-color-danger)}.stat.muted .num[data-v-16eb28f6]{color:var(--el-text-color-secondary)}.filters-row[data-v-16eb28f6]{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.search-input[data-v-16eb28f6]{width:220px}.filter-select[data-v-16eb28f6]{width:120px}.card-grid[data-v-16eb28f6]{flex:1;overflow:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:12px;align-content:start;padding-bottom:8px}.footnote[data-v-16eb28f6]{flex-shrink:0;margin:0;font-size:11px;color:var(--el-text-color-placeholder)}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{aG as c,aA as f,bH as l,br as b,b7 as V,aF as t,N as v,O as R,a4 as U,H as h,aE as d,a7 as E,R as B,S as w,k as x}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";import{C as T}from"./ConfigPageBase-DYlmkUIy.js";/* empty css *//* empty css *//* empty css *//* empty css */import"./PermissionGuard-DhAzkl-X.js";/* empty css */import"./reflection-BmVSriDn.js";import"./monitorConfigCache-deAxNrzx.js";const K=c({__name:"VehicleMaintenanceView",setup(N){return(C,m)=>{const i=U,a=R,r=h,u=E,p=B,s=w,_=v;return V(),f(T,{section:"vehicle",title:"车辆维护策略",description:"电量阈值、故障上报、自动报修(VehicleMaintenancePolicy)",defaults:b(x)},{default:l(({payload:e,update:n})=>[t(_,{"label-width":"160px",model:e},{default:l(()=>[t(a,{label:"低电量阈值"},{default:l(()=>[t(i,{"model-value":e.lowBatteryThreshold*100,min:0,max:100,"format-tooltip":o=>`${o}%`,"onUpdate:modelValue":o=>n({...e,lowBatteryThreshold:(Number(o)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(a,{label:"临界电量阈值"},{default:l(()=>[t(i,{"model-value":e.criticalBatteryThreshold*100,min:0,max:100,"format-tooltip":o=>`${o}%`,"onUpdate:modelValue":o=>n({...e,criticalBatteryThreshold:(Number(o)||0)/100})},null,8,["model-value","format-tooltip","onUpdate:modelValue"])]),_:2},1024),t(r,{"content-position":"left"},{default:l(()=>[...m[0]||(m[0]=[d("故障上报",-1)])]),_:1}),t(a,{label:"启用"},{default:l(()=>[t(u,{"model-value":e.faultReport.enabled,"onUpdate:modelValue":o=>n({...e,faultReport:{...e.faultReport,enabled:!!o}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(a,{label:"接收邮箱"},{default:l(()=>[t(p,{"model-value":e.faultReport.emailTo.join(", "),"onUpdate:modelValue":o=>n({...e,faultReport:{...e.faultReport,emailTo:o.split(/[,\s]+/).filter(Boolean)}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(r,{"content-position":"left"},{default:l(()=>[...m[1]||(m[1]=[d("自动报修",-1)])]),_:1}),t(a,{label:"启用"},{default:l(()=>[t(u,{"model-value":e.autoRepair.enabled,"onUpdate:modelValue":o=>n({...e,autoRepair:{...e.autoRepair,enabled:!!o}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024),t(a,{label:"冷却时间 (秒)"},{default:l(()=>[t(s,{"model-value":e.autoRepair.cooldownSec,min:0,max:86400,"onUpdate:modelValue":o=>n({...e,autoRepair:{...e.autoRepair,cooldownSec:o??0}})},null,8,["model-value","onUpdate:modelValue"])]),_:2},1024)]),_:2},1032,["model"])]),_:1},8,["defaults"])}}});export{K as default};
|
||||
@@ -1 +0,0 @@
|
||||
.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px;align-items:center;width:100%;height:32px;display:flex}.el-slider__runway{height:var(--el-slider-height);background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);cursor:pointer;flex:1;position:relative}.el-slider__runway.show-input{width:auto;margin-right:30px}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper:hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button:hover,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button.dragging{cursor:not-allowed;transform:scale(1)}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{height:var(--el-slider-height);background-color:var(--el-slider-main-bg-color);border-top-left-radius:var(--el-slider-border-radius);border-bottom-left-radius:var(--el-slider-border-radius);position:absolute}.el-slider__button-wrapper{height:var(--el-slider-button-wrapper-size);width:var(--el-slider-button-wrapper-size);z-index:1;top:var(--el-slider-button-wrapper-offset);text-align:center;-webkit-user-select:none;user-select:none;background-color:#0000;outline:none;line-height:normal;position:absolute;transform:translate(-50%)}.el-slider__button-wrapper:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-slider__button-wrapper:hover,.el-slider__button-wrapper.hover{cursor:grab}.el-slider__button-wrapper.dragging{cursor:grabbing}.el-slider__button{width:var(--el-slider-button-size);height:var(--el-slider-button-size);vertical-align:middle;border:solid 2px var(--el-slider-main-bg-color);background-color:var(--el-color-white);box-sizing:border-box;transition:var(--el-transition-duration-fast);-webkit-user-select:none;user-select:none;border-radius:50%;display:inline-block}.el-slider__button:hover,.el-slider__button.hover,.el-slider__button.dragging{transform:scale(1.2)}.el-slider__button:hover,.el-slider__button.hover{cursor:grab}.el-slider__button.dragging{cursor:grabbing}.el-slider__stop{height:var(--el-slider-height);width:var(--el-slider-height);border-radius:var(--el-border-radius-circle);background-color:var(--el-slider-stop-bg-color);position:absolute;transform:translate(-50%)}.el-slider__marks{width:18px;height:100%;top:0;left:12px}.el-slider__marks-text{color:var(--el-color-info);white-space:pre;margin-top:15px;font-size:14px;position:absolute;transform:translate(-50%)}.el-slider.is-vertical{flex:0;width:auto;height:100%;display:inline-flex;position:relative}.el-slider.is-vertical .el-slider__runway{width:var(--el-slider-height);height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:var(--el-slider-height);border-radius:0 0 3px 3px;height:auto}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:var(--el-slider-button-wrapper-offset);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}
|
||||
@@ -0,0 +1 @@
|
||||
import{aG as Q,b5 as X,b4 as J,aC as b,b1 as K,aF as u,ac as Y,bH as c,az as f,bo as s,aA as U,aB as p,r as Z,br as S,Q as ee,bf as l,av as V,b7 as i,aE as m,bg as ae,aQ as te,aX as ne,aj as oe}from"./index-CC_hCGHZ.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=Q({__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:z,emit:F}){const n=o,h=F,_=l(),O=l(),y=l(!1),v=l("正在连接 webVRender ..."),w=l(null),g=l([]),r=l(""),d=V(()=>n.host??"localhost:8223"??"localhost:8223"),M=V(()=>{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 R(){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 L(a){try{return(await fetch(`${R()}${a}`,{method:"GET",cache:"no-store",credentials:"omit",signal:AbortSignal.timeout(ie)})).ok}catch{return!1}}async function G(){const a=H();if(a){for(let e=0;e<de;e++){if(await L(a))return;await B(80*(e+1))}console.warn(`[Workspace3D] ${a} 未成功,将依赖 SimpleLite 默认 canvas-only 模式`)}}async function I(a=1e4){const e=Date.now()+a;let t=60;for(;Date.now()<e;){if(await L("/vrenderReady"))return!0;await B(t),t=Math.min(t+40,280)}return!1}function T(){k!=null&&(clearTimeout(k),k=null)}function N(a){T(),k=setTimeout(()=>{a!==E||y.value||(v.value=`连接超时 (http://${d.value}),请确认 SimpleLite 已启动`)},ue)}function C(a){const e=M.value;if(!a)return e;const t=e.includes("?")?"&":"?";return`${e}${t}_=${Date.now()}`}async function D(a=!1){const e=++E;if(y.value=!1,v.value=`正在连接 webVRender (http://${d.value}) ...`,N(e),P())G(),r.value=C(a||!!r.value);else{if(v.value="正在等待 SimpleLite webVRender 就绪 ...",await I(),e!==E)return;r.value=C(a||!!r.value)}}function j(){y.value=!0,T(),h("ready")}function W(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 x(){D(!0)}function $(){const a=O.value;a&&(document.fullscreenElement?document.exitFullscreen():a.requestFullscreen())}return X(()=>{window.addEventListener("message",W),D(!1)}),J(()=>{window.removeEventListener("message",W),T()}),z({reload:x,enterFullscreen:$}),(a,e)=>{const t=Y,A=Z,q=ee;return i(),b("div",{class:K(["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(),U(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(),U(t,{key:1,type:"primary",size:"small"},{default:c(()=>[m(" Selected: "+s(g.value.length),1)]),_:1})):p("",!0),u(A,{size:"small",icon:S(ae),onClick:x},{default:c(()=>[...e[0]||(e[0]=[m("重载",-1)])]),_:1},8,["icon"]),u(A,{size:"small",icon:S(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:j},null,40,re)):p("",!0),y.value?p("",!0):(i(),b("div",ce,[u(q,{class:"is-loading",size:"32"},{default:c(()=>[u(S(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};
|
||||
@@ -1 +0,0 @@
|
||||
import{aG as N,b5 as P,b4 as $,aC as y,b1 as A,aF as d,ac as D,bH as n,az as i,bo as l,aA as z,aB as u,r as R,br as _,Q as j,bf as r,av as S,b7 as c,aE as f,bg as I,aQ as q,aX as G,aj as H}from"./index-D5OuyicD.js";/* empty css *//* empty css *//* empty css */const M={key:0,class:"workspace-3d-toolbar"},Q={class:"hint"},X=["src"],J={key:1,class:"workspace-3d-mask"},K=N({__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:W,emit:L}){const t=o,v=L,k=r(),g=r(),w=r(!1),p=r(null),b=r([]),h=r(""),m=S(()=>t.host??"localhost:8223"??"localhost:8223"),U=S(()=>{const a=new URLSearchParams;return a.set("scope",t.scope??"Platform"),t.token&&a.set("token",t.token),a.set("ro",t.readOnly?"1":"0"),t.canvasOnly?a.set("ui","canvas-only"):t.embedUi&&a.set("ui","embed"),`http://${m.value}/?${a.toString()}`});async function F(){const a=t.canvasOnly?"/declareCanvasOnly":t.embedUi?"/declareEmbedUi":null;if(a)try{await fetch(`http://${m.value}${a}`,{method:"GET",mode:"no-cors",cache:"no-store",credentials:"omit",keepalive:!0})}catch(e){console.warn(`[Workspace3D] ${a} 请求失败,SimpleLite 可能仍以完整面板模式启动:`,e)}}async function E(){w.value=!1,await F(),h.value=U.value}function T(){w.value=!0,v("ready")}function x(a){if(!k.value||a.source!==k.value.contentWindow)return;const e=a.data;if(!(!e||typeof e!="object")){if(e.type==="workspace.pick"&&e.payload&&typeof e.payload.x=="number")p.value=e.payload,v("pick",e.payload);else if(e.type==="workspace.select"&&Array.isArray(e.payload))b.value=e.payload,v("select",e.payload);else if(e.type==="workspace.shortcut"&&e.payload&&typeof e.payload=="object"){const s=e.payload.action;(s==="undo"||s==="redo"||s==="delete")&&window.dispatchEvent(new CustomEvent("workspace-shortcut",{detail:{action:s}}))}}}function B(){E()}function O(){const a=g.value;a&&(document.fullscreenElement?document.exitFullscreen():a.requestFullscreen())}return P(()=>{window.addEventListener("message",x),E()}),$(()=>{window.removeEventListener("message",x)}),W({reload:B,enterFullscreen:O}),(a,e)=>{const s=D,C=R,V=j;return c(),y("div",{class:A(["workspace-3d-wrap",{"workspace-3d--canvas-only":o.canvasOnly||o.hideToolbar}])},[o.canvasOnly||o.hideToolbar?u("",!0):(c(),y("div",M,[d(s,{type:o.readOnly?"info":"success",effect:"dark",size:"small"},{default:n(()=>[f(l(o.readOnly?"只读":"可交互"),1)]),_:1},8,["type"]),i("span",Q,"webVRender · http://"+l(m.value)+" · scope="+l(o.scope),1),e[2]||(e[2]=i("div",{class:"spacer"},null,-1)),p.value?(c(),z(s,{key:0,type:"warning",size:"small"},{default:n(()=>[f(" Pick ("+l(p.value.x.toFixed(0))+", "+l(p.value.y.toFixed(0))+") ",1)]),_:1})):u("",!0),b.value.length?(c(),z(s,{key:1,type:"primary",size:"small"},{default:n(()=>[f(" Selected: "+l(b.value.length),1)]),_:1})):u("",!0),d(C,{size:"small",icon:_(I),onClick:B},{default:n(()=>[...e[0]||(e[0]=[f("重载",-1)])]),_:1},8,["icon"]),d(C,{size:"small",icon:_(q),onClick:O},{default:n(()=>[...e[1]||(e[1]=[f("全屏",-1)])]),_:1},8,["icon"])])),i("div",{ref_key:"frameWrap",ref:g,class:"workspace-3d-frame"},[h.value?(c(),y("iframe",{key:0,ref_key:"frame",ref:k,src:h.value,class:"workspace-3d-iframe",allow:"fullscreen",onLoad:T},null,40,X)):u("",!0),w.value?u("",!0):(c(),y("div",J,[d(V,{class:"is-loading",size:"32"},{default:n(()=>[d(_(G))]),_:1}),i("span",null,"正在连接 webVRender (http://"+l(m.value)+") ...",1),e[3]||(e[3]=i("span",{class:"muted"},"如长时间未加载,请确认 SimpleLite 已以 Web-Enabled 模式启动且 8223 端口可达。",-1))]))],512)],2)}}}),te=H(K,[["__scopeId","data-v-aaec3f2d"]]);export{te as W};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
.workspace-3d-wrap[data-v-aaec3f2d]{display:flex;flex-direction:column;height:100%;min-height:480px;border:1px solid rgba(255,255,255,.12);border-radius:var(--mg-radius, 16px);background:#0f042073;backdrop-filter:blur(18px) saturate(140%);-webkit-backdrop-filter:blur(18px) saturate(140%);box-shadow:0 8px 24px #0a021059,0 0 0 1px #ffffff0f inset;overflow:hidden;transition:all .25s cubic-bezier(.25,.8,.25,1)}.workspace-3d-wrap.workspace-3d--canvas-only[data-v-aaec3f2d]{border:0;border-radius:0;min-height:0;background:transparent;box-shadow:none}.workspace-3d-toolbar[data-v-aaec3f2d]{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#ffffff0a;border-bottom:1px solid rgba(255,255,255,.08);font-size:12px;color:#e8d7f5d9}.workspace-3d-toolbar .hint[data-v-aaec3f2d]{color:#c9a6e3b3;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px}.workspace-3d-toolbar .spacer[data-v-aaec3f2d]{flex:1}.workspace-3d-frame[data-v-aaec3f2d]{flex:1;position:relative;background:radial-gradient(ellipse at 50% 40%,#2d1456,#1a0930,#0f0420)}.workspace-3d-iframe[data-v-aaec3f2d]{width:100%;height:100%;border:0;background:transparent;display:block}.workspace-3d-mask[data-v-aaec3f2d]{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:radial-gradient(ellipse at center,rgba(var(--mg-primary-rgb),.35),rgba(var(--mg-bg-app-deep-rgb),.92) 80%),rgba(var(--mg-bg-app-deep-rgb),.85);color:#e8dcffeb;font-size:13px;backdrop-filter:blur(10px)}.workspace-3d-mask .muted[data-v-aaec3f2d]{color:rgba(var(--mg-accent-rgb),.7);font-size:12px}.workspace-3d-mask .el-icon[data-v-aaec3f2d]{color:var(--mg-accent);filter:drop-shadow(0 0 10px rgba(var(--mg-accent-rgb),.6))}
|
||||
.workspace-3d-wrap[data-v-17efa15d]{display:flex;flex-direction:column;height:100%;min-height:480px;border:1px solid rgba(255,255,255,.12);border-radius:var(--mg-radius, 16px);background:#0f042073;backdrop-filter:blur(18px) saturate(140%);-webkit-backdrop-filter:blur(18px) saturate(140%);box-shadow:0 8px 24px #0a021059,0 0 0 1px #ffffff0f inset;overflow:hidden;transition:all .25s cubic-bezier(.25,.8,.25,1)}.workspace-3d-wrap.workspace-3d--canvas-only[data-v-17efa15d]{border:0;border-radius:0;min-height:0;background:transparent;box-shadow:none}.workspace-3d-toolbar[data-v-17efa15d]{display:flex;align-items:center;gap:8px;padding:8px 14px;background:#ffffff0a;border-bottom:1px solid rgba(255,255,255,.08);font-size:12px;color:#e8d7f5d9}.workspace-3d-toolbar .hint[data-v-17efa15d]{color:#c9a6e3b3;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px}.workspace-3d-toolbar .spacer[data-v-17efa15d]{flex:1}.workspace-3d-frame[data-v-17efa15d]{flex:1;position:relative;background:radial-gradient(ellipse at 50% 40%,#2d1456,#1a0930,#0f0420)}.workspace-3d-iframe[data-v-17efa15d]{width:100%;height:100%;border:0;background:transparent;display:block}.workspace-3d-mask[data-v-17efa15d]{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;background:radial-gradient(ellipse at center,rgba(var(--mg-primary-rgb),.35),rgba(var(--mg-bg-app-deep-rgb),.92) 80%),rgba(var(--mg-bg-app-deep-rgb),.85);color:#e8dcffeb;font-size:13px;backdrop-filter:blur(10px);pointer-events:none}.workspace-3d-mask .muted[data-v-17efa15d]{color:rgba(var(--mg-accent-rgb),.7);font-size:12px}.workspace-3d-mask .el-icon[data-v-17efa15d]{color:var(--mg-accent);filter:drop-shadow(0 0 10px rgba(var(--mg-accent-rgb),.6))}
|
||||
+1
-1
File diff suppressed because one or more lines are too long
+2
-2
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
||||
import{aS as t}from"./index-D5OuyicD.js";const a="/sl/projection/map-edit",r="/sl/projection/ai-config";async function o(e){const{data:s}=await e;if(!s?.success)throw new Error(s?.message??"request failed");return s.data}const n={createSite:e=>o(t.post(`${a}/objects/site`,e)),createTrack:(e,s)=>o(t.post(`${a}/objects/${e}`,s)),createImage:e=>o(t.post(`${a}/objects/image`,e)),createText:e=>o(t.post(`${a}/objects/text`,e)),createModel:e=>o(t.post(`${a}/objects/model`,e)),createCar:e=>o(t.post(`${a}/objects/car`,e)),deleteObject:(e,s)=>o(t.delete(`${a}/objects/${e}/${s}`)),batch:e=>o(t.post(`${a}/objects/batch`,{ops:e})),copyFieldsTo:(e,s,p,c)=>o(t.post(`${a}/objects/${e}/${s}/fields/copy-to`,{fieldNames:p,targets:c})),pick:()=>o(t.post(`${a}/pick`)),dashboardSummary:()=>o(t.get(`${a}/dashboard/summary`)),uploadAsset:(e,s)=>o(t.post(`${a}/assets/upload`,{filename:e,data:s},{headers:{"Content-Type":"multipart/form-data"}})),aiMapGenerate:e=>o(t.post(`${a}/ai/map-generate`,e)),projectSave:e=>o(t.post(`${a}/project/save`,{path:e??""})),projectLoad:e=>o(t.post(`${a}/project/load`,{path:e})),projectCurrent:()=>o(t.get(`${a}/project/current`)),projectBrowse:e=>o(t.get(`${a}/project/browse`,{params:e?{dir:e}:{}})),projectNativePickOpen:e=>o(t.post(`${a}/project/native-pick-open`,{initialDir:e??""})),projectNativePickSave:(e,s)=>o(t.post(`${a}/project/native-pick-save`,{initialDir:e??"",suggestedFileName:s??"project.current.json"})),sampleSitesAlongTrack:(e,s)=>o(t.post(`${a}/objects/track/${e}/sample-sites`,s)),getViewFilter:()=>o(t.get(`${a}/view-filter`)),setViewFilter:e=>o(t.post(`${a}/view-filter`,e))},$={get:()=>o(t.get(`${r}/`)),save:e=>o(t.post(`${r}/`,e))};export{$ as a,n as m};
|
||||
import{aS as t}from"./index-CC_hCGHZ.js";const a="/sl/projection/map-edit",r="/sl/projection/ai-config";async function o(e){const{data:s}=await e;if(!s?.success)throw new Error(s?.message??"request failed");return s.data}const n={createSite:e=>o(t.post(`${a}/objects/site`,e)),createTrack:(e,s)=>o(t.post(`${a}/objects/${e}`,s)),createImage:e=>o(t.post(`${a}/objects/image`,e)),createText:e=>o(t.post(`${a}/objects/text`,e)),createModel:e=>o(t.post(`${a}/objects/model`,e)),createCar:e=>o(t.post(`${a}/objects/car`,e)),deleteObject:(e,s)=>o(t.delete(`${a}/objects/${e}/${s}`)),batch:e=>o(t.post(`${a}/objects/batch`,{ops:e})),copyFieldsTo:(e,s,p,c)=>o(t.post(`${a}/objects/${e}/${s}/fields/copy-to`,{fieldNames:p,targets:c})),pick:()=>o(t.post(`${a}/pick`)),dashboardSummary:()=>o(t.get(`${a}/dashboard/summary`)),uploadAsset:(e,s)=>o(t.post(`${a}/assets/upload`,{filename:e,data:s},{headers:{"Content-Type":"multipart/form-data"}})),aiMapGenerate:e=>o(t.post(`${a}/ai/map-generate`,e)),projectSave:e=>o(t.post(`${a}/project/save`,{path:e??""})),projectLoad:e=>o(t.post(`${a}/project/load`,{path:e})),projectCurrent:()=>o(t.get(`${a}/project/current`)),projectBrowse:e=>o(t.get(`${a}/project/browse`,{params:e?{dir:e}:{}})),projectNativePickOpen:e=>o(t.post(`${a}/project/native-pick-open`,{initialDir:e??""})),projectNativePickSave:(e,s)=>o(t.post(`${a}/project/native-pick-save`,{initialDir:e??"",suggestedFileName:s??"project.current.json"})),sampleSitesAlongTrack:(e,s)=>o(t.post(`${a}/objects/track/${e}/sample-sites`,s)),getViewFilter:()=>o(t.get(`${a}/view-filter`)),setViewFilter:e=>o(t.post(`${a}/view-filter`,e))},$={get:()=>o(t.get(`${r}/`)),save:e=>o(t.post(`${r}/`,e))};export{$ as a,n as m};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{r as e}from"./reflection-BmVSriDn.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-CTDOoTn5.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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aS as a}from"./index-D5OuyicD.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{aS as a}from"./index-CC_hCGHZ.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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{aS as e}from"./index-D5OuyicD.js";import{r as s}from"./reflection-BmVSriDn.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{aS as e}from"./index-CC_hCGHZ.js";import{r as s}from"./reflection-CTDOoTn5.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};
|
||||
@@ -1 +0,0 @@
|
||||
import{aS as i}from"./index-D5OuyicD.js";const c="/sl/projection/reflection";function p(){return{fields:[],status:[],methods:[]}}function f(){return{car:p(),site:p(),track:p()}}const g=f;async function o(e){const{data:t}=await i.get(`${c}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function r(e,t){const{data:s}=await i.post(`${c}${e}`,null,{params:t});if(!s?.success)throw new Error(s?.message??`reflection ${e} failed`);return s.data}async function d(e){const{data:t}=await i.delete(`${c}${e}`);if(!t?.success)throw new Error(t?.message??`reflection ${e} failed`);return t.data}async function u(e,t){const{data:s}=await i.patch(`${c}${e}`,t);if(!s?.success)throw new Error(s?.message??`reflection PATCH ${e} failed`);return s.data}const y={listKinds:()=>o("/kinds"),listAssemblies:()=>o("/assemblies"),listObjects:e=>o(`/objects/${e}`),listCreatableTypes:e=>o(`/types/${e}`),createObject:(e,t,s)=>{const n={};if(t&&(n.typeName=t),s)for(const[a,l]of Object.entries(s))l==null||l===""||(n[a]=l);return r(`/objects/${e}`,n)},deleteObject:(e,t)=>d(`/objects/${e}/${t}`),reloadPlugins:()=>r("/plugins/reload"),listPlugins:()=>o("/plugins"),unloadPlugin:e=>r(`/plugins/${encodeURIComponent(e)}/unload`),listMethods:(e,t)=>o(`/methods/${e}/${t}`),listMethodsByType:e=>o(`/methods-by-type/${e}`),getStatus:(e,t)=>o(`/status/${e}/${t}`),getFields:(e,t)=>o(`/fields/${e}/${t}`),setField:(e,t,s,n)=>r(`/fields/${e}/${t}/${encodeURIComponent(s)}`,{value:n}),deleteField:(e,t,s)=>d(`/fields/${e}/${t}/${encodeURIComponent(s)}`),getBundle:(e,t)=>o(`/bundle/${e}/${t}`),execute:(e,t,s,n)=>r(`/execute/${e}/${t}/${encodeURIComponent(s)}`,n),gotoCarSite:(e,t)=>r(`/car/${e}/goto-site`,{siteId:t}),getScriptSource:e=>o(`/scripts/${e}/source`),getScriptExceptionStatus:e=>o(`/scripts/${e}/exception-status`),getMonitorConfig:()=>o("/monitor-config"),saveMonitorConfig:async e=>{const{data:t}=await i.post(`${c}/monitor-config`,e);if(!t?.success)throw new Error(t?.message??"saveMonitorConfig failed");return t.data},getSelection:()=>o("/selection"),setSelection:(e,t)=>r("/selection",{kind:e,id:t}),clearSelection:()=>r("/selection/clear"),getProjectFields:()=>o("/project/fields"),setProjectField:(e,t)=>r(`/project/fields/${encodeURIComponent(e)}`,{value:t}),saveProject:e=>r("/project/save",e?{path:e}:void 0),getAppConfigFields:()=>o("/app-config/fields"),setAppConfigField:(e,t)=>r(`/app-config/fields/${encodeURIComponent(e)}`,{value:t}),saveAppConfig:()=>r("/app-config/save"),getViewportStyle:()=>o("/viewport-style"),patchViewportStyle:e=>u("/viewport-style",e),getCarStyleTypes:()=>o("/car-style/types"),getCarStyle:e=>o(`/car-style/${encodeURIComponent(e)}`),putCarStyle:async(e,t)=>{const{data:s}=await i.post(`${c}/car-style/${encodeURIComponent(e)}`,t);if(!s?.success)throw new Error(s?.message??"putCarStyle failed");return s.data},deleteCarStyle:e=>d(`/car-style/${encodeURIComponent(e)}`),getAlarmColors:()=>o("/car-style/alarm-colors"),putAlarmColors:async e=>{const{data:t}=await i.post(`${c}/car-style/alarm-colors`,e);if(!t?.success)throw new Error(t?.message??"putAlarmColors failed");return t.data},saveCarStyle:()=>r("/car-style/save")};function m(e){const t=e>>>24&255,s=e>>>16&255,n=e>>>8&255,a=e&255;return t>=255?`#${s.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`:`#${t.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${n.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function S(e){const t=e.replace("#","").trim();if(t.length===6){const s=parseInt(t.slice(0,2),16),n=parseInt(t.slice(2,4),16),a=parseInt(t.slice(4,6),16);return 255<<24|s<<16|n<<8|a}if(t.length===8){const s=parseInt(t.slice(0,2),16),n=parseInt(t.slice(2,4),16),a=parseInt(t.slice(4,6),16),l=parseInt(t.slice(6,8),16);return s<<24|n<<16|a<<8|l}return 4294967295}export{m as a,f as b,g as e,S as h,y as r};
|
||||
@@ -0,0 +1 @@
|
||||
import{aS as l}from"./index-CC_hCGHZ.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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{u as n}from"./useProjectionStream-DvMLcpMm.js";import{b5 as r,b4 as s}from"./index-D5OuyicD.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-C_klWvmm.js";import{b5 as r,b4 as s}from"./index-CC_hCGHZ.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};
|
||||
+1
-1
@@ -1 +1 @@
|
||||
import{b6 as S,bf as h}from"./index-D5OuyicD.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=h(!1),u=h(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),v=typeof o=="object"&&o!==null&&"kind"in o?o:{kind:n??"message",payload:o};u.value=v,s.forEach(k=>{try{k(v)}catch{}})}catch{}}function f(){if(e){try{e.close()}catch{}e=null}}function p(){l||c||(c=setTimeout(()=>{c=null,i()},j))}function m(){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(()=>{m(),s.clear()}),{connected:r,lastEvent:u,connect:i,disconnect:m,on:b,off:E}}export{w as u};
|
||||
import{b6 as S,bf as h}from"./index-CC_hCGHZ.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=h(!1),u=h(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),v=typeof o=="object"&&o!==null&&"kind"in o?o:{kind:n??"message",payload:o};u.value=v,s.forEach(k=>{try{k(v)}catch{}})}catch{}}function f(){if(e){try{e.close()}catch{}e=null}}function p(){l||c||(c=setTimeout(()=>{c=null,i()},j))}function m(){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(()=>{m(),s.clear()}),{connected:r,lastEvent:u,connect:i,disconnect:m,on:b,off:E}}export{w as u};
|
||||
@@ -6,8 +6,8 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>迷毂 · 智能调度平台</title>
|
||||
<meta name="theme-color" content="#2e3f8a" />
|
||||
<script type="module" crossorigin src="/assets/index-D5OuyicD.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-BvDaAPxG.css">
|
||||
<script type="module" crossorigin src="/assets/index-CC_hCGHZ.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-B461CCj6.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
@load="onReady" />
|
||||
<div v-if="!loaded" class="workspace-3d-mask">
|
||||
<el-icon class="is-loading" size="32"><Loading /></el-icon>
|
||||
<span>正在连接 webVRender (http://{{ resolvedHost }}) ...</span>
|
||||
<span>{{ loadingHint }}</span>
|
||||
<span class="muted">如长时间未加载,请确认 SimpleLite 已以 Web-Enabled 模式启动且 8223 端口可达。</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -73,6 +73,7 @@ const emit = defineEmits<{
|
||||
const frame = ref<HTMLIFrameElement>()
|
||||
const frameWrap = ref<HTMLDivElement>()
|
||||
const loaded = ref(false)
|
||||
const loadingHint = ref('正在连接 webVRender ...')
|
||||
const lastPick = ref<PickEvent | null>(null)
|
||||
const lastSelect = ref<string[]>([])
|
||||
const iframeSrc = ref<string>('')
|
||||
@@ -89,40 +90,118 @@ const vrUrl = computed(() => {
|
||||
return `http://${resolvedHost.value}/?${qs.toString()}`
|
||||
})
|
||||
|
||||
/**
|
||||
* 嵌入 / canvas-only 模式必须在 webVRender 主页加载(即发起 WebSocket 连接)之前先打一次
|
||||
* 对应的 GET 声明端点,让 SimpleLite 把"下一个连入的 WebTerminal"打上对应模式标签。
|
||||
* 否则 SimpleLite 拿不到任何提示(CycleGUI 不会把 URL query 透传给 Terminal),
|
||||
* 会默认创建完整工作区面板(工作台 / 浮动条 / CAD / 底栏),违反平台 UI 接管的要求。
|
||||
*/
|
||||
async function declareEmbedIfNeeded() {
|
||||
const endpoint = props.canvasOnly
|
||||
? '/declareCanvasOnly'
|
||||
: props.embedUi
|
||||
? '/declareEmbedUi'
|
||||
: null
|
||||
if (!endpoint) return
|
||||
const FETCH_TIMEOUT_MS = 1800
|
||||
const DECLARE_MAX_ATTEMPTS = 4
|
||||
const LOAD_WATCHDOG_MS = 18_000
|
||||
|
||||
let loadWatchdog: ReturnType<typeof setTimeout> | null = null
|
||||
let prepareGeneration = 0
|
||||
|
||||
function vrenderBaseUrl() {
|
||||
return `http://${resolvedHost.value}`
|
||||
}
|
||||
|
||||
function sleep(ms: number) {
|
||||
return new Promise<void>(r => setTimeout(r, ms))
|
||||
}
|
||||
|
||||
function needsDeclare() {
|
||||
return props.canvasOnly || props.embedUi
|
||||
}
|
||||
|
||||
function declareEndpoint() {
|
||||
if (props.canvasOnly) return '/declareCanvasOnly'
|
||||
if (props.embedUi) return '/declareEmbedUi'
|
||||
return null
|
||||
}
|
||||
|
||||
/** 单次 HTTP 探测(带超时),用于 declare / vrenderReady。 */
|
||||
async function pingVrender(path: string): Promise<boolean> {
|
||||
try {
|
||||
await fetch(`http://${resolvedHost.value}${endpoint}`, {
|
||||
const res = await fetch(`${vrenderBaseUrl()}${path}`, {
|
||||
method: 'GET',
|
||||
mode: 'no-cors',
|
||||
cache: 'no-store',
|
||||
credentials: 'omit',
|
||||
keepalive: true
|
||||
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS)
|
||||
})
|
||||
} catch (err) {
|
||||
console.warn(`[Workspace3D] ${endpoint} 请求失败,SimpleLite 可能仍以完整面板模式启动:`, err)
|
||||
return res.ok
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
async function prepareAndLoad() {
|
||||
/**
|
||||
* 尽力 declare(不阻塞 iframe)。SimpleLite 侧 WebTerminal 已默认 canvas-only,
|
||||
* declare 主要用于多 tab 显式标记;失败也不影响平台纯画布模式。
|
||||
*/
|
||||
async function postDeclareBestEffort() {
|
||||
const endpoint = declareEndpoint()
|
||||
if (!endpoint) return
|
||||
|
||||
for (let attempt = 0; attempt < DECLARE_MAX_ATTEMPTS; attempt++) {
|
||||
if (await pingVrender(endpoint)) return
|
||||
await sleep(80 * (attempt + 1))
|
||||
}
|
||||
console.warn(`[Workspace3D] ${endpoint} 未成功,将依赖 SimpleLite 默认 canvas-only 模式`)
|
||||
}
|
||||
|
||||
/** 非嵌入模式:短轮询等待 8223 就绪后再加载 iframe。 */
|
||||
async function waitForVrenderReady(maxMs = 10_000): Promise<boolean> {
|
||||
const deadline = Date.now() + maxMs
|
||||
let interval = 60
|
||||
while (Date.now() < deadline) {
|
||||
if (await pingVrender('/vrenderReady')) return true
|
||||
await sleep(interval)
|
||||
interval = Math.min(interval + 40, 280)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
function clearLoadWatchdog() {
|
||||
if (loadWatchdog != null) {
|
||||
clearTimeout(loadWatchdog)
|
||||
loadWatchdog = null
|
||||
}
|
||||
}
|
||||
|
||||
function startLoadWatchdog(generation: number) {
|
||||
clearLoadWatchdog()
|
||||
loadWatchdog = setTimeout(() => {
|
||||
if (generation !== prepareGeneration || loaded.value) return
|
||||
loadingHint.value = `连接超时 (http://${resolvedHost.value}),请确认 SimpleLite 已启动`
|
||||
}, LOAD_WATCHDOG_MS)
|
||||
}
|
||||
|
||||
function buildIframeSrc(forceReload: boolean) {
|
||||
const base = vrUrl.value
|
||||
if (!forceReload) return base
|
||||
const sep = base.includes('?') ? '&' : '?'
|
||||
return `${base}${sep}_=${Date.now()}`
|
||||
}
|
||||
|
||||
async function prepareAndLoad(forceReload = false) {
|
||||
const generation = ++prepareGeneration
|
||||
loaded.value = false
|
||||
await declareEmbedIfNeeded()
|
||||
iframeSrc.value = vrUrl.value
|
||||
loadingHint.value = `正在连接 webVRender (http://${resolvedHost.value}) ...`
|
||||
startLoadWatchdog(generation)
|
||||
|
||||
const embedded = needsDeclare()
|
||||
|
||||
if (embedded) {
|
||||
// 并行:iframe 立即加载,declare 后台尽力发送(不挡首屏)。
|
||||
void postDeclareBestEffort()
|
||||
iframeSrc.value = buildIframeSrc(forceReload || !!iframeSrc.value)
|
||||
} else {
|
||||
loadingHint.value = '正在等待 SimpleLite webVRender 就绪 ...'
|
||||
await waitForVrenderReady()
|
||||
if (generation !== prepareGeneration) return
|
||||
iframeSrc.value = buildIframeSrc(forceReload || !!iframeSrc.value)
|
||||
}
|
||||
}
|
||||
|
||||
function onReady() {
|
||||
loaded.value = true
|
||||
clearLoadWatchdog()
|
||||
emit('ready')
|
||||
}
|
||||
|
||||
@@ -145,7 +224,7 @@ function onMessage(ev: MessageEvent) {
|
||||
}
|
||||
|
||||
function reload() {
|
||||
prepareAndLoad()
|
||||
prepareAndLoad(true)
|
||||
}
|
||||
|
||||
function enterFullscreen() {
|
||||
@@ -157,11 +236,12 @@ function enterFullscreen() {
|
||||
|
||||
onMounted(() => {
|
||||
window.addEventListener('message', onMessage)
|
||||
prepareAndLoad()
|
||||
prepareAndLoad(false)
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
window.removeEventListener('message', onMessage)
|
||||
clearLoadWatchdog()
|
||||
})
|
||||
|
||||
defineExpose({ reload, enterFullscreen })
|
||||
@@ -216,6 +296,7 @@ defineExpose({ reload, enterFullscreen })
|
||||
color: rgba(232, 220, 255, 0.92);
|
||||
font-size: 13px;
|
||||
backdrop-filter: blur(10px);
|
||||
pointer-events: none;
|
||||
}
|
||||
.workspace-3d-mask .muted { color: rgba(var(--mg-accent-rgb), 0.7); font-size: 12px; }
|
||||
.workspace-3d-mask .el-icon { color: var(--mg-accent); filter: drop-shadow(0 0 10px rgba(var(--mg-accent-rgb), 0.6)); }
|
||||
|
||||
@@ -1060,6 +1060,43 @@ function onDelete() {
|
||||
.defaults-empty { padding: 40px 12px; }
|
||||
.defaults-form .el-button { margin-top: 8px; }
|
||||
.defaults-form :deep(.el-form-item) { margin-bottom: 10px; }
|
||||
.layer-table { margin: 6px 0; }
|
||||
/* 图层 Tab:白底数据块(深侧栏上的可读「岛」),各主题下表头/单元格均用深字 */
|
||||
.layer-table {
|
||||
margin: 6px 0;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
background: #fff;
|
||||
box-shadow: 0 0 0 1px rgba(124, 58, 237, 0.14);
|
||||
}
|
||||
.layer-table :deep(.el-table__inner-wrapper) {
|
||||
background: #fff;
|
||||
}
|
||||
.layer-table :deep(th.el-table__cell) {
|
||||
background: #f5f3ff !important;
|
||||
color: #2d1b69 !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
.layer-table :deep(td.el-table__cell) {
|
||||
background: #fff !important;
|
||||
color: #1a0f3d !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
.layer-table :deep(.cell) {
|
||||
color: #1a0f3d !important;
|
||||
}
|
||||
.layer-table :deep(tr:hover > td.el-table__cell) {
|
||||
background: #ede9fe !important;
|
||||
}
|
||||
.new-layer { margin-top: 8px; }
|
||||
.new-layer :deep(.el-input__inner) {
|
||||
color: #1a0f3d;
|
||||
font-weight: 500;
|
||||
}
|
||||
.new-layer :deep(.el-input__inner::placeholder) {
|
||||
color: #7a6b9a;
|
||||
}
|
||||
.new-layer :deep(.el-input-group__append .el-button) {
|
||||
color: #5b21b6;
|
||||
font-weight: 600;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -162,14 +162,12 @@ const ADMIN_MENU: MenuItem[] = [
|
||||
{ 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', label: '车辆维护策略', key: 'admin-config-vehicle' },
|
||||
{ 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/fleet', label: '车队生命周期', key: 'admin-config-fleet' },
|
||||
{ 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' },
|
||||
|
||||
@@ -23,14 +23,12 @@ const PAGES: PageDef[] = [
|
||||
{ key: 'admin-config-system', label: '系统级配置', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-integrations', label: '外部系统对接', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-routing', label: '路径规划', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-vehicle', label: '车辆维护策略', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-vehicle-hub', label: '车辆运维', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-charge', label: '充电策略', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-task', label: '任务分配', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-traffic', label: '交通管制', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-auth', label: '权限与角色', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-device', label: '设备接入', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-fleet', label: '车队生命周期', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-scenario', label: '场景模板', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-location', label: '库位管理', group: '平台配置中心', scope: 'Platform' },
|
||||
{ key: 'admin-config-ops', label: '运营维护', group: '平台配置中心', scope: 'Platform' },
|
||||
@@ -144,7 +142,11 @@ function delay(ms: number) { return new Promise((r) => setTimeout(r, ms)) }
|
||||
function sanitizePages(pages: string[]): string[] {
|
||||
if (pages.includes('*')) return ['*']
|
||||
const valid = new Set(PAGES.map((p) => p.key))
|
||||
return [...new Set(pages.filter((p) => valid.has(p)))]
|
||||
const legacy: Record<string, string> = {
|
||||
'admin-config-vehicle': 'admin-vehicle-hub',
|
||||
'admin-config-fleet': 'admin-vehicle-hub'
|
||||
}
|
||||
return [...new Set(pages.map((p) => legacy[p] ?? p).filter((p) => valid.has(p)))]
|
||||
}
|
||||
|
||||
export function mockRbacCatalog(): RbacCatalog {
|
||||
|
||||
@@ -34,15 +34,16 @@ const routes: RouteRecordRaw[] = [
|
||||
{ path: 'config/system', name: 'admin-config-system', component: () => import('@/views/admin/config/SystemConfigView.vue'), meta: { title: '系统级配置' } },
|
||||
{ path: 'config/integrations', name: 'admin-config-integrations', component: () => import('@/views/admin/config/ExternalIntegrationView.vue'), meta: { title: '外部系统对接' } },
|
||||
{ path: 'config/routing', name: 'admin-config-routing', component: () => import('@/views/admin/config/RoutingPolicyView.vue'), meta: { title: '路径规划策略' } },
|
||||
{ path: 'config/vehicle', name: 'admin-config-vehicle', component: () => import('@/views/admin/config/VehicleMaintenanceView.vue'), meta: { title: '车辆维护策略' } },
|
||||
{ path: 'config/vehicle-hub', name: 'admin-vehicle-hub', component: () => import('@/views/shared/VehicleHubView.vue'), meta: { title: '车辆运维' } },
|
||||
{ path: 'vehicle-hub', redirect: '/admin/config/vehicle-hub' },
|
||||
// 旧独立配置页已合并进车辆运维 Tab,保留深链接兼容。
|
||||
{ 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: () => import('@/views/admin/config/ChargePolicyView.vue'), meta: { title: '充电逻辑' } },
|
||||
{ path: 'config/task', name: 'admin-config-task', component: () => import('@/views/admin/config/TaskAllocationView.vue'), meta: { title: '任务分配' } },
|
||||
{ path: 'config/traffic', name: 'admin-config-traffic', component: () => import('@/views/admin/config/TrafficRuleView.vue'), meta: { title: '交通管制' } },
|
||||
{ path: 'config/auth', name: 'admin-config-auth', component: () => import('@/views/admin/config/AuthRoleView.vue'), meta: { title: '权限角色' } },
|
||||
{ path: 'config/device', name: 'admin-config-device', component: () => import('@/views/admin/config/DeviceHubView.vue'), meta: { title: '设备接入' } },
|
||||
{ path: 'config/fleet', name: 'admin-config-fleet', component: () => import('@/views/admin/config/FleetLifecycleView.vue'), meta: { title: '车队生命周期' } },
|
||||
{ path: 'config/scenario', name: 'admin-config-scenario', component: () => import('@/views/admin/config/ScenarioTemplateView.vue'), meta: { title: '场景模板' } },
|
||||
{ path: 'config/location', name: 'admin-config-location', component: () => import('@/views/admin/config/LocationView.vue'), meta: { title: '库位管理' } },
|
||||
{ path: 'config/ops', name: 'admin-config-ops', component: () => import('@/views/admin/config/OpsConfigView.vue'), meta: { title: '运营维护' } },
|
||||
|
||||
@@ -1657,3 +1657,134 @@ a:hover { color: rgba(var(--mg-accent-rgb), 0.85); }
|
||||
border-color: #7c3aed !important;
|
||||
color: #5b21b6 !important;
|
||||
}
|
||||
|
||||
/* ─────────────────────────────────────────────────────────────────────────
|
||||
* fame-lavender × 地图编辑器深紫沉浸 UI(MapEditorView)
|
||||
* 侧栏 / 属性面板 / 工具轨保持深紫底 + 浅字。全局浅紫规则会把 .mg-content 内
|
||||
* el-form 标签、el-tabs 等改成深紫字 (#4a3d6e),在深底上出现「深底深字」看不清。
|
||||
* ───────────────────────────────────────────────────────────────────────── */
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page {
|
||||
--el-text-color-primary: rgba(232, 215, 245, 0.95);
|
||||
--el-text-color-regular: rgba(220, 200, 230, 0.88);
|
||||
--el-text-color-secondary: rgba(200, 180, 220, 0.72);
|
||||
color: rgba(232, 215, 245, 0.92);
|
||||
}
|
||||
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-form-item__label {
|
||||
color: rgba(220, 200, 230, 0.9) !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs {
|
||||
--el-text-color-primary: rgba(232, 215, 245, 0.95) !important;
|
||||
--el-text-color-regular: rgba(220, 200, 240, 0.75) !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs__item,
|
||||
:root[data-theme="fame-lavender"] .map-editor-page .el-tabs__item {
|
||||
color: rgba(220, 200, 240, 0.72) !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs__item:hover,
|
||||
:root[data-theme="fame-lavender"] .map-editor-page .el-tabs__item:hover {
|
||||
color: rgba(240, 225, 255, 0.95) !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs__item.is-active,
|
||||
:root[data-theme="fame-lavender"] .map-editor-page .el-tabs__item.is-active {
|
||||
color: #ffffff !important;
|
||||
font-weight: 600;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs__nav-wrap::after {
|
||||
background-color: rgba(255, 255, 255, 0.1) !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-tabs__active-bar {
|
||||
background: linear-gradient(90deg, rgba(170, 110, 250, 1) 0%, rgba(255, 110, 220, 1) 100%) !important;
|
||||
}
|
||||
|
||||
/* 图层 Tab:白底数据岛 + 深紫字(与属性面板输入框一致,避免白底叠浅字) */
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table.el-table {
|
||||
--el-table-bg-color: #ffffff;
|
||||
--el-table-tr-bg-color: #ffffff;
|
||||
--el-table-header-bg-color: #f5f3ff;
|
||||
--el-table-text-color: #1a0f3d;
|
||||
--el-table-header-text-color: #2d1b69;
|
||||
--el-table-row-hover-bg-color: #ede9fe;
|
||||
--el-table-border-color: #e0d4f5;
|
||||
--el-fill-color-blank: #ffffff;
|
||||
--el-fill-color-light: #faf7fd;
|
||||
color: #1a0f3d !important;
|
||||
background: #ffffff !important;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 0 0 1px rgba(124, 58, 237, 0.14);
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table.el-table,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table.el-table tr,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table .el-table__inner-wrapper {
|
||||
background: #ffffff !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table th.el-table__cell {
|
||||
background: #f5f3ff !important;
|
||||
color: #2d1b69 !important;
|
||||
font-weight: 600 !important;
|
||||
border-bottom-color: #e0d4f5 !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table td.el-table__cell {
|
||||
background: #ffffff !important;
|
||||
color: #1a0f3d !important;
|
||||
font-weight: 500 !important;
|
||||
border-bottom-color: #f0eaf6 !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table .cell {
|
||||
color: #1a0f3d !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table.el-table--striped .el-table__body tr:nth-child(2n) td.el-table__cell {
|
||||
background: #faf7fd !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .layer-table tr:hover > td.el-table__cell {
|
||||
background: #ede9fe !important;
|
||||
}
|
||||
|
||||
/* 新建图层行:白底深字 + 占位符可读 */
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .new-layer .el-input__inner {
|
||||
color: #1a0f3d !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .new-layer .el-input__inner::placeholder {
|
||||
color: #7a6b9a !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .new-layer .el-input-group__append .el-button {
|
||||
background: #f5f3ff !important;
|
||||
border-color: #ddd6fe !important;
|
||||
color: #5b21b6 !important;
|
||||
font-weight: 600 !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .new-layer .el-input-group__append .el-button:hover {
|
||||
background: #ede9fe !important;
|
||||
border-color: #a78bfa !important;
|
||||
color: #5b21b6 !important;
|
||||
}
|
||||
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .el-checkbox__label {
|
||||
color: rgba(220, 200, 230, 0.88) !important;
|
||||
}
|
||||
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .prop-card-flag,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .prop-card-flag-text {
|
||||
color: rgba(200, 220, 255, 0.88) !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .prop-card-flag.is-synced,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .prop-card-flag.is-synced .prop-card-flag-text {
|
||||
color: rgba(220, 255, 230, 0.98) !important;
|
||||
}
|
||||
|
||||
/* 属性面板内输入框仍用白底深字(与组件 scoped 设计一致),仅修正标签/Tab 等说明文字 */
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .el-input__wrapper,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .el-textarea__inner,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .el-select .el-input__wrapper {
|
||||
background: #ffffff !important;
|
||||
box-shadow: 0 0 0 1px rgba(170, 110, 250, 0.28) inset !important;
|
||||
}
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .el-input__inner,
|
||||
:root[data-theme="fame-lavender"] .mg-content .map-editor-page .edit-property-panel .el-textarea__inner {
|
||||
color: #1a0f3d !important;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
:scope="auth.scope ?? 'Platform'"
|
||||
:token="auth.token ?? ''"
|
||||
:read-only="!!readOnly"
|
||||
:embed-ui="true"
|
||||
:canvas-only="true"
|
||||
:hide-toolbar="true"
|
||||
@pick="onPick"
|
||||
@select="onSelect"
|
||||
@ready="onWorkspaceReady"
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
<template>
|
||||
<div class="vehicle-hub-page">
|
||||
<el-tabs v-model="activeTab" class="hub-tabs">
|
||||
<el-tab-pane name="overview" label="运维总览">
|
||||
<div class="overview-pane">
|
||||
<div class="hub-toolbar">
|
||||
<div class="stats-row">
|
||||
<div class="stat">
|
||||
@@ -73,13 +76,31 @@
|
||||
|
||||
<p class="footnote">故障率 = 报警占用时长 ÷ 自上线以来运行时长(SimpleLite 进程内累计)</p>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane name="maintenance" label="维护策略" lazy>
|
||||
<div class="config-pane">
|
||||
<VehicleMaintenanceView />
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane name="fleet" label="车队生命周期" lazy>
|
||||
<div class="config-pane">
|
||||
<FleetLifecycleView />
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ref } from 'vue'
|
||||
import { computed, ref, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { Search, Refresh, ArrowDown } from '@element-plus/icons-vue'
|
||||
import VehicleHealthCard from '@/components/fleet/VehicleHealthCard.vue'
|
||||
import VehicleMaintenanceView from '@/views/admin/config/VehicleMaintenanceView.vue'
|
||||
import FleetLifecycleView from '@/views/admin/config/FleetLifecycleView.vue'
|
||||
import { useVehicleHub } from '@/composables/useVehicleHub'
|
||||
import { setVehicleMaintenance, type VehicleMaintenanceMode } from '@/api/vehicleOps'
|
||||
import type { CarState } from '@/types/car'
|
||||
@@ -88,6 +109,24 @@ import { useAuthStore } from '@/stores/auth'
|
||||
const auth = useAuthStore()
|
||||
const canWrite = computed(() => auth.scope === 'Platform' || (auth.effectivePermissions?.allowedOps ?? []).includes('*'))
|
||||
|
||||
// Tab 与 URL ?tab= 同步,支持深链接(旧 /config/vehicle、/config/fleet 已下线,统一进车辆运维)。
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const TAB_NAMES = ['overview', 'maintenance', 'fleet'] as const
|
||||
type TabName = (typeof TAB_NAMES)[number]
|
||||
function readTab(): TabName {
|
||||
const q = route.query.tab
|
||||
return typeof q === 'string' && (TAB_NAMES as readonly string[]).includes(q) ? (q as TabName) : 'overview'
|
||||
}
|
||||
const activeTab = ref<TabName>(readTab())
|
||||
watch(activeTab, (t) => {
|
||||
if (route.query.tab !== t) router.replace({ query: { ...route.query, tab: t } })
|
||||
})
|
||||
watch(() => route.query.tab, () => {
|
||||
const next = readTab()
|
||||
if (next !== activeTab.value) activeTab.value = next
|
||||
})
|
||||
|
||||
const {
|
||||
cardModels,
|
||||
loading,
|
||||
@@ -157,6 +196,42 @@ async function onBatchCommand(cmd: string) {
|
||||
<style scoped>
|
||||
.vehicle-hub-page {
|
||||
padding: 16px;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hub-tabs {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__content) {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
:deep(.el-tab-pane) {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
:deep(.el-tabs__item) {
|
||||
color: var(--mg-text-muted, rgba(255, 255, 255, 0.65));
|
||||
}
|
||||
:deep(.el-tabs__item.is-active) {
|
||||
color: var(--mg-text-light, #fff);
|
||||
}
|
||||
:deep(.el-tabs__active-bar) {
|
||||
background-color: var(--mg-accent, var(--el-color-primary));
|
||||
}
|
||||
:deep(.el-tabs__nav-wrap::after) {
|
||||
background-color: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
|
||||
.overview-pane {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -164,6 +239,11 @@ async function onBatchCommand(cmd: string) {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.config-pane {
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.hub-toolbar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
Reference in New Issue
Block a user