소스 검색

症状推理

Zhaops 6 년 전
부모
커밋
24130f7bca

+ 13 - 0
prec-service/src/main/java/com/diagbot/client/AiptServiceClient.java

@@ -1,7 +1,12 @@
 package com.diagbot.client;
 
+import com.diagbot.client.bean.SearchData;
 import com.diagbot.client.hystrix.AiptServiceHystrix;
+import com.diagbot.dto.PushDTO;
+import com.diagbot.dto.RespDTO;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * @Description:调用中间层服务
@@ -10,4 +15,12 @@ import org.springframework.cloud.openfeign.FeignClient;
  */
 @FeignClient(value = "aipt-service", fallback = AiptServiceHystrix.class)
 public interface AiptServiceClient {
+    /**
+     * 推理
+     *
+     * @param searchData
+     * @return
+     */
+    @PostMapping("/push/pushInner")
+    RespDTO<PushDTO> pushInner(@RequestBody SearchData searchData);
 }

+ 34 - 0
prec-service/src/main/java/com/diagbot/client/bean/SearchData.java

@@ -0,0 +1,34 @@
+package com.diagbot.client.bean;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * Created by fyeman on 2018/1/31.
+ */
+@Getter
+@Setter
+public class SearchData {
+    private int length;
+    private int age;
+    private String sex;
+    //特征类别
+    private String featureType;
+    //外部系统编码 用于返回映射数据,如果sysCode为空或null,则返回kl_standard_info标准名称
+    private String sysCode;
+    private String symptom;
+    private String past;
+    private String other;
+    private String vital;
+    private String lis;
+    private String pacs;
+    private String diag;
+    private String diseaseName; //指定诊断,例如取治疗方案
+    private String scaleName;   //量表名称
+    private String indications; //指标结果
+    private String adverseReactions; //不良反应
+    private Integer disType;    //诊断类型
+    private String adverseEvent;
+    private String hosCode;
+    private Integer sysType;  //系统类型
+}

+ 15 - 0
prec-service/src/main/java/com/diagbot/client/hystrix/AiptServiceHystrix.java

@@ -1,8 +1,12 @@
 package com.diagbot.client.hystrix;
 
 import com.diagbot.client.AiptServiceClient;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.dto.PushDTO;
+import com.diagbot.dto.RespDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * @Description:调用中间层服务
@@ -12,4 +16,15 @@ import org.springframework.stereotype.Component;
 @Component
 @Slf4j
 public class AiptServiceHystrix implements AiptServiceClient {
+    /**
+     * 推理
+     *
+     * @param searchData
+     * @return
+     */
+    @Override
+    public RespDTO<PushDTO> pushInner(@RequestBody SearchData searchData) {
+        log.error("【hystrix】调用{}异常", "pushInner");
+        return null;
+    }
 }

+ 16 - 0
prec-service/src/main/java/com/diagbot/dto/ConceptBaseDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description: 概念出参基础实体类
+ * @author: gaodm
+ * @time: 2019/5/7 9:44
+ */
+@Getter
+@Setter
+public class ConceptBaseDTO {
+    private Long conceptId; // 概念id
+    private String name;    //概念名称
+}

+ 17 - 0
prec-service/src/main/java/com/diagbot/dto/ConceptPushDTO.java

@@ -0,0 +1,17 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:推理返回标签(概念)
+ * @Author:zhaops
+ * @time: 2019/5/7 20:06
+ */
+@Getter
+@Setter
+public class ConceptPushDTO extends ConceptBaseDTO {
+    private Integer libType;  //词性
+    private Long id;
+    private Integer type;
+}

+ 18 - 0
prec-service/src/main/java/com/diagbot/dto/PushDTO.java

@@ -0,0 +1,18 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 推理出参
+ * @Author:zhaops
+ * @time: 2018/11/20 13:44
+ */
+@Getter
+@Setter
+public class PushDTO {
+    private List<ConceptPushDTO> symptom;
+}

+ 57 - 0
prec-service/src/main/java/com/diagbot/enums/FeatureTypeEnum.java

@@ -0,0 +1,57 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @Description: 推送类型
+ * @Author:zhaops
+ * @time: 2019/3/14 11:28
+ */
+public enum FeatureTypeEnum implements KeyedNamed {
+    Symptom(1, "症状"),
+    Other(3, "其他史"),
+    Vital(4, "查体"),
+    Lis(5, "化验"),
+    Pacs(6, "辅检"),
+    Disease(7, "诊断"),
+    Treat(8, "治疗"),
+    Scale(21, "量表内容"),
+    MedicalIndication(22, "指标"),
+    ManagementEvaluation(11, "管理评估");
+
+    @Setter
+    private Integer key;
+
+    @Setter
+    private String name;
+
+    FeatureTypeEnum(Integer key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static FeatureTypeEnum getEnum(Integer key) {
+        for (FeatureTypeEnum item : FeatureTypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(Integer key) {
+        FeatureTypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}

+ 47 - 0
prec-service/src/main/java/com/diagbot/facade/AssembleFacade.java

@@ -0,0 +1,47 @@
+package com.diagbot.facade;
+
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.enums.SysTypeEnum;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.vo.PushVO;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/6/14 13:41
+ */
+@Component
+public class AssembleFacade {
+    /**
+     * 拼装数据
+     *
+     * @param pushVO
+     * @return SearchData
+     */
+    public SearchData assembleData(PushVO pushVO) {
+        SearchData searchData = new SearchData();
+        searchData.setAge(pushVO.getAge());
+        searchData.setSymptom(pushVO.getSymptom());
+        searchData.setFeatureType(pushVO.getFeatureType());
+        searchData.setSysCode("1");
+        searchData.setLength(10);
+        searchData.setSysType(SysTypeEnum.PREC_SERVICE.getKey());
+        searchData.setHosCode(pushVO.getHosCode());
+        switch (pushVO.getSex()) {
+            case 1:
+                searchData.setSex("M");
+                break;
+            case 2:
+                searchData.setSex("F");
+                break;
+            default:
+                searchData.setSex("A");
+                break;
+        }
+        return searchData;
+    }
+}

+ 93 - 0
prec-service/src/main/java/com/diagbot/facade/PushFacade.java

@@ -0,0 +1,93 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.client.AiptServiceClient;
+import com.diagbot.client.bean.SearchData;
+import com.diagbot.dto.ConceptPushDTO;
+import com.diagbot.dto.PushDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.QuestionInfo;
+import com.diagbot.enums.FeatureTypeEnum;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RespDTOUtil;
+import com.diagbot.vo.PushVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/6/14 11:08
+ */
+@Component
+public class PushFacade {
+    @Autowired
+    AiptServiceClient aiptServiceClient;
+    @Autowired
+    AssembleFacade assembleFacade;
+    @Autowired
+    QuestionFacade questionFacade;
+
+    /**
+     * 推理接口
+     *
+     * @param pushVO
+     * @return
+     */
+    public PushDTO push(PushVO pushVO) {
+        PushDTO pushDTO = new PushDTO();
+        SearchData searchData = assembleFacade.assembleData(pushVO);
+        RespDTO<PushDTO> respDTO = aiptServiceClient.pushInner(searchData);
+        PushDTO data = new PushDTO();
+        if (RespDTOUtil.respIsOK(respDTO)) {
+            data = respDTO.data;
+        }
+
+        String featureType = searchData.getFeatureType();
+        String[] featureTypes = featureType.split(",|,");
+        Set<String> featureTypeSet = new HashSet(Arrays.asList(featureTypes));
+
+        //症状
+        if (featureTypeSet.contains(String.valueOf(FeatureTypeEnum.Symptom.getKey()))) {
+            List<ConceptPushDTO> symptom = data.getSymptom();
+            if (ListUtil.isNotEmpty(symptom)) {
+                List<ConceptPushDTO> symptomDTO = addQuestionId(symptom, 1);
+                pushDTO.setSymptom(symptomDTO);
+            }
+        }
+        return pushDTO;
+    }
+
+    /**
+     * 概念关联标签,添加标签id ——症状
+     *
+     * @param concepts
+     * @param type
+     * @return
+     */
+    public List<ConceptPushDTO> addQuestionId(List<ConceptPushDTO> concepts, Integer type) {
+        QueryWrapper<QuestionInfo> questionInfoQueryWrapper = new QueryWrapper<>();
+        List<String> nameList = concepts.stream().map(concept -> concept.getName()).collect(Collectors.toList());
+        questionInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey()).in("tag_name", nameList).eq("type", type);
+        List<QuestionInfo> questionInfoList = questionFacade.list(questionInfoQueryWrapper);
+        if (ListUtil.isNotEmpty(questionInfoList)) {
+            Map<String, QuestionInfo> questionInfoMap = EntityUtil.makeEntityMap(questionInfoList, "tagName");
+            for (ConceptPushDTO concept : concepts) {
+                concept.setType(1);
+                if (questionInfoMap.containsKey(concept.getName())) {
+                    concept.setId(questionInfoMap.get(concept.getName()).getId());
+                }
+            }
+        }
+        return concepts;
+    }
+}

+ 27 - 0
prec-service/src/main/java/com/diagbot/vo/PushVO.java

@@ -0,0 +1,27 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2019/6/14 13:43
+ */
+@Getter
+@Setter
+public class PushVO {
+    @NotNull(message = "请输入年龄")
+    private Integer age;
+    @NotNull(message = "请输入性别")
+    private Integer sex;
+    @ApiModelProperty(hidden = true)
+    private String featureType;
+    private String symptom;
+    @NotBlank(message = "请输入医院编码")
+    private String hosCode;
+}

+ 42 - 0
prec-service/src/main/java/com/diagbot/web/PushController.java

@@ -0,0 +1,42 @@
+package com.diagbot.web;
+
+import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.PushDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.enums.FeatureTypeEnum;
+import com.diagbot.facade.PushFacade;
+import com.diagbot.vo.PushVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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: 2019/6/14 13:52
+ */
+@RestController
+@RequestMapping("/push")
+@Api(value = "推理相关API", tags = { "智能预问诊-推理相关API" })
+public class PushController {
+    @Autowired
+    private PushFacade pushFacade;
+
+    @ApiOperation(value = "智能预问诊-症状推理[by:zhaops]",
+            notes = "age: 年龄(必填)<br>" +
+                    "sex:性别(必填),1:男,2:女<br>" +
+                    "symptom:症状,String<br>" +
+                    "hosCode:医院编码,String<br>")
+    @PostMapping("/pushInner")
+    @SysLogger("pushInner")
+    public RespDTO<PushDTO> pushSymptom(@RequestBody @Valid PushVO pushVO) {
+        pushVO.setFeatureType(String.valueOf(FeatureTypeEnum.Symptom.getKey()));
+        return RespDTO.onSuc(pushFacade.push(pushVO));
+    }
+}