feat(platform): 合并车辆运维页并优化 3D 画布嵌入体验

将维护策略与车队生命周期并入车辆运维 Tab,补充旧路由重定向与 RBAC 页面 key 迁移;改进 Workspace3D 就绪探测与 wwwroot 静态资源。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zhaowei.huang
2026-05-31 14:39:50 +08:00
co-authored by Cursor
parent be0503c535
commit e2269e430d
70 changed files with 504 additions and 162 deletions
@@ -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 {