Explorar o código

邵逸夫诊断推理

zhaops %!s(int64=5) %!d(string=hai) anos
pai
achega
6b8af080c7

+ 25 - 1
aipt-service/src/main/java/com/diagbot/facade/ConceptFacade.java

@@ -228,7 +228,7 @@ public class ConceptFacade extends ConceptServiceImpl {
             conceptExistVO.setLibType(libType);
         }
 
-        if (configuer.cryptFlag){
+        if (configuer.cryptFlag) {
             CryptUtil.encryptList(conceptExistVO.getNameList());
         }
         //获取结构
@@ -499,4 +499,28 @@ public class ConceptFacade extends ConceptServiceImpl {
     public List<ConceptBaseDTO> indexConceptFac(ConceptBaseVO conceptBaseVO) {
         return this.indexConcept(conceptBaseVO);
     }
+
+    /**
+     * 查询带名词解释的症状术语
+     *
+     * @param names
+     * @return
+     */
+    public Map<String, KlSymptom> getSymptomWithExplain(List<String> names, Integer type) {
+        List<Concept> concepts = this.list(new QueryWrapper<Concept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("lib_type", type)
+                .in(ListUtil.isNotEmpty(names), "lib_name", names));
+        List<Long> conceptIds = concepts.stream().map(item -> item.getId()).collect(Collectors.toList());
+        List<KlSymptom> klSymptoms = klSymptomFacade.list(new QueryWrapper<KlSymptom>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .in(ListUtil.isNotEmpty(conceptIds), "concept_id", conceptIds));
+        Map<Long, KlSymptom> klSymptomMap
+                = klSymptoms.stream().collect(Collectors.toMap(item -> item.getConceptId(), item -> item));
+        Map<String, KlSymptom> retMap = new HashMap<>();
+        for (Concept concept : concepts) {
+            retMap.put(concept.getLibName(), klSymptomMap.get(concept.getId()));
+        }
+        return retMap;
+    }
 }

+ 48 - 2
aipt-service/src/main/java/com/diagbot/facade/PushFacade.java

@@ -1,15 +1,22 @@
 package com.diagbot.facade;
 
 import com.alibaba.fastjson.JSONObject;
+import com.diagbot.biz.push.entity.FeatureRate;
+import com.diagbot.biz.push.entity.FeatureRateWithExplain;
 import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.ResponseData;
-import com.diagbot.biz.push.vo.SearchVO;
+import com.diagbot.biz.push.entity.ResponseDataWithExplain;
 import com.diagbot.biz.push.entity.Treat;
 import com.diagbot.biz.push.enums.FeatureTypeEnum;
+import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.dto.PushDTO;
+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 com.diagbot.util.StringUtil;
 import io.github.lvyahui8.spring.aggregate.facade.DataBeanAggregateQueryFacade;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,8 +25,10 @@ import org.springframework.stereotype.Component;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -36,6 +45,8 @@ public class PushFacade {
     private TransferFacade transferFacade;
     @Autowired
     DataBeanAggregateQueryFacade dataBeanAggregateQueryFacade;
+    @Autowired
+    private ConceptFacade conceptFacade;
 
     /**
      * 推理接口
@@ -60,7 +71,7 @@ public class PushFacade {
 
         try {
             Map<String, Object> invokeParams = new HashMap<>();
-            invokeParams.put("pushDTO",pushDTO);
+            invokeParams.put("pushDTO", pushDTO);
             invokeParams.put("featureTypeSet", featureTypeSet);
             invokeParams.put("data", data);
             invokeParams.put("isConnect", isConnect);
@@ -78,6 +89,41 @@ public class PushFacade {
         return pushDTO;
     }
 
+    /**
+     * 推理结果带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    public ResponseDataWithExplain pushWithExplain(SearchVO searchVO) {
+        ResponseDataWithExplain responseData = new ResponseDataWithExplain();
+        ResponseData data = clinicalFacade.processClinicalData(searchVO);
+        List<FeatureRate> 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<FeatureRateWithExplain> featureRateWithExplains
+                    = BeanUtil.listCopyTo(symptom, FeatureRateWithExplain.class);
+            if (klSymptomMap != null) {
+                for (FeatureRateWithExplain 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;
+    }
+
+
     /**
      * 获取治疗方案
      *

+ 14 - 0
aipt-service/src/main/java/com/diagbot/web/PushController.java

@@ -1,6 +1,7 @@
 package com.diagbot.web;
 
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.biz.push.entity.ResponseDataWithExplain;
 import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.dto.PushDTO;
 import com.diagbot.dto.RespDTO;
@@ -87,4 +88,17 @@ public class PushController {
         PushDTO data = pushFacade.pushInner(searchVO);
         return RespDTO.onSuc(data);
     }
+
+    @ApiOperation(value = "知识库标准化-推理接口[by:zhaops]",
+            notes = "hosCode: 医院编码<br>" +
+                    "featureType:类型(必填多选),1:症状,7:诊断,多项用逗号分开,String<br>" +
+                    "age: 年龄(必填)<br>" +
+                    "sex:性别(必填),1:男,2:女,Integer<br>" +
+                    "symptom:现病史,String<br>")
+    @PostMapping("/pushWithExplain")
+    @SysLogger("pushWithExplain")
+    public RespDTO<ResponseDataWithExplain> pushWithExplain(@Valid @RequestBody SearchVO searchVO) {
+        ResponseDataWithExplain data = pushFacade.pushWithExplain(searchVO);
+        return RespDTO.onSuc(data);
+    }
 }

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

@@ -1,6 +1,7 @@
 package com.diagbot.client;
 
 import com.diagbot.biz.push.entity.ResponseData;
+import com.diagbot.biz.push.entity.ResponseDataWithExplain;
 import com.diagbot.biz.push.vo.SearchVO;
 import com.diagbot.client.hystrix.AiptServiceHystrix;
 import com.diagbot.dto.ConceptBaseDTO;
@@ -73,6 +74,15 @@ public interface AiptServiceClient {
     @PostMapping(value = "/clinicaldata/processData")
     RespDTO<ResponseData> aiptData(@RequestBody SearchVO searchVO);
 
+    /**
+     * 推理带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    @PostMapping(value = "/push/pushWithExplain")
+    RespDTO<ResponseDataWithExplain> pushWithExplain(@Valid @RequestBody SearchVO searchVO);
+
     /**
      * 获取版本信息
      */

+ 15 - 2
triage-service/src/main/java/com/diagbot/client/hystrix/AiptServiceHystrix.java

@@ -1,6 +1,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.vo.SearchVO;
 import com.diagbot.client.AiptServiceClient;
 import com.diagbot.dto.ConceptBaseDTO;
@@ -16,6 +17,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.RequestBody;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -64,13 +66,24 @@ public class AiptServiceHystrix implements AiptServiceClient {
         return null;
     }
 
+    /**
+     * 推理带名词解释
+     *
+     * @param searchVO
+     * @return
+     */
+    @Override
+    public RespDTO<ResponseDataWithExplain> pushWithExplain(@Valid @RequestBody SearchVO searchVO) {
+        log.error("【hystrix】调用{}异常", "pushWithExplain");
+        return null;
+    }
+
     /**
      * 获取版本信息
      */
     @Override
-    public RespDTO<VersionWrapperDTO> getVersionInfoAlls(VersionVO versionVO){
+    public RespDTO<VersionWrapperDTO> getVersionInfoAlls(VersionVO versionVO) {
         log.error("【hystrix】调用{}异常", "getVersionInfoAlls");
         return null;
     }
-
 }

+ 2 - 0
triage-service/src/main/java/com/diagbot/dto/FeatureRateDTO.java

@@ -15,4 +15,6 @@ import java.util.List;
 @Setter
 public class FeatureRateDTO extends FeatureRate {
     private List<HospitalDeptDTO> hospitalDepts;
+    private String description;
+    private String explains;
 }

+ 0 - 2
triage-service/src/main/java/com/diagbot/dto/SYFDTO.java

@@ -1,6 +1,5 @@
 package com.diagbot.dto;
 
-import com.diagbot.biz.push.entity.FeatureRate;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -14,6 +13,5 @@ import java.util.List;
 @Getter
 @Setter
 public class SYFDTO {
-    private List<FeatureRate> symptom;
     private List<SYFDiseaseDeptDTO> diseaseDept;
 }

+ 2 - 0
triage-service/src/main/java/com/diagbot/dto/SYFDiseaseDeptDTO.java

@@ -14,5 +14,7 @@ import java.util.List;
 @Setter
 public class SYFDiseaseDeptDTO {
     private String dept;
+    private Double rate;
+    private String url;
     private List<SYFFeatureDTO> features;
 }

+ 7 - 0
triage-service/src/main/java/com/diagbot/dto/SYFFeatureDTO.java

@@ -1,5 +1,6 @@
 package com.diagbot.dto;
 
+import com.diagbot.annotation.CryptField;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -11,9 +12,15 @@ import lombok.Setter;
 @Getter
 @Setter
 public class SYFFeatureDTO {
+    @CryptField
     private String featureName;
+    @CryptField
+    private String extraProperty;
     private String desc;
     private String rate;
+    private String diseaseName;
     private String deptName;
     private String subDeptName;
+    private String concatDept;
+    private String url;
 }

+ 202 - 3
triage-service/src/main/java/com/diagbot/facade/AIFacade.java

@@ -1,14 +1,19 @@
 package com.diagbot.facade;
 
 import com.diagbot.biz.push.entity.FeatureRate;
-import com.diagbot.biz.push.entity.ResponseData;
+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;
+import com.diagbot.dto.DiseaseDeptDTO;
 import com.diagbot.dto.FeatureRateDTO;
 import com.diagbot.dto.HospitalDeptDTO;
 import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SYFDTO;
+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;
@@ -19,6 +24,7 @@ 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.diagbot.vo.HospitalDeptVO;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,12 +58,12 @@ public class AIFacade {
      * @return AI接口返回结果
      */
     public AIDTO push(AIVO aivo, String type) {
-        RespDTO<ResponseData> res = aiptServiceClient.aiptData(assembleData(aivo, type));
+        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleData(aivo, type));
         RespDTOUtil.respNGDealCover(res, "中间层没有结果返回");
         AIDTO aidto = new AIDTO();
         switch (type) {
             case "1":
-                List<FeatureRate> symptom = res.data.getSymptom();
+                List<FeatureRateWithExplain> symptom = res.data.getSymptom();
                 if (ListUtil.isNotEmpty(symptom)) {
                     List<FeatureRateDTO> symptomDTO = BeanUtil.listCopyTo(symptom, FeatureRateDTO.class);
                     aidto.setItems(symptomDTO);
@@ -166,6 +172,135 @@ public class AIFacade {
         return aidto;
     }
 
+    /**
+     * 调用ai接口业务逻辑
+     *
+     * @param aivo 搜索参数
+     * @return AI接口返回结果
+     */
+    public SYFDTO pushDisForSYF(AIVO aivo, String type) {
+        if (StringUtil.isBlank(aivo.getHospitalCode())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "请输入医院编码");
+        }
+        RespDTO<ResponseDataWithExplain> res = aiptServiceClient.pushWithExplain(assembleData(aivo, type));
+        RespDTOUtil.respNGDealCover(res, "中间层没有结果返回");
+        SYFDTO syfdto = new SYFDTO();
+
+        List<SYFDiseaseDeptDTO> items = new ArrayList<>();
+        List<FeatureRate> 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());
+                    if (StringUtil.isNotBlank(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);
+                }
+            }
+
+            if (disFeatureMap.get("确诊") != null) {
+                items = getItemsForSYF(disFeatureMap, "确诊", 1);
+            }
+            if (disFeatureMap.get("拟诊") != null && ListUtil.isEmpty(items)) {
+                items = getItemsForSYF(disFeatureMap, "拟诊", 2);
+            }
+            if (disFeatureMap.get("可能诊断") != null && ListUtil.isEmpty(items)) {
+                List<SYFFeatureDTO> featureRateList = disFeatureMap.get("可能诊断");
+                List<SYFDiseaseDeptDTO> mergeFeatureList = Lists.newLinkedList();
+                Map<String, List<SYFFeatureDTO>> syfFeatureMap = new HashMap<>();
+                //根据阈值(0.05)过滤诊断
+                featureRateList = featureRateList
+                        .stream()
+                        .filter(i -> (i.getRate() != null && Double.valueOf(i.getRate()) > 0.05d))
+                        .collect(Collectors.toList());
+
+                for (SYFFeatureDTO syfFeatureDTO : featureRateList) {
+                    if (StringUtil.isNotBlank(syfFeatureDTO.getConcatDept())) {
+                        List<SYFFeatureDTO> features = Lists.newLinkedList();
+                        if (syfFeatureMap.containsKey(syfFeatureDTO.getConcatDept())) {
+                            features = syfFeatureMap.get(syfFeatureDTO.getConcatDept());
+                        }
+                        features.add(syfFeatureDTO);
+                        syfFeatureMap.put(syfFeatureDTO.getConcatDept(), features);
+
+                    } else {
+                        SYFDiseaseDeptDTO syfDiseaseDeptDTO = new SYFDiseaseDeptDTO();
+                        syfDiseaseDeptDTO.setRate(Double.valueOf(syfFeatureDTO.getRate()));
+                        List<SYFFeatureDTO> features = Lists.newLinkedList();
+                        features.add(syfFeatureDTO);
+                        syfDiseaseDeptDTO.setFeatures(features);
+                        mergeFeatureList.add(syfDiseaseDeptDTO);
+                    }
+                }
+                if (syfFeatureMap != null) {
+                    for (Map.Entry<String, List<SYFFeatureDTO>> entry : syfFeatureMap.entrySet()) {
+                        SYFDiseaseDeptDTO syfDiseaseDeptDTO = new SYFDiseaseDeptDTO();
+                        syfDiseaseDeptDTO.setDept(entry.getKey());
+                        syfDiseaseDeptDTO.setUrl(entry.getValue().get(0).getUrl());
+                        syfDiseaseDeptDTO.setFeatures(entry.getValue());
+                        Double rate = 0d;
+                        for (SYFFeatureDTO feature : entry.getValue()) {
+                            rate += Double.valueOf(feature.getRate());
+                        }
+                        syfDiseaseDeptDTO.setRate(rate);
+                        mergeFeatureList.add(syfDiseaseDeptDTO);
+                    }
+                }
+                Collections.sort(mergeFeatureList, new Comparator<SYFDiseaseDeptDTO>() {
+                    @Override
+                    public int compare(SYFDiseaseDeptDTO o1, SYFDiseaseDeptDTO o2) {
+                        return Double.compare(o2.getRate(), o1.getRate());
+                    }
+                });
+                for (SYFDiseaseDeptDTO syfDiseaseDeptDTO : mergeFeatureList) {
+                    if (items.size() < 2) {
+                        items.add(syfDiseaseDeptDTO);
+                    }
+                }
+            }
+        }
+        syfdto.setDiseaseDept(items);
+        return syfdto;
+    }
+
     private List<FeatureRateDTO> getItems(Map<String, List<FeatureRateDTO>> disFeatureMap,
                                           String type, int size) {
         List<FeatureRateDTO> items = new ArrayList<>();
@@ -200,6 +335,70 @@ public class AIFacade {
         return items;
     }
 
+    /**
+     * 邵逸夫科室推理(确诊、拟诊)
+     *
+     * @param disFeatureMap
+     * @param type
+     * @param size
+     * @return
+     */
+    private List<SYFDiseaseDeptDTO> getItemsForSYF(Map<String, List<SYFFeatureDTO>> disFeatureMap,
+                                                   String type, int size) {
+        List<SYFDiseaseDeptDTO> items = new ArrayList<>();
+        List<SYFFeatureDTO> featureRateList = disFeatureMap.get(type);
+        if (ListUtil.isEmpty(featureRateList)) {
+            return items;
+        }
+        List<SYFDiseaseDeptDTO> mergeFeatureList = Lists.newLinkedList();
+        Map<String, List<SYFFeatureDTO>> syfFeatureMap = new HashMap<>();
+        for (SYFFeatureDTO syfFeatureDTO : featureRateList) {
+            if (StringUtil.isNotBlank(syfFeatureDTO.getConcatDept())) {
+                SYFDiseaseDeptDTO syfDiseaseDeptDTO = new SYFDiseaseDeptDTO();
+                syfDiseaseDeptDTO.setDept(syfFeatureDTO.getConcatDept());
+                syfDiseaseDeptDTO.setUrl(syfFeatureDTO.getUrl());
+                List<SYFFeatureDTO> features = Lists.newLinkedList();
+                if (syfFeatureMap.containsKey(syfFeatureDTO.getConcatDept())) {
+                    features = syfFeatureMap.get(syfFeatureDTO.getConcatDept());
+                } else {
+                    mergeFeatureList.add(syfDiseaseDeptDTO);
+                }
+                features.add(syfFeatureDTO);
+                syfDiseaseDeptDTO.setFeatures(features);
+                syfFeatureMap.put(syfFeatureDTO.getConcatDept(), features);
+            } else {
+                SYFDiseaseDeptDTO syfDiseaseDeptDTO = new SYFDiseaseDeptDTO();
+                List<SYFFeatureDTO> features = Lists.newLinkedList();
+                features.add(syfFeatureDTO);
+                syfDiseaseDeptDTO.setFeatures(features);
+                mergeFeatureList.add(syfDiseaseDeptDTO);
+            }
+        }
+        for (SYFDiseaseDeptDTO syfDiseaseDeptDTO : mergeFeatureList) {
+            if (StringUtil.isNotBlank(syfDiseaseDeptDTO.getDept())) {
+                if (syfFeatureMap.containsKey(syfDiseaseDeptDTO.getDept())) {
+                    syfDiseaseDeptDTO.setFeatures(syfFeatureMap.get(syfDiseaseDeptDTO.getDept()));
+                }
+            }
+        }
+
+        Collections.sort(mergeFeatureList, new Comparator<SYFDiseaseDeptDTO>() {
+            @Override
+            public int compare(SYFDiseaseDeptDTO o1, SYFDiseaseDeptDTO o2) {
+                return Integer.compare(o2.getFeatures().size(), o1.getFeatures().size());
+            }
+        });
+
+        for (SYFDiseaseDeptDTO syfDiseaseDeptDTO : mergeFeatureList) {
+            if (items.size() < size) {
+                items.add(syfDiseaseDeptDTO);
+            } else {
+                break;
+            }
+        }
+        return items;
+    }
+
     private SearchVO assembleData(AIVO aivo, String type) {
         SearchVO searchVO = new SearchVO();
         searchVO.setAge(aivo.getAge());

+ 16 - 0
triage-service/src/main/java/com/diagbot/web/AIController.java

@@ -4,6 +4,7 @@ package com.diagbot.web;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.dto.AIDTO;
 import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.SYFDTO;
 import com.diagbot.facade.AIFacade;
 import com.diagbot.vo.AIVO;
 import io.swagger.annotations.Api;
@@ -62,5 +63,20 @@ public class AIController {
         return RespDTO.onSuc(aiFacade.push(aivo, "7"));
     }
 
+    /**
+     * 症状推理症状接口
+     *
+     * @param aivo ai输入参数
+     * @return 疾病相关数据
+     */
+    @ApiOperation(value = "知识库标准化-症状推理疾病接口[by:zhaops]",
+            notes = "age: 年龄(必填)<br>" +
+                    "sex:性别,1:男,2:女(必填)<br>" +
+                    "symptom:症状自然文本描述(必填)")
+    @PostMapping("/pushDisForSYF")
+    @SysLogger("pushDisForSYF")
+    public RespDTO<SYFDTO> pushDisForSYF(@RequestBody @Valid AIVO aivo) {
+        return RespDTO.onSuc(aiFacade.pushDisForSYF(aivo, "7"));
+    }
 }