浏览代码

知识库v2

zhaops 5 年之前
父节点
当前提交
ffbc28ff8c
共有 19 个文件被更改,包括 554 次插入37 次删除
  1. 27 0
      aipt-service/src/main/java/com/diagbot/client/AINeoServiceClient.java
  2. 31 0
      aipt-service/src/main/java/com/diagbot/client/hystrix/AINeoServiceHystrix.java
  3. 91 0
      aipt-service/src/main/java/com/diagbot/facade/PushV2Facade.java
  4. 44 0
      aipt-service/src/main/java/com/diagbot/web/PushV2Controller.java
  5. 18 0
      common/src/main/java/com/diagbot/biz/push/entity/FeatureRateV2.java
  6. 16 0
      common/src/main/java/com/diagbot/biz/push/entity/FeatureRateWithExplainV2.java
  7. 26 0
      common/src/main/java/com/diagbot/biz/push/entity/ResponseDataV2.java
  8. 25 0
      common/src/main/java/com/diagbot/biz/push/entity/ResponseDataWithExplainV2.java
  9. 5 1
      config-server/src/main/resources/shared/aipt-service-dev.yml
  10. 5 1
      config-server/src/main/resources/shared/aipt-service-local.yml
  11. 5 1
      config-server/src/main/resources/shared/aipt-service-pre.yml
  12. 5 1
      config-server/src/main/resources/shared/aipt-service-pro.yml
  13. 5 1
      config-server/src/main/resources/shared/aipt-service-test.yml
  14. 19 0
      triage-service/src/main/java/com/diagbot/client/AiptServiceClient.java
  15. 26 0
      triage-service/src/main/java/com/diagbot/client/hystrix/AiptServiceHystrix.java
  16. 4 31
      triage-service/src/main/java/com/diagbot/facade/AIFacade.java
  17. 154 0
      triage-service/src/main/java/com/diagbot/facade/AIV2Facade.java
  18. 44 0
      triage-service/src/main/java/com/diagbot/facade/AssembleFacade.java
  19. 4 1
      triage-service/src/main/java/com/diagbot/web/AIController.java

+ 27 - 0
aipt-service/src/main/java/com/diagbot/client/AINeoServiceClient.java

@@ -0,0 +1,27 @@
+package com.diagbot.client;
+
+import com.diagbot.biz.push.entity.ResponseDataV2;
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.client.hystrix.AINeoServiceHystrix;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/16 16:27
+ */
+@FeignClient(name = "AINeo", url = "${aineo.server.address}", fallback = AINeoServiceHystrix.class)
+public interface AINeoServiceClient {
+
+    /**
+     * 推理
+     *
+     * @param searchData
+     * @return
+     */
+    @PostMapping(value = "/api/push")
+    Response<ResponseDataV2> push(@RequestBody SearchData searchData);
+}

+ 31 - 0
aipt-service/src/main/java/com/diagbot/client/hystrix/AINeoServiceHystrix.java

@@ -0,0 +1,31 @@
+package com.diagbot.client.hystrix;
+
+import com.diagbot.biz.push.entity.ResponseDataV2;
+import com.diagbot.client.AINeoServiceClient;
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.SearchData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/16 16:27
+ */
+@Component
+@Slf4j
+public class AINeoServiceHystrix implements AINeoServiceClient {
+
+    /**
+     * 推理
+     *
+     * @param searchData
+     * @return
+     */
+    @Override
+    public Response<ResponseDataV2> push(@RequestBody SearchData searchData) {
+        log.error("【hystrix】调用{}异常", "push");
+        return null;
+    }
+}

+ 91 - 0
aipt-service/src/main/java/com/diagbot/facade/PushV2Facade.java

@@ -0,0 +1,91 @@
+package com.diagbot.facade;
+
+import com.diagbot.biz.push.entity.FeatureRate;
+import com.diagbot.biz.push.entity.FeatureRateV2;
+import com.diagbot.biz.push.entity.FeatureRateWithExplain;
+import com.diagbot.biz.push.entity.FeatureRateWithExplainV2;
+import com.diagbot.biz.push.entity.ResponseData;
+import com.diagbot.biz.push.entity.ResponseDataV2;
+import com.diagbot.biz.push.entity.ResponseDataWithExplain;
+import com.diagbot.biz.push.entity.ResponseDataWithExplainV2;
+import com.diagbot.biz.push.vo.SearchVO;
+import com.diagbot.client.AINeoServiceClient;
+import com.diagbot.client.bean.Response;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.entity.KlSymptom;
+import com.diagbot.enums.LexiconTypeEnum;
+import com.diagbot.enums.SysTypeEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.ListUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/16 16:32
+ */
+@Component
+public class PushV2Facade {
+    @Autowired
+    private AINeoServiceClient aiNeoServiceClient;
+    @Autowired
+    private AssembleFacade assembleFacade;
+    @Autowired
+    private ConceptFacade conceptFacade;
+
+    /**
+     * 大数据原始推理结果
+     *
+     * @param searchVO
+     * @return
+     */
+    public ResponseDataV2 originalPush(SearchVO searchVO) {
+        SearchData searchData = assembleFacade.assembleData(searchVO);
+        Response<ResponseDataV2> res = aiNeoServiceClient.push(searchData);
+        if (res == null || res.getData() == null) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "AI没有返回结果");
+        }
+        return res.getData();
+    }
+
+    /**
+     * 推理结果带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    public ResponseDataWithExplainV2 pushWithExplain(SearchVO searchVO) {
+        ResponseDataWithExplainV2 responseData = new ResponseDataWithExplainV2();
+        ResponseDataV2 data = this.originalPush(searchVO);
+        List<FeatureRateV2> symptom = data.getSymptom();
+        if (ListUtil.isNotEmpty(symptom)
+                && (searchVO.getSysType().equals(SysTypeEnum.PREC_SERVICE.getKey())
+                || searchVO.getSysType().equals(SysTypeEnum.TRIAGE_SERVICE.getKey()))) {
+            List<String> names = symptom.stream().map(item -> item.getFeatureName()).collect(Collectors.toList());
+            Map<String, KlSymptom> klSymptomMap
+                    = conceptFacade.getSymptomWithExplain(names, LexiconTypeEnum.SYMPTOM.getKey());
+            List<FeatureRateWithExplainV2> featureRateWithExplains
+                    = BeanUtil.listCopyTo(symptom, FeatureRateWithExplainV2.class);
+            if (klSymptomMap != null) {
+                for (FeatureRateWithExplainV2 featureRateWithExplain : featureRateWithExplains) {
+                    if (klSymptomMap.containsKey(featureRateWithExplain.getFeatureName())) {
+                        featureRateWithExplain
+                                .setDescription(klSymptomMap.get(featureRateWithExplain.getFeatureName()).getDescription());
+                        featureRateWithExplain
+                                .setExplains(klSymptomMap.get(featureRateWithExplain.getFeatureName()).getExplains());
+                    }
+                }
+            }
+            responseData.setSymptom(featureRateWithExplains);
+        }
+        responseData.setDis(data.getDis());
+        return responseData;
+    }
+}

+ 44 - 0
aipt-service/src/main/java/com/diagbot/web/PushV2Controller.java

@@ -0,0 +1,44 @@
+package com.diagbot.web;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.biz.push.entity.ResponseData;
+import com.diagbot.biz.push.entity.ResponseDataV2;
+import com.diagbot.biz.push.entity.ResponseDataWithExplainV2;
+import com.diagbot.biz.push.vo.SearchVO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.PushV2Facade;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+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.validation.Valid;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/16 16:34
+ */
+@RestController
+@RequestMapping("/pushV2")
+@Api(value = "推理V2相关API", tags = { "知识库标准化-推理V2相关API" })
+public class PushV2Controller {
+    @Autowired
+    private PushV2Facade pushV2Facade;
+
+    @PostMapping("/originalPush")
+    @SysLogger("originalPush")
+    public RespDTO<ResponseDataV2> originalPush(@Valid @RequestBody SearchVO searchVO) {
+        ResponseDataV2 data = pushV2Facade.originalPush(searchVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @PostMapping("/pushWithExplainV2")
+    @SysLogger("pushWithExplainV2")
+    public RespDTO<ResponseDataWithExplainV2> pushWithExplainV2(@Valid @RequestBody SearchVO searchVO) {
+        ResponseDataWithExplainV2 data = pushV2Facade.pushWithExplain(searchVO);
+        return RespDTO.onSuc(data);
+    }
+}

+ 18 - 0
common/src/main/java/com/diagbot/biz/push/entity/FeatureRateV2.java

@@ -0,0 +1,18 @@
+package com.diagbot.biz.push.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/17 10:19
+ */
+@Getter
+@Setter
+public class FeatureRateV2 extends FeatureRate {
+    /**
+     * 诊断分类
+     */
+    private String bigClass;
+}

+ 16 - 0
common/src/main/java/com/diagbot/biz/push/entity/FeatureRateWithExplainV2.java

@@ -0,0 +1,16 @@
+package com.diagbot.biz.push.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/17 10:24
+ */
+@Getter
+@Setter
+public class FeatureRateWithExplainV2 extends FeatureRateV2 {
+    private String description;
+    private String explains;
+}

+ 26 - 0
common/src/main/java/com/diagbot/biz/push/entity/ResponseDataV2.java

@@ -0,0 +1,26 @@
+package com.diagbot.biz.push.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/17 10:13
+ */
+@Getter
+@Setter
+public class ResponseDataV2 {
+    /**
+     * 症状
+     */
+    private List<FeatureRateV2> symptom = new ArrayList<>(10);
+
+    /**
+     * 诊断
+     */
+    private List<FeatureRateV2> dis = new ArrayList<>(10);
+}

+ 25 - 0
common/src/main/java/com/diagbot/biz/push/entity/ResponseDataWithExplainV2.java

@@ -0,0 +1,25 @@
+package com.diagbot.biz.push.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/17 10:25
+ */
+@Getter
+@Setter
+public class ResponseDataWithExplainV2 {
+    /**
+     * 症状
+     */
+    private List<FeatureRateWithExplainV2> symptom = new ArrayList<>(10);
+    /**
+     * 诊断
+     */
+    private List<FeatureRateV2> dis = new ArrayList<>(10);
+}

+ 5 - 1
config-server/src/main/resources/shared/aipt-service-dev.yml

@@ -103,4 +103,8 @@ ai:
 
 nlp:
   server:
-    address: http://192.168.2.234:5002
+    address: http://192.168.2.234:5002
+
+aineo:
+  server:
+    address: http://192.168.3.150:8888

+ 5 - 1
config-server/src/main/resources/shared/aipt-service-local.yml

@@ -103,4 +103,8 @@ ai:
 
 nlp:
   server:
-    address: http://192.168.2.234:5002
+    address: http://192.168.2.234:5002
+
+aineo:
+  server:
+    address: http://192.168.3.150:8888

+ 5 - 1
config-server/src/main/resources/shared/aipt-service-pre.yml

@@ -103,4 +103,8 @@ ai:
 
 nlp:
   server:
-    address: http://192.168.2.186:5002
+    address: http://192.168.2.186:5002
+
+aineo:
+  server:
+    address: http://192.168.3.150:8888

+ 5 - 1
config-server/src/main/resources/shared/aipt-service-pro.yml

@@ -103,4 +103,8 @@ ai:
 
 nlp:
   server:
-    address: http://192.168.2.123:5002
+    address: http://192.168.2.123:5002
+
+aineo:
+  server:
+    address: http://192.168.3.150:8888

+ 5 - 1
config-server/src/main/resources/shared/aipt-service-test.yml

@@ -103,4 +103,8 @@ ai:
 
 nlp:
   server:
-    address: http://192.168.2.241:5002
+    address: http://192.168.2.241:5002
+
+aineo:
+  server:
+    address: http://192.168.3.150:8888

+ 19 - 0
triage-service/src/main/java/com/diagbot/client/AiptServiceClient.java

@@ -2,6 +2,7 @@ package com.diagbot.client;
 
 import com.diagbot.biz.push.entity.ResponseData;
 import com.diagbot.biz.push.entity.ResponseDataWithExplain;
+import com.diagbot.biz.push.entity.ResponseDataWithExplainV2;
 import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.client.hystrix.AiptServiceHystrix;
 import com.diagbot.dto.ConceptBaseDTO;
@@ -76,6 +77,15 @@ public interface AiptServiceClient {
     @PostMapping(value = "/clinicaldata/processData")
     RespDTO<ResponseData> aiptData(@RequestBody SearchVO searchVO);
 
+    /**
+     * 推理返回大数据原始结果
+     *
+     * @param searchVO
+     * @return
+     */
+    @PostMapping(value = "/pushV2/originalPush")
+    RespDTO<ResponseData> originalPush(@Valid @RequestBody SearchVO searchVO);
+
     /**
      * 推理带名词解释
      *
@@ -85,6 +95,15 @@ public interface AiptServiceClient {
     @PostMapping(value = "/push/pushWithExplain")
     RespDTO<ResponseDataWithExplain> pushWithExplain(@Valid @RequestBody SearchVO searchVO);
 
+    /**
+     * 推理带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    @PostMapping(value = "/pushV2/pushWithExplainV2")
+    RespDTO<ResponseDataWithExplainV2> pushWithExplainV2(@Valid @RequestBody SearchVO searchVO);
+
     /**
      * 获取版本信息
      */

+ 26 - 0
triage-service/src/main/java/com/diagbot/client/hystrix/AiptServiceHystrix.java

@@ -2,6 +2,7 @@ package com.diagbot.client.hystrix;
 
 import com.diagbot.biz.push.entity.ResponseData;
 import com.diagbot.biz.push.entity.ResponseDataWithExplain;
+import com.diagbot.biz.push.entity.ResponseDataWithExplainV2;
 import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.client.AiptServiceClient;
 import com.diagbot.dto.ConceptBaseDTO;
@@ -18,6 +19,7 @@ import com.diagbot.vo.RetrievalVO;
 import com.diagbot.vo.VersionVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
@@ -68,6 +70,18 @@ public class AiptServiceHystrix implements AiptServiceClient {
         return null;
     }
 
+    /**
+     * 推理返回大数据原始结果
+     *
+     * @param searchVO
+     * @return
+     */
+    @Override
+    public RespDTO<ResponseData> originalPush(@Valid @RequestBody SearchVO searchVO) {
+        log.error("【hystrix】调用{}异常", "originalPush");
+        return null;
+    }
+
     /**
      * 推理带名词解释
      *
@@ -80,6 +94,18 @@ public class AiptServiceHystrix implements AiptServiceClient {
         return null;
     }
 
+    /**
+     * 推理带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    @Override
+    public RespDTO<ResponseDataWithExplainV2> pushWithExplainV2(@Valid @RequestBody SearchVO searchVO) {
+        log.error("【hystrix】调用{}异常", "pushWithExplainV2");
+        return null;
+    }
+
     /**
      * 获取版本信息
      */

+ 4 - 31
triage-service/src/main/java/com/diagbot/facade/AIFacade.java

@@ -3,7 +3,6 @@ package com.diagbot.facade;
 import com.diagbot.biz.push.entity.FeatureRate;
 import com.diagbot.biz.push.entity.FeatureRateWithExplain;
 import com.diagbot.biz.push.entity.ResponseDataWithExplain;
-import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.client.AiptServiceClient;
 import com.diagbot.client.TranServiceClient;
 import com.diagbot.dto.AIDTO;
@@ -16,7 +15,6 @@ import com.diagbot.dto.SYFDTO;
 import com.diagbot.dto.SYFDeptDTO;
 import com.diagbot.dto.SYFDiseaseDeptDTO;
 import com.diagbot.dto.SYFFeatureDTO;
-import com.diagbot.enums.SysTypeEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.util.BeanUtil;
@@ -56,6 +54,8 @@ public class AIFacade {
     private TranServiceClient tranServiceClient;
     @Autowired
     private FeatureFacade featureFacade;
+    @Autowired
+    private AssembleFacade assembleFacade;
 
     /**
      * 调用ai接口业务逻辑
@@ -64,7 +64,7 @@ public class AIFacade {
      * @return AI接口返回结果
      */
     public AIDTO push(AIVO aivo, String type) {
-        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleData(aivo, type));
+        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleFacade.assembleData(aivo, type));
         RespDTOUtil.respNGDealCover(res, "中间层没有结果返回");
         AIDTO aidto = new AIDTO();
         switch (type) {
@@ -193,7 +193,7 @@ public class AIFacade {
         List<FeatureConceptDTO> featureConceptDTOList = featureFacade.getSymptomFeature(aivo.getSymptom());
         Integer symptomSize = ListUtil.isEmpty(featureConceptDTOList) ? 0 : featureConceptDTOList.size();
 
-        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleData(aivo, type));
+        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleFacade.assembleData(aivo, type));
         RespDTOUtil.respNGDealCover(res, "中间层没有结果返回");
         SYFDTO syfdto = new SYFDTO();
 
@@ -537,31 +537,4 @@ public class AIFacade {
         }
         return items;
     }
-
-    private SearchVO assembleData(AIVO aivo, String type) {
-        SearchVO searchVO = new SearchVO();
-        searchVO.setAge(aivo.getAge());
-        searchVO.setHosCode(aivo.getHospitalCode());
-        searchVO.setSymptom(aivo.getSymptom());
-        switch (aivo.getSex()) {
-            case 1:
-            case 2:
-                searchVO.setSex(aivo.getSex());
-                break;
-            default:
-                throw new CommonException(CommonErrorCode.PARAM_ERROR, "不能输入男女以外的性别");
-        }
-        searchVO.setFeatureType(type);
-        searchVO.setSysCode("1");
-        switch (type) {
-            case "1":
-                searchVO.setLength(10);
-                break;
-            case "7":
-                searchVO.setLength(10);
-                break;
-        }
-        searchVO.setSysType(SysTypeEnum.TRIAGE_SERVICE.getKey());
-        return searchVO;
-    }
 }

+ 154 - 0
triage-service/src/main/java/com/diagbot/facade/AIV2Facade.java

@@ -0,0 +1,154 @@
+package com.diagbot.facade;
+
+import com.diagbot.biz.push.entity.FeatureRateV2;
+import com.diagbot.biz.push.entity.ResponseDataWithExplainV2;
+import com.diagbot.client.AiptServiceClient;
+import com.diagbot.client.TranServiceClient;
+import com.diagbot.dto.DiseaseDeptDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SYFDTO;
+import com.diagbot.dto.SYFDeptDTO;
+import com.diagbot.dto.SYFDiseaseDeptDTO;
+import com.diagbot.dto.SYFFeatureDTO;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.FastJsonUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RespDTOUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.AIVO;
+import com.diagbot.vo.DiseaseDeptVO;
+import com.google.common.collect.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/16 17:45
+ */
+@Component
+public class AIV2Facade {
+    @Autowired
+    private AiptServiceClient aiptServiceClient;
+    @Autowired
+    private TranServiceClient tranServiceClient;
+    @Autowired
+    private AssembleFacade assembleFacade;
+
+
+    public SYFDTO pushDisForSYFV2(AIVO aivo, String type) {
+        if (StringUtil.isBlank(aivo.getHospitalCode())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请输入医院编码");
+        }
+        RespDTO<ResponseDataWithExplainV2> res = aiptServiceClient.pushWithExplainV2(assembleFacade.assembleData(aivo, type));
+        RespDTOUtil.respNGDealCover(res, "中间层没有结果返回");
+        SYFDTO syfdto = new SYFDTO();
+
+        List<SYFDiseaseDeptDTO> items = Lists.newLinkedList();
+        List<FeatureRateV2> dis = res.data.getDis();
+        if (ListUtil.isNotEmpty(dis)) {
+            Map<String, List<SYFFeatureDTO>> disFeatureMap = new LinkedHashMap<>();
+            List<SYFFeatureDTO> disDTO = BeanUtil.listCopyTo(dis, SYFFeatureDTO.class);
+
+            //关联邵逸夫医院映射
+            DiseaseDeptVO diseaseDeptVO = new DiseaseDeptVO();
+            diseaseDeptVO.setHospitalCode(aivo.getHospitalCode());
+            List<String> disNames = dis.stream().map(i -> i.getFeatureName()).collect(Collectors.toList());
+            diseaseDeptVO.setConceptNames(disNames);
+            RespDTO<List<DiseaseDeptDTO>> diseaseDeptDTORes
+                    = tranServiceClient.getDiseaseDeptByConceptNames(diseaseDeptVO);
+            RespDTOUtil.respNGDealCover(diseaseDeptDTORes, "诊断科室映射关系未维护");
+            List<DiseaseDeptDTO> diseaseDeptDTOList = diseaseDeptDTORes.data;
+            Map<String, List<DiseaseDeptDTO>> diseaseDeptMap
+                    = EntityUtil.makeEntityListMap(diseaseDeptDTOList, "conceptDisName");
+            //诊断分类
+            for (SYFFeatureDTO featureRateDTO : disDTO) {
+                //关联外部诊断科室
+                if (diseaseDeptMap != null
+                        && ListUtil.isNotEmpty(diseaseDeptMap.get(featureRateDTO.getFeatureName()))) {
+                    List<DiseaseDeptDTO> ddList = diseaseDeptMap.get(featureRateDTO.getFeatureName());
+                    featureRateDTO.setDeptName(ddList.get(0).getDeptName());
+                    featureRateDTO.setSubDeptName(ddList.get(0).getSubDeptName());
+                    featureRateDTO.setDiseaseName(ddList.get(0).getDiseaseName());
+                    featureRateDTO.setDeptCode(ddList.get(0).getDeptCode());
+                    featureRateDTO.setSubDeptCode(ddList.get(0).getSubDeptCode());
+                    if (StringUtil.isNotBlank(ddList.get(0).getSubDeptName())
+                            && (!ddList.get(0).getDeptName().equals(ddList.get(0).getSubDeptName()))) {
+                        featureRateDTO
+                                .setConcatDept(ddList.get(0).getDeptName() + "-" + ddList.get(0).getSubDeptName());
+                    } else {
+                        featureRateDTO.setConcatDept(ddList.get(0).getDeptName());
+                    }
+                    featureRateDTO.setUrl(ddList.get(0).getUrl());
+                } else {
+                    featureRateDTO.setDiseaseName(featureRateDTO.getFeatureName());
+                }
+                if (StringUtil.isBlank(featureRateDTO.getDesc())) {
+                    featureRateDTO.setDesc("{\"可能诊断\":\"\"}");
+                }
+                Map<String, Object> descMap = FastJsonUtils.getJsonToMap(featureRateDTO.getDesc());
+                for (String disClass : descMap.keySet()) {
+                    List<SYFFeatureDTO> featureRateDTOList = Lists.newLinkedList();
+                    if (disFeatureMap.get(disClass) != null) {
+                        featureRateDTOList = disFeatureMap.get(disClass);
+                    }
+                    featureRateDTOList.add(featureRateDTO);
+                    disFeatureMap.put(disClass, featureRateDTOList);
+                }
+            }
+
+            //仅分析确诊、拟诊、可能诊断,其他类型(如:警惕)不参与分诊推理
+            List<SYFFeatureDTO> featureRateList = Lists.newLinkedList();
+            if (disFeatureMap.containsKey("确诊")) {
+                featureRateList.addAll(disFeatureMap.get("确诊"));
+            } else if (disFeatureMap.containsKey("拟诊")) {
+                featureRateList.addAll(disFeatureMap.get("拟诊"));
+            } else if (disFeatureMap.containsKey("可能诊断")) {
+                featureRateList.addAll(disFeatureMap.get("可能诊断"));
+            }
+
+            if(ListUtil.isEmpty(featureRateList)){
+                throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "推理结果为空");
+            }
+
+            List<SYFFeatureDTO> syfFeatureDTOList = featureRateList
+                    .stream()
+                    .filter(i -> StringUtil.isNotBlank(i.getConcatDept()))
+                    .limit(2)
+                    .collect(Collectors.toList());
+            Map<String, List<SYFFeatureDTO>> featureMap
+                    = EntityUtil.makeEntityListMap(syfFeatureDTOList, "concatDept");
+            for (Map.Entry<String, List<SYFFeatureDTO>> entry : featureMap.entrySet()) {
+                SYFDiseaseDeptDTO item = new SYFDiseaseDeptDTO();
+                BeanUtil.copyProperties(entry.getValue().get(0), item);
+                item.setDiseaseNames(entry.getValue()
+                        .stream()
+                        .map(i -> i.getDiseaseName())
+                        .distinct()
+                        .collect(Collectors.toList()));
+                item.setDept(entry.getKey());
+                items.add(item);
+            }
+        }
+        //按大科室分组展示
+        Map<String, List<SYFDiseaseDeptDTO>> itemMap = EntityUtil.makeEntityListMap(items, "deptName");
+        List<SYFDeptDTO> syfDeptDTOList = Lists.newLinkedList();
+        itemMap.entrySet().forEach(item -> {
+            SYFDeptDTO syfDeptDTO = new SYFDeptDTO();
+            syfDeptDTO.setDeptName(item.getKey());
+            syfDeptDTO.setDeptCode(item.getValue().get(0).getDeptCode());
+            syfDeptDTO.setDiseaseDept(item.getValue());
+            syfDeptDTOList.add(syfDeptDTO);
+        });
+        syfdto.setDiseaseDept(syfDeptDTOList);
+        return syfdto;
+    }
+}

+ 44 - 0
triage-service/src/main/java/com/diagbot/facade/AssembleFacade.java

@@ -0,0 +1,44 @@
+package com.diagbot.facade;
+
+import com.diagbot.biz.push.vo.SearchVO;
+import com.diagbot.enums.SysTypeEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.vo.AIVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/4/17 11:27
+ */
+@Component
+public class AssembleFacade {
+
+    public SearchVO assembleData(AIVO aivo, String type) {
+        SearchVO searchVO = new SearchVO();
+        searchVO.setAge(aivo.getAge());
+        searchVO.setHosCode(aivo.getHospitalCode());
+        searchVO.setSymptom(aivo.getSymptom());
+        switch (aivo.getSex()) {
+            case 1:
+            case 2:
+                searchVO.setSex(aivo.getSex());
+                break;
+            default:
+                throw new CommonException(CommonErrorCode.PARAM_ERROR, "不能输入男女以外的性别");
+        }
+        searchVO.setFeatureType(type);
+        searchVO.setSysCode("1");
+        switch (type) {
+            case "1":
+                searchVO.setLength(10);
+                break;
+            case "7":
+                searchVO.setLength(10);
+                break;
+        }
+        searchVO.setSysType(SysTypeEnum.TRIAGE_SERVICE.getKey());
+        return searchVO;
+    }
+}

+ 4 - 1
triage-service/src/main/java/com/diagbot/web/AIController.java

@@ -6,6 +6,7 @@ import com.diagbot.dto.AIDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.SYFDTO;
 import com.diagbot.facade.AIFacade;
+import com.diagbot.facade.AIV2Facade;
 import com.diagbot.vo.AIVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,6 +31,8 @@ public class AIController {
 
     @Autowired
     AIFacade aiFacade;
+    @Autowired
+    AIV2Facade aiv2Facade;
 
     /**
      * 症状推理症状接口
@@ -76,7 +79,7 @@ public class AIController {
     @PostMapping("/pushDisForSYF")
     @SysLogger("pushDisForSYF")
     public RespDTO<SYFDTO> pushDisForSYF(@RequestBody @Valid AIVO aivo) {
-        return RespDTO.onSuc(aiFacade.pushDisForSYF(aivo, "7"));
+        return RespDTO.onSuc(aiv2Facade.pushDisForSYFV2(aivo, "7"));
     }
 }