|
|
@@ -2118,6 +2118,86 @@ log.info("已添加template_id列到tasks表");
|
|
|
log.warn("创建family_invitations表失败: {}", e.getMessage());
|
|
|
}
|
|
|
|
|
|
+ // ==================== P0 营养师: nutrition_indicator_mapping ====================
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_indicator_mapping (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "indicator_name_pattern VARCHAR(200) NOT NULL COMMENT '指标名匹配模式(SQL LIKE语法,%为通配符)'," +
|
|
|
+ "nutrient VARCHAR(50) NOT NULL COMMENT '关联营养素名'," +
|
|
|
+ "severity_weight DECIMAL(3,2) DEFAULT 1.00 COMMENT '权重(0-1)'," +
|
|
|
+ "deficiency_symptoms TEXT COMMENT '缺乏症状描述'," +
|
|
|
+ "excess_symptoms TEXT COMMENT '过量症状描述'," +
|
|
|
+ "food_suggestions TEXT COMMENT '推荐食物(逗号分隔)'," +
|
|
|
+ "sort_order INT DEFAULT 0 COMMENT '排序(大值优先匹配)'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_nutrient (nutrient)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='指标-营养素映射表'");
|
|
|
+ log.info("已创建 nutrition_indicator_mapping 表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建 nutrition_indicator_mapping 表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // P0 营养师: nutrition_deficiency_record
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS nutrition_deficiency_record (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY," +
|
|
|
+ "child_id BIGINT NOT NULL COMMENT '孩子ID'," +
|
|
|
+ "report_id BIGINT NOT NULL COMMENT '关联报告ID'," +
|
|
|
+ "nutrient VARCHAR(50) NOT NULL COMMENT '营养素名'," +
|
|
|
+ "deficiency_type VARCHAR(20) NOT NULL COMMENT 'deficiency/excess/borderline/unclassified'," +
|
|
|
+ "severity DECIMAL(5,2) DEFAULT 0 COMMENT '严重程度(0-1)'," +
|
|
|
+ "indicator_name VARCHAR(100) COMMENT '关联指标名'," +
|
|
|
+ "indicator_value VARCHAR(50) COMMENT '指标检测值'," +
|
|
|
+ "ref_range VARCHAR(100) COMMENT '参考范围'," +
|
|
|
+ "symptoms TEXT COMMENT '症状描述'," +
|
|
|
+ "food_suggestions TEXT COMMENT '推荐食物'," +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP," +
|
|
|
+ "INDEX idx_child (child_id)," +
|
|
|
+ "INDEX idx_report (report_id)," +
|
|
|
+ "INDEX idx_nutrient (nutrient)" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='营养缺乏分析记录'");
|
|
|
+ log.info("已创建 nutrition_deficiency_record 表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("创建 nutrition_deficiency_record 表失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // P0 营养师: 指标-营养素映射 种子数据
|
|
|
+ try {
|
|
|
+ Integer count = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(*) FROM nutrition_indicator_mapping", Integer.class);
|
|
|
+ if (count == null || count == 0) {
|
|
|
+ String[][] seedData = {
|
|
|
+ {"铁蛋白", "铁", "1.00", "乏力、面色苍白、注意力不集中", "铁过量可能损伤肝脏", "动物肝脏,红肉,菠菜,黑木耳", "10"},
|
|
|
+ {"25-羟基维生素D", "维生素D", "1.00", "影响钙吸收、骨骼发育", "维生素D过量可致高钙血症", "三文鱼,蛋黄,蘑菇,强化牛奶", "20"},
|
|
|
+ {"维生素D", "维生素D", "1.00", "影响钙吸收、骨骼发育、免疫力下降", "维生素D过量可致高钙血症", "三文鱼,蛋黄,蘑菇,强化牛奶", "15"},
|
|
|
+ {"锌", "锌", "0.80", "食欲减退、味觉异常、免疫力降低", "锌过量影响铜吸收", "牡蛎,牛肉,南瓜子,扁豆", "10"},
|
|
|
+ {"钙", "钙", "0.80", "骨骼发育迟缓、牙齿问题", "高钙血症、肾结石", "牛奶,豆腐,虾皮,芝麻酱", "10"},
|
|
|
+ {"维生素B12", "维生素B12", "1.00", "贫血、神经发育迟缓", "一般不易过量", "牛肉,鸡蛋,牛奶,鱼肉", "10"},
|
|
|
+ {"维生素C", "维生素C", "0.60", "免疫力下降、牙龈出血", "腹泻、肾结石风险", "猕猴桃,橙子,草莓,青椒", "10"},
|
|
|
+ {"白蛋白", "蛋白质", "0.90", "发育迟缓、肌肉萎缩", "肾脏负担", "鸡蛋,鱼肉,牛奶,豆制品", "10"},
|
|
|
+ {"总蛋白", "蛋白质", "0.90", "营养不良、免疫力下降", "血液粘稠", "鸡蛋,鱼肉,牛奶,豆制品", "9"},
|
|
|
+ {"膳食纤维", "膳食纤维", "0.50", "便秘、肠道菌群失衡", "腹胀、排便过多", "全谷物,蔬菜,豆类,水果", "10"},
|
|
|
+ {"叶酸", "叶酸", "0.70", "贫血、发育迟缓", "一般不易过量", "菠菜,动物肝脏,豆类,柑橘", "10"},
|
|
|
+ {"维生素A", "维生素A", "0.70", "视力问题、皮肤干燥、免疫力下降", "头痛、肝脏损伤", "胡萝卜,动物肝脏,南瓜,菠菜", "10"},
|
|
|
+ {"硒", "硒", "0.50", "免疫力下降、甲状腺功能异常", "脱发、指甲脆裂", "巴西坚果,海鲜,蘑菇", "10"},
|
|
|
+ {"镁", "镁", "0.40", "肌肉痉挛、睡眠问题", "腹泻、低血压", "坚果,全谷物,深绿蔬菜", "10"},
|
|
|
+ {"益生菌%", "益生菌", "0.60", "肠道菌群失衡、消化问题", "一般不易过量", "酸奶,泡菜,味噌,康普茶", "10"}
|
|
|
+ };
|
|
|
+ for (String[] row : seedData) {
|
|
|
+ jdbcTemplate.update("INSERT IGNORE INTO nutrition_indicator_mapping " +
|
|
|
+ "(indicator_name_pattern, nutrient, severity_weight, deficiency_symptoms, excess_symptoms, food_suggestions, sort_order) " +
|
|
|
+ "VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
|
+ row[0], row[1], new java.math.BigDecimal(row[2]), row[3], row[4], row[5], Integer.parseInt(row[6]));
|
|
|
+ }
|
|
|
+ log.info("nutrition_indicator_mapping 种子数据已加载 (15条)");
|
|
|
+ } else {
|
|
|
+ log.info("nutrition_indicator_mapping 种子数据已存在 ({}条), 跳过", count);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("nutrition_indicator_mapping 种子数据初始化失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
log.info("数据库迁移完成");
|
|
|
}
|
|
|
|