From 90882aca0b60a5b39e127d30438752a774b3a7ac Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 05 九月 2026 21:29:25 +0800
Subject: [PATCH] 修复模拟器 Redis 工步方案恢复

---
 ruoyi-admin/src/main/java/com/battery/business/runtime/RedisBtsSimulatorStateStore.java |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/battery/business/runtime/RedisBtsSimulatorStateStore.java b/ruoyi-admin/src/main/java/com/battery/business/runtime/RedisBtsSimulatorStateStore.java
index 4001602..16c34e8 100644
--- a/ruoyi-admin/src/main/java/com/battery/business/runtime/RedisBtsSimulatorStateStore.java
+++ b/ruoyi-admin/src/main/java/com/battery/business/runtime/RedisBtsSimulatorStateStore.java
@@ -12,6 +12,8 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.battery.device.simulator.BtsSimulatorStateStore;
 import com.battery.device.simulator.BtsSimulatorStateStore.BtsDeviceProfile;
+import com.battery.device.simulator.BtsSimulatorStateStore.ChannelConfiguration;
+import com.battery.device.simulator.BtsSimulatorStateStore.SimulatorPlanStep;
 import com.battery.device.api.model.DeviceWorkStatus;
 
 /** 将开发模拟器完整状态写入 Redis,主状态不设置普通 TTL。 */
@@ -185,8 +187,27 @@
         JSONObject object = jsonObject(value);
         String workStatus = object.getString("workStatus");
         if (workStatus == null) throw new IllegalStateException("Missing BTS simulator state field: workStatus");
+        JSONObject configuration = object.getJSONObject("configuration");
         return new ChannelState(requiredInteger(object, "channelId"), object.getBooleanValue("online"),
-                DeviceWorkStatus.valueOf(workStatus), object.getObject("configuration", ChannelConfiguration.class));
+                DeviceWorkStatus.valueOf(workStatus), channelConfiguration(configuration));
+    }
+
+    /** Redis 通用反序列化会把泛型 steps 恢复为 JSONObject,不能让 record 构造器直接强转。 */
+    private ChannelConfiguration channelConfiguration(JSONObject object)
+    {
+        if (object == null) return null;
+        JSONArray configuredSteps = requiredArray(object, "steps");
+        List<SimulatorPlanStep> steps = new ArrayList<>();
+        configuredSteps.forEach(item -> {
+            JSONObject step = jsonObject(item);
+            steps.add(new SimulatorPlanStep(step.getString("name"), step.getString("stepType"),
+                    step.getDoubleValue("durationSeconds"), step.getDoubleValue("voltageV")));
+        });
+        return new ChannelConfiguration(requiredDecimal(object, "currentA"), requiredDecimal(object, "voltageV"),
+                requiredDecimal(object, "capacityAh"), requiredDecimal(object, "energyWh"),
+                requiredInteger(object, "cycleNo"), requiredInteger(object, "stepNo"),
+                requiredInteger(object, "plannedCycleCount"), object.getLongValue("totalTimeSeconds"),
+                object.getLongValue("relativeTimeSeconds"), steps);
     }
 
     private ChannelTombstone channelTombstone(Object value)

--
Gitblit v1.7.1