Просмотр исходного кода

feat(backend): add health_knowledge_base (entity+mapper+service+controller+migration98)

iwt 2 месяцев назад
Родитель
Сommit
79f3285b50

+ 21 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -5948,6 +5948,27 @@ try {
 
         // 迁移 97: DAN测评服务佣金配置
         seedDanCommissionConfig();
+
+        // 迁移 98: 创建 health_knowledge_base 表(菌群/营养知识库)
+        try {
+            jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `health_knowledge_base` (" +
+                    "`id` BIGINT AUTO_INCREMENT PRIMARY KEY, " +
+                    "`item_type` VARCHAR(50) NOT NULL COMMENT '类型: bacteria/nutrient/indicator/vitamin/amino_acid/disease', " +
+                    "`item_name` VARCHAR(200) NOT NULL COMMENT '项目名称(精确匹配)', " +
+                    "`category` VARCHAR(100) COMMENT '分类(如 有益菌/有害菌)', " +
+                    "`normal_range` VARCHAR(200) COMMENT '正常范围参考', " +
+                    "`description` TEXT COMMENT '详细说明', " +
+                    "`suggestion` TEXT COMMENT '相关建议', " +
+                    "`source` VARCHAR(100) COMMENT '数据来源', " +
+                    "`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, " +
+                    "`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, " +
+                    "UNIQUE KEY `uk_item_type_name` (`item_type`, `item_name`), " +
+                    "KEY `idx_item_type` (`item_type`)" +
+                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康知识库 - 菌属/营养素/指标说明'");
+            log.info("已创建health_knowledge_base表");
+        } catch (Exception e) {
+            // 表已存在,忽略错误
+        }
     }
 
     private void seedDanCommissionConfig() {

+ 50 - 0
cfc-backend/src/main/java/com/etotem/cfc/controller/HealthKnowledgeBaseController.java

@@ -0,0 +1,50 @@
+package com.etotem.cfc.controller;
+
+import com.etotem.cfc.common.Result;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+import com.etotem.cfc.service.HealthKnowledgeBaseService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Tag(name = "健康知识库")
+@RestController
+@RequestMapping("/api/health/knowledge")
+public class HealthKnowledgeBaseController {
+
+    @Resource
+    private HealthKnowledgeBaseService healthKnowledgeBaseService;
+
+    @Operation(summary = "查询知识库条目")
+    @PostMapping("/query")
+    public Result<HealthKnowledgeBase> query(@RequestBody Map<String, String> params) {
+        String itemType = params.get("itemType");
+        String itemName = params.get("itemName");
+        if (itemType == null || itemName == null) {
+            return Result.error("itemType和itemName不能为空");
+        }
+        HealthKnowledgeBase entry = healthKnowledgeBaseService.query(itemType, itemName);
+        return Result.success(entry);
+    }
+
+    @Operation(summary = "批量查询知识库")
+    @PostMapping("/batch-query")
+    public Result<Map<String, HealthKnowledgeBase>> batchQuery(@RequestBody Map<String, Object> params) {
+        @SuppressWarnings("unchecked")
+        List<Map<String, String>> queries = (List<Map<String, String>>) params.get("queries");
+        if (queries == null || queries.isEmpty()) {
+            return Result.error("queries不能为空");
+        }
+        Map<String, HealthKnowledgeBase> result = healthKnowledgeBaseService.batchQuery(queries);
+        return Result.success(result);
+    }
+}

+ 46 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/HealthKnowledgeBase.java

@@ -0,0 +1,46 @@
+package com.etotem.cfc.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 健康知识库 — 菌属/营养素/指标标准说明
+ * 独立于报告数据存储,通过 itemType + itemName 精确匹配
+ */
+@Data
+@TableName("health_knowledge_base")
+public class HealthKnowledgeBase implements Serializable {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /** 类型: bacteria/nutrient/indicator/vitamin/amino_acid/disease */
+    private String itemType;
+
+    /** 项目名称(精确匹配,如 "双歧杆菌属 Bifidobacterium") */
+    private String itemName;
+
+    /** 分类(如 有益菌/有害菌) */
+    private String category;
+
+    /** 正常范围参考(如 "0.19-14.59") */
+    private String normalRange;
+
+    /** 详细说明文字 */
+    private String description;
+
+    /** 相关建议(如补充来源) */
+    private String suggestion;
+
+    /** 数据来源 */
+    private String source;
+
+    private Date createdAt;
+
+    private Date updatedAt;
+}

+ 7 - 0
cfc-backend/src/main/java/com/etotem/cfc/mapper/HealthKnowledgeBaseMapper.java

@@ -0,0 +1,7 @@
+package com.etotem.cfc.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+
+public interface HealthKnowledgeBaseMapper extends BaseMapper<HealthKnowledgeBase> {
+}

+ 59 - 0
cfc-backend/src/main/java/com/etotem/cfc/service/HealthKnowledgeBaseService.java

@@ -0,0 +1,59 @@
+package com.etotem.cfc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.etotem.cfc.entity.HealthKnowledgeBase;
+import com.etotem.cfc.mapper.HealthKnowledgeBaseMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class HealthKnowledgeBaseService {
+
+    @Resource
+    private HealthKnowledgeBaseMapper healthKnowledgeBaseMapper;
+
+    /**
+     * 单条查询
+     */
+    public HealthKnowledgeBase query(String itemType, String itemName) {
+        return healthKnowledgeBaseMapper.selectOne(
+                new LambdaQueryWrapper<HealthKnowledgeBase>()
+                        .eq(HealthKnowledgeBase::getItemType, itemType)
+                        .eq(HealthKnowledgeBase::getItemName, itemName)
+        );
+    }
+
+    /**
+     * 批量查询 — queries 为 [{itemType, itemName}, ...]
+     * 返回 Map.key = "itemType:itemName"
+     */
+    public Map<String, HealthKnowledgeBase> batchQuery(List<Map<String, String>> queries) {
+        Map<String, HealthKnowledgeBase> result = new HashMap<>();
+        for (Map<String, String> q : queries) {
+            String itemType = q.get("itemType");
+            String itemName = q.get("itemName");
+            if (itemType == null || itemName == null) {
+                continue;
+            }
+            String key = itemType + ":" + itemName;
+            HealthKnowledgeBase entry = query(itemType, itemName);
+            if (entry != null) {
+                result.put(key, entry);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 插入单条(用于数据导入)
+     */
+    public void insert(HealthKnowledgeBase entry) {
+        healthKnowledgeBaseMapper.insert(entry);
+    }
+}

+ 16 - 0
cfc-backend/src/main/resources/schema.sql

@@ -3971,6 +3971,22 @@ CREATE TABLE IF NOT EXISTS `service_settlements` (
     KEY `idx_provider_id` (`provider_id`),
     KEY `idx_status` (`status`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='服务结算记录';
+
+-- 健康知识库 — 菌属/营养素/指标说明
+CREATE TABLE IF NOT EXISTS `health_knowledge_base` (
+    `id` BIGINT AUTO_INCREMENT PRIMARY KEY,
+    `item_type` VARCHAR(50) NOT NULL COMMENT '类型: bacteria/nutrient/indicator/vitamin/amino_acid/disease',
+    `item_name` VARCHAR(200) NOT NULL COMMENT '项目名称(精确匹配)',
+    `category` VARCHAR(100) COMMENT '分类(如 有益菌/有害菌)',
+    `normal_range` VARCHAR(200) COMMENT '正常范围参考',
+    `description` TEXT COMMENT '详细说明',
+    `suggestion` TEXT COMMENT '相关建议',
+    `source` VARCHAR(100) COMMENT '数据来源',
+    `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
+    `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    UNIQUE KEY `uk_item_type_name` (`item_type`, `item_name`),
+    KEY `idx_item_type` (`item_type`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康知识库 - 菌属/营养素/指标说明';
 -- =============================================
 -- DAN报告上传独立化(拆分 PDF 报告生命周期与数值结果)
 -- =============================================