Jelajahi Sumber

fix(report): 采集指标种子改为仅空时写入,保留管理员编辑

Xiaogang Liao 3 hari lalu
induk
melakukan
a2e968bcc1

+ 5 - 4
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -12024,14 +12024,15 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
         }
     }
 
-    /** 写入类型「应采集指标项」定义(每次启动覆盖,保证与代码一致) */
-    private void seedExpectedIndicator(String typeId, String expectedJson) {
+    /** 写入类型「应采集指标项」定义(仅当为空时写入,保留管理员编辑) */
+    void seedExpectedIndicator(String typeId, String expectedJson) {
         try {
             int updated = jdbcTemplate.update(
-                    "UPDATE report_type_registry SET expected_indicators = ?, updated_at = NOW() WHERE type_id = ?",
+                    "UPDATE report_type_registry SET expected_indicators = ?, updated_at = NOW() " +
+                    "WHERE type_id = ? AND (expected_indicators IS NULL OR expected_indicators = '')",
                     expectedJson, typeId);
             if (updated == 0) {
-                log.warn("迁移354: 类型 {} 不存在,跳过指标项定义", typeId);
+                log.info("迁移354: 类型 {} 已有指标项定义,跳过种子", typeId);
             } else {
                 log.info("迁移354: 已为类型 {} 写入指标项定义", typeId);
             }

+ 33 - 0
cfc-backend/src/test/java/com/etotem/cfc/config/DatabaseInitializerSeedTest.java

@@ -0,0 +1,33 @@
+package com.etotem.cfc.config;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+
+@ExtendWith(MockitoExtension.class)
+class DatabaseInitializerSeedTest {
+
+    @Mock
+    private JdbcTemplate jdbcTemplate;
+
+    @InjectMocks
+    private DatabaseInitializer initializer;
+
+    @Test
+    void seedExpectedIndicator_onlyWritesWhenAbsent() {
+        initializer.seedExpectedIndicator("dan_a1", "[\"总分\"]");
+
+        ArgumentCaptor<String> sql = ArgumentCaptor.forClass(String.class);
+        verify(jdbcTemplate).update(sql.capture(), eq("[\"总分\"]"), eq("dan_a1"));
+        assertTrue(sql.getValue().contains("(expected_indicators IS NULL OR expected_indicators = '')"),
+                "SQL 必须仅在列为空时写入,避免覆盖管理员编辑");
+    }
+}