Browse Source

规则匹配

zhoutg 4 năm trước cách đây
mục cha
commit
23cfe7884a

+ 4 - 4
src/main/java/com/diagbot/config/CacheDeleteInit.java

@@ -48,14 +48,14 @@ public class CacheDeleteInit implements CommandLineRunner {
         cacheFacade.loadDeptPush();
         log.info("CDSS-CORE服务启动加载科室和推送映射成功!");
 
-        cacheFacade.loadAllRuleCache();
-        log.info("CDSS-CORE服务启动加载医学知识库中的所有规则缓存成功!");
+        conceptInfoFacade.loadCustomDictionary();
+        log.info("CDSS-CORE服务启动加载NLP分词字典成功!");
 
         cacheFacade.loadAllBaseDiagnoseCache();
         log.info("CDSS-CORE服务启动加载诊断依据缓存成功!");
 
-        conceptInfoFacade.loadCustomDictionary();
-        log.info("CDSS-CORE服务启动加载NLP分词字典成功!");
+        cacheFacade.loadAllRuleCache();
+        log.info("CDSS-CORE服务启动加载医学知识库中的所有规则缓存成功!");
 
         log.info("CDSS-CORE初始化完成!");
     }

+ 0 - 63
src/main/java/com/diagbot/enums/BaseRegulationTypeEnum.java

@@ -1,63 +0,0 @@
-package com.diagbot.enums;
-
-import com.diagbot.core.KeyedNamed;
-import lombok.Setter;
-
-/**
- * @author zhoutg
- * @Description: 类型枚举
- * @date 2018年10月11日 下午3:33:22
- */
-public enum BaseRegulationTypeEnum implements KeyedNamed {
-
-    equals(1, "等于术语本身"),
-    compare(2, "存在比较"),
-    regexChiefSymptom(3, "主诉现病史正则"),
-    regexPast(4, "既往史正则");
-
-    @Setter
-    private int key;
-
-    @Setter
-    private String name;
-
-    BaseRegulationTypeEnum(int key, String name) {
-        this.key = key;
-        this.name = name;
-    }
-
-    public static BaseRegulationTypeEnum getEnum(int key) {
-        for (BaseRegulationTypeEnum item : BaseRegulationTypeEnum.values()) {
-            if (item.key == key) {
-                return item;
-            }
-        }
-        return null;
-    }
-
-    public static BaseRegulationTypeEnum getEnum(String value) {
-        for (BaseRegulationTypeEnum item : BaseRegulationTypeEnum.values()) {
-            if (item.getName().equals(value)) {
-                return item;
-            }
-        }
-        return null;
-    }
-
-    public static String getName(int key) {
-        BaseRegulationTypeEnum item = getEnum(key);
-        return item != null ? item.name : null;
-    }
-
-    @Override
-    public int getKey() {
-        return key;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-
-}

+ 3 - 72
src/main/java/com/diagbot/facade/KlRegulationBaseFacade.java

@@ -1,13 +1,10 @@
 package com.diagbot.facade;
 
+import com.diagbot.dto.BaseDiagnoseDTO;
 import com.diagbot.dto.BaseRegulationDTO;
 import com.diagbot.dto.RegulationDTO;
-import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.ScaleDTO;
 import com.diagbot.dto.WordCrfDTO;
-import com.diagbot.enums.BaseRegulationTypeEnum;
-import com.diagbot.enums.LexiconEnum;
-import com.diagbot.model.entity.Clinical;
 import com.diagbot.rule.AgeRule;
 import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.GroupRule;
@@ -23,8 +20,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -64,83 +59,19 @@ public class KlRegulationBaseFacade extends KlRegulationBaseServiceImpl {
         if (ListUtil.isEmpty(scaleVO.getCodeList())) {
             return scaleDTO;
         }
-        // // 读取所有的基础规则——已去重
-        // List<BaseRegulationDTO> baseRegulationDTOList = redisUtil.get(RedisEnum.allBaseRegulation.getName());
-
         // 筛选编码对应的规则
         List<BaseRegulationDTO> baseRegulationDTOList = this.getSelectBase(scaleVO.getCodeList());
-
         if (ListUtil.isEmpty(baseRegulationDTOList)) {
             return scaleDTO;
         }
-
+        List<BaseDiagnoseDTO> baseDiagnoseDTOList = BeanUtil.listCopyTo(baseRegulationDTOList, BaseDiagnoseDTO.class);
         // CRF模型处理
         WordCrfDTO wordCrfDTO = commonFacade.crf_process(scaleVO, false);
-
         // 同义词转换
         commonFacade.wordStandConvert(wordCrfDTO);
-
         // 匹配的基础规则
-        List<Long> baseIdList = new ArrayList<>();
+        List<Long> baseIdList = commonRule.matchBase(wordCrfDTO, baseDiagnoseDTOList);
 
-        /**---------------------------数据统一处理开始--------------------------------- */
-        // 【临床表现数据来源】(主诉、现病史)
-        List<Clinical> clinicals = commonFacade.getClinicalSource(wordCrfDTO);
-        /**---------------------------数据统一处理结束--------------------------------- */
-
-        // 规则处理
-        for (BaseRegulationDTO base : baseRegulationDTOList) {
-            RuleBaseDTO ruleBaseDTO = new RuleBaseDTO();
-            BeanUtil.copyProperties(base, ruleBaseDTO);
-            String baseIds = base.getIds();
-            BaseRegulationTypeEnum typeEnum = BaseRegulationTypeEnum.getEnum(base.getBaseType());
-            if (typeEnum == null) {
-                continue;
-            }
-            switch (typeEnum) {
-                case equals: // 等于术语本身
-                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
-                        case Symptom: // 症状
-                            commonRule.compareNameWithPush(clinicals, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Disease: // 疾病【病史】
-                            commonRule.compareNameWithPush(wordCrfDTO.getPastLabel().getDiags(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case VitalResult: // 体格检查结果
-                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Group: // 人群
-                            groupRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case PacsResult: // 辅助检查结果
-                            commonRule.compareItemWithPush(wordCrfDTO.getPacsLabel().getRes(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                    }
-                    break;
-                case compare: // 比较
-                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
-                        case LisSubName: // 化验
-                            lisRule.push(wordCrfDTO.getLis(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Age: // 年龄
-                            ageRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Vital: // 体格检查项目
-                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                    }
-                    break;
-                case regexChiefSymptom: // 主诉现病史正则
-                    commonRule.getRegexResPush(wordCrfDTO.getChief() + wordCrfDTO.getSymptom(),
-                            base.getBaseEqValue(), baseIdList, baseIds);
-                    break;
-                case regexPast: // 既往史正则
-                    commonRule.getRegexResPush(wordCrfDTO.getPasts() + wordCrfDTO.getPersonal() + wordCrfDTO.getMenstrual() + wordCrfDTO.getMarital() + wordCrfDTO.getFamily(),
-                            base.getBaseEqValue(), baseIdList, baseIds);
-                    break;
-            }
-        }
-        Collections.sort(baseIdList); // id排序,方便调试查看
         scaleDTO.getDebug().put("基础规则匹配", StringUtils.join(baseIdList));
 
         if (ListUtil.isNotEmpty(baseIdList)) {

+ 2 - 61
src/main/java/com/diagbot/process/PushProcess.java

@@ -10,14 +10,12 @@ import com.diagbot.dto.NeoPushDTO;
 import com.diagbot.dto.PushBaseDTO;
 import com.diagbot.dto.PushDTO;
 import com.diagbot.dto.ReverseDTO;
-import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.TreatDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.dto.icss.FeatureRate;
 import com.diagbot.dto.icss.Response;
 import com.diagbot.dto.icss.ResponseData;
 import com.diagbot.entity.PreResult;
-import com.diagbot.enums.BaseDiagnoseTypeEnum;
 import com.diagbot.enums.DiagnoseTypeEnum;
 import com.diagbot.enums.DiseaseTypeEnum;
 import com.diagbot.enums.LexiconEnum;
@@ -33,7 +31,6 @@ import com.diagbot.facade.KlRelationFacade;
 import com.diagbot.facade.LisConfigFacade;
 import com.diagbot.facade.NeoFacade;
 import com.diagbot.facade.TranLisConfigIcssFacade;
-import com.diagbot.model.entity.Clinical;
 import com.diagbot.rule.AgeRule;
 import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.GroupRule;
@@ -65,7 +62,6 @@ import org.springframework.stereotype.Component;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -496,63 +492,8 @@ public class PushProcess {
             return pushDTO;
         }
         // 匹配的诊断依据规则
-        List<Long> baseIdList = new ArrayList<>();
-
-        /**---------------------------数据统一处理开始--------------------------------- */
-        // 【临床表现数据来源】(主诉、现病史)
-        List<Clinical> clinicals = commonFacade.getClinicalSource(wordCrfDTO);
-        /**---------------------------数据统一处理结束--------------------------------- */
-
-        // 规则处理
-        for (BaseDiagnoseDTO base : diagnoselist) {
-            RuleBaseDTO ruleBaseDTO = new RuleBaseDTO();
-            BeanUtil.copyProperties(base, ruleBaseDTO);
-            String baseIds = base.getIds();
-            switch (BaseDiagnoseTypeEnum.getEnum(base.getBaseType())) {
-                case equals: // 等于术语本身
-                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
-                        case Symptom: // 症状
-                            commonRule.compareNameWithPush(clinicals, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Disease: // 疾病【病史】
-                            commonRule.compareNameWithPush(wordCrfDTO.getPastLabel().getDiags(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case VitalResult: // 体格检查结果
-                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Group: // 人群
-                            groupRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case PacsResult: // 辅助检查结果
-                            commonRule.compareItemWithPush(wordCrfDTO.getPacsLabel().getRes(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                    }
-                    break;
-                case compare: // 比较
-                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
-                        case LisSubName: // 化验
-                            lisRule.push(wordCrfDTO.getLis(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Age: // 年龄
-                            ageRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                        case Vital: // 体格检查项目
-                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
-                            break;
-                    }
-                    break;
-                case regexChiefSymptom: // 主诉现病史正则
-                    commonRule.getRegexResPush(wordCrfDTO.getChief() + wordCrfDTO.getSymptom(),
-                            base.getBaseEqValue(), baseIdList, baseIds);
-                    break;
-                case regexPast: // 既往史正则
-                    commonRule.getRegexResPush(wordCrfDTO.getPasts() + wordCrfDTO.getPersonal() + wordCrfDTO.getMenstrual() + wordCrfDTO.getMarital() + wordCrfDTO.getFamily(),
-                            base.getBaseEqValue(), baseIdList, baseIds);
-                    break;
-            }
-        }
-        // 根据诊断依据推送诊断
-        Collections.sort(baseIdList); // id排序,方便调试查看
+        List<Long> baseIdList = commonRule.matchBase(wordCrfDTO, diagnoselist);
+
         pushDTO.getDebug().put("诊断依据ID列表", StringUtils.join(baseIdList, ","));
         Map<String, List<PushBaseDTO>> pushDiagnoseDTO = setPushDiagnose(wordCrfDTO, baseIdList);
         pushDTO.setDis(pushDiagnoseDTO);

+ 82 - 0
src/main/java/com/diagbot/rule/CommonRule.java

@@ -1,13 +1,19 @@
 package com.diagbot.rule;
 
 import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.dto.BaseDiagnoseDTO;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.RuleSimpleDTO;
 import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.enums.BaseDiagnoseTypeEnum;
 import com.diagbot.enums.ConEnum;
+import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.TypeEnum;
+import com.diagbot.facade.CommonFacade;
+import com.diagbot.model.entity.Clinical;
 import com.diagbot.model.entity.Negative;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.util.CatalogueUtil;
 import com.diagbot.util.CoreUtil;
 import com.diagbot.util.EntityUtil;
@@ -16,6 +22,7 @@ import com.diagbot.util.MsgUtil;
 import com.diagbot.util.RegexUtil;
 import com.diagbot.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -37,6 +44,17 @@ import java.util.concurrent.locks.ReentrantLock;
 @Component
 public class CommonRule {
 
+    @Autowired
+    CommonFacade commonFacade;
+    @Autowired
+    GroupRule groupRule;
+    @Autowired
+    VitalRule vitalRule;
+    @Autowired
+    AgeRule ageRule;
+    @Autowired
+    LisRule lisRule;
+
     /**
      * 比较阳性属性是否匹配
      *
@@ -436,4 +454,68 @@ public class CommonRule {
         new ReentrantLock().lock();
     }
 
+    /**
+     * 根据基础规则,通用
+     *
+     * @param wordCrfDTO
+     */
+    public List<Long> matchBase(WordCrfDTO wordCrfDTO, List<BaseDiagnoseDTO> baseList) {
+        List<Long> baseIdList = new ArrayList<>();
+        /**---------------------------数据统一处理开始--------------------------------- */
+        // 【临床表现数据来源】(主诉、现病史)
+        List<Clinical> clinicals = commonFacade.getClinicalSource(wordCrfDTO);
+        /**---------------------------数据统一处理结束--------------------------------- */
+
+        // 规则处理
+        for (BaseDiagnoseDTO base : baseList) {
+            RuleBaseDTO ruleBaseDTO = new RuleBaseDTO();
+            BeanUtil.copyProperties(base, ruleBaseDTO);
+            String baseIds = base.getIds();
+            switch (BaseDiagnoseTypeEnum.getEnum(base.getBaseType())) {
+                case equals: // 等于术语本身
+                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
+                        case Symptom: // 症状
+                            compareNameWithPush(clinicals, ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case Disease: // 疾病【病史】
+                            compareNameWithPush(wordCrfDTO.getPastLabel().getDiags(), ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case VitalResult: // 体格检查结果
+                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case Group: // 人群
+                            groupRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case PacsResult: // 辅助检查结果
+                            compareItemWithPush(wordCrfDTO.getPacsLabel().getRes(), ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                    }
+                    break;
+                case compare: // 比较
+                    switch (LexiconEnum.getEnum(base.getBaseLibType())) {
+                        case LisSubName: // 化验
+                            lisRule.push(wordCrfDTO.getLis(), ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case Age: // 年龄
+                            ageRule.push(wordCrfDTO, ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                        case Vital: // 体格检查项目
+                            vitalRule.push(wordCrfDTO.getVitalLabel(), ruleBaseDTO, baseIdList, baseIds);
+                            break;
+                    }
+                    break;
+                case regexChiefSymptom: // 主诉现病史正则
+                    getRegexResPush(wordCrfDTO.getChief() + wordCrfDTO.getSymptom(),
+                            base.getBaseEqValue(), baseIdList, baseIds);
+                    break;
+                case regexPast: // 既往史正则
+                    getRegexResPush(wordCrfDTO.getPasts() + wordCrfDTO.getPersonal() + wordCrfDTO.getMenstrual() + wordCrfDTO.getMarital() + wordCrfDTO.getFamily(),
+                            base.getBaseEqValue(), baseIdList, baseIds);
+                    break;
+            }
+        }
+        Collections.sort(baseIdList); // id排序,方便调试查看
+        return baseIdList;
+    }
+
 }