From d465482a314ea4f5703aba7ca5cc33a682fc2f5c Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期日, 30 八月 2026 17:48:55 +0800
Subject: [PATCH] 修正采集器测量编码大小写冲突

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java    |   10 +++++++++-
 ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TTestServiceImplTest.java |   14 ++++++++++++++
 2 files changed, 23 insertions(+), 1 deletions(-)

diff --git a/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TTestServiceImplTest.java b/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TTestServiceImplTest.java
index b9a153a..3538aec 100644
--- a/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TTestServiceImplTest.java
+++ b/ruoyi-admin/src/test/java/com/ruoyi/system/service/impl/TTestServiceImplTest.java
@@ -226,6 +226,20 @@
     }
 
     @Test
+    void createShouldRejectCaseInsensitiveDuplicateCollectorMeasurement()
+    {
+        TTest test = validTest();
+        test.getBatteries().get(0).getCollectorChannels()
+                .add(collectorChannel("primary_temperature", "主温度重复", "S-04"));
+        mockEnabledOptions();
+
+        ServiceException exception = assertThrows(ServiceException.class, () -> testService.createTest(test));
+
+        assertEquals("同一电池号的采集器测量项不可重复", exception.getMessage());
+        verify(testMapper, never()).insertTest(any(TTest.class));
+    }
+
+    @Test
     void createShouldRejectBatteriesFromDifferentGroups()
     {
         TTest test = validTest();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
index faafbc3..73623bf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTestServiceImpl.java
@@ -5,6 +5,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import com.alibaba.fastjson2.JSON;
@@ -443,7 +444,7 @@
         for (TTestCollectorChannel mapping : mappings)
         {
             if (mapping == null) throw new ServiceException("采集器通道映射不完整");
-            mapping.setMeasurementCode(trimToNull(mapping.getMeasurementCode()));
+            mapping.setMeasurementCode(normalizeMeasurementCode(mapping.getMeasurementCode()));
             mapping.setMeasurementName(trimToNull(mapping.getMeasurementName()));
             mapping.setChannelCode(normalizeCollectorChannel(mapping.getChannelCode()));
             if (mapping.getMeasurementCode() == null || mapping.getMeasurementName() == null
@@ -602,6 +603,13 @@
         }
     }
 
+    /** 测量编码与数据库不区分大小写排序保持一致,避免校验通过后插入冲突。 */
+    private String normalizeMeasurementCode(String value)
+    {
+        String normalized = trimToNull(value);
+        return normalized == null ? null : normalized.toUpperCase(Locale.ROOT);
+    }
+
     private <T> List<T> mutable(List<T> values)
     {
         return values == null ? new ArrayList<>() : new ArrayList<>(values);

--
Gitblit v1.7.1