Parcourir la source

fix: 修复健康报告解析入库失败(draftId 84 两个根因)

- HealthReportService.createReport: 落库前对 indicator 自由文本字段统一截断(category/name/value/unit/refRange/status),
  防止 opencode 回退解析产出的超长 status 导致 'Data too long for column status'
- DatabaseInitializer 迁移307: health_gut_flora.bacteria_name 改为可空(LLM 偶发缺菌种名触发 NOT NULL 冲突)
- DatabaseInitializer 迁移308: health_indicators.status 放宽到 VARCHAR(100)
- schema.sql 同步 bacteria_name NULL + status VARCHAR(100)
Xiaogang Liao il y a 1 semaine
Parent
commit
c9a69fc694

+ 18 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -1812,7 +1812,7 @@ public class DatabaseInitializer implements CommandLineRunner {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS health_gut_flora (" +
                     "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
                     "report_id BIGINT NOT NULL COMMENT '关联报告ID', " +
-                    "bacteria_name VARCHAR(100) NOT NULL COMMENT '菌种名称', " +
+                    "bacteria_name VARCHAR(100) NULL COMMENT '菌种名称', " +
                     "bacteria_value VARCHAR(50) COMMENT '菌种丰度值', " +
                     "normal_range VARCHAR(100) COMMENT '正常范围', " +
                     "status VARCHAR(20) COMMENT '状态: 正常/偏低/偏高', " +
@@ -10540,5 +10540,22 @@ public class DatabaseInitializer implements CommandLineRunner {
         } catch (Exception e) {
             log.warn("创建resource_items表失败: {}", e.getMessage());
         }
+
+        // 迁移304: health_gut_flora.bacteria_name 改为可空(LLM解析偶发缺菌种名,NOT NULL 导致采集入库失败)
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_gut_flora MODIFY COLUMN bacteria_name VARCHAR(100) NULL COMMENT '菌种名称'");
+            log.info("迁移304: health_gut_flora.bacteria_name 已改为可空");
+        } catch (Exception e) {
+            log.warn("迁移304: health_gut_flora.bacteria_name 修改失败: {}", e.getMessage());
+        }
+
+        // 迁移305: health_indicators.status 放宽到 VARCHAR(100)(opencode 回退解析产出自由文本 status,
+        //   超长写入报 Data too long for column 'status',draft 入库失败)
+        try {
+            jdbcTemplate.execute("ALTER TABLE health_indicators MODIFY COLUMN status VARCHAR(100) NULL COMMENT '评估状态: 正常/偏低/偏高/过多/注意/低风险/未检出'");
+            log.info("迁移305: health_indicators.status 已放宽到 VARCHAR(100)");
+        } catch (Exception e) {
+            log.warn("迁移305: health_indicators.status 修改失败: {}", e.getMessage());
+        }
     }
 }

+ 20 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/HealthReportService.java

@@ -143,6 +143,7 @@ public class HealthReportService {
                     ind.setCollectionDate(report.getReportDate());
                 }
                 ind.setCreatedAt(new Date());
+                truncateIndicatorColumns(ind);
                 healthIndicatorMapper.insert(ind);
             }
         }
@@ -152,6 +153,25 @@ public class HealthReportService {
         return report;
     }
 
+    /**
+     * 截断指标字符串字段到数据库列最大长度(null 安全)。
+     * 自由文本来源(LangGraph/opencode 解析、手动录入)status/category 等字段无长度约束,
+     * 超长写入会触发 MySQL Data too long 导致整单入库失败。
+     */
+    private void truncateIndicatorColumns(HealthIndicator ind) {
+        ind.setCategory(truncate(ind.getCategory(), 50));
+        ind.setIndicatorName(truncate(ind.getIndicatorName(), 100));
+        ind.setIndicatorValue(truncate(ind.getIndicatorValue(), 100));
+        ind.setUnit(truncate(ind.getUnit(), 50));
+        ind.setRefRange(truncate(ind.getRefRange(), 200));
+        ind.setStatus(truncate(ind.getStatus(), 100));
+    }
+
+    private String truncate(String s, int maxLen) {
+        if (s == null || s.length() <= maxLen) return s;
+        return s.substring(0, maxLen);
+    }
+
     /**
      * 创建健康报告(含指标列表 + 菌群数据 + 疾病风险评估)
      */

+ 2 - 2
cfc-backend/src/main/resources/schema.sql

@@ -1811,7 +1811,7 @@ CREATE TABLE IF NOT EXISTS health_indicators (
     indicator_value VARCHAR(100) COMMENT '检测值',
     unit VARCHAR(50) COMMENT '单位',
     ref_range VARCHAR(200) COMMENT '参考范围',
-    status VARCHAR(50) COMMENT '评估状态: 正常/偏低/偏高/过多/注意/低风险/未检出',
+    status VARCHAR(100) COMMENT '评估状态: 正常/偏低/偏高/过多/注意/低风险/未检出',
     symptoms TEXT COMMENT '症状描述',
     sort_order INT DEFAULT 0 COMMENT '显示排序',
     collection_date DATETIME COMMENT '指标采集日期(报告检测日期)',
@@ -1860,7 +1860,7 @@ CREATE TABLE IF NOT EXISTS health_report_edit_logs (
 CREATE TABLE IF NOT EXISTS health_gut_flora (
     id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键 ID',
     report_id BIGINT NOT NULL COMMENT '关联报告 ID',
-    bacteria_name VARCHAR(100) NOT NULL COMMENT '菌种名称',
+    bacteria_name VARCHAR(100) NULL COMMENT '菌种名称',
     bacteria_value VARCHAR(50) COMMENT '菌种丰度值',
     normal_range VARCHAR(100) COMMENT '正常范围',
     status VARCHAR(50) COMMENT '状态:正常/偏低/偏高',