Jelajahi Sumber

Merge branch 'develop' into his/hz7y

shiyue 3 tahun lalu
induk
melakukan
31492c9d18

+ 2 - 4
src/main/java/com/diagbot/dto/BaseDiagnoseDTO.java

@@ -1,15 +1,13 @@
 package com.diagbot.dto;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.Data;
 
 /**
  * @Description:
  * @author: gaodm
  * @time: 2021/3/15 10:49
  */
-@Getter
-@Setter
+@Data
 public class BaseDiagnoseDTO {
 
     /**

+ 6 - 0
src/main/java/com/diagbot/facade/BillFacade.java

@@ -9,6 +9,7 @@ import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.RuleTypeEnum;
 import com.diagbot.enums.TypeEnum;
 import com.diagbot.process.BillProcess;
+import com.diagbot.rule.OtherRule;
 import com.diagbot.util.RedisUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.vo.Drug;
@@ -36,6 +37,8 @@ public class BillFacade {
     CommonFacade commonFacade;
     @Autowired
     RedisUtil redisUtil;
+    @Autowired
+    OtherRule otherRule;
 
     /**
      * 开单合理性业务
@@ -48,6 +51,9 @@ public class BillFacade {
         List<RuleVO> ruleVOList = getRuleVO(wordCrfDTO);
         billProcess.processRule(ruleVOList, wordCrfDTO, res);
 
+        // 【特殊规则】七院:非阻塞性睡眠呼吸暂停综合征且非混合性睡眠呼吸暂停综合征,不宜同时开立睡眠呼吸监测和眼电图(EOG)(双眼)
+        otherRule.smhxjcAndYdteog(wordCrfDTO, res);
+
         // 结果去重处理
         commonFacade.dealMsg(res.getBillMsgList());
     }

+ 64 - 15
src/main/java/com/diagbot/facade/CommonFacade.java

@@ -4,7 +4,12 @@ import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.client.CRFServiceClient;
 import com.diagbot.client.StandConvertServiceClient;
-import com.diagbot.dto.*;
+import com.diagbot.dto.BillMsg;
+import com.diagbot.dto.RuleDTO;
+import com.diagbot.dto.RuleExtDTO;
+import com.diagbot.dto.StandConvertCrfBatchDTO;
+import com.diagbot.dto.StandConvertCrfDTO;
+import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.enums.ConceptTypeEnum;
 import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.RedisEnum;
@@ -12,15 +17,38 @@ import com.diagbot.enums.StandConvertEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.model.ai.AIAnalyze;
+import com.diagbot.model.entity.BodyPart;
+import com.diagbot.model.entity.Clinical;
+import com.diagbot.model.entity.Modification;
 import com.diagbot.model.entity.Operation;
-import com.diagbot.model.entity.*;
-import com.diagbot.model.label.*;
+import com.diagbot.model.entity.Pacs;
+import com.diagbot.model.entity.Vital;
+import com.diagbot.model.label.ChiefLabel;
+import com.diagbot.model.label.DiagLabel;
+import com.diagbot.model.label.PacsLabel;
+import com.diagbot.model.label.PastLabel;
+import com.diagbot.model.label.PresentLabel;
+import com.diagbot.model.label.VitalLabel;
 import com.diagbot.rule.CommonRule;
-import com.diagbot.util.*;
-import com.diagbot.vo.*;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.CoreUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RedisUtil;
+import com.diagbot.util.ReflectUtil;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.NeoPushVO;
+import com.diagbot.vo.RuleVO;
+import com.diagbot.vo.SearchData;
+import com.diagbot.vo.StandConvert;
+import com.diagbot.vo.StandConvertCrfVO;
+import com.diagbot.vo.neoPushEntity.ChiefPushVo;
 import com.diagbot.vo.neoPushEntity.Diag;
+import com.diagbot.vo.neoPushEntity.DiagVo;
 import com.diagbot.vo.neoPushEntity.Drug;
-import com.diagbot.vo.neoPushEntity.*;
+import com.diagbot.vo.neoPushEntity.LisPushVo;
+import com.diagbot.vo.neoPushEntity.PacsPushVo;
+import com.diagbot.vo.neoPushEntity.PresentPushVo;
+import com.diagbot.vo.neoPushEntity.Symptom;
 import com.google.common.collect.Lists;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -30,7 +58,11 @@ import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -749,6 +781,7 @@ public class CommonFacade {
         if (ListUtil.isNotEmpty(lisHisNameList)) {
             Map<String, Map<String, Map<String, List<String>>>> lisConfigMap = mappingConfigFacade.groupByHisNameWithName(lisHisNameList, ConceptTypeEnum.LisPack.getKey(), wordCrfDTO.getHospitalId());
             setListProperty(wordCrfDTO, "lis", ConceptTypeEnum.LisPack.getKey(), "UniqueName", lisConfigMap);
+            setListProperty(wordCrfDTO, "lisOrder", ConceptTypeEnum.LisPack.getKey(), "UniqueName", lisConfigMap);
         }
 
     }
@@ -884,7 +917,6 @@ public class CommonFacade {
                                     retList.add(o);
                                 }
                             }
-
                         } else {
                             List<String> standNames = new ArrayList<>(subMap.get(hisDetailName).keySet());
                             for (String stdName : standNames) {
@@ -896,16 +928,11 @@ public class CommonFacade {
                             }
                         }
                     } else {
+                        setUniqueNameNoMapping(item, propertyName, name, hisDetailName);
                         retList.add(item);
                     }
                 } else {
-                    if (propertyName.equals("UniqueName")) {
-                        if (StringUtil.isNotBlank(hisDetailName)) {
-                            BeanUtils.copyProperty(item, "uniqueName", hisDetailName);
-                        } else {
-                            BeanUtils.copyProperty(item, "uniqueName", name);
-                        }
-                    }
+                    setUniqueNameNoMapping(item, propertyName, name, hisDetailName);
                     retList.add(item);
                 }
             }
@@ -915,6 +942,28 @@ public class CommonFacade {
         return retList;
     }
 
+    /**
+     * 映射没找到,如果有细项,就用细项;无细项用套餐
+     *
+     * @param item
+     * @param propertyName
+     * @param name
+     * @param detailName
+     */
+    public <T> void setUniqueNameNoMapping(T item, String propertyName, String name, String detailName) {
+        try {
+            if (propertyName.equals("UniqueName")) {
+                if (StringUtil.isNotBlank(detailName)) {
+                    BeanUtils.copyProperty(item, "uniqueName", detailName);
+                } else {
+                    BeanUtils.copyProperty(item, "uniqueName", name);
+                }
+            }
+        } catch (Exception e) {
+
+        }
+    }
+
     /**
      * 生成给图谱的入参(推送)
      */

+ 20 - 6
src/main/java/com/diagbot/facade/KlConceptStaticFacade.java

@@ -49,6 +49,7 @@ import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -339,6 +340,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
 
     /**
      * 静态知识检索-分页返回
+     *
      * @param staticKnowledgeIndexPageVO
      * @return
      */
@@ -418,7 +420,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         List<KlConceptScale> scaleDetails = klConceptScaleFacade.list(new QueryWrapper<KlConceptScale>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
                 .in("concept_id", conceptIds)
-                .orderByAsc("concept_id", "parent_id", "order_no"));
+                .orderByAsc("text_type", "group_num", "order_no"));
         Map<Long, List<KlConceptScale>> scaleDetailMap = scaleDetails.stream()
                 .collect(Collectors.groupingBy(KlConceptScale::getConceptId));
 
@@ -840,6 +842,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
 
     /**
      * 获取量表结构
+     *
      * @param conceptId
      * @return
      */
@@ -848,21 +851,21 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         List<KlConceptScale> scaleList = klConceptScaleFacade.list(new QueryWrapper<KlConceptScale>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
                 .eq("concept_id", conceptId)
-                .orderByAsc("parent_id", "order_no"));
+                .orderByAsc("text_type", "group_num", "order_no"));
         if (ListUtil.isEmpty(scaleList)) {
             return null;
         }
         List<ConceptScaleDetailDTO> scaleDetailList = BeanUtil.listCopyTo(scaleList, ConceptScaleDetailDTO.class);
         if (null != scaleVO) {
             List<String> codeList = new ArrayList<>();
-            codeList= scaleDetailList.stream().filter(s -> StringUtils.isNotBlank(s.getRuleCode())).map(ac -> ac.getRuleCode()).collect(Collectors.toList());
+            codeList = scaleDetailList.stream().filter(s -> StringUtils.isNotBlank(s.getRuleCode())).map(ac -> ac.getRuleCode()).collect(Collectors.toList());
             scaleVO.setCodeList(codeList);
             ScaleDTO scaleDTO = klRegulationBaseFacade.process(scaleVO);
             List<String> codeListNew = scaleDTO.getCodeList(); //Arrays.asList("100001", "100013");
             if (ListUtil.isNotEmpty(codeListNew)) {
                 for (String str : codeListNew) {
                     for (ConceptScaleDetailDTO data2 : scaleDetailList) {
-                        if (null!=data2.getRuleCode()&&data2.getRuleCode().equals(str)) {
+                        if (null != data2.getRuleCode() && data2.getRuleCode().equals(str)) {
                             data2.setMatch(1);
                         }
                     }
@@ -879,7 +882,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
             if (ListUtil.isNotEmpty(codeListNew)) {
                 for (String str : codeListNew) {
                     for (ConceptScaleDetailDTO data2 : scaleDetailList) {
-                        if (null!=data2.getRuleCode()&&data2.getRuleCode().equals(str)) {
+                        if (null != data2.getRuleCode() && data2.getRuleCode().equals(str)) {
                             data2.setMatch(1);
                         }
                     }
@@ -888,7 +891,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         }
 
         Map<Long, List<ConceptScaleDetailDTO>> parentMap
-                = scaleDetailList.stream().collect(Collectors.groupingBy(ConceptScaleDetailDTO::getParentId));
+                = scaleDetailList.stream().sorted(Comparator.comparing(ConceptScaleDetailDTO::getTextType).thenComparing(ConceptScaleDetailDTO::getGroupNum)).collect(Collectors.groupingBy(ConceptScaleDetailDTO::getParentId));
         List<ConceptScaleDetailDTO> retScacleDetailList = parentMap.get(-1L);
         if (ListUtil.isEmpty(retScacleDetailList)) {
             return null;
@@ -905,13 +908,24 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         for (ConceptScaleSubDTO subDTO : retList) {
             scaleRecursion(subDTO, parentMap);
         }
+        //排序
+        for (ConceptScaleSubDTO data : retList) {
+            if (ListUtil.isNotEmpty(data.getDetailList())) {
+                for (ConceptScaleDetailDTO datasub : data.getDetailList()) {
+                    if (ListUtil.isNotEmpty(datasub.getSubList())) {
+                        datasub.setSubList(datasub.getSubList().stream().sorted(Comparator.comparing(ConceptScaleSubDTO::getGroupNum)).collect(Collectors.toList()));
+                    }
 
+                }
+            }
+        }
         retDTO.setScaleDetails(retList);
         return retDTO;
     }
 
     /**
      * 递归
+     *
      * @param item
      * @param treeMap
      */

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

@@ -115,7 +115,7 @@ public class KlDiagnoseImportFacade {
     public Boolean verifyData(MultipartFile file, DiagnoseImportVO diagnoseImportVO, Map<String, Object> diagMessage, List<ImportDiagnoseResVO> allData) {
         Boolean allFlag = true;
         List<String> diagtypes = Lists.newArrayList("拟诊", "确诊", "警惕");
-        List<String> splitType = Lists.newArrayList("症状", "体格检查结果", "疾病", "人群", "辅助检查结果");
+        List<String> splitType = Lists.newArrayList("症状", "体格检查结果", "疾病", "人群", "辅助检查结果", "实验室检查子项目");
         // 获取标准词库Map
         Map<String, KlConcept> concept_map = getConceptMap();
 

+ 4 - 2
src/main/java/com/diagbot/model/ai/process/EntityProcessLis.java

@@ -111,8 +111,10 @@ public class EntityProcessLis extends EntityProcess {
         if (value.trim().length() > 0) {
             val_unit = extract_digit_new(value);
         }
-        pd.setValue(val_unit[0]);
-        pd.setUnit(val_unit[1]);
+        if (val_unit != null && val_unit.length == 2) {
+            pd.setValue(val_unit[0]);
+            pd.setUnit(val_unit[1].trim()); // 单位去空格
+        }
         return pd;
     }
 

+ 88 - 0
src/main/java/com/diagbot/rule/OtherRule.java

@@ -0,0 +1,88 @@
+package com.diagbot.rule;
+
+import com.diagbot.biz.push.entity.Item;
+import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.dto.BillMsg;
+import com.diagbot.dto.IndicationDTO;
+import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.enums.TypeEnum;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.MsgNewUtil;
+import com.diagbot.util.RedisUtil;
+import com.google.common.collect.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @description: 其他特殊规则
+ * @author: zhoutg
+ * @time: 2020/8/3 14:47
+ */
+@Component
+public class OtherRule {
+
+    @Autowired
+    MsgNewUtil msgNewUtil;
+    @Autowired
+    RedisUtil redisUtil;
+
+    /**
+     * 七院需求:
+     * 非阻塞性睡眠呼吸暂停综合征和非混合性睡眠呼吸暂停综合征,不宜同时开立呼吸睡眠监测和眼电图(EOG)
+     *
+     * @param
+     * @return
+     */
+    public void smhxjcAndYdteog(WordCrfDTO wordCrfDTO, IndicationDTO res) {
+        // 七院特有
+        if (6 != wordCrfDTO.getHospitalId()) {
+            return;
+        }
+        // 1、比较是否包含2种诊断
+        List<Item> diagAllList = wordCrfDTO.getDiag(); // 结构化诊断
+        List<String> zsxList = Lists.newArrayList();// 阻塞性睡眠呼吸暂停综合征医院名称
+        List<String> hhxList = Lists.newArrayList();// 混合性睡眠呼吸暂停综合征医院名称
+        for (Item item : diagAllList) {
+            if ("阻塞性睡眠呼吸暂停综合征".equals(item.getUniqueName())) {
+                zsxList.add(item.getName());
+            } else if ("混合性睡眠呼吸暂停综合征".equals(item.getUniqueName())) {
+                hhxList.add((item.getName()));
+            }
+        }
+        // 如果两种疾病有其一,就不提示
+        if (ListUtil.isNotEmpty(zsxList) || ListUtil.isNotEmpty(hhxList)) {
+            return;
+        }
+
+        // 2、比较是否包含2种辅检开单项
+        List<Pacs> pacsList = wordCrfDTO.getPacsOrder(); // 辅检开单项
+        List<String> hxsmjcList = Lists.newArrayList();// 呼吸睡眠监测医院名称
+        List<String> ydteogList = Lists.newArrayList();// 眼电图(EOG)医院名称
+        for (Pacs pacs : pacsList) {
+            if ("呼吸睡眠监测".equals(pacs.getUniqueName())) {
+                hxsmjcList.add(pacs.getName());
+            } else if ("眼电图(EOG)".equals(pacs.getUniqueName())) {
+                ydteogList.add(pacs.getName());
+            }
+        }
+        // 辅检开单项必须有两个,否则就不提示
+        if (ListUtil.isEmpty(hxsmjcList) || ListUtil.isEmpty(ydteogList)) {
+            return;
+        }
+
+        // 3、提示语组合
+        List<BillMsg> billMsgList = res.getBillMsgList();
+        for (String hxsm : hxsmjcList) {
+            for (String ydt : ydteogList) {
+                BillMsg billMsg = new BillMsg();
+                billMsg.setType(TypeEnum.pacs.getName());
+                billMsg.setMsg(String.format("非阻塞性睡眠呼吸暂停综合征和非混合性睡眠呼吸暂停综合征患者,不宜同时开立%s和%s",
+                        hxsm, ydt));
+                billMsgList.add(billMsg);
+            }
+        }
+    }
+
+}

+ 2 - 1
src/main/java/com/diagbot/util/MsgNewUtil.java

@@ -59,7 +59,8 @@ public class MsgNewUtil {
 
         // 放到最后统一替换【多处匹配】
         msg = msg.replaceAll("\\[匹配内容]", content);
-        msg = msg.replaceAll("\\[开单名称]", orderName);
+        String orderNameNew = orderName.replaceAll("\\\\","\\\\\\\\"); // 防止开单名称中有\\
+        msg = msg.replaceAll("\\[开单名称]", orderNameNew);
         msg = msg.replaceAll("\\[项目名称]", structName);
         billMsg.setMsg(msg);
         billMsg.setOrderName(orderName);