Browse Source

Merge branch 'dev/ruleNew20210727' into debug

wangfeng 4 years atrás
parent
commit
897e548dda

+ 1 - 1
src/main/java/com/diagbot/dto/KlRuleByIdParDTO.java

@@ -19,7 +19,7 @@ public class KlRuleByIdParDTO {
     private Long parConceptId;//提示概念id
     private String parlibName;
     private Integer parHasSub;//是否有子条件(0:无,1:有)
-    private String parMsg;//附加信息
+    //private String parMsg;//附加信息
     private Integer parStatus;//启用状态(0:禁用,1:启用)
     private String parLenName;
     private String parLenCode;

+ 1 - 0
src/main/java/com/diagbot/dto/KlRuleByIdSubDTO.java

@@ -28,4 +28,5 @@ public class KlRuleByIdSubDTO {
     private String subEqOperator;//等于域比较符
     private String subEqValue;//等于域值
     private String subEqUnit;//等于域单位
+    private String subMsg;
 }

+ 4 - 2
src/main/java/com/diagbot/entity/MappingConfig.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.diagbot.util.StringUtil;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -19,6 +20,7 @@ import java.util.Objects;
  * @author zhaops
  * @since 2021-06-09
  */
+@Data
 @TableName("tran_mapping_config")
 public class MappingConfig implements Serializable {
 
@@ -258,7 +260,7 @@ public class MappingConfig implements Serializable {
                 "}";
     }
 
-    @Override
+    /*@Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -284,7 +286,7 @@ public class MappingConfig implements Serializable {
     @Override
     public int hashCode() {
         return Objects.hash(id, isDeleted, hospitalId, type, hisName, hisCode, hisDetailName, conceptId, formConceptId, isMatch);
-    }
+    }*/
 
     public static boolean nonNull(MappingConfig o) {
         return !(o == null

+ 1 - 1
src/main/java/com/diagbot/entity/OperationConfig.java

@@ -76,7 +76,7 @@ public class OperationConfig{
     /**
      * 对应项编码
      */
-    //@Excel(name = "对应项编码", width = 40, orderNum = "2")
+    @Excel(name = "手术和操作代码", width = 40, orderNum = "2", isImportField = "true")
     private String code;
 
     /**

+ 2 - 2
src/main/java/com/diagbot/entity/TransfusionConfig.java

@@ -78,13 +78,13 @@ public class TransfusionConfig {
     /**
      * 是否匹配(0-未匹配、1-已匹配)
      */
-    @Excel(name = "是否匹配", width = 20, orderNum = "4", replace = { "未匹配_0", "已匹配_1" }, isImportField = "true")
+    @Excel(name = "是否匹配【未匹配、已匹配】", width = 20, orderNum = "4", replace = { "未匹配_0", "已匹配_1" }, isImportField = "true")
     private Integer isMatch;
 
     /**
      * 数据来源(1-标准词、2-同义词、3-编码、4-历史数据、5-相似词、99-数据迁移)
      */
-    @Excel(name = "数据来源", width = 20, orderNum = "5", replace = { "标准词_1", "同义词_2", "编码_3", "历史数据_4", "相似词_5", "数据迁移_99", "_null" }, isImportField = "true")
+    @Excel(name = "数据来源【不填、标准词、同义词、编码、历史数据、相似词】", width = 20, orderNum = "5", replace = { "标准词_1", "同义词_2", "编码_3", "历史数据_4", "相似词_5", "数据迁移_99", "_null" }, isImportField = "true")
     private Integer source;
 
     @Override

+ 8 - 8
src/main/java/com/diagbot/entity/wrapper/MappingConfigWrapper.java

@@ -2,24 +2,24 @@ package com.diagbot.entity.wrapper;
 
 import com.diagbot.entity.MappingConfig;
 import com.diagbot.util.StringUtil;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.util.Objects;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
 
 /**
  * @Description:
  * @Author:zhaops
  * @time: 2021/6/10 19:27
  */
-@Getter
-@Setter
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
 public class MappingConfigWrapper extends MappingConfig {
     private String uniqueName;
     private String form;
     private String code;
 
-    @Override
+   /* @Override
     public boolean equals(Object o) {
         if (this == o) {
             return true;
@@ -37,7 +37,7 @@ public class MappingConfigWrapper extends MappingConfig {
     @Override
     public int hashCode() {
         return Objects.hash(uniqueName, form, code) + super.hashCode();
-    }
+    }*/
 
     public static boolean nonNull(MappingConfigWrapper o) {
         return !(o == null

+ 1 - 1
src/main/java/com/diagbot/facade/ConceptInfoFacade.java

@@ -688,7 +688,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
             case 9:
                 Map<String, Map<String, Map<String, List<String>>>> nurseConfigMap
                         = mappingConfigFacade.groupByHisNameWithName(ListUtil.arrayToList(new String[] { staticKnowledgeHISVO.getHisName() }),
-                        ConceptTypeEnum.Scale.getKey(), hospitalId);
+                        ConceptTypeEnum.Nurse.getKey(), hospitalId);
                 if (nurseConfigMap != null &&
                         nurseConfigMap.get(staticKnowledgeHISVO.getHisName()) != null) {
                     nameList = nurseConfigMap.get(staticKnowledgeHISVO.getHisName())

+ 270 - 82
src/main/java/com/diagbot/facade/MappingConfigFacade.java

@@ -1,5 +1,6 @@
 package com.diagbot.facade;
 
+import cn.afterturn.easypoi.exception.excel.ExcelImportException;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -97,31 +98,43 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
         RespDTO<List<IndexBatchDTO>> respDTO = null;
 
         //todo 标准词转conceptId
+        List<Long> conceptIds = Lists.newLinkedList();
         if (StringUtil.isNotBlank(mappingConfigPageVO.getUniqueName())) {
             filterVO.setInputStr(mappingConfigPageVO.getUniqueName());
             respDTO = cdssCoreClient.filter(filterVO);
-            if (RespDTOUtil.respIsOK(respDTO) && ListUtil.isNotEmpty(respDTO.data)) {
-                mappingConfigPageVO.setConceptIds(respDTO.data
-                        .stream()
-                        .map(IndexBatchDTO::getId)
-                        .distinct()
-                        .collect(Collectors.toList()));
+            if (RespDTOUtil.respIsOK(respDTO)) {
+                if (ListUtil.isNotEmpty(respDTO.data)) {
+                    conceptIds.addAll(respDTO.data
+                            .stream()
+                            .map(IndexBatchDTO::getId)
+                            .distinct()
+                            .collect(Collectors.toList()));
+                } else {
+                    conceptIds.add(-1L);
+                }
             }
         }
+        mappingConfigPageVO.setConceptIds(conceptIds);
 
         //todo 药品剂型转 conceptId
+        List<Long> formConceptIds = Lists.newLinkedList();
         if (StringUtil.isNotBlank(mappingConfigPageVO.getForm())) {
             filterVO.setInputStr(mappingConfigPageVO.getForm());
             respDTO = cdssCoreClient.filter(filterVO);
-            if (RespDTOUtil.respIsOK(respDTO) && ListUtil.isNotEmpty(respDTO.data)) {
-                mappingConfigPageVO.setFormConceptIds(respDTO.data
-                        .stream()
-                        .filter(i -> i.getType().equals(ConceptTypeEnum.Form.getKey()))
-                        .map(IndexBatchDTO::getId)
-                        .distinct()
-                        .collect(Collectors.toList()));
+            if (RespDTOUtil.respIsOK(respDTO)) {
+                if (ListUtil.isNotEmpty(respDTO.data)) {
+                    formConceptIds.addAll(respDTO.data
+                            .stream()
+                            .filter(i -> i.getType().equals(ConceptTypeEnum.Form.getKey()))
+                            .map(IndexBatchDTO::getId)
+                            .distinct()
+                            .collect(Collectors.toList()));
+                } else {
+                    formConceptIds.add(-1L);
+                }
             }
         }
+        mappingConfigPageVO.setFormConceptIds(formConceptIds);
 
         //todo 多条匹配
         if (mappingConfigPageVO.getIsMatch() != null && mappingConfigPageVO.getIsMatch().equals(2)) {
@@ -290,61 +303,70 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
      *
      * @param file
      * @param type
+     * @param source 1-预匹配,2-导入
      * @return
      */
-    public List<MappingConfigWrapper> readImportData(MultipartFile file, Integer type) {
+    public List<MappingConfigWrapper> readImportData(MultipartFile file, Integer type, Integer source) {
         List<MappingConfigWrapper> originList = Lists.newLinkedList();
-        switch (type) {
-            case 1:
-                List<LisConfig> lisConfigList = ExcelUtils.importExcel(file, 0, 1, LisConfig.class);
-                originList = BeanUtil.listCopyTo(lisConfigList, MappingConfigWrapper.class);
-                break;
-            case 3:
-                List<PacsConfig> pacsConfigList = ExcelUtils.importExcel(file, 0, 1, PacsConfig.class);
-                originList = BeanUtil.listCopyTo(pacsConfigList, MappingConfigWrapper.class);
-                break;
-            case 4:
-                List<DiseaseConfig> diseaseConfigList = ExcelUtils.importExcel(file, 0, 1, DiseaseConfig.class);
-                originList = BeanUtil.listCopyTo(diseaseConfigList, MappingConfigWrapper.class);
-                break;
-            case 5:
-                List<DrugConfig> drugConfigList = ExcelUtils.importExcel(file, 1, 1, DrugConfig.class);
-                originList = BeanUtil.listCopyTo(drugConfigList, MappingConfigWrapper.class);
-                break;
-            case 6:
-                List<OperationConfig> operationConfigList = ExcelUtils.importExcel(file, 0, 1, OperationConfig.class);
-                originList = BeanUtil.listCopyTo(operationConfigList, MappingConfigWrapper.class);
-                break;
-            case 7:
-                List<DeptConfig> deptConfigList = ExcelUtils.importExcel(file, 0, 1, DeptConfig.class);
-                originList = BeanUtil.listCopyTo(deptConfigList, MappingConfigWrapper.class);
-                break;
-            case 8:
-                List<TransfusionConfig> transfusionConfigList = ExcelUtils.importExcel(file, 0, 1, TransfusionConfig.class);
-                originList = BeanUtil.listCopyTo(transfusionConfigList, MappingConfigWrapper.class);
-                break;
-            case 10:
-                List<ScaleConfig> scaleConfigList = ExcelUtils.importExcel(file, 0, 1, ScaleConfig.class);
-                originList = BeanUtil.listCopyTo(scaleConfigList, MappingConfigWrapper.class);
-                break;
-            case 11:
-                List<NurseConfig> nurseConfigList = ExcelUtils.importExcel(file, 0, 1, NurseConfig.class);
-                originList = BeanUtil.listCopyTo(nurseConfigList, MappingConfigWrapper.class);
-                break;
-            case 12:
-                List<TcmdiseaseConfig> tcmdiseaseConfigList = ExcelUtils.importExcel(file, 0, 1, TcmdiseaseConfig.class);
-                originList = BeanUtil.listCopyTo(tcmdiseaseConfigList, MappingConfigWrapper.class);
-                break;
-            case 13:
-                List<TcmsyndromeConfig> tcmsyndromeConfigList = ExcelUtils.importExcel(file, 0, 1, TcmsyndromeConfig.class);
-                originList = BeanUtil.listCopyTo(tcmsyndromeConfigList, MappingConfigWrapper.class);
-                break;
-            case 14:
-                List<AnesthesiaConfig> anesthesiaConfigList = ExcelUtils.importExcel(file, 0, 1, AnesthesiaConfig.class);
-                originList = BeanUtil.listCopyTo(anesthesiaConfigList, MappingConfigWrapper.class);
-                break;
-            default:
-                break;
+        try {
+            switch (type) {
+                case 1:
+                    List<LisConfig> lisConfigList = ExcelUtils.importExcel(file, 0, 1, LisConfig.class);
+                    originList = BeanUtil.listCopyTo(lisConfigList, MappingConfigWrapper.class);
+                    break;
+                case 3:
+                    List<PacsConfig> pacsConfigList = ExcelUtils.importExcel(file, 0, 1, PacsConfig.class);
+                    originList = BeanUtil.listCopyTo(pacsConfigList, MappingConfigWrapper.class);
+                    break;
+                case 4:
+                    List<DiseaseConfig> diseaseConfigList = ExcelUtils.importExcel(file, 0, 1, DiseaseConfig.class);
+                    originList = BeanUtil.listCopyTo(diseaseConfigList, MappingConfigWrapper.class);
+                    break;
+                case 5:
+                    List<DrugConfig> drugConfigList = ExcelUtils.importExcel(file, 1, 1, DrugConfig.class);
+                    originList = BeanUtil.listCopyTo(drugConfigList, MappingConfigWrapper.class);
+                    break;
+                case 6:
+                    List<OperationConfig> operationConfigList = ExcelUtils.importExcel(file, 0, 1, OperationConfig.class);
+                    originList = BeanUtil.listCopyTo(operationConfigList, MappingConfigWrapper.class);
+                    break;
+                case 7:
+                    List<DeptConfig> deptConfigList = ExcelUtils.importExcel(file, 0, 1, DeptConfig.class);
+                    originList = BeanUtil.listCopyTo(deptConfigList, MappingConfigWrapper.class);
+                    break;
+                case 8:
+                    List<TransfusionConfig> transfusionConfigList = ExcelUtils.importExcel(file, 0, 1, TransfusionConfig.class);
+                    originList = BeanUtil.listCopyTo(transfusionConfigList, MappingConfigWrapper.class);
+                    break;
+                case 10:
+                    List<ScaleConfig> scaleConfigList = ExcelUtils.importExcel(file, 0, 1, ScaleConfig.class);
+                    originList = BeanUtil.listCopyTo(scaleConfigList, MappingConfigWrapper.class);
+                    break;
+                case 11:
+                    List<NurseConfig> nurseConfigList = ExcelUtils.importExcel(file, 0, 1, NurseConfig.class);
+                    originList = BeanUtil.listCopyTo(nurseConfigList, MappingConfigWrapper.class);
+                    break;
+                case 12:
+                    List<TcmdiseaseConfig> tcmdiseaseConfigList = ExcelUtils.importExcel(file, 0, 1, TcmdiseaseConfig.class);
+                    originList = BeanUtil.listCopyTo(tcmdiseaseConfigList, MappingConfigWrapper.class);
+                    break;
+                case 13:
+                    List<TcmsyndromeConfig> tcmsyndromeConfigList = ExcelUtils.importExcel(file, 0, 1, TcmsyndromeConfig.class);
+                    originList = BeanUtil.listCopyTo(tcmsyndromeConfigList, MappingConfigWrapper.class);
+                    break;
+                case 14:
+                    List<AnesthesiaConfig> anesthesiaConfigList = ExcelUtils.importExcel(file, 0, 1, AnesthesiaConfig.class);
+                    originList = BeanUtil.listCopyTo(anesthesiaConfigList, MappingConfigWrapper.class);
+                    break;
+                default:
+                    break;
+            }
+        } catch (ExcelImportException e) {
+
+        } catch (CommonException e) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "校验失败,请使用模板进行数据" + (source == 1 ? "预匹配" : "导入"));
+        } catch (Exception e) {
+
         }
         return originList;
     }
@@ -356,7 +378,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
      * @return
      */
     public Boolean dataVerify(MultipartFile file, Integer type) {
-        List<MappingConfigWrapper> originList = readImportData(file, type);
+        List<MappingConfigWrapper> originList = readImportData(file, type, 1);
         List<MappingConfigWrapper> retList = precDataProcess(originList, type);
         return true;
     }
@@ -369,7 +391,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
      * @param response
      */
     public void precDataMatch(MultipartFile file, Integer type, HttpServletResponse response) {
-        List<MappingConfigWrapper> originList = readImportData(file, type);
+        List<MappingConfigWrapper> originList = readImportData(file, type, 1);
         List<MappingConfigWrapper> retList = precDataProcess(originList, type);
         exportExcel(response, retList, type, "关联数据(预匹配)");
     }
@@ -382,7 +404,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
      * @return
      */
     public List<MappingConfigWrapper> precDataMatch_remote(MultipartFile file, Integer type) {
-        List<MappingConfigWrapper> originList = readImportData(file, type);
+        List<MappingConfigWrapper> originList = readImportData(file, type, 1);
         List<MappingConfigWrapper> retList = precDataProcess(originList, type);
         return retList;
     }
@@ -399,29 +421,71 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
         List<MappingConfigWrapper> standardList = Lists.newLinkedList();
         List<MappingConfigWrapper> synonymsList = Lists.newLinkedList();
         List<MappingConfigWrapper> codeList = Lists.newLinkedList();
+        List<MappingConfigWrapper> historyList = Lists.newLinkedList();
+        List<MappingConfigWrapper> drugList = Lists.newLinkedList();
+
+        //去除空行
+        /*originList = originList.stream()
+                .filter(MappingConfigWrapper::nonNull)
+                .collect(Collectors.toList());*/
 
         //数据完整性校验
+        List<Integer> emptyNumList = Lists.newLinkedList();
+        Integer rowId = 1;
         for (MappingConfigWrapper item : originList) {
+            ++rowId;
             //过滤医院术语名称为空的条目
-            if (StringUtil.isNotBlank(item.getHisName())) {
-                item.setHisName(item.getHisName().trim());
+            if (type.equals(ConceptTypeEnum.LisPack.getKey())) {
+                if (StringUtil.isBlank(item.getHisName())
+                        && StringUtil.isBlank(item.getHisDetailName())) {
+                    continue;
+                } else if (StringUtil.isBlank(item.getHisName())
+                        && StringUtil.isNotBlank(item.getHisDetailName())) {
+                    emptyNumList.add(rowId);
+                }
+            } else if (type.equals(ConceptTypeEnum.Disease.getKey())
+                    || type.equals(ConceptTypeEnum.Operation.getKey())
+                    || type.equals(ConceptTypeEnum.Tcmdisease.getKey())
+                    || type.equals(ConceptTypeEnum.Tcmsyndrome.getKey())) {
+                if (StringUtil.isBlank(item.getHisName())
+                        && StringUtil.isBlank(item.getCode())) {
+                    continue;
+                } else if (StringUtil.isBlank(item.getHisName())
+                        && StringUtil.isNotBlank(item.getCode())) {
+                    emptyNumList.add(rowId);
+                }
             } else {
-                continue;
+                if (StringUtil.isNotBlank(item.getHisName())) {
+                    item.setHisName(item.getHisName().trim());
+                } else {
+                    continue;
+                }
             }
             if (StringUtil.isNotBlank(item.getHisDetailName())) {
                 item.setHisDetailName(item.getHisDetailName().trim());
             } else {
                 item.setHisDetailName("");
             }
+
             if (StringUtil.isNotBlank(item.getHisCode())) {
                 item.setHisCode(item.getHisCode().trim());
             } else {
                 item.setHisCode("");
             }
             item.setUniqueName("");
+            item.setIsMatch(0);
+            item.setSource(null);
             dataList.add(item);
         }
 
+        //医院术语名称不允许为空
+        if (ListUtil.isNotEmpty(emptyNumList)) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "预匹配失败,上传文件内行("
+                    + emptyNumList.stream().map(Object::toString)
+                    .collect(Collectors.joining("、"))
+                    + ")医院术语" + (type.equals(ConceptTypeEnum.LisPack.getKey()) ? "的检验套餐项" : "") + "不可为空。\n");
+        }
+
         if (ListUtil.isEmpty(dataList)) {
             return retList;
         }
@@ -613,7 +677,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
 
             for (MappingConfigWrapper item : codeList) {
                 if (item.getIsMatch() != null && item.getIsMatch().equals(1)) {
-                    retList.add(item);
+                    historyList.add(item);
                     continue;
                 }
                 if (configMap.containsKey(item.getHisName())) {
@@ -621,7 +685,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
                     if (subMap != null && subMap.size() > 0) {
                         Map<String, List<String>> thirdMap = subMap.get(item.getHisDetailName());
                         if (thirdMap == null || thirdMap.size() == 0) {
-                            retList.add(item);
+                            historyList.add(item);
                             continue;
                         }
                         for (Map.Entry<String, List<String>> thirdEntry : thirdMap.entrySet()) {
@@ -633,28 +697,95 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
                             if (type.equals(ConceptTypeEnum.Drug.getKey())) {
                                 List<String> forms = thirdEntry.getValue();
                                 if (ListUtil.isEmpty(forms)) {
-                                    retList.add(historyItem);
+                                    historyList.add(historyItem);
                                 } else {
                                     for (String form : forms) {
                                         MappingConfigWrapper formItem = new MappingConfigWrapper();
                                         BeanUtil.copyProperties(historyItem, formItem);
                                         formItem.setForm(form);
-                                        retList.add(formItem);
+                                        historyList.add(formItem);
                                     }
                                 }
                             } else {
-                                retList.add(historyItem);
+                                historyList.add(historyItem);
                             }
                         }
                     }
                 } else {
-                    retList.add(item);
+                    historyList.add(item);
                 }
             }
         } else {
-            retList = BeanUtil.listCopyTo(codeList, MappingConfigWrapper.class);
+            historyList = BeanUtil.listCopyTo(codeList, MappingConfigWrapper.class);
         }
 
+        //药品关联标准词、同义词匹配数据增加历史数据剂型
+        if (type.equals(ConceptTypeEnum.Drug.getKey())) {
+            List<String> hisDrugNames = historyList.stream()
+                    .filter(i -> i.getIsMatch() != null
+                            && i.getIsMatch().equals(1)
+                            && i.getSource() != null
+                            && (i.getSource().equals(MatchSourceEnum.StandWord.getKey())))
+                    .map(MappingConfigWrapper::getHisName)
+                    .distinct()
+                    .collect(Collectors.toList());
+            hisDrugNames.addAll(historyList.stream()
+                    .filter(i -> i.getIsMatch() != null
+                            && i.getIsMatch().equals(1)
+                            && i.getSource() != null
+                            && i.getSource().equals(MatchSourceEnum.SynonymsWord.getKey()))
+                    .map(MappingConfigWrapper::getUniqueName)
+                    .distinct()
+                    .collect(Collectors.toList()));
+            if (ListUtil.isNotEmpty(hisDrugNames)) {
+                Map<String, Map<String, Map<String, List<String>>>> configMap = groupByHisNameWithName(hisDrugNames, type, null);
+                for (MappingConfigWrapper item : historyList) {
+                    if (item.getIsMatch() != null && item.getIsMatch().equals(1)
+                            && item.getSource() != null
+                            && (item.getSource().equals(MatchSourceEnum.StandWord.getKey())
+                            || item.getSource().equals(MatchSourceEnum.SynonymsWord.getKey()))) {
+                        if ((item.getSource().equals(MatchSourceEnum.StandWord.getKey())
+                                && configMap.containsKey(item.getHisName()))
+                                || (item.getSource().equals(MatchSourceEnum.SynonymsWord.getKey())
+                                && configMap.containsKey(item.getUniqueName()))) {
+                            Map<String, Map<String, List<String>>> subMap
+                                    = configMap.get(item.getSource().equals(MatchSourceEnum.StandWord.getKey())
+                                    ? item.getHisName()
+                                    : item.getUniqueName());
+                            if (subMap != null && subMap.size() > 0) {
+                                Map<String, List<String>> thirdMap = subMap.get(item.getHisDetailName());
+                                if (thirdMap == null || thirdMap.size() == 0) {
+                                    drugList.add(item);
+                                    continue;
+                                }
+                                List<String> forms = thirdMap.get(item.getUniqueName());
+                                if (ListUtil.isEmpty(forms)) {
+                                    drugList.add(item);
+                                } else {
+                                    for (String form : forms) {
+                                        MappingConfigWrapper formItem = new MappingConfigWrapper();
+                                        BeanUtil.copyProperties(item, formItem);
+                                        formItem.setForm(form);
+                                        drugList.add(formItem);
+                                    }
+                                }
+                            }
+                        } else {
+                            drugList.add(item);
+                        }
+                    } else {
+                        drugList.add(item);
+                    }
+                }
+            } else {
+                drugList = BeanUtil.listCopyTo(historyList, MappingConfigWrapper.class);
+            }
+        } else {
+            drugList = BeanUtil.listCopyTo(historyList, MappingConfigWrapper.class);
+        }
+
+
+        retList = BeanUtil.listCopyTo(drugList, MappingConfigWrapper.class);
         for (MappingConfigWrapper item : retList) {
             if (item.getIsMatch() == null) {
                 item.setIsMatch(0);
@@ -663,6 +794,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
 
         //添加编码
         retList = addCodes(retList, type);
+        retList = retList.stream().distinct().collect(Collectors.toList());
         return retList;
     }
 
@@ -683,7 +815,7 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
         if (StringUtil.isBlank(userId)) {
             userId = "0";
         }
-        List<MappingConfigWrapper> originList = readImportData(file, type);
+        List<MappingConfigWrapper> originList = readImportData(file, type, 2);
         if (ListUtil.isEmpty(originList)) {
             throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "校验失败,导入数据不能为空");
         }
@@ -795,8 +927,6 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
                 it.remove();
             }
         }
-        tempList.addAll(matchList);
-        tempList.addAll(unMatchList);
 
         // 验证数据是否已存在,已存在的先删除
         // 没id的删除重新插入,有id的更新
@@ -859,7 +989,24 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
                         deleteIds.add(item.getId());
                     }
                 }
+
+                //数据库中已存在匹配项,去除导入文件中未匹配项
+                it = unMatchList.iterator();
+                while (it.hasNext()) {
+                    MappingConfigWrapper item = it.next();
+                    String matchKey = item.getHisName() + "_"
+                            + item.getHisCode() + "_"
+                            + item.getHisDetailName();
+                    if (db_matchMap.containsKey(matchKey)) {
+                        it.remove();
+                    }
+                }
             }
+
+            //过滤后的导入结果集
+            tempList.addAll(matchList);
+            tempList.addAll(unMatchList);
+
             //标准术语校验
             ConceptVO conceptVO = new ConceptVO();
             conceptVO.setSource(MatchSourceEnum.StandWord.getKey());
@@ -980,7 +1127,10 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
             idListVO.setIds(deleteIds);
             deleteRecords(idListVO);
             List<MappingConfig> saveList = BeanUtil.listCopyTo(tempList, MappingConfig.class);
-            mappingConfigService.saveOrUpdateBatch(saveList);
+            saveList = saveList.stream().distinct().collect(Collectors.toList());
+            if (ListUtil.isNotEmpty(saveList)) {
+                mappingConfigService.saveOrUpdateBatch(saveList);
+            }
         }
         return true;
     }
@@ -1052,6 +1202,10 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
                 .eq("is_match", 1);
         if (StringUtil.isNotBlank(mappingConfigVO.getHisDetailName())) {
             queryWrapper.eq("his_detail_name", mappingConfigVO.getHisDetailName());
+        } else {
+            queryWrapper.and(i -> i.isNull("his_detail_name")
+                    .or()
+                    .eq("his_detail_name", ""));
         }
 
         List<MappingConfig> list = this.list(queryWrapper);
@@ -1093,6 +1247,19 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
             queryWrapper
                     .eq("his_detail_name", mappingConfig.getHisDetailName());
         }
+        if (StringUtil.isBlank(mappingConfig.getHisCode())) {
+            queryWrapper.and(i -> i.isNull("his_code")
+                    .or()
+                    .eq("his_code", ""));
+        } else {
+            queryWrapper
+                    .eq("his_code", mappingConfig.getHisCode());
+        }
+        if (mappingConfig.getFormConceptId() != null) {
+            queryWrapper.eq("form_concept_id", mappingConfig.getFormConceptId());
+        } else {
+            queryWrapper.isNull("form_concept_id");
+        }
         if (mappingConfig.getFormConceptId() != null) {
             queryWrapper.eq("form_concept_id", mappingConfig.getFormConceptId());
         }
@@ -1148,6 +1315,19 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
         } else {
             queryWrapper.eq("his_detail_name", mappingConfig.getHisDetailName());
         }
+        if (StringUtil.isBlank(mappingConfig.getHisCode())) {
+            queryWrapper.and(i -> i.isNull("his_code")
+                    .or()
+                    .eq("his_code", ""));
+        } else {
+            queryWrapper
+                    .eq("his_code", mappingConfig.getHisCode());
+        }
+        if (mappingConfig.getFormConceptId() != null) {
+            queryWrapper.eq("form_concept_id", mappingConfig.getFormConceptId());
+        } else {
+            queryWrapper.isNull("form_concept_id");
+        }
         MappingConfig oldRecord = this.getOne(queryWrapper, false);
         if (mappingConfig.getId() == null
                 && oldRecord != null) {
@@ -1182,6 +1362,14 @@ public class MappingConfigFacade extends MappingConfigServiceImpl {
         } else {
             qwUnMaptch.eq("his_detail_name", mappingConfig.getHisDetailName());
         }
+        if (StringUtil.isBlank(mappingConfig.getHisCode())) {
+            qwUnMaptch.and(i -> i.isNull("his_code")
+                    .or()
+                    .eq("his_code", ""));
+        } else {
+            qwUnMaptch
+                    .eq("his_code", mappingConfig.getHisCode());
+        }
         this.remove(qwUnMaptch);
 
         mappingConfig.setIsMatch(1);

+ 1 - 0
src/main/java/com/diagbot/vo/KlRuleInfoSaveSubVO.java

@@ -27,4 +27,5 @@ public class KlRuleInfoSaveSubVO {
     private String subEqOperator;//等于域比较符
     private String subEqValue;//等于域值
     private String subEqUnit;//等于域单位
+    private String subMsg;
 }

+ 1 - 1
src/main/java/com/diagbot/vo/KlRuleInfoSaveVO.java

@@ -25,7 +25,7 @@ public class KlRuleInfoSaveVO {
     private Long parConceptId;//提示概念id
     @NotNull(message = "请输入概念id")
     private Integer parHasSub;//是否有子条件(0:无,1:有)
-    private String parMsg;//附加信息
+    //private String parMsg;//附加信息
     @ApiModelProperty(hidden = true)
     private Integer parStatus = 1;//启用状态(0:禁用,1:启用)
     /*    private String parlibName;