Explorar el Código

Merge branch 'develop' into dev/mapping20210603

gaodm hace 4 años
padre
commit
58ee7f7cbd

+ 1 - 1
pom.xml

@@ -29,7 +29,7 @@
         <mybatis-plus-boot-starter.version>3.2.0</mybatis-plus-boot-starter.version>
         <mybatis-spring-boot.version>2.1.1</mybatis-spring-boot.version>
         <druid.version>1.1.21</druid.version>
-        <easypoi.version>4.2.0</easypoi.version>
+        <easypoi.version>4.3.0</easypoi.version>
         <swagger.version>2.9.2</swagger.version>
         <logstash.version>5.2</logstash.version>
         <docker-maven-plugin.version>1.2.1</docker-maven-plugin.version>

+ 42 - 0
src/main/java/com/diagbot/dto/ExportDiagnoseDTO.java

@@ -0,0 +1,42 @@
+package com.diagbot.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 诊断依据导出
+ * </p>
+ *
+ * @author kongwz
+ * @since 2020-07-28
+ */
+@Data
+public class ExportDiagnoseDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Excel(name="类型", width = 20, orderNum = "10")
+    private String type = "";
+    @Excel(name="序号", width = 10, orderNum = "20")
+    private String orderNo = "";
+    @Excel(name="规则", width = 50, orderNum = "30")
+    private String rule = "";
+    @Excel(name="等于", width = 10, orderNum = "40")
+    private String eq;
+    @Excel(name="最大值", width = 10, orderNum = "50")
+    private String max;
+    @Excel(name="最大值符号", width = 10, orderNum = "60")
+    private String unit;
+    @Excel(name="最小值", width = 10, orderNum = "70")
+    private String min;
+    @Excel(name="最小值符号", width = 10, orderNum = "80")
+    private String maxSymbol;
+    @Excel(name="单位", width = 10, orderNum = "90")
+    private String minSymbol;
+    @Excel(name="关联词", width = 30, orderNum = "35")
+    private String relation;
+
+}

+ 24 - 0
src/main/java/com/diagbot/dto/ExportDiagnoseNameDTO.java

@@ -0,0 +1,24 @@
+package com.diagbot.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 诊断依据导出
+ * </p>
+ *
+ * @author kongwz
+ * @since 2020-07-28
+ */
+@Data
+public class ExportDiagnoseNameDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Excel(name="名称", isHyperlink = true)
+    private String name = "";
+
+}

+ 23 - 0
src/main/java/com/diagbot/entity/ExcelDataHandler.java

@@ -0,0 +1,23 @@
+package com.diagbot.entity;
+
+import cn.afterturn.easypoi.handler.impl.ExcelDataHandlerDefaultImpl;
+import com.diagbot.dto.ExportDiagnoseNameDTO;
+import org.apache.poi.common.usermodel.HyperlinkType;
+import org.apache.poi.ss.usermodel.CreationHelper;
+import org.apache.poi.ss.usermodel.Hyperlink;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2021/6/10 15:40
+ */
+public class ExcelDataHandler extends ExcelDataHandlerDefaultImpl<ExportDiagnoseNameDTO> {
+
+    @Override
+    public Hyperlink getHyperlink(CreationHelper creationHelper, ExportDiagnoseNameDTO obj, String name, Object value) {
+        Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.DOCUMENT);
+        // hyperlink.setLabel("#EB病毒感染!A1");
+        hyperlink.setAddress("#" + obj.getName() + "!A1");
+        return hyperlink;
+    }
+}

+ 54 - 0
src/main/java/com/diagbot/entity/KlDiagnoseDetail.java

@@ -0,0 +1,54 @@
+package com.diagbot.entity;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 诊断依据明细表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-10
+ */
+@Data
+public class KlDiagnoseDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 诊断名称
+     */
+    private String disName;
+
+    /**
+     * 类型(1:症状,2:体征,3:化验,4:辅检,5:鉴别诊断,6:病史,7:诱因,8:病程,9:其他,91:确诊,92:拟诊,93:警惕)
+     */
+    private Integer type;
+
+    /**
+     * 编码
+     */
+    private String code;
+
+    /**
+     * 标准词
+     */
+    private String standard;
+
+    /**
+     * 关联词
+     */
+    private String relation;
+
+    /**
+     * 中间结果(例如:升高|阳性,不需要校验)
+     */
+    private String midResult;
+
+    /**
+     * 公式
+     */
+    private String formula;
+}

+ 15 - 1
src/main/java/com/diagbot/enums/DiagnoseLexiconTypeEnum.java

@@ -20,7 +20,21 @@ public enum DiagnoseLexiconTypeEnum implements KeyedNamed {
     zsxbszz(900, "G"),
     jwzz(901, "H"),
     Age(410,"I"),
-    Group(117, "J");
+    Group(117, "J"),
+    // 旧新诊断依据类型对应
+    SymptomTpye(1, "A:症状"),
+    VitalResultTpye(2, "B:体格检查结果"),
+//    VitalTpye(104, "C"),
+    LisSubNameTpye(3, "D:实验室检查子项目"),
+    PacsResultTpye(4, "E:辅助检查结果"),
+    DiseaseTpye(5, "F:疾病"),
+    DiseaseHisTpye(6, "F:疾病"),//病史
+    ZsxbszzTpyeCause(7, "G:主诉现病史正则"),//诱因
+    ZsxbszzTpyeBc(8, "G:主诉现病史正则"),//病程
+    jwzzTpye(9, "H:既往正则"),
+    QuezhenTpye(91, "确诊"),
+    NizhenTpye(92, "拟诊"),
+    JtTpye(93, "警惕");
 
     @Setter
     private int key;

+ 282 - 0
src/main/java/com/diagbot/facade/KlDiagnoseDetailFacade.java

@@ -0,0 +1,282 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.ExportDiagnoseDTO;
+import com.diagbot.dto.ExportDiagnoseNameDTO;
+import com.diagbot.entity.KlDiagnoseDetail;
+import com.diagbot.enums.DiagnoseLexiconTypeEnum;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.service.impl.KlDiagnoseDetailServiceImpl;
+import com.diagbot.util.*;
+import com.google.common.collect.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * <p>
+ * 诊断依据明细表 服务实现类
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-10
+ */
+@Service
+public class KlDiagnoseDetailFacade extends KlDiagnoseDetailServiceImpl {
+
+    @Autowired
+    KlDiagnoseDetailFacade klDiagnoseDetailFacade;
+
+    /**
+     * 导出诊断依据【初版】
+     */
+    public void exportDiagnose(HttpServletResponse response) {
+        // 获取全部数据、分组
+        List<KlDiagnoseDetail> klDiagnoseDetailList = klDiagnoseDetailFacade.list(new QueryWrapper<KlDiagnoseDetail>()
+//                .eq("dis_name", "急性化脓性扁桃体炎")
+                .eq("is_deleted", IsDeleteEnum.N.getKey()));
+        Map<String, List<KlDiagnoseDetail>> diagnoseDetailMap = EntityUtil.makeEntityListMap(klDiagnoseDetailList, "disName");
+        Map<String, List<ExportDiagnoseDTO>> diagnoseDetails = processDiagnoseDetail(diagnoseDetailMap);
+        List<ExportDiagnoseDTO> res = new ArrayList<>();
+        for (String disName : diagnoseDetails.keySet()) {
+            ExportDiagnoseDTO exportDiagnoseDTO = new ExportDiagnoseDTO();
+            exportDiagnoseDTO.setType("【" + disName + "】"); // 疾病
+            res.add(exportDiagnoseDTO);
+            res.addAll(diagnoseDetails.get(disName));
+        }
+        // 导出数据
+        List<Map<String, Object>> exportDto = new LinkedList<>();
+
+        // Map<String, List<ExportDiagnoseDTO>> diagnoseDetailsNew = new LinkedHashMap<>();
+        // diagnoseDetailsNew.put("测试", res);
+        // List<ExportDiagnoseNameDTO> exportDiagnoseNameDTOList = getCatalogue(diagnoseDetailsNew); // 生成目录名称
+        // Map<String, String> styleMap = new LinkedHashMap<>();
+        // styleMap.put(ExcelUtils.HYPERLINK, "com.diagbot.entity.ExcelDataHandler");
+        // styleMap.put(ExcelUtils.DATA_HEIGHT, "6");
+        // exportDto.add(ExcelUtils.createOneSheet("目录", null, ExportDiagnoseNameDTO.class, exportDiagnoseNameDTOList, styleMap));
+
+        Map<String, String> styleMap1 = new LinkedHashMap<>();
+        styleMap1.put(ExcelUtils.DATA_HEIGHT, "6");
+        exportDto.add(ExcelUtils.createOneSheet("诊断依据", null, ExportDiagnoseDTO.class, res, styleMap1));
+        // int i = 0;
+        // for (String key : diagnoseDetailsNew.keySet()) {
+        //     if (i++ > 50) {
+        //         // break;
+        //     }
+        //
+        // }
+        ExcelUtils.exportExcel(exportDto, "diagnose.xlsx", response);
+    }
+
+
+    public Map<String, List<ExportDiagnoseDTO>> processDiagnoseDetail(Map<String, List<KlDiagnoseDetail>> diagnoseDetailMap) {
+        Map<String, List<ExportDiagnoseDTO>> data = new LinkedHashMap<>();
+
+        for (Map.Entry<String, List<KlDiagnoseDetail>> kd : diagnoseDetailMap.entrySet()) {
+            String sheetName = kd.getKey();
+            List<KlDiagnoseDetail> datats = kd.getValue();
+            Map<Integer, List<String>> typeCodeNewListMap = new HashMap<>();// 1 --> [1.0,1.1]
+            Map<Integer, List<String>> exportDiagnoseDTOS = removeKlDiagnoseDetail(datats, typeCodeNewListMap);
+            List<ExportDiagnoseDTO> exportDiagnoseDTO= packageData(exportDiagnoseDTOS, datats, typeCodeNewListMap);
+            data.put(sheetName,exportDiagnoseDTO);
+        }
+        return data;
+    }
+
+    /**
+     *
+     * @param exportDiagnoseDTOS 各种类型的关联词
+     * @param datats 诊断依据
+     * @param typeCodeNewListMap 各种类型的codes
+     */
+    public List<ExportDiagnoseDTO> packageData(Map<Integer, List<String>> exportDiagnoseDTOS,List<KlDiagnoseDetail> datats,Map<Integer, List<String>> typeCodeNewListMap){
+        List<ExportDiagnoseDTO> eds = Lists.newArrayList();
+        List<Integer> types = Lists.newArrayList(91, 92, 93);
+
+        Map<Integer, List<KlDiagnoseDetail>> typeDiagnoseDetails = EntityUtil.makeEntityListMap(datats, "type");
+        for (Map.Entry<Integer, List<String>> edd : exportDiagnoseDTOS.entrySet()) {
+            Integer type = edd.getKey();
+            List<KlDiagnoseDetail> klDiagnoseDetails = typeDiagnoseDetails.get(type);
+            List<String> relations = edd.getValue();
+            List<String> codes = typeCodeNewListMap.get(type);
+            String maxCode = codes.get(codes.size() - 1);
+            String[] maxCodeArray = maxCode.split("\\.");
+            Integer max = Integer.parseInt(maxCodeArray[1]);
+            for (String relation:relations) {
+                max += 1;
+                KlDiagnoseDetail klDiagnoseDetail = new KlDiagnoseDetail();
+                klDiagnoseDetail.setType(type);
+                klDiagnoseDetail.setCode(maxCodeArray[0]+"."+max);
+                klDiagnoseDetail.setStandard(relation);
+                klDiagnoseDetails.add(klDiagnoseDetail);
+                codes.add(maxCodeArray[0]+"."+max);
+            }
+
+        }
+        Map<String,List<String>> typeCodeMap = new HashMap<>();//A --> [1.0,1.1,1.2,1.3]
+        Map<String,String> oldNewCodeMap = new HashMap<>();//1.0 -->A0
+        for (Map.Entry<Integer, List<KlDiagnoseDetail>> tdd : typeDiagnoseDetails.entrySet()) {
+            List<KlDiagnoseDetail> klDiagnoseDetails = tdd.getValue();
+            for (KlDiagnoseDetail kdl:klDiagnoseDetails) {
+                Integer type = kdl.getType();
+                String code = kdl.getCode();
+                String formula = kdl.getFormula();
+                String typeName = DiagnoseLexiconTypeEnum.getName(type);//A:症状
+
+                ExportDiagnoseDTO exportDiagnoseDTO = new ExportDiagnoseDTO();
+                BeanUtil.copyProperties(kdl, exportDiagnoseDTO);
+
+                if (!types.contains(type)) {
+                    String tName = typeName.split(":")[1];//症状
+                    String tType = typeName.split(":")[0];//A
+                    String tCode = code.split("\\.")[1];
+                    if(typeCodeMap.containsKey(tType)){
+                        List<String> codes = typeCodeMap.get(tType);
+                        List<String> collect = codes.stream().map(z -> z.split("\\.")[1]).sorted().collect(Collectors.toList());
+                        if(collect.contains(tCode)){
+                            String maxCode = collect.get(collect.size()-1);
+                            tCode = String.valueOf(Integer.parseInt(maxCode)+1);
+                            codes.add(String.valueOf(type)+"."+tCode);
+
+                        }else {
+                            codes.add(String.valueOf(type)+"."+tCode);
+                        }
+                        typeCodeMap.put(tType,codes);
+                    }else {
+                        List<String> codes = Lists.newArrayList();
+                        codes.add(String.valueOf(type)+"."+tCode);
+                        typeCodeMap.put(tType,codes);
+                    }
+                    ReflectUtil.setProperty(exportDiagnoseDTO, "type", tName);
+                    ReflectUtil.setProperty(exportDiagnoseDTO, "orderNo", tType+String.valueOf(tCode));
+                    oldNewCodeMap.put(code,tType+String.valueOf(tCode));
+                    if (code.startsWith("3.") ) {
+                        exportDiagnoseDTO.setRule(kdl.getRelation());
+                        exportDiagnoseDTO.setRelation("");
+                    } else {
+                        exportDiagnoseDTO.setRule(kdl.getStandard());
+                    }
+                    if(code.startsWith("4.")){
+                        exportDiagnoseDTO.setRule(kdl.getRelation());
+                        exportDiagnoseDTO.setRelation(kdl.getStandard());
+                    }
+                    exportDiagnoseDTO.setEq(kdl.getMidResult());
+                }else {
+                    ReflectUtil.setProperty(exportDiagnoseDTO, "type", typeName);
+                    for (Map.Entry<String,String> typeq:oldNewCodeMap.entrySet()){
+                        String oldCode = typeq.getKey();
+                        String newCode = typeq.getValue();
+                        formula = formula.replace(oldCode,newCode);
+                    }
+                    exportDiagnoseDTO.setRule(formula.replaceAll("/","、")
+                            .replaceAll("\\(","[").replaceAll("\\)","]"));
+                }
+
+                eds.add(exportDiagnoseDTO);
+            }
+        }
+        return eds;
+    }
+
+    /**
+     * 生成目录
+     *
+     * @param diagnoseDetails
+     * @return
+     */
+    public  List<ExportDiagnoseNameDTO> getCatalogue(Map<String, List<ExportDiagnoseDTO>> diagnoseDetails) {
+        List<ExportDiagnoseNameDTO> exportDiagnoseNameDTOList = Lists.newArrayList();
+        for (String key : diagnoseDetails.keySet()) {
+            ExportDiagnoseNameDTO exportDiagnoseNameDTO = new ExportDiagnoseNameDTO();
+            exportDiagnoseNameDTO.setName(key);
+            exportDiagnoseNameDTOList.add(exportDiagnoseNameDTO);
+        }
+        return exportDiagnoseNameDTOList;
+    }
+
+    /**
+     * 移除公式编码中没有的数据
+     *
+     * @param klDiagnoseDetails
+     */
+    public Map<Integer, List<String>> removeKlDiagnoseDetail(List<KlDiagnoseDetail> klDiagnoseDetails, Map<Integer, List<String>> typeCodeNewListMap) {
+
+        Map<Integer, List<String>> typeRelationNamesMap = new HashMap<>();// 1 --> [症状1,症状2]
+
+        //获取所有公式
+        List<String> allFormula = getAllFormula(klDiagnoseDetails);
+        //获取公式中的所有编码
+        List<String> regexData = getCodes(allFormula);
+
+        //遍历病历
+        List<Integer> types = Stream.of(1, 2, 5, 6, 7, 8, 9).collect(Collectors.toList());
+        Iterator<KlDiagnoseDetail> iterator = klDiagnoseDetails.iterator();
+        while (iterator.hasNext()) {
+            KlDiagnoseDetail next = iterator.next();
+            String code = next.getCode();//1.0
+            Integer type = next.getType();//1
+            String relation = next.getRelation();
+            if (!regexData.contains(code) && StringUtil.isNotBlank(code)) {
+                iterator.remove();
+            } else {
+                if (StringUtil.isNotBlank(relation) && types.contains(type)) {
+                    List<String> relationNames = Lists.newArrayList(relation.split("\\、"));
+                    if (typeRelationNamesMap.containsKey(type)) {
+                        List<String> contionNames = typeRelationNamesMap.get(type);
+                        contionNames.addAll(relationNames);
+                        typeRelationNamesMap.put(type, contionNames);
+                    } else {
+                        typeRelationNamesMap.put(type, relationNames);
+                    }
+                }
+                if (StringUtil.isNotBlank(code)) {
+                    if (typeCodeNewListMap.containsKey(type)) {
+                        List<String> codes = typeCodeNewListMap.get(type);
+                        codes.add(code);
+                        typeCodeNewListMap.put(type, codes);
+                    } else {
+                        List<String> codes = Lists.newArrayList();
+                        codes.add(code);
+                        typeCodeNewListMap.put(type, codes);
+                    }
+                }
+            }
+        }
+        return typeRelationNamesMap;
+    }
+
+
+    /**
+     * 获取每个诊断依据的公式
+     *
+     * @param klDiagnoseDetails
+     * @return
+     */
+    private List<String> getAllFormula(List<KlDiagnoseDetail> klDiagnoseDetails) {
+        List<String> formulas = Lists.newArrayList();
+        if (ListUtil.isNotEmpty(klDiagnoseDetails)) {
+            formulas = klDiagnoseDetails.stream().filter(x -> StringUtil.isBlank(x.getCode()) && StringUtil.isNotBlank(x.getFormula()))
+                    .map(x -> x.getFormula()).collect(Collectors.toList());
+
+        }
+        return formulas;
+    }
+
+    /**
+     * 获取公式中的所有编码
+     *
+     * @param formulas
+     * @return
+     */
+    private List<String> getCodes(List<String> formulas) {
+        String pateern = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])";
+        String content = formulas.stream().collect(Collectors.joining(","));
+        //获取公式中的编码
+        return RegexUtil.getRegexDatas(content, pateern);
+    }
+
+}

+ 70 - 47
src/main/java/com/diagbot/facade/KlDiagnoseImportFacade.java

@@ -8,12 +8,23 @@ import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.LexiconExtEnum;
 import com.diagbot.service.KlConceptService;
-import com.diagbot.util.*;
-import com.diagbot.vo.*;
+import com.diagbot.util.EntityUtil;
+import com.diagbot.util.ExcelUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RegexUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.util.VerifyUtil;
+import com.diagbot.vo.DiagnoseImportVO;
+import com.diagbot.vo.ImportDiagnoseResVO;
+import com.diagbot.vo.ImportDiagnoseVO;
+import com.diagbot.vo.KlDiagnoseDetailVO;
+import com.diagbot.vo.KlDiagnoseGroupVO;
+import com.diagbot.vo.KlDiagnoseSaveVO;
+import com.diagbot.vo.KlDiagnoseTypeVO;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -21,6 +32,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.ListIterator;
@@ -43,6 +55,7 @@ public class KlDiagnoseImportFacade {
     KlDiagnoseFacade klDiagnoseFacade;
 
     public Map<String, Object> importDiagnose(MultipartFile file, DiagnoseImportVO diagnoseImportVO) {
+        long t1 = System.currentTimeMillis();
         Map<String, Object> errMessage = new LinkedHashMap<>(); // 错误提示语
         List<ImportDiagnoseResVO> allData = Lists.newArrayList();  // 最终需要保存的数据
         // 校验数据
@@ -52,6 +65,8 @@ public class KlDiagnoseImportFacade {
         if (allFlag) {
             saveData(allData);
         }
+        long t2 = System.currentTimeMillis();
+        System.out.println("总计:" + (t2 - t1) / 1000.0);
         return errMessage;
     }
 
@@ -70,57 +85,62 @@ public class KlDiagnoseImportFacade {
         // 获取标准词库Map
         Map<String, KlConcept> concept_map = getConceptMap();
 
-        // 获取所有的sheet和序号的对应关系
-        Map<String, Integer> sheetNumNameMap = dealExcel(file);
-        // 指定诊断列表
-        List<String> diags = diagnoseImportVO.getDiags();
-        if (ListUtil.isNotEmpty(diags)) {
-            List<String> allErrMsg = Lists.newArrayList();
-            Map<String, Integer> inputNumNameMap = new LinkedMap<>();
-            for (String diag : diags) {
-                if (!sheetNumNameMap.containsKey(diag)) {
-                    allErrMsg.add(String.format("输入的诊断: %s不在下面的sheet中", "【" + diag + "】"));
-                } else {
-                    inputNumNameMap.put(diag, sheetNumNameMap.get(diag));
+        // 分组之后的数据
+        Map<String, List<ImportDiagnoseVO>> groupData = new LinkedHashMap<>();
+        // 获取全部数据,分组
+        List<ImportDiagnoseVO> data = ExcelUtils.importExcelMultiSheets(file, 0, 1, 0, ImportDiagnoseVO.class);
+        List<ImportDiagnoseVO> importDiagnoseVOList = null;
+        String addDisName = "";
+        for (ImportDiagnoseVO importDiagnoseVO : data) {
+            String type = importDiagnoseVO.getType();
+            if (type != null && type.startsWith("【") && type.endsWith("】")) {
+                if (StringUtil.isNotBlank(addDisName)) {
+                    addDisName = RegexUtil.getRegexData(addDisName, "【(.*?)】", 1);
+                    groupData.put(addDisName, importDiagnoseVOList);
                 }
-            }
-            if (ListUtil.isNotEmpty(allErrMsg)) {
-                diagMessage.put("输入校验", StringUtils.join(allErrMsg, ";  "));
-                allFlag = false;
-                return allFlag;
+                importDiagnoseVOList = new ArrayList<>();
+                addDisName = type;
             } else {
-                sheetNumNameMap = inputNumNameMap;
+                importDiagnoseVOList.add(importDiagnoseVO);
             }
         }
-        for (Map.Entry<String, Integer> sheet : sheetNumNameMap.entrySet()) {
+        groupData.put(addDisName, importDiagnoseVOList); // 添加最后一个
+
+        int i = 0;
+        for (String disName : groupData.keySet()) {
+            // 指定诊断导入
+            if (ListUtil.isNotEmpty(diagnoseImportVO.getDiags())) {
+                if (!diagnoseImportVO.getDiags().contains(disName)) {
+                    continue;
+                }
+            }
+            System.out.println(i++ + ": " + disName);
             List<String> currentErrMsg = Lists.newArrayList();
-            String sheetName = sheet.getKey();
-            Integer sheetNum = sheet.getValue();
-            ImportDiagnoseResVO importDiagnoseResVO = new ImportDiagnoseResVO();
 
+            ImportDiagnoseResVO importDiagnoseResVO = new ImportDiagnoseResVO();
             // 校验疾病名称【sheetName】
-            KlConcept klConcept = concept_map.get(sheetName + "_" + String.valueOf(LexiconEnum.Disease.getKey()));
+            KlConcept klConcept = concept_map.get(disName + "_" + String.valueOf(LexiconEnum.Disease.getKey()));
             if (klConcept != null) {
-                importDiagnoseResVO.setDiseaseName(sheetName);
+                importDiagnoseResVO.setDiseaseName(disName);
                 importDiagnoseResVO.setDiseaseId(klConcept.getId());
             } else {
-                currentErrMsg.add(String.format("sheetName: %s不是标准词", "【" + sheetName + "】"));
+                currentErrMsg.add(String.format("%s不是标准词", disName));
             }
             // 校验其他行数据、格式
-            List<ImportDiagnoseVO> data = ExcelUtils.importExcelMultiSheets(file, 0, 1, sheetNum.intValue(), ImportDiagnoseVO.class);
-            //处理公式(确诊)
-            List<String> orderList = processFormula(data, diagtypes);
-            dealVerify(currentErrMsg, orderList, diagtypes, data, concept_map);
+            List<ImportDiagnoseVO> curData = groupData.get(disName);
 
+            //处理公式(确诊)
+            List<String> orderList = processFormula(curData, diagtypes);
+            dealVerify(currentErrMsg, orderList, diagtypes, curData, concept_map);
             // 数据赋值
             if (ListUtil.isEmpty(currentErrMsg)) {
-                data = dealImportDiagnose(diagtypes, data, concept_map);
+                curData = dealImportDiagnose(diagtypes, curData, concept_map);
                 // 添加到正确数据列表
-                importDiagnoseResVO.setImportDiagnoseVOList(data);
+                importDiagnoseResVO.setImportDiagnoseVOList(curData);
                 allData.add(importDiagnoseResVO);
             } else {
                 allFlag = false;
-                diagMessage.put(sheetName, StringUtils.join(currentErrMsg.stream().distinct().collect(Collectors.toList()), ";  "));
+                diagMessage.put(disName, StringUtils.join(currentErrMsg.stream().distinct().collect(Collectors.toList()), ";  "));
             }
         }
         return allFlag;
@@ -135,30 +155,31 @@ public class KlDiagnoseImportFacade {
                 ImportDiagnoseVO next = it.next();
                 String type = next.getType();
                 String orderNo = next.getOrderNo();
+                String rule = next.getRule();
                 Integer rowNum = next.getRowNum() - 1;
                 if (!diagtypes.contains(type) && StringUtil.isNotBlank(type) && StringUtil.isNotBlank(orderNo)) {
                     orderList.add(orderNo);
                 }
-                if ("拟诊".equals(type) && StringUtils.isNotBlank(orderNo)) {
+                if ("拟诊".equals(type) && StringUtils.isNotBlank(rule)) {
                     if (typeCollect.containsKey(type)) {
                         List<String> gongsi = typeCollect.get(type);
-                        gongsi.add(orderNo);
+                        gongsi.add(rule);
                         typeCollect.put(type, gongsi);
                     } else {
                         List<String> gongsi = Lists.newArrayList();
-                        gongsi.add(orderNo);
+                        gongsi.add(rule);
                         typeCollect.put(type, gongsi);
                     }
                 }
-                if ("确诊".equals(type) && StringUtils.isNotBlank(orderNo)) {
-                    if (orderNo.contains("拟诊") && typeCollect.containsKey("拟诊")) {
+                if ("确诊".equals(type) && StringUtils.isNotBlank(rule)) {
+                    if (rule.contains("拟诊") && typeCollect.containsKey("拟诊")) {
                         it.remove();
                         for (String nizhen : typeCollect.get("拟诊")) {
                             ImportDiagnoseVO importDiagnoseVO = new ImportDiagnoseVO();
-                            importDiagnoseVO.setParentRule(next.getOrderNo());
+                            importDiagnoseVO.setParentRule(next.getRule());
                             importDiagnoseVO.setType(type);
                             importDiagnoseVO.setRowNum(rowNum);
-                            importDiagnoseVO.setOrderNo(orderNo.replace("拟诊", nizhen));
+                            importDiagnoseVO.setOrderNo(rule.replace("拟诊", nizhen));
                             it.add(importDiagnoseVO);
                         }
                     }
@@ -178,6 +199,7 @@ public class KlDiagnoseImportFacade {
         Map<String, Integer> sheetNumName = Maps.newLinkedHashMap();
         Workbook workBook = null;
         try {
+            ZipSecureFile.setMinInflateRatio(-1.0d);
             workBook = ExcelUtils.getWorkBook(file);
             int numberOfSheets = workBook.getNumberOfSheets();
             for (int i = 0; i < numberOfSheets; i++) {
@@ -279,17 +301,18 @@ public class KlDiagnoseImportFacade {
                 if (StringUtils.isBlank(type)) {
                     currentErrMsg.add(String.format("第%d行【类型】不能为空", rowNum));
                 }
-                if (StringUtils.isBlank(orderNo)) {
-                    currentErrMsg.add(String.format("第%d行【序号】不能为空", rowNum));
+                if (StringUtils.isNotBlank(type) && diagtypes.contains(type) && StringUtils.isBlank(rule)
+                && StringUtils.isBlank(orderNo)) {
+                    currentErrMsg.add(String.format("第%d行【诊断依据规则】不能为空", rowNum));
                 }
                 if (StringUtils.isNotBlank(type) && !diagtypes.contains(type) && StringUtils.isBlank(rule)) {
                     currentErrMsg.add(String.format("第%d行【规则】不能为空", rowNum));
                 }
-                if (diagtypes.contains(type) && StringUtil.isNotBlank(orderNo)) {
-                    String s = VerifyUtil.verifyFormula(orderNums, orderNo);
+                if (diagtypes.contains(type) && StringUtil.isNotBlank(rule)) {
+                    String s = VerifyUtil.verifyFormula(orderNums, rule);
                     if (StringUtil.isNotBlank(s)) {
                         if (StringUtil.isNotBlank(parentRule)) {
-                            s = s.replace(orderNo, parentRule);
+                            s = s.replace(rule, parentRule);
                         }
                         currentErrMsg.add(s);
                     }

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

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.KlDiagnoseDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 诊断依据明细表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-10
+ */
+public interface KlDiagnoseDetailMapper extends BaseMapper<KlDiagnoseDetail> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.KlDiagnoseDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 诊断依据明细表 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-10
+ */
+public interface KlDiagnoseDetailService extends IService<KlDiagnoseDetail> {
+
+}

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

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.KlDiagnoseDetail;
+import com.diagbot.mapper.KlDiagnoseDetailMapper;
+import com.diagbot.service.KlDiagnoseDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 诊断依据明细表 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-10
+ */
+@Service
+public class KlDiagnoseDetailServiceImpl extends ServiceImpl<KlDiagnoseDetailMapper, KlDiagnoseDetail> implements KlDiagnoseDetailService {
+
+}

+ 57 - 2
src/main/java/com/diagbot/util/ExcelUtils.java

@@ -1,12 +1,12 @@
 package com.diagbot.util;
 
-
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
 import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
+import cn.afterturn.easypoi.handler.inter.IExcelDataHandler;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import org.apache.commons.lang3.StringUtils;
@@ -44,6 +44,11 @@ import java.util.NoSuchElementException;
  */
 public class ExcelUtils {
 
+    // styleMap中包含的属性名
+    public static final String DATA_HEIGHT = "DATA_HEIGHT";// 数据行高例如:6
+    public static final String EX_STYLE = "EX_STYLE";// 类样式例如:com.ztg.util.ExcelExportStyler
+    public static final String HYPERLINK = "HYPERLINK";// 超级链接对象:com.ztg.util.ExcelExportStyler
+
     /**
      * 得到Workbook对象
      * @param file
@@ -162,7 +167,7 @@ public class ExcelUtils {
     }
 
     private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
-        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
+        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.XSSF);
         if (workbook != null) {
             ;
         }
@@ -428,5 +433,55 @@ public class ExcelUtils {
         }
     }
 
+    /**
+     * 创建多表单表格内容
+     *
+     * @param sheetName
+     * @param title
+     * @param clazz
+     * @param data
+     * @param styleMap
+     * @return
+     */
+    public static Map<String, Object> createOneSheet(String sheetName, String title, Class<?> clazz, List<?> data, Map<String, String> styleMap) {
+        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.HSSF);
+        setExportParams(exportParams, styleMap);
+        Map<String, Object> map = new HashMap<>();
+        map.put("title", exportParams);
+        map.put("entity", clazz);
+        map.put("data", data);
+        return map;
+    }
+
+    /**
+     * 设置样式
+     *
+     * @param exportParams 参数
+     * @param styleMap     自定义样式
+     */
+    private static void setExportParams(ExportParams exportParams, Map<String, String> styleMap) {
+        if (exportParams == null || styleMap == null) {
+            return;
+        }
+        try {
+            // 设置数据行高
+            String dataHeight = styleMap.get(DATA_HEIGHT);
+            if (dataHeight != null) {
+                exportParams.setHeight(Short.valueOf(dataHeight));
+            }
+            // 设置样式
+            if (styleMap.get(EX_STYLE) != null) {
+                exportParams.setStyle(Class.forName(styleMap.get(EX_STYLE)));
+            }
+            // 设置超级链接
+            if (styleMap.get(HYPERLINK) != null) {
+                exportParams.setDataHandler((IExcelDataHandler) Class.forName(styleMap.get(HYPERLINK)).newInstance());
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 
 }

+ 27 - 3
src/main/java/com/diagbot/util/RegexUtil.java

@@ -2,9 +2,11 @@ package com.diagbot.util;
 
 import com.google.common.collect.Lists;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * @author zhoutg
@@ -152,7 +154,7 @@ public class RegexUtil {
      * @param regex
      * @return
      */
-    private static List<String> getRegexData(String content, String regex) {
+    public static List<String> getRegexData(String content, String regex) {
         return getRegexDataCommon(content, regex, false);
     }
 
@@ -196,17 +198,39 @@ public class RegexUtil {
         return list;
     }
 
+    public static List<String> getRegexDatas(String content, String pattern){
+        List<String> numbers=new ArrayList<>();
+        // 创建 Pattern 对象
+        Pattern r = Pattern.compile(pattern);
+        // 现在创建 matcher 对象
+        Matcher matcher = r.matcher(content);
+        while (matcher.find()) {
+            //获取当前匹配的值
+            numbers.add(matcher.group());
+        }
+
+        return numbers;
+    }
+
     /**
      * 测试
      *
      * @param args
      */
     public static void main(String[] args) {
-        String regex1 = "(血小板计数)\\s*(\\d+(\\.\\d+)?)";
+        String regex1 = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])";
         // System.out.println(getRegexData("血小板计数  30.3", regex1, 2));
-        System.out.println(getRegexData("血小板计数  30.3", regex1));
+        System.out.println(getRegexData("拟诊+(3.3/3.4)任一", regex1));
 
         String s1 = "ABC";
         System.out.println(getRegexRes(s1, "Abc", true));
+
+        System.out.println(getRegexDatas("拟诊+(3.3/3.4)任一","([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9])"));
+
+        ArrayList<String> js = Lists.newArrayList("G.4", "G.1", "G.2", "G.3");
+        List<String> collect = js.stream().sorted().collect(Collectors.toList());
+        System.out.println(collect);
+
+
     }
 }

+ 5 - 3
src/main/java/com/diagbot/util/VerifyUtil.java

@@ -252,8 +252,8 @@ public class VerifyUtil {
 	 * @return
 	 */
 	public static List<String> verifySplit(String s) {
-		s = s.replaceAll("\\(", "(");
-		s = s.replaceAll("\\)", ")");
+		s = s.replaceAll("\\【", "[");
+		s = s.replaceAll("\\】", "]");
 		s = s.replaceAll(" ", "");
 		String regex =
 				"\\]任一\\+\\[" + "|\\]任二\\+\\[" + "|\\]任三\\+\\[" + "|\\]任四\\+\\[" + "|\\]任五\\+\\[" + "|\\]任六\\+\\[" + "|\\]任七\\+\\[" + "|\\]任八\\+\\[" + "|\\]任九\\+\\[" + "|\\]任十\\+\\[" +
@@ -265,7 +265,9 @@ public class VerifyUtil {
 						"|\\+" +
 						"|\\、" +
 						"|/" ;
+
 		String[] arr = s.split(regex);
+		System.out.println(s);
 		return Arrays.asList(arr);
 	}
 
@@ -376,7 +378,7 @@ public class VerifyUtil {
 	}
 
 	public static void main(String[] args) {
-		List<String> strings = verifySplit("[1、3]任一+4");
+		List<String> strings = verifySplit("[1.1、1.2、2.1]任一");
 		System.out.println(strings);
 		//		System.out.println(verifyStartEnd("]1.1+1.2"));
 		//    	String str = "1.99";

+ 20 - 0
src/main/java/com/diagbot/web/KlDiagnoseDetailController.java

@@ -0,0 +1,20 @@
+package com.diagbot.web;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ * 诊断依据明细表 前端控制器
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-10
+ */
+@Controller
+@RequestMapping("/klDiagnoseDetail")
+public class KlDiagnoseDetailController {
+
+}

+ 10 - 1
src/main/java/com/diagbot/web/KlDiagnoseImportController.java

@@ -1,6 +1,7 @@
 package com.diagbot.web;
 
 import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.KlDiagnoseDetailFacade;
 import com.diagbot.facade.KlDiagnoseImportFacade;
 import com.diagbot.vo.DiagnoseImportVO;
 import io.swagger.annotations.Api;
@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.Map;
 
 /**
@@ -22,12 +24,14 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/klDiagnoseImport")
-@Api(tags = { "A诊断依据导入API" })
+@Api(tags = { "A诊断依据导入导出API" })
 @SuppressWarnings("unchecked")
 public class KlDiagnoseImportController {
 
     @Autowired
     KlDiagnoseImportFacade klDiagnoseImportFacade;
+    @Autowired
+    KlDiagnoseDetailFacade klDiagnoseDetailFacade;
 
     @ApiOperation(value = "诊断依据导入API[zhoutg]",
             notes = "diags:指定诊断名称导入")
@@ -37,5 +41,10 @@ public class KlDiagnoseImportController {
         return RespDTO.onSuc(klDiagnoseImportFacade.importDiagnose(file, diagnoseImportVO));
     }
 
+    @ApiOperation(value = "诊断依据导出API[zhoutg]")
+    @PostMapping("/exportDiagnose")
+    public void exportDiagnose(HttpServletResponse response) {
+        klDiagnoseDetailFacade.exportDiagnose(response);
+    }
 
 }

+ 32 - 0
src/main/resources/mapper/KlDiagnoseDetailMapper.xml

@@ -0,0 +1,32 @@
+<?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.KlDiagnoseDetailMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlDiagnoseDetail">
+        <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="diagnose_id" property="diagnoseId" />
+        <result column="dis_name" property="disName" />
+        <result column="type" property="type" />
+        <result column="code" property="code" />
+        <result column="standard" property="standard" />
+        <result column="relation" property="relation" />
+        <result column="unique_name" property="uniqueName" />
+        <result column="mid_result" property="midResult" />
+        <result column="result" property="result" />
+        <result column="formula" property="formula" />
+        <result column="order_no" property="orderNo" />
+        <result column="verify_code" property="verifyCode" />
+        <result column="verify_standard" property="verifyStandard" />
+        <result column="verify_relation" property="verifyRelation" />
+        <result column="verify_unique" property="verifyUnique" />
+        <result column="verify_result" property="verifyResult" />
+        <result column="verify_formula" property="verifyFormula" />
+    </resultMap>
+
+</mapper>

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

@@ -49,14 +49,14 @@ public class CodeGeneration {
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("lantone");
-        dsc.setUrl("jdbc:mysql://192.168.2.236:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
+        dsc.setUrl("jdbc:mysql://192.168.2.236:3306/med_2021?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
         mpg.setDataSource(dsc);
 
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
         // strategy.setTablePrefix(new String[] { "demo_" });// 此处可以修改为您的表前缀
         strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
-        strategy.setInclude(new String[] { "sys_dept_push"}); // 需要生成的表
+        strategy.setInclude(new String[] { "kl_diagnose_detail"}); // 需要生成的表
 
         strategy.setSuperServiceClass(null);
         strategy.setSuperServiceImplClass(null);