Bladeren bron

fix 费用管理承保规则且和或的条件校验

liub 3 maanden geleden
bovenliggende
commit
4feac42339

+ 12 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -195,6 +195,18 @@ public interface OrgClient {
     @GetMapping(value = "/agreementRules/getRuleInfo")
     @GetMapping(value = "/agreementRules/getRuleInfo")
     HttpResult getRuleInfo(@RequestParam("ruleId") String ruleId);
     HttpResult getRuleInfo(@RequestParam("ruleId") String ruleId);
 
 
+    /**
+     * 获取承保规则实体(含parentId)
+     */
+    @GetMapping(value = "/agreementRules/rulesGet")
+    HttpResult rulesGet(@RequestParam("ruleId") String ruleId);
+
+    /**
+     * 根据父ID查询子规则列表
+     */
+    @GetMapping(value = "/agreementRules/rulesListByParentId")
+    HttpResult rulesListByParentId(@RequestParam("parentId") String parentId);
+
     /**
     /**
      * 添加应收
      * 添加应收
      *
      *

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

@@ -24,8 +24,10 @@ import org.aspectj.lang.annotation.Before;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Objects;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 
 @Slf4j
 @Slf4j
 @Aspect
 @Aspect
@@ -98,20 +100,47 @@ public class AuditVerificationAspect {
             PtlAgreementCost ptlAgreementCost = JSONObject.parseObject(JSONObject.toJSONString(httpResult.getData()),PtlAgreementCost.class);
             PtlAgreementCost ptlAgreementCost = JSONObject.parseObject(JSONObject.toJSONString(httpResult.getData()),PtlAgreementCost.class);
             AssertionUtils.isFail(Objects.isNull(ptlAgreementCost),"费用查找失败");
             AssertionUtils.isFail(Objects.isNull(ptlAgreementCost),"费用查找失败");
             String coverRuleId = ptlAgreementCost.getCoverRuleId();
             String coverRuleId = ptlAgreementCost.getCoverRuleId();
-            httpResult = orgClient.getRuleInfo(coverRuleId);
-            AssertionUtils.isFail(httpResult.getCode() == 500,"承保规则查找失败");
-            List<PtlAgreementUndwrtRulesAttrLink> attrLinks = JSONArray.parseArray(JSONObject.toJSONString(httpResult.getData()),PtlAgreementUndwrtRulesAttrLink.class);
+
+            // 查询承保规则实体,判断是否有parentId
+            HttpResult ruleResult = orgClient.rulesGet(coverRuleId);
+            AssertionUtils.isFail(ruleResult.getCode() == 500, "承保规则查找失败");
+            PtlAgreementUndwrtRules ruleEntity = JSONObject.parseObject(JSONObject.toJSONString(ruleResult.getData()), PtlAgreementUndwrtRules.class);
+
+            List<String> ruleIds = new ArrayList<>();
+            if (ruleEntity != null && ruleEntity.getParentId() != null && !ruleEntity.getParentId().isEmpty()) {
+                // 有parentId → 根据parentId查询所有子规则(多条)
+                HttpResult childRulesResult = orgClient.rulesListByParentId(ruleEntity.getParentId());
+                AssertionUtils.isFail(childRulesResult.getCode() == 500, "子规则查找失败");
+                List<PtlAgreementUndwrtRules> childRules = JSONArray.parseArray(JSONObject.toJSONString(childRulesResult.getData()), PtlAgreementUndwrtRules.class);
+                if (childRules != null) {
+                    ruleIds.addAll(childRules.stream().map(PtlAgreementUndwrtRules::getId).collect(Collectors.toList()));
+                }
+            } else {
+                // 无parentId → 使用当前规则
+                ruleIds.add(coverRuleId);
+            }
+
+            // 收集所有规则的属性关联(按规则分组)
+            List<List<PtlAgreementUndwrtRulesAttrLink>> ruleGroups = new ArrayList<>();
+            for (String ruleId : ruleIds) {
+                httpResult = orgClient.getRuleInfo(ruleId);
+                AssertionUtils.isFail(httpResult.getCode() == 500, "承保规则详情查找失败");
+                List<PtlAgreementUndwrtRulesAttrLink> ruleAttrLinks = JSONArray.parseArray(JSONObject.toJSONString(httpResult.getData()), PtlAgreementUndwrtRulesAttrLink.class);
+                if (ruleAttrLinks != null && !ruleAttrLinks.isEmpty()) {
+                    ruleGroups.add(ruleAttrLinks);
+                }
+            }
 
 
             StringBuilder logs = new StringBuilder();
             StringBuilder logs = new StringBuilder();
 
 
             //先进行承保规则判断
             //先进行承保规则判断
-            verificationRules(attrLinks,logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks,
+            verificationRules(ruleGroups,logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks,
                     insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, insOrders);
                     insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, insOrders);
         }
         }
     }
     }
 
 
 
 
-    private void verificationRules(List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesNews, StringBuilder logs,
+    private void verificationRules(List<List<PtlAgreementUndwrtRulesAttrLink>> ruleGroups, StringBuilder logs,
                                      InsOrdersOther insOrdersOther, InsOrdersCarInfo insOrdersCarInfo,
                                      InsOrdersOther insOrdersOther, InsOrdersCarInfo insOrdersCarInfo,
                                      List<InsOrdersRisk> riskList, List<InsOrdersCarUserInfo> insOrdersCarUserInfos,
                                      List<InsOrdersRisk> riskList, List<InsOrdersCarUserInfo> insOrdersCarUserInfos,
                                      List<InsOrdersKind> kindList, InsOrdersCosts insOrdersCosts,
                                      List<InsOrdersKind> kindList, InsOrdersCosts insOrdersCosts,
@@ -129,15 +158,38 @@ public class AuditVerificationAspect {
                 riskList, insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, isNewCar);
                 riskList, insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, isNewCar);
 
 
         List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList = ptlNewAgreementClient.getUndwrtRulesDictList();
         List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList = ptlNewAgreementClient.getUndwrtRulesDictList();
-        for (int i = 0; i < ruleAttrMappingVoList.size(); i++) {
-//            logs.append("触发承保规则:" + ruleAttrMappingVoList.get(i).getAttrCode() + "\n");
-            //判断是否匹配
-            if (!FactorMatch.judgementsUnderwrite(ptlAgreementUndwrtRulesNews, ruleAttrMappingVoList, undwrtRulesAttrList, logs, undwrtRulesDictList)) {
-                throw new SystemException(logs.toString());
-            }else{
-                //如果没有出现异常则清空匹配消息
-                logs.delete(0,logs.length());
+
+        // 多条规则间为OR关系:只要任一条规则匹配即通过
+        StringBuilder allErrorLogs = new StringBuilder();
+        boolean anyRuleMatched = false;
+
+        for (List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesNews : ruleGroups) {
+            if (ptlAgreementUndwrtRulesNews == null || ptlAgreementUndwrtRulesNews.isEmpty()) {
+                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());
+                }
+            }
+
+            if (ruleMatched) {
+                anyRuleMatched = true;
+                break; // OR关系:任一条规则通过即可
+            }
+            allErrorLogs.append(ruleLogs);
+        }
+
+        if (!anyRuleMatched) {
+            throw new SystemException(allErrorLogs.toString());
         }
         }
     }
     }
 
 

+ 36 - 16
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -255,35 +255,55 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
                 throw new SystemException("批量模式下父规则ID不能为空");
                 throw new SystemException("批量模式下父规则ID不能为空");
             }
             }
 
 
-            // 删除旧的所有子规则及其关联属性
+            // 查询旧的所有子规则(按order_num升序,与新增顺序一致)
             List<AgreementRulesVo> oldRules = baseMapper.queryListByParentId(parentId);
             List<AgreementRulesVo> oldRules = baseMapper.queryListByParentId(parentId);
-            if (CollUtil.isNotEmpty(oldRules)) {
-                for (AgreementRulesVo oldRule : oldRules) {
-                    agreementUndwrtRulesAttrLinkService.remove(new LambdaQueryWrapper<PtlAgreementUndwrtRulesAttrLink>()
-                            .eq(PtlAgreementUndwrtRulesAttrLink::getRulesId, oldRule.getId()));
-                    baseMapper.deleteById(oldRule.getId());
-                }
-            }
-
-            // 重新创建子规则
+            int oldSize = CollUtil.isNotEmpty(oldRules) ? oldRules.size() : 0;
             List<RulesGroupParam> groups = param.getRulesGroups();
             List<RulesGroupParam> groups = param.getRulesGroups();
+
+            // 1. 按索引匹配:已有规则复用ID做UPDATE,多出的做INSERT
             for (int i = 0; i < groups.size(); i++) {
             for (int i = 0; i < groups.size(); i++) {
                 RulesGroupParam group = groups.get(i);
                 RulesGroupParam group = groups.get(i);
+                boolean isExisting = i < oldSize;
+                // 复用已有规则ID,保持cover_rule_id引用不失效
+                String ruleId = isExisting ? oldRules.get(i).getId() : IdGenerate.nextId();
+
+                // 已有规则需先清除旧的属性关联
+                if (isExisting) {
+                    agreementUndwrtRulesAttrLinkService.remove(new LambdaQueryWrapper<PtlAgreementUndwrtRulesAttrLink>()
+                            .eq(PtlAgreementUndwrtRulesAttrLink::getRulesId, ruleId));
+                }
+
+                List<PtlAgreementUndwrtRulesAttrLink> andAttrLinks = processAndAttrs(group.getRulesAttrList(), undwrtRulesAttrList, ruleId);
+                if (CollUtil.isNotEmpty(andAttrLinks)) {
+                    agreementUndwrtRulesAttrLinkMapper.insert(andAttrLinks);
+                }
+
                 PtlAgreementUndwrtRules rules = new PtlAgreementUndwrtRules();
                 PtlAgreementUndwrtRules rules = new PtlAgreementUndwrtRules();
-                rules.setId(IdGenerate.nextId());
+                rules.setId(ruleId);
                 rules.setOrderNum(i + 1);
                 rules.setOrderNum(i + 1);
                 rules.setStartTime(param.getStartTime());
                 rules.setStartTime(param.getStartTime());
                 rules.setEndTime(param.getEndTime());
                 rules.setEndTime(param.getEndTime());
                 rules.setAgreementId(param.getAgreementId());
                 rules.setAgreementId(param.getAgreementId());
                 rules.setParentId(parentId);
                 rules.setParentId(parentId);
+                rules.setRuleDescription(buildDesc(andAttrLinks, undwrtRulesAttrList));
 
 
-                List<PtlAgreementUndwrtRulesAttrLink> andAttrLinks = processAndAttrs(group.getRulesAttrList(), undwrtRulesAttrList, rules.getId());
-                if (CollUtil.isNotEmpty(andAttrLinks)) {
-                    agreementUndwrtRulesAttrLinkMapper.insert(andAttrLinks);
+                if (isExisting) {
+                    baseMapper.updateById(rules);
+                } else {
+                    baseMapper.insert(rules);
                 }
                 }
-                rules.setRuleDescription(buildDesc(andAttrLinks, undwrtRulesAttrList));
-                baseMapper.insert(rules);
             }
             }
+
+            // 2. 删除多余的旧规则(新规则数量 < 旧规则数量时才触发)
+            if (oldSize > groups.size()) {
+                for (int i = groups.size(); i < oldSize; i++) {
+                    AgreementRulesVo oldRule = oldRules.get(i);
+                    agreementUndwrtRulesAttrLinkService.remove(new LambdaQueryWrapper<PtlAgreementUndwrtRulesAttrLink>()
+                            .eq(PtlAgreementUndwrtRulesAttrLink::getRulesId, oldRule.getId()));
+                    baseMapper.deleteById(oldRule.getId());
+                }
+            }
+
             return true;
             return true;
         }
         }