zhoutg vor 4 Jahren
Ursprung
Commit
6b0f3db5c2
28 geänderte Dateien mit 1088 neuen und 3 gelöschten Zeilen
  1. 62 0
      doc/009.20210615量表规则/med_20221.sql
  2. 3 0
      src/main/java/com/diagbot/config/CacheDeleteInit.java
  3. 88 0
      src/main/java/com/diagbot/dto/BaseRegulationDTO.java
  4. 16 0
      src/main/java/com/diagbot/dto/RegulationDTO.java
  5. 78 0
      src/main/java/com/diagbot/entity/KlRegulation.java
  6. 113 0
      src/main/java/com/diagbot/entity/KlRegulationBase.java
  7. 83 0
      src/main/java/com/diagbot/entity/KlRegulationCondition.java
  8. 2 1
      src/main/java/com/diagbot/enums/RedisEnum.java
  9. 11 0
      src/main/java/com/diagbot/facade/CacheFacade.java
  10. 144 0
      src/main/java/com/diagbot/facade/KlRegulationBaseFacade.java
  11. 14 0
      src/main/java/com/diagbot/facade/KlRegulationFacade.java
  12. 10 0
      src/main/java/com/diagbot/facade/NeoFacade.java
  13. 21 0
      src/main/java/com/diagbot/mapper/KlRegulationBaseMapper.java
  14. 16 0
      src/main/java/com/diagbot/mapper/KlRegulationConditionMapper.java
  15. 22 0
      src/main/java/com/diagbot/mapper/KlRegulationMapper.java
  16. 21 0
      src/main/java/com/diagbot/service/KlRegulationBaseService.java
  17. 16 0
      src/main/java/com/diagbot/service/KlRegulationConditionService.java
  18. 22 0
      src/main/java/com/diagbot/service/KlRegulationService.java
  19. 27 0
      src/main/java/com/diagbot/service/impl/KlRegulationBaseServiceImpl.java
  20. 20 0
      src/main/java/com/diagbot/service/impl/KlRegulationConditionServiceImpl.java
  21. 28 0
      src/main/java/com/diagbot/service/impl/KlRegulationServiceImpl.java
  22. 20 0
      src/main/java/com/diagbot/vo/RegulationVO.java
  23. 10 0
      src/main/java/com/diagbot/web/CacheController.java
  24. 39 0
      src/main/java/com/diagbot/web/KlRegulationController.java
  25. 79 0
      src/main/resources/mapper/KlRegulationBaseMapper.xml
  26. 21 0
      src/main/resources/mapper/KlRegulationConditionMapper.xml
  27. 100 0
      src/main/resources/mapper/KlRegulationMapper.xml
  28. 2 2
      src/test/java/com/diagbot/CodeGeneration.java

+ 62 - 0
doc/009.20210615量表规则/med_20221.sql

@@ -0,0 +1,62 @@
+USE `med_2021`;
+
+DROP TABLE IF EXISTS `kl_regulation`;
+CREATE TABLE `kl_regulation` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+  `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+  `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+  `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+  `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '规则名称',
+  `code` bigint(20) NOT NULL DEFAULT '100001' COMMENT '规则编码',
+  `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '规则类型:(1:量表)',
+  `status` int(1) NOT NULL DEFAULT '1' COMMENT '启用状态(0:禁用,1:启用)',
+  `remark` varchar(300) NOT NULL DEFAULT '' COMMENT '备注',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `idx_code` (`code`) USING BTREE,
+  UNIQUE KEY `idx_name` (`name`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='通用规则表';
+
+DROP TABLE IF EXISTS `kl_regulation_condition`;
+CREATE TABLE `kl_regulation_condition` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+  `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+  `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+  `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+  `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+  `regulation_id` bigint(20) NOT NULL COMMENT '通用规则表主表id',
+  `condition_type` int(11) NOT NULL DEFAULT '0' COMMENT '条件类型(1:基础条件;2:组合条件)',
+  `condition_group` int(11) NOT NULL DEFAULT '0' COMMENT '规则组别(1XX_condition_type为2:组合条件有效)',
+  `fit_no` int(11) NOT NULL DEFAULT '1' COMMENT '符合数量(condition_type为2:组合条件有效)',
+  `base_group` int(11) NOT NULL DEFAULT '0' COMMENT '基础规则组别(1X_condition_type为1:基础条件;2:组合条件)',
+  `regulation_base_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '基础规则id(condition_type为1:基础条件有效)',
+  PRIMARY KEY (`id`),
+  KEY `idx_regulation_id` (`regulation_id`) USING BTREE,
+  KEY `idx_regulation_base_id` (`regulation_base_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1064 DEFAULT CHARSET=utf8 COMMENT='通用规则条件表';
+
+DROP TABLE IF EXISTS `kl_regulation_base`;
+CREATE TABLE `kl_regulation_base` (
+  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+  `is_deleted` char(1) NOT NULL DEFAULT 'N' COMMENT '是否删除,N:未删除,Y:删除',
+  `gmt_create` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录创建时间',
+  `gmt_modified` datetime NOT NULL DEFAULT '1970-01-01 12:00:00' COMMENT '记录修改时间,如果时间是1970年则表示纪录未修改',
+  `creator` varchar(20) NOT NULL DEFAULT '0' COMMENT '创建人,0表示无创建人值',
+  `modifier` varchar(20) NOT NULL DEFAULT '0' COMMENT '修改人,如果为0则表示纪录未修改',
+  `concept_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '提示概念id',
+  `description` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '描述',
+  `type` int(10) NOT NULL DEFAULT '1' COMMENT '基础规则类型(1:等于术语本身;2:存在比较;3:主诉现病史正则;4:既往史正则)',
+  `min_operator` varchar(15) NOT NULL DEFAULT '' COMMENT '最小域比较符',
+  `min_value` varchar(50) NOT NULL DEFAULT '' COMMENT '最小域值',
+  `min_unit` varchar(50) NOT NULL DEFAULT '' COMMENT '最小域单位',
+  `max_operator` varchar(15) NOT NULL DEFAULT '' COMMENT '最大域比较符',
+  `max_value` varchar(50) NOT NULL DEFAULT '' COMMENT '最大域值',
+  `max_unit` varchar(50) NOT NULL DEFAULT '' COMMENT '最大域单位',
+  `eq_operator` varchar(15) NOT NULL DEFAULT '' COMMENT '等于域比较符',
+  `eq_value` varchar(255) NOT NULL DEFAULT '' COMMENT '等于域值',
+  `eq_unit` varchar(50) NOT NULL DEFAULT '' COMMENT '等于域单位',
+  PRIMARY KEY (`id`),
+  KEY `idx_concept_id` (`concept_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=601 DEFAULT CHARSET=utf8 COMMENT='通用规则基础表';

+ 3 - 0
src/main/java/com/diagbot/config/CacheDeleteInit.java

@@ -54,6 +54,9 @@ public class CacheDeleteInit implements CommandLineRunner {
         cacheFacade.loadAllBaseDiagnoseCache();
         log.info("CDSS-CORE服务启动加载诊断依据缓存成功!");
 
+        cacheFacade.loadAllBaseRegulationCache();
+        log.info("CDSS-CORE服务启动加载诊断依据缓存成功!");
+
         conceptInfoFacade.loadCustomDictionary();
         log.info("CDSS-CORE服务启动加载NLP分词字典成功!");
 

+ 88 - 0
src/main/java/com/diagbot/dto/BaseRegulationDTO.java

@@ -0,0 +1,88 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 10:49
+ */
+@Getter
+@Setter
+public class BaseRegulationDTO {
+    /**
+     * 联合唯一键
+     */
+    private String baseKey;
+
+    /**
+     * id逗号隔开
+     */
+    private String ids;
+
+    /**
+     * 医学基本术语
+     */
+    private String baseLibName;
+
+    /**
+     * 术语类型
+     */
+    private Integer baseLibType;
+
+    /**
+     * 提示概念id
+     */
+    private Long conceptId;
+
+    /**
+     * 基础规则类型(1:等于术语本身;2:存在比较;3:不等于术语本身;)
+     */
+    private Integer baseType;
+
+    /**
+     * 最小域比较符
+     */
+    private String baseMinOperator;
+
+    /**
+     * 最小域值
+     */
+    private String baseMinValue;
+
+    /**
+     * 最小域单位
+     */
+    private String baseMinUnit;
+
+    /**
+     * 最大域比较符
+     */
+    private String baseMaxOperator;
+
+    /**
+     * 最大域值
+     */
+    private String baseMaxValue;
+
+    /**
+     * 最大域单位
+     */
+    private String baseMaxUnit;
+
+    /**
+     * 等于域比较符
+     */
+    private String baseEqOperator;
+
+    /**
+     * 等于域值
+     */
+    private String baseEqValue;
+
+    /**
+     * 等于域单位
+     */
+    private String baseEqUnit;
+}

+ 16 - 0
src/main/java/com/diagbot/dto/RegulationDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 11:21
+ */
+@Getter
+@Setter
+public class RegulationDTO {
+    private String code;
+    private Integer conditionType;
+}

+ 78 - 0
src/main/java/com/diagbot/entity/KlRegulation.java

@@ -0,0 +1,78 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 通用规则表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+@Data
+public class KlRegulation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 规则名称
+     */
+    private String name;
+
+    /**
+     * 规则编码
+     */
+    private Long code;
+
+    /**
+     * 规则类型:(1:量表)
+     */
+    private Integer type;
+
+    /**
+     * 启用状态(0:禁用,1:启用)
+     */
+    private Integer status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 113 - 0
src/main/java/com/diagbot/entity/KlRegulationBase.java

@@ -0,0 +1,113 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 通用规则基础表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+@Data
+public class KlRegulationBase implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 提示概念id
+     */
+    private Long conceptId;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 基础规则类型(1:等于术语本身;2:存在比较;3:主诉现病史正则;4:既往史正则)
+     */
+    private Integer type;
+
+    /**
+     * 最小域比较符
+     */
+    private String minOperator;
+
+    /**
+     * 最小域值
+     */
+    private String minValue;
+
+    /**
+     * 最小域单位
+     */
+    private String minUnit;
+
+    /**
+     * 最大域比较符
+     */
+    private String maxOperator;
+
+    /**
+     * 最大域值
+     */
+    private String maxValue;
+
+    /**
+     * 最大域单位
+     */
+    private String maxUnit;
+
+    /**
+     * 等于域比较符
+     */
+    private String eqOperator;
+
+    /**
+     * 等于域值
+     */
+    private String eqValue;
+
+    /**
+     * 等于域单位
+     */
+    private String eqUnit;
+}

+ 83 - 0
src/main/java/com/diagbot/entity/KlRegulationCondition.java

@@ -0,0 +1,83 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 通用规则条件表
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+@Data
+public class KlRegulationCondition implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 通用规则表主表id
+     */
+    private Long regulationId;
+
+    /**
+     * 条件类型(1:基础条件;2:组合条件)
+     */
+    private Integer conditionType;
+
+    /**
+     * 规则组别(1XX_condition_type为2:组合条件有效)
+     */
+    private Integer conditionGroup;
+
+    /**
+     * 符合数量(condition_type为2:组合条件有效)
+     */
+    private Integer fitNo;
+
+    /**
+     * 基础规则组别(1X_condition_type为1:基础条件;2:组合条件)
+     */
+    private Integer baseGroup;
+
+    /**
+     * 基础规则id(condition_type为1:基础条件有效)
+     */
+    private Long regulationBaseId;
+}

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

@@ -12,6 +12,7 @@ import lombok.Setter;
 public enum RedisEnum implements KeyedNamed {
 
     drugType(1, "drugType:"),
+    diseaseType(2, "diseaseType:"),
     symptomVitalType(3, "symptomVitalType:"),
     symptomNumType(4, "symptomNumType:"),
     vitalType(5, "vitalType:"),
@@ -19,9 +20,9 @@ public enum RedisEnum implements KeyedNamed {
     symptomMainFeature(7, "symptomMainFeature:"),
     diseaseCorrespond(8, "diseaseCorrespond:"),
     diseaseFilter(9, "diseaseFilter:"),
-    diseaseType(2, "diseaseType:"),
     allRule(10, "allRule:"),
     allBaseDiagnose(11, "allBaseDiagnose"),
+    allBaseRegulation(12, "allBaseRegulation"),
     pushModel(13, "pushModel"),
     hospitalId_(14, "hospitalId_"),
     deptPush(15, "deptPush");

+ 11 - 0
src/main/java/com/diagbot/facade/CacheFacade.java

@@ -142,6 +142,17 @@ public class CacheFacade {
         neoFacade.allBaseDiagnose();
     }
 
+    /**
+     * 缓存医学知识库中的所有去重的基础规则
+     *
+     * @return
+     */
+    public void loadAllBaseRegulationCache(){
+        redisUtil.delete(RedisEnum.allBaseRegulation.getName());
+        neoFacade.allBaseRegulation();
+    }
+
+
     public void clearLoadCache(String str) {
         redisUtil.deleteByPrex(str);
     }

+ 144 - 0
src/main/java/com/diagbot/facade/KlRegulationBaseFacade.java

@@ -0,0 +1,144 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.BaseRegulationDTO;
+import com.diagbot.dto.RegulationDTO;
+import com.diagbot.dto.RuleBaseDTO;
+import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.enums.BaseDiagnoseTypeEnum;
+import com.diagbot.enums.LexiconEnum;
+import com.diagbot.enums.RedisEnum;
+import com.diagbot.model.entity.Clinical;
+import com.diagbot.rule.AgeRule;
+import com.diagbot.rule.CommonRule;
+import com.diagbot.rule.GroupRule;
+import com.diagbot.rule.LisRule;
+import com.diagbot.rule.VitalRule;
+import com.diagbot.service.impl.KlRegulationBaseServiceImpl;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RedisUtil;
+import com.diagbot.vo.PushVO;
+import com.diagbot.vo.RegulationVO;
+import com.google.common.collect.Lists;
+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;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 10:58
+ */
+@Component
+public class KlRegulationBaseFacade extends KlRegulationBaseServiceImpl {
+
+    @Autowired
+    RedisUtil redisUtil;
+    @Autowired
+    CommonFacade commonFacade;
+    @Autowired
+    CommonRule commonRule;
+    @Autowired
+    VitalRule vitalRule;
+    @Autowired
+    GroupRule groupRule;
+    @Autowired
+    LisRule lisRule;
+    @Autowired
+    AgeRule ageRule;
+    @Autowired
+    KlRegulationFacade klRegulationFacade;
+
+    /**
+     * 匹配规则
+     *
+     * @param pushVO
+     * @return
+     */
+    public List<String> process(PushVO pushVO) {
+        List<String> codeList = Lists.newArrayList();
+        // 读取所有的基础规则——已去重
+        List<BaseRegulationDTO> baseRegulationDTOList = redisUtil.get(RedisEnum.allBaseRegulation.getName());
+        if (ListUtil.isEmpty(baseRegulationDTOList)) {
+            return codeList;
+        }
+
+        // CRF模型处理
+        WordCrfDTO wordCrfDTO = commonFacade.crf_process(pushVO, false);
+
+        // 同义词转换
+        commonFacade.wordStandConvert(wordCrfDTO);
+
+        // 匹配的基础规则
+        List<Long> baseIdList = new ArrayList<>();
+
+        /**---------------------------数据统一处理开始--------------------------------- */
+        // 【临床表现数据来源】(主诉、现病史)
+        List<Clinical> clinicals = commonFacade.getClinicalSource(wordCrfDTO);
+        /**---------------------------数据统一处理结束--------------------------------- */
+
+        // 规则处理
+        for (BaseRegulationDTO base : baseRegulationDTOList) {
+            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排序,方便调试查看
+
+        if (ListUtil.isNotEmpty(baseIdList)) {
+            RegulationVO regulationVO = new RegulationVO();
+            regulationVO.setIds(baseIdList);
+            List<RegulationDTO> regulationDTOList = klRegulationFacade.getRegulationByIds(regulationVO);
+            if (ListUtil.isNotEmpty(regulationDTOList)) {
+                codeList = regulationDTOList.stream().map(r -> r.getCode()).collect(Collectors.toList());
+            }
+        }
+        return codeList;
+    }
+}

+ 14 - 0
src/main/java/com/diagbot/facade/KlRegulationFacade.java

@@ -0,0 +1,14 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.KlRegulationServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 10:58
+ */
+@Component
+public class KlRegulationFacade extends KlRegulationServiceImpl {
+
+}

+ 10 - 0
src/main/java/com/diagbot/facade/NeoFacade.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.client.StandConvertServiceClient;
 import com.diagbot.dto.BaseDiagnoseDTO;
+import com.diagbot.dto.BaseRegulationDTO;
 import com.diagbot.dto.DrugNameDTO;
 import com.diagbot.dto.DrugTypeCacheDTO;
 import com.diagbot.dto.DrugTypeDTO;
@@ -75,6 +76,8 @@ public class NeoFacade {
     private KlRelationFacade klRelationFacade;
     @Autowired
     private KlDiagnoseBaseFacade klDiagnoseBaseFacade;
+    @Autowired
+    private KlRegulationBaseFacade klRegulationBaseFacade;
 
     /**
      * 返回药品缓存信息
@@ -496,4 +499,11 @@ public class NeoFacade {
             redisTemplate.opsForValue().set(RedisEnum.allBaseDiagnose.getName(), list);
         }
     }
+
+    public void allBaseRegulation() {
+        List<BaseRegulationDTO> list = klRegulationBaseFacade.getAllBase();
+        if (ListUtil.isNotEmpty(list)) {
+            redisTemplate.opsForValue().set(RedisEnum.allBaseRegulation.getName(), list);
+        }
+    }
 }

+ 21 - 0
src/main/java/com/diagbot/mapper/KlRegulationBaseMapper.java

@@ -0,0 +1,21 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.BaseRegulationDTO;
+import com.diagbot.entity.KlRegulationBase;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则基础表 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+public interface KlRegulationBaseMapper extends BaseMapper<KlRegulationBase> {
+
+    // 获取所有去重的基础规则
+    List<BaseRegulationDTO> getAllBase();
+}

+ 16 - 0
src/main/java/com/diagbot/mapper/KlRegulationConditionMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.KlRegulationCondition;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 通用规则条件表 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+public interface KlRegulationConditionMapper extends BaseMapper<KlRegulationCondition> {
+
+}

+ 22 - 0
src/main/java/com/diagbot/mapper/KlRegulationMapper.java

@@ -0,0 +1,22 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.dto.RegulationDTO;
+import com.diagbot.entity.KlRegulation;
+import com.diagbot.vo.RegulationVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则表 Mapper 接口
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+public interface KlRegulationMapper extends BaseMapper<KlRegulation> {
+
+    //根据匹配的基础规则ID获取对应的编码
+    List<RegulationDTO> getRegulationByIds(RegulationVO regulationVO);
+}

+ 21 - 0
src/main/java/com/diagbot/service/KlRegulationBaseService.java

@@ -0,0 +1,21 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.BaseRegulationDTO;
+import com.diagbot.entity.KlRegulationBase;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则基础表 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+public interface KlRegulationBaseService extends IService<KlRegulationBase> {
+
+    // 获取所有去重的基础规则
+    List<BaseRegulationDTO> getAllBase();
+}

+ 16 - 0
src/main/java/com/diagbot/service/KlRegulationConditionService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.KlRegulationCondition;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 通用规则条件表 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+public interface KlRegulationConditionService extends IService<KlRegulationCondition> {
+
+}

+ 22 - 0
src/main/java/com/diagbot/service/KlRegulationService.java

@@ -0,0 +1,22 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.RegulationDTO;
+import com.diagbot.entity.KlRegulation;
+import com.diagbot.vo.RegulationVO;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则表 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+public interface KlRegulationService extends IService<KlRegulation> {
+
+    //根据匹配的基础规则ID获取对应的编码
+    List<RegulationDTO> getRegulationByIds(RegulationVO regulationVO);
+}

+ 27 - 0
src/main/java/com/diagbot/service/impl/KlRegulationBaseServiceImpl.java

@@ -0,0 +1,27 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.dto.BaseRegulationDTO;
+import com.diagbot.entity.KlRegulationBase;
+import com.diagbot.mapper.KlRegulationBaseMapper;
+import com.diagbot.service.KlRegulationBaseService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则基础表 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+@Service
+public class KlRegulationBaseServiceImpl extends ServiceImpl<KlRegulationBaseMapper, KlRegulationBase> implements KlRegulationBaseService {
+
+    @Override
+    public List<BaseRegulationDTO> getAllBase() {
+        return baseMapper.getAllBase();
+    }
+}

+ 20 - 0
src/main/java/com/diagbot/service/impl/KlRegulationConditionServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.KlRegulationCondition;
+import com.diagbot.mapper.KlRegulationConditionMapper;
+import com.diagbot.service.KlRegulationConditionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 通用规则条件表 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+@Service
+public class KlRegulationConditionServiceImpl extends ServiceImpl<KlRegulationConditionMapper, KlRegulationCondition> implements KlRegulationConditionService {
+
+}

+ 28 - 0
src/main/java/com/diagbot/service/impl/KlRegulationServiceImpl.java

@@ -0,0 +1,28 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.dto.RegulationDTO;
+import com.diagbot.entity.KlRegulation;
+import com.diagbot.mapper.KlRegulationMapper;
+import com.diagbot.service.KlRegulationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.RegulationVO;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则表 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-06-15
+ */
+@Service
+public class KlRegulationServiceImpl extends ServiceImpl<KlRegulationMapper, KlRegulation> implements KlRegulationService {
+
+    @Override
+    public List<RegulationDTO> getRegulationByIds(RegulationVO regulationVO) {
+        return baseMapper.getRegulationByIds(regulationVO);
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 11:21
+ */
+@Getter
+@Setter
+public class RegulationVO {
+    /**
+     * 符合的Id列表
+     */
+    private List<Long> ids;
+}

+ 10 - 0
src/main/java/com/diagbot/web/CacheController.java

@@ -43,6 +43,7 @@ public class CacheController {
         cacheFacade.getdiseaseFilterCache();
         cacheFacade.loadAllRuleCache();
         cacheFacade.loadAllBaseDiagnoseCache();
+        cacheFacade.loadAllBaseRegulationCache();
         //无用的缓存
 //        cacheFacade.loadDiseaseTypeCache();
 //        cacheFacade.getSymptomCache();
@@ -62,6 +63,15 @@ public class CacheController {
         return RespDTO.onSuc(true);
     }
 
+    @ApiOperation(value = "重新加载基础规则[by:zhoutg]",
+            notes = "")
+    @PostMapping("/reloadRegulation")
+    @SysLogger("reloadRegulation")
+    public RespDTO<Boolean> reloadRegulation() {
+        cacheFacade.loadAllBaseRegulationCache();
+        return RespDTO.onSuc(true);
+    }
+
     @ApiOperation(value = "重新加载药物缓存[by:zhoutg]",
             notes = "")
     @PostMapping("/clearDrug")

+ 39 - 0
src/main/java/com/diagbot/web/KlRegulationController.java

@@ -0,0 +1,39 @@
+package com.diagbot.web;
+
+
+import com.diagbot.dto.RespDTO;
+import com.diagbot.facade.KlRegulationBaseFacade;
+import com.diagbot.vo.PushVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 通用规则表 前端控制器
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2021-06-15
+ */
+@RestController
+@RequestMapping("/klRegulation")
+@Api(value = "其他规则API", tags = { "其他规则API" })
+public class KlRegulationController {
+
+    @Autowired
+    KlRegulationBaseFacade klRegulationBaseFacade;
+
+    @ApiOperation(value = "测试规则[zhoutg]", notes = "")
+    @PostMapping("/test")
+    public RespDTO<List<String>> push(@RequestBody PushVO pushVo) {
+        List<String> codeList = klRegulationBaseFacade.process(pushVo);
+        return RespDTO.onSuc(codeList);
+    }
+}

+ 79 - 0
src/main/resources/mapper/KlRegulationBaseMapper.xml

@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.KlRegulationBaseMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlRegulationBase">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="concept_id" property="conceptId" />
+        <result column="description" property="description" />
+        <result column="type" property="type" />
+        <result column="min_operator" property="minOperator" />
+        <result column="min_value" property="minValue" />
+        <result column="min_unit" property="minUnit" />
+        <result column="max_operator" property="maxOperator" />
+        <result column="max_value" property="maxValue" />
+        <result column="max_unit" property="maxUnit" />
+        <result column="eq_operator" property="eqOperator" />
+        <result column="eq_value" property="eqValue" />
+        <result column="eq_unit" property="eqUnit" />
+    </resultMap>
+
+    <select id="getAllBase" resultType="com.diagbot.dto.BaseRegulationDTO">
+        SELECT DISTINCT
+            CONCAT_WS(
+                "_",
+                t1.concept_id,
+                t1.type,
+                t1.max_operator,
+                t1.max_value,
+                t1.max_unit,
+                t1.min_operator,
+                t1.min_value,
+                t1.min_unit,
+                t1.eq_operator,
+                t1.eq_value,
+                t1.eq_unit
+            ) AS baseKey,
+            GROUP_CONCAT(t1.id) AS ids,
+            IFNULL(t2.lib_name, "") AS baseLibName,
+            IFNULL(t2.lib_type, 0) AS baseLibType,
+            t1.concept_id,
+            t1.type AS baseType,
+            t1.max_operator AS baseMaxOperator,
+            t1.max_value AS baseMaxValue,
+            t1.max_unit AS baseMaxUnit,
+            t1.min_operator AS baseMinOperator,
+            t1.min_value AS baseMinValue,
+            t1.min_unit AS baseMinUnit,
+            t1.eq_operator AS baseEqOperator,
+            t1.eq_value AS baseEqValue,
+            t1.eq_unit AS baseEqUnit
+        FROM
+            kl_regulation_base t1
+        LEFT JOIN kl_concept t2 ON t1.concept_id = t2.id
+        AND t2.is_deleted = "N"
+        AND t2.`status` = 1
+        WHERE
+            t1.is_deleted = "N"
+        AND t1.`status` = 1
+        GROUP BY
+            t1.concept_id,
+            t1.type,
+            t1.max_operator,
+            t1.max_value,
+            t1.max_unit,
+            t1.min_operator,
+            t1.min_value,
+            t1.min_unit,
+            t1.eq_operator,
+            t1.eq_value,
+            t1.eq_unit
+    </select>
+
+</mapper>

+ 21 - 0
src/main/resources/mapper/KlRegulationConditionMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.KlRegulationConditionMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlRegulationCondition">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="regulation_id" property="regulationId" />
+        <result column="condition_type" property="conditionType" />
+        <result column="condition_group" property="conditionGroup" />
+        <result column="fit_no" property="fitNo" />
+        <result column="base_group" property="baseGroup" />
+        <result column="regulation_base_id" property="regulationBaseId" />
+    </resultMap>
+
+</mapper>

+ 100 - 0
src/main/resources/mapper/KlRegulationMapper.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.KlRegulationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlRegulation">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="name" property="name" />
+        <result column="code" property="code" />
+        <result column="type" property="type" />
+        <result column="status" property="status" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <select id="getRegulationByIds" resultType="com.diagbot.dto.RegulationDTO" parameterType="com.diagbot.vo.RegulationVO">
+        SELECT DISTINCT
+        t12.code,
+        t12.condition_type
+        FROM
+        (
+        SELECT DISTINCT
+        t11.code,
+        t11.condition_type,
+        t11.condition_group,
+        (
+        count(t11.condition_group) &lt;= sum(baseGroupDiff)
+        ) AS groupDiff
+        FROM
+        (
+        SELECT
+        t3.*, IFNULL(t5.cnt, 0) AS cnt,
+        (
+        t3.fit_no &lt;= IFNULL(t5.cnt, 0)
+        ) AS baseGroupDiff
+        FROM
+        (
+        SELECT
+        t1.code,t2.*
+        FROM
+        kl_regulation t1,
+        kl_regulation_condition t2,
+        (
+        SELECT DISTINCT
+        t4.regulation_id
+        FROM
+        `kl_regulation_condition` t4
+        WHERE
+        t4.condition_type = 1
+        AND t4.is_deleted = "N"
+        <if test="ids != null and ids.size > 0">
+        and t4.regulation_id in
+        <foreach item="id" collection="ids" open="(" separator="," close=")">
+        #{id}
+        </foreach>
+        </if>
+        ) t10
+        WHERE
+        t1.is_deleted = "N"
+        AND t1.`status` = 1
+        AND t2.is_deleted = "N"
+        AND t1.id = t2.regulation_id
+        AND t2.condition_type = 2
+        AND t1.id = t10.regulation_id
+        ) t3
+        LEFT JOIN (
+        SELECT
+        t4.regulation_id,
+        t4.base_group,
+        COUNT(t4.id) AS cnt
+        FROM
+        `kl_regulation_condition` t4
+        WHERE
+        t4.condition_type = 1
+        AND t4.is_deleted = "N"
+        <if test="ids != null and ids.size > 0">
+            and t4.regulation_id in
+            <foreach item="id" collection="ids" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
+        GROUP BY
+        t4.regulation_id,
+        t4.base_group
+        ) t5 ON t3.regulation_id = t5.regulation_id
+        AND t3.base_group = t5.base_group
+        ) t11
+        GROUP BY
+        t11.code,
+        t11.condition_type,
+        t11.condition_group
+        ) t12
+        WHERE
+        t12.groupDiff = 1
+    </select>
+</mapper>

+ 2 - 2
src/test/java/com/diagbot/CodeGeneration.java

@@ -49,14 +49,14 @@ public class CodeGeneration {
         dsc.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setPassword("lantone");
-        dsc.setUrl("jdbc:mysql://192.168.2.236:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
+        dsc.setUrl("jdbc:mysql://192.168.2.236:3306/med_2021?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
         mpg.setDataSource(dsc);
 
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
         // strategy.setTablePrefix(new String[] { "demo_" });// 此处可以修改为您的表前缀
         strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
-        strategy.setInclude(new String[] { "sys_dept_push"}); // 需要生成的表
+        strategy.setInclude(new String[] { "kl_regulation","kl_regulation_base","kl_regulation_condition"}); // 需要生成的表
 
         strategy.setSuperServiceClass(null);
         strategy.setSuperServiceImplClass(null);