Ver Fonte

华农重复投保、非车险

Qchen há 8 meses atrás
pai
commit
04dba86778

+ 3 - 3
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerLoginRequestRequest.java

@@ -52,13 +52,13 @@ public class HuaNongCrawlerLoginRequestRequest implements HuaNongHeadRequest {
     @JsonProperty("pwd")
     private String pwd;
 
-    public HuaNongCrawlerLoginRequestRequest(String username, String password, String captchaKey, String captcha) {
+    public HuaNongCrawlerLoginRequestRequest(String username, String password, String captchaKey, String captchaResult) {
         this.head = new HuaNongCrawlerRequestBaseHead("");
-        this.head.setAnonymousId("19b59f6f0ca54c.0dd27d27d27d28.6a5b4b62.2073600.19b59f6f0cb18bc");
+        this.head.setAnonymousId("19b4e062d676f0.06752622f9e3c44.26061a51.2073600.19b4e062d68f9f");
         this.userCode = username;
         this.type = "1";
         this.captchaKey = captchaKey;
-        this.verificationCode = captcha;
+        this.verificationCode = captchaResult;
         this.deviceId = DigestUtils.md5Hex(HighPerformanceRandomStringGenerator.generate(24, new Random()));
         this.mobile = "";
         this.saaLoginFlag = "";

+ 53 - 3
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java

@@ -204,7 +204,7 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
             this.ocrFlag = "";
             this.contractHome = Collections.emptyList();
             this.contractGlass = Collections.emptyList();
-            this.contractAccident = new ArrayList<>();
+            this.contractAccident = ContractAccidentDTO.build(quoteVo);
             this.BListData = buildBListDataList();
             this.D3ListData = buildD3ListDataList();
             this.D4ListData = buildD4ListDataList();
@@ -1235,6 +1235,10 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
         public static class ContractAccidentDTO {
             @JsonProperty("accident")
             private List<Object> accident;
+            @JsonProperty("adjust")
+            private List<Object> adjust;
+            @JsonProperty("autoPriceApqMainList")
+            private List<Object> autoPriceApqMainList;
             @JsonProperty("contractMain")
             private ContractMainDTO contractMain;
             @JsonProperty("coverage")
@@ -1243,6 +1247,10 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
             private PlatFormMessageDTO platFormMessage;
             @JsonProperty("choosed")
             private Boolean choosed;
+            @JsonProperty("engage")
+            private List<Object> engage;
+            @JsonProperty("loocked")
+            private Boolean loocked;
 
             @NoArgsConstructor
             @Data
@@ -1250,11 +1258,11 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                 @JsonProperty("contractNo")
                 private String contractNo;
                 @JsonProperty("expenseRate")
-                private Integer expenseRate;
+                private String expenseRate;
                 @JsonProperty("productionDate")
                 private String productionDate;
                 @JsonProperty("performanceRate")
-                private Integer performanceRate;
+                private String performanceRate;
                 @JsonProperty("costType")
                 private String costType;
                 @JsonProperty("choosed")
@@ -1449,6 +1457,48 @@ public class HuaNongCrawlerQuotedPriceRequestRequest implements HuaNongHeadReque
                     private String value;
                 }
             }
+            private static List<ContractAccidentDTO> build(QuoteVo quoteVo) {
+                List<ContractAccidentDTO> contractAccident = new ArrayList<>();
+                if (quoteVo.getAccidentalDrivings() != null) {
+                    quoteVo.getAccidentalDrivings().forEach(accident -> {
+                        ContractAccidentDTO contractAccidentDTO = new ContractAccidentDTO();
+                        contractAccidentDTO.setAccident(new ArrayList<>());
+                        contractAccidentDTO.setAdjust(new ArrayList<>());
+                        contractAccidentDTO.setAutoPriceApqMainList(new ArrayList<>());
+                        contractAccidentDTO.setChoosed(true);
+                        contractAccidentDTO.setContractMain(buildContractMainDTO(accident));
+                        contractAccidentDTO.setCoverage(new ArrayList<>());
+                        contractAccidentDTO.setEngage(new ArrayList<>());
+                        contractAccidentDTO.setLoocked(false);
+                        contractAccident.add(contractAccidentDTO);
+                    });
+                }
+                return contractAccident;
+            }
+
+            private static ContractMainDTO buildContractMainDTO(AccidentalDrivingVo accidentVo) {
+                ContractMainDTO contractMainDTO = new ContractMainDTO();
+                contractMainDTO.setAllQuantity(String.valueOf(accidentVo.getQuantity()));
+                contractMainDTO.setChoosed(true);
+                contractMainDTO.setDiscount(100);
+                contractMainDTO.setExpenseRate("");
+                contractMainDTO.setExpiryDate("");
+                contractMainDTO.setInsuredObjectCode("7");
+                contractMainDTO.setInsuredObjectName("从车");
+                contractMainDTO.setIsRegistered("0");
+                contractMainDTO.setNvehRiskCode("");
+                contractMainDTO.setNvehRiskName("");
+                contractMainDTO.setNvehRiskType("");
+                contractMainDTO.setParagraph("1");
+                contractMainDTO.setPerformanceRate("");
+                contractMainDTO.setPlanCode(accidentVo.getProductCode());
+                contractMainDTO.setPlanName(accidentVo.getProductName());
+                contractMainDTO.setPlanSubCode("999N");
+                contractMainDTO.setProductionDate(TimeProcessing.nowDateTime());
+                contractMainDTO.setUnitPremium(0);
+                contractMainDTO.setValidDate(TimeProcessing.tomorrowDateTime());
+                return contractMainDTO;
+            }
         }
 
         @AllArgsConstructor

+ 36 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -70,8 +70,10 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
             HuaNongCrawlerVerificationCodeResponse huaNongCrawlerVerificationCodeResponse = huaNongCrawlerRequestComponent.verificationCode(huaNongCrawlerVerificationCodeRequest, httpHeaders);
             // 识别验证码
             String captcha = exteriorUtilsRequest.captchaIdentify(huaNongCrawlerVerificationCodeResponse.getImageStream());
+            // 验证码结果
+            String captchaResult = parseCaptcha(captcha);
             // 登录
-            HuaNongCrawlerLoginRequestRequest huaNongCrawlerLoginRequest = new HuaNongCrawlerLoginRequestRequest(username, password, huaNongCrawlerVerificationCodeResponse.getCaptchaKey(), captcha);
+            HuaNongCrawlerLoginRequestRequest huaNongCrawlerLoginRequest = new HuaNongCrawlerLoginRequestRequest(username, password, huaNongCrawlerVerificationCodeResponse.getCaptchaKey(), captchaResult);
             HuaNongCrawlerLoginResponse login = huaNongCrawlerRequestComponent.login(huaNongCrawlerLoginRequest, httpHeaders);
             if (isLoginSuccessful(login)) {
                 huaNongCrawlerCacheComponent.cacheLoginInfo(login, username);
@@ -81,6 +83,39 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
         throw new SystemException("超过最大重试次数,登录失败");
     }
 
+    /**
+     * 解析验证码
+     * @param captcha 验证码
+     */
+    private String parseCaptcha(String captcha) {
+        String result = "";
+        if (captcha == null || captcha.length() < 3) {
+            throw new SystemException("验证码长度解析失败");
+        }
+        else if (captcha.length() == 3 && (captcha.contains("x") || captcha.contains("+"))) {
+            try {
+                int firstNum = Integer.parseInt(String.valueOf(captcha.charAt(0)));
+                int lastNum = Integer.parseInt(String.valueOf(captcha.charAt(2)));
+                if (captcha.contains("x")) {
+                    result = String.valueOf(firstNum * lastNum);
+                }
+                else if (captcha.contains("+")) {
+                    result = String.valueOf(firstNum + lastNum);
+                }
+                else if (captcha.contains("-")) {
+                    result = String.valueOf(firstNum - lastNum);
+                }
+                else {
+                    throw new SystemException("验证码解析失败");
+                }
+            }
+            catch (Exception e) {
+                throw new SystemException("验证码解析失败");
+            }
+        }
+        return result;
+    }
+
     private void authorization(String username, String password, boolean isFirst) {
         // 判断是否在首次登录(协议、账号)
         if (!isFirst) {

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

@@ -11,6 +11,7 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.huanong.crawler.build.HuaNongCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.huanong.crawler.component.HuaNongCrawlerCacheComponent;
 import com.jzg.quotation.huanong.crawler.component.HuaNongCrawlerRequestComponent;
@@ -32,6 +33,7 @@ import org.springframework.http.HttpHeaders;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
 
 @QuoteCrawlerService(InsuranceCode.INSURANCE_HNIC)
 @RequiredArgsConstructor
@@ -79,7 +81,19 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest = new HuaNongCrawlerQuotedPriceRequestRequest(loginInfoDto.getToken(), attributionInformationVo.getUsername(), quoteVo, loginInfoDto.getLoginComCode(), actualValue, loginInfoDto.getParameters(), carModel, saleInfoDTO);
 
         HuaNongCrawlerQuotedPriceResponse huaNongCrawlerQuotedPriceResponse = huaNongCrawlerRequestComponent.quotedPrice(huaNongCrawlerQuotedPriceRequest, httpHeaders);
-
+        // 处理重复投保
+        if ("0".equals(huaNongCrawlerQuotedPriceResponse.getHead().getReturnCode())) {
+            List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contractList = huaNongCrawlerQuotedPriceResponse.getBusinessData().getContract();
+            for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : contractList) {
+                String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+                String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+                boolean isCiReInsure = ciReinsureMsg != null && ciReinsureMsg.contains("重复投保");
+                boolean isBiReInsure = biReinsureMsg != null && biReinsureMsg.contains("重复投保");
+                if (isCiReInsure || isBiReInsure) {
+                    huaNongCrawlerQuotedPriceResponse = repeatQuote(huaNongCrawlerQuotedPriceRequest,contract ,httpHeaders);
+                }
+            }
+        }
         // 6 保存
         HuaNongCrawlerSaveRequestRequest huaNongCrawlerSaveRequest = getHuaNongCrawlerSaveRequestRequest(huaNongCrawlerQuotedPriceResponse, loginInfoDto.getToken(), loginInfoDto.getLoginComCode());
         HuaNongCrawlerSaveResponse saveResponse = huaNongCrawlerRequestComponent.save(huaNongCrawlerSaveRequest, httpHeaders);
@@ -91,6 +105,34 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         return quoteResultsVo;
     }
 
+    // 处理重复投保
+    private HuaNongCrawlerQuotedPriceResponse repeatQuote(HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest,HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract,HttpHeaders httpHeaders) {
+        String riskCode = contract.getContractMain().getRiskCode();
+        if ("0510".equals(riskCode)) {
+            String lastExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
+            if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
+                huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
+                        .filter(dto -> "0510".equals(dto.getContractMain().getRiskCode()))
+                        .findFirst()
+                        .ifPresent(dto -> {
+                            dto.getContractMain().setValidDate(lastExpireDate);
+                            dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(lastExpireDate));
+                        });
+            }
+        } else if ("0507".equals(riskCode)) {
+            String lastExpireDate = 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);
+    }
 
     @NotNull
     private static HuaNongCrawlerSaveRequestRequest getHuaNongCrawlerSaveRequestRequest(HuaNongCrawlerQuotedPriceResponse huaNongCrawlerQuotedPriceResponse, String token, String loginComCode) {