Browse Source

危急值模板提示

zhoutg 3 years ago
parent
commit
b09d85f400

+ 19 - 0
src/main/java/com/diagbot/dto/LisCtritalDTO.java

@@ -0,0 +1,19 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 化验危急值提示语
+ * @Author:zhoutg
+ * @time: 2020/8/12 15:53
+ */
+@Data
+public class LisCtritalDTO {
+    private String name; // 化验拼接提示语
+    private String groupMsg = ""; // 人群拼接提示语
+    private String ageMsg = ""; // 年龄拼接提示语
+    private List<String> lisMsg = new ArrayList<>(); // 化验拼接提示语——暂无数据
+}

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

@@ -19,5 +19,6 @@ public class LisOtherDTO {
     private List<String> diseaseMsg = new ArrayList<>(); // 诊断拼接提示语
     private List<String> groupMsg = new ArrayList<>(); // 人群拼接提示语
     private List<String> operationMsg = new ArrayList<>(); // 手术拼接提示语
+    private String sexMsg = ""; // 性别拼接提示语
     private List<String> lisMsg = new ArrayList<>(); // 化验拼接提示语——暂无数据
 }

+ 3 - 1
src/main/java/com/diagbot/enums/RedisEnum.java

@@ -30,7 +30,9 @@ public enum RedisEnum implements KeyedNamed {
     msg(21, "msg"),
     vteAdvice(22, "vteAdvice:"),
     drugAllergen(23, "drugAllergen"),
-    otherMsg(24, "otherMsg");
+    otherMsg(24, "otherMsg"),
+    criticalMsg(25, "criticalMsg");
+
 
     @Setter
     private int key;

+ 2 - 1
src/main/java/com/diagbot/enums/TypeEnum.java

@@ -22,7 +22,8 @@ public enum TypeEnum implements KeyedNamed {
     age(9,"年龄"),
     group(10, "人群"),
     lisSelf(1, "化验本身"),
-    other(11, "其他特殊规则");
+    other(11, "其他特殊规则"),
+    gender(12, "性别");
 
     @Setter
     private int key;

+ 17 - 2
src/main/java/com/diagbot/facade/CacheFacade.java

@@ -13,6 +13,7 @@ import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RedisUtil;
 import com.diagbot.util.StringUtil;
+import com.google.common.collect.Lists;
 import org.apache.commons.collections4.map.LinkedMap;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
@@ -236,7 +237,9 @@ public class CacheFacade {
     public void loadMsg() {
         // 开单提示语
         redisUtil.delete(RedisEnum.msg.getName());
-        List<DictionaryInfoDTO> dictionaryInfoDTOList = klDictionaryInfoFacade.getListByGroupType(41);
+        List<DictionaryInfoDTO> msgList = klDictionaryInfoFacade.getListByGroupType(Lists.newArrayList(41, 42, 43));
+        Map<Long, List<DictionaryInfoDTO>> groupTypeMap = EntityUtil.makeEntityListMap(msgList, "groupType");
+        List<DictionaryInfoDTO> dictionaryInfoDTOList = groupTypeMap.get(41L);
         if (ListUtil.isNotEmpty(dictionaryInfoDTOList)) {
             // 提示语
             Map<String, Object> msgMap = new LinkedMap<>();
@@ -248,7 +251,7 @@ public class CacheFacade {
 
         // 其他值提醒化验提示语
         redisUtil.delete(RedisEnum.otherMsg.getName());
-        List<DictionaryInfoDTO> otherLisList = klDictionaryInfoFacade.getListByGroupType(42);
+        List<DictionaryInfoDTO> otherLisList = groupTypeMap.get(42L);
         if (ListUtil.isNotEmpty(otherLisList)) {
             // 提示语
             Map<String, Object> msgMap = new LinkedMap<>();
@@ -257,5 +260,17 @@ public class CacheFacade {
             }
             redisUtil.putHashMap(RedisEnum.otherMsg.getName(), msgMap);
         }
+
+        // 其他值提醒化验提示语
+        redisUtil.delete(RedisEnum.criticalMsg.getName());
+        List<DictionaryInfoDTO> criticalLisList = groupTypeMap.get(43L);
+        if (ListUtil.isNotEmpty(criticalLisList)) {
+            // 提示语
+            Map<String, Object> msgMap = new LinkedMap<>();
+            for (DictionaryInfoDTO dic : criticalLisList) {
+                msgMap.put(dic.getName(), dic.getVal());
+            }
+            redisUtil.putHashMap(RedisEnum.criticalMsg.getName(), msgMap);
+        }
     }
 }

+ 1 - 1
src/main/java/com/diagbot/process/CriticalProcess.java

@@ -61,7 +61,7 @@ public class CriticalProcess {
                 for (RuleConditionDTO ruleConditionDTO : ruleConditionDTOList) {
                     List<RuleBaseDTO> ruleBaseDTOList = ruleConditionDTO.getRuleBaseDTOList();
                     // 2、规则匹配
-                    lisRule.critical(lis, ruleBaseDTOList, criticalList, wordCrfDTO);
+                    lisRule.critical(lis, ruleBaseDTOList, criticalList, wordCrfDTO, ruleConditionDTO.getMsg());
                 }
             }
         }

+ 88 - 19
src/main/java/com/diagbot/rule/LisRule.java

@@ -2,6 +2,7 @@ package com.diagbot.rule;
 
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.dto.BillMsg;
+import com.diagbot.dto.LisCtritalDTO;
 import com.diagbot.dto.LisOtherDTO;
 import com.diagbot.dto.MatchDTO;
 import com.diagbot.dto.RuleBaseDTO;
@@ -35,6 +36,10 @@ public class LisRule {
     CommonRule commonRule;
     @Autowired
     MsgNewUtil msgNewUtil;
+    @Autowired
+    SexRule sexRule;
+    @Autowired
+    AgeRule ageRule;
 
     /**
      * 比较化验——开单合理性
@@ -90,10 +95,11 @@ public class LisRule {
      */
     public void otherLis(Lis lisBean, List<RuleBaseDTO> ruleBaseDTOList, List<BillMsg> otherList, WordCrfDTO wordCrfDTO, String msg) {
         if (ListUtil.isEmpty(ruleBaseDTOList)) {
-            return ;
+            return;
         }
         LisOtherDTO lisOtherDTO = new LisOtherDTO();
         int i = 0;
+        out: // 直接跳出for循环
         for (RuleBaseDTO ruleBaseDTO : ruleBaseDTOList) {
             if (LexiconEnum.getEnum(ruleBaseDTO.getBaseLibType()) != null) { // 避免空指针
                 Map<String, Object> map = null;
@@ -107,7 +113,7 @@ public class LisRule {
                                 lisOtherDTO.setName(matchDTO.getContent());
                                 lisOtherDTO.setLisNameDetail(matchDTO.getLisNameDetail());
                             } else {
-                                break;
+                                break out;// 直接跳出for循环
                             }
                         } else {
                             // 其他化验——暂无数据
@@ -117,29 +123,44 @@ public class LisRule {
                                 List<String> msgLis = matchDTOList.stream().map(r -> r.getContent()).collect(Collectors.toList());
                                 lisOtherDTO.setLisMsg(msgLis);
                             } else {
-                                break;
+                                break out;// 直接跳出for循环
                             }
                         }
                         break;
                     case Group: // 人群
                         map = groupRule.rule(wordCrfDTO, ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.getGroupMsg().add((String)map.get("msg"));
+                            lisOtherDTO.getGroupMsg().add((String) map.get("msg"));
                             i++;
+                        } else {
+                            break out;// 直接跳出for循环
                         }
                         break;
                     case Disease: // 诊断
                         map = commonRule.compareItem(wordCrfDTO.getDiag(), ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.setDiseaseMsg((List<String>)map.get("msgList"));
+                            lisOtherDTO.setDiseaseMsg((List<String>) map.get("msgList"));
                             i++;
+                        } else {
+                            break out;// 直接跳出for循环
                         }
                         break;
                     case Medicine: // 药品
                         map = commonRule.compareItem(wordCrfDTO.getDrugSource(), ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.setDrugMsg((List<String>)map.get("msgList"));
+                            lisOtherDTO.setDrugMsg((List<String>) map.get("msgList"));
                             i++;
+                        } else {
+                            break out;// 直接跳出for循环
+                        }
+                        break;
+                    case Gender: // 性别
+                        boolean flag = sexRule.getFlag(wordCrfDTO, ruleBaseDTO);
+                        if (flag) {
+                            lisOtherDTO.setSexMsg(ruleBaseDTO.getBaseLibName());
+                            i++;
+                        } else {
+                            break out;// 直接跳出for循环
                         }
                         break;
                     default:
@@ -189,6 +210,12 @@ public class LisRule {
                             CoreUtil.addBeanToList(otherList, billMsg);
                         }
                     }
+                    // 性别
+                    if (StringUtil.isNotBlank(lisOtherDTO.getSexMsg())) {
+                        BillMsg billMsg = msgNewUtil.getCommonOtherMsg(TypeEnum.lis.getName(), lisOtherDTO.getName(),
+                                lisOtherDTO.getSexMsg(), TypeEnum.gender.getName(), lisBean, msg, lisNameDetail);
+                        CoreUtil.addBeanToList(otherList, billMsg);
+                    }
                 }
             }
         }
@@ -204,7 +231,7 @@ public class LisRule {
      */
     public void otherTransfusion(Lis lisBean, List<RuleBaseDTO> ruleBaseDTOList, String msg, List<BillMsg> otherList, WordCrfDTO wordCrfDTO) {
         if (ListUtil.isEmpty(ruleBaseDTOList)) {
-            return ;
+            return;
         }
         LisOtherDTO lisOtherDTO = new LisOtherDTO();
         lisOtherDTO.setMsg(msg);
@@ -239,20 +266,20 @@ public class LisRule {
                     case Disease: // 诊断
                         map = commonRule.compareItem(wordCrfDTO.getDiag(), ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.setDiseaseMsg((List<String>)map.get("msgList"));
+                            lisOtherDTO.setDiseaseMsg((List<String>) map.get("msgList"));
                             i++;
                         }
                         break;
                     case Medicine: // 药品
                         map = commonRule.compareItem(wordCrfDTO.getDrugSource(), ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.setDrugMsg((List<String>)map.get("msgList"));
+                            lisOtherDTO.setDrugMsg((List<String>) map.get("msgList"));
                             i++;
                         }
                     case Operation: // 手术
                         map = commonRule.compareItem(wordCrfDTO.getOperation(), ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
-                            lisOtherDTO.setOperationMsg((List<String>)map.get("msgList"));
+                            lisOtherDTO.setOperationMsg((List<String>) map.get("msgList"));
                             i++;
                         }
                         break;
@@ -316,12 +343,14 @@ public class LisRule {
      * @param ruleBaseDTOList
      * @param criticalList
      */
-    public void critical(Lis lisBean, List<RuleBaseDTO> ruleBaseDTOList, List<BillMsg> criticalList, WordCrfDTO wordCrfDTO) {
+    public void critical(Lis lisBean, List<RuleBaseDTO> ruleBaseDTOList, List<BillMsg> criticalList, WordCrfDTO wordCrfDTO, String msg) {
         if (ListUtil.isEmpty(ruleBaseDTOList)) {
-            return ;
+            return;
         }
-        String msg = "";
+
+        LisCtritalDTO lisCtritalDTO = new LisCtritalDTO();
         int i = 0;
+        out: // 直接跳出for循环
         for (RuleBaseDTO ruleBaseDTO : ruleBaseDTOList) {
             if (LexiconEnum.getEnum(ruleBaseDTO.getBaseLibType()) != null) { // 避免空指针
                 Map map = null;
@@ -332,9 +361,9 @@ public class LisRule {
                             MatchDTO matchDTO = CoreUtil.compareLis(ruleBaseDTO, lisBean);
                             if (matchDTO != null) {
                                 i++;
-                                msg = matchDTO.getContent();
+                                lisCtritalDTO.setName(matchDTO.getContent());
                             } else {
-                                break;
+                                break out;// 直接跳出for循环
                             }
                         } else {
                             // 其他化验
@@ -342,7 +371,7 @@ public class LisRule {
                             if (ListUtil.isNotEmpty(matchDTOList)) {
                                 i++;
                             } else {
-                                break;
+                                break out;// 直接跳出for循环
                             }
                         }
                         break;
@@ -350,15 +379,55 @@ public class LisRule {
                         map = groupRule.rule(wordCrfDTO, ruleBaseDTO);
                         if (CoreUtil.getMapFlag(map)) {
                             i++;
+                            lisCtritalDTO.setGroupMsg(ruleBaseDTO.getBaseLibName());
+                        } else {
+                            break out;// 直接跳出for循环
                         }
                         break;
-                    default: break;
+                    case Age: // 年龄
+                        boolean flag = ageRule.getFlag(wordCrfDTO, ruleBaseDTO);
+                        if (flag) {
+                            i++;
+                            lisCtritalDTO.setAgeMsg(wordCrfDTO.getAge());
+                        } else {
+                            break out;// 直接跳出for循环
+                        }
+                        break;
+                    default:
+                        break;
                 }
             }
         }
         if (i == ruleBaseDTOList.size()) {
-            BillMsg criticalMsg = MsgUtil.getCommonCriticalMsg(msg, TypeEnum.lis.getName());
-            criticalList.add(criticalMsg);
+            if (StringUtil.isNotBlank(lisCtritalDTO.getName())) {
+                // 就化验本身一个条件符合
+                if (i == 1) {
+                    BillMsg billMsg = msgNewUtil.getCriticalMsg(TypeEnum.lis.getName(),
+                            lisCtritalDTO.getName(), "", TypeEnum.lisSelf.getName(), msg);
+                    CoreUtil.addBeanToList(criticalList, billMsg);
+                } else { // 有其他条件符合
+                    // 化验——暂无数据
+                    if (ListUtil.isNotEmpty(lisCtritalDTO.getLisMsg())) {
+                        for (String str : lisCtritalDTO.getLisMsg()) {
+                            BillMsg billMsg = msgNewUtil.getCriticalMsg(TypeEnum.lis.getName(), lisCtritalDTO.getName(),
+                                    str, TypeEnum.lis.getName(), msg);
+                            CoreUtil.addBeanToList(criticalList, billMsg);
+                        }
+                    }
+                    // 人群
+                    if (StringUtil.isNotBlank(lisCtritalDTO.getGroupMsg())) {
+                        BillMsg billMsg = msgNewUtil.getCriticalMsg(TypeEnum.lis.getName(), lisCtritalDTO.getName(),
+                                lisCtritalDTO.getGroupMsg(), TypeEnum.group.getName(), msg);
+                        CoreUtil.addBeanToList(criticalList, billMsg);
+                    }
+                    // 年龄
+                    if (StringUtil.isNotBlank(lisCtritalDTO.getAgeMsg())) {
+                        BillMsg billMsg = msgNewUtil.getCriticalMsg(TypeEnum.lis.getName(), lisCtritalDTO.getName(),
+                                lisCtritalDTO.getAgeMsg(), TypeEnum.age.getName(), msg);
+                        CoreUtil.addBeanToList(criticalList, billMsg);
+                    }
+                }
+            }
         }
     }
 

+ 37 - 0
src/main/java/com/diagbot/util/MsgNewUtil.java

@@ -113,4 +113,41 @@ public class MsgNewUtil {
         billMsg.setContent(content);
         return billMsg;
     }
+
+    /**
+     * 危急值化验提示信息
+     *
+     * @param type 分类
+     * @param content 化验内容
+     * @param name 条件内容
+     * @param conditionType 条件类型
+     * @param suggestMsg
+     * @return
+     */
+    public BillMsg getCriticalMsg(String type, String content, String name, String conditionType, String suggestMsg) {
+        BillMsg billMsg = new BillMsg();
+        String msg = "";
+        switch (TypeEnum.getEnum(type)) {
+            case lis: // 危急值提醒——化验
+                msg = redisUtil.getByKeyAndField(RedisEnum.criticalMsg.getName(), type + "_" + conditionType);
+                if (StringUtil.isBlank(msg)) { // 防止报空指针
+                    return null;
+                }
+                if (StringUtil.isNotBlank(suggestMsg)) {
+                    msg = msg.replaceAll("\\[原因及建议]", "," + suggestMsg);
+                } else {
+                    msg = msg.replaceAll("\\[原因及建议]", "");
+                }
+                // 放到最后统一替换【多处匹配】
+                msg = msg.replaceAll("\\[化验结果]", content);
+                msg = msg.replaceAll("\\[匹配内容]", name);
+                billMsg.setType(conditionType);
+                break;
+            default:
+                break;
+        }
+        billMsg.setMsg(msg);
+        billMsg.setContent(content);
+        return billMsg;
+    }
 }