Sfoglia il codice sorgente

Merge branch 'master' into innerDevelop

zhoutg 4 anni fa
parent
commit
ac53cf0e99
25 ha cambiato i file con 1273 aggiunte e 2 eliminazioni
  1. 28 0
      doc/001.00000000初始化脚本/cdss-core_init.sql
  2. 17 0
      src/main/java/com/diagbot/entity/Ann.java
  3. 85 0
      src/main/java/com/diagbot/entity/SymptomFeature.java
  4. 64 0
      src/main/java/com/diagbot/entity/SymptomFeatureList.java
  5. 71 0
      src/main/java/com/diagbot/entity/TestwordInfo.java
  6. 75 0
      src/main/java/com/diagbot/entity/TestwordRes.java
  7. 570 0
      src/main/java/com/diagbot/facade/TestwordInfoFacade.java
  8. 15 0
      src/main/java/com/diagbot/facade/TestwordResFacade.java
  9. 16 0
      src/main/java/com/diagbot/mapper/SymptomFeatureMapper.java
  10. 16 0
      src/main/java/com/diagbot/mapper/TestwordInfoMapper.java
  11. 16 0
      src/main/java/com/diagbot/mapper/TestwordResMapper.java
  12. 16 0
      src/main/java/com/diagbot/service/SymptomFeatureService.java
  13. 16 0
      src/main/java/com/diagbot/service/TestwordInfoService.java
  14. 16 0
      src/main/java/com/diagbot/service/TestwordResService.java
  15. 20 0
      src/main/java/com/diagbot/service/impl/SymptomFeatureServiceImpl.java
  16. 20 0
      src/main/java/com/diagbot/service/impl/TestwordInfoServiceImpl.java
  17. 20 0
      src/main/java/com/diagbot/service/impl/TestwordResServiceImpl.java
  18. 35 0
      src/main/java/com/diagbot/util/CoreUtil.java
  19. 23 0
      src/main/java/com/diagbot/vo/SymptomFeatureVO.java
  20. 16 0
      src/main/java/com/diagbot/vo/TestwordInfoVO.java
  21. 57 0
      src/main/java/com/diagbot/web/TestwordInfoController.java
  22. 22 0
      src/main/resources/mapper/SymptomFeatureMapper.xml
  23. 18 0
      src/main/resources/mapper/TestwordInfoMapper.xml
  24. 19 0
      src/main/resources/mapper/TestwordResMapper.xml
  25. 2 2
      src/test/java/com/diagbot/CodeGeneration.java

+ 28 - 0
doc/001.00000000初始化脚本/cdss-core_init.sql

@@ -0,0 +1,28 @@
+-- DROP TABLE IF EXISTS `demo_testword_info`;
+-- CREATE TABLE `demo_testword_info` (
+--   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+--   `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+--   `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+--   `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+--   `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+--   `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+--   `text` LONGTEXT COMMENT '文本',
+--   `type` varchar(100) NOT NULL default '' COMMENT '文本类型',
+--   `is_deal` smallint(4) NOT NULL default '0' COMMENT '是否处理,0:未使用,1:已处理',
+--   PRIMARY KEY (`id`)
+-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='词提取用例';
+--
+-- DROP TABLE IF EXISTS `demo_testword_res`;
+-- CREATE TABLE `demo_testword_res` (
+--   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+--   `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+--   `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+--   `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+--   `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+--   `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+--   `word` varchar(200) NOT NULL default '' COMMENT '词名称',
+--   `type` varchar(100) NOT NULL default '' COMMENT '词类型',
+--   `convert_word` varchar(500) NOT NULL default '' COMMENT '词转换',
+--   `is_deal` smallint(4) NOT NULL default '0' COMMENT '是否处理,0:未使用,1:已处理',
+--   PRIMARY KEY (`id`)
+-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='词提取结果';

+ 17 - 0
src/main/java/com/diagbot/entity/Ann.java

@@ -0,0 +1,17 @@
+package com.diagbot.entity;
+
+import lombok.Data;
+
+/**
+ * @author kwz
+ * @date 2020/10/15
+ * @time 14:23
+ */
+@Data
+public class Ann {
+    private String id;
+    private String type;
+    private String start;
+    private String end;
+    private String name;
+}

+ 85 - 0
src/main/java/com/diagbot/entity/SymptomFeature.java

@@ -0,0 +1,85 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+@Data
+public class SymptomFeature implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 最小组合单元
+     */
+    private String minCombineElement;
+
+    /**
+     * 部位
+     */
+    private String bodyPart;
+
+    /**
+     * 方位
+     */
+    private String position;
+
+    /**
+     * 形状性质
+     */
+    private String shapePropety;
+
+    /**
+     * 程度
+     */
+    private String degree;
+
+    /**
+     * 颜色
+     */
+    private String color;
+
+    /**
+     * 变化
+     */
+    private String variety;
+
+    /**
+     * 放射情况
+     */
+    private String radiationSituation;
+
+    /**
+     * 频率
+     */
+    private String frequency;
+}

+ 64 - 0
src/main/java/com/diagbot/entity/SymptomFeatureList.java

@@ -0,0 +1,64 @@
+package com.diagbot.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+@Data
+public class SymptomFeatureList implements Serializable {
+
+    /**
+     * 最小组合单元
+     */
+    private String minCombineElement;
+
+    /**
+     * 部位
+     */
+    private List<String> bodyPartList = new ArrayList<>();
+
+    /**
+     * 方位
+     */
+    private List<String> positionList = new ArrayList<>();
+
+    /**
+     * 形状性质
+     */
+    private List<String> shapePropetyList = new ArrayList<>();
+
+    /**
+     * 程度
+     */
+    private List<String> degreeList = new ArrayList<>();
+
+    /**
+     * 颜色
+     */
+    private List<String> colorList = new ArrayList<>();
+
+    /**
+     * 变化
+     */
+    private List<String> varietyList = new ArrayList<>();
+
+    /**
+     * 放射情况
+     */
+    private List<String> radiationSituationList = new ArrayList<>();
+
+    /**
+     * 频率
+     */
+    private List<String> frequencyList = new ArrayList<>();
+}

+ 71 - 0
src/main/java/com/diagbot/entity/TestwordInfo.java

@@ -0,0 +1,71 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 词提取用例
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+@TableName("demo_testword_info")
+@Data
+public class TestwordInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 文本
+     */
+    private String text;
+
+    /**
+     * 文本类型
+     */
+    private String type;
+
+    /**
+     * 是否处理,0:未使用,1:已处理
+     */
+    private Integer isDeal;
+
+}

+ 75 - 0
src/main/java/com/diagbot/entity/TestwordRes.java

@@ -0,0 +1,75 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 词提取结果
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+@TableName("demo_testword_res")
+@Data
+public class TestwordRes implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 词名称
+     */
+    private String word;
+
+    /**
+     * 词类型
+     */
+    private String type;
+
+    /**
+     * 词转换
+     */
+    private String convertWord;
+
+    /**
+     * 是否处理,0:未使用,1:已处理
+     */
+    private Integer isDeal;
+}

+ 570 - 0
src/main/java/com/diagbot/facade/TestwordInfoFacade.java

@@ -0,0 +1,570 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.diagbot.client.CRFServiceClient;
+import com.diagbot.dto.RetrievalDTO;
+import com.diagbot.dto.StandConvertCrfBatchDTO;
+import com.diagbot.dto.StandConvertCrfDTO;
+import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.entity.Ann;
+import com.diagbot.entity.SymptomFeature;
+import com.diagbot.entity.SymptomFeatureList;
+import com.diagbot.entity.TestwordInfo;
+import com.diagbot.entity.TestwordRes;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.SymptomFeatureService;
+import com.diagbot.service.TestwordInfoService;
+import com.diagbot.service.TestwordResService;
+import com.diagbot.service.impl.TestwordInfoServiceImpl;
+import com.diagbot.util.CoreUtil;
+import com.diagbot.util.DateUtil;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.RetrievalVO;
+import com.diagbot.vo.SearchData;
+import com.diagbot.vo.StandConvertCrfVO;
+import com.diagbot.vo.SymptomFeatureVO;
+import com.diagbot.vo.TestwordInfoVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2020/7/29 15:03
+ */
+@Component
+public class TestwordInfoFacade extends TestwordInfoServiceImpl {
+
+    @Autowired
+    CRFServiceClient crfServiceClient;
+    @Autowired
+    TestwordResFacade testwordResFacade;
+    @Autowired
+    @Qualifier("testwordResServiceImpl")
+    TestwordResService testwordResService;
+    @Autowired
+    @Qualifier("testwordInfoServiceImpl")
+    TestwordInfoService testwordInfoService;
+    @Autowired
+    @Qualifier("symptomFeatureServiceImpl")
+    SymptomFeatureService symptomFeatureService;
+    @Autowired
+    TestFacade testFacade;
+    @Autowired
+    RetrievalFacade retrievalFacade;
+    @Autowired
+    CommonFacade commonFacade;
+    int getWordBatch = 100; // 每批次读取的数据行数
+    int standConverSize = 100000; // 标准词返回的数量
+
+    public Map getWord(TestwordInfoVO testwordInfoVO) {
+        Map<String, String> res = new LinkedHashMap<>();
+        Long start = System.currentTimeMillis();
+
+        // 症状标准词
+        List<String> symptomStand = getStandWord(9, standConverSize).getSymptomNames();
+        // 诊断标准词
+        List<String> diseaseStand = getStandWord(4, standConverSize).getDiseaseNames().stream().map(r -> r.getName()).collect(Collectors.toList());
+        // 药品标准词
+        List<String> drugStand = getStandWord(5, standConverSize).getDrugNames().stream().map(r -> r.getName()).collect(Collectors.toList());
+        // 手术标准词
+        List<String> operateStand = getStandWord(6, standConverSize).getOperationNames().stream().map(r -> r.getName()).collect(Collectors.toList());
+        // 化验套餐标准词
+        List<String> lisItem = getStandWord(1, standConverSize).getLisNames();
+        // 化验明细标准词
+        List<String> lisDetail = getStandWord(2, standConverSize).getLisDetailNames().stream().map(r -> r.getUniqueName()).collect(Collectors.toList());
+        // 化验标准词
+        List<String> lisStand = new ArrayList<>();
+        lisStand.addAll(lisItem);
+        lisStand.addAll(lisDetail);
+        // 查体标准词
+        List<String> vitalStand = getStandWord(10, standConverSize).getVitalNames();
+        // 辅检结果标准词
+        List<String> pacsResStand = new ArrayList<>();
+
+        // 模型处理数据
+        WordCrfDTO wordCrfDTO = new WordCrfDTO();
+        QueryWrapper queryWrapper = new QueryWrapper<TestwordInfo>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("is_deal", 0);
+        if (ListUtil.isNotEmpty(testwordInfoVO.getIdList())) {
+            queryWrapper.in("id", testwordInfoVO.getIdList());
+        }
+        if (ListUtil.isNotEmpty(testwordInfoVO.getTypeList())) {
+            queryWrapper.in("type", testwordInfoVO.getTypeList());
+        }
+        queryWrapper.orderByAsc("id");
+        List<TestwordInfo> testwordInfoList = this.page(new Page<>(1, getWordBatch), queryWrapper).getRecords();
+
+        while (ListUtil.isNotEmpty(testwordInfoList)) {
+            List<TestwordRes> insertRes = new ArrayList<>(); // 结果集
+
+            Set<String> symptomList = new LinkedHashSet<>();
+            Set<String> diseaseList = new LinkedHashSet<>();
+            Set<String> drugList = new LinkedHashSet<>();
+            Set<String> operateList = new LinkedHashSet<>();
+            Set<String> lisList = new LinkedHashSet<>();
+            Set<String> pacsResList = new LinkedHashSet<>();
+            Set<String> vitalList = new LinkedHashSet<>();
+            for (TestwordInfo bean : testwordInfoList) {
+                String text = bean.getText();
+                String type = bean.getType();
+                SearchData searchData = new SearchData();
+                try {
+                    switch (type) {
+                        case "主诉":
+                        case "现病史":
+                            searchData.setSymptom(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 临床表现
+                            CoreUtil.addSet(symptomList, CoreUtil.getName(wordCrfDTO.getPresentLabel().getClinicals()));
+                            // 诊断
+                            CoreUtil.addSet(diseaseList, CoreUtil.getName(wordCrfDTO.getPresentLabel().getDiags()));
+                            // 药品
+                            CoreUtil.addSet(drugList, CoreUtil.getName(wordCrfDTO.getPresentLabel().getMedicines()));
+                            // 手术
+                            CoreUtil.addSet(operateList, CoreUtil.getName(wordCrfDTO.getPresentLabel().getOperations()));
+                            // 化验
+                            CoreUtil.addSet(lisList, CoreUtil.getName(wordCrfDTO.getLis()));
+                            CoreUtil.addSet(lisList, getDetail(wordCrfDTO.getLis()));
+                            // 辅检
+                            CoreUtil.addSet(pacsResList, CoreUtil.getName(wordCrfDTO.getPacsLabel().getRes()));
+                            break;
+                        case "既往史":
+                            searchData.setPasts(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 诊断
+                            CoreUtil.addSet(diseaseList, CoreUtil.getName(wordCrfDTO.getPastLabel().getDiags()));
+                            // 药品
+                            CoreUtil.addSet(drugList, CoreUtil.getName(wordCrfDTO.getPastLabel().getMedicines()));
+                            // 手术
+                            CoreUtil.addSet(operateList, CoreUtil.getName(wordCrfDTO.getPastLabel().getOperations()));
+                            break;
+                        case "出院医嘱":
+                            searchData.setPasts(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 药品
+                            CoreUtil.addSet(drugList, CoreUtil.getName(wordCrfDTO.getPastLabel().getMedicines()));
+                            break;
+                        case "专科体格检查":
+                            searchData.setVital(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 查体
+                            CoreUtil.addSet(vitalList, CoreUtil.getName(wordCrfDTO.getVitalLabel().getVitals()));
+                            CoreUtil.addSet(vitalList, CoreUtil.getName(wordCrfDTO.getVitalLabel().getClinicals()));
+                            break;
+                        case "辅助检查":
+                            searchData.setSymptom(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 化验
+                            CoreUtil.addSet(lisList, CoreUtil.getName(wordCrfDTO.getLis()));
+                            CoreUtil.addSet(lisList, getDetail(wordCrfDTO.getLis()));
+                            // 辅检
+                            CoreUtil.addSet(pacsResList, CoreUtil.getName(wordCrfDTO.getPacsLabel().getRes()));
+                            break;
+                        case "实验室检查":
+                            searchData.setSymptom(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 化验
+                            CoreUtil.addSet(lisList, CoreUtil.getName(wordCrfDTO.getLis()));
+                            CoreUtil.addSet(lisList, getDetail(wordCrfDTO.getLis()));
+                            break;
+                        case "影像学检查":
+                            searchData.setSymptom(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 辅检
+                            CoreUtil.addSet(pacsResList, CoreUtil.getName(wordCrfDTO.getPacsLabel().getRes()));
+                            break;
+                        case "初步诊断":
+                        case "修正诊断":
+                        case "术前诊断":
+                        case "术后诊断":
+                        case "术中诊断":
+                        case "出院诊断":
+                        case "补充诊断":
+                            searchData.setDiagString(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 诊断
+                            CoreUtil.addSet(diseaseList, CoreUtil.getName(wordCrfDTO.getDiag()));
+                            break;
+                        case "手术名称":
+                            searchData.setPasts(text);
+                            wordCrfDTO = commonFacade.crf_process(searchData);
+                            // 手术
+                            CoreUtil.addSet(operateList, CoreUtil.getName(wordCrfDTO.getPastLabel().getOperations()));
+                            break;
+                    }
+                } catch (Exception e) {
+                    log.error("提词出错,主键【" + bean.getId() + "】," + e.getMessage());
+                }
+            }
+
+            // 处理症状
+            dealBusiness(symptomList, "症状", symptomStand, insertRes);
+            // 处理诊断
+            dealBusiness(diseaseList, "诊断", diseaseStand, insertRes);
+            // 处理药品
+            dealBusiness(drugList, "药品", drugStand, insertRes);
+            // 处理手术
+            dealBusiness(operateList, "手术", operateStand, insertRes);
+            // 处理查体
+            dealBusiness(vitalList, "查体", vitalStand, insertRes);
+            // 处理化验
+            dealBusiness(lisList, "化验", lisStand, insertRes);
+            // 处理辅检结果
+            dealBusiness(pacsResList, "辅检结果", pacsResStand, insertRes);
+
+            // 保存结果
+            if (ListUtil.isNotEmpty(insertRes)) {
+                testwordResService.saveBatch(insertRes);
+            }
+            // 更新处理标记
+            for (TestwordInfo testwordInfo : testwordInfoList) {
+                testwordInfo.setGmtModified(DateUtil.now());
+                testwordInfo.setIsDeal(1);
+            }
+            testwordInfoService.saveOrUpdateBatch(testwordInfoList);
+
+            // 获取下一批数据
+            testwordInfoList = this.page(new Page<>(1, getWordBatch), queryWrapper).getRecords();
+        }
+
+        long mid = System.currentTimeMillis();
+        res.put("提词耗时", (mid - start) / 1000.0 + "秒");
+        // 提词后同义词转换
+        wordConvert();
+        long end = System.currentTimeMillis();
+        res.put("同义词转换耗时", (end - mid) / 1000.0 + "秒");
+        return res;
+    }
+
+
+    public RetrievalDTO getStandWord(Integer type, Integer size) {
+        RetrievalVO retrievalVO = new RetrievalVO();
+        retrievalVO.setType(type);
+        retrievalVO.setInputStr("");
+        retrievalVO.setSize(size);
+        return retrievalFacade.getname(retrievalVO);
+    }
+
+    /**
+     * 处理业务
+     * @param list
+     * @param type
+     * @param standList
+     */
+    public void dealBusiness(Set<String> list, String type, List<String> standList, List<TestwordRes> insertRes) {
+         if (list != null && list.size() > 0) {
+            List<TestwordRes> testwordResList = testwordResFacade.list(new QueryWrapper<TestwordRes>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .in("word", list)
+                    .eq("type", type)
+            );
+            // 剔除数据库已存在
+            removeWord(list, testwordResList);
+            // 剔除标准
+            list.removeAll(standList);
+            // 转换成实体类
+            List<TestwordRes> insert = stringConvertRes(list, type);
+            // 保存
+            if (ListUtil.isNotEmpty(insert)) {
+                insertRes.addAll(insert);
+            }
+        }
+    }
+
+    /**
+     * string转实体类
+     * @param stringList
+     * @param type
+     * @return
+     */
+    public List<TestwordRes> stringConvertRes(Set<String> stringList, String type) {
+        List<TestwordRes> res = new ArrayList<>();
+        Date date = DateUtil.now();
+        for (String s : stringList) {
+            TestwordRes testwordRes = new TestwordRes();
+            testwordRes.setWord(s);
+            testwordRes.setType(type);
+            testwordRes.setGmtCreate(date);
+            testwordRes.setGmtModified(date);
+            res.add(testwordRes);
+        }
+        return res;
+    }
+
+    /**
+     * 剔除数据库已存在的数据
+     * @param stringList
+     * @param testwordResList
+     */
+    public void removeWord(Set<String> stringList, List<TestwordRes> testwordResList) {
+        if (ListUtil.isEmpty(testwordResList)) {
+            return ;
+        }
+        Set<String> setList = testwordResList.stream().map(r -> r.getWord()).collect(Collectors.toSet());
+        stringList.removeAll(setList);
+    }
+
+    /**
+     * 同义词转换
+     */
+    public void wordConvert() {
+        QueryWrapper queryWrapper = new QueryWrapper<TestwordRes>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("is_deal", 0)
+                .orderByAsc("id");
+        List<TestwordRes> testwordInfoList = testwordResService.page(new Page<>(1, 20), queryWrapper).getRecords();
+
+        while(ListUtil.isNotEmpty(testwordInfoList)) {
+            List<StandConvertCrfVO> convertCrfVOList = new ArrayList<>();
+            for (TestwordRes testwordRes : testwordInfoList) {
+                StandConvertCrfVO standConvertCrfVO = new StandConvertCrfVO();
+                standConvertCrfVO.setWord(testwordRes.getWord());
+                standConvertCrfVO.setNumber(3);
+                switch (testwordRes.getType()) {
+                    case "症状":
+                        standConvertCrfVO.setWord_type("symptom");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    case "诊断":
+                        standConvertCrfVO.setWord_type("disease");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    case "药品":
+                        standConvertCrfVO.setWord_type("drug");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    case "手术":
+                        standConvertCrfVO.setWord_type("operation");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    case "查体":
+                        standConvertCrfVO.setWord_type("vital");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    // case "辅检结果":
+                    //     standConvertCrfVO.setWord_type("pacs");
+                    //     convertCrfVOList.add(standConvertCrfVO);
+                    //     break;
+                    case "化验":
+                        standConvertCrfVO.setWord_type("lis");
+                        convertCrfVOList.add(standConvertCrfVO);
+                        break;
+                    default:
+                        break;
+                }
+            }
+            StandConvertCrfBatchDTO standConvertCrfBatchDTO = testFacade.testStandConvertBatch(convertCrfVOList);
+            Date date = DateUtil.now();
+            for (TestwordRes testwordRes : testwordInfoList) {
+                switch (testwordRes.getType()) {
+                    case "症状":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "symptom");
+                        break;
+                    case "诊断":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "disease");
+                        break;
+                    case "药品":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "drug");
+                        break;
+                    case "手术":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "operation");
+                        break;
+                    case "查体":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "vital");
+                        break;
+                    // case "辅检结果":
+                    //     wordStandConvert(standConvertCrfBatchDTO, testwordRes, "pacs");
+                    //     break;
+                    case "化验":
+                        wordStandConvert(standConvertCrfBatchDTO, testwordRes, "lis");
+                        break;
+                    default:
+                        break;
+                }
+                testwordRes.setIsDeal(1);
+                testwordRes.setGmtModified(date);
+            }
+            testwordResService.saveOrUpdateBatch(testwordInfoList);
+
+            testwordInfoList = testwordResService.page(new Page<>(1, 20), queryWrapper).getRecords();
+        }
+    }
+
+    public void wordStandConvert(StandConvertCrfBatchDTO standConvertCrfBatchDTO, TestwordRes testwordRes, String type) {
+        Set<String> typeList = new LinkedHashSet<>();
+        Map<String, StandConvertCrfDTO> convertCrfDTOMap = standConvertCrfBatchDTO.getData().get(type);
+        if (convertCrfDTOMap != null && convertCrfDTOMap.get(testwordRes.getWord()) != null) {
+            List<Map<String,String>> listMap = convertCrfDTOMap.get(testwordRes.getWord()).getStandard_words();
+            int size = 0;
+            for (Map<String,String> map : listMap) {
+                if (size < 3 && StringUtil.isNotBlank(map.get("standard_word"))) {
+                    typeList.add(map.get("standard_word"));
+                }
+                size++;
+            }
+            testwordRes.setConvertWord(StringUtils.join(typeList, ";"));
+        }
+    }
+
+    /**
+     * 筛选对象列表中“uniqueName”字段为空的数据,返回targetProperty字段列表
+     *
+     * @param list
+     * @param <T>
+     * @return
+     */
+    public <T> List<String> getDetail(List<T> list) {
+        if (ListUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        return list.stream()
+                .filter(r -> StringUtil.isNotBlank((String)CoreUtil.getFieldValue(r, "detailName")))
+                .map(r -> (String)CoreUtil.getFieldValue(r, "detailName"))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 症状生成API
+     *
+     * @param symptomFeatureVO
+     */
+    public void getSymptom(SymptomFeatureVO symptomFeatureVO) {
+        Map<String, SymptomFeatureList> listMap = new LinkedHashMap<>();
+        try {
+            // 1、获取文件目录
+            File[] files = new File(symptomFeatureVO.getPath()).listFiles();
+            for (File file : files) {
+                // 读取以“.ann”结尾的文件
+                if (!file.getName().endsWith(".ann")) {
+                    continue;
+                }
+                // 2、遍历文件
+                List<Ann> annList = new ArrayList<>();
+                FileReader fileReader = new FileReader(file);
+                BufferedReader br = new BufferedReader(fileReader);
+                String line = "";
+
+                // 3、将文件结构化
+                while ((line = br.readLine()) != null) {
+                    if (StringUtil.isNotBlank(line)) {
+                        String[] arr = line.split(" |\\t");
+                        Ann ann = new Ann();
+                        ann.setId(arr[0]);
+                        ann.setType(arr[1]);
+                        ann.setStart(arr[2]);
+                        ann.setEnd(arr[3]);
+                        ann.setName(arr[4]);
+                        annList.add(ann);
+                    }
+                }
+                Map<String, List<Ann>> typeEntity = EntityUtil.makeEntityListMap(annList, "type");
+                Map<String, List<Ann>> endMap = EntityUtil.makeEntityListMap(annList, "end");
+                Map<String, List<Ann>> startMap = EntityUtil.makeEntityListMap(annList, "start");
+
+                // 4、以最小单元为准,读取相关属性
+                List<Ann> symptomList = typeEntity.get("min_combination_unit");
+                for (Ann ann : symptomList) {
+                    String name = ann.getName();
+                    SymptomFeatureList symptomFeatureList = listMap.get(name);
+                    if (symptomFeatureList == null) {
+                        symptomFeatureList = new SymptomFeatureList();
+                        symptomFeatureList.setMinCombineElement(name);
+                    }
+
+                    List<Ann> currentAnnList = new ArrayList<>();
+                    String value = "";
+                    // 从最小组合单元往上找end
+                    value = ann.getStart();
+                    while (ListUtil.isNotEmpty(currentAnnList = endMap.get(value))) {
+                        Ann annBean = currentAnnList.get(0);
+                        value = annBean.getStart();
+                        setSymptomFeature(annBean, symptomFeatureList);
+                    }
+                    // 从最小组合单元往下找start
+                    value = ann.getEnd();
+                    while (ListUtil.isNotEmpty(currentAnnList = startMap.get(value))) {
+                        Ann annBean = currentAnnList.get(0);
+                        value = annBean.getEnd();
+                        setSymptomFeature(annBean, symptomFeatureList);
+                    }
+                    listMap.put(name, symptomFeatureList);
+                }
+            }
+            // 5、数据库全部删除
+            symptomFeatureService.remove(new QueryWrapper<>());
+            // 6、批量插入
+            List<SymptomFeature> symptomFeatureList = new ArrayList<>();
+            for (String key : listMap.keySet()) {
+                SymptomFeatureList sf = listMap.get(key);
+                SymptomFeature symptomFeature = new SymptomFeature();
+                symptomFeature.setMinCombineElement(key);
+                symptomFeature.setBodyPart(StringUtils.join(sf.getBodyPartList(), "、"));
+                symptomFeature.setPosition(StringUtils.join(sf.getPositionList(), "、"));
+                symptomFeature.setShapePropety(StringUtils.join(sf.getShapePropetyList(), "、"));
+                symptomFeature.setDegree(StringUtils.join(sf.getDegreeList(), "、"));
+                symptomFeature.setColor(StringUtils.join(sf.getColorList(), "、"));
+                symptomFeature.setVariety(StringUtils.join(sf.getVarietyList(), "、"));
+                symptomFeature.setRadiationSituation(StringUtils.join(sf.getRadiationSituationList(), "、"));
+                symptomFeature.setFrequency(StringUtils.join(sf.getFrequencyList(), "、"));
+                symptomFeatureList.add(symptomFeature);
+            }
+            symptomFeatureService.saveBatch(symptomFeatureList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void addFeature(List<String> list, String name) {
+        if (!list.contains(name)) {
+            list.add(name);
+        }
+    }
+
+    public void setSymptomFeature(Ann annBean, SymptomFeatureList symptomFeatureList) {
+        switch (annBean.getType()) {
+            case "location": // 部位
+                addFeature(symptomFeatureList.getBodyPartList(), annBean.getName());
+                break;
+            case "direction": // 方位
+                addFeature(symptomFeatureList.getPositionList(), annBean.getName());
+                break;
+            case "property": // 形状性质
+                addFeature(symptomFeatureList.getShapePropetyList(), annBean.getName());
+                break;
+            case "extent": // 程度
+                addFeature(symptomFeatureList.getDegreeList(), annBean.getName());
+                break;
+            case "color": // 颜色
+                addFeature(symptomFeatureList.getColorList(), annBean.getName());
+                break;
+            case "change": // 变化
+                addFeature(symptomFeatureList.getVarietyList(), annBean.getName());
+                break;
+            case "rediate": // 放射情况
+                addFeature(symptomFeatureList.getRadiationSituationList(), annBean.getName());
+                break;
+            case "frequency": // 频率
+                addFeature(symptomFeatureList.getFrequencyList(), annBean.getName());
+                break;
+        }
+    }
+}

+ 15 - 0
src/main/java/com/diagbot/facade/TestwordResFacade.java

@@ -0,0 +1,15 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.TestwordResServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2020/7/29 15:03
+ */
+@Component
+public class TestwordResFacade extends TestwordResServiceImpl {
+
+
+}

+ 16 - 0
src/main/java/com/diagbot/mapper/SymptomFeatureMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.SymptomFeature;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+public interface SymptomFeatureMapper extends BaseMapper<SymptomFeature> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/mapper/TestwordInfoMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.TestwordInfo;
+
+/**
+ * <p>
+ * 词提取用例 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+public interface TestwordInfoMapper extends BaseMapper<TestwordInfo> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/mapper/TestwordResMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.TestwordRes;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 词提取结果 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+public interface TestwordResMapper extends BaseMapper<TestwordRes> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/SymptomFeatureService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.SymptomFeature;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+public interface SymptomFeatureService extends IService<SymptomFeature> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/TestwordInfoService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.TestwordInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 词提取用例 服务类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+public interface TestwordInfoService extends IService<TestwordInfo> {
+
+}

+ 16 - 0
src/main/java/com/diagbot/service/TestwordResService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.TestwordRes;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 词提取结果 服务类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+public interface TestwordResService extends IService<TestwordRes> {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/SymptomFeatureServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.SymptomFeature;
+import com.diagbot.mapper.SymptomFeatureMapper;
+import com.diagbot.service.SymptomFeatureService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+@Service
+public class SymptomFeatureServiceImpl extends ServiceImpl<SymptomFeatureMapper, SymptomFeature> implements SymptomFeatureService {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/TestwordInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.TestwordInfo;
+import com.diagbot.mapper.TestwordInfoMapper;
+import com.diagbot.service.TestwordInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 词提取用例 服务实现类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+@Service
+public class TestwordInfoServiceImpl extends ServiceImpl<TestwordInfoMapper, TestwordInfo> implements TestwordInfoService {
+
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/TestwordResServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.TestwordRes;
+import com.diagbot.mapper.TestwordResMapper;
+import com.diagbot.service.TestwordResService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 词提取结果 服务实现类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+@Service
+public class TestwordResServiceImpl extends ServiceImpl<TestwordResMapper, TestwordRes> implements TestwordResService {
+
+}

+ 35 - 0
src/main/java/com/diagbot/util/CoreUtil.java

@@ -19,6 +19,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -860,6 +861,22 @@ public class CoreUtil {
         }
     }
 
+    /**
+     * 添加列表
+     *
+     * @param source
+     * @param addList
+     * @param <T>
+     */
+    public static <T> void addSet(Set<T> source, List<? extends T> addList) {
+        if (source == null) {
+            return ;
+        }
+        if (ListUtil.isNotEmpty(addList)) {
+            source.addAll(addList);
+        }
+    }
+
     /**
      * 筛选对象列表中“uniqueName”字段为空的数据,返回targetProperty字段列表
      *
@@ -877,6 +894,24 @@ public class CoreUtil {
                 .collect(Collectors.toList());
     }
 
+    /**
+     * 筛选对象列表中“uniqueName”字段为空的数据,返回targetProperty字段列表
+     *
+     * @param list
+     * @param <T>
+     * @return
+     */
+    public static <T> List<String> getName(List<T> list) {
+        if (ListUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        return list.stream()
+                .filter(r -> StringUtil.isNotBlank((String)getFieldValue(r, "name")))
+                .map(r -> (String)getFieldValue(r, "name"))
+                .collect(Collectors.toList());
+    }
+
+
     /**
      * 筛选对象列表中“uniqueName”字段为空的数据,返回“name”字段列表
      *

+ 23 - 0
src/main/java/com/diagbot/vo/SymptomFeatureVO.java

@@ -0,0 +1,23 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-11-09
+ */
+@Data
+public class SymptomFeatureVO implements Serializable {
+
+    /**
+     * 路径
+     */
+    private String path;
+
+}

+ 16 - 0
src/main/java/com/diagbot/vo/TestwordInfoVO.java

@@ -0,0 +1,16 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiParam;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class TestwordInfoVO {
+
+    @ApiParam(defaultValue = "")
+    private List<Long> idList;
+
+    private List<String> typeList;
+
+}

+ 57 - 0
src/main/java/com/diagbot/web/TestwordInfoController.java

@@ -0,0 +1,57 @@
+package com.diagbot.web;
+
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.TestwordInfoFacade;
+import com.diagbot.vo.SymptomFeatureVO;
+import com.diagbot.vo.TestwordInfoVO;
+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 java.util.Map;
+
+/**
+ * <p>
+ * 词提取用例 前端控制器
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-10-29
+ */
+@RestController
+@RequestMapping("/testwordInfo")
+@Api(value = "提词API", tags = { "提词API" })
+public class TestwordInfoController {
+
+    @Autowired
+    TestwordInfoFacade testwordInfoFacade;
+
+    @ApiOperation(value = "提词API[zhoutg]",
+            notes = "提词API")
+    @PostMapping("/getword")
+    public RespDTO<Map<String, String>> getword(@RequestBody TestwordInfoVO testwordInfoVO) {
+        return RespDTO.onSuc(testwordInfoFacade.getWord(testwordInfoVO));
+    }
+
+    @ApiOperation(value = "提词转换API[zhoutg]",
+            notes = "提词转换API")
+    @PostMapping("/wordConvert")
+    public RespDTO<String> wordConvert() {
+        testwordInfoFacade.wordConvert();
+        return RespDTO.onSuc("执行完毕");
+    }
+
+    @ApiOperation(value = "症状生成API[zhoutg]",
+            notes = "症状生成API")
+    @PostMapping("/getSymptom")
+    public RespDTO<String> getSymptom(SymptomFeatureVO symptomFeatureVO) {
+        testwordInfoFacade.getSymptom(symptomFeatureVO);
+        return RespDTO.onSuc("执行完毕");
+    }
+
+}

+ 22 - 0
src/main/resources/mapper/SymptomFeatureMapper.xml

@@ -0,0 +1,22 @@
+<?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.diagbot.mapper.SymptomFeatureMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.SymptomFeature">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="min_combine_element" property="minCombineElement" />
+        <result column="body_part" property="bodyPart" />
+        <result column="position" property="position" />
+        <result column="shape_propety" property="shapePropety" />
+        <result column="degree" property="degree" />
+        <result column="color" property="color" />
+        <result column="variety" property="variety" />
+        <result column="radiation_situation" property="radiationSituation" />
+        <result column="frequency" property="frequency" />
+    </resultMap>
+
+</mapper>

+ 18 - 0
src/main/resources/mapper/TestwordInfoMapper.xml

@@ -0,0 +1,18 @@
+<?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.diagbot.mapper.TestwordInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.TestwordInfo">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="text" property="text" />
+        <result column="type" property="type" />
+        <result column="is_deal" property="isDeal" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
src/main/resources/mapper/TestwordResMapper.xml

@@ -0,0 +1,19 @@
+<?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.diagbot.mapper.TestwordResMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.TestwordRes">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="word" property="word" />
+        <result column="type" property="type" />
+        <result column="convert_word" property="convertWord" />
+        <result column="is_deal" property="isDeal" />
+    </resultMap>
+
+</mapper>

+ 2 - 2
src/test/java/com/diagbot/CodeGeneration.java

@@ -54,9 +54,9 @@ public class CodeGeneration {
 
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
-//        strategy.setTablePrefix(new String[] { "med_" });// 此处可以修改为您的表前缀
+        // strategy.setTablePrefix(new String[] { "demo_" });// 此处可以修改为您的表前缀
         strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
-        strategy.setInclude(new String[] { "sys_user"}); // 需要生成的表
+        strategy.setInclude(new String[] { "symptom_feature"}); // 需要生成的表
 
         strategy.setSuperServiceClass(null);
         strategy.setSuperServiceImplClass(null);