# 数字孪生系统场景拆分实施方案 ## 一、现状分析 ### 1.1 现有代码结构 | 文件 | 行数 | 功能 | 所属场景 | |------|------|------|----------| | `IndustrialDashboard.tsx` | 1627行 | 监控大屏 + 3D模型渲染 | 氧化铝 | | `DigitalTwin.tsx` | 1462行 | 数字孪生制作系统 | 氧化铝 | ### 1.2 现有设备模型 **IndustrialDashboard.tsx (13个模型函数)**: ``` createReactor - 溶出反应器 createTank - 沉降槽 createPump - 循环泵 createFurnace - 焙烧炉 createHeatExchanger - 换热器 createStorage - 原料储罐 createSlurryTank - 泥浆槽(来自DigitalTwin) createPressureVessel - 压力容器(来自DigitalTwin) createSettlingTankDT - 沉降槽DT版(来自DigitalTwin) createDecompositionTower - 分解塔(来自DigitalTwin) createEvaporator - 蒸发器(来自DigitalTwin) createCalcinationFurnace - 煅烧炉(来自DigitalTwin) createPipeSystem - 管道系统 ``` **DigitalTwin.tsx (7个模型函数)**: ``` createSlurryTank - 泥浆槽 createPressureVessel - 压力容器 createSettlingTank - 沉降槽 createDecompositionTower - 分解塔 createEvaporator - 蒸发器 createCalcinationFurnace - 煅烧炉 createPipingSystem - 管道系统 ``` ### 1.3 问题总结 1. **场景混淆**:文档描述钢铁+有色冶金两个行业,但代码只有氧化铝 2. **代码重复**:DigitalTwin的模型被复制到IndustrialDashboard 3. **设备冗余**:同一个设备有多个版本(如SettlingTank vs SettlingTankDT) 4. **维护困难**:修改一个模型需要改多处 --- ## 二、拆分方案 ### 2.1 目标架构 ``` src/app/ ├── components/ │ └── shared/ # ⭐ 新建:共享组件 │ ├── scene/ # 共享3D场景组件 │ │ ├── SceneSetup.tsx # 相机、灯光、地面 │ │ ├── CameraControls.tsx # 相机控制逻辑 │ │ └── PipeSystem.tsx # 管道系统组件 │ ├── models/ # 共享3D模型 │ │ ├── base/ # 基础模型(反应器、储罐等) │ │ └── pipes/ # 管道连接件 │ └── ui/ # 共享UI组件 │ ├── DevicePanel.tsx # 设备详情面板 │ ├── StatusBar.tsx # 状态栏 │ └── AlertList.tsx # 告警列表 │ ├── pages/ │ ├── alumina/ # ⭐ 新建:铝冶炼场景 │ │ ├── AluminaDashboard.tsx # 氧化铝监控大屏(改造自IndustrialDashboard) │ │ ├── AluminaDigitalTwin.tsx # 氧化铝数字孪生(改造自DigitalTwin) │ │ └── devices/ # 铝冶炼专用设备模型 │ │ ├── SlurryTank.ts │ │ ├── PressureVessel.ts │ │ ├── SettlingTank.ts │ │ ├── DecompositionTower.ts │ │ ├── Evaporator.ts │ │ └── CalcinationFurnace.ts │ │ │ ├── steel/ # ⭐ 新建:钢铁场景 │ │ ├── SteelDashboard.tsx # 钢铁监控大屏 │ │ ├── SteelDigitalTwin.tsx # 钢铁数字孪生 │ │ └── devices/ # 钢铁专用设备模型 │ │ ├── BlastFurnace.ts # 高炉 │ │ ├── HotBlastStove.ts # 热风炉 │ │ ├── AirBlower.ts # 鼓风机 │ │ ├── CoolingWall.ts # 冷却壁 │ │ ├── CoalMill.ts # 磨煤机 │ │ └── FeedConveyor.ts # 给煤机 │ │ │ └── legacy/ # ⭐ 保留:旧文件(可后续删除) │ ├── IndustrialDashboard.tsx │ └── DigitalTwin.tsx ``` ### 2.2 共享模块设计 #### 2.2.1 共享3D场景组件 **SceneSetup.tsx** - 场景初始化 ```typescript interface SceneSetupProps { containerRef: RefObject; cameraPosition?: [number, number, number]; lookAt?: [number, number, number]; autoRotate?: boolean; onSceneReady?: (scene: THREE.Scene, camera: THREE.PerspectiveCamera) => void; } ``` **CameraControls.tsx** - 相机控制 ```typescript interface CameraControlsProps { camera: THREE.PerspectiveCamera; autoRotate: boolean; onToggleRotate?: () => void; onResetView?: () => void; } ``` #### 2.2.2 共享UI组件 **DevicePanel.tsx** - 设备详情面板 ```typescript interface DevicePanelProps { device: DeviceData | null; onClose: () => void; } ``` **AlertList.tsx** - 告警列表 ```typescript interface AlertListProps { alerts: AlertItem[]; onAlertClick?: (alert: AlertItem) => void; } ``` ### 2.3 场景专用模块设计 #### 2.3.1 铝冶炼场景设备模型 | 设备 | 文件 | 描述 | |------|------|------| | 泥浆槽 | `SlurryTank.ts` | 带搅拌器和叶轮的圆柱形槽体 | | 压力容器 | `PressureVessel.ts` | 带圆顶和管道的压力容器 | | 沉降槽 | `SettlingTank.ts` | 带锥形底部的沉降槽 | | 分解塔 | `DecompositionTower.ts` | 带夹套和盘管的塔式设备 | | 蒸发器 | `Evaporator.ts` | 带管束和冷凝器的蒸发设备 | | 煅烧炉 | `CalcinationFurnace.ts` | 带炉膛和烟囱的煅烧炉 | #### 2.3.2 钢铁场景设备模型(待实现) | 设备 | 文件 | 描述 | |------|------|------| | 高炉 | `BlastFurnace.ts` | 核心冶炼设备,圆柱形炉体 | | 热风炉 | `HotBlastStove.ts` | 预热鼓风的设备 | | 鼓风机 | `AirBlower.ts` | 提供冶炼用空气 | | 冷却壁 | `CoolingWall.ts` | 高炉冷却系统 | | 磨煤机 | `CoalMill.ts` | 煤粉制备设备 | | 给煤机 | `FeedConveyor.ts` | 煤粉输送设备 | --- ## 三、实施步骤 ### 阶段一:基础设施(共享模块) **步骤1.1**:创建共享目录结构 ``` mkdir -p src/app/components/shared/{scene,models/base,models/pipes,ui} ``` **步骤1.2**:实现 SceneSetup.tsx - 提取场景初始化逻辑(相机、灯光、地面、渲染器) - 统一 Three.js 版本和配置 **步骤1.3**:实现 CameraControls.tsx - 提取相机旋转逻辑(360度旋转实现) - 统一的缩放、重置视角逻辑 **步骤1.4**:实现共享UI组件 - DevicePanel.tsx - StatusBar.tsx - AlertList.tsx ### 阶段二:铝冶炼场景(改造) **步骤2.1**:创建 AluminaDashboard.tsx - 引用共享 SceneSetup - 保留现有的17个氧化铝设备 - 保留现有的监控面板 **步骤2.2**:创建设备模型文件 ``` src/app/pages/alumina/devices/ ├── SlurryTank.ts # 从DigitalTwin提取 ├── PressureVessel.ts # 从DigitalTwin提取 ├── SettlingTank.ts # 从DigitalTwin提取 ├── DecompositionTower.ts ├── Evaporator.ts └── CalcinationFurnace.ts ``` **步骤2.3**:创建 AluminaDigitalTwin.tsx - 引用共享 SceneSetup - 保留现有的数字孪生编辑功能 ### 阶段三:钢铁场景(新建) **步骤3.1**:创建设备模型 ``` src/app/pages/steel/devices/ ├── BlastFurnace.ts ├── HotBlastStove.ts ├── AirBlower.ts ├── CoolingWall.ts ├── CoalMill.ts └── FeedConveyor.ts ``` **步骤3.2**:创建 SteelDashboard.tsx - 参考 AluminaDashboard 结构 - 使用钢铁设备模型 **步骤3.3**:创建设备数据 ```typescript const steelDeviceList = [ { id: "bf-1", name: "1号高炉", type: "blastFurnace", position: [0, 5, 0], ... }, { id: "hbs-1", name: "1号热风炉", type: "hotBlastStove", position: [-5, 3, 0], ... }, // ... ]; ``` ### 阶段四:路由和菜单整合 **步骤4.1**:更新路由配置(routes.tsx) ```typescript // 新路由结构 { path: '/alumina/dashboard', component: AluminaDashboard }, { path: '/alumina/digital-twin', component: AluminaDigitalTwin }, { path: '/steel/dashboard', component: SteelDashboard }, { path: '/steel/digital-twin', component: SteelDigitalTwin }, ``` **步骤4.2**:更新菜单(RootLayout.tsx) ``` ├── 铝冶炼 │ ├── 监控大屏 │ └── 数字孪生 └── 钢铁 ├── 监控大屏 └── 数字孪生 ``` --- ## 四、关键文件映射 ### 4.1 IndustrialDashboard.tsx 拆分 | 原函数/组件 | 目标位置 | 说明 | |------------|----------|------| | createReactor | alumina/devices/Reactor.ts | 溶出反应器 | | createTank | alumina/devices/Tank.ts | 沉降槽 | | createPump | alumina/devices/Pump.ts | 循环泵 | | createFurnace | alumina/devices/Furnace.ts | 焙烧炉 | | createHeatExchanger | shared/models/base/HeatExchanger.ts | 换热器(通用) | | createStorage | shared/models/base/Storage.ts | 储罐(通用) | | createSlurryTank | alumina/devices/SlurryTank.ts | 泥浆槽 | | createPressureVessel | alumina/devices/PressureVessel.ts | 压力容器 | | createSettlingTankDT | alumina/devices/SettlingTank.ts | 沉降槽 | | createDecompositionTower | alumina/devices/DecompositionTower.ts | 分解塔 | | createEvaporator | alumina/devices/Evaporator.ts | 蒸发器 | | createCalcinationFurnace | alumina/devices/CalcinationFurnace.ts | 煅烧炉 | | createPipeSystem | shared/scene/PipeSystem.tsx | 管道系统 | | 场景初始化 | shared/scene/SceneSetup.tsx | 相机、灯光等 | | 相机旋转逻辑 | shared/scene/CameraControls.tsx | 360度旋转 | ### 4.2 DigitalTwin.tsx 拆分 | 原函数/组件 | 目标位置 | 说明 | |------------|----------|------| | createSlurryTank | alumina/devices/SlurryTank.ts | 与ID共享 | | createPressureVessel | alumina/devices/PressureVessel.ts | 与ID共享 | | createSettlingTank | alumina/devices/SettlingTank.ts | 替换DT版 | | createDecompositionTower | alumina/devices/DecompositionTower.ts | 与ID共享 | | createEvaporator | alumina/devices/Evaporator.ts | 与ID共享 | | createCalcinationFurnace | alumina/devices/CalcinationFurnace.ts | 与ID共享 | | createPipingSystem | shared/scene/PipeSystem.tsx | 与ID共享 | | 工厂/场景/模型管理 | alumina/AluminaDigitalTwin.tsx | 保留 | | 左侧边栏 | shared/ui/ModelLibrary.tsx | 提取为共享 | --- ## 五、数据流设计 ### 5.1 设备数据接口(统一) ```typescript // 共享设备数据类型 interface DeviceData { id: string; name: string; type: string; // 设备类型(如"blastFurnace"、"slurryTank") industry: "steel" | "alumina"; // ⭐ 新增:行业标识 position: [number, number, number]; status: "running" | "warning" | "stopped"; temperature: number; pressure: number; flow: number; efficiency: number; color: number; } ``` ### 5.2 场景切换机制 ```typescript // 场景上下文 const IndustryContext = createContext<{ industry: "steel" | "alumina"; setIndustry: (industry: "steel" | "alumina") => void; }>(null); // 设备列表根据行业加载 const deviceList = useMemo(() => { return industry === "steel" ? steelDevices : aluminaDevices; }, [industry]); ``` --- ## 六、测试计划 ### 6.1 单元测试 - 每个设备模型渲染测试 - 共享组件功能测试 ### 6.2 集成测试 - 铝冶炼场景完整流程 - 钢铁场景完整流程 - 场景切换测试 ### 6.3 性能测试 - 17个设备同时渲染 - 60fps 相机旋转 - 内存占用监测 --- ## 七、风险评估 | 风险 | 影响 | 缓解措施 | |------|------|----------| | 改动范围大 | 可能引入bug | 分阶段实施,每阶段验证 | | 代码重复 | 维护成本增加 | 充分提取共享模块 | | 钢铁设备模型缺失 | 功能不完整 | 先完成铝冶炼,后续补充 | | 路由变更 | 旧链接失效 | 保持向后兼容或做重定向 | --- ## 八、预计工作量 | 阶段 | 内容 | 优先级 | |------|------|--------| | 阶段一 | 共享基础设施 | P0(必须先完成) | | 阶段二 | 铝冶炼场景改造 | P0 | | 阶段三 | 钢铁场景新建 | P1 | | 阶段四 | 路由菜单整合 | P0 | --- **文档版本**:V1.0 **创建日期**:2026-04-08 **状态**:待审批