Преглед изворни кода

优化管理类规则统计

0027005599 пре 2 година
родитељ
комит
d512f3212e

+ 1 - 1
jeecg-boot-base-core/src/main/java/org/jeecg/common/util/dynamic/db/DynamicDBUtil.java

@@ -116,7 +116,7 @@ public class DynamicDBUtil {
      * @param dbKey
      * @return
      */
-    private static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(String dbKey) {
+    public static NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(String dbKey) {
         DruidDataSource dataSource = getDbSourceByDbKey(dbKey);
         return new NamedParameterJdbcTemplate(dataSource);
     }

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

@@ -98,4 +98,8 @@ public class Constant {
      * 门诊
      */
     public static final String TREAMENT_TYPE_OUTPATIENT = "2";
+    /**
+     * 应用本身数据库
+     */
+    public static final String LOCAL_MYSQL = "local_mysql";
 }

+ 20 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/SystemEventAttrConstant.java

@@ -12,8 +12,27 @@ public class SystemEventAttrConstant {
 
 
     /**
-     * 医保规则ID
+     * 医保规则ID eventAttrId:10000
      */
     public static String MEDICAL_INS_RULE_INFO_ID = "medical_ins_rule_info_id";
 
+    /**
+     * 医保规则名称 eventAttrId:996
+     */
+    public static String MEDICAL_INS_RULE_INFO_NAME = "medical_ins_rule_info_name";
+
+    /**
+     * 医保规则编码 eventAttrId:995
+     */
+    public static String MEDICAL_INS_RULE_INFO_CODE = "medical_ins_rule_info_code";
+
+    /**
+     * 医保项目编码 eventAttrId: 998
+     */
+    public static final String MEDICAL_PROJECT_CODE_KEY = "medical_project_code";
+    /**
+     * 医保诊断编码 eventAttrId:997
+     */
+    public static final String MEDICAL_DIAGNOSE_CODE_KEY = "medical_diagnose_code";
+
 }

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

@@ -0,0 +1,20 @@
+package org.jeecg.modules.medical.job;
+
+import org.jeecg.modules.medical.service.IAfterStatisticsService;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 事后统计类指标
+ */
+public class AfterStaticisJob implements Job {
+
+    @Autowired
+    IAfterStatisticsService afterStatisticsService;
+    @Override
+    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+    }
+}

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

@@ -75,6 +75,8 @@ public class FactorEnchangeFactory {
     IAfterwardsAuditService afterwardsAuditService;
     @Autowired
     IAfterwardsAuditDetailService afterwardsAuditDetailService;
+    @Autowired
+    SqlUtil sqlUtil;
 
     public static Map<Integer, EventAttr> enchanceAttrMap = new HashMap<>();
 
@@ -103,7 +105,7 @@ public class FactorEnchangeFactory {
             switch (enchanceTypeEnum) {
                 case SQL:
                     Map<Integer, List<FactorAttrRela>> ioTypeMap = getIoMap(factorEnchanceId);
-                    setSqlResultByFactorEnchance(localMap, ioTypeMap, factorEnchance, medicalInfoRuleInfoId);
+                    sqlUtil.setSqlResultByFactorEnchance(localMap, ioTypeMap, factorEnchance, medicalInfoRuleInfoId);
                     break;
                 case EXPRESSION:
 //                    setLogicalExpressionResultByFactorEnchance(localMap, ioTypeMap, factorEnchance, medicalInfoRuleInfoId);
@@ -374,145 +376,5 @@ public class FactorEnchangeFactory {
         return null;
     }
 
-    public void setSqlResultByFactorEnchance(Map<String, Object> localMap, Map<Integer, List<FactorAttrRela>> ioTypeMap, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
-        String dataSourceKey = factorEnchance.getExtAttr1();
-        JdbcTemplate jdbcTemplate = DynamicDBUtil.getJdbcTemplate(dataSourceKey);
-        List<FactorAttrRela> factorAttrRelaList = ioTypeMap.get(Constant.INPUT);
-        List<Integer> paramNameList = new ArrayList<>();
-        List<Integer> paramTypeList = new ArrayList<>();
-        if (CollectionUtil.isNotEmpty(factorAttrRelaList)) {
-            for (FactorAttrRela factorAttrRela : factorAttrRelaList) {
-                EventAttr eventAttr = enchanceAttrMap.get(factorAttrRela.getEventAttrId());
-                if (null == eventAttr) {
-                    throw new NullPointerException("规则Id:" + medicalInsRuleInfoId + " 要素ID:" + factorAttrRela.getEventAttrId() + " 不在要素管理表中");
-                }
-                paramNameList.add(factorAttrRela.getEventAttrId());
-                paramTypeList.add(eventAttr.getDispType());
-            }
-        }
-        String sql = getSqlText(localMap, factorEnchance.getEnhanceValue(), paramNameList, paramTypeList, factorEnchance, medicalInsRuleInfoId);
-
-        List<FactorAttrRela> factorAttrRelaOutList = ioTypeMap.get(Constant.OUTPUT);
-        if (CollectionUtil.isNotEmpty(factorAttrRelaOutList)) {
-            if (factorAttrRelaOutList.size() == 1 && checkEventAttrArr(factorAttrRelaOutList.get(0).getEventAttrId())) {
-                List<Object> dataList = jdbcTemplate.queryForList(sql,Object.class);
-//                    jdbcTemplate.queryForList()
-                localMap.put(getParamName(factorAttrRelaOutList.get(0).getEventAttrId()), dataList);
-            } else if (factorAttrRelaOutList.size() == 1 && checkEventAttrMap(factorAttrRelaOutList.get(0).getEventAttrId())) {
-                Map<String, Object> dataMap = jdbcTemplate.queryForMap(sql);
-                localMap.put(getParamName(factorAttrRelaOutList.get(0).getEventAttrId()), dataMap);
-            } else {
-                SqlRowSet rs = jdbcTemplate.queryForRowSet(sql);
-                if (rs.first()) {
-                    for (int paramIndex = 1; paramIndex <= factorAttrRelaOutList.size(); paramIndex++) {
-                        Object paramObj = rs.getObject(paramIndex);
-                        FactorAttrRela factorAttrRela = factorAttrRelaOutList.get(paramIndex - 1);
-                        localMap.put(getParamName(factorAttrRela.getEventAttrId()), paramObj);
-                    }
-                }
-            }
-        }
-
-
-    }
-
-    public boolean checkEventAttrArr(Integer eventAttrId) {
-        EventAttr eventAttr = enchanceAttrMap.get(eventAttrId);
-        Integer dispType = eventAttr.getDispType();
-        if (ColumnTypeEnum.getType(dispType) == ColumnTypeEnum.ARRAY) {
-            return true;
-        }
-        return false;
-    }
-
-    public boolean checkEventAttrMap(Integer eventAttrId) {
-        Integer dispType = enchanceAttrMap.get(eventAttrId).getDispType();
-        if (ColumnTypeEnum.getType(dispType) == ColumnTypeEnum.MAP) {
-            return true;
-        }
-        return false;
-    }
-
-    public String getSqlText(Map<String, Object> localMap, String sql, List<Integer> paramIdNameList, List<Integer> paramTypeList, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
-        List<String> paramValueList = new ArrayList<>();
-        if (CollectionUtil.isNotEmpty(paramIdNameList)) {
-            for (int indx = 0; indx < paramIdNameList.size(); indx++) {
-                Integer paramId = paramIdNameList.get(indx);
-                Integer type = paramTypeList.get(indx);
-                Object paramObject = localMap.get(getParamName(paramId));
-                if (null == paramObject) {
-                    throw new NullPointerException("医保规则:" + medicalInsRuleInfoId + " 要素提取:" + factorEnchance.getFactorCatalog() + " 参数key:" + paramId + " 参数名:" + getParamName(paramId));
-                }
-                log.info("规则ID:{} 入参:{} 类型:{} 值:{}", medicalInsRuleInfoId, paramId, type, paramObject);
-                String whereColumn = null;
-                switch (ColumnTypeEnum.getType(type)) {
-                    case ARRAY:
-                        List<Object> paramList = (List<Object>) paramObject;
-                        whereColumn = getInStr(paramId, paramList);
-                        break;
-                    case MAP:
-                        whereColumn = getMapStr(paramId, paramObject);
-                        break;
-                    case STRING:
-                        whereColumn = "'" + paramObject + "'";
-                        break;
-                    case INTEGER:
-                        whereColumn = paramObject.toString();
-                        break;
-                    case DATETIME:
-                        Date paramDate = (Date) paramObject;
-                        whereColumn = DateUtil.formatDate(paramDate);
-                        break;
-                    default:
-                        log.error("数据类型超出范围,当作字符串处理,{} value:{}", type, paramObject);
-                        whereColumn = paramObject.toString();
-                        return whereColumn;
-                }
-                paramValueList.add(whereColumn);
-            }
-        }
-        sql = String.format(sql, paramValueList.toArray(new String[0]));
-        log.info("规则ID:{} 要素提取:{} sql:{}", medicalInsRuleInfoId, factorEnchance.getId(), sql);
-        return sql;
-    }
-
-    public String getInStr(Integer paramId, List<Object> paramList) {
-        StringBuffer wheColumnStr = new StringBuffer(" (");
-        for (Object param : paramList) {
-            log.error("字段属性名为:{} value:{} 类型:{}", paramId, param, param.getClass());
-            if (param instanceof Map) {
-                EventAttr eventAttr = enchanceAttrMap.get(paramId);
-                String proKey = eventAttr.getDispArgs();
-                Object value = ((Map<?, ?>) param).get(proKey);
-                if (value instanceof String) {
-                    wheColumnStr.append("'").append(param).append("',");
-                } else {
-                    wheColumnStr.append(value);
-                }
-            } else if (param instanceof String) {
-                wheColumnStr.append("'").append(param).append("',");
-            } else if (param instanceof Integer) {
-                wheColumnStr.append(param).append(",");
-            } else if (param instanceof Long) {
-                wheColumnStr.append(param).append(",");
-            } else {
-                wheColumnStr.append("'").append(param).append("',");
-            }
-        }
-        String wheColumnEndStr = wheColumnStr.substring(0, wheColumnStr.length() - 1);
-
-        return wheColumnEndStr + ") ";
-    }
-
-    public String getMapStr(Integer paramId, Object param) {
-        EventAttr eventAttr = enchanceAttrMap.get(paramId);
-        String proKey = eventAttr.getDispArgs();
-        Object value = ((Map<?, ?>) param).get(proKey);
-        if (value instanceof String) {
-            return "'" + value + "'";
-        } else {
-            return value.toString();
-        }
-    }
 
 }

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

@@ -123,8 +123,6 @@ public class RuleEngine {
             log.error("规则配置表没有有效的规则");
             return;
         }
-//        List<Integer> medicalInsRuleInfoIdList = medicalInsRuleInfoList.stream().map(MedicalInsRuleInfo::getId).collect(Collectors.toList());
-
         /*
          * 根据规则id加载规则并初始化到redis里
          * 后续提醒通过redis加载id,把id传入规则引擎,迅速调用对应规则
@@ -179,7 +177,6 @@ public class RuleEngine {
                                 }
                             }
                         }
-//                        setMIDProjectCodeToRedis(medicalInsRuleProject);
                     }
                 }
             });
@@ -189,9 +186,6 @@ public class RuleEngine {
 
         List<RuleAttr> ruleAttrList = ruleAttrService.list();
         interfRuleAttrList = ruleAttrList.stream().collect(Collectors.groupingBy(RuleAttr::getInterfName));
-//        for(Map.Entry<String,List<RuleAttr>> map : interfRuleAttrList.entrySet()){
-//            redisTemplate.opsForValue().append(map.getKey(), JSON.toJSONString(map.getValue()));
-//        }
 
     }
 
@@ -269,21 +263,12 @@ public class RuleEngine {
     public void dealAfterInterfaceEngin(AfterwardsAudit afterwardsAudit, AfterIncidentDetailLog afterIncidentDetailLog,List<Map<String,Object>> itemList) {
 
         try {
-//            List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
-//            if (null == ruleAttrList) {
-//
-//                return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
-//            }
             dictUtil.transferAfterIncidentWarning(afterIncidentDetailLog);
             String jsonStr = JSON.toJSONString(afterIncidentDetailLog);
             log.info("事后处理日志:{}", jsonStr);
             JSONObject itemMap = JSON.parseObject(jsonStr);
-//            List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
 
-//            insertAfterWarning(afterwardsAudit);
-//            midIncidentAudit.setInterfName(intefName);
             Set<String> auditDetailSet = new HashSet<>();
-//            for (Map<String, Object> itemMap : itemList) {
             Set<Integer> medicalInsRuleInfoIdList = itemCodeAndRuleIdMap.get(itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
             if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
                 log.error("项目编码未匹配到对应的医保规则:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
@@ -298,12 +283,10 @@ public class RuleEngine {
                 }
             }
             runAfterEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, afterwardsAudit, itemList);
-//            }
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
 
-//        return Result.ok();
     }
 
 
@@ -506,6 +489,8 @@ public class RuleEngine {
                 MedicalInsRuleInfo medicalInsRuleInfo = medicalInsRuleInfoService.getById(medicalRuleInsInfoId);
                 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());
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
 
                 boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, afterIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp, itemList);
@@ -532,10 +517,9 @@ public class RuleEngine {
         query.in(RuleFactorRela::getMedicalInsRuleInfoId, medicalInsRuleInfoIdList);
         query.orderByAsc(RuleFactorRela::getSeqNum);
         List<RuleFactorRela> ruleFactorRelaList = ruleFactorRelaService.list(query);
-
+        boolean auditFlag = false;
         if (CollectionUtil.isNotEmpty(ruleFactorRelaList)) {
             Map<Integer, List<RuleFactorRela>> ruleIdAndFatorEnchanceIdMap = ruleFactorRelaList.stream().collect(Collectors.groupingBy(RuleFactorRela::getMedicalInsRuleInfoId));
-//            Map<Integer, RuleFactorRela> factorEnchanceRuleIdMap = ruleFactorRelaList.stream().collect(Collectors.toMap(RuleFactorRela::getFactorEnhanceId, v -> v, (v1, v2) -> v1));
             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));
@@ -549,17 +533,17 @@ public class RuleEngine {
                 MedicalInsRuleInfo medicalInsRuleInfo = medicalInsRuleInfoService.getById(medicalRuleInsInfoId);
                 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());
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
-
-//                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
-                boolean auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp, itemList);
+                auditFlag = factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp, itemList);
                 if (Constant.VALIDATION_HANDER_METHOD_RETURN.equals(medicalInsRuleInfo.getViolationHandingMethod()) && auditFlag) {
                     log.error("事中提醒数据:{} 规则名:{} 触发诊断类规则,直接全金额,后续规则无需再跑", paramMap, medicalInsRuleInfo);
                     return auditFlag;
                 }
             }
         }
-        return false;
+        return auditFlag;
     }
 
 

+ 8 - 8
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/SPELUtil.java

@@ -50,16 +50,16 @@ public class SPELUtil {
             String outKey = refEventAttr.getDispArgs();
             if (ColumnTypeEnum.ARRAY_MAP == eventColumnTypeEnum) {
                 if (ColumnTypeEnum.MAP == refEventColumnTypeEnum) {
-                    spelStr = "isMemberLeftMapAndRightListMap(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ",'" + outKey + "','" + inKey + "')";
+                    spelStr = "isMemberLeftMapAndRightListMap(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ",'" + outKey + "','" + inKey + "')";
                 } else {
-                    spelStr = "isMemberLeftObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ")";
+                    spelStr = "isMemberLeftObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ")";
                 }
 
             } else if (ColumnTypeEnum.ARRAY == eventColumnTypeEnum) {
                 if (ColumnTypeEnum.MAP == refEventColumnTypeEnum) {
-                    spelStr = "isMemberLeftMapRightListObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ",'" + outKey + "')";
+                    spelStr = "isMemberLeftMapRightListObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ",'" + outKey + "')";
                 } else {
-                    spelStr = "isMemberLeftObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ")";
+                    spelStr = "isMemberLeftObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ")";
                 }
             } else {
                 log.error("factorCondRelaId:{} 配置的包含关系使用了不恰当的要素类型", factorCondRela.getId());
@@ -70,16 +70,16 @@ public class SPELUtil {
             String outKey = refEventAttr.getDispArgs();
             if (ColumnTypeEnum.ARRAY_MAP == eventColumnTypeEnum) {
                 if (ColumnTypeEnum.MAP == refEventColumnTypeEnum) {
-                    spelStr = "!isMemberLeftMapAndRightListMap(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ",'" + outKey + "','" + inKey + "')";
+                    spelStr = "!isMemberLeftMapAndRightListMap(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ",'" + outKey + "','" + inKey + "')";
                 } else {
-                    spelStr = "!isMemberLeftObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ")";
+                    spelStr = "!isMemberLeftObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ")";
                 }
 
             } else if (ColumnTypeEnum.ARRAY == eventColumnTypeEnum) {
                 if (ColumnTypeEnum.MAP == refEventColumnTypeEnum) {
-                    spelStr = "!isMemberLeftMapRightListObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ",'" + outKey + "')";
+                    spelStr = "!isMemberLeftMapRightListObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ",'" + outKey + "')";
                 } else {
-                    spelStr = "!isMemberLeftObject(#" + refEventAttr.getId() + ",#" + eventAttr.getId() + ")";
+                    spelStr = "!isMemberLeftObject(#" + refEventAttr.getEnName() + ",#" + eventAttr.getEnName() + ")";
                 }
             } else {
                 log.error("factorCondRelaId:{} 配置的包含关系使用了不恰当的要素类型", factorCondRela.getId());

+ 168 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/SqlUtil.java

@@ -0,0 +1,168 @@
+package org.jeecg.modules.medical.ruleengine;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+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.entity.EventAttr;
+import org.jeecg.modules.medical.entity.FactorAttrRela;
+import org.jeecg.modules.medical.entity.FactorEnchance;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.support.rowset.SqlRowSet;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * sql 工具类
+ */
+@Slf4j
+@Component
+public class SqlUtil {
+
+    public void setSqlResultByFactorEnchance(Map<String, Object> localMap, Map<Integer, List<FactorAttrRela>> ioTypeMap, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
+        String dataSourceKey = factorEnchance.getExtAttr1();
+        JdbcTemplate jdbcTemplate = DynamicDBUtil.getJdbcTemplate(dataSourceKey);
+        List<FactorAttrRela> factorAttrRelaList = ioTypeMap.get(Constant.INPUT);
+        List<Integer> paramNameList = new ArrayList<>();
+        List<Integer> paramTypeList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(factorAttrRelaList)) {
+            for (FactorAttrRela factorAttrRela : factorAttrRelaList) {
+                EventAttr eventAttr = FactorEnchangeFactory.enchanceAttrMap.get(factorAttrRela.getEventAttrId());
+                if (null == eventAttr) {
+                    throw new NullPointerException("规则Id:" + medicalInsRuleInfoId + " 要素ID:" + factorAttrRela.getEventAttrId() + " 不在要素管理表中");
+                }
+                paramNameList.add(factorAttrRela.getEventAttrId());
+                paramTypeList.add(eventAttr.getDispType());
+            }
+        }
+        String sql = getSqlText(localMap, factorEnchance.getEnhanceValue(), paramNameList, paramTypeList, factorEnchance, medicalInsRuleInfoId);
+
+        List<FactorAttrRela> factorAttrRelaOutList = ioTypeMap.get(Constant.OUTPUT);
+        if (CollectionUtil.isNotEmpty(factorAttrRelaOutList)) {
+            if (factorAttrRelaOutList.size() == 1 && checkEventAttrArr(factorAttrRelaOutList.get(0).getEventAttrId())) {
+                List<Object> dataList = jdbcTemplate.queryForList(sql,Object.class);
+//                    jdbcTemplate.queryForList()
+                localMap.put(FactorEnchangeFactory.getParamName(factorAttrRelaOutList.get(0).getEventAttrId()), dataList);
+            } else if (factorAttrRelaOutList.size() == 1 && checkEventAttrMap(factorAttrRelaOutList.get(0).getEventAttrId())) {
+                Map<String, Object> dataMap = jdbcTemplate.queryForMap(sql);
+                localMap.put(FactorEnchangeFactory.getParamName(factorAttrRelaOutList.get(0).getEventAttrId()), dataMap);
+            } else {
+                SqlRowSet rs = jdbcTemplate.queryForRowSet(sql);
+                if (rs.first()) {
+                    for (int paramIndex = 1; paramIndex <= factorAttrRelaOutList.size(); paramIndex++) {
+                        Object paramObj = rs.getObject(paramIndex);
+                        FactorAttrRela factorAttrRela = factorAttrRelaOutList.get(paramIndex - 1);
+                        localMap.put(FactorEnchangeFactory.getParamName(factorAttrRela.getEventAttrId()), paramObj);
+                    }
+                }
+            }
+        }
+
+
+    }
+
+    public boolean checkEventAttrArr(Integer eventAttrId) {
+        EventAttr eventAttr = FactorEnchangeFactory.enchanceAttrMap.get(eventAttrId);
+        Integer dispType = eventAttr.getDispType();
+        if (ColumnTypeEnum.getType(dispType) == ColumnTypeEnum.ARRAY) {
+            return true;
+        }
+        return false;
+    }
+
+    public boolean checkEventAttrMap(Integer eventAttrId) {
+        Integer dispType = FactorEnchangeFactory.enchanceAttrMap.get(eventAttrId).getDispType();
+        if (ColumnTypeEnum.getType(dispType) == ColumnTypeEnum.MAP) {
+            return true;
+        }
+        return false;
+    }
+
+    public String getSqlText(Map<String, Object> localMap, String sql, List<Integer> paramIdNameList, List<Integer> paramTypeList, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
+        List<String> paramValueList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(paramIdNameList)) {
+            for (int indx = 0; indx < paramIdNameList.size(); indx++) {
+                Integer paramId = paramIdNameList.get(indx);
+                Integer type = paramTypeList.get(indx);
+                Object paramObject = localMap.get(FactorEnchangeFactory.getParamName(paramId));
+                if (null == paramObject) {
+                    throw new NullPointerException("医保规则:" + medicalInsRuleInfoId + " 要素提取:" + factorEnchance.getFactorCatalog() + " 参数key:" + paramId + " 参数名:" + FactorEnchangeFactory.getParamName(paramId));
+                }
+                log.info("规则ID:{} 入参:{} 类型:{} 值:{}", medicalInsRuleInfoId, paramId, type, paramObject);
+                String whereColumn = null;
+                switch (ColumnTypeEnum.getType(type)) {
+                    case ARRAY:
+                        List<Object> paramList = (List<Object>) paramObject;
+                        whereColumn = getInStr(paramId, paramList);
+                        break;
+                    case MAP:
+                        whereColumn = getMapStr(paramId, paramObject);
+                        break;
+                    case STRING:
+                        whereColumn = "'" + paramObject + "'";
+                        break;
+                    case INTEGER:
+                        whereColumn = paramObject.toString();
+                        break;
+                    case DATETIME:
+                        Date paramDate = (Date) paramObject;
+                        whereColumn = DateUtil.formatDate(paramDate);
+                        break;
+                    default:
+                        log.error("数据类型超出范围,当作字符串处理,{} value:{}", type, paramObject);
+                        whereColumn = paramObject.toString();
+                        return whereColumn;
+                }
+                paramValueList.add(whereColumn);
+            }
+        }
+        sql = String.format(sql, paramValueList.toArray(new String[0]));
+        log.info("规则ID:{} 要素提取:{} sql:{}", medicalInsRuleInfoId, factorEnchance.getId(), sql);
+        return sql;
+    }
+
+    public String getInStr(Integer paramId, List<Object> paramList) {
+        StringBuffer wheColumnStr = new StringBuffer(" (");
+        for (Object param : paramList) {
+            log.error("字段属性名为:{} value:{} 类型:{}", paramId, param, param.getClass());
+            if (param instanceof Map) {
+                EventAttr eventAttr = FactorEnchangeFactory.enchanceAttrMap.get(paramId);
+                String proKey = eventAttr.getDispArgs();
+                Object value = ((Map<?, ?>) param).get(proKey);
+                if (value instanceof String) {
+                    wheColumnStr.append("'").append(param).append("',");
+                } else {
+                    wheColumnStr.append(value);
+                }
+            } else if (param instanceof String) {
+                wheColumnStr.append("'").append(param).append("',");
+            } else if (param instanceof Integer) {
+                wheColumnStr.append(param).append(",");
+            } else if (param instanceof Long) {
+                wheColumnStr.append(param).append(",");
+            } else {
+                wheColumnStr.append("'").append(param).append("',");
+            }
+        }
+        String wheColumnEndStr = wheColumnStr.substring(0, wheColumnStr.length() - 1);
+
+        return wheColumnEndStr + ") ";
+    }
+
+    public String getMapStr(Integer paramId, Object param) {
+        EventAttr eventAttr = FactorEnchangeFactory.enchanceAttrMap.get(paramId);
+        String proKey = eventAttr.getDispArgs();
+        Object value = ((Map<?, ?>) param).get(proKey);
+        if (value instanceof String) {
+            return "'" + value + "'";
+        } else {
+            return value.toString();
+        }
+    }
+}

+ 27 - 0
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/plugin/AfterStaticisPlugin.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.medical.ruleengine.plugin;
+
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.util.dynamic.db.DynamicDBUtil;
+import org.jeecg.modules.medical.Constant;
+import org.jeecg.modules.medical.entity.FactorAttrRela;
+import org.jeecg.modules.medical.entity.FactorEnchance;
+import org.jeecg.modules.medical.ruleengine.PluginInterface;
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component("afterStaticisPlugin")
+public class AfterStaticisPlugin implements PluginInterface {
+
+    @Override
+    public void plugin(Map<String, Object> localMap, Map<Integer, List<FactorAttrRela>> ioTypeMap, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
+        NamedParameterJdbcTemplate namedParameterJdbcTemplate = DynamicDBUtil.getNamedParameterJdbcTemplate(Constant.LOCAL_MYSQL);
+        int updateCount = namedParameterJdbcTemplate.update(factorEnchance.getEnhanceValue(), localMap);
+        if (updateCount <= 0) {
+            log.error("要素提取:{} 执行插件sql失败", factorEnchance);
+        }
+    }
+}