Skip to content

Commit 166556e

Browse files
authored
fix(frontend): unify module workbench routes
Use UUID-safe runtime headers for frontend API calls and route Digital Twin through the shared /app/modules workbench. Retire the standalone /app/digital-twin page/component and align architecture docs with the unified module workbench boundary.
1 parent f023e4d commit 166556e

11 files changed

Lines changed: 53 additions & 882 deletions

File tree

02-architecture/BUSINESS_MODULE_WORKBENCH.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
- 文件/审批/审计右侧面板可折叠,不得遮挡主业务区。
4141
- 主题是平台能力,不是模块硬编码。默认主题是 `wechat_light` 微信同款;内置 `industrial_dark` 科幻魔法可切换。
4242
- `/app/modules/digital_twin` 必须与其它模块使用同一平台 Shell、同一 CDE 文件工作台、同一右侧业务对象/操作队列、同一抽屉、审批、生命周期和 AI 助手。模块入口不得嵌入孤立数字孪生大屏。
43-
- 专用数字孪生驾驶舱可保留在独立 `/app/digital-twin`,但它是专业可视化工作面,不是 14 模块工作台的默认详情页
43+
- 独立 `/app/digital-twin` 不再作为产品入口保留;数字孪生统一使用 `/app/modules/digital_twin`,避免 14 模块工作台和专用大屏分裂
4444

4545
---
4646

@@ -332,7 +332,7 @@ request_approval, approve, reject, archive, reopen, block, resolve_blocker
332332
5. 功能卡片、模块操作、artifact 详情、交付物按钮和 AI 助手点击后会改变 UI 状态或写入审计。
333333
6. 左键打开文件/文件夹,右键 12 个文件操作具备真实前端状态变化。
334334
7. 生命周期事务、审批、状态机通过 `ModuleBackendAdapter` 运行。
335-
8. 所有模块共享统一设计系统和全局主题;`/app/modules/digital_twin` 必须与其它模块保持同一 CDE 文件工作台结构。专用 `/app/digital-twin` 可以包含高对比模型画布,但不得污染模块工作台入口
335+
8. 所有模块共享统一设计系统和全局主题;`/app/modules/digital_twin` 必须与其它模块保持同一 CDE 文件工作台结构。不得新增独立 `/app/digital-twin` 大屏入口来替代模块工作台
336336
9. `npm run lint` / `npm run typecheck` / `npm test -- --run` / `npm run build` 或对应 `bun run` 命令通过。
337337

338338
---
@@ -343,7 +343,7 @@ request_approval, approve, reject, archive, reopen, block, resolve_blocker
343343

344344
- 平台采用统一设计系统: 默认 `wechat_light` 微信同款,并通过 `ThemeSwitcher` 切换 `industrial_dark` 科幻魔法。
345345
- 普通模块与数字孪生模块共用紧凑 rail、CDE 文件系统、右侧业务对象/操作队列、抽屉、审批、生命周期、状态机、Adapter 和 AI 助手。
346-
- `/app/modules/digital_twin` 不再嵌入 `DigitalTwinWorkbench`;它和其它模块一样显示 `ModuleFileExplorer``DigitalTwinWorkbench` 仅用于独立 `/app/digital-twin` 专业驾驶舱
346+
- `/app/modules/digital_twin` 不再嵌入独立大屏组件;它和其它模块一样显示 `ModuleFileExplorer`独立 `/app/digital-twin` 路由已退役,数字孪生入口统一为 `/app/modules/digital_twin`
347347
- 本地上传通过 Next.js API route 落到 `03-frontend/.architoken/uploads/`,元数据记录在 `03-frontend/.architoken/uploads/index.json`
348348
- 上传文件自动写入 `ModuleBackendAdapter.uploadLocalFile`,生成模块文件节点、导入事务、Schema 校验状态、待审批状态和审计事件。
349349
- 当前 runtime 是前端本地开发 runtime,不是最终生产存储。后续应迁移到 Rust API + `ObjectStore` + `StorageRouter` 能力层,并保持同一 adapter contract。

02-architecture/DIGITAL_TWIN.md

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
**文档编号**: ARCHITOKEN-DIGITAL-TWIN-V1
44
**模块 id**: `digital_twin`
55
**所属架构**: 14 modules registry · [`MODULES.md`](./MODULES.md)
6-
**状态**: active prototype · standalone HMI cockpit
6+
**状态**: active prototype · unified module workbench
77
**定稿日期**: 2026-04-24
88
**适用范围**: 重钢结构项目的设计、制造、物流、吊装、检测、归档与运维数字孪生
9-
**页面边界**: `/app/modules/digital_twin` 是统一 CDE 模块工作台; `/app/digital-twin` 是独立 HMI / SCADA / CIM 数字孪生驾驶舱
9+
**页面边界**: `/app/modules/digital_twin` 是唯一数字孪生产品入口,并且必须使用统一 CDE 模块工作台
1010

1111
---
1212

@@ -15,7 +15,7 @@
1515
本模块必须按文档先行方式开发。任何前端、后端、Agent、数据表或测试变更,都必须能回溯到本文中的需求编号。
1616

1717
1. **模块优先**: 统一使用 `digital_twin` 模块 id,并服从 14 模块统一工作台契约。
18-
2. **独立驾驶舱优先**: `/app/digital-twin` 的默认交互形态是 HMI / SCADA / CIM 数字孪生驾驶舱,不是营销卡片页
18+
2. **统一入口优先**: 数字孪生只使用 `/app/modules/digital_twin`。不得再用 `/app/digital-twin` 提供与 14 模块工作台不同步的独立页面
1919
3. **重钢优先**: 页面和数据必须面向重钢结构,覆盖钢柱、钢梁、桁架、连廊、焊缝、螺栓、吊装、堆场、工厂加工和物流。
2020
4. **文档可测**: 每条关键需求必须有前端 fixture、单元测试或 E2E 验证之一。
2121
5. **实景分层**: 3DGS、点云、BIM、IoT、仿真、流程和风险必须分层表达,不得混成一个概念。
@@ -55,28 +55,19 @@
5555

5656
## 4. UI 信息架构
5757

58-
### 4.1 独立桌面驾驶舱
58+
### 4.1 统一模块工作台
5959

60-
`/app/digital-twin` 桌面宽屏必须采用 HMI / SCADA / CIM 驾驶舱结构:
60+
`/app/modules/digital_twin` 必须采用 14 模块统一 Shell:
6161

6262
| 区域 | 必须内容 |
6363
|------|----------|
64-
| 顶部状态栏 | 模型深化、制造节拍、物流到场、吊装阻断、交付包、孪生就绪度 |
65-
| 左侧目录树 | 9 个工程生命期节点,支持选中当前作业包 |
66-
| 中央主视图 | 重钢构件加工、物流、堆场、吊装、连廊风险、3DGS 影像实景、点云 E57 校核 |
67-
| 右侧监控 | 视觉监控、传感报警、质量门禁、导出清单 |
68-
| 底部模块坞 | 综合全览、大纲目录树、零代码编排、蓝图编辑器、孪生编辑器、设备详情 |
64+
| 左侧模块 rail | 14 个模块同一顺序、同一展开/收起行为 |
65+
| 业务目录 | 数字孪生、IFC、GLB、点云、360、三维扫描、倾斜摄影、WebGPU 快照 |
66+
| 主工作区 | 文件列表、预览抽屉、轻量化查看器、生命周期事务、审批与审计 |
67+
| 右侧队列 | 业务对象、生命周期、审批、审计、AI 建议和操作队列 |
68+
| 操作按钮 | 新建、上传、刷新、文件右键菜单、预览、分享、软删除、属性 |
6969

70-
### 4.2 独立驾驶舱移动端
71-
72-
移动端允许纵向堆叠,但必须保留以下顺序:
73-
74-
1. 标题与关键指标。
75-
2. 项目大纲目录树。
76-
3. 钢构统计。
77-
4. 中央孪生主视图。
78-
5. 功能模块坞。
79-
6. 监控、报警、门禁、导出。
70+
历史独立 HMI / SCADA / CIM 驾驶舱页面已退役,其数据与可视化能力应作为数字孪生模块内的功能面板、文件预览或可配置视图提供。
8071

8172
---
8273

@@ -130,7 +121,7 @@
130121

131122
| 编号 | 验收项 | 验证方式 |
132123
|------|--------|----------|
133-
| DT-AC-001 | `/app/digital-twin` 必须是 HMI / SCADA / CIM 驾驶舱风格; `/app/modules/digital_twin` 必须仍是统一 CDE 模块工作台 | Playwright screenshot |
124+
| DT-AC-001 | `/app/modules/digital_twin` 必须是唯一数字孪生入口,并且必须仍是统一 CDE 模块工作台 | Playwright screenshot |
134125
| DT-AC-002 | `digital_twin` fixture 必须包含 9 个工程生命期节点 | Vitest |
135126
| DT-AC-003 | 3DGS source 必须明确来自 video / photo / 360 等影像来源,并声明 LiDAR/E57 只做控制点或残差校核 | Vitest |
136127
| DT-AC-004 | 必须包含焊缝、螺栓、吊装、点云残差、IFC/IDS、形性一体门禁 | Vitest |
@@ -143,10 +134,10 @@
143134

144135
| 文档需求 | 实现文件 |
145136
|----------|----------|
146-
| UI 信息架构 | [`../03-frontend/components/DigitalTwinWorkbench.tsx`](../03-frontend/components/DigitalTwinWorkbench.tsx) |
137+
| UI 信息架构 | [`../03-frontend/components/ModuleWorkbenchShell.tsx`](../03-frontend/components/ModuleWorkbenchShell.tsx), [`../03-frontend/components/ModuleFileExplorer.tsx`](../03-frontend/components/ModuleFileExplorer.tsx) |
147138
| 数据契约 | [`../03-frontend/lib/digital-twin.ts`](../03-frontend/lib/digital-twin.ts) |
148139
| 验收测试 | [`../03-frontend/lib/digital-twin.test.ts`](../03-frontend/lib/digital-twin.test.ts) |
149-
| 独立驾驶舱入口 | [`../03-frontend/app/app/digital-twin/page.tsx`](../03-frontend/app/app/digital-twin/page.tsx) |
140+
| 模块工作台入口 | [`../03-frontend/app/app/modules/[moduleId]/page.tsx`](../03-frontend/app/app/modules/%5BmoduleId%5D/page.tsx) |
150141
| 模块工作台入口 | [`../03-frontend/app/app/modules/[moduleId]/page.tsx`](../03-frontend/app/app/modules/[moduleId]/page.tsx), [`../03-frontend/components/ModuleFileExplorer.tsx`](../03-frontend/components/ModuleFileExplorer.tsx) |
151142

152143
---

02-architecture/MODULES.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ ArchIToken = AEC AI-Native + Harness Engineering + OpenBIM CDE Workflow OS
236236
承接施工管理输出的 IFC4.3 / MBD、3DGS 影像实景、LiDAR/E57 点云校核、IoT/SCADA、FEA/ROM 形性一体与流程孪生数据。
237237
3DGS 只表示影像/视频/360 全景重建实景层,点云用于控制点和残差校核,二者必须分层表达。
238238
`/app/modules/digital_twin` 必须与其它模块一样使用统一 CDE 文件工作台、生命周期、审批、审计和右侧业务对象队列。
239-
专用 HMI / SCADA / CIM 驾驶舱保留在独立 `/app/digital-twin`,作为专业可视化工作面
239+
独立 `/app/digital-twin` 不再作为产品入口保留;所有数字孪生业务统一进入 `/app/modules/digital_twin`
240240
详细 UI 信息架构、数据契约、标准基线与验收标准见模块契约文档。
241241
- **inputs**: `[construction_management, detailed_design]`
242242
- **outputs**: `[digital_archive]`

03-frontend/app/app/dev/api-lab/page.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@
44
// License: Apache-2.0
55

66
import { useState } from 'react';
7-
import { ARCHITOKEN_API_BASE_URL, setBackendRequestContext } from '@/lib/backend-api';
7+
import {
8+
ARCHITOKEN_API_BASE_URL,
9+
DEFAULT_RUNTIME_ACTOR,
10+
DEFAULT_RUNTIME_PROJECT_ID,
11+
DEFAULT_RUNTIME_ROLES,
12+
DEFAULT_RUNTIME_TENANT_ID,
13+
setBackendRequestContext,
14+
} from '@/lib/backend-api';
815
import { activeModuleIds } from '@/lib/module-registry';
916
import { artifactClient, type Artifact } from '@/lib/artifact-client';
1017
import { generationClient, type GenerationJob } from '@/lib/generation-client';
@@ -31,10 +38,10 @@ function describeError(error: unknown): string {
3138
}
3239

3340
export default function ApiLabPage() {
34-
const [tenantId, setTenantId] = useState('dev-tenant');
35-
const [projectId, setProjectId] = useState('dev-project');
36-
const [actor, setActor] = useState('frontend-api-lab');
37-
const [rolesText, setRolesText] = useState('admin');
41+
const [tenantId, setTenantId] = useState(DEFAULT_RUNTIME_TENANT_ID);
42+
const [projectId, setProjectId] = useState(DEFAULT_RUNTIME_PROJECT_ID);
43+
const [actor, setActor] = useState(DEFAULT_RUNTIME_ACTOR);
44+
const [rolesText, setRolesText] = useState(DEFAULT_RUNTIME_ROLES.join(','));
3845
const [capabilities, setCapabilities] = useState<RuntimeCapabilities | null>(null);
3946
const [moduleCatalog, setModuleCatalog] = useState<ModuleCatalogResponse | null>(null);
4047
const [job, setJob] = useState<GenerationJob | null>(null);

03-frontend/app/app/digital-twin/page.tsx

Lines changed: 0 additions & 15 deletions
This file was deleted.

03-frontend/app/app/projects/page.tsx

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,9 @@
44

55
import { useQuery } from '@tanstack/react-query';
66
import Link from 'next/link';
7-
import { api, type ModuleId, type Project } from '@/lib/api';
7+
import { api, type Project } from '@/lib/api';
88
import { getModuleSpec } from '@/lib/module-registry';
99

10-
const MODULE_LABELS: Record<ModuleId, string> = {
11-
marketing_service: '市场客服',
12-
planning_management: '计划管理',
13-
concept_design: '方案设计',
14-
standard_library: '标准族库',
15-
detailed_design: '深化设计',
16-
quantity_costing: '计量造价',
17-
material_logistics: '材料物流',
18-
production_manufacturing: '生产制造',
19-
construction_management: '施工管理',
20-
digital_twin: '数字孪生',
21-
finance_hr: '财务人力',
22-
digital_archive: '数字档案',
23-
ai_center: 'AI中心',
24-
settings_center: '设置中心',
25-
};
26-
2710
export default function ProjectsPage() {
2811
const { data, isLoading, error } = useQuery({
2912
queryKey: ['projects'],
@@ -47,7 +30,7 @@ export default function ProjectsPage() {
4730
业务模块工作台
4831
</Link>
4932
<Link
50-
href="/app/digital-twin"
33+
href="/app/modules/digital_twin"
5134
className="border border-ink px-5 py-2 font-mono text-sm hover:bg-paper"
5235
>
5336
数字孪生工作台
@@ -103,7 +86,7 @@ function ProjectRow({ project }: { project: Project }) {
10386
)}
10487
</div>
10588
<div className="font-mono text-xs text-accent">
106-
{MODULE_LABELS[project.currentModuleId] ?? getModuleSpec(project.currentModuleId).zhName}
89+
{getModuleSpec(project.currentModuleId).zhName}
10790
</div>
10891
<div className="text-sm text-ink/70">{project.location ?? '—'}</div>
10992
<div className="text-sm text-right font-mono">

03-frontend/app/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ export default function HomePage() {
521521
BIM/IFC Viewer 负责工程语义和审查工作流。
522522
</p>
523523
<Link
524-
href="/app/digital-twin"
524+
href="/app/modules/digital_twin"
525525
className="mt-5 inline-flex items-center gap-2 bg-[#111817] px-5 py-3 text-sm font-semibold text-white transition-colors hover:bg-[#18a058]"
526526
>
527527
打开数字孪生工作台

0 commit comments

Comments
 (0)