wanghao 3 месяцев назад
Родитель
Сommit
e0eb224234

+ 8 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java

@@ -64,7 +64,7 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
                 // 商业险
                 buildKindInfo(quoteVo.getKindInfoVo(), contractDTO.getCoverage());
                 buildRiskInfoVo(quoteVo.getBiRiskInfoVo(), contractDTO.getContractMain(), contractDTO.getPlatFormMessage(), false);
-                quoteResultsVo.getCosts().setBiPremium(String.valueOf(contractDTO.getContractMain().getBiTotalpremium()));
+                quoteResultsVo.getCosts().setBiPremium(String.valueOf(contractDTO.getContractMain().getTotalPremium()));
                 quoteResultsVo.setBiPolicyNumber(contractDTO1.getContractMain().getContractNo());
             }
         });
@@ -72,7 +72,13 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
         quoteResultsVo.setScoreVo(buildScoreVo(huaNongCrawlerQuotedPriceResponse));
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
-        quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
+        RiskInfoVo biRiskInfo = quoteVo.getBiRiskInfoVo();
+        if(biRiskInfo != null && quoteVo.getCiRiskInfoVo() != null){
+            biRiskInfo.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate());
+            biRiskInfo.setEndDate(quoteVo.getCiRiskInfoVo().getEndDate());
+        }
+
+        quoteResultsVo.setBiRiskInfoVo(biRiskInfo);
         return quoteResultsVo;
     }
 

+ 113 - 131
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java

@@ -316,7 +316,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             boolean isCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
                     (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
             boolean isBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
-                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
+                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
+                            || biReinsureMsg.contains("保期:["));
 
             if (isCiDuplicate || isBiDuplicate) {
                 hasDuplicateInsurance = true;
@@ -344,25 +345,45 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             HuaNongCrawlerQuotedPriceResponse response,
             HttpHeaders httpHeaders) {
 
+        // 收集所有contract中的重复投保信息(与Python一致:遍历所有contract汇总)
+        String ciReinsureEndDate = null;
+        String ciReinsureMessage = null;
+        String biReinsureEndDate = null;
+        String biReinsureMessage = null;
+
         for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : response.getBusinessData().getContract()) {
             if (contract.getPlatFormMessage() == null) {
                 continue;
             }
-
-            String riskCode = contract.getContractMain().getRiskCode();
-            String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
-            String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
-
-            boolean needAdjustCi = "0507".equals(riskCode) &&
-                    StringUtils.hasText(ciReinsureMsg) &&
-                    (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
-
-            boolean needAdjustBi = ("0510".equals(riskCode) || "0515".equals(riskCode)) &&
-                    StringUtils.hasText(biReinsureMsg) &&
-                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
-
-            if (needAdjustCi || needAdjustBi) {
-                adjustPolicyDate(request, riskCode, contract);
+            String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
+            String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+            String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
+            String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+
+            if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
+            if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;
+            if (StringUtils.hasText(biEnd)) biReinsureEndDate = biEnd;
+            if (StringUtils.hasText(biMsg)) biReinsureMessage = biMsg;
+        }
+
+        // 与Python一致:三个触发条件
+        boolean ciTrigger = StringUtils.hasText(ciReinsureEndDate)
+                && StringUtils.hasText(ciReinsureMessage)
+                && ciReinsureMessage.contains("终保日期");
+        boolean biTrigger1 = StringUtils.hasText(biReinsureEndDate)
+                && StringUtils.hasText(biReinsureMessage)
+                && biReinsureMessage.contains("终保日期");
+        boolean biTrigger2 = StringUtils.hasText(biReinsureEndDate)
+                && StringUtils.hasText(biReinsureMessage)
+                && biReinsureMessage.contains("保期:[");
+
+        if (ciTrigger || biTrigger1 || biTrigger2) {
+            // 与Python一致:交强险和商业险的起保日期同时更新
+            if (StringUtils.hasText(ciReinsureEndDate)) {
+                adjustPolicyDate(request, "0507", ciReinsureEndDate);
+            }
+            if (StringUtils.hasText(biReinsureEndDate)) {
+                adjustPolicyDate(request, "0510", biReinsureEndDate);
             }
         }
 
@@ -386,7 +407,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             boolean isCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
                     (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
             boolean isBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
-                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
+                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
+                            || biReinsureMsg.contains("保期:["));
 
             if (isCiDuplicate || isBiDuplicate) {
                 return true;
@@ -401,63 +423,89 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             HuaNongCrawlerQuotedPriceResponse response,
             HttpHeaders httpHeaders) {
 
+        // 收集所有contract中的重复投保信息
+        String ciReinsureEndDate = null;
+        String ciReinsureMessage = null;
+        String biReinsureEndDate = null;
+        String biReinsureMessage = null;
+
         for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : response.getBusinessData().getContract()) {
             if (contract.getPlatFormMessage() == null) {
                 continue;
             }
-
-            String riskCode = contract.getContractMain().getRiskCode();
-            String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
-            String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
-
-            boolean needAdjustCi = "0507".equals(riskCode) &&
-                    StringUtils.hasText(ciReinsureMsg) &&
-                    (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
-
-            boolean needAdjustBi = ("0510".equals(riskCode) || "0515".equals(riskCode)) &&
-                    StringUtils.hasText(biReinsureMsg) &&
-                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
-
-            if (needAdjustCi || needAdjustBi) {
-                adjustPolicyDateWithOneMoreDay(request, riskCode, contract);
+            String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
+            String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+            String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
+            String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+
+            if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
+            if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;
+            if (StringUtils.hasText(biEnd)) biReinsureEndDate = biEnd;
+            if (StringUtils.hasText(biMsg)) biReinsureMessage = biMsg;
+        }
+
+        // 与Python一致:三个触发条件
+        boolean ciTrigger = StringUtils.hasText(ciReinsureEndDate)
+                && StringUtils.hasText(ciReinsureMessage)
+                && ciReinsureMessage.contains("终保日期");
+        boolean biTrigger1 = StringUtils.hasText(biReinsureEndDate)
+                && StringUtils.hasText(biReinsureMessage)
+                && biReinsureMessage.contains("终保日期");
+        boolean biTrigger2 = StringUtils.hasText(biReinsureEndDate)
+                && StringUtils.hasText(biReinsureMessage)
+                && biReinsureMessage.contains("保期:[");
+
+        if (ciTrigger || biTrigger1 || biTrigger2) {
+            // 与Python一致:交强险和商业险的起保日期同时更新,日期+1天
+            if (StringUtils.hasText(ciReinsureEndDate)) {
+                adjustPolicyDateWithPlusOne(request, "0507", ciReinsureEndDate);
+            }
+            if (StringUtils.hasText(biReinsureEndDate)) {
+                adjustPolicyDateWithPlusOne(request, "0510", biReinsureEndDate);
             }
         }
 
         return huaNongCrawlerRequestComponent.quotedPrice(request, httpHeaders);
     }
 
-    private void adjustPolicyDateWithOneMoreDay(HuaNongCrawlerQuotedPriceRequestRequest request,
-                                                 String riskCode, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract) {
-
-        String lastExpireDate = "";
-
-        if ("0507".equals(riskCode)) {
-            lastExpireDate = contract.getPlatFormMessage().getCiReinsureEndDate();
-        } else if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
-            String biReinsureEndDate = contract.getPlatFormMessage().getBiReinsureEndDate();
-            String lastPolicyExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
-
-            if (StringUtils.hasText(biReinsureEndDate)) {
-                lastExpireDate = biReinsureEndDate;
-            } else if (StringUtils.hasText(lastPolicyExpireDate)) {
-                lastExpireDate = lastPolicyExpireDate;
-            }
-        }
-
-        if (StringUtils.hasText(lastExpireDate)) {
-            lastExpireDate = ensureDateTimeFormat(lastExpireDate);
-            lastExpireDate = plusOneDayDateTime(lastExpireDate);
+    /**
+     * 调整保单日期(与Python get_contract 一致:更新contractMain + 全部coverage的validDate和expiryDate)
+     */
+    private void adjustPolicyDate(HuaNongCrawlerQuotedPriceRequestRequest request,
+                                  String riskCode, String lastExpireDate) {
+        lastExpireDate = ensureDateTimeFormat(lastExpireDate);
+        applyDateToContract(request, riskCode, lastExpireDate);
+    }
 
-            String finalLastExpireDate = lastExpireDate;
-            request.getBusinessData().getContract().stream()
-                    .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
-                    .findFirst()
-                    .ifPresent(dto -> {
-                        dto.getContractMain().setValidDate(finalLastExpireDate);
-                        dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate));
-                        dto.getCoverage().get(0).setValidDate(finalLastExpireDate);
-                    });
-        }
+    /**
+     * 调整保单日期并+1天(第二次重试用)
+     */
+    private void adjustPolicyDateWithPlusOne(HuaNongCrawlerQuotedPriceRequestRequest request,
+                                             String riskCode, String lastExpireDate) {
+        lastExpireDate = ensureDateTimeFormat(lastExpireDate);
+        lastExpireDate = plusOneDayDateTime(lastExpireDate);
+        applyDateToContract(request, riskCode, lastExpireDate);
+    }
+    /**
+     * 将日期应用到请求中的contract:更新contractMain和全部coverage的validDate、expiryDate
+     */
+    private void applyDateToContract(HuaNongCrawlerQuotedPriceRequestRequest request,
+                                     String riskCode, String finalLastExpireDate) {
+        String expiryDate = TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate);
+        request.getBusinessData().getContract().stream()
+                .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
+                .findFirst()
+                .ifPresent(dto -> {
+                    dto.getContractMain().setValidDate(finalLastExpireDate);
+                    dto.getContractMain().setExpiryDate(expiryDate);
+                    // 与Python get_contract 一致:所有coverage都更新validDate和expiryDate
+                    if (dto.getCoverage() != null) {
+                        dto.getCoverage().forEach(cov -> {
+                            cov.setValidDate(finalLastExpireDate);
+                            cov.setExpiryDate(expiryDate);
+                        });
+                    }
+                });
     }
 
     private String plusOneDayDateTime(String dateTime) {
@@ -465,42 +513,6 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         return localDateTime.plusDays(1).format(TimeProcessing.DATE_TIME_FORMATTER);
     }
 
-    private void adjustPolicyDate(HuaNongCrawlerQuotedPriceRequestRequest request,
-                                  String riskCode, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract) {
-
-        String lastExpireDate = "";
-
-        if ("0507".equals(riskCode)) {
-            // 交强险:优先使用 ciReinsureEndDate
-            lastExpireDate = contract.getPlatFormMessage().getCiReinsureEndDate();
-        } else if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
-            // 商业险:优先使用 biReinsureEndDate,其次使用 lastPolicyExpireDate
-            String biReinsureEndDate = contract.getPlatFormMessage().getBiReinsureEndDate();
-            String lastPolicyExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
-
-            if (StringUtils.hasText(biReinsureEndDate)) {
-                lastExpireDate = biReinsureEndDate;
-            } else if (StringUtils.hasText(lastPolicyExpireDate)) {
-                lastExpireDate = lastPolicyExpireDate;
-            }
-        }
-
-        if (StringUtils.hasText(lastExpireDate)) {
-            // 统一日期格式
-            lastExpireDate = ensureDateTimeFormat(lastExpireDate);
-
-            String finalLastExpireDate = lastExpireDate;
-            request.getBusinessData().getContract().stream()
-                    .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
-                    .findFirst()
-                    .ifPresent(dto -> {
-                        dto.getContractMain().setValidDate(finalLastExpireDate);
-                        dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate));
-                        dto.getCoverage().get(0).setValidDate(finalLastExpireDate);
-                    });
-        }
-    }
-
     private HuaNongCrawlerQuotedPriceResponse checkAndHandleRemainingDuplicate(HuaNongCrawlerQuotedPriceResponse response, boolean throwException) {
         if (response == null || response.getBusinessData() == null ||
                 response.getBusinessData().getContract() == null) {
@@ -520,7 +532,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             boolean stillCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
                     (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
             boolean stillBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
-                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
+                    (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
+                            || biReinsureMsg.contains("保期:["));
 
             if (stillCiDuplicate) {
                 if (errorMsg.length() > 0) {
@@ -579,37 +592,6 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
     }
 
 
-    // 处理重复投保
-    private HuaNongCrawlerQuotedPriceResponse repeatQuote(HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract, HttpHeaders httpHeaders) {
-        String riskCode = contract.getContractMain().getRiskCode();
-        if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
-            String lastExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
-            if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
-                final String finalRiskCode = riskCode;
-                huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
-                        .filter(dto -> finalRiskCode.equals(dto.getContractMain().getRiskCode()))
-                        .findFirst()
-                        .ifPresent(dto -> {
-                            dto.getContractMain().setValidDate(lastExpireDate);
-                            dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(lastExpireDate));
-                        });
-            }
-        } else if ("0507".equals(riskCode)) {
-            String lastExpireDate = ensureDateTimeFormat(contract.getPlatFormMessage().getCiReinsureEndDate());
-            ;
-            if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
-                huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
-                        .filter(dto -> "0507".equals(dto.getContractMain().getRiskCode()))
-                        .findFirst()
-                        .ifPresent(dto -> {
-                            dto.getContractMain().setValidDate(lastExpireDate);
-                            dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(lastExpireDate));
-                        });
-            }
-        }
-        return huaNongCrawlerRequestComponent.quotedPrice(huaNongCrawlerQuotedPriceRequest, httpHeaders);
-    }
-
     public String ensureDateTimeFormat(String dateStr) {
         if (dateStr == null || dateStr.trim().isEmpty()) {
             return "";