Prechádzať zdrojové kódy

规则引擎全流程跑通

0027005599 2 rokov pred
rodič
commit
4562d33fc9

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

@@ -14,6 +14,6 @@ public class SystemEventAttrConstant {
     /**
      * 医保规则ID
      */
-    public static String MEDICAL_INS_RULE_INFO_ID = "10000";
+    public static String MEDICAL_INS_RULE_INFO_ID = "medical_ins_rule_info_id";
 
 }

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

@@ -64,9 +64,9 @@ public class FactorEnchangeFactory {
     @Autowired
     IMidIncidentAuditDetailService midIncidentAuditDetailService;
 
-    private Map<Integer, EventAttr> enchanceAttrMap = new HashMap<>();
+    public static Map<Integer, EventAttr> enchanceAttrMap = new HashMap<>();
 
-    private Map<Integer, List<FactorCondRela>> factorCondRelaMap = new HashMap<>();
+    public static Map<Integer, List<FactorCondRela>> factorCondRelaMap = new HashMap<>();
 
     @PostConstruct
     public void init() {
@@ -77,7 +77,6 @@ public class FactorEnchangeFactory {
     }
 
 
-
     public boolean runFactorEnchange(Integer medicalInfoRuleInfoId, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit, Map<String, Object> localMap, List<RuleFactorRela> ruleFactorRelaList, List<FactorEnchance> factorEnchanceList) {
         Map<Integer, FactorEnchance> factorEnchanceMap = factorEnchanceList.stream().collect(Collectors.toMap(FactorEnchance::getId, v -> v, (v1, v2) -> v1));
         boolean result = true;
@@ -106,17 +105,17 @@ public class FactorEnchangeFactory {
                     pluginInterface.plugin(localMap, ioTypeMap1, factorEnchance, medicalInfoRuleInfoId);
                     break;
                 case CONSTANT:
-                    localMap.put(factorEnchance.getEventAttrId().toString(), factorEnchance.getExtAttr1());
+                    localMap.put(getParamName(factorEnchance.getEventAttrId()), factorEnchance.getExtAttr1());
                     break;
                 case LOGICAL_EXPRESSION:
 //                    Map<Integer, List<FactorAttrRela>> ioTypeMap2 = getIoMap(factorEnchanceId);
-                    result = setLogicalExpressionResultByFactorEnchance(localMap,  factorEnchance);
-                    if(Constant.WARING_EVENT_ATTR_ID == factorEnchance.getEventAttrId()){
-                        if(result){
+                    result = setLogicalExpressionResultByFactorEnchance(localMap, factorEnchance);
+                    if (Constant.WARING_EVENT_ATTR_ID == factorEnchance.getEventAttrId()) {
+                        if (result) {
                             insertMidWarningDetail(localMap, medicalInsRuleInfo, midIncidentAudit);
                         }
-                    }else {
-                        localMap.put(factorEnchance.getEventAttrId().toString(), result);
+                    } else {
+                        localMap.put(getParamName(factorEnchance.getEventAttrId()), result);
                     }
                     break;
                 case PROPERTIES:
@@ -124,7 +123,7 @@ public class FactorEnchangeFactory {
                     if (null == valueTemp) {
                         log.error("要素提取:{} 规则ID:{} 常量赋值:{} 配置的属性:{}无值", factorEnchance.getId(), medicalInfoRuleInfoId, factorEnchance.getRuleEnchanceName(), factorEnchance.getExtAttr1());
                     } else {
-                        localMap.put(factorEnchance.getEventAttrId().toString(), valueTemp);
+                        localMap.put(getParamName(factorEnchance.getEventAttrId()), valueTemp);
                     }
                     break;
                 default:
@@ -135,7 +134,7 @@ public class FactorEnchangeFactory {
         return result;
     }
 
-    public Map<Integer, List<FactorAttrRela>> getIoMap(Integer factorEnchanceId){
+    public Map<Integer, List<FactorAttrRela>> getIoMap(Integer factorEnchanceId) {
         LambdaQueryWrapper<FactorAttrRela> queryWrapper = new LambdaQueryWrapper();
         queryWrapper.eq(FactorAttrRela::getFactorEnhanceId, factorEnchanceId);
         queryWrapper.orderByAsc(FactorAttrRela::getSeqNum);
@@ -147,7 +146,7 @@ public class FactorEnchangeFactory {
         return ioTypeMap;
     }
 
-    public void insertMidWarningDetail(Map<String,Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo,MidIncidentAudit midIncidentAudit){
+    public void insertMidWarningDetail(Map<String, Object> itemMap, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit) {
         MidIncidentWarningVO midIncidentWarningVO = RuleEngine.midIncidentWarningVOThreadLocal.get();
         MidIncidentAuditDetail midIncidentAuditDetail = new MidIncidentAuditDetail();
         midIncidentAuditDetail.setMedicalDeptCode(midIncidentWarningVO.getMedical_dept_code());
@@ -170,16 +169,14 @@ public class FactorEnchangeFactory {
         midIncidentAuditDetail.setMedicalProejctName(itemMap.get(Constant.MEDICAL_PROJECT_NAME_KEY).toString());
         midIncidentAuditDetail.setOutpatientNumber(midIncidentAudit.getOutpatientNumber());
         midIncidentAuditDetail.setPrescriptionNumber(midIncidentAudit.getPrescriptionNumber());
-        midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY,"default").toString());
+        midIncidentAuditDetail.setProjectType(itemMap.getOrDefault(Constant.PROJECT_TYPE_KEY, "default").toString());
         midIncidentAuditDetail.setViolationLevel(medicalInsRuleInfo.getViolationLevel());
         midIncidentAuditDetail.setTreatmentType(medicalInsRuleInfo.getTreatmentType());
         midIncidentAuditDetail.setMidIncidentAuditId(midIncidentAudit.getId());
-        midIncidentAuditService.save(midIncidentAudit);
+        midIncidentAuditDetailService.save(midIncidentAuditDetail);
     }
 
 
-
-
     /**
      * 逻辑表达式
      *
@@ -187,10 +184,10 @@ public class FactorEnchangeFactory {
      * @param factorEnchance
      */
     public boolean setLogicalExpressionResultByFactorEnchance(Map<String, Object> localMap, FactorEnchance factorEnchance) {
-        if(StringUtils.isNotBlank(factorEnchance.getEnhanceValue())){
+        if (StringUtils.isNotBlank(factorEnchance.getEnhanceValue())) {
             Boolean resultTemp = (Boolean) spelUtil.runSpelExpression(localMap, factorEnchance.getEnhanceValue());
             return resultTemp;
-        }else {
+        } else {
             List<FactorCondRela> factorCondRelaList = factorCondRelaMap.get(factorEnchance.getId());
             if (CollectionUtil.isNotEmpty(factorCondRelaList)) {
                 Boolean result = null;
@@ -201,7 +198,7 @@ public class FactorEnchangeFactory {
                 }
                 for (FactorCondRela factorCondRela : factorCondRelaList) {
                     if (!StringUtils.isNotBlank(factorCondRela.getCondStr())) {
-                        log.error("未正常生成表达式");
+                        log.error("未正常生成表达式,逻辑表达式:{}", factorCondRela);
                         String condStr = spelUtil.getSPELString(factorCondRela, enchanceAttrMap);
                         factorCondRela.setCondStr(condStr);
                     }
@@ -219,7 +216,13 @@ public class FactorEnchangeFactory {
         return false;
     }
 
-
+    public static String getParamName(Integer eventAttrId) {
+        EventAttr eventAttr = enchanceAttrMap.get(eventAttrId);
+        if (null != eventAttr) {
+            return eventAttr.getEnName();
+        }
+        return null;
+    }
 
     public void setSqlResultByFactorEnchance(Map<String, Object> localMap, Map<Integer, List<FactorAttrRela>> ioTypeMap, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
         String dataSourceKey = factorEnchance.getExtAttr1();
@@ -229,11 +232,11 @@ public class FactorEnchangeFactory {
         List<Integer> paramTypeList = new ArrayList<>();
         if (CollectionUtil.isNotEmpty(factorAttrRelaList)) {
             for (FactorAttrRela factorAttrRela : factorAttrRelaList) {
-                paramNameList.add(factorAttrRela.getEventAttrId());
                 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());
             }
         }
@@ -250,10 +253,10 @@ public class FactorEnchangeFactory {
             } else {
                 SqlRowSet rs = jdbcTemplate.queryForRowSet(sql);
                 if (rs.first()) {
-                    for (int paramIndex = 1; paramIndex < factorAttrRelaOutList.size(); paramIndex++) {
+                    for (int paramIndex = 1; paramIndex <= factorAttrRelaOutList.size(); paramIndex++) {
                         Object paramObj = rs.getObject(paramIndex);
                         FactorAttrRela factorAttrRela = factorAttrRelaOutList.get(paramIndex - 1);
-                        localMap.put(factorAttrRela.getEventAttrId().toString(), paramObj);
+                        localMap.put(getParamName(factorAttrRela.getEventAttrId()), paramObj);
                     }
                 }
             }
@@ -278,25 +281,25 @@ public class FactorEnchangeFactory {
         return false;
     }
 
-    public String getSqlText(Map<String, Object> localMap, String sql, List<Integer> paramNameList, List<Integer> paramTypeList, FactorEnchance factorEnchance, Integer medicalInsRuleInfoId) {
+    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(paramNameList)) {
-            for (int indx = 0; indx < paramNameList.size(); indx++) {
-                Integer name = paramNameList.get(indx);
+        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(name.toString());
+                Object paramObject = localMap.get(getParamName(paramId));
                 if (null == paramObject) {
-                    throw new NullPointerException("医保规则:" + medicalInsRuleInfoId + " 要素提取:" + factorEnchance.getFactorCatalog() + " 参数key:" + name);
+                    throw new NullPointerException("医保规则:" + medicalInsRuleInfoId + " 要素提取:" + factorEnchance.getFactorCatalog() + " 参数key:" + paramId + " 参数名:" + getParamName(paramId));
                 }
-                log.info("规则ID:{} 入参:{} 类型:{} 值:{}", medicalInsRuleInfoId, name, type, paramObject);
+                log.info("规则ID:{} 入参:{} 类型:{} 值:{}", medicalInsRuleInfoId, paramId, type, paramObject);
                 String whereColumn = null;
                 switch (ColumnTypeEnum.getType(type)) {
                     case ARRAY:
                         List<Object> paramList = (List<Object>) paramObject;
-                        whereColumn = getInStr(name, paramList);
+                        whereColumn = getInStr(paramId, paramList);
                         break;
                     case MAP:
-                        whereColumn = getMapStr(name, paramObject);
+                        whereColumn = getMapStr(paramId, paramObject);
                         break;
                     case STRING:
                         whereColumn = "'" + paramObject + "'";
@@ -321,12 +324,12 @@ public class FactorEnchangeFactory {
         return sql;
     }
 
-    public String getInStr(Integer name, List<Object> paramList) {
+    public String getInStr(Integer paramId, List<Object> paramList) {
         StringBuffer wheColumnStr = new StringBuffer(" (");
         for (Object param : paramList) {
-            log.error("字段属性名为:{} value:{} 类型:{}", name, param, param.getClass());
+            log.error("字段属性名为:{} value:{} 类型:{}", paramId, param, param.getClass());
             if (param instanceof Map) {
-                EventAttr eventAttr = enchanceAttrMap.get(name);
+                EventAttr eventAttr = enchanceAttrMap.get(paramId);
                 String proKey = eventAttr.getDispArgs();
                 Object value = ((Map<?, ?>) param).get(proKey);
                 if (value instanceof String) {
@@ -349,8 +352,8 @@ public class FactorEnchangeFactory {
         return wheColumnEndStr + ") ";
     }
 
-    public String getMapStr(Integer name, Object param) {
-        EventAttr eventAttr = enchanceAttrMap.get(name);
+    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) {

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

@@ -133,13 +133,13 @@ public class RuleEngine {
                     MedicalInsRuleProject medicalInsRuleProject = null;
                     for (int index = 0; index < medicalInsRuleProjectList.size(); index++) {
                         medicalInsRuleProject = medicalInsRuleProjectList.get(index);
-                        if (StringUtils.isNotBlank(medicalInsRuleProject.getProejctCode())) {
-                            if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProject.getProejctCode())) {
-                                itemCodeAndRuleIdMap.get(medicalInsRuleProject.getProejctCode()).add(medicalInsRuleProject.getMedicineInsRuleInfoId());
+                        if (StringUtils.isNotBlank(medicalInsRuleProject.getProjectCode())) {
+                            if (itemCodeAndRuleIdMap.containsKey(medicalInsRuleProject.getProjectCode())) {
+                                itemCodeAndRuleIdMap.get(medicalInsRuleProject.getProjectCode()).add(medicalInsRuleProject.getMedicineInsRuleInfoId());
                             } else {
                                 Set<Integer> ruleIdSet = new HashSet<>();
                                 ruleIdSet.add(medicalInsRuleProject.getMedicineInsRuleInfoId());
-                                itemCodeAndRuleIdMap.put(medicalInsRuleProject.getProejctCode(), ruleIdSet);
+                                itemCodeAndRuleIdMap.put(medicalInsRuleProject.getProjectCode(), ruleIdSet);
                             }
                         }
                         if (StringUtils.isNotBlank(medicalInsRuleProject.getCorrelationProjectCode())) {
@@ -173,7 +173,7 @@ public class RuleEngine {
      */
     public void setMIDProjectCodeToRedis(MedicalInsRuleProject medicalInsRuleProject) {
         redisTemplate.opsForHash().put(Constant.MEDICAL_RULE_CACHE_KEY + "_" + Constant.TREATMEN_TYPE_MID_INCIDENT_WARNING,
-                medicalInsRuleProject.getProejctCode(), medicalInsRuleProject.getMedicineInsRuleInfoId());
+                medicalInsRuleProject.getProjectCode(), medicalInsRuleProject.getMedicineInsRuleInfoId());
         if (StringUtils.isNotBlank(medicalInsRuleProject.getCorrelationProjectCode())) {
             redisTemplate.opsForHash().put(Constant.MEDICAL_RULE_CACHE_KEY + "_" + Constant.TREATMEN_TYPE_MID_INCIDENT_WARNING,
                     medicalInsRuleProject.getCorrelationProjectCode(), medicalInsRuleProject.getMedicineInsRuleInfoId());
@@ -204,9 +204,10 @@ public class RuleEngine {
             MidIncidentAudit midIncidentAudit = insertMidWarning(midIncidentWarningVO);
             insertLog(midIncidentWarningVO);
             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)){
+                if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
                     log.error("项目编码未匹配到对应的医保规则:{}", itemMap.get(Constant.MEDICAL_PROJECT_CODE_KEY));
                     continue;
                 }
@@ -218,7 +219,7 @@ public class RuleEngine {
                         medicalInsRuleInfoIdList.addAll(diagnoseMedicalInsRuleInfoIdList);
                     }
                 }
-                runEngine(itemMap, medicalInsRuleInfoIdList, midIncidentAudit, ipStr);
+                runEngine(auditDetailSet, itemMap, medicalInsRuleInfoIdList, midIncidentAudit, ipStr);
             }
         } finally {
             midIncidentWarningVOThreadLocal.remove();
@@ -239,8 +240,10 @@ public class RuleEngine {
         }
         midIncidentVisitLog.setDoctorAdviceNo(midIncidentWarningVO.getDoctor_advice_no());
         try {
-            Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyyMMdd");
-            midIncidentVisitLog.setInHospDate(inHospDate);
+            if(StringUtils.isNotBlank(midIncidentWarningVO.getIn_hosp_date())) {
+                Date inHospDate = DateUtils.parseDate(midIncidentWarningVO.getIn_hosp_date(), "yyyyMMdd");
+                midIncidentVisitLog.setInHospDate(inHospDate);
+            }
         } catch (ParseException e) {
             log.error(e.getMessage(), e);
         }
@@ -382,8 +385,8 @@ public class RuleEngine {
      *
      * @param paramMap
      */
-    public void runEngine(Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, String ipStr) {
-        if(CollectionUtil.isEmpty(medicalInsRuleInfoIdList)){
+    public void runEngine(Set<String> auditDetailSet, Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, String ipStr) {
+        if (CollectionUtil.isEmpty(medicalInsRuleInfoIdList)) {
             log.error("未有对应的规则,接口数据:{}", paramMap);
             return;
         }
@@ -400,17 +403,16 @@ public class RuleEngine {
             List<FactorEnchance> factorEnchanceList = factorEnchanceService.listByIds(factorEnchangeIdList);
             Map<Integer, List<FactorEnchance>> enchanceTypeMap = factorEnchanceList.stream().collect(Collectors.groupingBy(FactorEnchance::getFactorCatalog));
             for (Integer medicalRuleInsInfoId : enchanceTypeMap.keySet()) {
+                String auditDetailKeyStr = paramMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY) + "_" + medicalRuleInsInfoId;
+                if(auditDetailSet.contains(auditDetailKeyStr)){
+                    log.error("项目编码:{} 规则ID:{} 已经执行过规则引擎,此次忽略", paramMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY), medicalRuleInsInfoId);
+                    continue;
+                }
+                auditDetailSet.add(auditDetailKeyStr);
                 MedicalInsRuleInfo medicalInsRuleInfo = medicalInsRuleInfoService.getById(medicalRuleInsInfoId);
                 List<FactorEnchance> factorEnchanceListTemp = enchanceTypeMap.get(medicalRuleInsInfoId);
                 paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_INFO_ID, medicalRuleInsInfoId);
                 List<RuleFactorRela> ruleFactorRelaSortList = ruleIdAndFatorEnchanceIdMap.get(medicalRuleInsInfoId);
-//                List<MedicalInsRuleProject> medicalInsRuleProjectList = medicalInsRuleProjectService.lambdaQuery().eq(MedicalInsRuleProject::getMedicineInsRuleInfoId, medicalRuleInsInfoId).list();
-//                if(CollectionUtil.isNotEmpty(medicalInsRuleProjectList)) {
-//                    String projectJsonStr = JSON.toJSONString(medicalInsRuleProjectList);
-//                    List<Map<String,Object>> projectList = (List<Map<String, Object>>) JSON.parse(projectJsonStr);
-//                    paramMap.put(SystemEventAttrConstant.MEDICAL_INS_RULE_PROJECT, projectList);
-//
-//                }
 
                 factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
             }