From ac360fe22ae21722c3af52ef727c8456f5f100e7 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期日, 06 九月 2026 01:04:33 +0800
Subject: [PATCH] 修复三类数据查询的数据库时间转换

---
 ruoyi-admin/src/test/java/com/battery/business/runtime/ConsoleTimeContractTest.java |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/battery/business/runtime/ConsoleTimeContractTest.java b/ruoyi-admin/src/test/java/com/battery/business/runtime/ConsoleTimeContractTest.java
index aad2196..5bec42c 100644
--- a/ruoyi-admin/src/test/java/com/battery/business/runtime/ConsoleTimeContractTest.java
+++ b/ruoyi-admin/src/test/java/com/battery/business/runtime/ConsoleTimeContractTest.java
@@ -2,7 +2,12 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import java.time.Instant;
+import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import org.junit.jupiter.api.Test;
@@ -12,6 +17,11 @@
 import com.battery.business.domain.TTest;
 import com.battery.business.domain.TTestDataRevisionAction;
 import com.battery.business.service.ITestLiveService.LiveState;
+import com.battery.business.mapper.TTestMapper;
+import com.battery.business.service.impl.TTestServiceImpl;
+import com.battery.business.service.impl.TestDataQueryServiceImpl;
+import com.battery.business.web.TTestController;
+import org.springframework.test.util.ReflectionTestUtils;
 
 /** 控制台 REST/SSE 的业务时间统一为毫秒,平台响应保持原有格式。 */
 class ConsoleTimeContractTest
@@ -48,4 +58,40 @@
         assertEquals(time, json.readTree(json.writeValueAsString(state)).get("updatedAt").longValue());
         assertEquals(time, json.readTree(json.writeValueAsString(Map.of("at", state.updatedAt()))).get("at").longValue());
     }
+
+    @Test
+    void persistedDataEndpointsInterpretDatabaseLocalDateTimeAsUtcMillis()
+    {
+        var mapper = mock(TTestMapper.class);
+        var storedTest = new TTest(); storedTest.setTestId(42L);
+        when(mapper.selectTestById(42L)).thenReturn(storedTest);
+        var tests = new TTestServiceImpl();
+        ReflectionTestUtils.setField(tests, "testMapper", mapper);
+        var controller = new TTestController();
+        ReflectionTestUtils.setField(controller, "testDataQueryService", new TestDataQueryServiceImpl(mapper, tests));
+        // JDBC 可将 UTC DATETIME(3) 返回为 LocalDateTime;它不是用户所在时区的本地时间。
+        for (Object databaseTime : List.of(LocalDateTime.parse("2023-05-08T03:42:11.123"),
+                Instant.parse("2023-05-08T03:42:11.123Z"), new Date(1683517331123L)))
+        {
+            Map<String, Object> row = new LinkedHashMap<>();
+            for (String field : List.of("deviceTime", "collectorDeviceTime", "captureSlot", "serverReceivedAt", "recordedAt", "absoluteTime"))
+                row.put(field, databaseTime);
+            row.put("deviceTimeRaw", "2023-05-08 11:42:11.123");
+            row.put("temperature", null);
+            when(mapper.selectPersistedFinalRealtimeRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row)));
+            when(mapper.selectPersistedFinalStepRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row)));
+            when(mapper.selectPersistedFinalCycleRecords(42L)).thenReturn(List.of(new LinkedHashMap<>(row)));
+            for (AjaxResult result : List.of(controller.persistedRecords(42L), controller.persistedSteps(42L), controller.persistedCycles(42L)))
+            {
+                var item = json.readTree(json.writeValueAsString(result)).get("data").get(0);
+                for (String field : List.of("deviceTime", "collectorDeviceTime", "captureSlot", "serverReceivedAt", "recordedAt", "absoluteTime"))
+                {
+                    assertTrue(item.get(field).isIntegralNumber(), field + ": " + item.get(field));
+                    assertEquals(1683517331123L, item.get(field).longValue());
+                }
+                assertEquals("2023-05-08 11:42:11.123", item.get("deviceTimeRaw").asString());
+                assertTrue(item.get("temperature").isNull());
+            }
+        }
+    }
 }

--
Gitblit v1.7.1