JavaProjectRepo/business-css/情景模拟分析结果.md
2026-03-19 11:18:15 +08:00

6.3 KiB
Raw Blame History

情景模拟分析结果

1. initSimulation 现状分析与建议

1.1 现状分析

initSimulation 方法是模拟系统的核心入口负责将静态的项目拓扑结构和动态的情景事件转化为可用于推理的时序数据帧Frames。目前的实现主要包含以下几个关键部分

  1. 静态属性加载

    • 拓扑解析:方法首先加载 Project 实体,并解析其 topology JSON 字段。这包含了设备Devices和物料Material的基础定义。
    • 数据库补全:通过 buildMaterialStaticFromDb 方法L1116系统会根据拓扑中的 materialId 查询 Material 数据库表,补全如 u_concentration, pu_isotope, pu_concentration 等关键理化属性。
    • 尺寸注入:通过 injectDeviceSize 方法L776解析设备 ui.sizeproperties 中的尺寸信息(如 diameter, height)并注入到模拟状态中。
    • 符合度:这部分逻辑基本覆盖了需求 1.1 中关于“项目设备属性、物料属性的静态值”的处理。
  2. 始发事件处理

    • 事件解析:方法查询指定 scenarioId 下的所有 Event 记录。
    • 插值逻辑:通过 buildValueProviders 方法L929解析 attr_changes JSON 字段。代码明确处理了 step-set(阶跃变化)和 ramp(线性斜坡)两种插值模式。
    • 符合度:这部分逻辑能够处理需求 1.2 中描述的复杂事件定义如“条件3”中的分段变化
  3. 影响关系计算

    • 传播模型:在 ProjectServiceImpl 的主循环L695-717实现了基于拓扑定义的影响传播。
    • 计算公式:采用了线性加权模型:TargetValue = Bias + Σ(Coefficient * SourceValue(t - Delay))
    • 符合度:这部分逻辑覆盖了需求 1.3 中关于设备间、设备与物料间属性影响关系的定义。

1.2 存在的问题与建议

  1. 数据校验缺失

    • 问题:当前代码在解析 topology 后,缺乏对关键物理属性(如 diameter, height)的强校验。如果 JSON 中缺失这些字段,后续计算可能会抛出空指针异常或产生错误的 0 值。
    • 建议:在 initSimulation 的第一步增加 validateTopology 逻辑,确保所有参与物理计算的属性都已正确定义且非空。
  2. 初始状态一致性

    • 问题:当 t=0 时刻,静态拓扑中定义的默认值与 Event 中定义的初始值可能存在冲突。目前的逻辑是先加载静态值,再应用事件变化。
    • 建议:明确并文档化优先级规则:事件设定值t=0 > 静态默认值。在代码中确保事件应用逻辑在静态初始化之后执行。
  3. 逻辑耦合度高

    • 问题ProjectServiceImpl 承担了过多的职责CRUD、拓扑解析、数学计算、推理调度initSimulation 方法过于庞大(数百行),维护困难。
    • 建议:将模拟初始化的核心逻辑(特别是时间步推进和状态计算)抽取为独立的 SimulationEngineSimDataBuilder 类。

2. SimController 分析

2.1 现状

  • SimController 目前处于全注释状态,完全未启用。
  • 当前的模拟相关接口(/simulation/init, /simulation/run)直接寄宿在 ProjectController 中,导致 ProjectController 臃肿。

2.2 建议

  1. 启用 SimController遵循单一职责原则SRP应激活 SimController 作为模拟相关业务的统一入口。
  2. 服务拆分
    • 创建 SimService 接口及其实现类 SimServiceImpl
    • ProjectServiceImpl 中与模拟强相关的逻辑(initSimulation, runSimulation, loadSimInfluenceNodes 等)迁移至 SimService
    • ProjectService 应只保留项目元数据的 CRUD 操作。
  3. 重构半成品:参考 SimController 的原始设计,完善其输入参数校验和异常处理,使其符合当前的 RESTful API 规范。

3. runSimulation 分析与新需求建议

3.1 现状分析

  • 算法绑定限制目前代码L1305Scenario 对象中获取 algorithmType。这意味着同一个情景下的所有设备必须使用同一种算法。这无法满足“针对不同设备使用不同算法”的精细化需求。
  • 推理调用简单:在调用 deviceInferService.processDeviceInference 时,仅传递了按 DeviceType 分组的数据,未透传算法类型。这意味着推理服务可能在使用默认算法,或者需要自行再次查询配置。

3.2 新需求适配建议:设备级算法配置

针对“要求场景表,针对项目设备设置算法类型”的需求变更,建议方案如下:

  1. 数据模型变更

    • 方案 A推荐 - 拓扑集成):在 Projecttopology JSON 结构中,为每个 device 节点增加 algorithmType 字段。这样在建模阶段就确定了设备的算法特性。
    • 方案 B场景覆盖:在 Scenario 表中增加一个 JSON 字段(如 device_configs),存储 Map<DeviceId, AlgorithmType> 的映射关系,允许在不同情景下为同一设备指定不同算法。
  2. 业务逻辑调整 (runSimulation)

    • 分组策略升级:目前的 groupedDevicesMap<DeviceType, List<DeviceStepInfo>>。需要调整为更细粒度的分组,键应包含算法信息。
      • 新结构示例:Map<String(DeviceType_AlgorithmType), List<DeviceStepInfo>>
    • 参数透传:在构建 DeviceStepInfo 时,必须将设备的 algorithmType 写入该对象。
  3. 接口升级

    • 修改 deviceInferService.processDeviceInference 接口签名,使其能够识别不同分组对应的算法类型。
    • 路由逻辑:在 DeviceInferService 内部实现路由策略,根据传入的 algorithmType(如 MCNP, PointNet, Analytical)调用不同的底层推理模型或微服务。

总结

当前系统已具备基本的模拟框架,但为了应对更复杂的业务需求(如设备级算法配置)和提升系统可维护性,必须进行服务拆分SimService数据模型升级AlgorithmType下沉