فهرست منبع

fix 核保规则校验

liub 3 ماه پیش
والد
کامیت
3cf1c1f6a9

+ 50 - 13
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -35,8 +35,38 @@ public class FactorMatch {
      */
     public static boolean judgements(List<PtlAgreementCostRule> ptlAgreementCostRuleList, List<RuleAttrMappingVo> ruleAttrMappingVoList,
                                      List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs,  List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
-        boolean useFlag = true;
-        for (PtlAgreementCostRule ptlAgreementProductCostsAttrLink : ptlAgreementCostRuleList) {
+        if (ptlAgreementCostRuleList == null || ptlAgreementCostRuleList.isEmpty()) {
+            return false;
+        }
+        // 按batch分组:不同batch之间为OR关系,同batch内为AND关系
+        Map<String, List<PtlAgreementCostRule>> batchMap = ptlAgreementCostRuleList.stream()
+                .collect(Collectors.groupingBy(rule -> rule.getBatch() != null ? rule.getBatch() : "default",
+                        LinkedHashMap::new, Collectors.toList()));
+
+        StringBuilder errorLogs = new StringBuilder();
+        for (Map.Entry<String, List<PtlAgreementCostRule>> entry : batchMap.entrySet()) {
+            List<PtlAgreementCostRule> batchRules = entry.getValue();
+            StringBuilder batchLogs = new StringBuilder();
+            boolean batchMatched = doJudgementsMatch(batchRules, ruleAttrMappingVoList, undwrtRulesAttrList,
+                    batchLogs, undwrtRulesDictList);
+            if (batchMatched) {
+                // OR关系:只要任一个batch匹配即通过
+                return true;
+            }
+            errorLogs.append(batchLogs);
+        }
+        // 所有batch都未匹配,输出错误日志
+        logs.append(errorLogs);
+        return false;
+    }
+
+    /**
+     * 判断一个batch内的规则是否全部匹配(AND关系)
+     */
+    private static boolean doJudgementsMatch(List<PtlAgreementCostRule> batchRules, List<RuleAttrMappingVo> ruleAttrMappingVoList,
+                                             List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs,
+                                             List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
+        for (PtlAgreementCostRule ptlAgreementProductCostsAttrLink : batchRules) {
             //查找规则中的 传值属性
             RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
                     .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -59,8 +89,9 @@ public class FactorMatch {
                     .findFirst()
                     .get();
 
+            boolean useFlag;
             if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
-                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(),false);
+                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), false);
             }else{
                 useFlag = false;
             }
@@ -97,14 +128,13 @@ public class FactorMatch {
                 logs.append("传入的值:" + (StrUtil.isNotBlank(val) ? val : ruleAttrMappingVo.getValue()) + "\n");
 
                 if (CollUtil.isNotEmpty(collect)) {
-//                    logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
                     logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
                 }
 
                 return false;
             }
         }
-        return useFlag;
+        return true;
     }
 
 
@@ -119,8 +149,8 @@ public class FactorMatch {
                     .orElse(null);
             //如果查找不到 传值属性 直接费用对比失败
             if (ruleAttrMappingVo == null) {
-                log.info("传入的值找不到该属性:" + ptlAgreementProductCostsAttrLink.getAttrCode());
-                log.info("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+                log.info("承保规则校验-属性未找到: attrCode={}", ptlAgreementProductCostsAttrLink.getAttrCode());
+                log.info("承保规则校验-规则匹配失败: attrCode={}", ptlAgreementProductCostsAttrLink.getAttrCode());
 
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -144,14 +174,20 @@ public class FactorMatch {
                 ptlAgreementCostRule.setOperator(ptlAgreementProductCostsAttrLink.getOperator());
                 ptlAgreementCostRule.setAttrCode(ptlAgreementProductCostsAttrLink.getAttrCode());
                 useFlag = attrEqual(ptlAgreementCostRule, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), true);
+                log.info("承保规则校验-单属性匹配: attrCode={}, attrType={}, 规则值(min={}, max={}, operator={}), 传入值={}, useFlag={}",
+                        ptlAgreementProductCostsAttrLink.getAttrCode(), ptlAgreementUndwrtRulesAttr.getAttrType(),
+                        ptlAgreementProductCostsAttrLink.getMin(), ptlAgreementProductCostsAttrLink.getMax(),
+                        ptlAgreementProductCostsAttrLink.getOperator(), ruleAttrMappingVo.getValue(), useFlag);
             }else{
                 useFlag = false;
+                log.info("承保规则校验-传入值为null: attrCode={}, useFlag=false", ptlAgreementProductCostsAttrLink.getAttrCode());
             }
 
-            if (!useFlag) {
-                log.info("检验的值:" + ptlAgreementProductCostsAttrLink.getMin());
-                log.info("传入的值:" + ruleAttrMappingVo.getValue());
-                log.info("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+            if (useFlag) {
+                log.info("承保规则校验-条件命中! attrCode={}, 传入值={}, 规则min={}, max={}, operator={}",
+                        ptlAgreementProductCostsAttrLink.getAttrCode(), ruleAttrMappingVo.getValue(),
+                        ptlAgreementProductCostsAttrLink.getMin(), ptlAgreementProductCostsAttrLink.getMax(),
+                        ptlAgreementProductCostsAttrLink.getOperator());
 
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -173,10 +209,10 @@ public class FactorMatch {
                 }
                 if (ptlAgreementProductCostsAttrLink.getMin() != null) {
                     String min = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMin(), StrUtil.EMPTY);
-                    logs.append("检验的值4:" + (StrUtil.isNotBlank(min) ? min : ptlAgreementProductCostsAttrLink.getMin()) + "\n");
+                    logs.append("检验的值:" + (StrUtil.isNotBlank(min) ? min : ptlAgreementProductCostsAttrLink.getMin()) + "\n");
                 } else {
                     String max = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMax(), StrUtil.EMPTY);
-                    logs.append("检验的值5:" + (StrUtil.isNotBlank(max) ? max : ptlAgreementProductCostsAttrLink.getMax()) + "\n");
+                    logs.append("检验的值:" + (StrUtil.isNotBlank(max) ? max : ptlAgreementProductCostsAttrLink.getMax()) + "\n");
                 }
 
                 String val = codeToNameMap.getOrDefault(ruleAttrMappingVo.getValue(), StrUtil.EMPTY);
@@ -189,6 +225,7 @@ public class FactorMatch {
                 return false;
             }
         }
+        log.info("承保规则校验-所有条件均未命中, 规则组通过, useFlag={}", useFlag);
         return useFlag;
     }
 

+ 17 - 10
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/AuditVerificationAspect.java

@@ -159,38 +159,45 @@ public class AuditVerificationAspect {
 
         List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList = ptlNewAgreementClient.getUndwrtRulesDictList();
 
+        log.info("=== 承保规则校验开始, 规则组数={}, 传入属性数={} ===", ruleGroups == null ? 0 : ruleGroups.size(), ruleAttrMappingVoList.size());
+
         // 多条规则间为OR关系:只要任一条规则匹配即通过
         StringBuilder allErrorLogs = new StringBuilder();
         boolean anyRuleMatched = false;
 
+        int groupIndex = 0;
         for (List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesNews : ruleGroups) {
+            groupIndex++;
             if (ptlAgreementUndwrtRulesNews == null || ptlAgreementUndwrtRulesNews.isEmpty()) {
+                log.info("规则组[{}]为空, 跳过", groupIndex);
                 continue;
             }
-            boolean ruleMatched = true;
             StringBuilder ruleLogs = new StringBuilder();
 
-            for (int i = 0; i < ruleAttrMappingVoList.size(); i++) {
-                //判断是否匹配
-                if (!FactorMatch.judgementsUnderwrite(ptlAgreementUndwrtRulesNews, ruleAttrMappingVoList, undwrtRulesAttrList, ruleLogs, undwrtRulesDictList)) {
-                    ruleMatched = false;
-                    break;
-                }else{
-                    //如果没有出现异常则清空匹配消息
-                    ruleLogs.delete(0,ruleLogs.length());
-                }
+            log.info("规则组[{}]开始匹配, 条件数={}", groupIndex, ptlAgreementUndwrtRulesNews.size());
+            // 打印规则组详情
+            for (PtlAgreementUndwrtRulesAttrLink link : ptlAgreementUndwrtRulesNews) {
+                log.info("  -> 条件: attrCode={}, min={}, max={}, operator={}", link.getAttrCode(), link.getMin(), link.getMax(), link.getOperator());
             }
 
+            // 直接判断该规则组是否匹配,无需循环调用
+            boolean ruleMatched = FactorMatch.judgementsUnderwrite(ptlAgreementUndwrtRulesNews, ruleAttrMappingVoList, undwrtRulesAttrList, ruleLogs, undwrtRulesDictList);
+
+            log.info("规则组[{}]匹配结果: ruleMatched={}, 错误日志=[{}]", groupIndex, ruleMatched, ruleLogs.toString());
+
             if (ruleMatched) {
                 anyRuleMatched = true;
+                log.info("规则组[{}]匹配成功, 订单通过!", groupIndex);
                 break; // OR关系:任一条规则通过即可
             }
             allErrorLogs.append(ruleLogs);
         }
 
         if (!anyRuleMatched) {
+            log.info("=== 承保规则校验失败, 所有规则组均未通过, 抛出异常 ===");
             throw new SystemException(allErrorLogs.toString());
         }
+        log.info("=== 承保规则校验通过 ===");
     }
 
 }