فهرست منبع

Merge branch 'master' into wrq_dev

wangrq 3 ماه پیش
والد
کامیت
12739bb1a9

+ 9 - 3
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/entity/Request/HtCrawlerQuoteRequest.java

@@ -73,6 +73,9 @@ public class HtCrawlerQuoteRequest implements Serializable {
             RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
             VehicleAndVesselTaxVo taxVo = quoteVo.getVehicleAndVesselTaxVo();
             this.isFirstCount = "false";
+            if (limitAmount.contains(",")) {
+                this.transferFlag = limitAmount.split(",")[1];
+            }
             this.isGlmPrice = 0;
             if (ciRiskInfoVo != null) {
                 this.isInsureTraffic = "true";
@@ -87,7 +90,7 @@ public class HtCrawlerQuoteRequest implements Serializable {
             this.afloatValue = "0.0";
             this.hastax = this.isInsureTraffic;
             this.mealid = StringUtils.isBlank(mealid) ? "" : mealid;
-            List<CovListDTO> covListDTOS = getCovListDTOS(quoteVo, limitAmount);
+            List<CovListDTO> covListDTOS = getCovListDTOS(quoteVo, limitAmount.contains(",") ? limitAmount.split(",")[0] : limitAmount);
             this.covListJSON = JSON.toJSONString(covListDTOS);
             //this.covListJSON = "[{'comcoveragecode':'B','limitamount':'2000000','insteadwalkdailylimitamount':'2000000','coverageclasscode':'1','startdate':'2026-06-26 00:00:00','enddate':'2027-06-25 23:59:59','coveragecode':'1251','isdedu':'1','independentvalue':'','comcoveragename':'机动车第三者责任保险','deductible':'','basedpremium':'','benchmarkpremium':'','kindpremiun':'','deductiblerate':'','billdate':'2026-06-26 00:00:00','serviceTimes':'','serviceCode':''},{'comcoveragecode':'D11','limitamount':'20000','insteadwalkdailylimitamount':'20000','coverageclasscode':'1','startdate':'2026-06-26 00:00:00','enddate':'2027-06-25 23:59:59','coveragecode':'1251','isdedu':'1','independentvalue':'','comcoveragename':'机动车车上人员责任险(司机)','deductible':'','basedpremium':'','benchmarkpremium':'','kindpremiun':'','deductiblerate':'','billdate':'2026-06-26 00:00:00','serviceTimes':'','serviceCode':''},{'comcoveragecode':'D12','limitamount':'20000','insteadwalkdailylimitamount':'20000','coverageclasscode':'1','startdate':'2026-06-26 00:00:00','enddate':'2027-06-25 23:59:59','coveragecode':'1251','isdedu':'1','independentvalue':'','comcoveragename':'机动车车上人员责任险(乘客)','deductible':'','basedpremium':'','benchmarkpremium':'','kindpremiun':'','deductiblerate':'','billdate':'2026-06-26 00:00:00','serviceTimes':'','serviceCode':''},{'comcoveragecode':'BZ','coveragecode':'1002','startdate':'2026-06-26 00:00:00','enddate':'2027-06-25 23:59:59','comcoveragename':'机动车交通事故责任强制保险','billdate':'2026-06-26 00:00:00','limitamount':'200000'}]";
             this.coveragecode = "1251";
@@ -223,8 +226,8 @@ public class HtCrawlerQuoteRequest implements Serializable {
                     covListDTO.setComcoveragename(kindInfoVo.getKindName());
                     // A机动车损失保险 B机动车第三者责任保险 D11机动车车上人员责任险(司机) D12机动车车上人员责任险(乘客)
                     if(kindInfoVo.getKindCode().equals("A")) {
-                        covListDTO.setLimitamount(limitAmount);
-                        covListDTO.setInsteadwalkdailylimitamount(limitAmount);
+                        covListDTO.setLimitamount(limitAmount.contains(",") ? limitAmount.split(",")[0] : limitAmount);
+                        covListDTO.setInsteadwalkdailylimitamount(limitAmount.contains(",") ? limitAmount.split(",")[0] : limitAmount);
                     } else if (kindInfoVo.getKindCode().equals("SR")){
                         covListDTO.setLimitamount("");
                     }else {
@@ -327,6 +330,9 @@ public class HtCrawlerQuoteRequest implements Serializable {
         @JsonProperty("isFirstCount")
         private String isFirstCount;
 
+        @JsonProperty("transferFlag")
+        private String transferFlag;
+
         @JsonProperty("isGlmPrice")
         private Integer isGlmPrice;
 

+ 14 - 3
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java

@@ -108,6 +108,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private static final Pattern PAT_QNO_SPECIAL = Pattern.compile("name=\"quotationNo\" value=\"(.*?)\"");
     private static final Pattern PAT_MEAL_ID = Pattern.compile("\"mealid\":\"(.*?)\"");
     private static final Pattern LIMIT_AMOUNT = Pattern.compile("value=\"(.*?)\" id=\"js_actualvalue\"");
+    private static final Pattern TRANSFER_FLAG = Pattern.compile("\"erroeType\":\"(.*?)\"");
     private static final Pattern PAT_END_DATE = Pattern.compile("终保日期\\s*([^;]+)");
     private static final Pattern RESPONSE_ERR = Pattern.compile("(\"infoName\"\\s*:\\s*\"([^\"]*)\",\\s*\"infomsg\"\\s*:\\s*\"([^\"]*)\"|\"erroeInfo\"\\s*:\\s*\"([^\"]*)\")",Pattern.DOTALL);
 
@@ -634,7 +635,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         log.info("报价结果: {}", convertResponseMsg(decryptData));
         if (decryptData.contains("未传送车辆过户标志")) {
             log.error("报价失败: {}", convertResponseMsg(decryptData));
-            throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
+            throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData)+(decryptData.contains("1251BI") ? ",请勾选'商业险是否过户'选项" : ""));
         }
         if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo") && !duplQuoteResult.dupl()) {
             log.error("报价失败: {}", convertResponseMsg(decryptData));
@@ -647,12 +648,22 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
             decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
             return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
         }
-        HtCrawlerQuoteResponse.DataDTO data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
+        if (decryptData.contains("传送了车辆过户标志,请确认")) {
+            Pattern pattern = Pattern.compile(TRANSFER_FLAG.pattern());
+            Matcher matcher = pattern.matcher(decryptData);
+            String transferFlag =  "";
+            if (matcher.find()) transferFlag = matcher.group(1);
+            decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount+","+transferFlag, "", personalInsuredJSON), h);
+            return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
+        }
+        HtCrawlerQuoteResponse.DataDTO data = null;
+        data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
+
         if (data.getApplicationdto() != null && !decryptData.contains("车损险保额不能高于")) return data;
 
         List<HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO> list =
                 data.getBasepartdtolist() != null ? data.getBasepartdtolist().getBasepartdto() : null;
-        if ((list == null || list.isEmpty()) && !decryptData.contains("车损险保额不能高于")) return data;
+        if ((list == null || list.isEmpty()) && !decryptData.contains("车损险保额不能高于")) throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
 
         for (int i = 0; i < MAX_RETRIES; i++) {
             String basePartJSON = buildBasePartJSON(list);

+ 19 - 5
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestBuilder.java

@@ -1674,9 +1674,11 @@ public class RenBaoNewCrawlerRequestBuilder {
         prpCitemCar.put("runAreaName", "中华人民共和国境内(不含港澳台)");
         prpCitemCar.put("countryNature", "03");
         prpCitemCar.put("countryNature1", "03");
-        prpCitemCar.put("chgOwnerFlag", "0");
+        // 过户车标志(与 Python transferFlag 逻辑一致)
+        boolean isTransfer = carInfo.isTransfer();
+        prpCitemCar.put("chgOwnerFlag", isTransfer ? "1" : "0");
         prpCitemCar.put("loanVehicleFlag", "0");
-        prpCitemCar.put("transferVehicleFlag", "0");
+        prpCitemCar.put("transferVehicleFlag", isTransfer ? "1" : "0");
         prpCitemCar.put("newCarFlag", "0");
         prpCitemCar.put("nonLocalFlag", "0");
         prpCitemCar.put("queryArea", queryArea != null ? queryArea : "140000");
@@ -1767,7 +1769,9 @@ public class RenBaoNewCrawlerRequestBuilder {
         prpCitemCar.put("tonCountLastYear", "");
 
         // ========== 过户相关 ==========
-        prpCitemCar.put("chgOwnerDate", "");
+        // 过户日期(与 Python transferDate / chgOwnerDate 一致)
+        String transferDate = carInfo.getTransferDate();
+        prpCitemCar.put("chgOwnerDate", isTransfer && transferDate != null ? transferDate : "");
         prpCitemCar.put("lastYearTransferFlag", "");
         prpCitemCar.put("lastYearTransferDate", "");
 
@@ -1833,7 +1837,17 @@ public class RenBaoNewCrawlerRequestBuilder {
         prpCitemCar.put("startAreaName", "");
         prpCitemCar.put("endAreaName", "");
         prpCitemCar.put("invoiceNo", "");
-        prpCitemCar.put("usedCarInvoiceAmount", "");
+        // 过户车发票金额(与 Python usedCarInvoiceAmount 一致:actualValue * priceCoefficient)
+        String usedCarInvoiceAmount = "";
+        if (isTransfer && actualValue != null && !actualValue.isEmpty()) {
+            try {
+                double amount = Double.parseDouble(actualValue);
+                usedCarInvoiceAmount = String.format("%.2f", amount);
+            } catch (NumberFormatException e) {
+                log.warn("过户车发票金额计算失败, actualValue=[{}]", actualValue);
+            }
+        }
+        prpCitemCar.put("usedCarInvoiceAmount", usedCarInvoiceAmount);
         prpCitemCar.put("hkLicenseNo", "");
         prpCitemCar.put("hkLicenseNoDis", true);
         prpCitemCar.put("ciRateRloatFlag", "01");
@@ -1931,7 +1945,7 @@ public class RenBaoNewCrawlerRequestBuilder {
         ));
         prpCitemCar.put("brandNameInfoAck", false);
         prpCitemCar.put("piccCarInfoFlag", false);
-        prpCitemCar.put("transferDate", "");
+        prpCitemCar.put("transferDate", isTransfer && transferDate != null ? transferDate : "");
         prpCitemCar.put("modelDemandNo", "");
         prpCitemCar.put("vehicleStyleUniqueId", "");
         prpCitemCar.put("monopolyCode", "");

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

@@ -16,6 +16,7 @@ import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.summary.aop.FactorMatch;
 import com.jzg.quotation.summary.client.PtlNewAgreementClient;
 import com.jzg.quotation.summary.service.*;
+import feign.FeignException;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.JoinPoint;
@@ -65,77 +66,90 @@ public class AuditVerificationAspect {
     public void doBefore(JoinPoint point) {
         Object[] args = point.getArgs();
         for (Object arg : args) {
-            String orderNo = "";
-            if (arg instanceof UnderwritingVo){
-                UnderwritingVo underwritingVo = JSONObject.parseObject(JSONObject.toJSONString(arg), UnderwritingVo.class);
-                orderNo = underwritingVo.getOrder().getOrdersNo();
-            }
+            try {
+                String orderNo = "";
+                if (arg instanceof UnderwritingVo){
+                    UnderwritingVo underwritingVo = JSONObject.parseObject(JSONObject.toJSONString(arg), UnderwritingVo.class);
+                    orderNo = underwritingVo.getOrder().getOrdersNo();
+                }
 
-            InsOrders insOrders = insOrdersService.getById(orderNo);
-            AssertionUtils.isFail(Objects.isNull(insOrders),"订单不存在");
-            //查找费用 找不到则抛出异常
-            InsFeeOrders insFeeOrders = insFeeOrdersService.getById(orderNo);
-            AssertionUtils.isFail(Objects.isNull(insFeeOrders),"费用信息不匹配");
-
-
-            // 获取订单车辆信息
-            InsOrdersCarInfo insOrdersCarInfo = insOrdersCarInfoService.getById(insOrders.getId());
-            // 获取订单险种信息
-            List<InsOrdersRisk> insOrdersRisks = insOrdersRiskService.list(new LambdaQueryWrapper<InsOrdersRisk>().eq(InsOrdersRisk::getOrderNo, insOrders.getId()));
-            // 获取订单车主、投被保人信息
-            List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.list(new LambdaQueryWrapper<InsOrdersCarUserInfo>().eq(InsOrdersCarUserInfo::getOrderNo, insOrders.getId()));
-            // 获取订单费用信息
-            InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
-            // 获取订单险种信息
-            List<InsOrdersKind> kindList = insOrdersKindService.list(new LambdaQueryWrapper<InsOrdersKind>().eq(InsOrdersKind::getOrderNo, insOrders.getId()));
-            // 获取订单驾意险信息
-            InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getById(insOrders.getId());
-            // 获取订单其他信息
-            InsOrdersOther insOrdersOther = insOrdersOtherService.getById(insOrders.getId());
-
-            // 通过费用id 查找规则id
-            String costId = insFeeOrders.getCostId();
-            HttpResult httpResult = orgClient.queryCostById(costId);
-            AssertionUtils.isFail(httpResult.getCode() == 500,"费用查找失败");
-            PtlAgreementCost ptlAgreementCost = JSONObject.parseObject(JSONObject.toJSONString(httpResult.getData()),PtlAgreementCost.class);
-            AssertionUtils.isFail(Objects.isNull(ptlAgreementCost),"费用查找失败");
-            String coverRuleId = ptlAgreementCost.getCoverRuleId();
-
-            // 查询承保规则实体,判断是否有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()));
+                InsOrders insOrders = insOrdersService.getById(orderNo);
+                AssertionUtils.isFail(Objects.isNull(insOrders),"订单不存在");
+                //查找费用 找不到则抛出异常
+                InsFeeOrders insFeeOrders = insFeeOrdersService.getById(orderNo);
+                AssertionUtils.isFail(Objects.isNull(insFeeOrders),"费用信息不匹配");
+
+
+                // 获取订单车辆信息
+                InsOrdersCarInfo insOrdersCarInfo = insOrdersCarInfoService.getById(insOrders.getId());
+                // 获取订单险种信息
+                List<InsOrdersRisk> insOrdersRisks = insOrdersRiskService.list(new LambdaQueryWrapper<InsOrdersRisk>().eq(InsOrdersRisk::getOrderNo, insOrders.getId()));
+                // 获取订单车主、投被保人信息
+                List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.list(new LambdaQueryWrapper<InsOrdersCarUserInfo>().eq(InsOrdersCarUserInfo::getOrderNo, insOrders.getId()));
+                // 获取订单费用信息
+                InsOrdersCosts insOrdersCosts = insOrdersCostsService.getById(insOrders.getId());
+                // 获取订单险种信息
+                List<InsOrdersKind> kindList = insOrdersKindService.list(new LambdaQueryWrapper<InsOrdersKind>().eq(InsOrdersKind::getOrderNo, insOrders.getId()));
+                // 获取订单驾意险信息
+                InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getById(insOrders.getId());
+                // 获取订单其他信息
+                InsOrdersOther insOrdersOther = insOrdersOtherService.getById(insOrders.getId());
+
+                // 通过费用id 查找规则id
+                String costId = insFeeOrders.getCostId();
+                HttpResult httpResult = orgClient.queryCostById(costId);
+                AssertionUtils.isFail(httpResult.getCode() == 500,"费用查找失败");
+                PtlAgreementCost ptlAgreementCost = JSONObject.parseObject(JSONObject.toJSONString(httpResult.getData()),PtlAgreementCost.class);
+                AssertionUtils.isFail(Objects.isNull(ptlAgreementCost),"费用查找失败");
+                String coverRuleId = ptlAgreementCost.getCoverRuleId();
+
+                // 查询承保规则实体,判断是否有parentId
+                HttpResult ruleResult = orgClient.rulesGet(coverRuleId);
+                AssertionUtils.isFail(ruleResult.getCode() == 500, "承保规则查找失败");
+                PtlAgreementUndwrtRules ruleEntity = JSONObject.parseObject(JSONObject.toJSONString(ruleResult.getData()), PtlAgreementUndwrtRules.class);
+                if (ruleEntity == null) {
+                    log.info("承保规则不存在, coverRuleId={}, 订单号={}, 跳过承保规则校验", coverRuleId, orderNo);
+                    continue;
                 }
-            } 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);
+                List<String> ruleIds = new ArrayList<>();
+                if (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);
                 }
-            }
 
-            StringBuilder logs = new StringBuilder();
+                // 收集所有规则的属性关联(按规则分组)
+                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);
+                    }
+                }
 
-            //先进行承保规则判断
-            verificationRules(ruleGroups,logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks,
-                    insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, insOrders);
+                StringBuilder logs = new StringBuilder();
+
+                //先进行承保规则判断
+                verificationRules(ruleGroups,logs, insOrdersOther, insOrdersCarInfo, insOrdersRisks,
+                        insOrdersCarUserInfos, kindList, insOrdersCosts, insOrdersAccidentalDriving, insOrders);
+            } catch (FeignException e) {
+                log.error("承保规则校验调用远程服务[jzg-organization]异常, url={}, status={}, body={}",
+                        e.request() != null ? e.request().url() : "unknown",
+                        e.status(),
+                        e.contentUTF8(),
+                        e);
+                throw new SystemException("承保规则校验服务暂时不可用,请稍后重试");
+            }
         }
     }
 

+ 2 - 2
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerQuoteResultVoBuild.java

@@ -205,11 +205,11 @@ public final class ZmCrawlerQuoteResultVoBuild {
         }
         if (quotedPriceResponse != null) {
             scoreJson.add(new JSONObject()
-                    .fluentPut("scoreName", "交强出险次数")
+                    .fluentPut("scoreName", "交强上年出险次数")
                     .fluentPut("scoreKey","bzDemandPayCount")
                     .fluentPut("score", quotedPriceResponse.getBussinessMain().getBzDemandPayCount()));
             scoreJson.add(new JSONObject()
-                    .fluentPut("scoreName", "商业出险次数")
+                    .fluentPut("scoreName", "商业上年出险次数")
                     .fluentPut("scoreKey","busDemandPayCount")
                     .fluentPut("score", quotedPriceResponse.getBussinessMain().getBusDemandPayCount()));
             scoreJson.add(new JSONObject()

+ 4 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -350,6 +350,10 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
     @Override
     public AgreementRulesVo rulesGet(String ruleId) {
         PtlAgreementUndwrtRules rules = baseMapper.selectById(ruleId);
+        if (rules == null) {
+            log.info("承保规则不存在, ruleId={}", ruleId);
+            return null;
+        }
         PtlAgreement agreement = ptlAgreementService.getById(rules.getAgreementId());
         AgreementRulesVo rulesVo = new AgreementRulesVo();
         BeanUtils.copyProperties(rules, rulesVo);

+ 4 - 0
tenant/organization/src/main/resources/application-dev.yml

@@ -33,6 +33,10 @@ feign:
       url: http://localhost:8083/
     jzg-partner:
       url: http://localhost:8087/
+    locallive:
+      url: https://life.baoxianzhanggui.com/locallive-pro-java/
+    user-center:
+      url: https://test.baoxianzhanggui.com/user-api/usercenter
 
 #银联API参数配置
 unionPay: