6.3 KiB
6.3 KiB
情景模拟分析结果
1. initSimulation 现状分析与建议
1.1 现状分析
initSimulation 方法是模拟系统的核心入口,负责将静态的项目拓扑结构和动态的情景事件转化为可用于推理的时序数据帧(Frames)。目前的实现主要包含以下几个关键部分:
-
静态属性加载:
- 拓扑解析:方法首先加载
Project实体,并解析其topologyJSON 字段。这包含了设备(Devices)和物料(Material)的基础定义。 - 数据库补全:通过
buildMaterialStaticFromDb方法(L1116),系统会根据拓扑中的materialId查询Material数据库表,补全如u_concentration,pu_isotope,pu_concentration等关键理化属性。 - 尺寸注入:通过
injectDeviceSize方法(L776),解析设备ui.size或properties中的尺寸信息(如diameter,height)并注入到模拟状态中。 - 符合度:这部分逻辑基本覆盖了需求 1.1 中关于“项目设备属性、物料属性的静态值”的处理。
- 拓扑解析:方法首先加载
-
始发事件处理:
- 事件解析:方法查询指定
scenarioId下的所有Event记录。 - 插值逻辑:通过
buildValueProviders方法(L929),解析attr_changesJSON 字段。代码明确处理了step-set(阶跃变化)和ramp(线性斜坡)两种插值模式。 - 符合度:这部分逻辑能够处理需求 1.2 中描述的复杂事件定义(如“条件3”中的分段变化)。
- 事件解析:方法查询指定
-
影响关系计算:
- 传播模型:在
ProjectServiceImpl的主循环(L695-717)中,实现了基于拓扑定义的影响传播。 - 计算公式:采用了线性加权模型:
TargetValue = Bias + Σ(Coefficient * SourceValue(t - Delay))。 - 符合度:这部分逻辑覆盖了需求 1.3 中关于设备间、设备与物料间属性影响关系的定义。
- 传播模型:在
1.2 存在的问题与建议
-
数据校验缺失:
- 问题:当前代码在解析
topology后,缺乏对关键物理属性(如diameter,height)的强校验。如果 JSON 中缺失这些字段,后续计算可能会抛出空指针异常或产生错误的0值。 - 建议:在
initSimulation的第一步增加validateTopology逻辑,确保所有参与物理计算的属性都已正确定义且非空。
- 问题:当前代码在解析
-
初始状态一致性:
- 问题:当
t=0时刻,静态拓扑中定义的默认值与Event中定义的初始值可能存在冲突。目前的逻辑是先加载静态值,再应用事件变化。 - 建议:明确并文档化优先级规则:事件设定值(t=0) > 静态默认值。在代码中确保事件应用逻辑在静态初始化之后执行。
- 问题:当
-
逻辑耦合度高:
- 问题:
ProjectServiceImpl承担了过多的职责(CRUD、拓扑解析、数学计算、推理调度)。initSimulation方法过于庞大(数百行),维护困难。 - 建议:将模拟初始化的核心逻辑(特别是时间步推进和状态计算)抽取为独立的
SimulationEngine或SimDataBuilder类。
- 问题:
2. SimController 分析
2.1 现状
SimController目前处于全注释状态,完全未启用。- 当前的模拟相关接口(
/simulation/init,/simulation/run)直接寄宿在ProjectController中,导致ProjectController臃肿。
2.2 建议
- 启用 SimController:遵循单一职责原则(SRP),应激活
SimController作为模拟相关业务的统一入口。 - 服务拆分:
- 创建
SimService接口及其实现类SimServiceImpl。 - 将
ProjectServiceImpl中与模拟强相关的逻辑(initSimulation,runSimulation,loadSimInfluenceNodes等)迁移至SimService。 ProjectService应只保留项目元数据的 CRUD 操作。
- 创建
- 重构半成品:参考
SimController的原始设计,完善其输入参数校验和异常处理,使其符合当前的 RESTful API 规范。
3. runSimulation 分析与新需求建议
3.1 现状分析
- 算法绑定限制:目前代码(L1305)从
Scenario对象中获取algorithmType。这意味着同一个情景下的所有设备必须使用同一种算法。这无法满足“针对不同设备使用不同算法”的精细化需求。 - 推理调用简单:在调用
deviceInferService.processDeviceInference时,仅传递了按DeviceType分组的数据,未透传算法类型。这意味着推理服务可能在使用默认算法,或者需要自行再次查询配置。
3.2 新需求适配建议:设备级算法配置
针对“要求场景表,针对项目设备设置算法类型”的需求变更,建议方案如下:
-
数据模型变更:
- 方案 A(推荐 - 拓扑集成):在
Project的topologyJSON 结构中,为每个device节点增加algorithmType字段。这样在建模阶段就确定了设备的算法特性。 - 方案 B(场景覆盖):在
Scenario表中增加一个 JSON 字段(如device_configs),存储Map<DeviceId, AlgorithmType>的映射关系,允许在不同情景下为同一设备指定不同算法。
- 方案 A(推荐 - 拓扑集成):在
-
业务逻辑调整 (
runSimulation):- 分组策略升级:目前的
groupedDevices是Map<DeviceType, List<DeviceStepInfo>>。需要调整为更细粒度的分组,键应包含算法信息。- 新结构示例:
Map<String(DeviceType_AlgorithmType), List<DeviceStepInfo>>。
- 新结构示例:
- 参数透传:在构建
DeviceStepInfo时,必须将设备的algorithmType写入该对象。
- 分组策略升级:目前的
-
接口升级:
- 修改
deviceInferService.processDeviceInference接口签名,使其能够识别不同分组对应的算法类型。 - 路由逻辑:在
DeviceInferService内部实现路由策略,根据传入的algorithmType(如MCNP,PointNet,Analytical)调用不同的底层推理模型或微服务。
- 修改
总结
当前系统已具备基本的模拟框架,但为了应对更复杂的业务需求(如设备级算法配置)和提升系统可维护性,必须进行服务拆分(SimService)和数据模型升级(AlgorithmType下沉)。