Sfoglia il codice sorgente

Merge remote-tracking branch 'origin/master'

liub 3 mesi fa
parent
commit
3a244bb373
41 ha cambiato i file con 636 aggiunte e 190 eliminazioni
  1. 4 0
      commons/src/main/java/com/jzg/commons/entity/po/jyxSetting.java
  2. 8 1
      commons/src/main/java/com/jzg/commons/entity/quote/vo/base/LoginBase.java
  3. 7 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  4. 7 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  5. 7 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/impl/ChengTaiCrawlerRequestImpl.java
  6. 9 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaRequest.java
  7. 3 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationCrawlerBaseService.java
  8. 7 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java
  9. 7 0
      tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/service/Impl/GuoshouCrawlerRequestImpl.java
  10. 7 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  11. 8 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java
  12. 120 131
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  13. 7 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java
  14. 7 0
      tenant/insurance/quotation-renbao/src/main/java/com/jzg/quotation/renbao/crawler/service/impl/RenBaoCrawlerRequestImpl.java
  15. 7 0
      tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java
  16. 7 0
      tenant/insurance/quotation-shenneng/src/main/java/com/jzg/quotation/shenneng/crawler/service/impl/ShenNengCrawlerRequestImpl.java
  17. 10 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  18. 34 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java
  19. 7 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java
  20. 7 0
      tenant/insurance/quotation-taipingyang/src/main/java/com/jzg/quotation/taipingyang/crawler/service/impl/TaiPingYangCrawlerRequestImpl.java
  21. 1 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  22. 2 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java
  23. 4 2
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerLoginRequest.java
  24. 6 6
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerSmsCodeRequest.java
  25. 3 2
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerVerifyRequest.java
  26. 30 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanExternalSendCodeRequest.java
  27. 2 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerSmsCodeResponse.java
  28. 43 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanExternalSendCodeResponse.java
  29. 20 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/properties/ExteriorCaptchaProperties.java
  30. 9 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerQuoteProcessService.java
  31. 2 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerRequest.java
  32. 157 34
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java
  33. 8 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  34. 13 3
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java
  35. 7 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java
  36. 7 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  37. 2 2
      tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java
  38. 9 0
      tenant/organization/src/main/java/com/jzg/organization/mapper/jyxSettingMapper.java
  39. 1 1
      tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java
  40. 29 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  41. 1 0
      tenant/organization/src/main/resources/application.yml

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/po/jyxSetting.java

@@ -27,5 +27,9 @@ public class jyxSetting extends BaseModel {
     private BigDecimal premium;
 
     private String systemCode;
+    /**
+     * 产品编码
+     */
+    private String productCode;
 
 }

+ 8 - 1
commons/src/main/java/com/jzg/commons/entity/quote/vo/base/LoginBase.java

@@ -13,7 +13,14 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @Data
 public class LoginBase {
-
+    /**
+     * 请求类型  1 api 2 python
+     */
+    private  String apiType;
+    /**
+     * 承保机构编码
+     */
+    private String companyCode;
     /**
      * 用户名
      */

+ 7 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -24,6 +24,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.component.DistributedLockComponent;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import lombok.RequiredArgsConstructor;
@@ -58,6 +60,11 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 7 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java

@@ -29,6 +29,8 @@ import com.jzg.quotation.bohai.crawler.util.PythonExecutor;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+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.bohai.crawler.build.BoHaiCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.bohai.crawler.component.BoHaiCrawlerRequestComponent;
@@ -99,6 +101,11 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         boHaiCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
   public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return boHaiCrawlerQuoteProcessService.detectLogin(detectLoginRequest);

+ 7 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/impl/ChengTaiCrawlerRequestImpl.java

@@ -26,6 +26,8 @@ import com.jzg.quotation.chengtai.crawler.utils.ZipImageExample;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
@@ -59,6 +61,11 @@ public class ChengTaiCrawlerRequestImpl implements ChengTaiCrawlerRequest {
         }
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
 

+ 9 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/GetCaptchaRequest.java

@@ -19,6 +19,15 @@ public class GetCaptchaRequest implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 327592537421379864L;
+
+    /**
+     * 请求类型  1 api 2 python
+     */
+    private  String apiType;
+    /**
+     * 承保机构编码
+     */
+    private String companyCode;
     /**
      * 用户名
      */

+ 3 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/QuotationCrawlerBaseService.java

@@ -3,6 +3,8 @@ package com.jzg.quotation.commons.service;
 
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 
 
 /**
@@ -19,4 +21,5 @@ public interface QuotationCrawlerBaseService extends QuotationBaseService {
      */
     void login(LoginBase loginBase);
 
+    GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest);
 }

+ 7 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java

@@ -11,6 +11,8 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
@@ -101,6 +103,11 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         daJiaCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return daJiaCrawlerQuoteProcessService.detectLogin(detectLoginRequest);

+ 7 - 0
tenant/insurance/quotation-guoshou/src/main/java/com/jzg/quotation/guoshou/crawler/service/Impl/GuoshouCrawlerRequestImpl.java

@@ -16,6 +16,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.guoshou.crawler.component.GsCrawlerLoginComponent;
 import com.jzg.quotation.guoshou.crawler.component.GsCrawlerRequestComponent;
@@ -71,6 +73,11 @@ public class GuoshouCrawlerRequestImpl implements GuoshouCrawlerRequest {
 
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 7 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -25,6 +25,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
@@ -83,6 +85,11 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         hbCrawlerRequestComponent.authenticate(loginBase.getUsername(), loginBase.getPassword(), RequestConstant.REQUEST_NUMBER);
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 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;
     }
 

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

@@ -13,6 +13,8 @@ import com.jzg.commons.entity.quote.vo.identify.ReinsuranceCaptchaVo;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
@@ -63,6 +65,11 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         huaNongCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword(), null, true);
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();
@@ -316,7 +323,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 +352,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 +414,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 +430,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 +520,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 +539,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 +599,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 "";

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

@@ -17,6 +17,8 @@ import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.HtEncryptDecryptUtils;
@@ -122,6 +124,11 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
   public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 7 - 0
tenant/insurance/quotation-renbao/src/main/java/com/jzg/quotation/renbao/crawler/service/impl/RenBaoCrawlerRequestImpl.java

@@ -8,6 +8,8 @@ import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.renbao.crawler.component.RenBaoCrawlerRequestComponent;
 import com.jzg.quotation.renbao.crawler.constant.enums.ClauseTypeEnum;
 import com.jzg.quotation.renbao.crawler.entity.dto.PrpCinsuredsDTO;
@@ -38,6 +40,11 @@ public class RenBaoCrawlerRequestImpl implements RenBaoCrawlerRequest {
 
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
   public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 7 - 0
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -10,6 +10,8 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+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.renbaonew.crawler.component.RenBaoNewCrawlerCacheComponent;
 import com.jzg.quotation.renbaonew.crawler.component.RenBaoNewCrawlerRequestComponent;
@@ -66,6 +68,11 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
         getTokenService.getToken(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return getTokenService.detectLogin(detectLoginRequest);

+ 7 - 0
tenant/insurance/quotation-shenneng/src/main/java/com/jzg/quotation/shenneng/crawler/service/impl/ShenNengCrawlerRequestImpl.java

@@ -6,6 +6,8 @@ import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.shenneng.crawler.service.ShenNengCrawlerLoginService;
 import com.jzg.quotation.shenneng.crawler.service.ShenNengCrawlerRequest;
 import lombok.RequiredArgsConstructor;
@@ -22,6 +24,11 @@ public class ShenNengCrawlerRequestImpl implements ShenNengCrawlerRequest {
         shenNengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return shenNengCrawlerLoginService.detectLogin(detectLoginRequest);

+ 10 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -40,6 +40,7 @@ import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.service.QuotationBaseService;
+import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerRequest;
 import com.jzg.quotation.summary.aop.AuditVerification;
@@ -1001,14 +1002,21 @@ public class UnifyOrderManager {
     @PostMapping("guoRenlogin")
     @Operation(summary = "国任登录")
     public HttpResult guoRenlogin(@RequestBody LoginBase loginBase) {
-        guoRenCrawlerRequest.login(loginBase);
+//        guoRenCrawlerRequest.login(loginBase);
+//        return HttpResult.ok();
+
+        QuotationCrawlerBaseService loginService = companyFactory.getLoginService(loginBase);
+
+        loginService.login(loginBase);
         return HttpResult.ok();
     }
 
     @PostMapping("getGuoRenCaptcha")
     @Operation(summary = "国任登录验证码")
     public HttpResult getGuoRenCaptcha(@RequestBody GetCaptchaRequest sendCaptchaRequest) {
-        return HttpResult.ok(guoRenCrawlerRequest.getCaptcha(sendCaptchaRequest));
+        QuotationCrawlerBaseService captchaService = companyFactory.getCaptchaService(sendCaptchaRequest);
+        //return HttpResult.ok(guoRenCrawlerRequest.getCaptcha(sendCaptchaRequest));
+        return HttpResult.ok(captchaService.getCaptcha(sendCaptchaRequest));
     }
 
     @PostMapping("/detectLogin")

+ 34 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java

@@ -10,12 +10,14 @@ import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.commons.constants.quote.enums.base.ApiType;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.service.QuotationApiBaseService;
 import com.jzg.quotation.commons.service.QuotationBaseService;
 import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
@@ -115,6 +117,38 @@ public class CompanyFactory {
         return service;
     }
 
+
+    public QuotationCrawlerBaseService getCaptchaService(GetCaptchaRequest sendCaptchaRequest) {
+        // 获取service
+        QuotationCrawlerBaseService service = getQuotationBaseInfo(Integer.parseInt(sendCaptchaRequest.getApiType()), sendCaptchaRequest.getCompanyCode());
+
+        return service;
+    }
+
+    public QuotationCrawlerBaseService getLoginService(LoginBase loginBase) {
+        // 获取service
+        QuotationCrawlerBaseService service = getQuotationBaseInfo(Integer.parseInt(loginBase.getApiType()), loginBase.getCompanyCode());
+
+        return service;
+    }
+
+
+    private QuotationCrawlerBaseService getQuotationBaseInfo(int apiType, String insuranceCode) {
+        log.info("quotationCrawlerBaseServiceMap参数的值:{}", com.alibaba.fastjson.JSON.toJSONString(quotationCrawlerBaseServiceMap));
+
+        String s = extractEnglishChars(insuranceCode);
+        QuotationCrawlerBaseService quotationApiBaseService = null;
+        String s1 = s + apiType;
+        if (ApiType.API_2.getCode() == apiType) {
+            quotationApiBaseService = quotationCrawlerBaseServiceMap.get(s1);
+        }
+        if (!ObjectUtils.isEmpty(quotationApiBaseService)) {
+            return quotationApiBaseService;
+        }
+        log.error("报价类型出错,请联系管理员:apiType=[{}],insuranceCode=[{}]", apiType, insuranceCode);
+        throw new SystemException("报价类型出错,请联系管理员处理。");
+    }
+
     /**
      * 获取保司实体
      *

+ 7 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java

@@ -16,6 +16,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.taikang.crawler.ConvertUtil;
 import com.jzg.quotation.taikang.crawler.cache.RedisCacheUtil;
 import com.jzg.quotation.taikang.crawler.client.AESDecryptor;
@@ -112,6 +114,11 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo commonQuoteVo) {
         CarInfoVo commonCarInfoVo = commonQuoteVo.getCarInfoVo();

+ 7 - 0
tenant/insurance/quotation-taipingyang/src/main/java/com/jzg/quotation/taipingyang/crawler/service/impl/TaiPingYangCrawlerRequestImpl.java

@@ -7,6 +7,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.CookiesRequest;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.taipingyang.crawler.component.TaiPingYangCrawlerRequestComponent;
 import com.jzg.quotation.taipingyang.crawler.entity.request.TaiPingYangCrawlerCarInfoRequest;
@@ -34,6 +36,11 @@ public class TaiPingYangCrawlerRequestImpl implements TaiPingYangCrawlerRequest
 
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return taiPingYangCrawlerQuoteProcessService.detectLogin(detectLoginRequest);

+ 1 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java

@@ -157,7 +157,7 @@ public class TaiShanCrawlerRequestComponent {
      * @return
      */
     public TaiShanCrawlerLoginResponse login(TaiShanCrawlerLoginRequest request, HttpHeaders headers) {
-        TaiShanCrawlerLoginResponse response = post(RequestUrl.CONFIRM, request, TaiShanCrawlerLoginResponse.class, headers);
+        TaiShanCrawlerLoginResponse response = post(RequestUrl.AUTHENTICATE, request, TaiShanCrawlerLoginResponse.class, headers);
         return response;
     }
 

+ 2 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java

@@ -10,6 +10,8 @@ public enum RequestUrl {
     HUAKUAI("/api_prod/auth/api/base/base_anji/get", "获取滑块验证码"),
     CHECK("/api_prod/auth/api/base/base_anji/check", "滑块校验"),
 
+    // 登录认证
+    AUTHENTICATE("/api_prod/auth/api/authenticate", "登录认证"),
 
     // 车辆相关
     CAR("/api_prod/ins/api/search/vehicle", "车型查询"),

+ 4 - 2
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerLoginRequest.java

@@ -37,9 +37,11 @@ public class TaiShanCrawlerLoginRequest implements Serializable {
         StringBuffer aesSb = new StringBuffer();
         aesSb.append(token + "---");
         aesSb.append(aesRes);
-        String captchaVerification = TaiShanCrawlerUtils.aesEncrypt(aesSb.toString(), secretKey);
+        //String captchaVerification = TaiShanCrawlerUtils.aesEncrypt(aesSb.toString(), secretKey);
+        String captchaVerification = "";
         this.username = loginBase.getUsername();
-        this.password = TaiShanCrawlerUtils.desEncrypt(loginBase.getPassword(),"chdAdmin");
+        //this.password = TaiShanCrawlerUtils.desEncrypt(loginBase.getPassword(),"chdAdmin");
+        this.password = loginBase.getPassword();
         this.rememberMe = true;
         this.smsCode = loginBase.getCaptcha();
         this.code = captchaVerification;

+ 6 - 6
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerSmsCodeRequest.java

@@ -1,6 +1,5 @@
 package com.jzg.quotation.taishan.crawler.entity.request;
 
-import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerVerifyResponse;
 import com.jzg.quotation.taishan.crawler.util.TaiShanCrawlerUtils;
@@ -30,11 +29,12 @@ public class TaiShanCrawlerSmsCodeRequest implements Serializable {
     public TaiShanCrawlerSmsCodeRequest(TaiShanCrawlerVerifyResponse verifyResponse, List<Integer> integers, List<Integer> sizeList, String password, String username){
         int x = integers.get(0);
         int width = sizeList.get(0);
-        int t = 310 * x / width;
-        JSONObject pointJson = new JSONObject();
-        pointJson.put("x", x);
-        pointJson.put("y", 5);
-        String encryptedPointJson = TaiShanCrawlerUtils.aesEncrypt(pointJson.toJSONString(), verifyResponse.getRepData().getSecretKey());
+        // 参考Python实现:t = 310 * t / setSize_imgWidth (浮点除法)
+        double t = 310.0 * x / width;
+        // 参考Python实现:point_json = '{"x":'+str(t)+',"y":5}'
+        // 手动拼接字符串,确保与Python格式完全一致,避免JSONObject序列化差异
+        String pointJsonStr = "{\"x\":" + t + ",\"y\":5}";
+        String encryptedPointJson = TaiShanCrawlerUtils.aesEncrypt(pointJsonStr, verifyResponse.getRepData().getSecretKey());
         String crtm = TaiShanCrawlerUtils.desEncrypt(password,"chdAdmin");
         this.captchaVO = new CaptchaVODTO(encryptedPointJson, verifyResponse.getRepData().getToken());
         this.userId = username;

+ 3 - 2
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerVerifyRequest.java

@@ -19,11 +19,12 @@ public class TaiShanCrawlerVerifyRequest implements Serializable {
     @JsonProperty("clientUid")
     private String clientUid;
     @JsonProperty("ts")
-    private double ts;
+    private long ts;
 
     public TaiShanCrawlerVerifyRequest(String clientUid) {
         this.captchaType = "blockPuzzle";
         this.clientUid = clientUid;
-        this.ts = System.currentTimeMillis() / 1000.0;
+        // 参考Python实现:int(time.time() * 1000) 毫秒级整数时间戳
+        this.ts = System.currentTimeMillis();
     }
 }

+ 30 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanExternalSendCodeRequest.java

@@ -0,0 +1,30 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 外部发送验证码请求
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class TaiShanExternalSendCodeRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty("check")
+    private String check;
+
+    @JsonProperty("username")
+    private String username;
+
+    @JsonProperty("pwd")
+    private String pwd;
+}

+ 2 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerSmsCodeResponse.java

@@ -14,6 +14,8 @@ public class TaiShanCrawlerSmsCodeResponse implements Serializable, TaiShanCrawl
     @Serial
     private static final long serialVersionUID = 0157577267035300221620L;
 
+    @JsonProperty("code")
+    private String code;
 
     @JsonProperty("repCode")
     private String repCode;

+ 43 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanExternalSendCodeResponse.java

@@ -0,0 +1,43 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 外部发送验证码响应
+ */
+@NoArgsConstructor
+@Data
+public class TaiShanExternalSendCodeResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("code")
+    private Integer code;
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JsonProperty("token")
+        private String token;
+
+        @JsonProperty("secretKey")
+        private String secretKey;
+
+        @JsonProperty("pointJson")
+        private String pointJson;
+    }
+}

+ 20 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/properties/ExteriorCaptchaProperties.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.taishan.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 外部验证码接口配置属性
+ * 从 Nacos 配置中读取
+ */
+@Component
+@ConfigurationProperties(prefix = "exterior.api.sendcode")
+@Data
+public class ExteriorCaptchaProperties {
+
+    /**
+     * 验证码服务
+     */
+    private String url;
+}

+ 9 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerQuoteProcessService.java

@@ -2,6 +2,8 @@ package com.jzg.quotation.taishan.crawler.service;
 
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import org.springframework.http.HttpHeaders;
 
 /**
@@ -10,6 +12,13 @@ import org.springframework.http.HttpHeaders;
  * @date: 2025年9月17日16:28:40
  **/
 public interface TaiShanCrawlerQuoteProcessService {
+    /**
+     * 获取验证码
+     *
+     * @param sendCaptchaRequest 获取验证码请求
+     * @return 验证码响应
+     */
+    GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest);
 
     /**
      * 登录

+ 2 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.taishan.crawler.service;
 
+import com.jzg.quotation.commons.service.GetCaptchaBaseService;
 import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
 
 /**
@@ -7,6 +8,6 @@ import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
  * @author:
  * @date:
  **/
-public interface TaiShanCrawlerRequest extends QuotationCrawlerBaseService {
+public interface TaiShanCrawlerRequest extends QuotationCrawlerBaseService, GetCaptchaBaseService {
 
 }

+ 157 - 34
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java

@@ -4,21 +4,30 @@ import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.quote.enums.base.ExpenseRequestUrl;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerCacheComponent;
 import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerRequestComponent;
+import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerLoginRequest;
 import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerSmsCodeRequest;
 import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerVerifyRequest;
+import com.jzg.quotation.taishan.crawler.entity.request.TaiShanExternalSendCodeRequest;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerLoginResponse;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerSmsCodeResponse;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerVerifyResponse;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanExternalSendCodeResponse;
+import com.jzg.quotation.taishan.crawler.properties.ExteriorCaptchaProperties;
 import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerQuoteProcessService;
 import com.jzg.quotation.taishan.crawler.util.TaiShanCrawlerUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import java.nio.charset.StandardCharsets;
@@ -45,31 +54,117 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
 
     private final ExteriorUtilsRequest exteriorUtilsRequest;
 
+    private final RequestComponent requestComponent;
+
+    private final ExteriorCaptchaProperties exteriorCaptchaProperties;
+
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
 
+//    @Override
+//    public void sendCode(String username, String password) {
+//        HttpHeaders httpHeaders = new HttpHeaders();
+//        getVerifyHeader(httpHeaders);
+//        // 获取滑块验证码
+//        Map<String, String> map = uuid();
+//        TaiShanCrawlerVerifyRequest verifyRequest = new TaiShanCrawlerVerifyRequest(map.get("slider"));
+//        log.info("verifyRequest参数的值:{}", JSON.toJSONString(verifyRequest));
+//
+//        TaiShanCrawlerVerifyResponse verifyResponse = taiShanCrawlerRequestComponent.crawlerVerify(verifyRequest, httpHeaders);
+//        log.info("verifyResponse参数的值:{}", JSON.toJSONString(verifyResponse));
+//        // 滑块验证码识别
+//        TaiShanCrawlerVerifyResponse.RepDataDTO repData = verifyResponse.getRepData();
+//        List<Integer> integers = exteriorUtilsRequest.sliderCaptchaIdentify(ExpenseRequestUrl.SLIDER_IDENTIFY, new SliderCaptchaVo(repData.getOriginalImageBase64(), repData.getJigsawImageBase64()));
+//        // 获取图片的宽高
+//        List<Integer> sizeList = TaiShanCrawlerUtils.getImageSizeFromBase64(repData.getOriginalImageBase64());
+//        // 获取验证码
+//        TaiShanCrawlerSmsCodeRequest smsCodeRequest = new TaiShanCrawlerSmsCodeRequest(verifyResponse, integers, sizeList, password, username);
+//        log.info("smsCodeRequest参数的值:{}", JSON.toJSONString(smsCodeRequest));
+//        TaiShanCrawlerSmsCodeResponse smsCodeResponse = taiShanCrawlerRequestComponent.crawlerCheck(smsCodeRequest, httpHeaders);
+//        log.info("smsCodeResponse参数的值:{}", JSON.toJSONString(smsCodeResponse));
+//
+//        // 缓存登录信息
+//        Map<String, Object> tokenMap = new HashMap<>();
+//        tokenMap.put("token", smsCodeResponse.getRepData().getToken());
+//        tokenMap.put("secretKey", verifyResponse.getRepData().getSecretKey());
+//        tokenMap.put("pointJson", smsCodeResponse.getRepData().getPointJson());
+//        log.info("TaiShan-tokenMap参数的值:{}", JSON.toJSONString(tokenMap));
+//        taiShanCrawlerCacheComponent.cacheToken(username, tokenMap);
+//    }
+
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        log.info("开始获取泰山账号验证码");
+
+        GetCaptchaResponse getCaptchaResponse = new GetCaptchaResponse();
+        if(sendCaptchaRequest != null){
+            String username = sendCaptchaRequest.getUsername();
+            String password = sendCaptchaRequest.getPassword();
+
+            if(StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)){
+                // 调用外部发送验证码接口(URL从Nacos配置读取)
+                TaiShanExternalSendCodeRequest externalRequest = new TaiShanExternalSendCodeRequest("", username, password);
+                log.info("externalSendCodeRequest参数的值:{}", JSON.toJSONString(externalRequest));
+
+                String sendCodeUrl = exteriorCaptchaProperties.getUrl();
+                log.info("外部发送验证码接口URL:{}", sendCodeUrl);
+
+                // 使用代码中已有的 requestComponent.post 方法
+                HttpHeaders externalHeaders = new HttpHeaders();
+                ResponseEntity<String> externalResponseEntity = requestComponent.post(sendCodeUrl, JSON.toJSONString(externalRequest), String.class, externalHeaders);
+                String externalResponseBody = externalResponseEntity.getBody();
+                log.info("外部发送验证码接口响应内容:{}", externalResponseBody);
+                TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
+                log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
+
+                // 从外部响应中获取数据并缓存
+                TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
+                Map<String, Object> tokenMap = new HashMap<>();
+                tokenMap.put("token", externalData.getToken());
+                tokenMap.put("secretKey", externalData.getSecretKey());
+                tokenMap.put("pointJson", externalData.getPointJson());
+                log.info("TaiShan-tokenMap参数的值(从外部接口获取):{}", JSON.toJSONString(tokenMap));
+                taiShanCrawlerCacheComponent.cacheToken(username, tokenMap);
+
+                getCaptchaResponse.setIdentifyId(externalData.getToken());
+            }
+        }
+
+        return getCaptchaResponse;
+    }
+
+
+
     @Override
     public void sendCode(String username, String password) {
-        HttpHeaders httpHeaders = new HttpHeaders();
-        getVerifyHeader(httpHeaders);
-        // 获取滑块验证码
-        Map<String, String> map = uuid();
-        TaiShanCrawlerVerifyRequest verifyRequest = new TaiShanCrawlerVerifyRequest(map.get("slider"));
-        TaiShanCrawlerVerifyResponse verifyResponse = taiShanCrawlerRequestComponent.crawlerVerify(verifyRequest, httpHeaders);
-        // 滑块验证码识别
-        TaiShanCrawlerVerifyResponse.RepDataDTO repData = verifyResponse.getRepData();
-        List<Integer> integers = exteriorUtilsRequest.sliderCaptchaIdentify(ExpenseRequestUrl.SLIDER_IDENTIFY, new SliderCaptchaVo(repData.getOriginalImageBase64(), repData.getJigsawImageBase64()));
-        // 获取图片的宽高
-        List<Integer> sizeList = TaiShanCrawlerUtils.getImageSizeFromBase64(repData.getOriginalImageBase64());
-        // 获取验证码
-        TaiShanCrawlerSmsCodeRequest smsCodeRequest = new TaiShanCrawlerSmsCodeRequest(verifyResponse, integers, sizeList, password, username);
-        TaiShanCrawlerSmsCodeResponse smsCodeResponse = taiShanCrawlerRequestComponent.crawlerCheck(smsCodeRequest, httpHeaders);
-
-        // 缓存登录信息
+        // 调用外部发送验证码接口(URL从Nacos配置读取)
+        TaiShanExternalSendCodeRequest externalRequest = new TaiShanExternalSendCodeRequest("", username, password);
+        log.info("externalSendCodeRequest参数的值:{}", JSON.toJSONString(externalRequest));
+
+        String sendCodeUrl = exteriorCaptchaProperties.getUrl();
+        log.info("外部发送验证码接口URL:{}", sendCodeUrl);
+        
+        // 使用代码中已有的 requestComponent.post 方法
+        HttpHeaders externalHeaders = new HttpHeaders();
+        ResponseEntity<String> externalResponseEntity = requestComponent.post(sendCodeUrl, JSON.toJSONString(externalRequest), String.class, externalHeaders);
+        String externalResponseBody = externalResponseEntity.getBody();
+        log.info("外部发送验证码接口响应内容:{}", externalResponseBody);
+        TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
+        log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
+
+//        if (externalResponse == null || externalResponse.getCode() != 200) {
+//            String message = externalResponse != null ? externalResponse.getMessage() : "未知错误";
+//            log.warn("外部发送验证码接口调用失败,错误信息:{}", message);
+//            throw new RuntimeException("外部发送验证码失败:" + message);
+//        }
+
+        // 从外部响应中获取数据并缓存
+        TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
         Map<String, Object> tokenMap = new HashMap<>();
-        tokenMap.put("token", smsCodeResponse.getRepData().getToken());
-        tokenMap.put("secretKey", verifyResponse.getRepData().getSecretKey());
-        tokenMap.put("pointJson", smsCodeResponse.getRepData().getPointJson());
+        tokenMap.put("token", externalData.getToken());
+        tokenMap.put("secretKey", externalData.getSecretKey());
+        tokenMap.put("pointJson", externalData.getPointJson());
+        log.info("TaiShan-tokenMap参数的值(从外部接口获取):{}", JSON.toJSONString(tokenMap));
         taiShanCrawlerCacheComponent.cacheToken(username, tokenMap);
     }
 
@@ -79,40 +174,66 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
      */
     @Override
     public void login(LoginBase loginBase) {
+        log.info("泰山-login");
         HttpHeaders httpHeaders = new HttpHeaders();
         getVerifyHeader(httpHeaders);
 
         Map<String, Object> tokenMap = taiShanCrawlerCacheComponent.getToken(loginBase.getUsername());
+        log.info("泰山-tokenMap参数的值:{}", JSON.toJSONString(tokenMap));
+
         TaiShanCrawlerLoginRequest loginRequest = new TaiShanCrawlerLoginRequest(loginBase,tokenMap);
+        log.info("TaiShan-loginRequest参数的值:{}", JSON.toJSONString(loginRequest));
         TaiShanCrawlerLoginResponse loginResponse = taiShanCrawlerRequestComponent.login(loginRequest, httpHeaders);
         log.info("TaiShan-loginResponse参数的值:{}", JSON.toJSONString(loginResponse));
         if(loginResponse.getCode().equals("200")){
             String authorization = loginResponse.getResult().getIdToken();
+            log.info("TaiShan-Username参数的值:{}", JSON.toJSONString(loginBase.getUsername()));
+            log.info("TaiShan-authorization参数的值:{}", JSON.toJSONString(authorization));
             taiShanCrawlerCacheComponent.cacheAuthorization(loginBase.getUsername(), authorization);
         }
     }
 
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        log.info("泰山-detectLogin");
         String username = detectLoginRequest.getUsername();
-        String password = detectLoginRequest.getPassword();
-        LoginBase loginBase = new LoginBase();
-        loginBase.setUsername(username);
-        loginBase.setPassword(password);
-
-        HttpHeaders httpHeaders = new HttpHeaders();
-        getVerifyHeader(httpHeaders);
-
+        String token = null;
         Map<String, Object> tokenMap = taiShanCrawlerCacheComponent.getToken(username);
-        TaiShanCrawlerLoginRequest loginRequest = new TaiShanCrawlerLoginRequest(loginBase,tokenMap);
-        TaiShanCrawlerLoginResponse loginResponse = taiShanCrawlerRequestComponent.login(loginRequest, httpHeaders);
-        if(loginResponse.getCode().equals("200")){
-            String authorization = loginResponse.getResult().getIdToken();
-            taiShanCrawlerCacheComponent.cacheAuthorization(loginBase.getUsername(), authorization);
+        if(tokenMap !=null && !tokenMap.isEmpty()){
+            token = (String) tokenMap.get("token");
         }
-        return true;
+        return StringUtils.hasText(token);
+
+
+//        log.info("TaiShan-detectLoginRequest参数的值:{}", JSON.toJSONString(detectLoginRequest));
+//        String username = detectLoginRequest.getUsername();
+//        String password = detectLoginRequest.getPassword();
+//        LoginBase loginBase = new LoginBase();
+//        loginBase.setUsername(username);
+//        loginBase.setPassword(password);
+//        log.info("TaiShan-loginBase参数的值:{}", JSON.toJSONString(loginBase));
+//
+//        HttpHeaders httpHeaders = new HttpHeaders();
+//        getVerifyHeader(httpHeaders);
+//
+//        sendCode(username, password);
+//
+//        Map<String, Object> tokenMap = taiShanCrawlerCacheComponent.getToken(username);
+//        log.info("TaiShan-tokenMap参数的值:{}", JSON.toJSONString(tokenMap));
+
+
+//        TaiShanCrawlerLoginRequest loginRequest = new TaiShanCrawlerLoginRequest(loginBase,tokenMap);
+//        TaiShanCrawlerLoginResponse loginResponse = taiShanCrawlerRequestComponent.login(loginRequest, httpHeaders);
+//        log.info("TaiShan-loginResponse参数的值:{}", JSON.toJSONString(loginResponse));
+//        if(loginResponse.getCode().equals("200")){
+//            String authorization = loginResponse.getResult().getIdToken();
+//            //缓存登录的信息
+//            taiShanCrawlerCacheComponent.cacheAuthorization(loginBase.getUsername(), authorization);
+//        }
+//        return true;
     }
 
+
     private void getVerifyHeader(HttpHeaders httpHeaders) {
         httpHeaders.set(HttpHeaders.ACCEPT, "application/json, text/plain, */*");
         httpHeaders.set(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9");
@@ -174,7 +295,9 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
      */
     @Override
     public HttpHeaders getHeaders(String username, String comCode) {
-        String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTUsImV4cCI6MTc4MTY4NzIzMn0.ldWz9TMY4AJ75VE0Bk1mkzAXPC9jJNMIWL82n0kGHrBwASgGvBxO3fe7orHbCIowt0athoRn1zA9m5ZNnO7olg";
+        //String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTUsImV4cCI6MTc4MTY4NzIzMn0.ldWz9TMY4AJ75VE0Bk1mkzAXPC9jJNMIWL82n0kGHrBwASgGvBxO3fe7orHbCIowt0athoRn1zA9m5ZNnO7olg";
+
+        String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTIsImV4cCI6MTc4MTk0MDMyMX0.rsR8yMmSsB5iOstJSToswargqTCFB5He37UydrlK_lKFsHVqtBL-EOAgls4YL4nKWvRtbSxxY6HZRczHFG0iRw";
         HttpHeaders httpHeaders = new HttpHeaders();
         
         httpHeaders.set("Accept", "application/json, text/plain, */*");

+ 8 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java

@@ -12,6 +12,8 @@ import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.taishan.crawler.build.TaiShanCrawlerQuoteRequestVoBuild;
 import com.jzg.quotation.taishan.crawler.build.TaiShanCrawlerQuoteResultsVoBuild;
@@ -61,7 +63,10 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
 
     public static final int CIRCULATE_NUMBER = 3;
 
-
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return taiShanCrawlerQuoteProcessService.getCaptcha(sendCaptchaRequest);
+    }
     /**
      * 登录
      *
@@ -558,4 +563,6 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
         }
         return downloadPolicyResultVo;
     }
+
+
 }

+ 13 - 3
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java

@@ -13,6 +13,7 @@ import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.ObjectUtil;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.PlatformClient;
@@ -21,6 +22,8 @@ import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.zhongan.crawler.build.ZhongAnCrawlerQuoteResultsVoBuild;
@@ -36,6 +39,7 @@ import com.jzg.quotation.zhongan.crawler.service.ZhongAnCrawlerOrderService;
 import com.jzg.quotation.zhongan.crawler.service.ZhongAnCrawlerRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -46,6 +50,7 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -202,20 +207,20 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
             return quoteResultsVo;
         }
         // 处理重复投保
-        if (quoteResponse.getAdditionalInfo() != null) {
+        if (ObjectUtils.isNotEmpty(quoteResponse.getAdditionalInfo())) {
             if (quoteResponse.getAdditionalInfo().getInsureMessageF() != null && quoteResponse.getAdditionalInfo().getInsureMessageF().contains("重复投保")) {
                 String jqExtractDate = jqExtractDate(quoteResponse);
                 if (jqExtractDate != null) {
                     quoteRequest.setCompelInsEffectiveDate(jqExtractDate);
                 }
                 quoteResponse = zhongAnCrawlerRequestComponent.quote(quoteRequest, headers);
-                if (quoteResponse.getAdditionalInfo() != null && quoteResponse.getAdditionalInfo().getInsureMessage().contains("重复投保")) {
+                if (ObjectUtils.isNotEmpty(quoteResponse.getAdditionalInfo()) && quoteResponse.getAdditionalInfo().getInsureMessage() != null && quoteResponse.getAdditionalInfo().getInsureMessage().contains("重复投保")) {
                     String syExtractDate = syExtractDate(quoteResponse);
                     if (syExtractDate != null) {
                         quoteRequest.setEffectiveDate(syExtractDate);
                     }
+                    quoteResponse = zhongAnCrawlerRequestComponent.quote(quoteRequest, headers);
                 }
-                quoteResponse = zhongAnCrawlerRequestComponent.quote(quoteRequest, headers);
             }
         }
 
@@ -642,4 +647,9 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
     public void login(LoginBase loginBase) {
 
     }
+
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
 }

+ 7 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -13,6 +13,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.CacheConstant;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.zhongmei.api.constant.TransCode;
@@ -66,6 +68,11 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         zmCrawlerRequestComponent.authenticate(loginBase.getUsername(), loginBase.getPassword(), ZmCrawlerRequestComponent.REQUEST_NUMBER);
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         String username = detectLoginRequest.getUsername();

+ 7 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -16,6 +16,8 @@ import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
+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.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
@@ -85,6 +87,11 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         ziJinCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
         return ziJinCrawlerQuoteProcessService.detectLogin(detectLoginRequest);

+ 2 - 2
tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java

@@ -96,8 +96,8 @@ public class SchemeController {
 
     @Operation(summary = "获取方案结果")
     @GetMapping("/getSchemeResult")
-    public HttpResult getSchemeResult(String companyId,String productId){
-        SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId);
+    public HttpResult getSchemeResult(String companyId,String productId,String seatCount){
+         SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId,seatCount);
         return HttpResult.ok(schemeResultVo);
     }
 

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/jyxSettingMapper.java

@@ -0,0 +1,9 @@
+package com.jzg.organization.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.commons.entity.po.jyxSetting;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface jyxSettingMapper extends BaseMapper<jyxSetting> {
+}

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java

@@ -80,7 +80,7 @@ public interface PtlSchemeService extends IService<PtlScheme> {
      * @param productId
      * @return
      */
-    public SchemeResultVo getSchemeResult(String companyId,String productId);
+    public SchemeResultVo getSchemeResult(String companyId,String productId,String seatCount);
 
     List<InsBusinessInsuranceVo> getBusinessInsuranceListByKindType(String kindCode);
 

+ 29 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -20,6 +20,7 @@ import com.jzg.commons.entity.agreement.dispatch.vo.PtlAgreementDispatchVo;
 import com.jzg.commons.entity.agreement.dispatch.vo.ValidateDispatchRuleVo;
 import com.jzg.commons.entity.costs.vo.ValidateSchemeRuleVo;
 import com.jzg.commons.entity.po.*;
+import com.jzg.commons.entity.po.jyxSetting;
 import com.jzg.commons.entity.quote.vo.SalespersonInfoVo;
 import com.jzg.commons.entity.scheme.po.*;
 import com.jzg.commons.entity.scheme.vo.*;
@@ -92,6 +93,9 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     @Autowired
     SysUserJzgInfoService sysUserJzgInfoService;
 
+    @Autowired
+    jyxSettingMapper jyxSettingMapper;
+
     /**
      * 添加方案
      * @param ptlSchemeSaveVo 车险报价的方案
@@ -487,10 +491,14 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     }
 
     @Override
-    public SchemeResultVo getSchemeResult(String companyId, String productId) {
+    public SchemeResultVo getSchemeResult(String companyId, String productId,String seatCount) {
         log.info("根据保司Id和产品id查询协议信息。 companyId=[{}],productId=[{}]", companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeInsuranceInfo = ptlSchemeMapper.getSchemeInsuranceInfo(companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeDrivingInfo = ptlSchemeMapper.getSchemeDrivingInfo(companyId, productId);
+
+
+
+
         // 创建一个 Map,Key: info.id, Value: List<Driving>
         Map<String, List<SchemeResultVo.Driving>> drivingMap = new HashMap<>();
 
@@ -500,6 +508,26 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
                 drivingMap.put(info.getId(), info.getDrivings());
             }
         }
+        // 处理驾意险中的座位险逻辑,根据座位数匹配实际保险金额
+        if (StrUtil.isNotBlank(seatCount)) {
+            int seats = Integer.parseInt(seatCount);
+            drivingMap.forEach((infoId, drivings) -> {
+                drivings.forEach(driving -> {
+                    jyxSetting setting = jyxSettingMapper.selectOne(
+                            new LambdaQueryWrapper<jyxSetting>()
+                                    .eq(jyxSetting::getJyxConfigId, driving.getId())
+                                    .eq(jyxSetting::getSeats, seats)
+                                    .last("limit 1"));
+                    if (setting != null) {
+                        driving.setProductCode(setting.getProductCode());
+                        driving.setPremium(setting.getPremium() != null ? setting.getPremium().toString() : null);
+                        driving.setCoverage(setting.getCoverage() != null ? setting.getCoverage().toString() : null);
+                    }
+                });
+            });
+        }
+
+
 
         // 遍历 schemeInsuranceInfo,把 drivings 合并
         for (SchemeResultVo.SchemeVo insuranceScheme : schemeInsuranceInfo) {

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

@@ -68,6 +68,7 @@ tenant:
     - esm_ins_company
     - qr_barcode_config
     - jyx_config
+    - jyx_setting
     - sys_user_jzg_app
     - sys_dept
     - sys_user_jzg_info_salesman