瀏覽代碼

Merge branch 'dev/scaleRule20210617' into dev/scale_preserve20210511

gaodm 4 年之前
父節點
當前提交
c44b66f015
共有 38 個文件被更改,包括 1385 次插入102 次删除
  1. 62 0
      doc/009.20210615量表规则/med_20221.sql
  2. 4 4
      src/main/java/com/diagbot/config/CacheDeleteInit.java
  3. 88 0
      src/main/java/com/diagbot/dto/BaseRegulationDTO.java
  4. 2 0
      src/main/java/com/diagbot/dto/ConceptScaleDetailDTO.java
  5. 16 0
      src/main/java/com/diagbot/dto/RegulationDTO.java
  6. 27 0
      src/main/java/com/diagbot/dto/RegulationIndexDTO.java
  7. 22 0
      src/main/java/com/diagbot/dto/ScaleDTO.java
  8. 78 0
      src/main/java/com/diagbot/entity/KlRegulation.java
  9. 113 0
      src/main/java/com/diagbot/entity/KlRegulationBase.java
  10. 83 0
      src/main/java/com/diagbot/entity/KlRegulationCondition.java
  11. 2 1
      src/main/java/com/diagbot/enums/RedisEnum.java
  12. 11 0
      src/main/java/com/diagbot/facade/CacheFacade.java
  13. 46 4
      src/main/java/com/diagbot/facade/KlConceptStaticFacade.java
  14. 87 0
      src/main/java/com/diagbot/facade/KlRegulationBaseFacade.java
  15. 35 0
      src/main/java/com/diagbot/facade/KlRegulationFacade.java
  16. 10 0
      src/main/java/com/diagbot/facade/NeoFacade.java
  17. 23 0
      src/main/java/com/diagbot/mapper/KlRegulationBaseMapper.java
  18. 16 0
      src/main/java/com/diagbot/mapper/KlRegulationConditionMapper.java
  19. 22 0
      src/main/java/com/diagbot/mapper/KlRegulationMapper.java
  20. 2 61
      src/main/java/com/diagbot/process/PushProcess.java
  21. 82 29
      src/main/java/com/diagbot/rule/CommonRule.java
  22. 23 0
      src/main/java/com/diagbot/service/KlRegulationBaseService.java
  23. 16 0
      src/main/java/com/diagbot/service/KlRegulationConditionService.java
  24. 22 0
      src/main/java/com/diagbot/service/KlRegulationService.java
  25. 32 0
      src/main/java/com/diagbot/service/impl/KlRegulationBaseServiceImpl.java
  26. 20 0
      src/main/java/com/diagbot/service/impl/KlRegulationConditionServiceImpl.java
  27. 28 0
      src/main/java/com/diagbot/service/impl/KlRegulationServiceImpl.java
  28. 21 0
      src/main/java/com/diagbot/vo/RegulationIndexVO.java
  29. 20 0
      src/main/java/com/diagbot/vo/RegulationVO.java
  30. 16 0
      src/main/java/com/diagbot/vo/ScaleStaticAllVO.java
  31. 17 0
      src/main/java/com/diagbot/vo/ScaleVO.java
  32. 3 1
      src/main/java/com/diagbot/vo/StaticKnowledgeVO.java
  33. 9 0
      src/main/java/com/diagbot/web/CacheController.java
  34. 55 0
      src/main/java/com/diagbot/web/KlRegulationController.java
  35. 149 0
      src/main/resources/mapper/KlRegulationBaseMapper.xml
  36. 21 0
      src/main/resources/mapper/KlRegulationConditionMapper.xml
  37. 100 0
      src/main/resources/mapper/KlRegulationMapper.xml
  38. 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='通用规则基础表';

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

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

+ 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;
+}

+ 2 - 0
src/main/java/com/diagbot/dto/ConceptScaleDetailDTO.java

@@ -97,4 +97,6 @@ public class ConceptScaleDetailDTO {
      * 推送信息
      * 推送信息
      */
      */
     private String pushInfo;
     private String pushInfo;
+
+    private Integer match;
 }
 }

+ 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 Integer code;
+    private Integer conditionType;
+}

+ 27 - 0
src/main/java/com/diagbot/dto/RegulationIndexDTO.java

@@ -0,0 +1,27 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2020/8/17 11:28
+ */
+@Data
+public class RegulationIndexDTO {
+
+    /**
+     * 规则名称
+     */
+    private String name;
+
+    /**
+     * 规则编码
+     */
+    private Long code;
+
+    /**
+     * 规则类型:(1:量表)
+     */
+    private Integer type;
+}

+ 22 - 0
src/main/java/com/diagbot/dto/ScaleDTO.java

@@ -0,0 +1,22 @@
+package com.diagbot.dto;
+
+import com.google.common.collect.Lists;
+import lombok.Data;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhoutg
+ * @time: 2020/8/17 11:28
+ */
+@Data
+public class ScaleDTO {
+
+    // 匹配的编码列表
+    private List<String> codeList = Lists.newArrayList();
+    // 调试使用
+    private Map<String, Object> debug = new LinkedHashMap<>();
+}

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

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

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

+ 46 - 4
src/main/java/com/diagbot/facade/KlConceptStaticFacade.java

@@ -11,6 +11,7 @@ import com.diagbot.dto.DictionaryInfoDTO;
 import com.diagbot.dto.KlConceptDetailDTO;
 import com.diagbot.dto.KlConceptDetailDTO;
 import com.diagbot.dto.KlConceptStaticDTO;
 import com.diagbot.dto.KlConceptStaticDTO;
 import com.diagbot.dto.KlScaleByIdDTO;
 import com.diagbot.dto.KlScaleByIdDTO;
+import com.diagbot.dto.ScaleDTO;
 import com.diagbot.dto.StaticKnowledgeDTO;
 import com.diagbot.dto.StaticKnowledgeDTO;
 import com.diagbot.dto.StaticKnowledgeDetailDTO;
 import com.diagbot.dto.StaticKnowledgeDetailDTO;
 import com.diagbot.dto.StaticKnowledgeIndexPageDTO;
 import com.diagbot.dto.StaticKnowledgeIndexPageDTO;
@@ -37,9 +38,11 @@ import com.diagbot.vo.IdVO;
 import com.diagbot.vo.KlConceptStaticPageVO;
 import com.diagbot.vo.KlConceptStaticPageVO;
 import com.diagbot.vo.KlConceptStaticVO;
 import com.diagbot.vo.KlConceptStaticVO;
 import com.diagbot.vo.KlScaleByIdVO;
 import com.diagbot.vo.KlScaleByIdVO;
+import com.diagbot.vo.ScaleVO;
 import com.diagbot.vo.StaticKnowledgeIndexPageVO;
 import com.diagbot.vo.StaticKnowledgeIndexPageVO;
 import com.diagbot.vo.StaticKnowledgeVO;
 import com.diagbot.vo.StaticKnowledgeVO;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Lists;
+import io.micrometer.core.instrument.util.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -79,6 +82,8 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
     private DictionaryFacade dictionaryFacade;
     private DictionaryFacade dictionaryFacade;
     @Autowired
     @Autowired
     private MedRetrievalFacade medRetrievalFacade;
     private MedRetrievalFacade medRetrievalFacade;
+    @Autowired
+    KlRegulationBaseFacade klRegulationBaseFacade;
 
 
     /**
     /**
      * 获取静态知识
      * 获取静态知识
@@ -267,7 +272,9 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         }
         }
         if (type.equals(LexiconEnum.Scale.getKey())) {
         if (type.equals(LexiconEnum.Scale.getKey())) {
             //量表详情
             //量表详情
-            staticKnowledgeDTO.setScale(getScaleStructure(concept.getId()));
+            ScaleVO scaleVO = new ScaleVO();
+            BeanUtil.copyProperties(staticKnowledgeVO, scaleVO);
+            staticKnowledgeDTO.setScale(getScaleStructure(scaleVO, concept.getId()));
         }
         }
 
 
         staticKnowledgeDTO.setClinicalPathwayName(staticInfo.getClinicalPathwayName());
         staticKnowledgeDTO.setClinicalPathwayName(staticInfo.getClinicalPathwayName());
@@ -785,6 +792,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
 
 
     /**
     /**
      * 获取量表结构map Map<name_type,List<KlConceptScale>>
      * 获取量表结构map Map<name_type,List<KlConceptScale>>
+     *
      * @param getDetailVO
      * @param getDetailVO
      * @return
      * @return
      */
      */
@@ -806,7 +814,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
         if (ListUtil.isNotEmpty(conceptList)) {
         if (ListUtil.isNotEmpty(conceptList)) {
             for (KlConcept concept : conceptList) {
             for (KlConcept concept : conceptList) {
                 retMap.put(concept.getLibName() + "_" + dicTypeNameMap.get(LexiconEnum.Scale.getName()),
                 retMap.put(concept.getLibName() + "_" + dicTypeNameMap.get(LexiconEnum.Scale.getName()),
-                        getScaleStructure(concept.getId()));
+                        getScaleStructure(new ScaleVO(), concept.getId()));
             }
             }
         }
         }
         return retMap;
         return retMap;
@@ -817,7 +825,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
      * @param conceptId
      * @param conceptId
      * @return
      * @return
      */
      */
-    public ConceptScaleDTO getScaleStructure(Long conceptId) {
+    public ConceptScaleDTO getScaleStructure(ScaleVO scaleVO, Long conceptId) {
         ConceptScaleDTO retDTO = new ConceptScaleDTO();
         ConceptScaleDTO retDTO = new ConceptScaleDTO();
         List<KlConceptScale> scaleList = klConceptScaleFacade.list(new QueryWrapper<KlConceptScale>()
         List<KlConceptScale> scaleList = klConceptScaleFacade.list(new QueryWrapper<KlConceptScale>()
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
                 .eq("is_deleted", IsDeleteEnum.N.getKey())
@@ -827,6 +835,40 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
             return null;
             return null;
         }
         }
         List<ConceptScaleDetailDTO> scaleDetailList = BeanUtil.listCopyTo(scaleList, ConceptScaleDetailDTO.class);
         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());
+            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)) {
+                            data2.setMatch(1);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (null != scaleVO) {
+            List<String> codeList = new ArrayList<>();
+            codeList = scaleDetailList.stream().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)) {
+                            data2.setMatch(1);
+                        }
+                    }
+                }
+            }
+        }
+
         Map<Long, List<ConceptScaleDetailDTO>> parentMap
         Map<Long, List<ConceptScaleDetailDTO>> parentMap
                 = scaleDetailList.stream().collect(Collectors.groupingBy(ConceptScaleDetailDTO::getParentId));
                 = scaleDetailList.stream().collect(Collectors.groupingBy(ConceptScaleDetailDTO::getParentId));
         List<ConceptScaleDetailDTO> retScacleDetailList = parentMap.get(-1L);
         List<ConceptScaleDetailDTO> retScacleDetailList = parentMap.get(-1L);
@@ -856,7 +898,7 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
      * @param treeMap
      * @param treeMap
      */
      */
     public ConceptScaleSubDTO scaleRecursion(ConceptScaleSubDTO item,
     public ConceptScaleSubDTO scaleRecursion(ConceptScaleSubDTO item,
-                                                   Map<Long, List<ConceptScaleDetailDTO>> treeMap) {
+                                             Map<Long, List<ConceptScaleDetailDTO>> treeMap) {
         List<ConceptScaleDetailDTO> list = item.getDetailList();
         List<ConceptScaleDetailDTO> list = item.getDetailList();
         if (ListUtil.isNotEmpty(list)) {
         if (ListUtil.isNotEmpty(list)) {
             for (ConceptScaleDetailDTO detail : list) {
             for (ConceptScaleDetailDTO detail : list) {

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

@@ -0,0 +1,87 @@
+package com.diagbot.facade;
+
+import com.diagbot.dto.BaseDiagnoseDTO;
+import com.diagbot.dto.BaseRegulationDTO;
+import com.diagbot.dto.RegulationDTO;
+import com.diagbot.dto.ScaleDTO;
+import com.diagbot.dto.WordCrfDTO;
+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.RegulationVO;
+import com.diagbot.vo.ScaleVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+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 scaleVO
+     * @return
+     */
+    public ScaleDTO process(ScaleVO scaleVO) {
+        ScaleDTO scaleDTO = new ScaleDTO();
+        if (ListUtil.isEmpty(scaleVO.getCodeList())) {
+            return scaleDTO;
+        }
+        // 筛选编码对应的规则
+        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 = commonRule.matchBase(wordCrfDTO, baseDiagnoseDTOList);
+
+        scaleDTO.getDebug().put("基础规则匹配", StringUtils.join(baseIdList));
+
+        if (ListUtil.isNotEmpty(baseIdList)) {
+            RegulationVO regulationVO = new RegulationVO();
+            regulationVO.setIds(baseIdList);
+            List<RegulationDTO> regulationDTOList = klRegulationFacade.getRegulationByIds(regulationVO);
+            if (ListUtil.isNotEmpty(regulationDTOList)) {
+                scaleDTO.setCodeList(regulationDTOList.stream().map(r -> String.valueOf(r.getCode())).collect(Collectors.toList()));
+            }
+        }
+        return scaleDTO;
+    }
+}

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

@@ -0,0 +1,35 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.RegulationIndexDTO;
+import com.diagbot.entity.KlRegulation;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.enums.StatusEnum;
+import com.diagbot.service.impl.KlRegulationServiceImpl;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.vo.RegulationIndexVO;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @author: zhoutg
+ * @time: 2021/3/15 10:58
+ */
+@Component
+public class KlRegulationFacade extends KlRegulationServiceImpl {
+
+    public List<RegulationIndexDTO> index(RegulationIndexVO regulationIndexVO) {
+        List<KlRegulation> klRegulationList = this.list(new QueryWrapper<KlRegulation>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq(regulationIndexVO.getType() != null, "type", regulationIndexVO.getType())
+                .like("name", regulationIndexVO.getName())
+                .notIn(ListUtil.isNotEmpty(regulationIndexVO.getNotCodeList()), "code", regulationIndexVO.getNotCodeList())
+        );
+        List<RegulationIndexDTO> regulationIndexDTOList = BeanUtil.listCopyTo(klRegulationList, RegulationIndexDTO.class);
+        return regulationIndexDTOList;
+    }
+}

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

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

@@ -0,0 +1,23 @@
+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();
+
+    List<BaseRegulationDTO> getSelectBase(List<String> codeList);
+}

+ 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);
+}

+ 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.PushBaseDTO;
 import com.diagbot.dto.PushDTO;
 import com.diagbot.dto.PushDTO;
 import com.diagbot.dto.ReverseDTO;
 import com.diagbot.dto.ReverseDTO;
-import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.TreatDTO;
 import com.diagbot.dto.TreatDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.dto.icss.FeatureRate;
 import com.diagbot.dto.icss.FeatureRate;
 import com.diagbot.dto.icss.Response;
 import com.diagbot.dto.icss.Response;
 import com.diagbot.dto.icss.ResponseData;
 import com.diagbot.dto.icss.ResponseData;
 import com.diagbot.entity.PreResult;
 import com.diagbot.entity.PreResult;
-import com.diagbot.enums.BaseDiagnoseTypeEnum;
 import com.diagbot.enums.DiagnoseTypeEnum;
 import com.diagbot.enums.DiagnoseTypeEnum;
 import com.diagbot.enums.DiseaseTypeEnum;
 import com.diagbot.enums.DiseaseTypeEnum;
 import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.LexiconEnum;
@@ -33,7 +31,6 @@ import com.diagbot.facade.KlRelationFacade;
 import com.diagbot.facade.LisConfigFacade;
 import com.diagbot.facade.LisConfigFacade;
 import com.diagbot.facade.NeoFacade;
 import com.diagbot.facade.NeoFacade;
 import com.diagbot.facade.TranLisConfigIcssFacade;
 import com.diagbot.facade.TranLisConfigIcssFacade;
-import com.diagbot.model.entity.Clinical;
 import com.diagbot.rule.AgeRule;
 import com.diagbot.rule.AgeRule;
 import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.GroupRule;
 import com.diagbot.rule.GroupRule;
@@ -65,7 +62,6 @@ import org.springframework.stereotype.Component;
 import java.lang.reflect.Field;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
@@ -496,63 +492,8 @@ public class PushProcess {
             return pushDTO;
             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, ","));
         pushDTO.getDebug().put("诊断依据ID列表", StringUtils.join(baseIdList, ","));
         Map<String, List<PushBaseDTO>> pushDiagnoseDTO = setPushDiagnose(wordCrfDTO, baseIdList);
         Map<String, List<PushBaseDTO>> pushDiagnoseDTO = setPushDiagnose(wordCrfDTO, baseIdList);
         pushDTO.setDis(pushDiagnoseDTO);
         pushDTO.setDis(pushDiagnoseDTO);

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

@@ -1,13 +1,19 @@
 package com.diagbot.rule;
 package com.diagbot.rule;
 
 
 import com.diagbot.biz.push.entity.Pacs;
 import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.dto.BaseDiagnoseDTO;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.RuleSimpleDTO;
 import com.diagbot.dto.RuleSimpleDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.enums.BaseDiagnoseTypeEnum;
 import com.diagbot.enums.ConEnum;
 import com.diagbot.enums.ConEnum;
+import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.TypeEnum;
 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.model.entity.Negative;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.util.CatalogueUtil;
 import com.diagbot.util.CatalogueUtil;
 import com.diagbot.util.CoreUtil;
 import com.diagbot.util.CoreUtil;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.EntityUtil;
@@ -16,6 +22,7 @@ import com.diagbot.util.MsgUtil;
 import com.diagbot.util.RegexUtil;
 import com.diagbot.util.RegexUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -26,8 +33,6 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Set;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
 
 
 /**
 /**
  * @description: 通用规则提取
  * @description: 通用规则提取
@@ -37,6 +42,17 @@ import java.util.concurrent.locks.ReentrantLock;
 @Component
 @Component
 public class CommonRule {
 public class CommonRule {
 
 
+    @Autowired
+    CommonFacade commonFacade;
+    @Autowired
+    GroupRule groupRule;
+    @Autowired
+    VitalRule vitalRule;
+    @Autowired
+    AgeRule ageRule;
+    @Autowired
+    LisRule lisRule;
+
     /**
     /**
      * 比较阳性属性是否匹配
      * 比较阳性属性是否匹配
      *
      *
@@ -406,34 +422,71 @@ public class CommonRule {
         highRiskList.add(billMsg);
         highRiskList.add(billMsg);
     }
     }
 
 
+    /**
+     * 根据基础规则,通用
+     *
+     * @param wordCrfDTO
+     */
+    public List<Long> matchBase(WordCrfDTO wordCrfDTO, List<BaseDiagnoseDTO> baseList) {
+        List<Long> baseIdList = new ArrayList<>();
+        /**---------------------------数据统一处理开始--------------------------------- */
+        // 【临床表现数据来源】(主诉、现病史)
+        List<Clinical> clinicals = commonFacade.getClinicalSource(wordCrfDTO);
+        /**---------------------------数据统一处理结束--------------------------------- */
 
 
-
-
-
-    public static void main(String[] args) {
-        List<Pacs> pacsList = new ArrayList<>();
-        Pacs pacs = new Pacs();
-        pacs.setName("d1");
-        pacs.setDateValue("2020-01-01");
-        pacsList.add(pacs);
-
-        Pacs pacs1 = new Pacs();
-        pacs1.setName("d2");
-        pacs1.setDateValue("2020-01-07");
-        pacsList.add(pacs1);
-
-        Pacs pacs3 = new Pacs();
-        pacs3.setName("d3");
-        pacs3.setDateValue("2020-01-09");
-        pacsList.add(pacs3);
-        CommonRule commonRule = new CommonRule();
-        commonRule.sortByProperty(pacsList, "dateValue");
-        for (Pacs bean : pacsList) {
-            System.out.println(bean.getName());
+        // 规则处理
+        for (BaseDiagnoseDTO base : baseList) {
+            RuleBaseDTO ruleBaseDTO = new RuleBaseDTO();
+            BeanUtil.copyProperties(base, ruleBaseDTO);
+            String baseIds = base.getIds();
+            BaseDiagnoseTypeEnum baseEnum = BaseDiagnoseTypeEnum.getEnum(base.getBaseType());
+            if (baseEnum == null) { // 防止报空指针
+                continue;
+            }
+            switch (baseEnum) {
+                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;
+            }
         }
         }
-        AtomicReference<Integer> integerAtomicReference = new AtomicReference<>(20);
-        integerAtomicReference.set(1020);
-        new ReentrantLock().lock();
+        Collections.sort(baseIdList); // id排序,方便调试查看
+        return baseIdList;
     }
     }
-
 }
 }

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

@@ -0,0 +1,23 @@
+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();
+
+    List<BaseRegulationDTO> getSelectBase(List<String> codeList);
+}

+ 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);
+}

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

@@ -0,0 +1,32 @@
+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();
+    }
+
+    @Override
+    public List<BaseRegulationDTO> getSelectBase(List<String> codeList) {
+        return baseMapper.getSelectBase(codeList);
+    }
+}

+ 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);
+    }
+}

+ 21 - 0
src/main/java/com/diagbot/vo/RegulationIndexVO.java

@@ -0,0 +1,21 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: 规则搜索
+ * @Author:zhoutg
+ * @time: 2020/7/29 15:34
+ */
+@Data
+public class RegulationIndexVO {
+
+    // 内容
+    private String name;
+    // 规则类型:(1:量表)
+    private Integer type;
+    // 过滤编码
+    private List<String> notCodeList;
+}

+ 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;
+}

+ 16 - 0
src/main/java/com/diagbot/vo/ScaleStaticAllVO.java

@@ -0,0 +1,16 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangfeng
+ * @Description:
+ * @date 2021-06-18 10:16
+ */
+@Setter
+@Getter
+public class ScaleStaticAllVO {
+    private StaticKnowledgeVO staticKnowledgeVO;
+    private ScaleVO scaleVO;
+}

+ 17 - 0
src/main/java/com/diagbot/vo/ScaleVO.java

@@ -0,0 +1,17 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:量表规则入参
+ * @Author:zhoutg
+ * @time: 2020/7/29 15:34
+ */
+@Data
+public class ScaleVO extends SearchData {
+
+    // 量表规则列表
+    private List<String> codeList = new ArrayList<>();
+}

+ 3 - 1
src/main/java/com/diagbot/vo/StaticKnowledgeVO.java

@@ -13,7 +13,7 @@ import java.util.List;
  */
  */
 @Getter
 @Getter
 @Setter
 @Setter
-public class StaticKnowledgeVO {
+public class StaticKnowledgeVO extends ScaleVO{
     /**
     /**
      * 标准术语名称
      * 标准术语名称
      */
      */
@@ -27,4 +27,6 @@ public class StaticKnowledgeVO {
      * 内容类型:1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
      * 内容类型:1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
      */
      */
     private List<Integer> contentTypes;
     private List<Integer> contentTypes;
+
+    private String mrId;
 }
 }

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

@@ -62,6 +62,15 @@ public class CacheController {
         return RespDTO.onSuc(true);
         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]",
     @ApiOperation(value = "重新加载药物缓存[by:zhoutg]",
             notes = "")
             notes = "")
     @PostMapping("/clearDrug")
     @PostMapping("/clearDrug")

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

@@ -0,0 +1,55 @@
+package com.diagbot.web;
+
+
+import com.diagbot.dto.RegulationIndexDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.dto.ScaleDTO;
+import com.diagbot.facade.KlRegulationBaseFacade;
+import com.diagbot.facade.KlRegulationFacade;
+import com.diagbot.vo.RegulationIndexVO;
+import com.diagbot.vo.ScaleVO;
+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;
+    @Autowired
+    KlRegulationFacade klRegulationFacade;
+
+    @ApiOperation(value = "量表规则匹配[zhoutg]", notes = "")
+    @PostMapping("/scaleRule")
+    public RespDTO<ScaleDTO> scaleRule(@RequestBody ScaleVO scaleVO) {
+        ScaleDTO scaleDTO = klRegulationBaseFacade.process(scaleVO);
+        return RespDTO.onSuc(scaleDTO);
+    }
+
+    @ApiOperation(value = "规则搜索[zhoutg]", notes =
+            "name:内容\n" +
+            "type:规则类型:(1:量表)\n" +
+            " notCodeList:过滤编码")
+    @PostMapping("/index")
+    public RespDTO<List<RegulationIndexDTO>> index(@RequestBody RegulationIndexVO regulationIndexVO) {
+        List<RegulationIndexDTO> regulationIndexDTOList = klRegulationFacade.index(regulationIndexVO);
+        return RespDTO.onSuc(regulationIndexDTOList);
+    }
+}

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

@@ -0,0 +1,149 @@
+<?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>
+
+    <select id="getSelectBase" 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
+        AND t1.id in
+        (
+            SELECT
+            b.regulation_base_id
+            FROM
+            `kl_regulation` a,
+            kl_regulation_condition b
+            WHERE
+            a.id = b.regulation_id
+            <if test="list != null and list.size > 0">
+                and a.`code` in
+                <foreach item="code" collection="list" open="(" separator="," close=")">
+                    #{code}
+                </foreach>
+            </if>
+            AND a.`status` = 1
+            AND b.condition_type = 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.setDriverName("com.mysql.cj.jdbc.Driver");
         dsc.setUsername("root");
         dsc.setUsername("root");
         dsc.setPassword("lantone");
         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);
         mpg.setDataSource(dsc);
 
 
         // 策略配置
         // 策略配置
         StrategyConfig strategy = new StrategyConfig();
         StrategyConfig strategy = new StrategyConfig();
         // strategy.setTablePrefix(new String[] { "demo_" });// 此处可以修改为您的表前缀
         // strategy.setTablePrefix(new String[] { "demo_" });// 此处可以修改为您的表前缀
         strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
         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.setSuperServiceClass(null);
         strategy.setSuperServiceImplClass(null);
         strategy.setSuperServiceImplClass(null);