Quellcode durchsuchen

统计监测类规则任务

0027005599 vor 2 Jahren
Ursprung
Commit
847ce4f0a2

+ 5 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/Constant.java

@@ -102,4 +102,9 @@ public class Constant {
      * 应用本身数据库
      */
     public static final String LOCAL_MYSQL = "local_mysql";
+
+    /**
+     * 管理统计类规则定时执行,并统计数据
+     */
+    public static final String MANAGER_STATICTIS_CATEGORY = "MANAGER_STATICTIS_CATEGORY";
 }

+ 44 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/job/AfterStaticisJob.java

@@ -1,20 +1,64 @@
 package org.jeecg.modules.medical.job;
 
+import cn.hutool.core.collection.CollectionUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.system.vo.DictModel;
+import org.jeecg.modules.medical.Constant;
+import org.jeecg.modules.medical.entity.MedicalInsRuleInfo;
+import org.jeecg.modules.medical.ruleengine.RuleEngine;
 import org.jeecg.modules.medical.service.IAfterStatisticsService;
+import org.jeecg.modules.medical.service.IMedicalInsRuleInfoService;
+import org.jeecg.modules.system.service.ISysDictService;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
 
 /**
  * 事后统计类指标
  */
+@Slf4j
 public class AfterStaticisJob implements Job {
 
     @Autowired
     IAfterStatisticsService afterStatisticsService;
+    @Autowired
+    IMedicalInsRuleInfoService medicalInsRuleInfoService;
+    @Autowired
+    ISysDictService sysDictService;
+    @Autowired
+    RuleEngine ruleEngine;
+
     @Override
     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+        List<DictModel> dictModelList = sysDictService.getDictItems(Constant.MANAGER_STATICTIS_CATEGORY);
+        if (CollectionUtil.isNotEmpty(dictModelList)) {
+            List<String> categoryList = new ArrayList<>();
+            for (DictModel dictModel : dictModelList) {
+                categoryList.add(dictModel.getValue());
+            }
+            List<MedicalInsRuleInfo> medicalInsRuleInfoList = medicalInsRuleInfoService.lambdaQuery().in(MedicalInsRuleInfo::getCategory, categoryList)
+                    .eq(MedicalInsRuleInfo::getState, Constant.EFF_STATE).list();
+            if (CollectionUtil.isNotEmpty(medicalInsRuleInfoList)) {
+                for (MedicalInsRuleInfo medicalInsRuleInfo : medicalInsRuleInfoList) {
+                    statictisRuleByRuleEngine(medicalInsRuleInfo);
+                }
+            } else {
+                log.error("统计指标监测类未查询到对应的有效规则:{}", categoryList);
+            }
+        } else {
+            log.error("未配置统计监测类的二级分类名");
+        }
+
+    }
 
+    @Async("commonTaskAsyncPool")
+    public void statictisRuleByRuleEngine(MedicalInsRuleInfo medicalInsRuleInfo) {
+        ruleEngine.runStatictisEngine(new HashMap<>(), medicalInsRuleInfo);
     }
 }

+ 17 - 24
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/FactorEnchangeFactory.java

@@ -1,19 +1,14 @@
 package org.jeecg.modules.medical.ruleengine;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
-import org.apache.poi.ss.formula.functions.Even;
 import org.jeecg.common.constant.CommonConstant;
 import org.jeecg.common.util.SpringContextUtils;
-import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
-import org.jeecg.modules.medical.ColumnTypeEnum;
 import org.jeecg.modules.medical.Constant;
 import org.jeecg.modules.medical.EnchanceTypeEnum;
-import org.jeecg.modules.medical.entity.AfterIncidentLog;
 import org.jeecg.modules.medical.entity.AfterwardsAudit;
 import org.jeecg.modules.medical.entity.AfterwardsAuditDetail;
 import org.jeecg.modules.medical.entity.EventAttr;
@@ -34,8 +29,6 @@ import org.jeecg.modules.medical.service.IFactorCondRelaService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditDetailService;
 import org.jeecg.modules.medical.service.IMidIncidentAuditService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.support.rowset.SqlRowSet;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -45,7 +38,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -90,8 +82,7 @@ public class FactorEnchangeFactory {
         factorCondRelaMap = factorCondRelaList.stream().collect(Collectors.groupingBy(FactorCondRela::getFactorEnhanceId));
     }
 
-
-    public boolean runFactorEnchange(Integer medicalInfoRuleInfoId, MedicalInsRuleInfo medicalInsRuleInfo, Object audit, Map<String, Object> localMap, List<RuleFactorRela> ruleFactorRelaList, List<FactorEnchance> factorEnchanceList,List<Map<String,Object>> itemList) {
+    public boolean runFactorEnchange(Integer medicalInfoRuleInfoId, MedicalInsRuleInfo medicalInsRuleInfo, Object audit, Map<String, Object> localMap, List<RuleFactorRela> ruleFactorRelaList, List<FactorEnchance> factorEnchanceList, List<Map<String, Object>> itemList) {
         Map<Integer, FactorEnchance> factorEnchanceMap = factorEnchanceList.stream().collect(Collectors.toMap(FactorEnchance::getId, v -> v, (v1, v2) -> v1));
         boolean result = false;
         for (RuleFactorRela ruleFactorRela : ruleFactorRelaList) {
@@ -160,26 +151,29 @@ public class FactorEnchangeFactory {
         return ioTypeMap;
     }
 
-    public void insertWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, Object audit,List<Map<String,Object>> itemList){
-        if(audit instanceof MidIncidentAudit) {
+    public void insertWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, Object audit, List<Map<String, Object>> itemList) {
+        if(null == audit || CollectionUtil.isEmpty(itemList)){
+            return;
+        }
+        if (audit instanceof MidIncidentAudit) {
             MidIncidentAudit midIncidentAudit = (MidIncidentAudit) audit;
             insertMidWarningDetail(itemMap, medicalInsRuleInfo, midIncidentAudit, itemList);
-        }else{
+        } else {
             AfterwardsAudit afterwardsAudit = (AfterwardsAudit) audit;
             insertAfterWarningDetail(itemMap, medicalInsRuleInfo, afterwardsAudit, itemList);
         }
     }
 
-    public void insertAfterWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, AfterwardsAudit afterwardsAudit, List<Map<String,Object>> itemList) {
+    public void insertAfterWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, AfterwardsAudit afterwardsAudit, List<Map<String, Object>> itemList) {
 
-        if(Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
+        if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
             afterwardsAuditService.lambdaUpdate().set(AfterwardsAudit::getAmount, afterwardsAudit.getAmount()).eq(AfterwardsAudit::getId, afterwardsAudit.getId()).update();
             List<AfterwardsAuditDetail> afterwardsAuditDetailList = new ArrayList<>();
             QueryWrapper queryWrapper = new QueryWrapper();
             queryWrapper.eq("afterwards_audit_id", afterwardsAudit.getId());
             afterwardsAuditDetailService.remove(queryWrapper);
             Date date = new Date(System.currentTimeMillis());
-            for(Map<String,Object> otherMap : itemList){
+            for (Map<String, Object> otherMap : itemList) {
                 AfterwardsAuditDetail afterwardsAuditDetail = new AfterwardsAuditDetail();
                 BigDecimal amount = (BigDecimal) otherMap.getOrDefault(Constant.AMOUNT_KEY, 0);
                 afterwardsAuditDetail.setAmount(amount);
@@ -212,7 +206,7 @@ public class FactorEnchangeFactory {
 
             }
             afterwardsAuditDetailService.saveBatch(afterwardsAuditDetailList);
-        }else {
+        } else {
             BigDecimal amount = (BigDecimal) itemMap.getOrDefault(Constant.AMOUNT_KEY, 0);
             AfterwardsAuditDetail afterwardsAuditDetail = new AfterwardsAuditDetail();
             afterwardsAuditDetail.setProejctCode(itemMap.get(Constant.PROJECT_CODE_KEY).toString());
@@ -243,24 +237,23 @@ public class FactorEnchangeFactory {
             afterwardsAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
             afterwardsAuditDetail.setAfterwardsAuditId(afterwardsAudit.getId());
 
-            afterwardsAuditService.lambdaUpdate().setSql("amount = amount +"+amount.doubleValue()).eq(AfterwardsAudit::getId, afterwardsAudit.getId()).update();
+            afterwardsAuditService.lambdaUpdate().setSql("amount = amount +" + amount.doubleValue()).eq(AfterwardsAudit::getId, afterwardsAudit.getId()).update();
             afterwardsAuditDetailService.save(afterwardsAuditDetail);
         }
 
 
-
     }
 
-    public void insertMidWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit,List<Map<String,Object>> itemList) {
+    public void insertMidWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) {
         MidIncidentWarningVO midIncidentWarningVO = RuleEngine.midIncidentWarningVOThreadLocal.get();
 
-        if(Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
+        if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod())) {
             midIncidentAuditService.lambdaUpdate().set(MidIncidentAudit::getAmount, midIncidentAudit.getAmount()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
             QueryWrapper<MidIncidentAuditDetail> queryWrapper = new QueryWrapper();
             queryWrapper.eq("mid_incident_audit_id", midIncidentAudit.getId());
             midIncidentAuditDetailService.remove(queryWrapper);
             List<MidIncidentAuditDetail> otherList = new ArrayList();
-            for(Map<String,Object> otherItemMap : itemList){
+            for (Map<String, Object> otherItemMap : itemList) {
                 MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
                 midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
                 midIncidentAuditDetail.setMedicalDeptName(midIncidentWarningVO.getMedical_dept_name());
@@ -291,7 +284,7 @@ public class FactorEnchangeFactory {
                 otherList.add(midIncidentAuditDetail);
             }
             midIncidentAuditDetailService.saveBatch(otherList);
-        }else {
+        } else {
             MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
             midIncidentAuditDetail.setAmount(midIncidentAudit.getAmount());
             BigDecimal amount = (BigDecimal) itemMap.getOrDefault(Constant.AMOUNT_KEY, 0);
@@ -320,7 +313,7 @@ public class FactorEnchangeFactory {
             midIncidentAuditDetail.setMedicalProjectName(itemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
 
             midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
-            midIncidentAuditService.lambdaUpdate().setSql("amount = amount +"+amount.doubleValue()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
+            midIncidentAuditService.lambdaUpdate().setSql("amount = amount +" + amount.doubleValue()).eq(MidIncidentAudit::getId, midIncidentAudit.getId()).update();
 
             midIncidentAuditDetailService.save(midIncidentAuditDetail);
         }

+ 40 - 5
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/RuleEngine.java

@@ -239,9 +239,9 @@ public class RuleEngine {
                 }
                 sendFlag = runMidEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, midIncidentAudit, itemList);
             }
-            if(sendFlag) {
+            if (sendFlag) {
                 webSocket.pushMessage(ipStr, JSON.toJSONString(midIncidentAudit));
-            }else{
+            } else {
                 log.error("无违规,事中审核无需提醒 门诊/住院号:{}", midIncidentWarningVO.getVisit_no());
             }
         } catch (Exception e) {
@@ -260,7 +260,7 @@ public class RuleEngine {
      * @param afterwardsAudit
      * @param afterIncidentDetailLog
      */
-    public void dealAfterInterfaceEngin(AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog afterIncidentDetailLog,List<Map<String,Object>> itemList) {
+    public void dealAfterInterfaceEngin(AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog afterIncidentDetailLog, List<Map<String, Object>> itemList) {
 
         try {
             dictUtil.transferAfterIncidentWarning(afterIncidentDetailLog);
@@ -457,13 +457,48 @@ public class RuleEngine {
         return afterwardsAudit;
     }
 
+    /**
+     * 事后跑统计类规则引擎
+     *
+     * @param paramMap
+     */
+    public void runStatictisEngine(Map<String, Object> paramMap, MedicalInsRuleInfo medicalInsRuleInfo) {
+        if (null == medicalInsRuleInfo) {
+            log.error("未有对应的规则,接口数据:{}", paramMap);
+            return;
+        }
+        LambdaQueryWrapper<RuleFactorRela> query = new LambdaQueryWrapper<RuleFactorRela>();
+        query.eq(RuleFactorRela::getDelFlag, CommonConstant.DEL_FLAG_0);
+        query.eq(RuleFactorRela::getMedicalInsRuleInfoId, medicalInsRuleInfo.getId());
+        query.orderByAsc(RuleFactorRela::getSeqNum);
+        List<RuleFactorRela> ruleFactorRelaList = ruleFactorRelaService.list(query);
+
+        if (CollectionUtil.isNotEmpty(ruleFactorRelaList)) {
+            Set<Integer> factorEnchangeIdList = ruleFactorRelaList.stream().map(RuleFactorRela::getFactorEnhanceId).collect(Collectors.toSet());
+            List<FactorEnchance> factorEnchanceList = factorEnchanceService.listByIds(factorEnchangeIdList);
+            Map<Integer, List<FactorEnchance>> enchanceTypeMap = factorEnchanceList.stream().collect(Collectors.groupingBy(FactorEnchance::getFactorCatalog));
+            for (Integer medicalRuleInsInfoId : enchanceTypeMap.keySet()) {
+
+                List<FactorEnchance> factorEnchanceListTemp = enchanceTypeMap.get(medicalRuleInsInfoId);
+                paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_ID, medicalRuleInsInfoId);
+                paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_CODE, medicalInsRuleInfo.getRuleCode());
+                paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_NAME, medicalInsRuleInfo.getRuleName());
+                boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, null, paramMap, ruleFactorRelaList, factorEnchanceListTemp, null);
+                if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
+                    log.error("事后统计数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
+                    return;
+                }
+            }
+        }
+    }
+
 
     /**
      * 事中跑批规则引擎
      *
      * @param paramMap
      */
-    public void runAfterEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, AfterwardsAudit afterIncidentAudit,List<Map<String,Object>> itemList) {
+    public void runAfterEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, AfterwardsAudit afterIncidentAudit, List<Map<String, Object>> itemList) {
         if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return;
@@ -507,7 +542,7 @@ public class RuleEngine {
      *
      * @param paramMap
      */
-    public boolean runMidEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, List<Map<String,Object>> itemList) {
+    public boolean runMidEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, List<Map<String, Object>> itemList) {
         if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return false;