Browse Source

定义 规则集、规则的返回结构

JoeLazy 3 months ago
parent
commit
c1a0d0a2dd

+ 23 - 6
src/main/java/com/sundata/internalevaluation/calc/calcUnit/RuleCalcUnit.java

@@ -6,7 +6,9 @@ import com.sundata.internalevaluation.calc.model.CalcUnit;
 import com.sundata.internalevaluation.calc.model.finals.CalcType;
 import com.sundata.internalevaluation.configuration.model.IndexConfigModel;
 import com.sundata.internalevaluation.configuration.model.SysReqRule;
+import com.sundata.internalevaluation.configuration.model.SysRuleIndex;
 import com.sundata.internalevaluation.configuration.service.IndexConfigService;
+import com.sundata.internalevaluation.configuration.service.SysReqRuleService;
 import com.sundata.internalevaluation.script.ScriptUtil;
 import com.sundata.internalevaluation.script.TemplateUtil;
 import org.slf4j.Logger;
@@ -120,25 +122,40 @@ public class RuleCalcUnit extends CalcUnit {
                      Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
         log.debug("计算{}:编号:{},名称:{},流水号:{}", getCalcType().getName(),getCalcCode(),getCalcName(),calculateInstanceNumber);
 
+        SysReqRuleService ruleService = SpringUtil.getBean(SysReqRuleService.class);
+        List<SysRuleIndex> sysRuleIndices = ruleService.selectRuleIndexListByRuleNo(getCalcCode());
+        Map<String, String> indexParamMap = sysRuleIndices.stream().collect(Collectors.toMap(SysRuleIndex::getIndexNo, SysRuleIndex::getRuleLogicParam));
 
         // 所有规则计算的结果
-        Map<String, Object> indexResult = new HashMap<>();
+        Map<String, Object> indexResMap = new HashMap<>();
 
         sourceResults.forEach((calcUnit, calcResult) -> {
-            indexResult.put(calcUnit.getCalcCode(), calcResult.get(calcUnit.getCalcCode()));
+            String key = indexParamMap.get(calcUnit.getCalcCode());
+            Object value = calcResult.get(calcUnit.getCalcCode());
+            indexResMap.put(key, value);
         });
 
         // 规则的模板
         String ruleTemplate = this.reqRule.getRuleTemplate();
 
         // 实际值替换变量
-        String script = TemplateUtil.execute("template-rule-" + getCalcCode(), ruleTemplate, indexResult);
+        String script = TemplateUtil.execute("template-rule-" + getCalcCode(), ruleTemplate, indexResMap);
 
-        // 执行脚本
-        Object res = ScriptUtil.executeScript("script-rule-" + getCalcCode(), script, indexResult);
+        // 执行脚本结果
+        Object res = ScriptUtil.executeScript("script-rule-" + getCalcCode(), script, indexResMap);
+
+
+        Map<String, Object> resMap = new HashMap<>();
+
+        resMap.put("scriptRes",res);
+        resMap.put("ruleNo", getCalcCode());
+        resMap.put("indexRes", indexResMap);
+        resMap.put("resultType", reqRule.getRuleResult());
+        resMap.put("ruleDesc",reqRule.getTemplateDesc());
+        resMap.put("ruleResult",TemplateUtil.execute("template-ruleConclusion-" + getCalcCode(),reqRule.getRuleConclusionTemplate(), indexResMap));
 
         // 放计算结果
-        thisResult.put(this.getCalcCode(), res);
+        thisResult.put(this.getCalcCode(), resMap);
 
         // 放实体
         thisResult.put("entity", this.reqRule);

+ 48 - 40
src/main/java/com/sundata/internalevaluation/calc/calcUnit/RulesCalcUnit.java

@@ -10,8 +10,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 
@@ -139,47 +141,53 @@ public class RulesCalcUnit extends CalcUnit {
                      Map<String, Object> context,
                      Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
 
-        log.debug("计算{}:编号:{},名称:{},流水号:{}", getCalcType().getName(),getCalcCode(),getCalcName(),calculateInstanceNumber);
-
-        // 规则结果为 true 的规则
-        List<Map.Entry<CalcUnit, CalcResult<String, Object>>> resIsTrue = sourceResults.entrySet().stream()
-                .filter(entry -> entry.getValue().get(entry.getKey().getCalcCode()).equals(true))
-                .collect(Collectors.toList());
-
-        //
-        Map<String, List<SysReqRule>> ruleListMap = resIsTrue.stream()
-                .collect(Collectors.groupingBy(e1 -> {
-                    SysReqRule o = (SysReqRule) e1.getValue().get("entity");
-                    return o.getRuleResult();
-                }, Collectors.mapping(e ->
-                        (SysReqRule) e.getValue().get("entity"), Collectors.toList()
-                )));
-
-
-        List<SysReqRule> interceptRuleList = ruleListMap.get("intercept");
-        List<SysReqRule> warnRuleList = ruleListMap.get("warn");
-
-        if (interceptRuleList != null && !interceptRuleList.isEmpty()) {
-            // 存在拦截的规则
-            // TODO  拦截处理
-            List<String> resList = interceptRuleList.stream().map(rule -> String.format("【%s】%s 触发 %s", rule.getRuleNo(), rule.getRuleName(), "拦截")).collect(Collectors.toList());
-            thisResult.put(getCalcCode(),resList);
-            return;
+        log.debug("计算{}:编号:{},名称:{},流水号:{}", getCalcType().getName(), getCalcCode(), getCalcName(), calculateInstanceNumber);
+
+        AtomicBoolean isIntercept = new AtomicBoolean(false);
+        AtomicBoolean isWarn = new AtomicBoolean(false);
+
+
+        List<Map<String, Object>> list = new ArrayList<>();
+
+
+        sourceResults.forEach((calcUnit, calcResult) -> {
+            list.add((Map) calcResult.get(calcUnit.getCalcCode()));
+        });
+
+        List<Map<String, Object>> hitRule = list.stream().filter(map -> {
+                    boolean isTrigger = false;
+                    Object o = map.get("scriptRes");
+                    if (o instanceof Boolean) {
+                        isTrigger = (Boolean) o;
+                    } else {
+                        isTrigger = "true".equals(map.get("scriptRes"));
+                    }
+                    boolean intercept = "1".equals(map.get("resultType"));
+                    boolean warn = "2".equals(map.get("resultType"));
+                    if (intercept) {
+                        isIntercept.set(true);
+                    }
+                    if (warn) {
+                        isWarn.set(true);
+                    }
+                    return isTrigger && (intercept || warn);
+                }
+        ).collect(Collectors.toList());
+
+
+        Map<String, Object> resMap = new HashMap<>();
+        resMap.put("hitRule", hitRule);
+        if (isIntercept.get()) {
+            // 表示拒绝
+            resMap.put("approResult", "2");
+        } else {
+            // 表示通过
+            resMap.put("approResult", "1");
         }
 
-
-
-        if (warnRuleList != null && !warnRuleList.isEmpty()) {
-            // 存在预警的规则
-            // TODO  预警处理
-            List<String> resList = warnRuleList.stream().map(rule -> String.format("【%s】%s 触发 %s", rule.getRuleNo(), rule.getRuleName(), "预警")).collect(Collectors.toList());
-            thisResult.put(getCalcCode(),resList);
-            return;
-        }
-
-
-        // 无拦截和预警
-        thisResult.put(this.getCalcCode(), "无拦截");
-
+        // TODO 获取规则集结论
+        String rulesConclusionTemplate = reqRules.getRulesConclusionTemplate();
+        resMap.put("approResultMsg", "【TODO...】" + rulesConclusionTemplate);
+        thisResult.put(getCalcCode(), resMap);
     }
 }

+ 3 - 1
src/main/java/com/sundata/internalevaluation/calc/util/CalcUtil.java

@@ -43,6 +43,8 @@ public class CalcUtil {
         SysReqRules rules = rulesService.getById(rulesNo);
 
         CalcUnit calcUnit = new RulesCalcUnit(rules.getRulesNo(),rules.getRulesName(),Map.of(),rules,SpringUtil.getBean(SysReqRuleService.class));
-        return calc(calculateInstanceNumber, calcUnit, context);
+        CalcTaskResult calc = calc(calculateInstanceNumber, calcUnit, context);
+        System.out.println(calc);
+        return calc;
     }
 }

+ 7 - 0
src/main/java/com/sundata/internalevaluation/configuration/mapper/SysReqRuleMapper.java

@@ -76,4 +76,11 @@ public interface SysReqRuleMapper {
 	 * @return 返回集合
 	 */
 	List<String> selectIndexByRuleNo(@Param("ruleNo") String ruleNo);
+
+	/**
+	 * 根据规则的编号  查询关联的指标
+	 * @param ruleNo 规则编号
+	 * @return 返回集合
+	 */
+	List<SysRuleIndex> selectRuleIndexListByRuleNo(@Param("ruleNo") String ruleNo);
 }

+ 10 - 0
src/main/java/com/sundata/internalevaluation/configuration/mybatis/SysReqRuleMapper.xml

@@ -214,6 +214,16 @@
     <select id="selectIndexByRuleNo" resultType="java.lang.String">
         select index_No from SYS_REQ_RULE_INDEX where RULE_NO = #{ruleNo}
     </select>
+    <select id="selectRuleIndexListByRuleNo"
+            resultType="com.sundata.internalevaluation.configuration.model.SysRuleIndex"
+            parameterType="java.lang.String">
+        select
+            rule_no as ruleNo,
+            index_no as indexNo,
+            rule_logic_param as ruleLogicParam
+            from sys_req_rule_index
+            where RULE_NO = #{ruleNo}
+    </select>
 
 
 </mapper>

+ 12 - 2
src/main/java/com/sundata/internalevaluation/configuration/service/SysReqRuleService.java

@@ -44,9 +44,9 @@ public class SysReqRuleService {
      */
     @Transactional
     public SysReqRule getById(String ruleNo) {
-        List<String> indexNoList = sysReqRuleMapper.selectIndexByRuleNo(ruleNo);
+//        List<String> indexNoList = sysReqRuleMapper.selectIndexByRuleNo(ruleNo);
         SysReqRule resEntity = sysReqRuleMapper.getById(ruleNo);
-        resEntity.setIndexNoList(indexNoList);
+//        resEntity.setIndexNoList(indexNoList);
         return resEntity;
     }
 	
@@ -127,5 +127,15 @@ public class SysReqRuleService {
     public List<SysReqRule> selectRuleListByRulesNo(String rulesNo) {
         return sysReqRuleMapper.selectRuleListByRulesNo(rulesNo);
     }
+
+
+    /**
+     * 根据规则的编号  查询关联的指标
+     * @param ruleNo 规则编号
+     * @return 返回集合
+     */
+    public List<SysRuleIndex> selectRuleIndexListByRuleNo(String ruleNo){
+        return sysReqRuleMapper.selectRuleIndexListByRuleNo(ruleNo);
+    }
 	
 }