Explorar o código

属名名词解释版本

chenbin hai 4 meses
pai
achega
211801b0b7

+ 61 - 0
src/main/java/com/qizhen/healsphere/ExplainAssistant.java

@@ -0,0 +1,61 @@
+package com.qizhen.healsphere;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.http.Method;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.qizhen.healsphere.common.ai.QizhenAssistant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ExplainAssistant {
+
+    public static String getConversationId(String appId) {
+        JSONObject json = new JSONObject();
+        json.put("app_id", appId);
+        //json.put("app_id", "454b1634-91ad-4dde-9d2f-f9a3302fdcbe");
+        HttpRequest request = HttpUtil.createRequest(Method.POST, "https://qianfan.baidubce.com/v2/app/conversation")
+                .header("Authorization", "Bearer bce-v3/ALTAK-MyGbNEA18oT3boS2nOga1/d8b5057f7842f59b2c64971d8d077fe724d0aed5")
+                .header("Content-Type", "application/json")
+                .body(json.toJSONString());
+        ;
+        String resposne = request.execute().body();
+        return JSONObject.parseObject(resposne).getString("conversation_id");
+    }
+
+    public static String call(String appId, String conversationId, String userInput){
+        JSONObject json = new JSONObject();
+        json.put("app_id", appId);
+        json.put("conversation_id", conversationId);
+        json.put("query", userInput);
+        json.put("stream", false);
+
+
+        HttpRequest request = HttpUtil.createRequest(Method.POST, "https://qianfan.baidubce.com/v2/app/conversation/runs")
+                .header("Authorization", "Bearer bce-v3/ALTAK-MyGbNEA18oT3boS2nOga1/d8b5057f7842f59b2c64971d8d077fe724d0aed5")
+                .header("Content-Type", "application/json")
+                .body(json.toJSONString()).timeout(120 * 1000);
+        long l = System.currentTimeMillis();
+        String resposne = request.execute().body();
+        System.out.println(userInput.length());
+        long ct = (System.currentTimeMillis() - l) / 1000;
+        System.out.println(ct);
+        System.out.println(userInput.length()/ct);
+        System.out.println("===========================");
+        return resposne;
+    }
+
+    public static void main(String[] args) {
+        String appId = "03a62954-9bb0-4abe-9c7e-b7555cd3c2a0";
+        String response =  ExplainAssistant.call(appId,ExplainAssistant.getConversationId(appId),"Neisseria subflava,Neisseria flavescens");
+        System.out.println(JSONObject.parseObject(response).getString("answer"));
+    }
+
+}

+ 21 - 0
src/main/java/com/qizhen/healsphere/repository/mapper/BacteriaGenusMapper.java

@@ -0,0 +1,21 @@
+package com.qizhen.healsphere.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qizhen.healsphere.repository.mapper.entity.KgCountInfo;
+import com.qizhen.healsphere.web.param.BacteriaGenus;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import java.util.List;
+
+@Mapper
+public interface BacteriaGenusMapper extends BaseMapper<BacteriaGenus> {
+
+    @Select("<script>" +
+            "SELECT type, \"genericName\", \"relativeRate\", \"totalNum\" FROM bacteriagenus WHERE \"genericName\" IN " +
+            "<foreach collection='genericNames' item='item' open='(' separator=',' close=')'>" +
+            "   #{item}" +
+            "</foreach>" +
+            "</script>")
+    List<BacteriaGenus> findByGenericNames(@Param("genericNames") List<String> genericNames);
+}

+ 24 - 0
src/main/java/com/qizhen/healsphere/repository/mapper/StrainMapper.java

@@ -0,0 +1,24 @@
+package com.qizhen.healsphere.repository.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qizhen.healsphere.web.param.BacteriaGenus;
+import com.qizhen.healsphere.web.param.Strain;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface StrainMapper extends BaseMapper<Strain> {
+
+    @Select("<script>" +
+            "SELECT name AS \"kindName\", new_est_reads AS \"num\", fraction_total_reads AS \"rate\", \"parentName\" " +
+            "FROM strain " +
+            "WHERE \"parentName\" IN " +
+            "<foreach collection='parentNames' item='item' open='(' separator=',' close=')'>" +
+            "   #{item}" +
+            "</foreach>" +
+            "</script>")
+    List<Strain> findByParentNames(@Param("parentNames") List<String> parentNames);
+}

+ 50 - 0
src/main/java/com/qizhen/healsphere/service/impl/ZYApiServiceImpl.java

@@ -0,0 +1,50 @@
+package com.qizhen.healsphere.service.impl;
+
+import com.qizhen.healsphere.repository.mapper.BacteriaGenusMapper;
+import com.qizhen.healsphere.repository.mapper.StrainMapper;
+import com.qizhen.healsphere.web.param.BacteriaGenus;
+import com.qizhen.healsphere.web.param.Strain;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+@Slf4j
+@Service
+public class ZYApiServiceImpl {
+
+    @Autowired
+    private BacteriaGenusMapper bacteriaGenusMapper;
+
+    @Autowired
+    private StrainMapper strainMapper;
+
+    public List<BacteriaGenus> getBacteriaInfo(String input) {
+        log.info("Calling getBacteriaInfo with input: {}", input);
+        // 将输入字符串按逗号分割成列表
+        List<String> genericNames = Arrays.asList(input.split(","));
+
+        // 查询 bacteriagenus 表
+        List<BacteriaGenus> bacteriaGenera = bacteriaGenusMapper.findByGenericNames(genericNames);
+
+        // 查询 strain 表
+        List<Strain> strains = strainMapper.findByParentNames(genericNames);
+
+        // 将 strains 按 parentName 分组
+        Map<String, List<Strain>> strainMap = strains.stream()
+                .collect(Collectors.groupingBy(Strain::getParentName));
+
+        // 将 strains 设置到对应的 BacteriaGenus 对象中
+        for (BacteriaGenus bacteriaGenus : bacteriaGenera) {
+            String genericName = bacteriaGenus.getGenericName();
+            if (strainMap.containsKey(genericName)) {
+                bacteriaGenus.setStrain(strainMap.get(genericName));
+            }
+        }
+
+        return bacteriaGenera;
+    }
+}

+ 131 - 0
src/main/java/com/qizhen/healsphere/web/ZYController.java

@@ -0,0 +1,131 @@
+package com.qizhen.healsphere.web;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.qizhen.healsphere.ExplainAssistant;
+import com.qizhen.healsphere.service.impl.DepartmentServiceImpl;
+import com.qizhen.healsphere.service.impl.ZYApiServiceImpl;
+import com.qizhen.healsphere.web.param.BacteriaGenus;
+import com.qizhen.healsphere.web.param.DetailInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.xml.soap.Text;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@Slf4j
+public class ZYController {
+
+    @Autowired
+    private ZYApiServiceImpl zyApiService;
+
+    @PostMapping("/info")
+    @ResponseBody
+    public DetailInfo getBacteriaInfo(@RequestParam String input) {
+        // 获取细菌信息
+        List<BacteriaGenus> bacteriaGenusList = zyApiService.getBacteriaInfo(input);
+
+        // 获取解释信息并清洗
+        List<String> explainList = getExplainAssistant(input);
+
+        // 封装返回值到 DetailInfo 对象
+        DetailInfo detailInfo = new DetailInfo();
+        detailInfo.setBacteriaGenusList(bacteriaGenusList);
+        detailInfo.setExplainList(explainList);
+
+        return detailInfo;
+    }
+
+    /**
+     * 获取解释信息并清洗
+     *
+     * @param input 用户输入
+     * @return 清洗后的解释列表
+     */
+    public List<String> getExplainAssistant(String input) {
+        String appId = "03a62954-9bb0-4abe-9c7e-b7555cd3c2a0";
+        String response = ExplainAssistant.call(appId, ExplainAssistant.getConversationId(appId), input);
+
+        List<String> resultList = new ArrayList<>();
+        if (response != null && !response.isEmpty()) {
+            try {
+                // 解析 JSON 响应
+                ObjectMapper mapper = new ObjectMapper();
+                JsonNode rootNode = mapper.readTree(response);
+
+                // 提取 "answer" 或 "text" 字段
+                if (rootNode.has("answer")) {
+                    resultList.add(rootNode.get("answer").asText());
+                } else if (rootNode.has("text")) {
+                    resultList.add(rootNode.get("text").asText());
+                } else {
+                    // 如果 JSON 中没有 "answer" 或 "text",直接按原始逻辑处理
+                    processRawResponse(response, resultList);
+                }
+            } catch (Exception e) {
+                log.error("Failed to parse JSON response: {}", response, e);
+                // 如果解析失败,按原始逻辑处理
+                processRawResponse(response, resultList);
+            }
+        }
+
+        // 清洗和格式化解释文本
+        return cleanExplainList(resultList);
+    }
+
+    /**
+     * 处理原始响应(按 ### 分割并清洗)
+     *
+     * @param response  原始响应
+     * @param resultList 结果列表
+     */
+    private void processRawResponse(String response, List<String> resultList) {
+        // 按 ### 分割字符串
+        String[] parts = response.split("###");
+        for (String part : parts) {
+            // 替换 \n\n 为 <br/>
+            String cleanedPart = part.trim().replace("\n\n", "<br/>");
+            if (!cleanedPart.isEmpty()) {
+                resultList.add(cleanedPart);
+            }
+        }
+    }
+
+    /**
+     * 清洗解释列表
+     *
+     * @param rawExplains 原始解释列表
+     * @return 清洗后的解释列表
+     */
+    private List<String> cleanExplainList(List<String> rawExplains) {
+        List<String> cleanedList = new ArrayList<>();
+        for (String rawExplain : rawExplains) {
+            // 移除 JSON 元数据(如 "usage": {...})
+            String cleanedText = rawExplain
+                    .replaceAll("\"usage\":\\s*\\{[^}]*\\}", "")
+                    .replaceAll("\"event_code\":\\s*\\d+", "")
+                    .replaceAll("\\{\\s*.*?\\s*\\}", ""); // 移除残留的 JSON 结构
+
+            // 替换转义字符
+            cleanedText = cleanedText
+                    .replace("\n\n", "<br/>")  // 替换单个换行符
+                    .replace("\"", "")
+                    .replace("\\\\", "");
+
+            // 按 ### 分割并添加到 cleanedList
+            String[] parts = cleanedText.split("###");
+            for (String part : parts) {
+                if (!part.trim().isEmpty()) {
+                    cleanedList.add(part.trim());
+                }
+            }
+        }
+        return cleanedList;
+    }
+}

+ 14 - 0
src/main/java/com/qizhen/healsphere/web/param/BacteriaGenus.java

@@ -0,0 +1,14 @@
+package com.qizhen.healsphere.web.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BacteriaGenus {
+    private String type;
+    private String genericName;
+    private Double relativeRate;
+    private int totalNum;
+    private List<Strain> strain;
+}

+ 11 - 0
src/main/java/com/qizhen/healsphere/web/param/DetailInfo.java

@@ -0,0 +1,11 @@
+package com.qizhen.healsphere.web.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DetailInfo {
+    private List<BacteriaGenus> bacteriaGenusList;
+    private List<String> explainList;
+}

+ 19 - 0
src/main/java/com/qizhen/healsphere/web/param/Strain.java

@@ -0,0 +1,19 @@
+package com.qizhen.healsphere.web.param;
+
+import lombok.Data;
+
+@Data
+public class Strain{
+    private String parentName; //和BacteriaGenus中的genericNam对应
+    private String kindName;
+    private String trustRate = "99%";
+    private Double rate;
+    private int num;
+    public String getParentName() {
+        return parentName;
+    }
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+}

+ 8 - 0
src/main/java/com/qizhen/healsphere/web/vo/InputVO.java

@@ -0,0 +1,8 @@
+package com.qizhen.healsphere.web.vo;
+
+import lombok.Data;
+
+@Data
+public class InputVO {
+    private String text;
+}

+ 12 - 11
src/main/resources/application-local.yml

@@ -4,21 +4,21 @@ swagger:
 spring:
   datasource:
     hikari:
-      jdbc-url: jdbc:postgresql://172.16.8.64:5432/postgres
+      jdbc-url: jdbc:postgresql://172.16.8.64:5432/zy
       driver-class-name: org.postgresql.Driver
       username: postgres
       password: 12345678
-#      jdbc-url: jdbc:mysql://173.18.12.194:3306/sys-ltkg?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
-#      driver-class-name: com.mysql.cj.jdbc.Driver
-#      username: root
-#      password: dsYun8!@#
+  #      jdbc-url: jdbc:mysql://173.18.12.194:3306/sys-ltkg?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
+  #      driver-class-name: com.mysql.cj.jdbc.Driver
+  #      username: root
+  #      password: dsYun8!@#
 
   neo4j:
-#    uri: bolt://172.16.8.59:7687
-#    authentication:
-#      username: neo4j
-#      password: 1Qaz@wsx
-#    uri: bolt://173.18.12.206:7687
+    #    uri: bolt://172.16.8.59:7687
+    #    authentication:
+    #      username: neo4j
+    #      password: 1Qaz@wsx
+    #    uri: bolt://173.18.12.206:7687
     uri: bolt://173.18.12.194:7687
     authentication:
       username: neo4j
@@ -35,7 +35,8 @@ springfox:
     enabled: true
 
 server:
-  port: 8086
+  address: 0.0.0.0  # 绑定到所有网络接口
+  port: 8086        # 端口
   max-http-header-size: 10MB
 
 logging:

+ 15 - 0
src/main/resources/mapper/mysql/BacteriaGenusMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.qizhen.healsphere.repository.mapper.BacteriaGenusMapper">
+    <!-- 定义 BaseResultMap -->
+    <resultMap id="BaseResultMap" type="com.qizhen.healsphere.web.param.BacteriaGenus">
+        <id property="type" column="type"/>
+        <result property="genericName" column="genericName"/>
+        <result property="relativeRate" column="relativeRate"/>
+        <result property="totalNum" column="totalNum"/>
+    </resultMap>
+
+</mapper>

+ 10 - 0
src/main/resources/mapper/mysql/StrainMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qizhen.healsphere.repository.mapper.StrainMapper">
+    <resultMap id="BaseResultMap" type="com.qizhen.healsphere.web.param.Strain">
+        <id property="kindName" column="name"/>
+        <result property="num" column="new_est_reads"/>
+        <result property="rate" column="fraction_total_reads"/>
+        <result property="parentName" column="parentName"/>
+    </resultMap>
+</mapper>