From a011865a0989b51d5818f2791d04790b6408acd1 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 09 九月 2026 13:25:57 +0800
Subject: [PATCH] 按甲方字段补齐实时相对时长持久化

---
 ruoyi-admin/src/test/java/com/battery/business/web/ConsoleSingleSheetImportDatabaseTest.java |   25 +++++++++++++++++++++++--
 1 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/battery/business/web/ConsoleSingleSheetImportDatabaseTest.java b/ruoyi-admin/src/test/java/com/battery/business/web/ConsoleSingleSheetImportDatabaseTest.java
index 9290b0e..60ca979 100644
--- a/ruoyi-admin/src/test/java/com/battery/business/web/ConsoleSingleSheetImportDatabaseTest.java
+++ b/ruoyi-admin/src/test/java/com/battery/business/web/ConsoleSingleSheetImportDatabaseTest.java
@@ -348,14 +348,14 @@
             assertEquals((long) count, service.selectActionById(actions.get(0).getActionId()).getAffectedRecordCount());
             String label = switch (type) { case "REALTIME" -> "实时"; case "STEP" -> "工步"; default -> "循环"; };
             assertEquals("导入" + count + "条" + label + "数据", actions.get(0).getScopeSummary());
-            if ("STEP".equals(type))
+            if ("STEP".equals(type) || "REALTIME".equals(type))
             {
                 var persisted = mapper.selectImportDataRecords(1L, type).stream().collect(java.util.stream.Collectors.toMap(
                         record -> record.get("source_record_id").toString(), record -> record));
                 for (var input : rows)
                 {
                     var stored = JSON.parseObject(persisted.get(input.get("recordNo").toString()).get("extension_measurements_json").toString());
-                    for (String field : List.of("chargeMedianVoltage", "dischargeMedianVoltage"))
+                    for (String field : "STEP".equals(type) ? List.of("stepDuration", "chargeMedianVoltage", "dischargeMedianVoltage") : List.of("relativeTimeSeconds"))
                         if (input.get(field) == null) assertNull(stored.get(field));
                         else assertEquals(0, new java.math.BigDecimal(input.get(field).toString()).compareTo(stored.getBigDecimal(field)), field);
                 }
@@ -364,6 +364,27 @@
         assertEquals(3, service.selectActions(new TTestDataRevisionAction()).size());
     }
 
+    @Test void realtimeRelativeTimeSurvivesImportQueryAndDuplicateValidation()
+    {
+        var input = row(); input.put("relativeTimeSeconds", 3752.125);
+        submit("REALTIME", List.of(input));
+        var stored = mapper.selectImportDataRecords(1L, "REALTIME").get(0);
+        assertNotNull(stored.get("extension_measurements_json"));
+        var extension = JSON.parseObject(stored.get("extension_measurements_json").toString());
+        assertEquals(0, new java.math.BigDecimal("3752.125").compareTo(extension.getBigDecimal("relativeTimeSeconds")));
+        var queryMapper = org.mockito.Mockito.mock(TTestMapper.class);
+        var query = new com.battery.business.service.impl.TestDataQueryServiceImpl(queryMapper,
+                org.mockito.Mockito.mock(com.battery.business.service.ITTestService.class));
+        var current = new LinkedHashMap<String, Object>(); current.put("extensionMeasurementsJson", extension.toJSONString());
+        var legacy = new LinkedHashMap<String, Object>();
+        org.mockito.Mockito.when(queryMapper.selectPersistedFinalRealtimeRecords(1L)).thenReturn(List.of(current, legacy));
+        assertEquals(new java.math.BigDecimal("3752.125"), query.records(1L).get(0).get("relativeTimeSeconds"));
+        assertNull(query.records(1L).get(1).get("relativeTimeSeconds"));
+        assertEquals(1, submit("REALTIME", List.of(input)).get("skippedCount"));
+        input.put("relativeTimeSeconds", 3752.126);
+        assertThrows(RuntimeException.class, () -> submit("REALTIME", List.of(input)));
+    }
+
     private Map<String, Object> row()
     {
         var row = new LinkedHashMap<String, Object>(Map.of("recordNo", "17", "batteryNo", "BAT-1", "recordedAt", 1683517331000L,

--
Gitblit v1.7.1