浏览代码

查询速度优化

gaodm 3 年之前
父节点
当前提交
0be67e5b1e

+ 30 - 0
src/main/java/com/diagbot/aggregate/RuleAggregate.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.dto.AllRulesDTO;
 import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.RuleBaseInitDTO;
+import com.diagbot.vo.RuleBaseQueryVO;
 import com.diagbot.dto.RuleConditionDTO;
 import com.diagbot.dto.RuleConditionInitDTO;
 import com.diagbot.dto.RuleDTO;
+import com.diagbot.dto.RuleIdDTO;
 import com.diagbot.dto.RuleInitDTO;
 import com.diagbot.entity.KlRuleSearch;
 import com.diagbot.enums.BaseTypeEnum;
@@ -35,6 +37,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -315,6 +318,33 @@ public class RuleAggregate {
         return true;
     }
 
+    @DataProvider("getAllRuleIds")
+    public List<Long> setAllRules(
+            @InvokeParameter("ruleBaseQueryVO") RuleBaseQueryVO ruleBaseQueryVO,
+            @DataConsumer("getRuleNotHaveClass") List<RuleIdDTO> notHaveClassRuleIds,
+            @DataConsumer("getRuleHaveClass") List<RuleIdDTO> haveClassRuleIds) {
+        List<Long> ruleIds = new ArrayList<>();
+        if (ListUtil.isNotEmpty(notHaveClassRuleIds)){
+            ruleIds.addAll(notHaveClassRuleIds.stream().map(RuleIdDTO::getRuleId).distinct().collect(Collectors.toList()));
+        }
+        if (ListUtil.isNotEmpty(haveClassRuleIds)){
+            ruleIds.addAll(haveClassRuleIds.stream().map(RuleIdDTO::getRuleId).distinct().collect(Collectors.toList()));
+        }
+        if (ListUtil.isEmpty(ruleIds)){
+            ruleIds.add(-1000L);
+        }
+        return ruleIds;
+    }
+    @DataProvider("getRuleNotHaveClass")
+    public List<RuleIdDTO> getRuleNotHaveClass( @InvokeParameter("ruleBaseQueryVO") RuleBaseQueryVO ruleBaseQueryVO){
+        return klRuleFacade.getRuleNotHaveClass(ruleBaseQueryVO);
+    }
+
+    @DataProvider("getRuleHaveClass")
+    public List<RuleIdDTO> getRuleHaveClass( @InvokeParameter("ruleBaseQueryVO") RuleBaseQueryVO ruleBaseQueryVO){
+        return klRuleFacade.getRuleHaveClass(ruleBaseQueryVO);
+    }
+
     public static void main(String[] args) {
         List<List<RuleBaseDTO>> ruleBaseList = new ArrayList<>();
         List<RuleBaseDTO> ruleBaseDTOListA = new ArrayList<>();

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

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2022/2/25 14:13
+ */
+@Getter
+@Setter
+public class RuleIdDTO {
+    //规则ID
+    private Long ruleId;
+}

+ 18 - 0
src/main/java/com/diagbot/facade/KlRuleFacade.java

@@ -12,6 +12,7 @@ import com.diagbot.dto.KlRuleByIdSubDTO;
 import com.diagbot.dto.KlRuleInfoDTO;
 import com.diagbot.dto.OtherExportDTO;
 import com.diagbot.dto.RuleBaseDTO;
+import com.diagbot.vo.RuleBaseQueryVO;
 import com.diagbot.dto.RuleConditionDTO;
 import com.diagbot.dto.RuleDTO;
 import com.diagbot.dto.RuleQueryDTO;
@@ -28,6 +29,7 @@ import com.diagbot.util.BeanUtil;
 import com.diagbot.util.DateUtil;
 import com.diagbot.util.ExcelUtils;
 import com.diagbot.util.ExtUtil;
+import com.diagbot.util.IntegerUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RedisUtil;
 import com.diagbot.util.StringUtil;
@@ -42,6 +44,7 @@ import com.diagbot.vo.KlRuleSatartOrdisaVO;
 import com.diagbot.vo.RuleQueryKeyVO;
 import com.diagbot.vo.RuleQueryVO;
 import com.google.common.collect.Lists;
+import io.github.lvyahui8.spring.facade.DataFacade;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -49,6 +52,7 @@ import org.springframework.stereotype.Component;
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -451,6 +455,20 @@ public class KlRuleFacade extends KlRuleServiceImpl {
      * @return
      */
     public IPage<RuleQueryDTO> getRulePageFac(RuleQueryVO ruleQueryVO) {
+        if (StringUtil.isNotBlank(ruleQueryVO.getBaseLibName()) || !IntegerUtil.isNull(ruleQueryVO.getBaseLibType())) {
+            try {
+                //取得所有基础规则条目的上级规则的ID
+                Map<String, Object> invokeParams = new HashMap<>();
+                RuleBaseQueryVO ruleBaseQueryVO = new RuleBaseQueryVO();
+                ruleBaseQueryVO.setBaseLibType(ruleQueryVO.getBaseLibType());
+                ruleBaseQueryVO.setBaseLibName(ruleQueryVO.getBaseLibName());
+                invokeParams.put("ruleBaseQueryVO",ruleBaseQueryVO);
+                List<Long> ruleIds = DataFacade.get("getAllRuleIds", invokeParams, List.class);
+                ruleQueryVO.setRuleIds(ruleIds);
+            } catch (Exception e) {
+                throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "查询所有有效规则失败" + e.getMessage());
+            }
+        }
         return this.getRulePage(ruleQueryVO);
     }
 

+ 6 - 0
src/main/java/com/diagbot/mapper/KlRuleMapper.java

@@ -7,8 +7,10 @@ import com.diagbot.dto.IndicationExportDTO;
 import com.diagbot.dto.KlRuleByIdDTO;
 import com.diagbot.dto.KlRuleInfoDTO;
 import com.diagbot.dto.RuleBaseInitDTO;
+import com.diagbot.vo.RuleBaseQueryVO;
 import com.diagbot.dto.RuleConditionInitDTO;
 import com.diagbot.dto.RuleDTO;
+import com.diagbot.dto.RuleIdDTO;
 import com.diagbot.dto.RuleInitDTO;
 import com.diagbot.dto.RuleQueryDTO;
 import com.diagbot.entity.KlRule;
@@ -54,4 +56,8 @@ public interface KlRuleMapper extends BaseMapper<KlRule> {
     List<RuleBaseInitDTO> getRuleBaseInitDTOHaveClass();
 
     IPage<RuleQueryDTO> getRulePage(RuleQueryVO ruleQueryVO);
+
+    List<RuleIdDTO> getRuleNotHaveClass(RuleBaseQueryVO ruleBaseQueryVO);
+
+    List<RuleIdDTO> getRuleHaveClass(RuleBaseQueryVO ruleBaseQueryVO);
 }

+ 6 - 0
src/main/java/com/diagbot/service/KlRuleService.java

@@ -7,8 +7,10 @@ import com.diagbot.dto.IndicationExportDTO;
 import com.diagbot.dto.KlRuleByIdDTO;
 import com.diagbot.dto.KlRuleInfoDTO;
 import com.diagbot.dto.RuleBaseInitDTO;
+import com.diagbot.vo.RuleBaseQueryVO;
 import com.diagbot.dto.RuleConditionInitDTO;
 import com.diagbot.dto.RuleDTO;
+import com.diagbot.dto.RuleIdDTO;
 import com.diagbot.dto.RuleInitDTO;
 import com.diagbot.dto.RuleQueryDTO;
 import com.diagbot.entity.KlRule;
@@ -50,4 +52,8 @@ public interface KlRuleService extends IService<KlRule> {
     List<RuleBaseInitDTO> getRuleBaseInitDTOHaveClass();
 
     IPage<RuleQueryDTO> getRulePage(RuleQueryVO queryVO);
+
+    List<RuleIdDTO> getRuleNotHaveClass(RuleBaseQueryVO ruleBaseQueryVO);
+
+    List<RuleIdDTO> getRuleHaveClass(RuleBaseQueryVO ruleBaseQueryVO);
 }

+ 12 - 0
src/main/java/com/diagbot/service/impl/KlRuleServiceImpl.java

@@ -7,8 +7,10 @@ import com.diagbot.dto.IndicationExportDTO;
 import com.diagbot.dto.KlRuleByIdDTO;
 import com.diagbot.dto.KlRuleInfoDTO;
 import com.diagbot.dto.RuleBaseInitDTO;
+import com.diagbot.vo.RuleBaseQueryVO;
 import com.diagbot.dto.RuleConditionInitDTO;
 import com.diagbot.dto.RuleDTO;
+import com.diagbot.dto.RuleIdDTO;
 import com.diagbot.dto.RuleInitDTO;
 import com.diagbot.dto.RuleQueryDTO;
 import com.diagbot.entity.KlRule;
@@ -96,4 +98,14 @@ public class KlRuleServiceImpl extends ServiceImpl<KlRuleMapper, KlRule> impleme
     public IPage<RuleQueryDTO> getRulePage(RuleQueryVO ruleQueryVO) {
         return baseMapper.getRulePage(ruleQueryVO);
     }
+
+    @Override
+    public List<RuleIdDTO> getRuleNotHaveClass(RuleBaseQueryVO ruleBaseQueryVO){
+        return baseMapper.getRuleNotHaveClass(ruleBaseQueryVO);
+    }
+
+    @Override
+    public List<RuleIdDTO> getRuleHaveClass(RuleBaseQueryVO ruleBaseQueryVO){
+        return baseMapper.getRuleHaveClass(ruleBaseQueryVO);
+    }
 }

+ 18 - 0
src/main/java/com/diagbot/vo/RuleBaseQueryVO.java

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2022/2/25 14:46
+ */
+@Getter
+@Setter
+public class RuleBaseQueryVO {
+    //基础医学标准术语
+    private String baseLibName;
+    //基础规则术语类型
+    private Integer baseLibType;
+}

+ 7 - 0
src/main/java/com/diagbot/vo/RuleQueryVO.java

@@ -1,9 +1,14 @@
 package com.diagbot.vo;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Description:
  * @author: gaodm
@@ -24,4 +29,6 @@ public class RuleQueryVO extends Page {
     private String baseLibName;
     //基础规则术语类型
     private Integer baseLibType;
+    @ApiModelProperty(hidden = true)
+    private List<Long> ruleIds = new ArrayList<>(); //隐藏规则Id列表
 }

+ 72 - 64
src/main/resources/mapper/KlRuleMapper.xml

@@ -694,74 +694,82 @@
         </if>
         ) t12
         <if test="(baseLibType!=null) or (baseLibName!=null and baseLibName!='')">
-            INNER JOIN
-            (SELECT
-            t2.rule_id AS ruleId,
-            t3.id AS ruleBaseId,
-            t5.lib_name AS baseLibName,
-            t5.lib_type AS baseLibType,
-            t3.type AS baseType
-            FROM
-            kl_rule_condition t2,
-            kl_rule_base t3,
-            kl_concept t5
-            WHERE
-            t3.is_deleted = "N"
-            AND t5.is_deleted = "N"
-            AND t2.is_deleted = "N"
-            AND t2.rule_base_id = t3.id
-            AND t3. STATUS = 1
-            AND t5. STATUS = 1
-            AND t3.concept_id = t5.id
-            <if test="baseLibName!=null and baseLibName!=''">
-                AND UPPER(t5.lib_name) LIKE CONCAT('%', UPPER(trim(#{baseLibName})), '%')
-            </if>
-            <if test="baseLibType !=null">
-                AND t5.lib_type = #{baseLibType}
-            </if>
-            AND (t5.lib_type BETWEEN 100 AND 299
-            OR t5.lib_type= 410)
-            UNION ALL
-            SELECT
-            t2.rule_id AS ruleId,
-            t3.id AS ruleBaseId,
-            t11.lib_name AS baseLibName,
-            t11.lib_type AS baseLibType,
-            t3.type AS baseType
-            FROM
-            kl_rule_condition t2,
-            kl_rule_base t3,
-            kl_concept t5,
-            kl_relation t10,
-            kl_concept t11
-            WHERE
-            t3.is_deleted = "N"
-            AND t5.is_deleted = "N"
-            AND t2.is_deleted = "N"
-            AND t2.rule_base_id = t3.id
-            AND t3. STATUS = 1
-            AND t5. STATUS = 1
-            AND t3.concept_id = t5.id
-            AND t5.lib_type BETWEEN 300 AND 399
-            AND t10.start_id = t5.id
-            AND t10.relation_id = 600
-            AND t10.end_id = t11.id
-            <if test="baseLibName!=null and baseLibName!=''">
-                AND UPPER(t11.lib_name) LIKE CONCAT('%', UPPER(trim(#{baseLibName})), '%')
-            </if>
-            <if test="baseLibType !=null">
-                AND t11.lib_type = #{baseLibType}
-            </if>
-            AND (t11.lib_type BETWEEN 100 AND 299
-            OR t11.lib_type = 410)
-            AND t10.is_deleted = "N"
-            AND t11.is_deleted = "N"
-            AND t10. STATUS = 1
-            AND t11. STATUS = 1) t13 ON t12.ruleId = t13.ruleId
+            WHERE t12.ruleId IN
+            <foreach collection="ruleIds" open="(" close=")" separator="," item="ruleId">
+                #{ruleId}
+            </foreach>
         </if>
         ORDER BY
         t12.gmtModified DESC,
         t12.ruleId DESC,
         t12.conceptId DESC
     </select>
+
+    <select id="getRuleNotHaveClass" resultType="com.diagbot.dto.RuleIdDTO" parameterType="com.diagbot.vo.RuleBaseQueryVO">
+        SELECT
+        t2.rule_id AS ruleId,
+        t3.id AS ruleBaseId,
+        t5.lib_name AS baseLibName,
+        t5.lib_type AS baseLibType,
+        t3.type AS baseType
+        FROM
+        kl_rule_condition t2,
+        kl_rule_base t3,
+        kl_concept t5
+        WHERE
+        t3.is_deleted = "N"
+        AND t5.is_deleted = "N"
+        AND t2.is_deleted = "N"
+        AND t2.rule_base_id = t3.id
+        AND t3. STATUS = 1
+        AND t5. STATUS = 1
+        AND t3.concept_id = t5.id
+        <if test="baseLibName!=null and baseLibName!=''">
+            AND UPPER(t5.lib_name) LIKE CONCAT('%', UPPER(trim(#{baseLibName})), '%')
+        </if>
+        <if test="baseLibType !=null">
+            AND t5.lib_type = #{baseLibType}
+        </if>
+        AND (t5.lib_type BETWEEN 100 AND 299
+        OR t5.lib_type= 410)
+    </select>
+
+    <select id="getRuleHaveClass" resultType="com.diagbot.dto.RuleIdDTO" parameterType="com.diagbot.vo.RuleBaseQueryVO">
+        SELECT
+        t2.rule_id AS ruleId,
+        t3.id AS ruleBaseId,
+        t11.lib_name AS baseLibName,
+        t11.lib_type AS baseLibType,
+        t3.type AS baseType
+        FROM
+        kl_rule_condition t2,
+        kl_rule_base t3,
+        kl_concept t5,
+        kl_relation t10,
+        kl_concept t11
+        WHERE
+        t3.is_deleted = "N"
+        AND t5.is_deleted = "N"
+        AND t2.is_deleted = "N"
+        AND t2.rule_base_id = t3.id
+        AND t3. STATUS = 1
+        AND t5. STATUS = 1
+        AND t3.concept_id = t5.id
+        AND t5.lib_type BETWEEN 300 AND 399
+        AND t10.start_id = t5.id
+        AND t10.relation_id = 600
+        AND t10.end_id = t11.id
+        <if test="baseLibName!=null and baseLibName!=''">
+            AND UPPER(t11.lib_name) LIKE CONCAT('%', UPPER(trim(#{baseLibName})), '%')
+        </if>
+        <if test="baseLibType !=null">
+            AND t11.lib_type = #{baseLibType}
+        </if>
+        AND (t11.lib_type BETWEEN 100 AND 299
+        OR t11.lib_type = 410)
+        AND t10.is_deleted = "N"
+        AND t11.is_deleted = "N"
+        AND t10. STATUS = 1
+        AND t11. STATUS = 1
+    </select>
 </mapper>