Prechádzať zdrojové kódy

规则引擎排序问题修改

0027005599 2 rokov pred
rodič
commit
cd786016e1

+ 2 - 4
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/controller/HisController.java

@@ -100,12 +100,10 @@ public class HisController extends JeecgController<Audit, IAuditService> {
     @ApiOperation(value="事中提醒接口", notes="事中提醒接口调用")
     @PostMapping(value = "/midIncidentWarning")
     public Result<String> midIncidentWarning(@RequestBody MidIncidentWarningVO midIncidentWarningVO,HttpServletRequest httpServletRequest) {
-        String jsonStr = JSON.toJSONString(midIncidentWarningVO);
+
         String ipStr = HttpUtils.getIPAddress(httpServletRequest);
         log.info("远端请求的服务ip地址:{}", ipStr);
-        log.info("事中提醒接收报文:{}", jsonStr);
-        JSONObject paramMap = JSON.parseObject(jsonStr);
-        ruleEngine.dealMidInterfaceEngin("midIncidentWarning", paramMap, midIncidentWarningVO, ipStr);
+        ruleEngine.dealMidInterfaceEngin("midIncidentWarning", midIncidentWarningVO, ipStr);
         return Result.OK("添加成功!");
     }
 

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

@@ -33,7 +33,7 @@ public class MidIncidentAuditDiagnose implements Serializable {
     private static final long serialVersionUID = 1L;
 
 	/**主键ID*/
-	@TableId(type = IdType.ASSIGN_ID)
+	@TableId(type = IdType.AUTO)
     @ApiModelProperty(value = "主键ID")
     private java.lang.Integer id;
 	/**事中提醒工单ID*/

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

@@ -19,6 +19,7 @@ import org.jeecg.modules.medical.entity.MedicalInsRuleInfo;
 import org.jeecg.modules.medical.entity.MidIncidentAudit;
 import org.jeecg.modules.medical.entity.MidIncidentAuditDetail;
 import org.jeecg.modules.medical.entity.MidIncidentWarningVO;
+import org.jeecg.modules.medical.entity.RuleFactorRela;
 import org.jeecg.modules.medical.ruleengine.dict.DictUtil;
 import org.jeecg.modules.medical.service.IEventAttrService;
 import org.jeecg.modules.medical.service.IFactorAttrRelaService;
@@ -36,6 +37,7 @@ 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;
 
 /**
@@ -76,16 +78,17 @@ public class FactorEnchangeFactory {
 
 
 
-    public boolean runFactorEnchange(Integer medicalInfoRuleInfoId, MedicalInsRuleInfo medicalInsRuleInfo, MidIncidentAudit midIncidentAudit, Map<String, Object> localMap, List<Integer> factorEnchanceIdList, List<FactorEnchance> factorEnchanceList) {
+    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;
-        for (Integer factorEnchanceId : factorEnchanceIdList) {
+        for (RuleFactorRela ruleFactorRela : ruleFactorRelaList) {
+            Integer factorEnchanceId = ruleFactorRela.getFactorEnhanceId();
             FactorEnchance factorEnchance = factorEnchanceMap.get(factorEnchanceId);
             if (null == factorEnchance) {
                 continue;
             }
 
-            EnchanceTypeEnum enchanceTypeEnum = EnchanceTypeEnum.getType(factorEnchanceId);
+            EnchanceTypeEnum enchanceTypeEnum = EnchanceTypeEnum.getType(factorEnchance.getEnhanceType());
             switch (enchanceTypeEnum) {
                 case SQL:
                     Map<Integer, List<FactorAttrRela>> ioTypeMap = getIoMap(factorEnchanceId);
@@ -281,7 +284,7 @@ public class FactorEnchangeFactory {
             for (int indx = 0; indx < paramNameList.size(); indx++) {
                 Integer name = paramNameList.get(indx);
                 Integer type = paramTypeList.get(indx);
-                Object paramObject = localMap.get(name);
+                Object paramObject = localMap.get(name.toString());
                 if (null == paramObject) {
                     throw new NullPointerException("医保规则:" + medicalInsRuleInfoId + " 要素提取:" + factorEnchance.getFactorCatalog() + " 参数key:" + name);
                 }

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

@@ -2,6 +2,7 @@ package org.jeecg.modules.medical.ruleengine;
 
 import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -188,7 +189,7 @@ public class RuleEngine {
         return null;
     }
 
-    public Result dealMidInterfaceEngin(String intefName, Map<String, Object> paramMap, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
+    public Result dealMidInterfaceEngin(String intefName, MidIncidentWarningVO midIncidentWarningVO, String ipStr) {
         midIncidentWarningVOThreadLocal.set(midIncidentWarningVO);
         try {
             List<RuleAttr> ruleAttrList = interfRuleAttrList.get(intefName);
@@ -196,13 +197,19 @@ public class RuleEngine {
                 return Result.error("接口:" + intefName + " 未配置 对应的规则属性");
             }
             dictUtil.transferMidIncidentWarningVO(midIncidentWarningVO);
+            String jsonStr = JSON.toJSONString(midIncidentWarningVO);
+            log.info("事中提醒接收报文:{}", jsonStr);
+            JSONObject paramMap = JSON.parseObject(jsonStr);
             List<Map<String, Object>> itemList = interfItemListPlugin.findProIntersection(paramMap, ruleAttrList);
-
             MidIncidentAudit midIncidentAudit = insertMidWarning(midIncidentWarningVO);
             insertLog(midIncidentWarningVO);
             midIncidentAudit.setInterfName(intefName);
             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));
+                    continue;
+                }
                 Object diagnose = itemMap.get(Constant.MEDICAL_DIAGNOSE_CODE_KEY);
                 if (null != diagnose) {
                     //获取诊断编码配置的规则ID,加入需要执行的规则
@@ -376,6 +383,10 @@ public class RuleEngine {
      * @param paramMap
      */
     public void runEngine(Map<String, Object> paramMap, Set<Integer> medicalInsRuleInfoIdList, MidIncidentAudit midIncidentAudit, String ipStr) {
+        if(CollectionUtil.isEmpty(medicalInsRuleInfoIdList)){
+            log.error("未有对应的规则,接口数据:{}", paramMap);
+            return;
+        }
         LambdaQueryWrapper<RuleFactorRela> query = new LambdaQueryWrapper<RuleFactorRela>();
         query.eq(RuleFactorRela::getDelFlag, CommonConstant.DEL_FLAG_0);
         query.in(RuleFactorRela::getMedicalInsRuleInfoId, medicalInsRuleInfoIdList);
@@ -383,15 +394,16 @@ public class RuleEngine {
         List<RuleFactorRela> ruleFactorRelaList = ruleFactorRelaService.list(query);
 
         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));
-            List<Integer> factorEnchangeIdList = ruleFactorRelaList.stream().map(RuleFactorRela::getFactorEnhanceId).collect(Collectors.toList());
-            List<FactorEnchance> factorEnchanceList = factorEnchanceService.lambdaQuery().in(FactorEnchance::getId, factorEnchangeIdList).list();
-
+            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()) {
                 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);
@@ -400,7 +412,7 @@ public class RuleEngine {
 //
 //                }
 
-                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, factorEnchangeIdList, factorEnchanceListTemp);
+                factorEnchangeFactory.runFactorEnchange(medicalRuleInsInfoId, medicalInsRuleInfo, midIncidentAudit, paramMap, ruleFactorRelaSortList, factorEnchanceListTemp);
             }
         }
         webSocket.pushMessage(ipStr, JSON.toJSONString(midIncidentAudit));

+ 16 - 12
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/dict/DictUtil.java

@@ -100,14 +100,16 @@ public class DictUtil {
                     Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, diagnose.getDiagnose_code());
                     if (value == null) {
                         log.error("字段未配置该诊断编码映射的医保记录,项目:{}", diagnose);
-                    } else {
                         value = diagnose.getDiagnose_code();
-                    }
-                    diagnose.setMedical_diagnose_code(value.toString());
+                        diagnose.setMedical_diagnose_code(value.toString());
+                        diagnose.setMedical_diagnose_name(diagnose.getDiagnose_desc());
+                    }else {
+                        diagnose.setMedical_diagnose_code(value.toString());
 //                        itemMap.put(Constant.MEDICAL_DIAGNOSE_CODE_KEY, value);
-                    Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
-                    if (null != name) {
-                        diagnose.setMedical_diagnose_name(name.toString());
+                        Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
+                        if (null != name) {
+                            diagnose.setMedical_diagnose_name(name.toString());
+                        }
                     }
                 }
             }
@@ -119,14 +121,16 @@ public class DictUtil {
                     Object value = redisTemplate.opsForHash().get(Constant.HIS_MEDICAL_DICT_KEY, adviceDetailsVO.getProject_code());
                     if (value == null) {
                         log.error("字段未配置该项目编码映射的医保记录,项目:{}", adviceDetailsVO);
-                    } else {
                         value = adviceDetailsVO.getProject_code();
-                    }
-                    adviceDetailsVO.setMedical_project_code(value.toString());
+                        adviceDetailsVO.setMedical_project_code(value.toString());
+                        adviceDetailsVO.setMedical_project_name(adviceDetailsVO.getProject_name());
+                    }else {
+                        adviceDetailsVO.setMedical_project_code(value.toString());
 //                        itemMap.put(Constant.MEDICAL_DIAGNOSE_CODE_KEY, value);
-                    Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
-                    if (null != name) {
-                        adviceDetailsVO.setMedical_project_name(name.toString());
+                        Object name = redisTemplate.opsForHash().get(Constant.MEDICAL_CODE_NAME_KEY, value.toString());
+                        if (null != name) {
+                            adviceDetailsVO.setMedical_project_name(name.toString());
+                        }
                     }
                 }
             }

+ 1 - 1
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/medical/ruleengine/plugin/InterfItemListPlugin.java

@@ -35,7 +35,7 @@ public class InterfItemListPlugin {
                     if(CollectionUtil.isEmpty(itemList)){
                         itemList = pathValueList;
                     }else {
-                        setListToList(itemList, pathValueList, attrName);
+                        itemList = setListToList(itemList, pathValueList, attrName);
                     }
                 }else if(value instanceof Map){
                     Map<String,Object> pathValueMap = (Map) value;