ソースを参照

Merge remote-tracking branch 'origin/dev/mapping20210603' into dev/mapping20210603

zhaops 4 年 前
コミット
e9f4c949a8

+ 18 - 0
src/main/java/com/diagbot/dto/TermConceptDTO.java

@@ -0,0 +1,18 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-10 19:51
+ */
+@Setter
+@Getter
+public class TermConceptDTO {
+    private Long id;
+    private String name;
+    //数据来源(1-标准词、2-同义词、3-编码、4-历史数据、5-相似词、99-数据迁移)
+    private Integer source;
+}

+ 56 - 0
src/main/java/com/diagbot/enums/StandConvertCrfEnum.java

@@ -0,0 +1,56 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-11 9:28
+ */
+public enum StandConvertCrfEnum implements KeyedNamed {
+    // 类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 查体:vital
+    disease(1, "disease"),
+    symptom(2, "symptom"),
+    operation(3, "operation"),
+    drug(4, "drug"),
+    lis(5, "lis"),
+    pacs(6, "pacs"),
+    vital(7, "vital");
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    StandConvertCrfEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static StandConvertCrfEnum getEnum(int key) {
+        for (StandConvertCrfEnum item : StandConvertCrfEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        StandConvertCrfEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+
+}

+ 180 - 0
src/main/java/com/diagbot/facade/TermMatchingFacade.java

@@ -0,0 +1,180 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.client.StandConvertServiceClient;
+import com.diagbot.dto.StandConvertCrfDTO;
+import com.diagbot.dto.TermConceptDTO;
+import com.diagbot.entity.KlLibraryInfo;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.enums.LexiconEnum;
+import com.diagbot.enums.StandConvertCrfEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.StandConvertCrfVO;
+import com.diagbot.vo.TermMatchingVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-10 19:48
+ */
+@Component
+public class TermMatchingFacade {
+    @Autowired
+    KlLibraryInfoFacade klLibraryInfoFacade;
+    @Autowired
+    StandConvertServiceClient standConvertServiceClient;
+
+    public List<TermConceptDTO> getTermMatchingAll(TermMatchingVO termMatchingVO) {
+        List<TermConceptDTO> list = new ArrayList<>();
+        Integer type = convertType(termMatchingVO.getType());
+        if (type != null) {
+            QueryWrapper<KlLibraryInfo> klLibraryInfo = new QueryWrapper<>();
+            klLibraryInfo.eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("type_id", type)
+                    .eq("name", termMatchingVO.getInputStr());
+            KlLibraryInfo libraryInfo = klLibraryInfoFacade.getOne(klLibraryInfo, false);
+            if (null != libraryInfo) {
+                TermConceptDTO termConceptDTO = new TermConceptDTO();
+                termConceptDTO.setId(libraryInfo.getConceptId());
+                termConceptDTO.setName(libraryInfo.getName());
+                termConceptDTO.setSource(libraryInfo.getIsConcept() == 1 ? 1 : 2);
+                list.add(termConceptDTO);
+            }
+        }
+        //没有找到标准词或同义词才找相似词
+        if (ListUtil.isEmpty(list)) {
+            //相似词
+            StandConvertCrfVO standConvertCrfVO = new StandConvertCrfVO();
+            // 类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 辅助检查:vital
+            String wordType = wordType(termMatchingVO.getType());
+            if (StringUtil.isNotBlank(wordType)) {
+                standConvertCrfVO.setWord_type(wordType);
+                standConvertCrfVO.setWord(termMatchingVO.getInputStr());
+                standConvertCrfVO.setNumber(5);
+                StandConvertCrfDTO standConvertCrfDTO = new StandConvertCrfDTO();
+                try {
+                    standConvertCrfDTO = standConvertServiceClient.similarity(standConvertCrfVO);
+                } catch (Exception e) {
+                    throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "标准词转换【服务器】挂了!" + e.getMessage());
+                }
+
+                List<Map<String, String>> standard_words = standConvertCrfDTO.getStandard_words();
+                List<String> placeToList = new ArrayList<>();
+                if (ListUtil.isNotEmpty(standard_words)) {
+                    for (Map<String, String> map : standard_words) {
+                        String placeTo = map.get("standard_word");
+                        placeToList.add(placeTo);
+                    }
+                    QueryWrapper<KlLibraryInfo> klLibraryInfo = new QueryWrapper<>();
+                    klLibraryInfo.eq("is_deleted", IsDeleteEnum.N.getKey())
+                            .eq("type_id", type)
+                            .in("name", placeToList);
+                    List<KlLibraryInfo> libraryInfoList = klLibraryInfoFacade.list(klLibraryInfo);
+                    if (ListUtil.isNotEmpty(libraryInfoList)) {
+                        for (KlLibraryInfo data : libraryInfoList) {
+                            TermConceptDTO termConceptDTO = new TermConceptDTO();
+                            termConceptDTO.setId(data.getConceptId());
+                            termConceptDTO.setName(data.getName());
+                            termConceptDTO.setSource(5);
+                            list.add(termConceptDTO);
+                        }
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    public Integer convertType(Integer type) {
+        Integer retType = null;
+        //type: 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血、10-量表、11-护理、12-中医诊断、13-中医证候
+        switch (type) {
+            case 1:
+                retType = LexiconEnum.LisName.getKey();
+                break;
+            case 2:
+                retType = LexiconEnum.LisSubName.getKey();
+                break;
+            case 3:
+                retType = LexiconEnum.PacsName.getKey();
+                break;
+            case 4:
+                retType = LexiconEnum.Disease.getKey();
+                break;
+            case 5:
+                retType = LexiconEnum.Medicine.getKey();
+                break;
+            case 6:
+                retType = LexiconEnum.Operation.getKey();
+                break;
+            case 7:
+                retType = LexiconEnum.Dept.getKey();
+                break;
+            case 8:
+                retType = LexiconEnum.Transfusion.getKey();
+                break;
+            case 9:
+                retType = LexiconEnum.Symptom.getKey();
+                break;
+            case 10:
+                retType = LexiconEnum.Scale.getKey();
+                break;
+            case 11:
+                retType = LexiconEnum.Nurse.getKey();
+                break;
+            case 12:
+                retType = LexiconEnum.Tcmdisease.getKey();
+                break;
+            case 13:
+                retType = LexiconEnum.Tcmsyndrome.getKey();
+                break;
+            case 14:
+                retType = LexiconEnum.Anesthesia.getKey();
+                break;
+            case 15:
+                retType = LexiconEnum.Form.getKey();
+                break;
+            default:
+                break;
+        }
+        return retType;
+    }
+
+    public String wordType(Integer type) {
+        String retType = null;
+        //type: 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血、10-量表、11-护理、12-中医诊断、13-中医证候
+        //类型,疾病: disease,症状: symptom,手术和操作:operation,药品: drug,实验室检查:lis,辅助检查:pacs, 查体:vital
+        switch (type) {
+            case 1:
+                retType = StandConvertCrfEnum.lis.getName();
+                break;
+            case 2:
+                retType = StandConvertCrfEnum.lis.getName();
+                break;
+            case 3:
+                retType = StandConvertCrfEnum.pacs.getName();
+                break;
+            case 4:
+                retType = StandConvertCrfEnum.disease.getName();
+                break;
+            case 5:
+                retType = StandConvertCrfEnum.drug.getName();
+                break;
+            case 6:
+                retType = StandConvertCrfEnum.operation.getName();
+                break;
+            default:
+                break;
+        }
+        return retType;
+    }
+}

+ 27 - 0
src/main/java/com/diagbot/vo/TermMatchingVO.java

@@ -0,0 +1,27 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-10 19:54
+ */
+@Setter
+@Getter
+public class TermMatchingVO {
+    /**
+     * 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血、9-症状
+     */
+    @NotNull(message = "请输入检索类型")
+    private Integer type;
+    /**
+     * 检索内容
+     */
+    @NotBlank(message = "请输入检索内容")
+    private String inputStr;
+}

+ 39 - 0
src/main/java/com/diagbot/web/TermMatchingController.java

@@ -0,0 +1,39 @@
+package com.diagbot.web;
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.TermConceptDTO;
+import com.diagbot.facade.TermMatchingFacade;
+import com.diagbot.vo.TermMatchingVO;
+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;
+import java.util.List;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-10 19:43
+ */
+@RestController
+@RequestMapping("/term")
+@Api(value = "术语匹配相关API", tags = { "术语匹配相关API" })
+@SuppressWarnings("unchecked")
+public class TermMatchingController {
+    @Autowired
+    TermMatchingFacade termMatchingFacade;
+
+    @ApiOperation(value = "术语匹配搜索[wangfeng]",
+            notes = "type: 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血、9-症状、10-量表、11-护理、12-中医诊断、13-中医证候、14-麻醉 <br>" +
+                    "inputStr: 检索内容<br>")
+    @PostMapping("/termMatching")
+    public RespDTO<List<TermConceptDTO>> getTermMatching(@Valid @RequestBody TermMatchingVO termMatchingVO) {
+        List<TermConceptDTO> data = termMatchingFacade.getTermMatchingAll(termMatchingVO);
+        return RespDTO.onSuc(data);
+    }
+}