JavaProjectRepo/business-css/新版本仿真计算方法.md
2026-03-19 11:18:15 +08:00

85 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 新版本仿真计算方法
新版本仿真计算采用 **SimController** 统一入口,通过 **SimDataFacade** 加载数据,**SimBuilder** 构建模型,**SimService** 执行核心计算,最终由 **SimResultConverter** 转换结果。相较于旧版本(`ProjectController` + `ProjectServiceImpl` + `DeviceInferService`),新架构职责更清晰,扩展性更强。
## 1. 核心流程
1. **入口**: `SimController.run(req)`
* 接收 `projectId`, `scenarioId`, `steps` 参数。
2. **数据加载**: `SimDataFacade.loadSimulationData`
* 加载 `Project` (拓扑), `Device` (设备列表), `Events` (场景事件)。
3. **模型构建**: `SimBuilder.buildUnits` & `buildEvents` & `buildInfluenceNodes`
* **Units**: 将设备和物料转换为 `SimUnit`,注入静态属性(包括从 `Device.size` 解析的几何尺寸,从 `Material` 表加载的物理化学属性)。
* **Events**: 将 `Event` 数据转换为 `SimEvent` 时间序列。
* **Influence**: 解析拓扑中的 `influence` 节点,构建 `SimInfluenceNode` 依赖关系图。
4. **核心计算**: `SimService.runSimulation`
* **初始化**: `t=0`,写入所有 `SimUnit` 的静态属性。
* **时间步推进**: `t=1` to `steps`
1. **Apply Events (Input)**: 应用普通设定值事件。
2. **Apply Influence**: 基于拓扑关系计算派生属性(如 `bias + coeff * source`)。
3. **Apply Events (Override)**: 应用强制覆盖事件(如故障注入)。
4. **Snapshot**: 保存当前步所有属性状态。
5. **结果转换**: `SimResultConverter.toFrames`
*`SimContext` 中的时间轴数据转换为前端所需的 Frame 结构。
* **补全静态属性**: 确保每一帧都包含设备的不变属性(如 `diameter`, `height`)。
* **封装元数据**: 添加 `projectId`, `scenarioId` 等信息,遵循统一响应格式。
## 2. 与旧版本对比
| 特性 | 旧版本 (`ProjectController` / `ProjectServiceImpl`) | 新版本 (`SimController` / `SimService`) |
| :--- | :--- | :--- |
| **架构模式** | 事务脚本模式,逻辑集中在 ServiceImpl | 领域模型模式,组件职责分离 (Builder, Engine, Facade) |
| **计算逻辑** | 混合了 JSON 解析、数据查询和硬编码公式 | 基于 `SimUnit`, `SimEvent`, `SimInfluenceNode` 的抽象模型计算 |
| **扩展性** | 难以扩展新设备类型或计算规则 | 易于扩展(只需修改 Builder 或 Engine 策略) |
| **数据完整性** | 容易遗漏属性(如 `size` 解析分散) | `SimBuilder` 集中处理属性注入,`ResultConverter` 保证输出完整 |
| **推理集成** | 强依赖 `DeviceInferService`,解析前端传入的 JSON | **按需集成**,直接基于仿真计算生成的 `SimContext` 数据进行推理 |
## 3. 关键组件详解
### 3.1 SimBuilder (模型构建)
负责将异构的原始数据JSON 拓扑、数据库实体)标准化为仿真计算单元。
* **多态尺寸解析**: `injectDeviceSize` 支持 `FlatTank`, `ExtractionColumn` 等多种设备几何解析。
* **全量物料属性**: `buildMaterialStaticFromDb` 加载所有物料理化性质。
### 3.2 SimService (计算引擎)
纯内存计算引擎,支持:
* **静态基线**: `t=0` 状态。
* **动态演变**: `Event` 驱动的状态变化。
* **级联影响**: 拓扑网络中的属性传播(支持延迟 `delay` 和系数 `coeff`)。
### 3.3 SimResultConverter (结果适配)
* **Frame 生成**: 将离散的 `SimContext` 转换为连续的动画帧。
* **数据补全**: 自动将 `staticProperties` 注入每一帧,解决前端渲染缺失静态参数的问题。
## 4. 推理调用与结果持久化优化 (New)
新版本针对推理接口调用和结果入表逻辑进行了深度优化,消除了对前端 JSON 格式的强依赖。
### 4.1 旧版本逻辑回顾
* **流程**: `ProjectController` -> `ProjectServiceImpl` -> `DeviceDataParser` -> `DeviceInferService` -> `Python API` -> `ScenarioResult` 表。
* **痛点**: 依赖前端传入的特定格式 JSON (`params`)`DeviceDataParser` 解析逻辑复杂且脆弱;推理逻辑与 Service 强耦合。
### 4.2 新版本优化方案
1. **直接基于 SimContext 推理**:
* 仿真计算完成后,直接从 `SimContext` 提取每一帧的属性状态,不再需要 `DeviceDataParser` 解析 JSON 字符串。
* `SimService` 提供 `getDeviceStateList(deviceId)` 方法,快速导出时序数据。
2. **组件化推理服务**:
* 引入 `SimInferService`,负责封装 `SimContext``InferRequest` 格式。
* 异步调用 Python 接口,提高系统响应速度。
3. **批量持久化**:
* 推理结果 (`Keff`, `features`) 统一封装为 `ScenarioResult` 列表,使用 `MyBatis-Plus``saveBatch` 异步写入,避免频繁数据库操作。
### 4.3 核心伪代码示例
```java
// 在 SimController 中调用
SimContext ctx = simService.runSimulation(units, events, nodes, steps);
// 异步执行推理并入表
simInferService.asyncInferAndSave(projectId, scenarioId, ctx, units);
```
## 5. 后续演进建议
1. **集成 Python 推理**: 目前 `SimService` 主要执行线性影响计算。如需复杂机理模型(如 Keff 计算),可在 `SimService` 中通过 `DeviceInferService` 调用 Python API。
2. **性能优化**: 对于长时序、大规模拓扑,`SimContext` 可优化为基于数组的存储,而非 Map。
3. **实时流式输出**: 支持 WebSocket 或 SSE实现边计算边推送。