Procházet zdrojové kódy

国任爬虫重复投保,非车险

Qchen před 8 měsíci
rodič
revize
b98da41264

+ 12 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/TimeProcessing.java

@@ -62,7 +62,7 @@ public final class TimeProcessing {
     }
 
     /**
-     * 一年以后减1秒得时间
+     * 一年以后减1秒得时间 (适用于零点时)
      *
      * @param date 开始时间
      * @return 结束时间
@@ -70,6 +70,17 @@ public final class TimeProcessing {
     public static String minusOneSecondAfterYear(String date) {
         return plusOneYear(date).minusSeconds(ONE).format(DATE_TIME_FORMATTER);
     }
+    /**
+     * 一年以后减1天得时间 (适用于不是零点时)
+     *
+     * @param date 开始时间
+     * @return 结束时间
+     */
+    public static String minusOneDayAfterYear(String date) {
+        return plusOneYear(date).minusDays(ONE).minusSeconds(ONE).format(DATE_TIME_FORMATTER);
+    }
+
+
 
     /**
      * 一年以后得时间

+ 11 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/build/GuoRenCrawlerQuoteResultsVoBuild.java

@@ -1,9 +1,11 @@
 package com.jzg.quotation.guoren.crawler.build;
 
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.quote.enums.quote.KindCode;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerBaseResponse;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerCalculationPremiumData;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerProposalNoSaveData;
 
@@ -66,6 +68,15 @@ public final class GuoRenCrawlerQuoteResultsVoBuild {
         return kindInfoVo;
     }
 
+    public static QuoteResultsVo buildFailQuoteResultsVo(QuoteVo quoteVo, GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        // 报价失败提示
+        quoteResultsVo.setErrorMessage(calculationPremium.getResultMsg());
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+        return quoteResultsVo;
+    }
+
 
 
 

+ 16 - 10
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java

@@ -1,7 +1,8 @@
 package com.jzg.quotation.guoren.crawler.component;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
+import com.alibaba.fastjson2.JSON;
+import com.jzg.commons.constants.quote.enums.base.InsuranceEnum;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -10,6 +11,7 @@ import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.utils.InsuranceLog;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.guoren.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
@@ -58,14 +60,19 @@ public class GuoRenCrawlerRequestComponent {
     public <Response> Response request(RequestUrl requestUrl, Object body, ParameterizedTypeReference<Response> parameterizedTypeReference, HttpHeaders httpHeaders) {
         String url = guoRenCrawlerProperties.getBaseUrl() + requestUrl.getUri();
         Response response = requestComponent.post(url, body, requestUrl.getRequestDescription(), parameterizedTypeReference, httpHeaders);
-        if (response instanceof GuoRenCrawlerBaseResponse) {
-            if (((GuoRenCrawlerBaseResponse<?>) response).getResultCode() == 1) {
-                throw new SystemException(((GuoRenCrawlerBaseResponse<?>) response).getResultMsg());
-            }
-        }
+
+        String bodyJson = JSON.toJSONString(response);
+        String responseJson = JSON.toJSONString(response);
+        InsuranceLog.infoLog(InsuranceEnum.XDCX.getPinyin(), "\n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                url,bodyJson);
+        InsuranceLog.infoLog(InsuranceEnum.XDCX.getPinyin(), "\n\t---------> 响应参数:{}", responseJson);
         return response;
     }
-
+//        if (response instanceof GuoRenCrawlerBaseResponse) {
+//            if (((GuoRenCrawlerBaseResponse<?>) response).getResultCode() == 1) {
+//                throw new SystemException(((GuoRenCrawlerBaseResponse<?>) response).getResultMsg());
+//            }
+//        }
     /**
      * 请求入口
      *
@@ -253,10 +260,9 @@ public class GuoRenCrawlerRequestComponent {
      * @param httpHeaders                      请求头
      * @return 保费计算响应
      */
-    public GuoRenCrawlerCalculationPremiumData calculationPremium(GuoRenCrawlerCalculationPremiumRequest crawlerCalculationPremiumRequest, HttpHeaders httpHeaders) {
-        GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> request = request(RequestUrl.CALCULATION_PREMIUM, crawlerCalculationPremiumRequest, new ParameterizedTypeReference<>() {
+    public GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium(GuoRenCrawlerCalculationPremiumRequest crawlerCalculationPremiumRequest, HttpHeaders httpHeaders) {
+        return request(RequestUrl.CALCULATION_PREMIUM, crawlerCalculationPremiumRequest, new ParameterizedTypeReference<>() {
         }, httpHeaders);
-        return request.getData();
     }
 
     /**

+ 9 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCalculationPremiumRequest.java

@@ -114,6 +114,15 @@ public class GuoRenCrawlerCalculationPremiumRequest {
         public BcDTO(QuoteVo quoteVo, PrpTMainDTO prpTmainDTO, PrpTitemCarDTO prpTitemCar, Integer insuredTypeTmp, GuoRenCrawlerWriteBackAddressData policyHolderAddr, GuoRenCrawlerWriteBackAddressData insuredPersonAddr) {
             this.baseInfoInit = 2;
             this.riskCode = "0500";
+            // 添加非车险信息
+            if (quoteVo.getAccidentalDrivings().size() > 0) {
+                String noCarCodes = quoteVo.getAccidentalDrivings().get(0).getProductCode();
+                Integer noCarFlag = 1;
+                Integer noCarPremium = Integer.parseInt(quoteVo.getAccidentalDrivings().get(0).getPremium());
+                prpTmainDTO.setNoCarCodes(noCarCodes);
+                prpTmainDTO.setNoCarFlag(noCarFlag);
+                prpTmainDTO.setNoCarPremium(noCarPremium);
+            }
             this.prpTmain = prpTmainDTO;
             this.prpTitemCar = prpTitemCar;
             this.prpTinsured = new PrpTinsuredDTO(quoteVo.getPolicyHolderInfo(), quoteVo.getInsuredPersonInfo(), policyHolderAddr, insuredPersonAddr, quoteVo.getOwnersInfo().getBirthday());

+ 1 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerCalculationPremiumData.java

@@ -17,7 +17,7 @@ import java.util.List;
  */
 @NoArgsConstructor
 @Data
-public class GuoRenCrawlerCalculationPremiumData {
+public class GuoRenCrawlerCalculationPremiumData extends GuoRenCrawlerBaseResponse{
 
 
     @JsonProperty("bi")

+ 2 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java

@@ -52,7 +52,7 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
     public HttpHeaders getHeaders(String username) {
         HttpHeaders headers = new HttpHeaders();
 //        String token = guoRenCrawlerCacheComponent.getToken(username);
-        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3NjQ0MDE4ODV9.SWFEoclc2C-59feIHkFdbQKvbD6QD_2lLjb0fb8O95RXdA5BK63mlyI02rzqjBqasesgZy2J3NWltLiLe4SYny-eHEJY9TUYdtqSFUcKvaTBNOdFxK9dq4P0UhsDkAIQCbx5bLue_3yb_GfkbgAK2A-PYS3DTq_E-D8DpaVe3vw";
+        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3Njg1NTc4NjN9.cIUF3sLi9F5-ZGTD-BYQh2CctOdExd0CiFnSPZGF7G8FdqiFeNLqTrhAsX6p4Gm-ImVBOsZxJa1fkZ4Q8wc0vjtCTAw9Xm8FicLM9HTiYUSFctYCipRlpK1as7F2wo1ih0ixWms5TdOAMZVyiFLAbckXTtiAmYd24ttPQJPU1As";
         if (!StringUtils.hasText(token)) {
             throw new SystemException("登录失败,请重新登录");
         }
@@ -170,6 +170,6 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         crawlerCalculationPremiumRequest.getBi().getPrpTmain().setCertiNo(calculationPremium.getBi().getPrpTmain().getCertiNo());
         crawlerCalculationPremiumRequest.getBi().setCiInsureDemand(calculationPremium.getBi().getCiInsureDemand());
         crawlerCalculationPremiumRequest.getBi().setPrptengageList(calculationPremium.getBi().getPrptengageList());
-        return guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
+        return guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers).getData();
     }
 }

+ 58 - 6
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -11,6 +11,7 @@ import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.guoren.crawler.build.GuoRenCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerRequestComponent;
 import com.jzg.quotation.guoren.crawler.constant.enums.RequestUrl;
@@ -28,6 +29,9 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_XDCX)
 @Service
 @RequiredArgsConstructor
@@ -81,16 +85,47 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
         GuoRenCrawlerWriteBackAddressData insuredPersonAddr = writeBackAddress(quoteVo.getInsuredPersonInfo().getAddr(), quoteVo.getPolicyHolderInfo().getAddr(), ownersAddr, headers);
         // 保费计算
         GuoRenCrawlerCalculationPremiumRequest crawlerCalculationPremiumRequest = new GuoRenCrawlerCalculationPremiumRequest(quoteVo, prpTmainDTO, prpTitemCar, policyHolderAddr, insuredPersonAddr, insuredTypeTmp);
-        GuoRenCrawlerCalculationPremiumData calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
-
+        GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
+        // 处理重复投保
+        String message = calculationPremium.getResultMsg();
+        if (calculationPremium.getResultCode() == 1 && message.contains("重复投保")) {
+            String startTime = extractDuplicateEndTime(message);
+            String endTime;
+            if (startTime == null) {
+                GuoRenCrawlerQuoteResultsVoBuild.buildFailQuoteResultsVo(quoteVo, calculationPremium);
+            }
+            if (startTime != null && startTime.endsWith("00:00:00")) {
+                endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
+            } else {
+                endTime = TimeProcessing.minusOneDayAfterYear(startTime);
+            }
+            String startDate = TimeProcessing.dateTimeToDate(startTime);
+            String endDate = TimeProcessing.dateTimeToDate(endTime);
+            // 交强
+            crawlerCalculationPremiumRequest.getCi().getPrpTmain().setStartDate(startDate);
+            crawlerCalculationPremiumRequest.getCi().getPrpTmain().setEndDate(endDate);
+            crawlerCalculationPremiumRequest.getCi().getPrptitemkindList().forEach(item -> {
+                item.setStartDate(startDate);
+                item.setEndDate(endDate);
+            });
+            // 商业
+            crawlerCalculationPremiumRequest.getBi().getPrpTmain().setStartDate(startDate);
+            crawlerCalculationPremiumRequest.getBi().getPrpTmain().setEndDate(endDate);
+            crawlerCalculationPremiumRequest.getBi().getPrptitemkindList().forEach(item -> {
+                item.setStartDate(startDate);
+                item.setEndDate(endDate);
+            });
+            calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
+        } else if (calculationPremium.getResultCode() == 1) {
+            GuoRenCrawlerQuoteResultsVoBuild.buildFailQuoteResultsVo(quoteVo, calculationPremium);
+        }
         // 投保验证码处理
-        calculationPremium = guoRenCrawlerQuoteProcessService.insuranceVerificationCodeProcessing(crawlerCalculationPremiumRequest, calculationPremium, headers);
-
+        GuoRenCrawlerCalculationPremiumData calculationPremiumData = guoRenCrawlerQuoteProcessService.insuranceVerificationCodeProcessing(crawlerCalculationPremiumRequest, calculationPremium.getData(), headers);
         // 保存投保单号
-        GuoRenCrawlerProposalNoSaveData proposalNoSave = guoRenCrawlerRequestComponent.proposalNoSave(crawlerCalculationPremiumRequest, calculationPremium, headers);
+        GuoRenCrawlerProposalNoSaveData proposalNoSave = guoRenCrawlerRequestComponent.proposalNoSave(crawlerCalculationPremiumRequest, calculationPremiumData, headers);
         // 保存数据
         guoRenCrawlerOrderService.saveOrderInfo(quoteVo, proposalNoSave);
-        return GuoRenCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, calculationPremium, proposalNoSave);
+        return GuoRenCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, calculationPremiumData, proposalNoSave);
     }
 
     private GuoRenCrawlerWriteBackAddressData writeBackAddress(String addressNew, String addressOld, GuoRenCrawlerWriteBackAddressData writeBackAddressData, HttpHeaders headers) {
@@ -100,6 +135,23 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
         return guoRenCrawlerRequestComponent.writeBackAddress(addressNew, headers);
     }
 
+    // 截取重复投保终保日期
+    private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+
+    /**
+     * 提取系统自动分配的起保时间
+     * @param returnMessage 核心提示
+     * @return 提取到的时间字符串,未提取到返回 null
+     */
+    private String extractDuplicateEndTime(String returnMessage) {
+        Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(returnMessage);
+        if (matcher.find()) {
+            String shortEndTime = matcher.group(1);
+            return shortEndTime + ":00";
+        }
+        return null;
+    }
+
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
         String username = underwritingVo.getOrder().getAttributionInformationVo().getUsername();