Browse Source

数据导入校验

zhaops 4 năm trước cách đây
mục cha
commit
b32bf6c249

+ 10 - 1
src/main/java/com/diagbot/client/CdssCoreClient.java

@@ -7,13 +7,13 @@ import com.diagbot.dto.PushPlanDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.RetrievalDTO;
 import com.diagbot.dto.StaticKnowledgeIndexDTO;
+import com.diagbot.vo.ConceptVO;
 import com.diagbot.vo.HasStaticKnowledgeVO;
 import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.PushPlanVO;
 import com.diagbot.vo.PushVO;
 import com.diagbot.vo.RetrievalVO;
 import com.diagbot.vo.StaticKnowledgeIndexVO;
-import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -67,6 +67,15 @@ public interface CdssCoreClient {
      */
     @PostMapping("/staticKnowledge/updateHasInfoStatus")
     RespDTO<Boolean> updateHasInfoStatus(@Valid @RequestBody HasStaticKnowledgeVO hasStaticKnowledgeVO);
+
+    /**
+     * 术语批量校验
+     *
+     * @param conceptVO
+     * @return
+     */
+    @PostMapping("/retrieval/getConceptNames")
+    RespDTO<List<String>> getConceptNames(@Valid @RequestBody ConceptVO conceptVO);
 }
 
 

+ 14 - 1
src/main/java/com/diagbot/client/hystrix/CdssCoreHystrix.java

@@ -7,6 +7,7 @@ import com.diagbot.dto.PushPlanDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.RetrievalDTO;
 import com.diagbot.dto.StaticKnowledgeIndexDTO;
+import com.diagbot.vo.ConceptVO;
 import com.diagbot.vo.HasStaticKnowledgeVO;
 import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.PushPlanVO;
@@ -45,7 +46,7 @@ public class CdssCoreHystrix implements CdssCoreClient {
      * 推送持续检验检查计划
      */
     @Override
-    public RespDTO<PushPlanDTO> pushPlan(@RequestBody PushPlanVO pushPlanVO){
+    public RespDTO<PushPlanDTO> pushPlan(@RequestBody PushPlanVO pushPlanVO) {
         log.error("【hystrix】调用{}异常", "pushPlan");
         return null;
     }
@@ -85,4 +86,16 @@ public class CdssCoreHystrix implements CdssCoreClient {
         log.error("【hystrix】调用{}异常", "updateHasInfoStatus");
         return null;
     }
+
+    /**
+     * 术语批量校验
+     *
+     * @param conceptVO
+     * @return
+     */
+    @Override
+    public RespDTO<List<String>> getConceptNames(@Valid @RequestBody ConceptVO conceptVO) {
+        log.error("【hystrix】调用{}异常", "getConceptNames");
+        return null;
+    }
 }

+ 11 - 8
src/main/java/com/diagbot/enums/ConceptTypeEnum.java

@@ -6,16 +6,19 @@ import lombok.Setter;
 /**
  * @Description:
  * @Author:zhaops
- * @time: 2020/8/18 16:30
+ * @time: 2020/9/10 15:51
  */
 public enum ConceptTypeEnum implements KeyedNamed {
-    All(0, "全部"),
-    Disease(1, "诊断"),
-    Drug(2, "药品"),
-    LisPack(3, "检验套餐"),
-    Lis(4, "检验明细"),
-    Pacs(5, "检查"),
-    Opeartion(6, "手术和操作");
+    //类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血
+
+    LisPack(1, "检验套餐"),
+    Lis(2, "检验明细"),
+    Pacs(3, "检查"),
+    Disease(4, "诊断"),
+    Drug(5, "药品"),
+    Opeartion(6, "手术和操作"),
+    Dept(7, "科室"),
+    Transfusion(8, "输血");
 
     @Setter
     private int key;

+ 68 - 0
src/main/java/com/diagbot/enums/StaticTypeEnum.java

@@ -0,0 +1,68 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/8/18 16:30
+ */
+public enum StaticTypeEnum implements KeyedNamed {
+    All(0, "全部"),
+    Disease(1, "诊断"),
+    Drug(2, "药品"),
+    LisPack(3, "检验套餐"),
+    Lis(4, "检验明细"),
+    Pacs(5, "检查"),
+    Opeartion(6, "手术和操作");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    StaticTypeEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static StaticTypeEnum getEnum(int key) {
+        for (StaticTypeEnum item : StaticTypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static StaticTypeEnum getEnum(String name) {
+        for (StaticTypeEnum item : StaticTypeEnum.values()) {
+            if (item.name.equals(name)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        StaticTypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    public static int getKey(String name) {
+        StaticTypeEnum item = getEnum(name);
+        return item != null ? item.key : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+}

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

@@ -13,7 +13,7 @@ import com.diagbot.dto.StaticKnowledgeDetailDTO;
 import com.diagbot.dto.StaticKnowledgeIndexDTO;
 import com.diagbot.entity.ConceptDetail;
 import com.diagbot.entity.ConceptInfo;
-import com.diagbot.enums.ConceptTypeEnum;
+import com.diagbot.enums.StaticTypeEnum;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
@@ -247,7 +247,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
      */
     public StaticKnowledgeDTO getStaticKnowledge(StaticKnowledgeVO staticKnowledgeVO) {
         StaticKnowledgeDTO staticKnowledgeDTO = new StaticKnowledgeDTO();
-        String typeName = ConceptTypeEnum.getName(staticKnowledgeVO.getType());
+        String typeName = StaticTypeEnum.getName(staticKnowledgeVO.getType());
         List<DictionaryInfoDTO> dicList = dictionaryFacade.getListByGroupType(8);
         typeName = convertTypeName(typeName, 1, dicList);
 
@@ -344,7 +344,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
     public List<StaticKnowledgeDTO> getStaticKnowledgeForHIS(StaticKnowledgeHISVO staticKnowledgeHISVO) {
 
         List<StaticKnowledgeDTO> retList = Lists.newArrayList();
-        String typeName = ConceptTypeEnum.getName(staticKnowledgeHISVO.getType());
+        String typeName = StaticTypeEnum.getName(staticKnowledgeHISVO.getType());
         List<DictionaryInfoDTO> dicList = dictionaryFacade.getListByGroupType(8);
         typeName = convertTypeName(typeName, 1, dicList);
 
@@ -546,7 +546,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
         List<DictionaryInfoDTO> dicList = dictionaryFacade.getListByGroupType(8);
         if (StringUtil.isNotBlank(conceptInfoPageVO.getType())) {
             String typeName
-                    = convertTypeName(ConceptTypeEnum.getName(Integer.valueOf(conceptInfoPageVO.getType())), 1, dicList);
+                    = convertTypeName(StaticTypeEnum.getName(Integer.valueOf(conceptInfoPageVO.getType())), 1, dicList);
             conceptInfoPageVO.setTypeName(typeName);
         }
         IPage<ConceptInfoDTO> page = super.getPage(conceptInfoPageVO);
@@ -555,7 +555,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
             records.forEach(record -> {
                 String typeName = convertTypeName(record.getType(), 2, dicList);
                 record.setTypeName(typeName);
-                record.setType(String.valueOf(ConceptTypeEnum.getKey(typeName)));
+                record.setType(String.valueOf(StaticTypeEnum.getKey(typeName)));
             });
         }
         page.setRecords(records);
@@ -573,7 +573,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
         Date now = DateUtil.now();
         List<DictionaryInfoDTO> dicList = dictionaryFacade.getListByGroupType(8);
         //术语类型转换
-        String typeName = convertTypeName(ConceptTypeEnum.getName(Integer.valueOf(conceptInfoVO.getType())), 1, dicList);
+        String typeName = convertTypeName(StaticTypeEnum.getName(Integer.valueOf(conceptInfoVO.getType())), 1, dicList);
         conceptInfoVO.setTypeName(typeName);
         ConceptInfo conceptInfo = new ConceptInfo();
 
@@ -681,7 +681,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
     public Boolean isExist(ConceptInfoVO conceptInfoVO) {
         List<DictionaryInfoDTO> dicList = dictionaryFacade.getListByGroupType(8);
         //术语类型转换
-        String typeName = convertTypeName(ConceptTypeEnum.getName(Integer.valueOf(conceptInfoVO.getType())), 1, dicList);
+        String typeName = convertTypeName(StaticTypeEnum.getName(Integer.valueOf(conceptInfoVO.getType())), 1, dicList);
         conceptInfoVO.setTypeName(typeName);
         QueryWrapper<ConceptInfo> conceptInfoQueryWrapper = new QueryWrapper<>();
         conceptInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
@@ -725,7 +725,7 @@ public class ConceptInfoFacade extends ConceptInfoServiceImpl {
             //启用状态、修改人、修改时间为明细的内容
             String typeName = convertTypeName(conceptInfoDTO.getType(), 2, dicList);
             conceptInfoDTO.setTypeName(typeName);
-            conceptInfoDTO.setType(String.valueOf(ConceptTypeEnum.getKey(typeName)));
+            conceptInfoDTO.setType(String.valueOf(StaticTypeEnum.getKey(typeName)));
             conceptInfoDTO.setModifier(conceptDetailList.get(0).getModifier());
             conceptInfoDTO.setGmtModified(conceptDetailList.get(0).getGmtModified());
             conceptInfoDTO.setIsDeleted(conceptDetailList.get(0).getIsDeleted());

+ 92 - 1
src/main/java/com/diagbot/facade/DeptConfigFacade.java

@@ -3,15 +3,22 @@ package com.diagbot.facade;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.client.CdssCoreClient;
+import com.diagbot.dto.RespDTO;
 import com.diagbot.entity.DeptConfig;
+import com.diagbot.enums.ConceptTypeEnum;
 import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
 import com.diagbot.service.DeptConfigService;
 import com.diagbot.util.DateUtil;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ExcelUtils;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.RespDTOUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.util.SysUserUtils;
+import com.diagbot.vo.ConceptVO;
 import com.diagbot.vo.DeptConfigListVO;
 import com.diagbot.vo.DeptConfigPageVO;
 import com.diagbot.vo.IdListVO;
@@ -37,6 +44,8 @@ import java.util.stream.Collectors;
 public class DeptConfigFacade {
     @Autowired
     private DeptConfigService deptConfigService;
+    @Autowired
+    private CdssCoreClient cdssCoreClient;
 
     /**
      * 判断是否已存在
@@ -206,8 +215,90 @@ public class DeptConfigFacade {
     public void importExcel(MultipartFile file) {
         List<DeptConfig> deptConfigList = ExcelUtils.importExcel(file, 0, 1, DeptConfig.class);
         if (ListUtil.isNotEmpty(deptConfigList)) {
-            saveOrUpdateRecords(deptConfigList);
+            importExcelRecords(deptConfigList);
+        } else {
+            throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "校验失败,导入数据不能为空");
+        }
+    }
+
+    /**
+     * 数据导入
+     *
+     * @param deptConfigList
+     * @return
+     */
+    public Boolean importExcelRecords(List<DeptConfig> deptConfigList) {
+        String hospitalId = SysUserUtils.getCurrentHospitalID();
+        String userId = SysUserUtils.getCurrentPrincipleID();
+        Date now = DateUtil.now();
+
+        //1、数据完整性校验
+        //2、去除前后空格
+        for (int i = 0; i < deptConfigList.size(); i++) {
+            if (StringUtil.isBlank(deptConfigList.get(i).getHisName())
+                    || StringUtil.isBlank(deptConfigList.get(i).getUniqueName())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_NULL, "第" + (i + 2) + "行存在不完整数据,导入失败,请修改后再试");
+            }
+            deptConfigList.get(i).setHisName(deptConfigList.get(i).getHisName().trim());
+            deptConfigList.get(i).setUniqueName(deptConfigList.get(i).getUniqueName().trim());
+            if (StringUtil.isNotBlank(deptConfigList.get(i).getUniqueCode())) {
+                deptConfigList.get(i).setUniqueCode(deptConfigList.get(i).getUniqueCode().trim());
+            } else {
+                deptConfigList.get(i).setUniqueCode(null);
+            }
+        }
+
+        // 验证数据是否已存在,已存在的先删除
+        // 没id的删除重新插入,有id的更新
+        List<Long> deleteIds = Lists.newLinkedList();
+        Map<String, Map<String, Long>> configMap
+                = getConfigMap(Long.valueOf(hospitalId), null, null);
+        deptConfigList.forEach(deptConfig -> {
+            deptConfig.setHospitalId(Long.valueOf(hospitalId));
+            deptConfig.setModifier(userId);
+            deptConfig.setGmtModified(now);
+            if (deptConfig.getId() == null) {
+                if (configMap.containsKey(deptConfig.getHisName())) {
+                    deleteIds.add(configMap.get(deptConfig.getHisName()).get(deptConfig.getUniqueName()));
+                }
+                deptConfig.setCreator(userId);
+                deptConfig.setGmtCreate(now);
+            }
+            if (deptConfig.getIsDeleted() == null) {
+                deptConfig.setIsDeleted(IsDeleteEnum.N.getKey());
+            }
+        });
+
+        //标准术语校验
+        List<String> uniqueNames = deptConfigList.stream()
+                .map(i -> i.getUniqueName())
+                .distinct()
+                .collect(Collectors.toList());
+        ConceptVO conceptVO = new ConceptVO();
+        conceptVO.setNames(uniqueNames);
+        conceptVO.setType(ConceptTypeEnum.Dept.getKey());
+        RespDTO<List<String>> respDTO = cdssCoreClient.getConceptNames(conceptVO);
+        RespDTOUtil.respNGDealCover(respDTO, "标准术语校验失败");
+        List<String> names = respDTO.data;
+        for (int i = 0; i < deptConfigList.size(); i++) {
+            if (!names.contains(deptConfigList.get(i).getUniqueName())) {
+                throw new CommonException(CommonErrorCode.PARAM_IS_NULL,
+                        "【" + deptConfigList.get(i).getUniqueName() + "】不是标准术语,导入失败,请修改后再试");
+            }
         }
+
+        //重复数据过滤
+        deptConfigList = deptConfigList
+                .stream()
+                .distinct()
+                .collect(Collectors.toList());
+
+        //删除已存在映射关系
+        IdListVO idListVO = new IdListVO();
+        idListVO.setIds(deleteIds);
+        deleteRecords(idListVO);
+        deptConfigService.saveOrUpdateBatch(deptConfigList);
+        return true;
     }
 
     /**

+ 7 - 7
src/main/java/com/diagbot/facade/PushFacade.java

@@ -9,7 +9,7 @@ import com.diagbot.dto.PushPlanDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.TreatDTO;
 import com.diagbot.entity.ConceptDetail;
-import com.diagbot.enums.ConceptTypeEnum;
+import com.diagbot.enums.StaticTypeEnum;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RespDTOUtil;
@@ -268,7 +268,7 @@ public class PushFacade {
                 for (Map.Entry<String, List<PushBaseDTO>> entry : pushDTO.getDis().entrySet()) {
                     if (ListUtil.isNotEmpty(entry.getValue())) {
                         entry.getValue().forEach(item -> {
-                            if (conceptDetailMap.containsKey(item.getName() + "_" + ConceptTypeEnum.getName(1))) {
+                            if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(1))) {
                                 item.setHasInfo(1);
                             }
                         });
@@ -277,28 +277,28 @@ public class PushFacade {
             }
             if (ListUtil.isNotEmpty(pushDTO.getLis())) {
                 pushDTO.getLis().forEach(item -> {
-                    if (conceptDetailMap.containsKey(item.getName() + "_" + ConceptTypeEnum.getName(3))) {
+                    if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(3))) {
                         item.setHasInfo(1);
                     }
                 });
             }
             if (ListUtil.isNotEmpty(pushDTO.getPacs())) {
                 pushDTO.getPacs().forEach(item -> {
-                    if (conceptDetailMap.containsKey(item.getName() + "_" + ConceptTypeEnum.getName(5))) {
+                    if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(5))) {
                         item.setHasInfo(1);
                     }
                 });
             }
             if (ListUtil.isNotEmpty(pushDTO.getMedicines())) {
                 pushDTO.getMedicines().forEach(item -> {
-                    if (conceptDetailMap.containsKey(item.getName() + "_" + ConceptTypeEnum.getName(2))) {
+                    if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(2))) {
                         item.setHasInfo(1);
                     }
                 });
             }
             if (ListUtil.isNotEmpty(pushDTO.getOperations())) {
                 pushDTO.getOperations().forEach(item -> {
-                    if (conceptDetailMap.containsKey(item.getName() + "_" + ConceptTypeEnum.getName(6))) {
+                    if (conceptDetailMap.containsKey(item.getName() + "_" + StaticTypeEnum.getName(6))) {
                         item.setHasInfo(1);
                     }
                 });
@@ -327,7 +327,7 @@ public class PushFacade {
             }
             for (TreatDTO treatDTO : retGeneraTreat) {
                 if (StringUtil.isNotBlank(treatDTO.getUniqueName())) {
-                    String key = treatDTO.getUniqueName() + "_" + ConceptTypeEnum.getName(1);
+                    String key = treatDTO.getUniqueName() + "_" + StaticTypeEnum.getName(1);
                     if (conceptDetailMap.containsKey(key)) {
                         List<ConceptDetail> conceptDetailList = conceptDetailMap.get(key);
                         treatDTO.setGeneraTreat(conceptDetailList

+ 20 - 0
src/main/java/com/diagbot/vo/ConceptVO.java

@@ -0,0 +1,20 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/9/10 14:48
+ */
+@Getter
+@Setter
+public class ConceptVO {
+    List<String> names;
+    @NotNull(message = "请输入术语类型")
+    Integer type;
+}