5.5 KiB
5.5 KiB
新版本仿真计算方法
新版本仿真计算采用 SimController 统一入口,通过 SimDataFacade 加载数据,SimBuilder 构建模型,SimService 执行核心计算,最终由 SimResultConverter 转换结果。相较于旧版本(ProjectController + ProjectServiceImpl + DeviceInferService),新架构职责更清晰,扩展性更强。
1. 核心流程
- 入口:
SimController.run(req)- 接收
projectId,scenarioId,steps参数。
- 接收
- 数据加载:
SimDataFacade.loadSimulationData- 加载
Project(拓扑),Device(设备列表),Events(场景事件)。
- 加载
- 模型构建:
SimBuilder.buildUnits&buildEvents&buildInfluenceNodes- Units: 将设备和物料转换为
SimUnit,注入静态属性(包括从Device.size解析的几何尺寸,从Material表加载的物理化学属性)。 - Events: 将
Event数据转换为SimEvent时间序列。 - Influence: 解析拓扑中的
influence节点,构建SimInfluenceNode依赖关系图。
- Units: 将设备和物料转换为
- 核心计算:
SimService.runSimulation- 初始化:
t=0,写入所有SimUnit的静态属性。 - 时间步推进:
t=1tosteps- Apply Events (Input): 应用普通设定值事件。
- Apply Influence: 基于拓扑关系计算派生属性(如
bias + coeff * source)。 - Apply Events (Override): 应用强制覆盖事件(如故障注入)。
- Snapshot: 保存当前步所有属性状态。
- 初始化:
- 结果转换:
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 新版本优化方案
- 直接基于 SimContext 推理:
- 仿真计算完成后,直接从
SimContext提取每一帧的属性状态,不再需要DeviceDataParser解析 JSON 字符串。 SimService提供getDeviceStateList(deviceId)方法,快速导出时序数据。
- 仿真计算完成后,直接从
- 组件化推理服务:
- 引入
SimInferService,负责封装SimContext为InferRequest格式。 - 异步调用 Python 接口,提高系统响应速度。
- 引入
- 批量持久化:
- 推理结果 (
Keff,features) 统一封装为ScenarioResult列表,使用MyBatis-Plus的saveBatch异步写入,避免频繁数据库操作。
- 推理结果 (
4.3 核心伪代码示例
// 在 SimController 中调用
SimContext ctx = simService.runSimulation(units, events, nodes, steps);
// 异步执行推理并入表
simInferService.asyncInferAndSave(projectId, scenarioId, ctx, units);
5. 后续演进建议
- 集成 Python 推理: 目前
SimService主要执行线性影响计算。如需复杂机理模型(如 Keff 计算),可在SimService中通过DeviceInferService调用 Python API。 - 性能优化: 对于长时序、大规模拓扑,
SimContext可优化为基于数组的存储,而非 Map。 - 实时流式输出: 支持 WebSocket 或 SSE,实现边计算边推送。