Parcourir la source

处理的核保规则匹配、费用匹配问题

lixiaolong il y a 2 semaines
Parent
commit
8a372029a2

+ 19 - 63
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -111,7 +111,7 @@ public class FactorMatch {
             boolean useFlag;
             if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
                 // useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), false);
-                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), false, nameToCodeMap);
+                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), false);
             }else{
                 useFlag = false;
             }
@@ -220,12 +220,6 @@ public class FactorMatch {
                 return false;
             }
 
-            PtlAgreementUndwrtRulesAttr attrMeta = undwrtRulesAttrList.stream()
-                    .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
-                    .findFirst().orElse(null);
-
-            Map<String, String> nameToCodeMap = buildNameToCodeMap(attrMeta, undwrtRulesDictList);
-
 
             //查找 费用因子规则
             PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = undwrtRulesAttrList.stream()
@@ -239,7 +233,7 @@ public class FactorMatch {
                 ptlAgreementCostRule.setMax(ptlAgreementProductCostsAttrLink.getMax());
                 ptlAgreementCostRule.setOperator(ptlAgreementProductCostsAttrLink.getOperator());
                 ptlAgreementCostRule.setAttrCode(ptlAgreementProductCostsAttrLink.getAttrCode());
-                useFlag = attrEqual(ptlAgreementCostRule, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), true, nameToCodeMap);
+                useFlag = attrEqual(ptlAgreementCostRule, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), true);
                 log.info("承保规则校验-单属性匹配: attrCode={}, attrType={}, 规则值(min={}, max={}, operator={}), 传入值={}, useFlag={}",
                         ptlAgreementProductCostsAttrLink.getAttrCode(), ptlAgreementUndwrtRulesAttr.getAttrType(),
                         ptlAgreementProductCostsAttrLink.getMin(), ptlAgreementProductCostsAttrLink.getMax(),
@@ -262,35 +256,14 @@ public class FactorMatch {
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
                         .toList();
-
+                Integer dictId = collect.get(0).getDictId();
                 Map<String, String> codeToNameMap = new HashMap<>();
                 if (CollUtil.isNotEmpty(undwrtRulesDictList)) {
-                    String minStr = ptlAgreementProductCostsAttrLink.getMin();
-                    String maxStr = ptlAgreementProductCostsAttrLink.getMax();
-                    Set<String> ruleCodes = new HashSet<>();
-                    if (minStr != null) {
-                        for (String s : minStr.split(",")) {
-                            if (!s.trim().isEmpty()) ruleCodes.add(s.trim());
-                        }
-                    }
-                    if (maxStr != null) {
-                        for (String s : maxStr.split(",")) {
-                            if (!s.trim().isEmpty()) ruleCodes.add(s.trim());
-                        }
-                    }
                     for (PtlAgreementUndwrtRulesDictLabal label : undwrtRulesDictList) {
-                        if (ruleCodes.contains(label.getCode())) {
+                        if (Objects.equals(label.getDictId(), dictId)) {
                             codeToNameMap.put(label.getCode(), label.getName());
                         }
                     }
-                    if (codeToNameMap.isEmpty() && ptlAgreementUndwrtRulesAttr != null && ptlAgreementUndwrtRulesAttr.getDictId() != null) {
-                        Integer dictId = ptlAgreementUndwrtRulesAttr.getDictId();
-                        for (PtlAgreementUndwrtRulesDictLabal label : undwrtRulesDictList) {
-                            if (Objects.equals(label.getDictId(), dictId)) {
-                                codeToNameMap.put(label.getCode(), label.getName());
-                            }
-                        }
-                    }
                 }
                 if (ptlAgreementProductCostsAttrLink.getMin() != null) {
                     String min = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMin(), StrUtil.EMPTY);
@@ -307,40 +280,23 @@ public class FactorMatch {
                 if (CollUtil.isNotEmpty(collect)) {
                     logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
                 }
+                //如果有一个匹配上就返回
+                return true;
             }
         }
         log.info("承保规则校验-所有条件均未命中, 规则组通过, useFlag={}", useFlag);
         return groupUseFlag;
     }
 
-    /**
-     * 把传入的 value 标准化成"与规则同一形态":
-     *  - 如果 value 是字典名称,先翻成 code
-     *  - 如果 value 是 code,保持原样
-     *  - 如果是"是/否"类,做归一化
-     */
-    private static String normalizeValue(String value, PtlAgreementUndwrtRulesAttr attrMeta,
-                                         Map<String, String> nameToCodeMap) {
-        if (value == null) return null;
-        String v = value.trim();
-        if (CollUtil.isNotEmpty(nameToCodeMap) && nameToCodeMap.containsKey(v)) {
-            return nameToCodeMap.get(v);
-        }
-        return v;
-    }
-
     private static boolean attrEqual(PtlAgreementCostRule ptlAgreementCostRule,
-                              PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value,boolean isUnderwrite,
-                                     Map<String, String> nameToCodeMap) {
-
-        String normalizedValue = normalizeValue(value, ptlAgreementUndwrtRulesAttr, nameToCodeMap);
+                              PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value,boolean isUnderwrite) {
 
         if (ptlAgreementUndwrtRulesAttr == null || ptlAgreementUndwrtRulesAttr.getAttrType() == null) {
             // 没有元数据:无法得知 attrType,按"包含"语义做纯文本兜底比较
             // (BrandandModel 等 inputTag 大多是 contains 语义,与原逻辑 inputTextEqual 默认分支一致)
             log.warn("attrEqual 因子元数据缺失,按纯文本兜底比较, attrCode={}", ptlAgreementCostRule.getAttrCode());
-            if (ptlAgreementCostRule.getMin() == null || normalizedValue == null) return false;
-            String finalNormalizedValue = normalizedValue;
+            if (ptlAgreementCostRule.getMin() == null || value == null) return false;
+            String finalNormalizedValue = value;
             boolean contains = Arrays.stream(ptlAgreementCostRule.getMin().split(","))
                     .anyMatch(o -> finalNormalizedValue.contains(o.trim()));
             return isUnderwrite ? !contains : contains;
@@ -348,32 +304,32 @@ public class FactorMatch {
 
         boolean result = false;
         if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
-            result = checkBoxEqual(ptlAgreementCostRule, normalizedValue);
+            result = checkBoxEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")) {
-            result = inputNumberEqual(ptlAgreementCostRule, normalizedValue);
+            result = inputNumberEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("input") || ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputTag")) {
             //截取身份证号码
             if (ptlAgreementCostRule.getAttrCode().equals("CarOwnersIDNumber") || ptlAgreementCostRule.getAttrCode().equals("ApplicantIDNumber") ||
                     ptlAgreementCostRule.getAttrCode().equals("InsuredIDNumber")) {
-                normalizedValue = normalizedValue.substring(0, ptlAgreementCostRule.getMin().length());
+                value = value.substring(0, ptlAgreementCostRule.getMin().length());
             }
-            result = inputTextEqual(ptlAgreementCostRule, normalizedValue);
+            result = inputTextEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")) {
             //截取车牌
             if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("LicenseNo")) {
-                normalizedValue = normalizedValue.substring(0, 2);
+                value = value.substring(0, 4);
             }
-            result = selectEqual(ptlAgreementCostRule, normalizedValue);
+            result = selectEqual(ptlAgreementCostRule, value);
             //车龄
             if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("VehicleAge")) {
-                result = inputNumberEqual(ptlAgreementCostRule, normalizedValue);
+                result = inputNumberEqual(ptlAgreementCostRule, value);
             }
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
-            result = radioEqual(ptlAgreementCostRule, normalizedValue);
+            result = radioEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("datetime")){ // 时间
-            result = dateTimeEqual(ptlAgreementCostRule, normalizedValue);
+            result = dateTimeEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("date")){
-            result = dateEqual(ptlAgreementCostRule, normalizedValue);
+            result = dateEqual(ptlAgreementCostRule, value);
         }
         // 判断是否是承保规则
         if(isUnderwrite){

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

@@ -84,6 +84,7 @@ public class AuditVerificationAspect {
     @Before("@annotation(com.jzg.quotation.summary.aop.AuditVerification)")
     public void doBefore(JoinPoint point) {
         Object[] args = point.getArgs();
+        StringBuilder logs = new StringBuilder();
         for (Object arg : args) {
             try {
                 String orderNo = "";
@@ -180,8 +181,6 @@ public class AuditVerificationAspect {
                     }
                 }
 
-                StringBuilder logs = new StringBuilder();
-
                 //先进行承保规则判断
                 verificationRules(ruleGroups,logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks,
                         insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, insOrders);
@@ -192,6 +191,9 @@ public class AuditVerificationAspect {
                         e.contentUTF8(),
                         e);
                 throw new SystemException("承保规则校验服务暂时不可用,请稍后重试");
+            } catch (Exception e) {
+                log.error("承保规则校验异常, {}", logs.toString(), e);
+                throw new SystemException("承保规则校验异常,"+e.getMessage());
             }
         }
     }
@@ -220,7 +222,7 @@ public class AuditVerificationAspect {
 
         ruleAttrMappingVoList.forEach(ruleAttrMappingVo -> {
             if ("LicenseNo".equals(ruleAttrMappingVo.getAttrCode()) && ruleAttrMappingVo.getValue().startsWith("晋")) {
-                ruleAttrMappingVo.setValue(plateFourCodeMap.getOrDefault(ruleAttrMappingVo.getValue(), ruleAttrMappingVo.getValue()));
+                ruleAttrMappingVo.setValue(plateFourCodeMap.getOrDefault(ruleAttrMappingVo.getValue().substring(0, 2), ruleAttrMappingVo.getValue()));
             }
         });
 
@@ -251,16 +253,16 @@ public class AuditVerificationAspect {
             if (ruleMatched) {
                 anyRuleMatched = true;
                 log.info("规则组[{}]匹配成功, 订单通过!", groupIndex);
-                break; // OR关系:任一条规则通过即可
+                log.info("=== 承保规则校验成功,规则组[{}]通过 ===", groupIndex);
+                throw new SystemException(ruleLogs.toString());
             }
             allErrorLogs.append(ruleLogs);
         }
 
         if (!anyRuleMatched) {
-            log.info("=== 承保规则校验失败, 所有规则组均未通过, 抛出异常 ===");
-            throw new SystemException(allErrorLogs.toString());
+            log.info("=== 承保规则校验失败, 所有规则组均未通过 ===");
+            log.info("=== 承保规则校验需要通过 ===");
         }
-        log.info("=== 承保规则校验通过 ===");
     }
 
 }