Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	tenant/organization/src/main/resources/application.yml
Qchen 1 year ago
parent
commit
daa929e661
96 changed files with 4567 additions and 1035 deletions
  1. 1 0
      commons/src/main/java/com/jzg/commons/constants/quote/enums/base/ExpenseRequestUrl.java
  2. 3 3
      commons/src/main/java/com/jzg/commons/entity/costs/vo/ValidateSchemeRuleVo.java
  3. 7 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/InsuranceUploadImageVo.java
  4. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerLoginServiceImpl.java
  5. 5 3
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/client/ChengTaiAPI.java
  6. 84 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/component/ChengTaiRequestCrawlerComponent.java
  7. 39 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/ChengTaiCrawlerConfigureParameters.java
  8. 53 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiCheckCaptchaRequest.java
  9. 23 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiGetCaptchaRequest.java
  10. 36 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiLoginRequest.java
  11. 68 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiCheckCaptchaResponse.java
  12. 59 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiGetCaptchaResponse.java
  13. 20 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiLoginResponse.java
  14. 14 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/properties/ChengTaiCrawlerProperties.java
  15. 39 157
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiAPIService.java
  16. 30 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiCrawlerQuoteProcessService.java
  17. 54 70
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiCrawlerRequestService.java
  18. 77 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/impl/ChengTaiCrawlerQuoteProcessServiceImpl.java
  19. 78 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/utils/CryptoUtils.java
  20. 44 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/utils/RSACipher.java
  21. 32 0
      tenant/insurance/quotation-chengtai/src/main/resources/certs/CFCA EV ROOT.crt
  22. 0 112
      tenant/insurance/quotation-chengtai/src/test/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiAPIServiceTest.java
  23. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java
  24. 98 13
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  25. 54 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/SslConfig.java
  26. 85 37
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java
  27. 2 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/ExteriorUtilsRequest.java
  28. 5 4
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/impl/ExteriorUtilsRequestImpl.java
  29. 56 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/Base64ImageUtils.java
  30. 18 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  31. 75 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/HttpUtil.java
  32. 42 21
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/build/HbCrawlerQuoteResultVoBuild.java
  33. 146 21
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  34. 6 1
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/constant/enums/RequestUrl.java
  35. 4 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/HengBangCrawlerConfigureParameters.java
  36. 30 8
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  37. 49 4
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerDepreciationRequest.java
  38. 14 8
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerFileUploadRequest.java
  39. 28 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQueryCarInfoRequest.java
  40. 18 9
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQueryCarRequest.java
  41. 93 24
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java
  42. 0 18
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerDepreciationResponse.java
  43. 62 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerQueryCarResponse.java
  44. 25 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerQueryUserInfoResponse.java
  45. 158 47
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  46. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  47. 5 0
      tenant/insurance/quotation-summary/pom.xml
  48. 8 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  49. 4 0
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  50. 182 182
      tenant/insurance/quotation-summary/src/test/java/com/jzg/quotation/taikang/crawler/service/ChengTaiCrawlerRequestServiceTest.java
  51. 0 33
      tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TaiKangHttpClientTest.java
  52. 2 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/build/ZhongAnCrawlerQuoteResultsVoBuild.java
  53. 101 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerCacheComponent.java
  54. 101 25
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java
  55. 10 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/constant/ZhongAnRequestConstant.java
  56. 27 5
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/constant/enums/RequestUrl.java
  57. 1 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/ZhongAnCrawlerConfigureParameters.java
  58. 26 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/dto/NonAutoInfoDto.java
  59. 8 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerBaseRequest.java
  60. 450 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCacheCarQueryRequest.java
  61. 84 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCacheInputRequest.java
  62. 22 3
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCarQueryRequest.java
  63. 44 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCarVinRequest.java
  64. 98 21
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerConfirmOrderRequest.java
  65. 17 4
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerConfirmQuoteRequest.java
  66. 18 5
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerGetOrderRequest.java
  67. 41 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerInitDataRequest.java
  68. 2 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerJyxUnderwritingRequest.java
  69. 44 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerLicenseSwitchRequest.java
  70. 34 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerLoginRequest.java
  71. 45 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerMarkRequest.java
  72. 7 2
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerPaymentRequest.java
  73. 56 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerPolicyListRequest.java
  74. 55 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQueryDetailQueryRequest.java
  75. 45 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuerySpecialRequest.java
  76. 43 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuoteBaseRequest.java
  77. 73 35
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuoteRequest.java
  78. 18 3
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerUploadImageRequest.java
  79. 45 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerUploadInitDateRequest.java
  80. 4 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerBaseResponse.java
  81. 108 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerCacheCarQueryResponse.java
  82. 87 85
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerPaymentResponse.java
  83. 45 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerPolicyListResponse.java
  84. 138 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQueryDetailQueryResponse.java
  85. 246 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQuoteBaseResponse.java
  86. 8 8
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQuoteResponse.java
  87. 7 4
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerUploadImageResponse.java
  88. 95 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerUploadInitDateResponse.java
  89. 1 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/repository/ZhongAnCrawlerOrderRepository.java
  90. 1 1
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerOrderServiceImpl.java
  91. 257 36
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java
  92. 5 3
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java
  93. 1 1
      tenant/organization/src/main/java/com/jzg/organization/state/AuditState.java
  94. 8 7
      tenant/organization/src/main/java/com/jzg/organization/state/listener/AuditStateListener.java
  95. 1 0
      tenant/organization/src/main/resources/application.yml
  96. 2 2
      tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml

+ 1 - 0
commons/src/main/java/com/jzg/commons/constants/quote/enums/base/ExpenseRequestUrl.java

@@ -16,6 +16,7 @@ public enum ExpenseRequestUrl {
     CAPTCHA_IDENTIFY("/identify/captcha", "验证码识别"),
     REINSURANCE_CAPTCHA_IDENTIFY("/reinsurance/captcha", "转保验证码识别"),
     SLIDER_IDENTIFY("/identify/slider", "滑块验证"),
+    SLIDER_MATCH("/identify/slide-match", "滑块验证"),
     ;
 
     private final String uri;

+ 3 - 3
commons/src/main/java/com/jzg/commons/entity/costs/vo/ValidateSchemeRuleVo.java

@@ -36,16 +36,16 @@ public class ValidateSchemeRuleVo {
         //车辆性质
         RList<SysDict> carNatureCode = redissonClient.getList(DICT_REDIS_KEY + "car_nature_code");
         this.quoteVo.getCarInfoVo().setCarNatureCode(
-                carNatureCode.stream().filter(x -> x.getValue().equals(this.quoteVo.getCarInfoVo().getCarNatureCode())).findFirst().get().getLabel());
+                carNatureCode.stream().filter(x -> x.getValue().equals(this.quoteVo.getCarInfoVo().getCarNatureCode())).findFirst().get().getValue());
         //能源类型
         RList<SysDict> energyTypeCode = redissonClient.getList(DICT_REDIS_KEY + "energy_type_code");
         this.quoteVo.getCarInfoVo().setEnergyTypeCode(
-                energyTypeCode.stream().filter(x->x.getValue().equals(this.quoteVo.getCarInfoVo().getEnergyTypeCode())).findFirst().get().getLabel()
+                energyTypeCode.stream().filter(x->x.getValue().equals(this.quoteVo.getCarInfoVo().getEnergyTypeCode())).findFirst().get().getValue()
         );
 
         RList<SysDict> vehicleUseCode = redissonClient.getList(DICT_REDIS_KEY + "car_kind_code");
         this.quoteVo.getCarInfoVo().setCarKindCode(
-                vehicleUseCode.stream().filter(x->x.getValue().equals(this.quoteVo.getCarInfoVo().getCarKindCode())).findFirst().get().getLabel()
+                vehicleUseCode.stream().filter(x->x.getValue().equals(this.quoteVo.getCarInfoVo().getCarKindCode())).findFirst().get().getValue()
         );
 
 

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/InsuranceUploadImageVo.java

@@ -1,5 +1,7 @@
 package com.jzg.commons.entity.quote.vo.aggregated;
 
+import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
@@ -39,6 +41,11 @@ public class InsuranceUploadImageVo implements Serializable {
      */
     private CarInfoVo carInfo;
 
+    /**
+     * 订单车辆人员信息
+     */
+    private List<InsOrdersCarUserInfo> insOrdersCarUserInfoList;
+
     public InsuranceUploadImageVo(OrderBase order, List<InsuranceImageVo> imageVoList) {
         this.order = order;
         this.imageVoList = imageVoList;

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerLoginServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.ansheng.crawler.service.impl;
 
+import com.jzg.commons.constants.quote.enums.base.ExpenseRequestUrl;
 import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.ansheng.crawler.component.AnShengCrawlerCacheComponent;
@@ -44,7 +45,7 @@ public class AnShengCrawlerLoginServiceImpl implements AnShengCrawlerLoginServic
             AnShengCrawlerVerifyResponse.DataDTO dataDTO = anShengCrawlerRequestComponent.crawlerVerify(anShengCrawlerVerifyRequest, httpHeaders);
             // 滑块验证码识别
             AnShengCrawlerVerifyResponse.DataDTO.ImageVerificationDTO imageVerification = dataDTO.getImageVerification();
-            List<Integer> integers = exteriorUtilsRequest.sliderCaptchaIdentify(new SliderCaptchaVo(imageVerification.getOriginImage(), imageVerification.getShadeImage()));
+            List<Integer> integers = exteriorUtilsRequest.sliderCaptchaIdentify(ExpenseRequestUrl.SLIDER_IDENTIFY, new SliderCaptchaVo(imageVerification.getOriginImage(), imageVerification.getShadeImage()));
             // 验证验证码
             AnShengCrawlerCheckVerificationRequest anShengCrawlerCheckVerificationRequest = new AnShengCrawlerCheckVerificationRequest(integers.get(0)
                     .toString(), integers.get(1).toString(), imageVerification.getUserFlag(), username);

+ 5 - 3
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/client/ChengTaiAPI.java

@@ -4,7 +4,10 @@ import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
 
 public enum ChengTaiAPI implements CrawlerRequestUrlStandard {
 
-    Login("/api/upms/login", "登录"),
+    GET_CAPTCHA("/api/upms/captcha/get", "获取验证码"),
+    CHECK_CAPTCHA("/api/upms/captcha/check", "验证验证码"),
+
+    LOGIN("/api/upms/login", "登录"),
     System("/api/upms/system", "系统信息"),
     FindAreaConfig("/api/vehicle/base/findAreaConfig", ""),
     FindDictionaryOfRisk("/api/vehicle/base/findDictionary?type=RISK_TYPE", "查询险种"),
@@ -24,9 +27,8 @@ public enum ChengTaiAPI implements CrawlerRequestUrlStandard {
     GetPolicyModel("/api/vehicle/query/getPolicyModel", "获取详情"),
     Insure("/api/vehicle/query/payPageQuery/{uuid}/insure", "获取支付链接"),
     DownloadAddress("/api/vehicle/core/downloadAddress", "获取保单链接"),
-    HygeiaGet("/api/vehicle/core/hygeia/get", "获取意外险"),
+    HygeiaGet("/api/vehicle/core/hygeia/get", "获取意外险");
 
-    ;
 
     private final String uri;
 

+ 84 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/component/ChengTaiRequestCrawlerComponent.java

@@ -0,0 +1,84 @@
+package com.jzg.quotation.chengtai.crawler.component;
+
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.chengtai.crawler.client.ChengTaiAPI;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiCheckCaptchaRequest;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiGetCaptchaRequest;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiLoginRequest;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiCheckCaptchaResponse;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiGetCaptchaResponse;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiLoginResponse;
+import com.jzg.quotation.chengtai.crawler.properties.ChengTaiCrawlerProperties;
+import com.jzg.quotation.commons.component.RequestComponent;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.util.Optional;
+
+@Component
+@RequiredArgsConstructor
+public class ChengTaiRequestCrawlerComponent {
+
+    private final RequestComponent requestComponent;
+
+    private final ChengTaiCrawlerProperties chengTaiCrawlerProperties;
+
+    public <Response> ResponseEntity<Response> requestBasePost(ChengTaiAPI requestUrl, Object body, Class<Response> responseClass, HttpHeaders headers) {
+        String url = chengTaiCrawlerProperties.getBaseUrl() + requestUrl.uri();
+        return requestComponent.objectPost(url, body, responseClass, headers);
+    }
+
+    public <Response> Response requestPost(ChengTaiAPI requestUrl, Object body, Class<Response> responseClass, HttpHeaders headers) {
+        return requestBasePost(requestUrl, body, responseClass, headers).getBody();
+    }
+
+    /**
+     * 获取公钥
+     *
+     * @param responseEntity 响应内容
+     * @return 公钥
+     */
+    public static <T> String getPublicKey(ResponseEntity<T> responseEntity) {
+        return Optional.ofNullable(responseEntity)
+                .map(ResponseEntity::getHeaders)
+                .map(x -> x.get("Publickey"))
+                .map(x -> x.get(0))
+                .orElseThrow(() -> new SystemException("获取公钥失败"));
+    }
+
+
+    /**
+     * 获取验证码
+     *
+     * @param request 请求内容
+     * @return 验证码
+     */
+    public ResponseEntity<ChengTaiGetCaptchaResponse> getCaptcha(ChengTaiGetCaptchaRequest request) {
+        return requestBasePost(ChengTaiAPI.GET_CAPTCHA, request, ChengTaiGetCaptchaResponse.class, new HttpHeaders());
+    }
+
+    /**
+     * 验证验证码
+     *
+     * @param request 验证码
+     * @return 验证结果
+     */
+    public ResponseEntity<ChengTaiCheckCaptchaResponse> checkCaptcha(ChengTaiCheckCaptchaRequest request) {
+        return requestBasePost(ChengTaiAPI.CHECK_CAPTCHA, request, ChengTaiCheckCaptchaResponse.class, new HttpHeaders());
+    }
+
+    /**
+     * 登录
+     *
+     * @param request 登录信息
+     * @return 登录结果
+     */
+    public ChengTaiLoginResponse login(ChengTaiLoginRequest request){
+        ResponseEntity<ChengTaiLoginResponse> response = requestComponent.formData(ChengTaiAPI.LOGIN.getRequestUrl(chengTaiCrawlerProperties.getBaseUrl()), request, ChengTaiLoginResponse.class, new HttpHeaders());
+        return response.getBody();
+    }
+
+
+}

+ 39 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/ChengTaiCrawlerConfigureParameters.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.chengtai.crawler.model;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @ClassName ChengTaiCrawlerConfigureParameters
+ * @Description 诚泰财险【爬虫】配置参数
+ * @Author wenks
+ * @Date 2025/9/10 18:07
+ * @Version 1.0
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class ChengTaiCrawlerConfigureParameters implements ConfigureParameters {
+
+    @Serial
+    private static final long serialVersionUID = 5287255169924097167L;
+
+    /**
+     * 业务归属机构
+     */
+    private String deptCode;
+    /**
+     * 业务员
+     */
+    private String handlerCode;
+    /**
+     * 中介机构
+     */
+    private String agreementCode;
+
+}
+

+ 53 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiCheckCaptchaRequest.java

@@ -0,0 +1,53 @@
+package com.jzg.quotation.chengtai.crawler.model.request;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * @ClassName ChengTaiCheckCaptchaRequest
+ * @Description 诚泰财险校验验证码请求参数
+ * @Author wenks
+ * @Date 2025/9/9 16:43
+ * @Version 1.0
+ */
+@NoArgsConstructor
+@Data
+public class ChengTaiCheckCaptchaRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3187109115725104676L;
+
+    @JsonProperty("captchaType")
+    private String captchaType;
+
+    @JsonProperty("pointJson")
+    private String pointJson;
+
+    @JsonProperty("token")
+    private String token;
+
+    public ChengTaiCheckCaptchaRequest(String pointJson, String token) {
+        this.captchaType = "blockPuzzle";
+        this.pointJson = pointJson;
+        this.token = token;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class NotchLocation{
+
+        private double x;
+
+        private int y;
+
+    }
+
+}

+ 23 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiGetCaptchaRequest.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.chengtai.crawler.model.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName ChengTaiGetCaptchaRequest
+ * @Description 诚泰财险获取验证码请求参数
+ * @Author wenks
+ * @Date 2025/9/9 15:40
+ * @Version 1.0
+ */
+@Data
+public class ChengTaiGetCaptchaRequest {
+
+    @JsonProperty("captchaType")
+    private String captchaType;
+
+    public ChengTaiGetCaptchaRequest() {
+        this.captchaType = "blockPuzzle";
+    }
+}

+ 36 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/request/ChengTaiLoginRequest.java

@@ -0,0 +1,36 @@
+package com.jzg.quotation.chengtai.crawler.model.request;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.chengtai.crawler.client.EncryptRSA;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @ClassName ChengTaiLoginRequest
+ * @Description 诚泰财险登录请求
+ * @Author wenks
+ * @Date 2025/9/9 16:56
+ * @Version 1.0
+ */
+@Data
+@AllArgsConstructor
+public class ChengTaiLoginRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2912851835581891383L;
+
+    @JsonProperty("username")
+    private String username;
+
+    @JsonProperty("password")
+    private String password;
+
+    @JsonProperty("captchaVerification")
+    private String captchaVerification;
+
+
+}

+ 68 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiCheckCaptchaResponse.java

@@ -0,0 +1,68 @@
+package com.jzg.quotation.chengtai.crawler.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * @ClassName ChengTaiCheckCaptchaResponse
+ * @Description 诚泰财险校验参数返回参数
+ * @Author wenks
+ * @Date 2025/9/9 16:43
+ * @Version 1.0
+ */
+@NoArgsConstructor
+@Data
+public class ChengTaiCheckCaptchaResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7356576829460089305L;
+
+    @JsonProperty("code")
+    private Integer code;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("body")
+    private BodyDTO body;
+
+    @NoArgsConstructor
+    @Data
+    public static class BodyDTO {
+
+        @JsonProperty("repCode")
+        private String repCode;
+
+        @JsonProperty("repData")
+        private RepDataDTO repData;
+
+        @JsonProperty("repMsg")
+        private String repMsg;
+
+        @JsonProperty("success")
+        private Boolean success;
+
+        @NoArgsConstructor
+        @Data
+        public static class RepDataDTO {
+
+            @JsonProperty("captchaType")
+            private String captchaType;
+
+            @JsonProperty("pointJson")
+            private String pointJson;
+
+            @JsonProperty("token")
+            private String token;
+
+            @JsonProperty("result")
+            private Boolean result;
+
+        }
+    }
+}

+ 59 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiGetCaptchaResponse.java

@@ -0,0 +1,59 @@
+package com.jzg.quotation.chengtai.crawler.model.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName ChengTaiGetCaptchaResponse
+ * @Description 诚泰财险获取验证码返回结果
+ * @Author wenks
+ * @Date 2025/9/9 15:42
+ * @Version 1.0
+ */
+@NoArgsConstructor
+@Data
+public class ChengTaiGetCaptchaResponse {
+
+    @JsonProperty("code")
+    private Integer code;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("body")
+    private BodyDTO body;
+
+    @NoArgsConstructor
+    @Data
+    public static class BodyDTO {
+
+        @JsonProperty("repCode")
+        private String repCode;
+
+        @JsonProperty("repData")
+        private RepDataDTO repData;
+
+        @JsonProperty("success")
+        private Boolean success;
+
+        @NoArgsConstructor
+        @Data
+        public static class RepDataDTO {
+
+            @JsonProperty("secretKey")
+            private String secretKey;
+
+            @JsonProperty("originalImageBase64")
+            private String originalImageBase64;
+
+            @JsonProperty("jigsawImageBase64")
+            private String jigsawImageBase64;
+
+            @JsonProperty("token")
+            private String token;
+
+        }
+    }
+}

+ 20 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/model/response/ChengTaiLoginResponse.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.chengtai.crawler.model.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class ChengTaiLoginResponse {
+
+    @JsonProperty("code")
+    private Integer code;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("body")
+    private String body;
+
+}

+ 14 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/properties/ChengTaiCrawlerProperties.java

@@ -0,0 +1,14 @@
+package com.jzg.quotation.chengtai.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "chengtai.crawler")
+public class ChengTaiCrawlerProperties {
+
+    private String baseUrl;
+
+}

+ 39 - 157
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiAPIService.java

@@ -9,6 +9,7 @@ import com.jzg.quotation.chengtai.crawler.model.param.*;
 import com.jzg.quotation.chengtai.crawler.model.result.*;
 import com.jzg.quotation.commons.component.RequestComponent;
 import jakarta.annotation.Resource;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,152 +26,98 @@ import java.util.Map;
 import java.util.UUID;
 
 @Service
+@RequiredArgsConstructor
 public class ChengTaiAPIService {
-    private static final Logger logger = LoggerFactory.getLogger(ChengTaiAPIService.class);
 
-    @Resource
-    private RequestComponent requestComponent;
-
-    @Resource
-    private ChengTaiInsuranceItemService chengTaiInsuranceItemService;
-
-    public void setRequestComponent(RequestComponent requestComponent) {
-        this.requestComponent = requestComponent;
-    }
+    private final RequestComponent requestComponent;
 
     private <T> T post(ChengTaiAPI api, Object body, Class<T> resultClass, HttpHeaders headers) {
-//        headers.add(":authority", "b2b.champion-ic.com");
-//        headers.add(":method", "POST");
-//        headers.add(":path", api.uri());
-//        headers.add(":scheme", "https");
         if (headers != null) {
             headers.add("traceid", UUID.randomUUID().toString());
         }
-
         String paramString = JsonUtil.toJsonString(body);
-
         ResponseEntity<String> responseEntity = requestComponent.post(api.url(), paramString, String.class, headers);
-
         String responseEntityBody = responseEntity.getBody();
-
         T objcet = JsonUtil.readObjcet(responseEntityBody, resultClass);
-
         return objcet;
     }
 
     /**
      * 查询险种
      *
-     * @param token
-     * @return
+     * @param headers 请求头
+     * @return 险种
      */
-    public List<ChengTaiDictionary> findDictionaryOfRisk(String token) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
+    public List<ChengTaiDictionary> findDictionaryOfRisk(HttpHeaders headers) {
         ChengTaiFindDictionaryResult.Response result = post(ChengTaiAPI.FindDictionaryOfRisk, null, ChengTaiFindDictionaryResult.Response.class, headers);
-
         return result.getBody();
     }
 
     /**
      * 查询登录用户信息
      *
-     * @param token
-     * @return
+     * @param headers 请求头
+     * @return 登录用户信息
      */
-    public ChengTaiQueryLoginUserInfoResult queryLoginUserInfo(String token) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
+    public ChengTaiQueryLoginUserInfoResult queryLoginUserInfo(HttpHeaders headers) {
         ChengTaiQueryLoginUserInfoResult.Response result = post(ChengTaiAPI.QueryLoginUserInfo, null, ChengTaiQueryLoginUserInfoResult.Response.class, headers);
-
         return result.getBody();
     }
 
     /**
      * 查询登录用户可用的业务归属机构
      *
-     * @param token
-     * @return
+     * @param headers 请求头
+     * @return 业务归属机构
      */
-    public List<ChengTaiFindAttributionOrgByUserResult> findAttributionOrgByUser(String token) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
+    public List<ChengTaiFindAttributionOrgByUserResult> findAttributionOrgByUser(HttpHeaders headers) {
         ChengTaiFindAttributionOrgByUserResult.Response result = post(ChengTaiAPI.FindAttributionOrgByUser, null, ChengTaiFindAttributionOrgByUserResult.Response.class, headers);
-
         return result.getBody();
     }
 
-    public List<ChengTaiFindSaleManVoByDeptCodeResult> findSaleManVoByDeptCode(String token, String deptCode, String isOuter, List<String> riskCodes) {
+    public List<ChengTaiFindSaleManVoByDeptCodeResult> findSaleManVoByDeptCode(HttpHeaders headers, String deptCode, String isOuter, List<String> riskCodes) {
         ChengTaiFindSaleManVoByDeptCodeParam param = new ChengTaiFindSaleManVoByDeptCodeParam();
         param.setDeptCode(deptCode);
         param.setIsOuter(isOuter);
         param.setRiskCodes(riskCodes);
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiFindSaleManVoByDeptCodeResult.Response result = post(ChengTaiAPI.FindSaleManVoByDeptCode, param, ChengTaiFindSaleManVoByDeptCodeResult.Response.class, headers);
-
         return result.getBody();
     }
 
-    public ChengTaiQueryRiskAuthorityResult queryRiskAuthority(String token, String saleCode, String subAgreementCode) {
+    public ChengTaiQueryRiskAuthorityResult queryRiskAuthority(HttpHeaders headers, String saleCode, String subAgreementCode) {
         Map<String, String> param = Maps.newHashMapWithExpectedSize(2);
-
         param.put("saleCode", saleCode);
         param.put("subAgreementCode", subAgreementCode);
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiQueryRiskAuthorityResult.Response result = post(ChengTaiAPI.QueryRiskAuthority, param, ChengTaiQueryRiskAuthorityResult.Response.class, headers);
-
         return result.getBody();
     }
 
     /**
      * 查询务人员可用的中介协议和代理机构
      *
-     * @param token
+     * @param headers
      * @param saleCode
      * @param riskCodes
      * @return
      */
-    public ChengTaiFindCoreConferInfoByHandleCodeResult findCoreConferInfoByHandleCode(String token, String saleCode, List<String> riskCodes) {
+    public ChengTaiFindCoreConferInfoByHandleCodeResult findCoreConferInfoByHandleCode(HttpHeaders headers, String saleCode, List<String> riskCodes) {
         Map<String, Object> param = Maps.newHashMapWithExpectedSize(2);
-
         param.put("saleCode", saleCode);
         param.put("riskCodes", riskCodes);
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiFindCoreConferInfoByHandleCodeResult.Response result = post(ChengTaiAPI.FindCoreConferInfoByHandleCode, null, ChengTaiFindCoreConferInfoByHandleCodeResult.Response.class, headers);
-
         return result.getBody();
     }
 
-    public ChengTaiQueryVehicleListResult queryVehicleList(String token) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
+    public ChengTaiQueryVehicleListResult queryVehicleList(HttpHeaders headers) {
         ChengTaiQueryVehicleListResult.Response result = post(ChengTaiAPI.QueryVehicleList, null, ChengTaiQueryVehicleListResult.Response.class, headers);
-
         if (result == null) {
             return null;
         }
-
         ChengTaiQueryVehicleListResult body = result.getBody();
-
         if (body == null) {
             return null;
         }
-
         List<ChengTaiJqxclassidDic> jqxclassidDic = body.getJqxclassidDic();
-
         if (CollectionUtils.isNotEmpty(jqxclassidDic)) {
             jqxclassidDic.forEach(jqxclassid -> {
                 String extdata = jqxclassid.getExtdata();
@@ -193,7 +140,7 @@ public class ChengTaiAPIService {
      * @param vinCode 车架号
      * @return
      */
-    public ChengTaiQueryCarInfoResult queryCarInfo(String token, String comCode, String plateNo, String vinCode) {
+    public ChengTaiQueryCarInfoResult queryCarInfo(HttpHeaders headers, String comCode, String plateNo, String vinCode) {
         if (plateNo == null || plateNo.isBlank()) {
             plateNo = "新车上牌";
         }
@@ -203,12 +150,7 @@ public class ChengTaiAPIService {
         param.put("comCode", comCode);
         param.put("plateNo", plateNo);
         param.put("vinCode", vinCode);
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiQueryCarInfoResult.Response result = post(ChengTaiAPI.QueryCarInfo, param, ChengTaiQueryCarInfoResult.Response.class, headers);
-
         return result.getBody();
 
     }
@@ -216,22 +158,16 @@ public class ChengTaiAPIService {
     /**
      * 根据车牌号、车架号查询车型
      *
-     * @param token
+     * @param headers
      * @param modelCode 车型编号
      * @return
      */
-    public ChengTaiFindCarModelResult findCarModel(String token, String modelCode) {
+    public ChengTaiFindCarModelResult findCarModel(HttpHeaders headers, String modelCode) {
         Map<String, String> param = Maps.newHashMapWithExpectedSize(3);
-
         param.put("modelcode: ", modelCode);
         param.put("pageNo", "1");
         param.put("pageSize", "100");
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiFindCarModelResult.Response result = post(ChengTaiAPI.FindCarModel, param, ChengTaiFindCarModelResult.Response.class, headers);
-
         return result.getBody();
 
     }
@@ -239,75 +175,51 @@ public class ChengTaiAPIService {
     /**
      * 身份识别
      *
-     * @param token
      * @param applicant
      * @return
      */
-    public ChengTaiApplicant clientIdentify(String token, ChengTaiApplicant applicant) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public ChengTaiApplicant clientIdentify(HttpHeaders headers, ChengTaiApplicant applicant) {
         ChengTaiClientIdentifyResult.Response response = post(ChengTaiAPI.ClientIdentify, applicant, ChengTaiClientIdentifyResult.Response.class, headers);
-
         return response.getBody();
     }
 
     /**
      * 保存
      *
-     * @param token
+     * @param headers
      * @param param
      * @return
      */
-    public ChengTaiSaveResult save(String token, ChengTaiPremiumcalParam param) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public ChengTaiSaveResult save(HttpHeaders headers, ChengTaiPremiumcalParam param) {
         ChengTaiSaveResult.Response response = post(ChengTaiAPI.Save, param, ChengTaiSaveResult.Response.class, headers);
-
         return response.getBody();
     }
 
     /**
      * 保费计算
      *
-     * @param token
+     * @param headers
      * @param param
      * @return
      */
-    public ChengTaiPremiumcalResult premiumcal(String token, ChengTaiPremiumcalParam param) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public ChengTaiPremiumcalResult premiumcal(HttpHeaders headers, ChengTaiPremiumcalParam param) {
         ChengTaiPremiumcalResult.Response result = post(ChengTaiAPI.Premiumcal, param, ChengTaiPremiumcalResult.Response.class, headers);
-
         return result.getBody();
     }
 
-    public ChengTaiSubmitResult submit(String token, ChengTaiPremiumcalParam param) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public ChengTaiSubmitResult submit(HttpHeaders headers, ChengTaiPremiumcalParam param) {
         ChengTaiSubmitResult.Response result = post(ChengTaiAPI.Submit, param, ChengTaiSubmitResult.Response.class, headers);
-
         return result.getBody();
     }
 
     /**
      * 上传影像
      *
-     * @param token
+     * @param headers
      * @param param
      * @return
      */
-    public ChengTaiImageUploadResult imageUpload(String token, byte[] file, ChengTaiImageUploadParam param) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
+    public ChengTaiImageUploadResult imageUpload(HttpHeaders headers, byte[] file, ChengTaiImageUploadParam param) {
 
         MultiValueMap<String, Object> formData = new LinkedMultiValueMap<>();
         formData.add("uploadVo", param);
@@ -319,11 +231,8 @@ public class ChengTaiAPIService {
         });
 
         ResponseEntity<String> responseEntity = requestComponent.formData(ChengTaiAPI.ImageUpload.url(), formData, String.class, headers);
-
         String responseEntityBody = responseEntity.getBody();
-
         ChengTaiImageUploadResult.Response result = JsonUtil.readObjcet(responseEntityBody, ChengTaiImageUploadResult.Response.class);
-
         return result.getBody();
     }
 
@@ -342,7 +251,7 @@ public class ChengTaiAPIService {
 
         param.add("captchaVerification", captcha);
 
-        ResponseEntity<String> responseEntity = requestComponent.form(ChengTaiAPI.Login.url(), param, String.class, null);
+        ResponseEntity<String> responseEntity = requestComponent.form(ChengTaiAPI.LOGIN.url(), param, String.class, null);
 
         String responseEntityBody = responseEntity.getBody();
 
@@ -358,15 +267,9 @@ public class ChengTaiAPIService {
 
     }
 
-    public ChengTaiSystemResult system(String token) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public ChengTaiSystemResult system(HttpHeaders headers) {
         MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
-
         ChengTaiSystemResult.Response response = requestComponent.get(ChengTaiAPI.System.url(), param, null, ChengTaiSystemResult.Response.class, headers);
-
         List<ChengTaiSystemResult> body = response.getBody();
 
         if (body == null || body.isEmpty()) {
@@ -376,11 +279,7 @@ public class ChengTaiAPIService {
         return body.get(0);
     }
 
-    public boolean findAreaConfig(String token) {
-        HttpHeaders headers = new HttpHeaders();
-
-        headers.add("token", token);
-
+    public boolean findAreaConfig(HttpHeaders headers) {
         MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
         ChengTaiFindAreaConfigResult.Response response = requestComponent.get(ChengTaiAPI.FindAreaConfig.url(), param, null, ChengTaiFindAreaConfigResult.Response.class, headers);
 
@@ -404,17 +303,15 @@ public class ChengTaiAPIService {
     /**
      * 获取详情
      *
-     * @param token
+     * @param headers 请求头
      * @param orderId
      * @return
      */
-    public ChengTaiPremiumcalParam getPolicyModel(String token, String orderId) {
+    public ChengTaiPremiumcalParam getPolicyModel(HttpHeaders headers, String orderId) {
         MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
         param.add("orderId", orderId);
         param.add("businessType", "POLICY");
 
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
         ResponseEntity<ChengTaiGetPolicyModelResult.Response> form = requestComponent.form(ChengTaiAPI.GetPolicyModel.url(), param, ChengTaiGetPolicyModelResult.Response.class, headers);
 
         ChengTaiGetPolicyModelResult.Response response = form.getBody();
@@ -426,18 +323,13 @@ public class ChengTaiAPIService {
     /**
      * 获取支付链接
      *
-     * @param token
+     * @param headers 请求头
      * @param uuid
      * @return 就是多个值
      */
-    public List<ChengTaiInsureResult> insure(String token, String uuid) {
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
+    public List<ChengTaiInsureResult> insure(HttpHeaders headers, String uuid) {
         MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
-
         ChengTaiInsureResult.Response response = requestComponent.get(ChengTaiAPI.Insure.url().replace("{uuid}", uuid), param, null, ChengTaiInsureResult.Response.class, headers);
-
         return response.getBody();
 
     }
@@ -445,23 +337,18 @@ public class ChengTaiAPIService {
     /**
      * 获取保单下载链接
      *
-     * @param token
+     * @param headers 请求头
      * @param contractNo
      * @param policyUuid
      * @return
      */
-    public ChengTaiDownloadAddressResult downloadAddress(String token, String contractNo, String policyUuid, String expiryDate) {
+    public ChengTaiDownloadAddressResult downloadAddress(HttpHeaders headers, String contractNo, String policyUuid, String expiryDate) {
         ChengTaiDownloadAddressParam param = new ChengTaiDownloadAddressParam();
         param.setBusinessType("C");
         param.setPolicyUuid(policyUuid);
         param.setContractNo(contractNo);
         param.setValidDate(expiryDate);
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiDownloadAddressResult.Response response = post(ChengTaiAPI.DownloadAddress, param, ChengTaiDownloadAddressResult.Response.class, headers);
-
         return response.getBody();
 
     }
@@ -469,22 +356,17 @@ public class ChengTaiAPIService {
     /**
      * 获取意外险
      *
-     * @param token
+     * @param headers 请求头
      * @return
      */
-    public List<ChengTaiAccidentInsurance> hygeiaGet(String token) {
+    public List<ChengTaiAccidentInsurance> hygeiaGet(HttpHeaders headers) {
         ChengTaiHygeiaGetParam param = new ChengTaiHygeiaGetParam();
         param.setComCode("0105");
         param.setSeat(5);
         param.setRiskCode("1158");
         param.setCarKindCode("A0");
         param.setUseNatureCode("8A");
-
-        HttpHeaders headers = new HttpHeaders();
-        headers.add("token", token);
-
         ChengTaiHygeiaGetResult.Response response = post(ChengTaiAPI.HygeiaGet, param, ChengTaiHygeiaGetResult.Response.class, headers);
-
         return response.getBody();
 
     }

+ 30 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiCrawlerQuoteProcessService.java

@@ -0,0 +1,30 @@
+package com.jzg.quotation.chengtai.crawler.service;
+
+import org.springframework.http.HttpHeaders;
+
+/**
+ * @ClassName ChengTaiCrawlerQuoteProcessService
+ * @Description 诚泰财险报价过程需要的接口
+ * @Author wenks
+ * @Date 2025/9/9 15:29
+ * @Version 1.0
+ */
+public interface ChengTaiCrawlerQuoteProcessService {
+
+    /**
+     * 登录
+     *
+     * @param username 用户名
+     * @param password 密码
+     */
+    void login(String username, String password) throws Exception;
+
+
+    /**
+     * 获取token
+     *
+     * @return 请求头
+     */
+    HttpHeaders getTokenHeaders(String username, String password);
+
+}

+ 54 - 70
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiCrawlerRequestService.java

@@ -6,6 +6,9 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.jzg.commons.entity.quote.vo.*;
 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.quotation.chengtai.crawler.model.ChengTaiCrawlerConfigureParameters;
 import com.jzg.quotation.chengtai.crawler.model.entity.*;
 import com.jzg.quotation.chengtai.crawler.model.param.ChengTaiImageUploadParam;
 import com.jzg.quotation.chengtai.crawler.model.param.ChengTaiPremiumcalParam;
@@ -13,79 +16,62 @@ import com.jzg.quotation.chengtai.crawler.model.result.*;
 import com.jzg.quotation.chengtai.crawler.repository.ChengTaiLoginSessionRepository;
 import com.jzg.quotation.chengtai.crawler.repository.ChengTaiPremiumcalRepository;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
-import com.jzg.quotation.commons.service.QuotationApiBaseService;
-import jakarta.annotation.Resource;
+import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
+import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
+import org.springframework.http.HttpHeaders;
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
-@Service
-public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
-    @Resource
-    private ChengTaiAPIService chengTaiAPIService;
+@QuoteCrawlerService(value = InsuranceCode.INSURANCE_CHAC)
+@RequiredArgsConstructor
+public class ChengTaiCrawlerRequestService implements QuotationCrawlerBaseService {
 
-    @Resource
-    private ChengTaiLoginSessionRepository chengTaiLoginSessionRepository;
+    private final ChengTaiAPIService chengTaiAPIService;
 
-    @Resource
-    private ChengTaiPremiumcalRepository chengTaiPremiumcalRepository;
+    private final ChengTaiLoginSessionRepository chengTaiLoginSessionRepository;
 
-    private String username;
-    private String password;
+    private final ChengTaiPremiumcalRepository chengTaiPremiumcalRepository;
 
-    public String login() {
-        return login(username, password, null);
-    }
-
-
-    public String login(String username, String password, String captcha) {
-        ChengTaiSession session = chengTaiLoginSessionRepository.findById(username).orElse(null);
-
-        if (session != null) {
-            // 使用 system 接口验证一下 token 是否过期,如果过期置为 null,后面就会重新登录获取新 token。
-            boolean find = chengTaiAPIService.findAreaConfig(session.getToken());
-
-            if (!find) {
-                chengTaiLoginSessionRepository.delete(session);
-                session = null;
-            }
-        }
-
-        if (session == null) {
-            String token = chengTaiAPIService.login(username, password, captcha); // todo
-
-            session = new ChengTaiSession();
-            session.setToken(token);
-            session.setUsername(username);
+    private final ChengTaiCrawlerQuoteProcessService chengTaiCrawlerQuoteProcessService;
 
-            chengTaiLoginSessionRepository.save(session);
+    @Override
+    public void login(LoginBase loginBase)  {
+        try {
+            chengTaiCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getUsername());
+        }catch (Exception ignored){
+            throw new SystemException("登录失败");
         }
-
-        return session.getToken();
     }
 
     @Override
-    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
-        String token = login();
-        List<String> riskCodes = Lists.newArrayList();
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(quoteVo.getOrder().getAttributionInformationVo().getUsername(), quoteVo.getOrder().getAttributionInformationVo().getPassword());
+
+        // 归属配置
+        AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
+        ChengTaiCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ChengTaiCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
 
+        List<String> riskCodes = List.of("", "", "");
         // 当前登录人
-        ChengTaiQueryLoginUserInfoResult userInfoResult = chengTaiAPIService.queryLoginUserInfo(token);
+        ChengTaiQueryLoginUserInfoResult userInfoResult = chengTaiAPIService.queryLoginUserInfo(httpHeaders);
 
         // 查询可以使用的业务人员
-        List<ChengTaiFindSaleManVoByDeptCodeResult> saleManVoByDeptCode = chengTaiAPIService.findSaleManVoByDeptCode(token, userInfoResult.getComCode(), "false", riskCodes);
+        List<ChengTaiFindSaleManVoByDeptCodeResult> saleManVoByDeptCode = chengTaiAPIService.findSaleManVoByDeptCode(httpHeaders, userInfoResult.getComCode(), "false", riskCodes);
 
         // 默认使用第1个业务人员
         ChengTaiFindSaleManVoByDeptCodeResult saleManVo = saleManVoByDeptCode.get(0);
 
         // 查询务人员可用的中介协议和代理机构
-        ChengTaiFindCoreConferInfoByHandleCodeResult coreConferInfo = chengTaiAPIService.findCoreConferInfoByHandleCode(token, saleManVo.getUserCode(), riskCodes);
+        ChengTaiFindCoreConferInfoByHandleCodeResult coreConferInfo = chengTaiAPIService.findCoreConferInfoByHandleCode(httpHeaders, saleManVo.getUserCode(), riskCodes);
 
         // 查询务人员可用的业务信息
-        ChengTaiQueryRiskAuthorityResult queryRiskAuthorityResult = chengTaiAPIService.queryRiskAuthority(token, saleManVo.getUserCode(), coreConferInfo.getSolutionCode());
+        ChengTaiQueryRiskAuthorityResult queryRiskAuthorityResult = chengTaiAPIService.queryRiskAuthority(httpHeaders, saleManVo.getUserCode(), coreConferInfo.getSolutionCode());
 
         // 保存保险单数据1 业务人员
         ChengTaiAcciSaleInfo acciSaleInfo = buildChengTaiAcciSaleInfo(coreConferInfo, queryRiskAuthorityResult.getSalesRisks(), queryRiskAuthorityResult.getSubAgreements());
@@ -98,7 +84,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         applicant.setSignedbyOrig("0");
         applicant.setComCode("0105040012");
 
-        applicant = chengTaiAPIService.clientIdentify(token, applicant);
+        applicant = chengTaiAPIService.clientIdentify(httpHeaders, applicant);
 
         // 保存保险单数据3 被投保人
         ChengTaiInsured chengTaiInsured = buildChengTaiInsured(quoteVo.getOwnersInfo());
@@ -124,14 +110,13 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         // 保存保险单数据9
         ChengTaiSubmitReqBody chengTaiSubmitReqBody = buildChengTaiSubmitReqBody();
 
-
-        ChengTaiQueryVehicleListResult queryVehicleListResult = chengTaiAPIService.queryVehicleList(token);
+        ChengTaiQueryVehicleListResult queryVehicleListResult = chengTaiAPIService.queryVehicleList(httpHeaders);
 
         List<ChengTaiUseNature> useNatUreNameList = queryVehicleListResult.getUseNatUreNameList();
 
         ImmutableMap<String, ChengTaiUseNature> map = Maps.uniqueIndex(useNatUreNameList, ChengTaiUseNature::getType);
 
-        List<ChengTaiFindAttributionOrgByUserResult> attributionOrgByUser = chengTaiAPIService.findAttributionOrgByUser(token);
+        List<ChengTaiFindAttributionOrgByUserResult> attributionOrgByUser = chengTaiAPIService.findAttributionOrgByUser(httpHeaders);
 
         ChengTaiFindAttributionOrgByUserResult chengTaiFindAttributionOrgByUserResult = attributionOrgByUser.get(0);
 
@@ -139,7 +124,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         String plateNo = quoteVo.getCarInfoVo().getEngineNo(); // 车牌号
         String vinCode = quoteVo.getCarInfoVo().getVinNo(); // 车架号
 
-        ChengTaiQueryCarInfoResult queryCarInfoResult = chengTaiAPIService.queryCarInfo(token, comCode, plateNo, vinCode);
+        ChengTaiQueryCarInfoResult queryCarInfoResult = chengTaiAPIService.queryCarInfo(httpHeaders, comCode, plateNo, vinCode);
 
         List<ChengTaiQueryCarInfoResult.QueryCarModel> queryCarModels = queryCarInfoResult.getCarModelList();
 
@@ -147,7 +132,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
         ChengTaiCarFullData fullCarData = queryCarModel.getFullCarData();
 
-        ChengTaiFindCarModelResult carModel = chengTaiAPIService.findCarModel(token, fullCarData.getModelCode());
+        ChengTaiFindCarModelResult carModel = chengTaiAPIService.findCarModel(httpHeaders, fullCarData.getModelCode());
 
         List<ChengTaiCarModel> data = carModel.getData();
 
@@ -175,12 +160,11 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         param.setSubmitReqBody(chengTaiSubmitReqBody);
 
 
-        ChengTaiSaveResult save = chengTaiAPIService.save(token, param);
+        ChengTaiSaveResult save = chengTaiAPIService.save(httpHeaders, param);
 
         param = save.getModel();
 
-
-        ChengTaiPremiumcalResult premiumcalResult = chengTaiAPIService.premiumcal(token, param);
+        ChengTaiPremiumcalResult premiumcalResult = chengTaiAPIService.premiumcal(httpHeaders, param);
 
         param.setSunlightId(premiumcalResult.getSunlightId());
 
@@ -193,9 +177,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         // 折扣率
         BigDecimal discount = contractMain.getDiscount();
 
-
         // 保存到 mongo
-
         ChengTaiBiContract saveBiContract = param.getBiContract();
         ChengTaiCiContract saveCiContract = param.getCiContract();
         if (saveBiContract != null) {
@@ -660,13 +642,13 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
-        String token = login();
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(underwritingVo.getOrder().getAttributionInformationVo().getUsername(), underwritingVo.getOrder().getAttributionInformationVo().getPassword());
 
         String ordersNo = underwritingVo.getOrder().getOrdersNo();
 
         ChengTaiPremiumcalParam param = chengTaiPremiumcalRepository.findByOrdersNo(ordersNo);
 
-        ChengTaiSubmitResult result = chengTaiAPIService.submit(token, param);
+        ChengTaiSubmitResult result = chengTaiAPIService.submit(httpHeaders, param);
 
         ChengTaiSubmitResult.Head head = result.getHead();
 
@@ -688,7 +670,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
-        String token = login();
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(paymentLinkVo.getOrder().getAttributionInformationVo().getUsername(), paymentLinkVo.getOrder().getAttributionInformationVo().getPassword());
 
         String ordersNo = paymentLinkVo.getOrder().getOrdersNo();
 
@@ -696,13 +678,13 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
         String orderId = param.getOrderId();
 
-        param = chengTaiAPIService.getPolicyModel(token, orderId);
+        param = chengTaiAPIService.getPolicyModel(httpHeaders, orderId);
 
         ChengTaiBusinessMain businessMain = param.getBusinessMain();
 
         String uuid = businessMain.getUuid();
 
-        List<ChengTaiInsureResult> insure = chengTaiAPIService.insure(token, uuid);
+        List<ChengTaiInsureResult> insure = chengTaiAPIService.insure(httpHeaders, uuid);
 
         if (insure == null || insure.isEmpty()) {
             return null;
@@ -722,7 +704,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        String token = login();
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(insuranceUploadImageVo.getOrder().getAttributionInformationVo().getUsername(), insuranceUploadImageVo.getOrder().getAttributionInformationVo().getPassword());
 
         String ordersNo = insuranceUploadImageVo.getOrder().getOrdersNo();
 
@@ -759,14 +741,14 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
                 param.setAppCode("CAR01");
                 param.setBusinessNo(businessNo); // todo
 
-                chengTaiAPIService.imageUpload(token, imageBytes, param);
+                chengTaiAPIService.imageUpload(httpHeaders, imageBytes, param);
             }
         }
     }
 
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
-        String token = login();
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(downloadPolicyVo.getOrder().getAttributionInformationVo().getUsername(), downloadPolicyVo.getOrder().getAttributionInformationVo().getPassword());
 
         String ordersNo = downloadPolicyVo.getOrder().getOrdersNo();
 
@@ -774,7 +756,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
         String orderId = param.getOrderId();
 
-        param = chengTaiAPIService.getPolicyModel(token, orderId);
+        param = chengTaiAPIService.getPolicyModel(httpHeaders, orderId);
 
         ChengTaiCiContract ciContract = param.getCiContract();
         ChengTaiBiContract biContract = param.getBiContract();
@@ -791,7 +773,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         String policyUuid = contractMain.getPolicyUuid();
         String expiryDate = contractMain.getValidDate();
 
-        ChengTaiDownloadAddressResult chengTaiDownloadAddressResult = chengTaiAPIService.downloadAddress(token, contractNo, policyUuid, expiryDate);
+        ChengTaiDownloadAddressResult chengTaiDownloadAddressResult = chengTaiAPIService.downloadAddress(httpHeaders, contractNo, policyUuid, expiryDate);
 
         List<ChengTaiDownloadAddressResult.QueryResult> queryResults = chengTaiDownloadAddressResult.getQueryResults();
 
@@ -806,7 +788,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderBase) {
-        String token = login();
+        HttpHeaders httpHeaders = chengTaiCrawlerQuoteProcessService.getTokenHeaders(orderBase.getOrder().getAttributionInformationVo().getUsername(), orderBase.getOrder().getAttributionInformationVo().getPassword());
 
         String ordersNo = orderBase.getOrder().getOrdersNo();
 
@@ -814,7 +796,7 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
 
         String orderId = param.getOrderId();
 
-        param = chengTaiAPIService.getPolicyModel(token, orderId);
+        param = chengTaiAPIService.getPolicyModel(httpHeaders, orderId);
 
         ChengTaiCiContract ciContract = param.getCiContract();
         ChengTaiBiContract biContract = param.getBiContract();
@@ -833,4 +815,6 @@ public class ChengTaiCrawlerRequestService implements QuotationApiBaseService {
         System.out.println("状态为:" + underWriteInd);
         return null;
     }
+
+
 }

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

@@ -0,0 +1,77 @@
+package com.jzg.quotation.chengtai.crawler.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.jzg.commons.constants.quote.enums.base.ExpenseRequestUrl;
+import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
+import com.jzg.quotation.chengtai.crawler.component.ChengTaiRequestCrawlerComponent;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiCheckCaptchaRequest;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiGetCaptchaRequest;
+import com.jzg.quotation.chengtai.crawler.model.request.ChengTaiLoginRequest;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiCheckCaptchaResponse;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiGetCaptchaResponse;
+import com.jzg.quotation.chengtai.crawler.model.response.ChengTaiLoginResponse;
+import com.jzg.quotation.chengtai.crawler.service.ChengTaiCrawlerQuoteProcessService;
+import com.jzg.quotation.chengtai.utils.CryptoUtils;
+import com.jzg.quotation.chengtai.utils.RSACipher;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import com.jzg.quotation.commons.utils.Base64ImageUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+@RequiredArgsConstructor
+public class ChengTaiCrawlerQuoteProcessServiceImpl implements ChengTaiCrawlerQuoteProcessService {
+
+    private final ChengTaiRequestCrawlerComponent chengTaiRequestCrawlerComponent;
+
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
+    @Override
+    public void login(String username, String password) throws Exception {
+        // 步骤一 获取验证码
+        ResponseEntity<ChengTaiGetCaptchaResponse> getCaptchaResponseResponseEntity = chengTaiRequestCrawlerComponent.getCaptcha(new ChengTaiGetCaptchaRequest());
+        ChengTaiGetCaptchaResponse.BodyDTO.RepDataDTO repDataDTO = Optional.of(getCaptchaResponseResponseEntity)
+                .map(ResponseEntity::getBody)
+                .map(ChengTaiGetCaptchaResponse::getBody)
+                .map(ChengTaiGetCaptchaResponse.BodyDTO::getRepData)
+                .orElseThrow(() -> new Exception("获取验证码失败"));
+
+        // 步骤二 获取滑动窗口的位置
+        SliderCaptchaVo sliderCaptchaVo = new SliderCaptchaVo(repDataDTO.getOriginalImageBase64(), repDataDTO.getJigsawImageBase64());
+        List<Integer> integers = exteriorUtilsRequest.sliderCaptchaIdentify(ExpenseRequestUrl.SLIDER_MATCH, sliderCaptchaVo);
+        String secretKey = repDataDTO.getSecretKey();
+
+        // 步骤三 校验验证码
+        Base64ImageUtils.ImageDimensions imageDimensions = Base64ImageUtils.getImageDimensions(repDataDTO.getOriginalImageBase64());
+        double i = 310.0 * (integers.get(0) - 1) / imageDimensions.getWidth();
+        ChengTaiCheckCaptchaRequest.NotchLocation notchLocation = new ChengTaiCheckCaptchaRequest.NotchLocation(i, 5);
+        String jsonString = JSON.toJSONString(notchLocation);
+        String encrypt = CryptoUtils.aesEncrypt(jsonString, secretKey);
+        ChengTaiCheckCaptchaRequest chengTaiCheckCaptchaRequest = new ChengTaiCheckCaptchaRequest(encrypt, repDataDTO.getToken());
+        ResponseEntity<ChengTaiCheckCaptchaResponse> chengTaiCheckCaptchaResponseResponseEntity = chengTaiRequestCrawlerComponent.checkCaptcha(chengTaiCheckCaptchaRequest);
+        String publicKey = ChengTaiRequestCrawlerComponent.getPublicKey(chengTaiCheckCaptchaResponseResponseEntity);
+
+        // 步骤四 登录
+        String pointJson = chengTaiCheckCaptchaResponseResponseEntity.getBody().getBody().getRepData().getPointJson();
+        String token = chengTaiCheckCaptchaResponseResponseEntity.getBody().getBody().getRepData().getToken();
+        String aesDecrypt = CryptoUtils.aesDecrypt(pointJson, secretKey);
+        String s = CryptoUtils.aesEncrypt(token + "---" + aesDecrypt, secretKey);
+        String encrypt1 = new RSACipher(publicKey).encrypt(password);
+        ChengTaiLoginRequest chengTaiLoginRequest = new ChengTaiLoginRequest(username, encrypt1, s);
+        ChengTaiLoginResponse login = chengTaiRequestCrawlerComponent.login(chengTaiLoginRequest);
+        System.out.println(login.getBody());
+    }
+
+    @Override
+    public HttpHeaders getTokenHeaders(String username, String password) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.set("token", "eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE3NTc0OTM3OTQsImV4cCI6MTc1NzUwNDU5NCwicGF5bG9hZCI6IldkeHJsN3BjSjBYLWtObU9ZTGpxV2pQNjJaQk5ZLTl4eFNMT3pONExzY1Y5UzI0VXliS3E0ZzU3VGdQdi1vaWlGRFdiUXRmcFhNUTlNQjJYbEZoamJtdlBqLUxnLUUzMHA2UU9PNXdrWEFtUUNsLXAxMHVLN0dMMHFVSDA3MTJsdGhJakpuQjhqSFl5ajM0VXJwTFpKSFZWenRhMzNBY0VkaHVSdFFqMW5ONE8yanFia3IwM1JwcklOYnpMZTlTc2ExYVFCRjVaLXFaMzRFOVFqbDJUbXFTdDQwLTZzaTdZOWNKMVc5M1Z5c1djdGlmSlAwYmFCeGNQaGs1SWNVTEY4RGF4OHJvSl81UzNvazVnSjNJdnRfUkJFVlcyTjM4cWdxM2kyZV9qTEZyTEpvcjltRzNCTWx1OS1PUVJQSjRHYmlZYkhwZ3A4RlFQNnlodjNRTmhia0pIUllUd3Jwc3VvMTNIdkZ6UDl4Q1pkckZCY0lFZG9ublAtcVh0dVEtOHlmRlpGd3gySnkwcVVlSzlOVVpDcTF2SlFiYXhJcG11MW1CWmp3R3BPd0NiVjR3R3VleGRXOE1WYnRnakhZc3AifQ.pdPy8G3yhiaWHa6oAlycP5ncp3coKD0Slm6rM9nDN_IIlVFGOgJYxNvsjnZCv0qrb1xaL7LCbDLiPgZFrAZO5A");
+        return httpHeaders;
+    }
+
+}

+ 78 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/utils/CryptoUtils.java

@@ -0,0 +1,78 @@
+package com.jzg.quotation.chengtai.utils;
+
+import cn.hutool.crypto.symmetric.AES;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 加密工具类(基于 Hutool 封装)
+ */
+public class CryptoUtils {
+
+    // ==================== AES 工具方法(ECB 模式) ====================
+
+    /**
+     * AES-ECB-PKCS5Padding 加密(自动处理密钥为 16 字节)
+     *
+     * @param plainText 明文
+     * @param key       密钥(任意长度,自动补空格/截断为 16 字节)
+     * @return Base64 编码的密文
+     */
+    public static String aesEncrypt(String plainText, String key) {
+        try {
+            // 处理密钥:补空格到 16 字节,过长截断(与 Python ljust(16)[:16] 行为一致)
+            byte[] keyBytes = processAesKey(key.getBytes(StandardCharsets.UTF_8));
+
+            // 创建AES实例
+            AES aes = new AES("ECB", "PKCS5Padding", keyBytes);
+
+            // AES-ECB-PKCS5Padding 加密并 Base64 编码
+            return aes.encryptBase64(plainText, StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            throw new RuntimeException("AES加密失败", e);
+        }
+    }
+
+    public static void main(String[] args) {
+        System.out.println(aesEncrypt("{\"x\":88,\"y\":5}", "kRiGHmDBQerYvzm4"));
+    }
+
+    /**
+     * AES-ECB-PKCS5Padding 解密(自动处理密钥为 16 字节)
+     *
+     * @param encryptedText Base64 编码的密文
+     * @param key           密钥(任意长度,自动补空格/截断为 16 字节)
+     * @return 原始明文
+     */
+    public static String aesDecrypt(String encryptedText, String key) {
+        try {
+            // 处理密钥(与加密逻辑一致)
+            byte[] keyBytes = processAesKey(key.getBytes(StandardCharsets.UTF_8));
+
+            // 创建AES实例
+            AES aes = new AES("ECB", "PKCS5Padding", keyBytes);
+
+            // Base64 解码后 AES 解密
+            return aes.decryptStr(encryptedText, StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            throw new RuntimeException("AES解密失败", e);
+        }
+    }
+
+    /**
+     * 处理 AES 密钥(统一为 16 字节,不足补空格,过长截断)
+     * 与 Python 代码 `key.ljust(16)[:16]` 行为完全一致
+     */
+    private static byte[] processAesKey(byte[] originalKey) {
+        byte[] processedKey = new byte[16];
+        int copyLength = Math.min(originalKey.length, 16);
+        // 复制原始密钥的前 16 字节(或全部,若不足 16 字节)
+        System.arraycopy(originalKey, 0, processedKey, 0, copyLength);
+        // 不足 16 字节的部分用空格填充(与 Python `ljust(16)` 一致)
+        for (int i = copyLength; i < 16; i++) {
+            processedKey[i] = (byte) ' ';
+        }
+        return processedKey;
+    }
+
+}

+ 44 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/utils/RSACipher.java

@@ -0,0 +1,44 @@
+package com.jzg.quotation.chengtai.utils;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.crypto.symmetric.AES;
+
+import java.nio.charset.StandardCharsets;
+
+public class RSACipher {
+
+    private final RSA rsa;
+
+    /**
+     * 从 PEM 格式公钥初始化(自动解析头尾标记)
+     * @param publicKeyPem PEM 格式公钥字符串(包含 -----BEGIN PUBLIC KEY----- 头尾)
+     */
+    public RSACipher(String publicKeyPem) {
+        try {
+            // 使用Hutool解析PEM格式公钥
+            this.rsa = new RSA(null, publicKeyPem);
+        } catch (Exception e) {
+            throw new RuntimeException("RSA公钥解析失败", e);
+        }
+    }
+
+    /**
+     * RSA 公钥加密(PKCS#1 v1.5 填充)
+     * @param plaintext 明文(长度限制:RSA 密钥 2048 位时最大 245 字节)
+     * @return Base64 编码的密文
+     */
+    public String encrypt(String plaintext) {
+        try {
+            // 如果 encryptBase64 方法不存在,则使用 encrypt + Base64 编码的方式
+            byte[] encryptedBytes = this.rsa.encrypt(plaintext, StandardCharsets.UTF_8, KeyType.PublicKey);
+            return Base64.encode(encryptedBytes);
+        } catch (Exception e) {
+            throw new RuntimeException("RSA加密失败", e);
+        }
+    }
+
+
+
+}

+ 32 - 0
tenant/insurance/quotation-chengtai/src/main/resources/certs/CFCA EV ROOT.crt

@@ -0,0 +1,32 @@
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD
+TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx
+MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j
+aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP
+T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03
+sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL
+TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5
+/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp
+7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz
+EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt
+hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP
+a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot
+aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg
+TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV
+PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv
+cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL
+tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd
+BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT
+ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL
+jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS
+ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy
+P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19
+xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d
+Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN
+5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe
+/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z
+AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ
+5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----

File diff suppressed because it is too large
+ 0 - 112
tenant/insurance/quotation-chengtai/src/test/java/com/jzg/quotation/chengtai/crawler/service/ChengTaiAPIServiceTest.java


+ 1 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java

@@ -95,6 +95,6 @@ public interface PlatformClient {
      */
     @GetMapping("/file/getUploadFile")
     @Operation(summary = "根据Id获取上传信息", description = "根据Id获取上传信息")
-    public SysUploadFiles getUploadFile(String id);
+    public SysUploadFiles getUploadFile(@RequestParam String id);
 
 }

+ 98 - 13
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -3,19 +3,19 @@ package com.jzg.quotation.commons.component;
 
 import com.alibaba.fastjson2.JSON;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.config.WebClientConfig;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.DataBufferUtils;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
 import org.springframework.stereotype.Component;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.reactive.function.BodyInserters;
 import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -47,6 +47,44 @@ public class RequestComponent {
      */
     private final WebClient webClient;
 
+    private final WebClientConfig webClientConfig;
+
+    /**
+     * 根据URL选择合适的WebClient(支持SSL)
+     *
+     * @param url 请求URL
+     * @return WebClient实例
+     */
+    private WebClient selectWebClient(String url) {
+        try {
+            if (url.contains("https://")) {
+                String domain = extractDomain(url);
+                if (webClientConfig != null) {
+                    return webClientConfig.createSecureWebClient(domain);
+                }
+            }
+        } catch (Exception e) {
+            log.warn("创建安全WebClient失败,使用默认WebClient", e);
+        }
+        return webClient;
+    }
+
+    /**
+     * 从URL中提取域名
+     *
+     * @param url URL地址
+     * @return 域名
+     */
+    private String extractDomain(String url) {
+        try {
+            String[] parts = url.replace("https://", "").replace("http://", "").split("/");
+            return parts[0].split(":")[0]; // 移除端口号
+        } catch (Exception e) {
+            log.warn("提取域名失败: {}", url, e);
+            return "default";
+        }
+    }
+
     /**
      * 设置请求头
      *
@@ -146,6 +184,17 @@ public class RequestComponent {
                 .toEntity(responseClass)
                 .block();
     }
+    //返回字符串
+    public String baseGetString(String url, Object initDataRequest, HttpHeaders headers) {
+        MultiValueMap<String, String> multiValueMap = RequestObjectConversion.convertMultiValueStringMap(initDataRequest);
+        String requestUrl = buildUrl(url, multiValueMap);
+        return webClient.get()
+                .uri(requestUrl)
+                .headers(setHeaders(headers))
+                .retrieve()
+                .bodyToMono(String.class).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody)) // 打印响应
+                .block();
+    }
 
     /**
      * @param url               请求地址
@@ -190,13 +239,21 @@ public class RequestComponent {
             log.debug("request body is {}", body);
         }
         body = Optional.ofNullable(body).orElse("");
-        return webClient.post()
-                .uri(url)
-                .headers(setHeaders(headers))
-                .body(BodyInserters.fromValue(body))
-                .retrieve()
-                .toEntity(responseClass)
-                .block();
+        WebClient webClient = selectWebClient(url);
+        try {
+            return webClient.post()
+                    .uri(url)
+                    .headers(setHeaders(headers))
+                    .body(BodyInserters.fromValue(body))
+                    .retrieve()
+                    .toEntity(responseClass)
+                    .block();
+        }catch (WebClientResponseException e) {
+            // 如果服务端返回非2xx状态码
+            System.err.println("状态码: " + e.getRawStatusCode());
+            System.err.println("响应体: " + e.getResponseBodyAsString());
+            throw e;
+        }
     }
 
     /**
@@ -293,16 +350,43 @@ public class RequestComponent {
      * @return 响应
      */
     public <Response> ResponseEntity<Response> formData(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers) {
+        WebClient webClient = selectWebClient(url);
+//        String block = webClient.post()
+//                .uri(url)
+//                .headers(RequestComponent.setHeaders(headers))
+//                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+//                .body(BodyInserters.fromMultipartData(parts))
+//                .retrieve().bodyToMono(String.class).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody)) // 打印响应
+//                .block();
+
+
+
+
         return webClient.post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))
-                .contentType(MediaType.MULTIPART_FORM_DATA)
+                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(BodyInserters.fromMultipartData(parts))
                 .retrieve()
-                .toEntity(responseClass)
+                .toEntity(responseClass).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody.getBody()))
                 .block();
     }
 
+    public String formDataString(String url, Object body, HttpHeaders headers) {
+        MultiValueMap<String, Object> multiValueMap = RequestObjectConversion.convertMultiValueMap(body);
+        BodyInserters.MultipartInserter multipartInserter = BodyInserters.fromMultipartData(multiValueMap);
+        String block = webClient.post()
+                .uri(url)
+                .headers(RequestComponent.setHeaders(headers))
+                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+                .body(BodyInserters.fromMultipartData(multiValueMap))
+                .retrieve().bodyToMono(String.class).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody)) // 打印响应
+                .block();
+
+
+        return block;
+    }
+
     public <Response> ResponseEntity<Response> formUrlencoded(String url,  BodyInserters.FormInserter<String> formInserter, Class<Response> responseClass, HttpHeaders headers) {
         return webClient.post()
                 .uri(url)
@@ -481,7 +565,8 @@ public class RequestComponent {
     }
 
     public <Response> ResponseEntity<Response> form(String url, MultiValueMap<String, String> formData, Class<Response> responseClass, HttpHeaders headers) {
-        return WebClient.create()
+        WebClient selectWebClient = selectWebClient(url);
+        return selectWebClient
                 .post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))

+ 54 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/SslConfig.java

@@ -0,0 +1,54 @@
+package com.jzg.quotation.commons.config;
+
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslContextBuilder;
+import org.springframework.util.ResourceUtils;
+
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+import java.io.File;
+import java.io.FileInputStream;
+import java.security.KeyStore;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+
+public class SslConfig {
+
+    // 从 .crt 文件创建 X509TrustManager
+    public static X509TrustManager createTrustManager(String certPath) throws Exception {
+        // 加载 .crt 证书
+        CertificateFactory cf = CertificateFactory.getInstance("X.509");
+        File certFile = ResourceUtils.getFile(certPath);
+        FileInputStream fis = new FileInputStream(certFile);
+        Certificate cert = cf.generateCertificate(fis);
+        fis.close();
+
+        // 创建 KeyStore 并存储证书
+        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+        keyStore.load(null, null); // 初始化空 KeyStore
+        keyStore.setCertificateEntry("server-cert", cert);
+
+        // 初始化 TrustManagerFactory
+        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
+        tmf.init(keyStore);
+
+        // 获取 X509TrustManager
+        TrustManager[] trustManagers = tmf.getTrustManagers();
+        for (TrustManager tm : trustManagers) {
+            if (tm instanceof X509TrustManager) {
+                return (X509TrustManager) tm;
+            }
+        }
+        throw new IllegalStateException("No X509TrustManager found");
+    }
+
+    // 构建 SslContext
+    public static SslContext buildSslContext(String certPath) throws Exception {
+        X509TrustManager trustManager = createTrustManager(certPath);
+        return SslContextBuilder.forClient().trustManager(trustManager)
+                // 若服务端证书主机名与实际域名不一致(如自签名),可禁用主机名验证(仅测试用)
+                // .hostnameVerifier((hostname, session) -> true)
+                .build();
+    }
+}

+ 85 - 37
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java

@@ -1,14 +1,17 @@
 package com.jzg.quotation.commons.config;
 
 import io.netty.channel.ChannelOption;
+import io.netty.handler.ssl.SslContext;
 import io.netty.handler.timeout.ReadTimeoutHandler;
 import io.netty.handler.timeout.WriteTimeoutHandler;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.http.ssl.SSLContextBuilder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.util.ResourceUtils;
 import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
 import org.springframework.web.reactive.function.client.ExchangeStrategies;
 import org.springframework.web.reactive.function.client.WebClient;
@@ -16,8 +19,11 @@ import org.springframework.web.util.DefaultUriBuilderFactory;
 import reactor.core.publisher.Mono;
 import reactor.netty.http.client.HttpClient;
 import reactor.netty.resources.ConnectionProvider;
+import reactor.netty.tcp.SslProvider;
 
 import java.time.Duration;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
 
 /**
  * @description: WebClientCon 配置类
@@ -43,50 +49,92 @@ public class WebClientConfig {
 
     public static final int MAX_IN_MEMORY_SIZE = 10 * 1024 * 1024;
 
+    // 存储域名与证书路径的映射关系
+    private final Map<String, String> domainCertMap = new ConcurrentHashMap<>();
+
+    // 存储SSL上下文缓存
+    private final Map<String, SslContext> sslContextCache = new ConcurrentHashMap<>();
+
+    public WebClientConfig() {
+        // 初始化域名与证书映射关系
+        domainCertMap.put("champion-ic.com", "classpath:certs/CFCA EV ROOT.crt");
+    }
+
     @Bean
     public WebClient clientBuilder() {
+        // 配置默认HTTP客户端(无SSL)
+        ConnectionProvider connectionProvider = ConnectionProvider.builder("http").maxConnections(CONNECTION_PROVIDER_MAX_CONNECTIONS).maxIdleTime(CONNECTION_PROVIDER_MAX_IDLE_TIME).build();
+
+        HttpClient httpClient = HttpClient.create(connectionProvider).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, HTTPCLIENT_CONNECT_TIMEOUT_MILLIS).responseTimeout(HTTPCLIENT_RESPONSE_TIMEOUT).doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(READ_TIMEOUT)).addHandlerLast(new WriteTimeoutHandler(WRITE_TIMEOUT)));
+
+        // 构建WebClient实例
+        DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
+        factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
+        return WebClient.builder().exchangeStrategies(ExchangeStrategies.builder().codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(MAX_IN_MEMORY_SIZE)).build()).uriBuilderFactory(factory).clientConnector(new ReactorClientHttpConnector(httpClient)).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).filter(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
+            log.info("Client request: {}", clientRequest.url());
+            // 打印请求头信息
+            clientRequest.headers().forEach((key, values) -> {
+                log.info("请求头: {}: {}", key, values);
+            });
+            return Mono.just(clientRequest);
+        })).build();
+    }
+
+    /**
+     * 为特定域名创建带SSL认证的WebClient
+     *
+     * @param domain 域名
+     * @return WebClient实例
+     */
+    public WebClient createSecureWebClient(String domain) throws Exception {
         // 配置HTTP连接池
-        ConnectionProvider connectionProvider = ConnectionProvider
-                .builder("http")
-                .maxConnections(CONNECTION_PROVIDER_MAX_CONNECTIONS)
-                .maxIdleTime(CONNECTION_PROVIDER_MAX_IDLE_TIME)
-                .build();
-
-        // 配置HTTP客户端
-        HttpClient httpClient = HttpClient
-                .create(connectionProvider)
-                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, HTTPCLIENT_CONNECT_TIMEOUT_MILLIS)
-                .responseTimeout(HTTPCLIENT_RESPONSE_TIMEOUT)
-                .doOnConnected(conn ->
-                        conn
-                                .addHandlerLast(new ReadTimeoutHandler(READ_TIMEOUT))
-                                .addHandlerLast(new WriteTimeoutHandler(WRITE_TIMEOUT)));
+        ConnectionProvider connectionProvider = ConnectionProvider.builder("secure-" + domain).maxConnections(CONNECTION_PROVIDER_MAX_CONNECTIONS).maxIdleTime(CONNECTION_PROVIDER_MAX_IDLE_TIME).build();
+
+        // 获取域名对应的SSL上下文
+        SslContext sslContext = getSSLContextForDomain(domain);
+
+        // 配置带SSL的HTTP客户端
+        HttpClient httpClient = HttpClient.create(connectionProvider).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, HTTPCLIENT_CONNECT_TIMEOUT_MILLIS).responseTimeout(HTTPCLIENT_RESPONSE_TIMEOUT).secure(spec -> spec.sslContext(sslContext)).doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(READ_TIMEOUT)).addHandlerLast(new WriteTimeoutHandler(WRITE_TIMEOUT)));
+
         // 构建WebClient实例
         DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory();
         factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
-        return WebClient
-                .builder()
-                .exchangeStrategies(ExchangeStrategies.builder()
-                        .codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(MAX_IN_MEMORY_SIZE))
-                        .build())
-                .uriBuilderFactory(factory)
-                .clientConnector(new ReactorClientHttpConnector(httpClient))
-                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
-                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
-                .filter(ExchangeFilterFunction.ofRequestProcessor(
-                        clientRequest -> {
-                            log.info("Client request: {}", clientRequest.url());
-                            // 打印请求头信息
-                            clientRequest
-                                    .headers()
-                                    .forEach((key, values) -> {
-                                        log.info("请求头: {}: {}", key, values);
-                                    });
-                            return Mono.just(clientRequest);
-                        }
-                ))
-                .build();
+        return WebClient.builder().exchangeStrategies(ExchangeStrategies.builder().codecs(clientCodecConfigurer -> clientCodecConfigurer.defaultCodecs().maxInMemorySize(MAX_IN_MEMORY_SIZE)).build()).uriBuilderFactory(factory).clientConnector(new ReactorClientHttpConnector(httpClient)).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).filter(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> {
+            log.info("Secure client request: {}", clientRequest.url());
+            // 打印请求头信息
+            clientRequest.headers().forEach((key, values) -> {
+                log.info("请求头: {}: {}", key, values);
+            });
+            return Mono.just(clientRequest);
+        })).build();
     }
 
+    /**
+     * 根据域名获取对应的SSL上下文
+     *
+     * @param domain 域名
+     * @return SSLContext实例
+     */
+    private SslContext getSSLContextForDomain(String domain) throws Exception {
+        // 先从缓存中获取
+        if (sslContextCache.containsKey(domain)) {
+            return sslContextCache.get(domain);
+        }
 
+        // 获取域名对应的证书路径
+        String certPath = domainCertMap.getOrDefault(domain, "classpath:certs/CFCA EV ROOT.crt");
+
+        try {
+            // 创建SSL上下文
+            SslContext sslContext = SslConfig.buildSslContext(certPath);
+
+            // 缓存SSL上下文
+            sslContextCache.put(domain, sslContext);
+
+            return sslContext;
+        } catch (Exception e) {
+            log.error("Failed to create SSL context for domain: {}, certPath: {}", domain, certPath, e);
+            throw e;
+        }
+    }
 }

+ 2 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/ExteriorUtilsRequest.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.commons.service;
 
 
+import com.jzg.commons.constants.quote.enums.base.ExpenseRequestUrl;
 import com.jzg.commons.entity.quote.vo.identify.ReinsuranceCaptchaVo;
 import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
 
@@ -35,6 +36,6 @@ public interface ExteriorUtilsRequest {
      * @param sliderCaptchaVo 滑块验证码
      * @return 识别位置列表 [x, y]
      */
-    List<Integer> sliderCaptchaIdentify(SliderCaptchaVo sliderCaptchaVo);
+    List<Integer> sliderCaptchaIdentify(ExpenseRequestUrl expenseRequestUrl, SliderCaptchaVo sliderCaptchaVo);
 }
 

+ 5 - 4
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/impl/ExteriorUtilsRequestImpl.java

@@ -54,12 +54,13 @@ public class ExteriorUtilsRequestImpl implements ExteriorUtilsRequest {
     }
 
     @Override
-    public List<Integer> sliderCaptchaIdentify(SliderCaptchaVo sliderCaptchaVo) {
-        ExpenseRequestUrl captcha = ExpenseRequestUrl.SLIDER_IDENTIFY;
-        String url = ExpenseRequestUrl.getUrl(captchaRecognitionProperties.getUrl(), captcha.getUri());
-        R<List<Integer>> response = requestComponent.post(url, sliderCaptchaVo, captcha.getDescription(), new ParameterizedTypeReference<>() {
+    public List<Integer> sliderCaptchaIdentify(ExpenseRequestUrl expenseRequestUrl, SliderCaptchaVo sliderCaptchaVo) {
+        String url = ExpenseRequestUrl.getUrl(captchaRecognitionProperties.getUrl(), expenseRequestUrl.getUri());
+        R<List<Integer>> response = requestComponent.post(url, sliderCaptchaVo, expenseRequestUrl.getDescription(), new ParameterizedTypeReference<>() {
         }, new HttpHeaders());
         return response.getData();
     }
 
+
+
 }

+ 56 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/Base64ImageUtils.java

@@ -0,0 +1,56 @@
+package com.jzg.quotation.commons.utils;
+
+
+import com.jzg.commons.exception.SystemException;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Base64;
+
+public final class Base64ImageUtils {
+
+    /**
+     * 获取 Base64 图片的宽高
+     *
+     * @param base64Str Base64 图片字符串(可能包含前缀)
+     * @return 宽高数组 [width, height],失败返回 null
+     */
+    public static ImageDimensions getImageDimensions(String base64Str) {
+        try {
+            // 步骤1:去除 Base64 前缀(如果有)
+            String base64Data = base64Str.replaceAll("^data:image/[^;]+;base64,", "");
+
+            // 步骤2:Base64 解码为字节数组
+            byte[] imageBytes = Base64.getDecoder().decode(base64Data);
+
+            // 步骤3:通过 ImageIO 读取图片并获取宽高
+            BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
+            if (image == null) {
+                throw new SystemException("无法识别的图片格式");
+            }
+            return new ImageDimensions(image.getWidth(), image.getHeight());
+
+        } catch (IllegalArgumentException e) {
+            throw new SystemException("Base64 解码失败:" + e.getMessage());
+        } catch (IOException e) {
+            throw new SystemException("读取图片失败:" + e.getMessage());
+        }
+    }
+
+    @Data
+    @AllArgsConstructor
+    public static class ImageDimensions {
+
+        private final int width;
+
+        private final int height;
+
+    }
+
+
+}

+ 18 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -402,7 +402,25 @@ public class DateUtil {
         return newDateStr;
     }
 
+    private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 
+    /**
+     * 将北京时间(yyyy-MM-dd HH:mm:ss)转换为UTC时间(ISO8601格式)
+     */
+    public static String toUtcDateTime(String beijingTime) {
+        // 解析输入的北京时间
+        LocalDateTime localDateTime = LocalDateTime.parse(beijingTime, INPUT_FORMAT);
+
+        // 指定时区为中国北京时间
+        ZonedDateTime beijingZoned = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
+
+        // 转为UTC时区
+        ZonedDateTime utcZoned = beijingZoned.withZoneSameInstant(ZoneId.of("UTC"));
+
+        // 格式化为ISO8601字符串
+        return utcZoned.format(OUTPUT_FORMAT);
+    }
 
     public static void main(String[] args) throws ParseException {
 

+ 75 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/HttpUtil.java

@@ -10,8 +10,11 @@ import org.apache.commons.httpclient.methods.multipart.Part;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.net.URLEncoder;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * http 工具类
@@ -109,4 +112,76 @@ public class HttpUtil {
 
         return response;
     }
+
+    // 发送GET请求的工具方法
+    public static HttpURLConnection sendGetRequest(String url, Map<String, String> params,
+                                                    Map<String, String> headers, boolean followRedirects)
+            throws IOException {
+        // 如果有参数,构建带参数的URL
+        if (params != null && !params.isEmpty()) {
+            StringBuilder urlBuilder = new StringBuilder(url);
+            urlBuilder.append("?");
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                urlBuilder.append(URLEncoder.encode(entry.getKey(), "UTF-8"))
+                        .append("=")
+                        .append(URLEncoder.encode(entry.getValue(), "UTF-8"))
+                        .append("&");
+            }
+            // 移除最后一个&
+            url = urlBuilder.substring(0, urlBuilder.length() - 1);
+        }
+
+        URL requestUrl = new URL(url);
+        HttpURLConnection connection = (HttpURLConnection) requestUrl.openConnection();
+
+        // 设置不跟随重定向
+        connection.setInstanceFollowRedirects(followRedirects);
+
+        // 设置请求方法
+        connection.setRequestMethod("GET");
+
+        // 设置请求头
+        if (headers != null) {
+            for (Map.Entry<String, String> entry : headers.entrySet()) {
+                connection.setRequestProperty(entry.getKey(), entry.getValue());
+            }
+        }
+
+        // 连接
+        connection.connect();
+
+        return connection;
+    }
+
+    // 从响应头中提取zaLoginCookieKey
+    public static String extractZaLoginCookieKey(Map<String, List<String>> headers) {
+        Pattern pattern = Pattern.compile("zaLoginCookieKey=(.*?);");
+
+        // 遍历所有响应头寻找Set-Cookie
+        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
+            if (entry.getKey() != null && entry.getKey().equalsIgnoreCase("Set-Cookie")) {
+                for (String cookie : entry.getValue()) {
+                    Matcher matcher = pattern.matcher(cookie);
+                    if (matcher.find()) {
+                        return matcher.group(1);
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    // 从URL中提取flowId
+    public static String extractFlowId(String url) {
+        if (url == null) return null;
+
+        Pattern pattern = Pattern.compile("flowId=(.*?)&");
+        Matcher matcher = pattern.matcher(url);
+        if (matcher.find()) {
+            return matcher.group(1);
+        }
+        return null;
+    }
+
+
 }

+ 42 - 21
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/build/HbCrawlerQuoteResultVoBuild.java

@@ -1,5 +1,7 @@
 package com.jzg.quotation.hengbang.crawler.build;
 
+import cn.hutool.core.collection.CollUtil;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
@@ -8,6 +10,7 @@ import com.jzg.quotation.hengbang.crawler.entity.response.HbCrawlerProposalRespo
 
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -18,9 +21,15 @@ import java.util.stream.Collectors;
 public final class HbCrawlerQuoteResultVoBuild {
     private HbCrawlerQuoteResultVoBuild() {throw new IllegalStateException("Utility class");}
 
-    public static QuoteResultsVo build(QuoteVo quoteVo, HbCrawlerProposalResponse proposalResponse) {
+    public static QuoteResultsVo build(QuoteVo quoteVo, HbCrawlerProposalResponse proposalResponse, String calculationResult) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+        if(!calculationResult.equals("成功")){
+            quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+            quoteResultsVo.setErrorMessage(calculationResult);
+            return quoteResultsVo;
+        }
         //交强险
         quoteResultsVo.setCiRiskInfoVo(buildCiInfo(proposalResponse));
         //商业险
@@ -34,34 +43,40 @@ public final class HbCrawlerQuoteResultVoBuild {
     public static RiskInfoVo buildCiInfo(HbCrawlerProposalResponse proposalResponse) {
         RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
         HbCrawlerProposalResponse.ForceCarInsureRiskDTO forceCarInsureRisk = proposalResponse.getForceCarInsureRisk();
-        ciRiskInfoVo.setRiskCode(forceCarInsureRisk.getRiskcode());
-        ciRiskInfoVo.setStartDate(forceCarInsureRisk.getBegintime());
-        ciRiskInfoVo.setEndDate(forceCarInsureRisk.getEndtime());
-
+        if(Objects.nonNull(forceCarInsureRisk)){
+            ciRiskInfoVo.setRiskCode(forceCarInsureRisk.getRiskcode());
+            ciRiskInfoVo.setStartDate(forceCarInsureRisk.getBegintime());
+            ciRiskInfoVo.setEndDate(forceCarInsureRisk.getEndtime());
+        }
         return ciRiskInfoVo;
+
     }
 
     public static RiskInfoVo buildbiInfo(HbCrawlerProposalResponse proposalResponse) {
         RiskInfoVo biRiskInfoVo = new RiskInfoVo();
         HbCrawlerProposalResponse.BusiCarInsureRiskDTO busiCarInsureRisk = proposalResponse.getBusiCarInsureRisk();
-        biRiskInfoVo.setRiskCode(busiCarInsureRisk.getRiskcode());
-        biRiskInfoVo.setStartDate(busiCarInsureRisk.getBegintime());
-        biRiskInfoVo.setEndDate(busiCarInsureRisk.getEndtime());
+        if(Objects.nonNull(busiCarInsureRisk)){
+            biRiskInfoVo.setRiskCode(busiCarInsureRisk.getRiskcode());
+            biRiskInfoVo.setStartDate(busiCarInsureRisk.getBegintime());
+            biRiskInfoVo.setEndDate(busiCarInsureRisk.getEndtime());
+        }
         return biRiskInfoVo;
     }
 
     public static List<KindInfoVo> buildKindInfoList(HbCrawlerProposalResponse proposalResponse, QuoteVo quoteVo) {
         List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
-        List<HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityList = proposalResponse.getCarInsureLiabilityList();
-        Map<String, HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityDTOMap = carInsureLiabilityList.stream().collect(Collectors.toMap(HbCrawlerProposalResponse.CarInsureLiabilityDTO::getKindcode, carInsureLiabilityDTO -> carInsureLiabilityDTO));
-        kindInfoVoList.forEach(kindInfoVo -> {
-            HbCrawlerProposalResponse.CarInsureLiabilityDTO carInsureLiabilityDTO = carInsureLiabilityDTOMap.get(kindInfoVo.getKindCode());
-            kindInfoVo.setAmount(String.valueOf(carInsureLiabilityDTO.getLiabamt()));
-            kindInfoVo.setPremium(String.valueOf(carInsureLiabilityDTO.getLiabprm()));
-            kindInfoVo.setUnitAmount(carInsureLiabilityDTO.getUnitAmount());
-            kindInfoVo.setQuantity(String.valueOf(carInsureLiabilityDTO.getQuantity()));
-            kindInfoVo.setDeductibleRate(carInsureLiabilityDTO.getLiabrate());
-        });
+        if(CollUtil.isNotEmpty(kindInfoVoList)){
+            List<HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityList = proposalResponse.getCarInsureLiabilityList();
+            Map<String, HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityDTOMap = carInsureLiabilityList.stream().collect(Collectors.toMap(HbCrawlerProposalResponse.CarInsureLiabilityDTO::getKindcode, carInsureLiabilityDTO -> carInsureLiabilityDTO));
+            kindInfoVoList.forEach(kindInfoVo -> {
+                HbCrawlerProposalResponse.CarInsureLiabilityDTO carInsureLiabilityDTO = carInsureLiabilityDTOMap.get(kindInfoVo.getKindCode());
+                kindInfoVo.setAmount(String.valueOf(carInsureLiabilityDTO.getLiabamt()));
+                kindInfoVo.setPremium(String.valueOf(carInsureLiabilityDTO.getLiabprm()));
+                kindInfoVo.setUnitAmount(carInsureLiabilityDTO.getUnitAmount());
+                kindInfoVo.setQuantity(String.valueOf(carInsureLiabilityDTO.getQuantity()));
+                kindInfoVo.setDeductibleRate(carInsureLiabilityDTO.getLiabrate());
+            });
+        }
         return kindInfoVoList;
     }
 
@@ -71,9 +86,15 @@ public final class HbCrawlerQuoteResultVoBuild {
         //商业险数据
         HbCrawlerProposalResponse.BusiCarInsureRiskDTO busiCarInsureRisk = proposalResponse.getBusiCarInsureRisk();
         HbCrawlerProposalResponse.CarInsureShiptaxDTO carInsureShiptax = proposalResponse.getCarInsureShiptax();
-        quoteResultsVo.getCosts().setBiPremium(busiCarInsureRisk.getSumPremium());
-        quoteResultsVo.getCosts().setCiPremium(forceCarInsureRisk.getSumPremium());
-        quoteResultsVo.getCosts().setVvTax(carInsureShiptax.getSumtax());
+        if(Objects.nonNull(busiCarInsureRisk)){
+            quoteResultsVo.getCosts().setBiPremium(busiCarInsureRisk.getSumPremium());
+        }
+        if(Objects.nonNull(forceCarInsureRisk)){
+            quoteResultsVo.getCosts().setCiPremium(forceCarInsureRisk.getSumPremium());
+        }
+        if(Objects.nonNull(carInsureShiptax)){
+            quoteResultsVo.getCosts().setVvTax(carInsureShiptax.getSumtax());
+        }
         //设置非车保费
         quoteResultsVo.getCosts().setNiPremium(proposalResponse.getAccidentTotalPremium());
     }

+ 146 - 21
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -1,6 +1,9 @@
 package com.jzg.quotation.hengbang.crawler.component;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.component.RequestComponent;
@@ -14,21 +17,23 @@ import com.jzg.quotation.hengbang.crawler.entity.request.*;
 import com.jzg.quotation.hengbang.crawler.entity.response.*;
 import com.jzg.quotation.hengbang.crawler.properties.HengBangCrawlerProperties;
 import com.jzg.quotation.hengbang.crawler.utils.HengBangAESUtil;
+import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.ResponseEntity;
+import org.springframework.http.*;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
 import java.time.Duration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 /**
  * @description: 恒邦财险
@@ -48,6 +53,8 @@ public class HengBangCrawlerRequestComponent {
 
     private final RequestComponent requestComponent;
 
+    private final RestTemplate restTemplate;
+
     /**
      * 验证码
      *
@@ -126,6 +133,46 @@ public class HengBangCrawlerRequestComponent {
                 .get(RequestConstant.PHONE_NUMBER);
     }
 
+    /**
+     * 获取用户信息
+     *
+     * @param username
+     */
+    public HbCrawlerQueryUserInfoResponse queryUserInfo(String username) {
+        MultiValueMap<String, String> param = new LinkedMultiValueMap<>();
+        param.set("sysCategory", "2");
+        param.set("resourceType", "HBXSH");
+        HttpHeaders headers = new HttpHeaders();
+        headers.set(HttpHeaders.ACCEPT,"*/*");
+        headers.set(HttpHeaders.CONTENT_TYPE,"application/x-www-form-urlencode;charset=utf-8");
+        headers.set(HttpHeaders.USER_AGENT,"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36");
+        headers.set(HttpHeaders.AUTHORIZATION,getAuthorization(username));
+        HbCrawlerQueryUserInfoResponse response = requestComponent.get(RequestUrl.QUERY_USER_INFO.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" + username,param,RequestUrl.QUERY_USER_INFO.getRequestDescription(),HbCrawlerQueryUserInfoResponse.class,headers);
+        return response;
+    }
+
+    /**
+     * 获取行业车型信息
+     * @param queryCarInfoRequest
+     * @param headers
+     */
+    public HbCrawlerQueryCarRequest.CbitDataDTO queryCarInfo(HbCrawlerQueryCarInfoRequest queryCarInfoRequest, HttpHeaders headers) {
+        MultiValueMap<String, String> param = RequestObjectConversion.convertMultiValueStringMap(queryCarInfoRequest);
+        String response = requestComponent.get(RequestUrl.QUERY_CAR_INFO.getRequestUrl(hbCrawlerProperties.getBaseUrl()) ,param,RequestUrl.QUERY_CAR_INFO.getRequestDescription(),String.class,headers);
+        JSONObject res = JSONObject.parseObject(response);
+        String ciphertextB64 = res.getString("hb_enc_d");
+        String plaintext = null;
+        try{
+            plaintext = HengBangAESUtil.decryptStr(ciphertextB64);
+        } catch (Exception e) {
+            throw new SystemException("解密失败");
+        }
+        HbCrawlerQueryCarRequest.CbitDataDTO cbitDataDTO = JSONObject.parseObject(plaintext).getJSONObject("carMappings")
+                .getJSONArray("cbitData")
+                .getJSONObject(0).toJavaObject(HbCrawlerQueryCarRequest.CbitDataDTO.class);
+        return cbitDataDTO;
+    }
+
     /**
      * 获取请求头
      *
@@ -141,6 +188,38 @@ public class HengBangCrawlerRequestComponent {
         return headers;
     }
 
+    /**
+     * AES-256-CBC 解密
+     * @param ciphertextB64 Base64 编码的密文(前16字节是IV)
+     * @param key 32字节密钥(256位)
+     * @return 解密后的明文
+     * @throws Exception
+     */
+    public static String aes256CbcDecrypt(String ciphertextB64, byte[] key) throws Exception {
+        if (key.length != 32) {
+            throw new IllegalArgumentException("Key must be 32 bytes (256 bits)");
+        }
+
+        byte[] raw = Base64.getDecoder().decode(ciphertextB64);
+
+        // 前16字节是 IV
+        byte[] iv = new byte[16];
+        System.arraycopy(raw, 0, iv, 0, 16);
+
+        // 剩余部分是实际密文
+        byte[] ciphertext = new byte[raw.length - 16];
+        System.arraycopy(raw, 16, ciphertext, 0, ciphertext.length);
+
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        IvParameterSpec ivSpec = new IvParameterSpec(iv);
+
+        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+        byte[] decrypted = cipher.doFinal(ciphertext);
+
+        return new String(decrypted, "UTF-8");
+    }
+
     /**
      * 查询车型
      *
@@ -149,8 +228,7 @@ public class HengBangCrawlerRequestComponent {
      * @return
      */
     public List<HbCrawlerQueryCarResponse.ContentDTO> queryCar(HbCrawlerQueryCarRequest queryCarRequest, HttpHeaders headers) {
-        HbCrawlerQueryCarResponse queryCarResponse = requestComponent.objectPost(RequestUrl.QUERY_CAR.getRequestUrl(hbCrawlerProperties.getBaseUrl()), queryCarRequest, HbCrawlerQueryCarResponse.class, headers)
-                .getBody();
+        HbCrawlerQueryCarResponse queryCarResponse = requestComponent.toStringPost(RequestUrl.QUERY_CAR.getRequestUrl(hbCrawlerProperties.getBaseUrl()), queryCarRequest,RequestUrl.QUERY_CAR.getRequestDescription(), HbCrawlerQueryCarResponse.class, headers);
         return queryCarResponse.getContent();
     }
 
@@ -180,8 +258,8 @@ public class HengBangCrawlerRequestComponent {
      */
     public String getDepreciationPrice(HbCrawlerDepreciationRequest depreciationRequest, HttpHeaders headers) {
         MultiValueMap<String, String> params = RequestObjectConversion.convertMultiValueStringMap(depreciationRequest);
-        HbCrawlerDepreciationResponse depreciationResponse = requestComponent.get(RequestUrl.DEPRECIATIONRATE.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", HbCrawlerDepreciationResponse.class, headers);
-        return String.valueOf(depreciationResponse.getDepreciationRate());
+        String depreciationResponse = requestComponent.get(RequestUrl.DEPRECIATIONRATE.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", String.class, headers);
+        return depreciationResponse;
     }
 
     /**
@@ -192,6 +270,7 @@ public class HengBangCrawlerRequestComponent {
      * @return
      */
     public String quoteImmediately(HbCrawlerQuoteimmediatelyRequest quoteimmediatelyRequest, HttpHeaders headers) {
+        System.out.println(JSON.toJSON(quoteimmediatelyRequest));
         ResponseEntity<String> stringResponseEntity = requestComponent.objectPost(RequestUrl.QUOTEIMMEDIATELY.getRequestUrl(hbCrawlerProperties.getBaseUrl()), quoteimmediatelyRequest, String.class, headers);
         return stringResponseEntity.getBody();
     }
@@ -203,10 +282,28 @@ public class HengBangCrawlerRequestComponent {
      * @param headers
      * @return
      */
-    public Map<String, Object> getCalculationResult(HbCrawlerCalculationRequest calculationRequest, HttpHeaders headers) {
-        ResponseEntity<HbCrawlerCalculationResponse> calculationResponseResponseEntity = requestComponent.objectPost(RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl()), calculationRequest, HbCrawlerCalculationResponse.class, headers);
-        HbCrawlerCalculationResponse calculationResponse = calculationResponseResponseEntity.getBody();
-        return calculationResponse.getData();
+    public String getCalculationResult(HbCrawlerCalculationRequest calculationRequest, HttpHeaders headers) {
+        HbCrawlerSaleInfoResponse req = new HbCrawlerSaleInfoResponse();
+        req.setHbEncV("1");
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
+            String json = mapper.writeValueAsString(calculationRequest);
+            req.setHbEncD(HengBangAESUtil.encryptStr(json));
+            HbCrawlerSaleInfoResponse response = requestComponent.toStringPost(RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl()), req, RequestUrl.CALCULATION.getRequestDescription(),HbCrawlerSaleInfoResponse.class, headers);
+            System.out.println(HengBangAESUtil.decryptStr(response.getHbEncD()));
+            String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
+            return JSONObject.parseObject(resJson).getString("message");
+        } catch (WebClientResponseException e) {
+            if(e.getStatusCode().equals(HttpStatusCode.valueOf(500))){
+                return JSONObject.parseObject(e.getMessage()).getString("detail");
+            }else{
+                throw new SystemException(e.getMessage());
+            }
+        }
+        catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
     }
 
     /**
@@ -226,8 +323,14 @@ public class HengBangCrawlerRequestComponent {
             throw new SystemException(e.getMessage());
         }
         params.add("plyappno", encryptPlyappno);
-        HbCrawlerProposalResponse proposalResponse = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", HbCrawlerProposalResponse.class, headers);
-        return proposalResponse;
+        HbCrawlerSaleInfoResponse response = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, RequestUrl.PROPOSAL.getRequestDescription(), HbCrawlerSaleInfoResponse.class, headers);
+        try {
+            String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
+            HbCrawlerProposalResponse proposalResponse = JSONObject.parseObject(resJson).toJavaObject(HbCrawlerProposalResponse.class);
+            return proposalResponse;
+        } catch (Exception e) {
+            throw new SystemException("加密解密异常!");
+        }
     }
 
     /**
@@ -259,13 +362,33 @@ public class HengBangCrawlerRequestComponent {
      *
      * @param plyappno
      * @param headers
+     * @param paramList
      * @return
      */
-    public HbCrawlerCoreProposalResponse coreProposal(String plyappno, HttpHeaders headers) {
-        Map<String, String> params = new HashMap<>();
-        params.put("plyappno", plyappno);
-        ResponseEntity<HbCrawlerCoreProposalResponse> responseEntity = requestComponent.objectPost(RequestUrl.SUBMIT.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + plyappno, params, HbCrawlerCoreProposalResponse.class, headers);
-        return responseEntity.getBody();
+    public String coreProposal(String plyappno, HttpHeaders headers, List<Map<String, String>> paramList) {
+        try {
+            ResponseEntity<String> responseEntity = requestComponent.objectPost(RequestUrl.SUBMIT.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" +plyappno, paramList, String.class, headers);
+            return JSONObject.parseObject(responseEntity.getBody()).getString("message");
+        } catch (WebClientResponseException e) {
+            if(e.getStatusCode().equals(HttpStatusCode.valueOf(500))){
+                return JSONObject.parseObject(e.getMessage()).getString("detail");
+            }else{
+                throw new SystemException(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * 获取核保信息
+     * @param plyappno
+     * @param headers
+     * @return
+     */
+    public HbCrawlerCoreProposalResponse coreProposalResult(String plyappno, HttpHeaders headers) {
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+        map.add("plyappno", plyappno);
+        HbCrawlerCoreProposalResponse response = requestComponent.get(RequestUrl.SUBMIT_RESULT.getRequestUrl(hbCrawlerProperties.getBaseUrl()), map, "", HbCrawlerCoreProposalResponse.class, headers);
+        return response;
     }
 
     /**
@@ -329,4 +452,6 @@ public class HengBangCrawlerRequestComponent {
         return requestComponent.objectPost(RequestUrl.PAY_URL.getRequestUrl(hbCrawlerProperties.getBaseUrl())
                 .concat(plyappno), null, HbCrawlerPayUrlResponse.class, headers).getBody();
     }
+
+
 }

+ 6 - 1
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/constant/enums/RequestUrl.java

@@ -15,6 +15,9 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     VERIFY_CODE("/api/refreshVerifyCode", "获取验证码"),
     AUTHENTICATE("/api/authenticateNew", "登录"),
 
+    QUERY_USER_INFO("/intermarket/api/userinfo", "获取用户信息"),
+    QUERY_CAR_INFO("/new-insure/api/carinsurenew/renewinsurance", "获取车辆信息"),
+
     QUERY_CAR("/backstage/api/car-model/queryByCarMapping", "查询车型"),
     FIND_SALE_INFO("/backstage/api/findSaleInformationNew", "查询归属信息"),
     DEPRECIATIONRATE("/backstage/api/coredblink/depreciationrate", "获取折旧价"),
@@ -24,7 +27,9 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
 
     FILEBUFF_UPLOAD("/interflow/api/filebuff-upload/batch-folder?imgType=tihe&plyappno=", "上传影像"),
 
-    SUBMIT("/new-insure/api/carinsurenew/coreproposal", "提交核保"),
+    SUBMIT("/new-insure/api/carinsurenew/quoteToProposal", "提交核保"),
+
+    SUBMIT_RESULT("/new-insure/api/carinsurenew/coreproposal", "获取核保信息"),
 
     ORDER_STATE("/new-insure/api/carInsureMain/list", "查询投保单状态"),
 

+ 4 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/HengBangCrawlerConfigureParameters.java

@@ -15,6 +15,9 @@ public class HengBangCrawlerConfigureParameters implements ConfigureParameters {
     @Serial
     private static final long serialVersionUID = 7212934480389963171L;
 
+
+    private String companyCode;
+
     /**
      * 银保信车型唯一id
      */
@@ -34,4 +37,5 @@ public class HengBangCrawlerConfigureParameters implements ConfigureParameters {
      * 投保单创建时间
      */
     private String appTime;
+
 }

+ 30 - 8
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -1,13 +1,19 @@
 package com.jzg.quotation.hengbang.crawler.entity.request;
 
+import cn.hutool.core.collection.CollUtil;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.commons.utils.DateUtil;
 import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.time.Instant;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @description: 恒邦财险 报价第二步 请求参数
@@ -69,20 +75,36 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
     private static final long serialVersionUID = -6130320344004620564L;
 
     public HbCrawlerCalculationRequest(QuoteVo quoteVo, String plyappno) {
-        this.outofwarrantytype = "N";
         this.clauseType = "2";
-        this.epersonliabilityList = getEpersonliabilityList(quoteVo);
-        this.begintimeBi = quoteVo.getBiRiskInfoVo().getStartDate();
-        this.begintimeCi = quoteVo.getCiRiskInfoVo().getStartDate();
+        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+        this.risktype = "0";
+        if(CollUtil.isNotEmpty(kindInfoVoList)){
+            this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList);
+            this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            this.risktype = "2";
+        }else{
+//            this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
+            this.epersonliabilityList = new ArrayList<>();
+        }
+        if(Objects.nonNull(quoteVo.getCiRiskInfoVo())){
+            this.begintimeCi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
+            this.risktype = "1";
+        }
         this.plyappno = plyappno;
-        this.risktype = "2";
         this.ecarshiptaxPart = "投保人";
         this.taxonomyCode = "02";
         this.epolicyFlag = "Y";
+        this.endtimeBi = "";
+        this.endtimeCi = "";
+        this.expdisc = "";
+        this.accidentEpolicyFlag = "";
+        this.effectfLag = null;
+        this.ecarChargingPosts = new ArrayList<>();
+        this.carInsureDevices = new ArrayList<>();
+        this.accidentInsuranceList = new ArrayList<>();
     }
 
-    public List<EpersonliabilityDTO> getEpersonliabilityList(QuoteVo quoteVo) {
-        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+    public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList) {
         List<EpersonliabilityDTO> epersonliabilityDTOList = new ArrayList<>();
         for (KindInfoVo kindInfoVo : kindInfoVoList) {
             EpersonliabilityDTO epersonliabilityDTO = new EpersonliabilityDTO();
@@ -96,7 +118,7 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest{
         return epersonliabilityDTOList;
     }
 
-    private String outofwarrantytype;
+//    private String outofwarrantytype;
     private String clauseType;
     private List<String> ecarChargingPosts;
     private List<String> carInsureDevices;

+ 49 - 4
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerDepreciationRequest.java

@@ -1,10 +1,17 @@
 package com.jzg.quotation.hengbang.crawler.entity.request;
 
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.quotation.hengbang.crawler.entity.response.HbCrawlerQueryCarResponse;
 import lombok.Data;
 
 import java.io.Serial;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 
 /**
  * @description: 恒邦财险 获取折旧价 请求参数
@@ -17,11 +24,23 @@ public class HbCrawlerDepreciationRequest extends HbBaseRequest{
     @Serial
     private static final long serialVersionUID = 8016121918793424743L;
 
-    public HbCrawlerDepreciationRequest(CarInfoVo carInfoVo, String beginDate, String riskCode, HbCrawlerQueryCarResponse.ContentDTO contentDTO) {
-        this.beginDate = beginDate;
-        this.riskCode = riskCode;
+    public HbCrawlerDepreciationRequest(QuoteVo quoteVo, HbCrawlerQueryCarResponse.ContentDTO contentDTO) {
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        RiskInfoVo ci = quoteVo.getCiRiskInfoVo();
+        RiskInfoVo bi = quoteVo.getBiRiskInfoVo();
+        String beginDate = null;
+        String riskCode = null;
+        if (ci != null) {
+            beginDate = ci.getStartDate();
+            riskCode = ci.getRiskCode();
+        }else{
+            beginDate = bi.getStartDate();
+            riskCode = bi.getRiskCode();
+        }
+        this.beginDate = dateFormat(beginDate);
+        this.riskCode = "0808";
         this.carKindCode = carInfoVo.getCarKindCode();
-        this.enrollDate = carInfoVo.getIssueDate();
+        this.enrollDate = dateFormat(carInfoVo.getRegisterDate());
         this.purchasePrice = contentDTO.getPurchasePriceNotTax();
         this.carUseType = carInfoVo.getVehicleUseCode();
         this.seatCount = contentDTO.getSeatCount();
@@ -30,6 +49,30 @@ public class HbCrawlerDepreciationRequest extends HbBaseRequest{
         this.energyType = carInfoVo.getEnergyTypeCode();
     }
 
+    private String dateFormat(String date){
+        // 1. 解析为 LocalDateTime
+        ZonedDateTime zdt = null;
+        if (date.length() == 10){
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate ld = LocalDate.parse(date, formatter);
+            // 2. 补上 00:00:00,变成 LocalDateTime
+            LocalDateTime ldt = ld.atStartOfDay(); // 等价于 "2025-08-19T00:00:00"
+
+            // 3. 设置时区为 +08:00(北京/上海)
+            ZoneId zone = ZoneId.of("Asia/Shanghai");
+            zdt = ldt.atZone(zone);
+        }else{
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime ldt = LocalDateTime.parse(date, formatter);
+            // 2. 指定时区(这里用 +08:00)
+            ZoneId zone = ZoneId.of("Asia/Shanghai"); // 等价于 +08:00
+            zdt = ldt.atZone(zone);
+        }
+        // 3. 格式化为 ISO-8601 带时区偏移的字符串
+        String result = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+        return result;
+    }
+
     /**
      * 商业险起保日期
      */
@@ -46,4 +89,6 @@ public class HbCrawlerDepreciationRequest extends HbBaseRequest{
     private String tonCount;
     private String useNatureCode;
     private String energyType;
+
+
 }

+ 14 - 8
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerFileUploadRequest.java

@@ -6,6 +6,7 @@ import java.io.Serial;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @description: 恒邦财险 上传影像 请求参数
@@ -17,14 +18,12 @@ public class HbCrawlerFileUploadRequest extends HbBaseRequest{
     @Serial
     private static final long serialVersionUID = 781293083595362938L;
 
-    public HbCrawlerFileUploadRequest(String fileBuff, String fileType, String mark3, Integer fileNum) {
-        this.file_buff = fileBuff;
-        this.file_type = fileType;
+    public HbCrawlerFileUploadRequest(List<String> fileBuff, List<String> fileType, List<String> mark3, List<ExtJsonDTO.ExtArrDTO> fileNum) {
+        this.file_buff = fileBuff.stream().collect(Collectors.joining("||"));
+        this.file_type = fileType.stream().collect(Collectors.joining("||"));
         ExtJsonDTO extJsonDTO = new ExtJsonDTO();
-        extJsonDTO.setMark3(mark3);
-        List<ExtJsonDTO.ExtArrDTO> extArrDTOList = new ArrayList<>(fileNum);
-        extArrDTOList.add(new ExtJsonDTO.ExtArrDTO());
-        extJsonDTO.setExtArr(extArrDTOList);
+        extJsonDTO.setMark3(mark3.stream().collect(Collectors.joining(",")));
+        extJsonDTO.setExtArr(fileNum);
         this.ext_json = extJsonDTO;
     }
 
@@ -47,9 +46,16 @@ public class HbCrawlerFileUploadRequest extends HbBaseRequest{
         public static class ExtArrDTO implements Serializable {
             @Serial
             private static final long serialVersionUID = 4521445632452212652L;
-            private String ocrFlag = "0";
+            private String ocrFlag;
             private String name;
             private String id_number;
+            private String plate_no;
+            private String vin_code;
+            private String engine_no;
+            private String register_date;
+            private String issue_date;
+            private String owner;
         }
+
     }
 }

+ 28 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQueryCarInfoRequest.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.hengbang.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.hengbang.crawler.entity.response.HbCrawlerQueryUserInfoResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+@Data
+@NoArgsConstructor
+public class HbCrawlerQueryCarInfoRequest extends HbBaseRequest{
+
+    @Serial
+    private static final long serialVersionUID = 0216655622031141673577L;
+
+    private String licenseNo;
+    private String frameno;
+    private String brandName;
+    private String companyCode;
+
+    public HbCrawlerQueryCarInfoRequest(CarInfoVo carInfoVo, HbCrawlerQueryUserInfoResponse userInfoResponse){
+        this.licenseNo = carInfoVo.getLicenseNo();
+        this.frameno = carInfoVo.getVinNo();
+        this.brandName = carInfoVo.getBrandName();
+        this.companyCode = userInfoResponse.getUserInfo().get(0).getCompanyCode();
+    }
+}

+ 18 - 9
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQueryCarRequest.java

@@ -1,11 +1,14 @@
 package com.jzg.quotation.hengbang.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;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @description: 恒邦财险 车型查询 请求参数
@@ -29,16 +32,18 @@ public class HbCrawlerQueryCarRequest extends HbBaseRequest {
     @Serial
     private static final long serialVersionUID = 2573166312583296895L;
 
-    public HbCrawlerQueryCarRequest(String brand, String modelCode, Integer VehicleStyleUniqueId) {
-        this.cbitData = new CbitDataDTO(brand, modelCode, VehicleStyleUniqueId);
+    public HbCrawlerQueryCarRequest(CbitDataDTO cbitDataDTO) {
+        List<CbitDataDTO> cbitData = new ArrayList<CbitDataDTO>();
+        cbitData.add(cbitDataDTO);
+        this.cbitData = cbitData;
         this.pageNo = 0;
         this.pageSize = 5;
     }
-
-    private CbitDataDTO cbitData;
-
+    @JsonProperty("cbitData")
+    private List<CbitDataDTO>  cbitData;
+    @JsonProperty("pageNo")
     private Integer pageNo;
-
+    @JsonProperty("pageSize")
     private Integer pageSize;
 
     @Data
@@ -47,8 +52,12 @@ public class HbCrawlerQueryCarRequest extends HbBaseRequest {
     public static class CbitDataDTO implements Serializable {
         @Serial
         private static final long serialVersionUID = 5943174137237635474L;
-        private String Brand;
-        private String ModelCode;
-        private Integer VehicleStyleUniqueId;
+
+        @JsonProperty("Brand")
+        private String brand;
+        @JsonProperty("ModelCode")
+        private String modelCode;
+        @JsonProperty("VehicleStyleUniqueId")
+        private Integer vehicleStyleUniqueId;
     }
 }

+ 93 - 24
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java

@@ -1,15 +1,23 @@
 package com.jzg.quotation.hengbang.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.hengbang.crawler.entity.HengBangCrawlerConfigureParameters;
 import com.jzg.quotation.hengbang.crawler.entity.dto.HbEncDTO;
 import com.jzg.quotation.hengbang.crawler.entity.response.HbCrawlerQueryCarResponse;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeFormatter;
 
 /**
  * @description: 恒邦财险 报价第一步 提交基础数据,返回投保单号
@@ -17,6 +25,7 @@ import java.io.Serializable;
  * @date: 2025/4/9 09:56
  **/
 @Data
+@NoArgsConstructor
 public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
     @Serial
     private static final long serialVersionUID = -4097447719083993314L;
@@ -36,8 +45,8 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         //设置车辆信息
         carInsureItemDTO.setEnergyType(carInfoVo.getEnergyTypeCode());
         carInsureItemDTO.setLicenseNo(carInfoVo.getLicenseNo());
-        carInsureItemDTO.setEnrollDate(carInfoVo.getRegisterDate());
-        carInsureItemDTO.setIssueDate(carInfoVo.getIssueDate());
+        carInsureItemDTO.setEnrollDate(dateFormat(carInfoVo.getRegisterDate()));
+        carInsureItemDTO.setIssueDate(dateFormat(carInfoVo.getIssueDate()));
         carInsureItemDTO.setFrameNo(carInfoVo.getVinNo());
         carInsureItemDTO.setEngineNo(carInfoVo.getEngineNo());
         carInsureItemDTO.setPrintBrandName(contentDTO.getModelCName());
@@ -45,19 +54,33 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureItemDTO.setCarKindCode(carInfoVo.getCarKindCode());
         carInsureItemDTO.setUsenatureCode(carInfoVo.getCarNatureCode());
         carInsureItemDTO.setCarUseType(carInfoVo.getVehicleUseCode());
-        carInsureItemDTO.setNegotiationValue(Integer.parseInt(depreciationPrice));
+        carInsureItemDTO.setNegotiationValue(Double.parseDouble(depreciationPrice));
         carInsureItemDTO.setLicenseKindCode(carInfoVo.getLicenseKindCode());
         carInsureItemDTO.setVehicleType(carInfoVo.getCarTypeCode());
         carInsureItemDTO.setTransferDate(carInfoVo.getTransferDate());
         carInsureItemDTO.setSeatCount(contentDTO.getSeatCount());
-        carInsureItemDTO.setPurchasePrice(Integer.parseInt(contentDTO.getPurchasePriceNotTax()));
-        carInsureItemDTO.setExhaustscale(String.valueOf(contentDTO.getExhaustScale()));
+        carInsureItemDTO.setPurchasePrice(Double.parseDouble(contentDTO.getPurchasePriceNotTax()));
         carInsureItemDTO.setExhaustscale(String.valueOf(contentDTO.getExhaustScale()));
+        carInsureItemDTO.setExhaustScale1(String.valueOf(contentDTO.getExhaustScale()));
         carInsureItemDTO.setPower(contentDTO.getPower());
         carInsureItemDTO.setTonCount(carInfoVo.getTonCount());
         carInsureItemDTO.setCompleteKerbMass(String.valueOf(contentDTO.getCompleteKerbMass()));
-        carInsureItemDTO.setActualValue(Integer.parseInt(depreciationPrice));
-
+        carInsureItemDTO.setActualValue(Double.parseDouble(depreciationPrice));
+        carInsureItemDTO.setModelCode(contentDTO.getModelCode());
+        carInsureItemDTO.setFamilyName(contentDTO.getFamilyName());
+        carInsureItemDTO.setAttachNature(carInfoVo.getPropertyCode());
+        carInsureItemDTO.setCiModelCode(StringUtils.isNotBlank(contentDTO.getCimodelCode())? contentDTO.getCimodelCode() : contentDTO.getCimodelCodeC());
+        carInsureItemDTO.setPurchasePriceNotTax(Double.parseDouble(contentDTO.getPurchasePriceNotTax()));
+        carInsureItemDTO.setStyleUniqueId(contentDTO.getVehicleStyleUniqueId());
+        carInsureItemDTO.setCountyCode(ownersInfo.getCountyCode());
+        carInsureItemDTO.setCountyNameArray(new StringBuilder(ownersInfo.getProvince()).append(",").append(ownersInfo.getCity()).append(",").append(ownersInfo.getCounty()).toString());
+        carInsureItemDTO.setCountyCodeArray(new StringBuilder(ownersInfo.getProvinceCode()).append(",").append(ownersInfo.getCityCode()).append(",").append(ownersInfo.getCountyCode()).toString());
+        carInsureItemDTO.setPostCode(ownersInfo.getCountyCode());
+        carInsureItemDTO.setChgownerFlag(carInfoVo.isTransfer()? "1" : "0");
+        carInsureItemDTO.setSpecialCarFlag("1");
+        carInsureItemDTO.setTotalTonCount("0.00");
+        carInsureItemDTO.setNoticeType(contentDTO.getNoticeType());
+        this.carInsureItem = carInsureItemDTO;
         //设置被保人
         CarInsureRiskRelatedPartyDTO riskRelatedPartyDTO = new CarInsureRiskRelatedPartyDTO();
         riskRelatedPartyDTO.setName(insuredPersonInfo.getName());
@@ -67,13 +90,20 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         riskRelatedPartyDTO.setBirthday(insuredPersonInfo.getBirthday());
         riskRelatedPartyDTO.setEmail(insuredPersonInfo.getEmail());
         riskRelatedPartyDTO.setCountyCode(insuredPersonInfo.getCountyCode());
-        riskRelatedPartyDTO.setCountyNameArray(new StringBuilder(insuredPersonInfo.getProvince()).append(",").append(insuredPersonInfo.getCity()).append(",").append(insuredPersonInfo.getCounty()).toString());
-        riskRelatedPartyDTO.setCountyCodeArray(new StringBuilder(insuredPersonInfo.getProvinceCode()).append(",").append(insuredPersonInfo.getCityCode()).append(",").append(insuredPersonInfo.getCountyCode()).toString());
+        riskRelatedPartyDTO.setPostCode(insuredPersonInfo.getCountyCode());
+        riskRelatedPartyDTO.setCountyNameArray(new StringBuilder(insuredPersonInfo.getProvince()).append(",").append(insuredPersonInfo.getCity()).append(",").append(insuredPersonInfo.getCounty()).toString());
+        riskRelatedPartyDTO.setCountyCodeArray(new StringBuilder(insuredPersonInfo.getProvinceCode()).append(",").append(insuredPersonInfo.getCityCode()).append(",").append(insuredPersonInfo.getCountyCode()).toString());
         riskRelatedPartyDTO.setSex(insuredPersonInfo.getGender());
         riskRelatedPartyDTO.setAddress(insuredPersonInfo.getAddr());
-        riskRelatedPartyDTO.setValidityBegintime(insuredPersonInfo.getIdentifyValidDate());
-        riskRelatedPartyDTO.setValidityEndTime(insuredPersonInfo.getIdentifyValidEndDate());
-
+        riskRelatedPartyDTO.setValidityBegintime(dateFormat(insuredPersonInfo.getIdentifyValidDate()));
+        riskRelatedPartyDTO.setValidityEndTime(dateFormat(insuredPersonInfo.getIdentifyValidEndDate()));
+        riskRelatedPartyDTO.setInsuredType("1");
+        riskRelatedPartyDTO.setCompany("00");
+        riskRelatedPartyDTO.setPosition("60");
+        riskRelatedPartyDTO.setCustomerType("00");
+        riskRelatedPartyDTO.setVipInd("0");
+        riskRelatedPartyDTO.setRelationshipToInsrnt(policyHolderInfo.getName().equals(insuredPersonInfo.getName())? "6" : "0");
+        this.carInsureRiskRelatedParty = riskRelatedPartyDTO;
         //设置投保人数据
         CarInsureRelatedPartyDTO carInsureRelatedPartyDTO = new CarInsureRelatedPartyDTO();
         carInsureRelatedPartyDTO.setName(policyHolderInfo.getName());
@@ -83,14 +113,20 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureRelatedPartyDTO.setBirthday(policyHolderInfo.getBirthday());
         carInsureRelatedPartyDTO.setEmail(policyHolderInfo.getEmail());
         carInsureRelatedPartyDTO.setCountyCode(policyHolderInfo.getCountyCode());
-        carInsureRelatedPartyDTO.setCountyNameArray(new StringBuilder(policyHolderInfo.getProvince()).append(",").append(policyHolderInfo.getCity()).append(",").append(policyHolderInfo.getCounty()).toString());
-        carInsureRelatedPartyDTO.setCountyCodeArray(new StringBuilder(policyHolderInfo.getProvinceCode()).append(",").append(policyHolderInfo.getCityCode()).append(",").append(policyHolderInfo.getCountyCode()).toString());
+        carInsureRelatedPartyDTO.setPostCode(policyHolderInfo.getCountyCode());
+        carInsureRelatedPartyDTO.setCountyNameArray(new StringBuilder(policyHolderInfo.getProvince()).append(",").append(policyHolderInfo.getCity()).append(",").append(policyHolderInfo.getCounty()).toString());
+        carInsureRelatedPartyDTO.setCountyCodeArray(new StringBuilder(policyHolderInfo.getProvinceCode()).append(",").append(policyHolderInfo.getCityCode()).append(",").append(policyHolderInfo.getCountyCode()).toString());
         carInsureRelatedPartyDTO.setSex(policyHolderInfo.getGender());
         carInsureRelatedPartyDTO.setAddress(policyHolderInfo.getAddr());
-        carInsureRelatedPartyDTO.setValidityBegintime(policyHolderInfo.getIdentifyValidDate());
-        carInsureRelatedPartyDTO.setValidityEndTime(insuredPersonInfo.getIdentifyValidEndDate());
-        carInsureRelatedPartyDTO.setInsuredType(parameters.getInvoiceType());
-
+        carInsureRelatedPartyDTO.setValidityBegintime(dateFormat(policyHolderInfo.getIdentifyValidDate()));
+        carInsureRelatedPartyDTO.setValidityEndTime(dateFormat(insuredPersonInfo.getIdentifyValidEndDate()));
+        carInsureRelatedPartyDTO.setInsuredType("1");
+        carInsureRelatedPartyDTO.setCompany("00");
+        carInsureRelatedPartyDTO.setPosition("60");
+        carInsureRelatedPartyDTO.setCustomerType("00");
+        carInsureRelatedPartyDTO.setVipInd("0");
+        carInsureRelatedPartyDTO.setInvoiceRequest("05");
+        this.carInsureRelatedParty = carInsureRelatedPartyDTO;
         //设置归属数据
         CarInsureMainDTO carInsureMainDTO = new CarInsureMainDTO();
         HbEncDTO.SalesManDTO salesMan = saleInfo.getSalesMan();
@@ -110,9 +146,38 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureMainDTO.setMobile(salesMan.getMobile());
         carInsureMainDTO.setSalesmanname(salesMan.getSalesmanname());
         carInsureMainDTO.setUsertype(salesMan.getUsertype());
-        carInsureMainDTO.setInvoiceRequest(parameters.getInvoiceType());
+        carInsureMainDTO.setInvoiceRequest("05");
         carInsureMainDTO.setOperatorCode(quoteVo.getOrder().getAttributionInformationVo().getUsername());
         carInsureMainDTO.setCreator(quoteVo.getOrder().getAttributionInformationVo().getUsername());
+        carInsureMainDTO.setBusinessMode("2");
+        carInsureMainDTO.setBusinessModeName("代理");
+        carInsureMainDTO.setResourceType("HBXSH");
+        carInsureMainDTO.setAccountPeriod("账期");
+        this.carInsureMain = carInsureMainDTO;
+    }
+
+    private String dateFormat(String date){
+        // 1. 解析为 LocalDateTime
+        ZonedDateTime zdt = null;
+        if (date.length() == 10){
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate ld = LocalDate.parse(date, formatter);
+            // 2. 补上 00:00:00,变成 LocalDateTime
+            LocalDateTime ldt = ld.atStartOfDay(); // 等价于 "2025-08-19T00:00:00"
+
+            // 3. 设置时区为 +08:00(北京/上海)
+            ZoneId zone = ZoneId.of("Asia/Shanghai");
+            zdt = ldt.atZone(zone);
+        }else{
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime ldt = LocalDateTime.parse(date, formatter);
+            // 2. 指定时区(这里用 +08:00)
+            ZoneId zone = ZoneId.of("Asia/Shanghai"); // 等价于 +08:00
+            zdt = ldt.atZone(zone);
+        }
+        // 3. 格式化为 ISO-8601 带时区偏移的字符串
+        String result = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+        return result;
     }
 
     /**
@@ -214,7 +279,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         /**
          * 协商价格
          */
-        private Integer negotiationValue;
+        private Double negotiationValue;
         /**
          * 车牌种类
          */
@@ -242,15 +307,17 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         /**
          * 新车购置价
          */
-        private Integer purchasePrice;
+        private Double purchasePrice;
         /**
          * 排量(cc)
          */
+        @JsonProperty("exhaustscale")
         private String exhaustscale;
         /**
          * 排量
          */
-        private String exhaustScale;
+        @JsonProperty("exhaustScale")
+        private String exhaustScale1;
         /**
          * 功率(KW)
          */
@@ -286,11 +353,11 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         /**
          * 折旧价
          */
-        private Integer actualValue;
+        private Double actualValue;
         /**
          *
          */
-        private Integer purchasePriceNotTax;
+        private Double purchasePriceNotTax;
         /**
          *
          */
@@ -323,6 +390,8 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
          *
          */
         private String countyNameArray;
+
+        private String postCode;
     }
 
     @Data

+ 0 - 18
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerDepreciationResponse.java

@@ -1,18 +0,0 @@
-package com.jzg.quotation.hengbang.crawler.entity.response;
-
-import lombok.Data;
-
-import java.io.Serial;
-
-/**
- * @description: 恒邦财险 获取折旧价 返回参数
- * @author: shenwd
- * @date: 2025/4/8 16:02
- **/
-@Data
-public class HbCrawlerDepreciationResponse extends HbBaseResponse{
-    @Serial
-    private static final long serialVersionUID = 8099798304263496357L;
-
-    private Double depreciationRate;
-}

+ 62 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerQueryCarResponse.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.hengbang.crawler.entity.response;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.quotation.commons.filter.CarModelsFilter;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -126,14 +127,28 @@ public class HbCrawlerQueryCarResponse extends HbBaseResponse {
     @Serial
     private static final long serialVersionUID = -8624231841629870165L;
 
+    @JsonProperty("totalElements")
     private Integer totalElements;
+
+    @JsonProperty("totalPages")
     private Integer totalPages;
+
+    @JsonProperty("last")
     private Boolean last;
+
+    @JsonProperty("first")
     private Boolean first;
+
+    @JsonProperty("numberOfElements")
     private Integer numberOfElements;
+
+    @JsonProperty("size")
     private Integer size;
+
+    @JsonProperty("number")
     private Integer number;
 
+    @JsonProperty("content")
     private List<ContentDTO> content;
 
     @Data
@@ -141,29 +156,76 @@ public class HbCrawlerQueryCarResponse extends HbBaseResponse {
         @Serial
         private static final long serialVersionUID = 2286931992313421081L;
 
+        @JsonProperty("modelCode")
         private String modelCode;
+
+        @JsonProperty("modelCName")
         private String modelCName;
+
+        @JsonProperty("carBrand")
         private String carBrand;
+
+        @JsonProperty("familyName")
         private String familyName;
+
+        @JsonProperty("vehicleClass")
         private String vehicleClass;
+
+        @JsonProperty("carStyle")
         private String carStyle;
+
+        @JsonProperty("exhaustScale")
         private Double exhaustScale;
+
+        @JsonProperty("power")
         private String power;
+
+        @JsonProperty("seatCount")
         private String seatCount;
+
+        @JsonProperty("carYear")
         private String carYear;
+
+        @JsonProperty("purchasePrice")
         private String purchasePrice;
+
+        @JsonProperty("transmissiontType")
         private String transmissiontType;
+
+        @JsonProperty("remark")
         private String remark;
+
+        @JsonProperty("completeKerbMass")
         private Double completeKerbMass;
+
+        @JsonProperty("carKind")
         private String carKind;
+
+        @JsonProperty("purchasePriceNotTax")
         private String purchasePriceNotTax;
+
+        @JsonProperty("cimodelCode")
         private String cimodelCode;
+
+        @JsonProperty("cimodelName")
         private String cimodelName;
+
+        @JsonProperty("cimodelCodeC")
         private String cimodelCodeC;
+
+        @JsonProperty("ciModelNameC")
         private String ciModelNameC;
+
+        @JsonProperty("energyType")
         private String energyType;
+
+        @JsonProperty("noticeType")
         private String noticeType;
+
+        @JsonProperty("vehicleStyleUniqueId")
         private String vehicleStyleUniqueId;
+
+        @JsonProperty("dataType")
         private String dataType;
     }
 

+ 25 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerQueryUserInfoResponse.java

@@ -0,0 +1,25 @@
+package com.jzg.quotation.hengbang.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class HbCrawlerQueryUserInfoResponse {
+
+    @JsonProperty("userInfo")
+    private List<UserInfo> userInfo;
+
+    @Data
+    public static class UserInfo{
+
+        @JsonProperty("COMPANYCODE")
+        private String companyCode;
+
+    }
+
+
+}

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

@@ -1,8 +1,12 @@
 package com.jzg.quotation.hengbang.crawler.service.Impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.constants.ProductsType;
+import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -28,9 +32,12 @@ import com.jzg.quotation.hengbang.crawler.properties.HengBangCrawlerProperties;
 import com.jzg.quotation.hengbang.crawler.service.HbCrawlerOrderService;
 import com.jzg.quotation.hengbang.crawler.service.HengBangCrawlerRequest;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 
+
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -65,19 +72,25 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
      */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
-        // 1.0获取token的请求头
+        // 1.0 获取token的请求头
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-        //获取配置信息
+        // 1.1获取配置信息
         HengBangCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HengBangCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
 
-        //获取车型
+        // 2.0 获取车型
+        // 2.1 获取系统用户信息
+        HbCrawlerQueryUserInfoResponse userInfoResponse = hbCrawlerRequestComponent.queryUserInfo(attributionInformationVo.getUsername());
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
-        HbCrawlerQueryCarRequest hbCrawlerQueryCarRequest = new HbCrawlerQueryCarRequest(carInfoVo.getBrandName(), carInfoVo.getVinNo(), parameters.getVehicleStyleUniqueId());
+        // 2.2 获取行业车型信息
+        HbCrawlerQueryCarInfoRequest queryCarInfoRequest = new HbCrawlerQueryCarInfoRequest(carInfoVo, userInfoResponse);
+        HbCrawlerQueryCarRequest.CbitDataDTO cbitDataDTO = hbCrawlerRequestComponent.queryCarInfo(queryCarInfoRequest,headers);
+        // 2.3 车型查询
+        HbCrawlerQueryCarRequest hbCrawlerQueryCarRequest = new HbCrawlerQueryCarRequest(cbitDataDTO);
         List<HbCrawlerQueryCarResponse.ContentDTO> contentDTOS = hbCrawlerRequestComponent.queryCar(hbCrawlerQueryCarRequest, headers);
-        //过滤车型
+        // 2.4 过滤车型
         HbCrawlerQueryCarResponse.ContentDTO contentDTO = CarModelsFilterUtils.to(contentDTOS, carInfoVo);
-        //查询归属信息
+        // 3.0 查询归属信息
         String phoneNumber = hbCrawlerRequestComponent.getPhoneNumber(attributionInformationVo.getUsername());
         HbCrawlerSaleInfoRequest saleInfoRequest = new HbCrawlerSaleInfoRequest(phoneNumber);
         HbEncDTO salesInfo;
@@ -86,26 +99,26 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         } catch (Exception e) {
             throw new SystemException(e.getMessage());
         }
-        //获取折旧价
-        RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
-        HbCrawlerDepreciationRequest depreciationRequest = new HbCrawlerDepreciationRequest(carInfoVo, biRiskInfoVo.getStartDate(), biRiskInfoVo.getRiskCode(), contentDTO);
+        // 4.0 获取折旧价
+        HbCrawlerDepreciationRequest depreciationRequest = new HbCrawlerDepreciationRequest(quoteVo,contentDTO);
         String depreciationPrice = hbCrawlerRequestComponent.getDepreciationPrice(depreciationRequest, headers);
 
-        //报价第一步,提交基础数据,返回订单号
+        // 5.0 报价第一步,提交基础数据,返回订单号
         HbCrawlerQuoteimmediatelyRequest quoteimmediatelyRequest = new HbCrawlerQuoteimmediatelyRequest(quoteVo, salesInfo, depreciationPrice, parameters, contentDTO);
         String plyappno = hbCrawlerRequestComponent.quoteImmediately(quoteimmediatelyRequest, headers);
-        //报价第二步,提交报价数据,返回是否重复投保,脱保等提示信息,用于页面展示
+        // 5.1 报价第二步,提交报价数据,返回是否重复投保,脱保等提示信息,用于页面展示
         HbCrawlerCalculationRequest calculationRequest = new HbCrawlerCalculationRequest(quoteVo, plyappno);
-        Map<String, Object> calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
-        //报价第三步,获取报价数据
-        HbCrawlerProposalResponse proposalResponse = hbCrawlerRequestComponent.proposal(plyappno, headers);
-
-        HbCrawlerOrder hbCrawlerOrder = new HbCrawlerOrder();
-        hbCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
-        hbCrawlerOrder.setPlyappno(plyappno);
-        hbCrawlerOrderService.save(hbCrawlerOrder);
-
-        return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse);
+        String calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+        HbCrawlerProposalResponse proposalResponse = null;
+        if(calculationResult.equals("成功")){
+            // 5.2 报价第三步,获取报价数据
+            proposalResponse = hbCrawlerRequestComponent.proposal(plyappno, headers);
+            HbCrawlerOrder hbCrawlerOrder = new HbCrawlerOrder();
+            hbCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+            hbCrawlerOrder.setPlyappno(plyappno);
+            hbCrawlerOrderService.save(hbCrawlerOrder);
+        }
+        return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse, calculationResult);
     }
 
     /**
@@ -117,12 +130,46 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         HbCrawlerOrder hbCrawlerOrder = hbCrawlerOrderService.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
+        String productCode = underwritingVo.getInsOrders().getProductId();
+        List<Map<String, String>> paramList = new ArrayList<>();
+        if(productCode.equals(ProductsType.PT_0330.getCode())){
+            Map<String, String> params = new HashMap<>();
+            params.put("clauseCode","T001_1");
+            params.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params.put("clauseName","第一现场报案");
+            params.put("riskCode","0801");
+            paramList.add(params);
+        } else if(productCode.equals(ProductsType.PT_034001.getCode())){
+            Map<String, String> params = new HashMap<>();
+            params.put("clauseCode","T001_1");
+            params.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params.put("clauseName","第一现场报案");
+            params.put("riskCode","0808");
+            paramList.add(params);
+        } else{
+            Map<String, String> params1 = new HashMap<>();
+            params1.put("clauseCode","T001_1");
+            params1.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params1.put("clauseName","第一现场报案");
+            params1.put("riskCode","0801");
+            paramList.add(params1);
+            Map<String, String> params2 = new HashMap<>();
+            params2.put("clauseCode","T001_1");
+            params2.put("clauseContext","为更好地保障您的权益,请您在发生保险事故后保留出险第一现场,并立即致电24小时服务电话:956079。");
+            params2.put("clauseName","第一现场报案");
+            params2.put("riskCode","0808");
+            paramList.add(params2);
+        }
 
-        HbCrawlerCoreProposalResponse coreProposalResponse = hbCrawlerRequestComponent.coreProposal(hbCrawlerOrder.getPlyappno(), headers);
-        hbCrawlerOrder.setCiProposalNo(coreProposalResponse.getEfcProposalNo());
-        hbCrawlerOrder.setBiProposalNo(coreProposalResponse.getBizProposalNo());
-        hbCrawlerOrderService.update(hbCrawlerOrder);
-        return null;
+        String message = hbCrawlerRequestComponent.coreProposal(hbCrawlerOrder.getPlyappno(), headers,paramList);
+        if("成功".equals(message)){
+            // 获取核保信息
+            HbCrawlerCoreProposalResponse response = hbCrawlerRequestComponent.coreProposalResult(hbCrawlerOrder.getPlyappno(), headers);
+            hbCrawlerOrder.setCiProposalNo(response.getEfcProposalNo());
+            hbCrawlerOrder.setBiProposalNo(response.getBizProposalNo());
+            hbCrawlerOrderService.update(hbCrawlerOrder);
+        }
+        return new UnderwritingResultsVo();
     }
 
     /**
@@ -154,36 +201,98 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         HbCrawlerOrder hbCrawlerOrder = hbCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder()
                 .getOrdersNo());
+
+        // 获取车主/投保人/被保人信息
+        List<InsOrdersCarUserInfo> userInfos = insuranceUploadImageVo.getInsOrdersCarUserInfoList();
+        InsOrdersCarUserInfo ownerInfo = userInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(1))
+                .findFirst().orElse(null);
+        InsOrdersCarUserInfo policyHolderInfo = userInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(2))
+                .findFirst().orElse(null);
+        InsOrdersCarUserInfo insuredHolder = userInfos.stream()
+                .filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(3))
+                .findFirst().orElse(null);
+        CarInfoVo carInfo = insuranceUploadImageVo.getCarInfo();
         //暂时将图片默认为01,06,09,投保业务-旧车-其他资料
         Integer fileNum = 0;
-        StringBuilder fileBuff = new StringBuilder();
-        StringBuilder fileType = new StringBuilder();
-        StringBuilder mark3 = new StringBuilder();
-        Integer mark3Num = 100;//恒邦规定从100开始
+        List<String> fileBuff = new ArrayList<>();
+        List<String> fileType = new ArrayList<>();
+        List<String> mark3 = new ArrayList<>();
+        List<HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO> extArrDTOS = new ArrayList<>();
+
+//        Integer mark3Num = 100;//恒邦规定从100开始
         List<InsuranceImageVo> imageVoList = insuranceUploadImageVo.getImageVoList();
-        if (imageVoList != null && !imageVoList.isEmpty()) {
+        if (CollUtil.isNotEmpty(imageVoList)) {
             for (InsuranceImageVo insuranceImageVo : imageVoList) {
                 List<InsuranceImageVo.ImageDTO> imageBase64List = insuranceImageVo.getImageBase64List();
-                if (imageBase64List != null && !imageBase64List.isEmpty()) {
-                    for (InsuranceImageVo.ImageDTO imageBase64 : imageBase64List) {
-                        if (!fileBuff.isEmpty()) {
-                            fileBuff.append("||");
-                        }
-                        fileBuff.append(imageBase64.getImageBase64Str());
-                        if (!fileType.isEmpty()) {
-                            fileType.append("||");
-                        }
-                        fileType.append(RequestConstant.IMAGE_TYPE);
-                        if (!mark3.isEmpty()) {
-                            mark3.append(",");
-                        }
-                        mark3.append(mark3Num++);
-                        fileNum += 1;
+                if(CollUtil.isNotEmpty(imageBase64List)){
+                    fileBuff.add("data:image/jpeg;base64," + imageBase64List.get(0).getImageBase64Str());
+                    if(InsuranceImageEnum.C02.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("6");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setName(ownerInfo.getName());
+                        extArrDTO.setId_number(ownerInfo.getIdentifyNumber());
+                        extArrDTOS.add(extArrDTO);
+                    } else if(InsuranceImageEnum.C01.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,02,投保业务-旧车-行驶证");
+                        mark3.add("8");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setPlate_no(carInfo.getLicenseNo());
+                        extArrDTO.setEngine_no(carInfo.getEngineNo());
+                        extArrDTO.setOwner(ownerInfo.getName());
+                        extArrDTO.setVin_code(carInfo.getVinNo());
+                        extArrDTO.setIssue_date(carInfo.getIssueDate());
+                        extArrDTO.setRegister_date(carInfo.getRegisterDate());
+                        extArrDTOS.add(extArrDTO);
+                    } else if(InsuranceImageEnum.D02.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("7");
+                        extArrDTOS.add(new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO());
+                    } else if(InsuranceImageEnum.D01.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,02,投保业务-旧车-行驶证");
+                        mark3.add("9");
+                        extArrDTOS.add(new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO());
+                    } else if(InsuranceImageEnum.C03.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("11");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setName(policyHolderInfo.getName());
+                        extArrDTO.setId_number(policyHolderInfo.getIdentifyNumber());
+                        extArrDTOS.add(extArrDTO);
+                    } else if(InsuranceImageEnum.D03.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("12");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setName(policyHolderInfo.getName());
+                        extArrDTO.setId_number(policyHolderInfo.getIdentifyNumber());
+                        extArrDTOS.add(extArrDTO);
+                    } else if(InsuranceImageEnum.C04.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("13");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setName(insuredHolder.getName());
+                        extArrDTO.setId_number(insuredHolder.getIdentifyNumber());
+                        extArrDTOS.add(extArrDTO);
+                    } else if(InsuranceImageEnum.D04.getCode().equals(insuranceImageVo.getImageCode())){
+                        fileType.add("01,06,03,投保业务-旧车-证件");
+                        mark3.add("14");
+                        HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO extArrDTO = new HbCrawlerFileUploadRequest.ExtJsonDTO.ExtArrDTO();
+                        extArrDTO.setOcrFlag("1");
+                        extArrDTO.setName(insuredHolder.getName());
+                        extArrDTO.setId_number(insuredHolder.getIdentifyNumber());
+                        extArrDTOS.add(extArrDTO);
                     }
                 }
             }
         }
-        HbCrawlerFileUploadRequest fileUploadRequest = new HbCrawlerFileUploadRequest(fileBuff.toString(), fileType.toString(), mark3.toString(), fileNum);
+        HbCrawlerFileUploadRequest fileUploadRequest = new HbCrawlerFileUploadRequest(fileBuff, fileType, mark3, extArrDTOS);
         hbCrawlerRequestComponent.uploadImage(fileUploadRequest, headers, hbCrawlerOrder.getPlyappno());
     }
 
@@ -251,4 +360,6 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         HbCrawlerOrderStateResponse orderStateResponse = hbCrawlerRequestComponent.orderState(parameters.getLicenseNo(), parameters.getAppTime(), attributionInformationVo.getUsername(), headers);
         return null;
     }
+
+
 }

File diff suppressed because it is too large
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


+ 5 - 0
tenant/insurance/quotation-summary/pom.xml

@@ -111,6 +111,11 @@
             <artifactId>quotation-ansheng</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-zhongan</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
 
         <!-- thymeleaf 模版类 -->
         <dependency>

+ 8 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -31,6 +31,7 @@ import com.jzg.commons.constants.quote.enums.base.QuoteRuleCategory;
 import com.jzg.commons.entity.quote.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.service.QuotationBaseService;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
+import com.jzg.quotation.hengbang.crawler.service.HengBangCrawlerRequest;
 import com.jzg.quotation.summary.aop.QuoteVerification;
 import com.jzg.quotation.summary.aop.OrderOperationLog;
 import com.jzg.quotation.summary.constants.QuoteNumberConstant;
@@ -138,9 +139,10 @@ public class UnifyOrderManager {
     private InsOrdersTrackService insOrdersTrackService;
 
     @Autowired
-    private ZhongMeiCrawlerRequest zhongMeiCrawlerRequest;
-
+    private HengBangCrawlerRequest hengBangCrawlerRequest;
 
+    @Autowired
+    private ZhongMeiCrawlerRequest zhongMeiCrawlerRequest;
 
 
     private String getSystemCode() {
@@ -207,7 +209,7 @@ public class UnifyOrderManager {
     @PostMapping("/quote")
     @QuoteVerification
     public HttpResult<QuoteResultsVo> quote(@RequestBody QuoteVo quoteVo) throws Exception {
-        HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(quoteVo.getOrder()
+         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(quoteVo.getOrder()
                 .getInsuranceCompanyCode(), baseController.getToken());
         AssertionUtils.isFail(esmInsCompanyHttpResult.getCode() != 200, esmInsCompanyHttpResult.getMsg());
         String systemCode = getSystemCode();
@@ -406,6 +408,9 @@ public class UnifyOrderManager {
         if (byCompanyId.getData().isEmpty()) {
             AssertionUtils.isFail(true, "保司未配置协议");
         }
+
+        List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.getByOrderId(insuranceUploadImageVo.getOrder().getOrdersNo());
+        insuranceUploadImageVo.setInsOrdersCarUserInfoList(insOrdersCarUserInfos);
         insuranceUploadImageVo.getOrder().setAgreementId(byCompanyId.getData().get(0).getId());
         insuranceUploadImageVo.getOrder().setInsuranceCompanyCode(esmInsCompanyHttpResult.getData().getCompanyCode());
         insuranceUploadImageVo.getOrder().setInsuranceCompanyId(esmInsCompanyHttpResult.getData().getId());

+ 4 - 0
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -184,3 +184,7 @@ zijin:
     downLoadDocument: http://test-open.zking.com/temp/api/v1/insurance/nonAutoMobile/queryPolicy/downLoadDocument
     # 对接三方渠道验车链接接口
     sendCheckCarLink: http://open.zking.com/api/v1/open/open-aggregate/auth/wanJiaYun/sendCheckCarLink
+
+
+zhongAn:
+  id: "975113"

+ 182 - 182
tenant/insurance/quotation-summary/src/test/java/com/jzg/quotation/taikang/crawler/service/ChengTaiCrawlerRequestServiceTest.java

@@ -1,182 +1,182 @@
-package com.jzg.quotation.taikang.crawler.service;
-
-import com.jzg.quotation.chengtai.crawler.JsonUtil;
-import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiBiContract;
-import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiCiContract;
-import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiContractMain;
-import com.jzg.quotation.chengtai.crawler.model.param.ChengTaiPremiumcalParam;
-import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiDownloadAddressResult;
-import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiInsureResult;
-import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiSystemResult;
-import com.jzg.quotation.chengtai.crawler.service.ChengTaiAPIService;
-import com.jzg.quotation.chengtai.crawler.service.ChengTaiCrawlerRequestService;
-import com.jzg.quotation.summary.SummaryQuotationApplication;
-import jakarta.annotation.Resource;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.boot.test.context.SpringBootTest;
-
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-@SpringBootTest(classes = {SummaryQuotationApplication.class})
-public class ChengTaiCrawlerRequestServiceTest {
-    private static final Logger logger = LoggerFactory.getLogger(ChengTaiCrawlerRequestServiceTest.class);
-
-    @Resource
-    private ChengTaiCrawlerRequestService chengTaiCrawlerRequestService;
-
-    @Resource
-    public ChengTaiAPIService chengTaiAPIService;
-
-    @BeforeAll
-    public static void befroe() {
-       // ChengTaiAPIHelper.initAPI("https://b2b.champion-ic.com");
-    }
-
-    @Test
-    public void login() {
-        String username = "0105B122";
-        String password = "Tqct@2024.";
-        String captcha = "2QVPHjQEJk/FLGkVXPgNndHmbd/ywg0/iZM+6WkEnTOWSiim4s9Ez9dUyvDBF/1S/dR8n4gabCJJ/iOq8b7HT1K1F0YOuOs/jffMBk/T9Cg=";
-
-        String token = chengTaiCrawlerRequestService.login(username, password, captcha);
-
-        assertNotNull(token);
-    }
-
-    @Test
-    public void system() {
-        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
-
-        ChengTaiSystemResult system = chengTaiAPIService.system(token);
-
-        assertNotNull(system);
-    }
-
-    @Test
-    public void getPolicyModel() {
-        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
-
-        String orderId = "1909779147122143234";
-
-        ChengTaiPremiumcalParam result = chengTaiAPIService.getPolicyModel(token, orderId);
-
-        assertNotNull(result);
-
-        System.out.println("==================================================");
-
-        System.out.println(JsonUtil.toJsonString(result));
-
-        System.out.println();
-        System.out.println();
-        System.out.println();
-
-
-        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
-    }
-
-    @Test
-    public void insure() {
-        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
-
-        String uuid = "uXu-BI-WTN6M2kEpoZdaDQ";
-
-        List<ChengTaiInsureResult> result = chengTaiAPIService.insure(token, uuid);
-
-        assertNotNull(result);
-
-        System.out.println("==================================================");
-
-        System.out.println(JsonUtil.toJsonString(result));
-
-        System.out.println();
-        System.out.println();
-        System.out.println();
-
-
-        for (ChengTaiInsureResult  item : result) {
-            System.out.println(JsonUtil.toJsonString(item.getUnknownFields()));
-
-            System.out.println(item.getPayUrl());
-        }
-    }
-
-    @Test
-    public void downloadAddress() {
-        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
-
-        String contractNo = "6050400082120250005927";
-        String policyUuid = "8s3HUoSHRxeLvJcFa40T9g";
-        String expiryDate = "2026-04-10 00:00:00";
-
-        ChengTaiDownloadAddressResult result = chengTaiAPIService.downloadAddress(token, contractNo, policyUuid, expiryDate);
-
-        assertNotNull(result);
-        assertNotNull(result.getQueryResults());
-
-        System.out.println("==================================================");
-
-        System.out.println(JsonUtil.toJsonString(result));
-
-        System.out.println();
-        System.out.println();
-        System.out.println();
-
-        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
-
-        List<ChengTaiDownloadAddressResult.QueryResult> queryResults = result.getQueryResults();
-
-        for (ChengTaiDownloadAddressResult.QueryResult item : queryResults) {
-            System.out.println(item.getDownLoadURL());
-        }
-    }
-
-    @Test
-    public void downloadAddress2() {
-        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
-
-        String orderId = "1909864837421408258";
-
-        ChengTaiPremiumcalParam param = chengTaiAPIService.getPolicyModel(token, orderId);
-
-        ChengTaiCiContract ciContract = param.getCiContract();
-        ChengTaiBiContract biContract = param.getBiContract();
-
-        ChengTaiContractMain contractMain = null;
-        if (ciContract != null) {
-            contractMain = ciContract.getContractMain();
-        }
-        if (contractMain == null && biContract != null) {
-            contractMain = biContract.getContractMain();
-        }
-
-        String contractNo = contractMain.getPolicyNo();
-        String policyUuid = contractMain.getPolicyUuid();
-        String expiryDate = contractMain.getValidDate();
-
-        ChengTaiDownloadAddressResult result = chengTaiAPIService.downloadAddress(token, contractNo, policyUuid, expiryDate);
-
-        assertNotNull(result);
-        assertNotNull(result.getQueryResults());
-
-        System.out.println("==================================================");
-
-        System.out.println(JsonUtil.toJsonString(result));
-
-        System.out.println();
-        System.out.println();
-        System.out.println();
-
-        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
-
-        List<ChengTaiDownloadAddressResult.QueryResult> queryResults = result.getQueryResults();
-
-        for (ChengTaiDownloadAddressResult.QueryResult item : queryResults) {
-            System.out.println(item.getDownLoadURL());
-        }
-    }
-}
+//package com.jzg.quotation.taikang.crawler.service;
+//
+//import com.jzg.quotation.chengtai.crawler.JsonUtil;
+//import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiBiContract;
+//import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiCiContract;
+//import com.jzg.quotation.chengtai.crawler.model.entity.ChengTaiContractMain;
+//import com.jzg.quotation.chengtai.crawler.model.param.ChengTaiPremiumcalParam;
+//import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiDownloadAddressResult;
+//import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiInsureResult;
+//import com.jzg.quotation.chengtai.crawler.model.result.ChengTaiSystemResult;
+//import com.jzg.quotation.chengtai.crawler.service.ChengTaiAPIService;
+//import com.jzg.quotation.chengtai.crawler.service.ChengTaiCrawlerRequestService;
+//import com.jzg.quotation.summary.SummaryQuotationApplication;
+//import jakarta.annotation.Resource;
+//import org.junit.jupiter.api.BeforeAll;
+//import org.junit.jupiter.api.Test;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.boot.test.context.SpringBootTest;
+//
+//import java.util.List;
+//
+//import static org.junit.jupiter.api.Assertions.assertNotNull;
+//
+//@SpringBootTest(classes = {SummaryQuotationApplication.class})
+//public class ChengTaiCrawlerRequestServiceTest {
+//    private static final Logger logger = LoggerFactory.getLogger(ChengTaiCrawlerRequestServiceTest.class);
+//
+//    @Resource
+//    private ChengTaiCrawlerRequestService chengTaiCrawlerRequestService;
+//
+//    @Resource
+//    public ChengTaiAPIService chengTaiAPIService;
+//
+//    @BeforeAll
+//    public static void befroe() {
+//       // ChengTaiAPIHelper.initAPI("https://b2b.champion-ic.com");
+//    }
+//
+//    @Test
+//    public void login() {
+//        String username = "0105B122";
+//        String password = "Tqct@2024.";
+//        String captcha = "2QVPHjQEJk/FLGkVXPgNndHmbd/ywg0/iZM+6WkEnTOWSiim4s9Ez9dUyvDBF/1S/dR8n4gabCJJ/iOq8b7HT1K1F0YOuOs/jffMBk/T9Cg=";
+//
+//        String token = chengTaiCrawlerRequestService.login(username, password, captcha);
+//
+//        assertNotNull(token);
+//    }
+//
+//    @Test
+//    public void system() {
+//        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
+//
+//        ChengTaiSystemResult system = chengTaiAPIService.system(token);
+//
+//        assertNotNull(system);
+//    }
+//
+//    @Test
+//    public void getPolicyModel() {
+//        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
+//
+//        String orderId = "1909779147122143234";
+//
+//        ChengTaiPremiumcalParam result = chengTaiAPIService.getPolicyModel(token, orderId);
+//
+//        assertNotNull(result);
+//
+//        System.out.println("==================================================");
+//
+//        System.out.println(JsonUtil.toJsonString(result));
+//
+//        System.out.println();
+//        System.out.println();
+//        System.out.println();
+//
+//
+//        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
+//    }
+//
+//    @Test
+//    public void insure() {
+//        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
+//
+//        String uuid = "uXu-BI-WTN6M2kEpoZdaDQ";
+//
+//        List<ChengTaiInsureResult> result = chengTaiAPIService.insure(token, uuid);
+//
+//        assertNotNull(result);
+//
+//        System.out.println("==================================================");
+//
+//        System.out.println(JsonUtil.toJsonString(result));
+//
+//        System.out.println();
+//        System.out.println();
+//        System.out.println();
+//
+//
+//        for (ChengTaiInsureResult  item : result) {
+//            System.out.println(JsonUtil.toJsonString(item.getUnknownFields()));
+//
+//            System.out.println(item.getPayUrl());
+//        }
+//    }
+//
+//    @Test
+//    public void downloadAddress() {
+//        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
+//
+//        String contractNo = "6050400082120250005927";
+//        String policyUuid = "8s3HUoSHRxeLvJcFa40T9g";
+//        String expiryDate = "2026-04-10 00:00:00";
+//
+//        ChengTaiDownloadAddressResult result = chengTaiAPIService.downloadAddress(token, contractNo, policyUuid, expiryDate);
+//
+//        assertNotNull(result);
+//        assertNotNull(result.getQueryResults());
+//
+//        System.out.println("==================================================");
+//
+//        System.out.println(JsonUtil.toJsonString(result));
+//
+//        System.out.println();
+//        System.out.println();
+//        System.out.println();
+//
+//        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
+//
+//        List<ChengTaiDownloadAddressResult.QueryResult> queryResults = result.getQueryResults();
+//
+//        for (ChengTaiDownloadAddressResult.QueryResult item : queryResults) {
+//            System.out.println(item.getDownLoadURL());
+//        }
+//    }
+//
+//    @Test
+//    public void downloadAddress2() {
+//        String token = chengTaiCrawlerRequestService.login("0105B122", null, null);
+//
+//        String orderId = "1909864837421408258";
+//
+//        ChengTaiPremiumcalParam param = chengTaiAPIService.getPolicyModel(token, orderId);
+//
+//        ChengTaiCiContract ciContract = param.getCiContract();
+//        ChengTaiBiContract biContract = param.getBiContract();
+//
+//        ChengTaiContractMain contractMain = null;
+//        if (ciContract != null) {
+//            contractMain = ciContract.getContractMain();
+//        }
+//        if (contractMain == null && biContract != null) {
+//            contractMain = biContract.getContractMain();
+//        }
+//
+//        String contractNo = contractMain.getPolicyNo();
+//        String policyUuid = contractMain.getPolicyUuid();
+//        String expiryDate = contractMain.getValidDate();
+//
+//        ChengTaiDownloadAddressResult result = chengTaiAPIService.downloadAddress(token, contractNo, policyUuid, expiryDate);
+//
+//        assertNotNull(result);
+//        assertNotNull(result.getQueryResults());
+//
+//        System.out.println("==================================================");
+//
+//        System.out.println(JsonUtil.toJsonString(result));
+//
+//        System.out.println();
+//        System.out.println();
+//        System.out.println();
+//
+//        System.out.println(JsonUtil.toJsonString(result.getUnknownFields()));
+//
+//        List<ChengTaiDownloadAddressResult.QueryResult> queryResults = result.getQueryResults();
+//
+//        for (ChengTaiDownloadAddressResult.QueryResult item : queryResults) {
+//            System.out.println(item.getDownLoadURL());
+//        }
+//    }
+//}

File diff suppressed because it is too large
+ 0 - 33
tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TaiKangHttpClientTest.java


+ 2 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/build/ZhongAnCrawlerQuoteResultsVoBuild.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.zhongan.crawler.build;
 
 import cn.hutool.core.date.DateUtil;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
@@ -33,6 +34,7 @@ public class ZhongAnCrawlerQuoteResultsVoBuild {
 
         // 交强保费 车船税 商业保费
         buildPremium(quoteResultsVo, dataDTO);
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return quoteResultsVo;
     }
 

+ 101 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerCacheComponent.java

@@ -0,0 +1,101 @@
+package com.jzg.quotation.zhongan.crawler.component;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerPaymentResponse;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
+import org.redisson.api.RBucket;
+import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class ZhongAnCrawlerCacheComponent {
+
+    private final RedissonClient redissonClient;
+
+    /**
+     * 众安财险授权cookie
+     */
+    public static final String COOKIE = "cookie:";
+    public static final String ZHONGAN_COOKIE = "zhoangan:cookie:";
+    /**
+     * 众安财险登录后Id
+     */
+    public static final String FLOWID = "flowId:";
+
+    public static final String ORDER_NO = "orderNo:";
+
+    public static final String POLICY_ID = "policyId:";
+
+    public static final String INITDATE = "initdata:";
+
+    public static final String IDENTIFY_NUMBER = "identifyNumber:";
+
+    public static final String QUOTE_ID = "quoteId:";
+
+    public static final String PAYMENT = "payment:";
+
+
+    public void cacheCookie(String zaLoginCookieKey, String flowId, String userName) {
+        Map<String, String> authorizationMap = new HashMap<>();
+
+        authorizationMap.put(COOKIE, zaLoginCookieKey);
+        authorizationMap.put(FLOWID, flowId);
+        RMap<Object, Object> map = redissonClient.getMap(ZHONGAN_COOKIE + userName);
+        map.putAll(authorizationMap);
+        map.expire(Duration.ofHours(1L));
+    }
+
+    public String getCookie(String username) {
+        return (String) redissonClient.getMap(ZHONGAN_COOKIE + username).get(COOKIE);
+    }
+
+    public String getFlowId(String username) {
+        return (String) redissonClient.getMap(ZHONGAN_COOKIE + username).get(FLOWID);
+    }
+
+    /**
+     * 缓存数据
+     *
+     * @param cacheInfo
+     */
+    public void setCache(String cacheInfo, String str) {
+        String response = JSONObject.toJSONString(cacheInfo);
+        RBucket<String> bucket = redissonClient.getBucket(str);
+        bucket.set(response, Duration.ofHours(3L));
+    }
+
+
+    public String getCache(String sign) {
+        RBucket<String> bucket1 = redissonClient.getBucket(sign);
+        return bucket1.get();
+    }
+
+    public void setCache(Object cacheInfo, String str) {
+        String response = JSONObject.toJSONString(cacheInfo);
+        RBucket<String> bucket = redissonClient.getBucket(str);
+        bucket.set(response, Duration.ofHours(3L));
+    }
+
+    public ZhongAnCrawlerUploadInitDateResponse.ValueDTO.DatasDTO getInitData(String ordersNo) {
+        RBucket<String> bucket1 = redissonClient.getBucket(ordersNo);
+        return JSON.parseObject(bucket1.get(), ZhongAnCrawlerUploadInitDateResponse.ValueDTO.DatasDTO.class);
+    }
+
+    public ZhongAnCrawlerPaymentResponse.ValueDTO.DatasDTO.InitInfoDTO getPayment(String ordersNo) {
+        RBucket<String> bucket1 = redissonClient.getBucket(ordersNo);
+        return JSON.parseObject(bucket1.get(), ZhongAnCrawlerPaymentResponse.ValueDTO.DatasDTO.InitInfoDTO.class);
+    }
+
+
+}

+ 101 - 25
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java

@@ -1,18 +1,28 @@
 package com.jzg.quotation.zhongan.crawler.component;
 
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.constant.CacheConstant;
+import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.constant.enums.RequestUrl;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import com.jzg.quotation.zhongan.crawler.entity.request.*;
 import com.jzg.quotation.zhongan.crawler.entity.response.*;
 import com.jzg.quotation.zhongan.crawler.properties.ZhongAnCrawlerProperties;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
+import org.springframework.util.MultiValueMap;
+import reactor.core.publisher.Mono;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -31,8 +41,14 @@ public class ZhongAnCrawlerRequestComponent {
 
     private final ZhongAnCrawlerProperties zhongAnCrawlerProperties;
 
+    private final ZhongAnCrawlerCacheComponent zhongAnCrawlerCacheComponent;
+
+    @Value("${zhongAn.id}")
+    private String zhongAnId;
+
     /**
      * 登录
+     *
      * @return
      */
     public List<String> authenticate() {
@@ -41,124 +57,184 @@ public class ZhongAnCrawlerRequestComponent {
 
     /**
      * 获取cookie
+     *
      * @param username
      * @return
      */
-    public List<String> getCookie(String username) {
-        return (List<String>) redissonClient.getMap(CacheConstant.HUATAI_AUTHORIZATION + username).get(ZhongAnRequestConstant.COOKIE);
+    public String getCookie(String username) {
+        return (String) redissonClient.getMap(zhongAnCrawlerCacheComponent.ZHONGAN_COOKIE + username).get(zhongAnCrawlerCacheComponent.COOKIE);
     }
 
     /**
      * 获取请求头
+     *
      * @return
      */
     public HttpHeaders getHeaders(String username) {
-        List<String> cookie = getCookie(username);
+        String cookie = getCookie(username);
         if (cookie == null || cookie.isEmpty()) {
-            cookie = authenticate();
+            throw new SystemException("缓存中未获取到cookie!");
         }
         HttpHeaders headers = new HttpHeaders();
-        headers.add(ZhongAnRequestConstant.COOKIE, cookie.stream().collect(Collectors.joining(";")));
+        headers.add(ZhongAnRequestConstant.COOKIE, "zaLoginCookieKey="+cookie+"; zaAccountCookieKey=8e7a6cc77ad38097");
+        headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36");
+        headers.add("Accept", "application/json, text/plain, */*");
+//        headers.add("Content-Type", "application/json");
         return headers;
     }
 
     /**
      * 车辆查询
+     *
      * @param carQueryRequest
      * @param headers
      * @return
      */
     public List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> carQuery(ZhongAnCrawlerCarQueryRequest carQueryRequest, HttpHeaders headers) {
-        List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> vehicleDTOList = null;
-        Integer start = 0;
-        Integer pageTotal = 0;
-        do {
-            ZhongAnCrawlerCarQueryResponse carQueryResponse = requestComponent.objectPost(RequestUrl.CAR_QUERY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), carQueryRequest, ZhongAnCrawlerCarQueryResponse.class, headers).getBody();
-            List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> vehicleList = carQueryResponse.getValue().getDatas().getResult().getVehicleList();
-            vehicleDTOList.addAll(vehicleList);
-            pageTotal = carQueryResponse.getValue().getDatas().getResult().getPageTotal();
-            start = carQueryRequest.getStart();
-            start = start + 12;
-        } while (start < pageTotal);
+
+        List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> vehicleDTOList = new ArrayList<>();
+
+        ZhongAnCrawlerCarQueryResponse carQueryResponse = requestComponent.formData(RequestUrl.CAR_QUERY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), carQueryRequest, ZhongAnCrawlerCarQueryResponse.class, headers).getBody();
+        List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> vehicleList = carQueryResponse.getValue().getDatas().getResult().getVehicleList();
+        vehicleDTOList.addAll(vehicleList);
+
         return vehicleDTOList;
     }
 
     /**
      * 报价
+     *
      * @param quoteRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerQuoteResponse quote(ZhongAnCrawlerQuoteRequest quoteRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.QUOTE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), quoteRequest, ZhongAnCrawlerQuoteResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.QUOTE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), quoteRequest, ZhongAnCrawlerQuoteResponse.class, headers).getBody();
     }
 
     /**
      * 确认报价
+     *
      * @param confirmQuoteRequest
      * @param headers
      */
-    public void confirmQuote(ZhongAnCrawlerConfirmQuoteRequest confirmQuoteRequest, HttpHeaders headers) {
-        requestComponent.objectPost(RequestUrl.CONFIRM_QUOTE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), confirmQuoteRequest, ZhongAnCrawlerQuoteResponse.class, headers );
+    public String confirmQuote(ZhongAnCrawlerConfirmQuoteRequest confirmQuoteRequest, HttpHeaders headers) {
+       return requestComponent.formDataString(RequestUrl.CONFIRM_QUOTE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), confirmQuoteRequest, headers);
     }
 
     /**
      * 获取订单信息
+     *
      * @param getOrderRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerGetOrderResponse getOrder(ZhongAnCrawlerGetOrderRequest getOrderRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.GET_ORDER.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), getOrderRequest, ZhongAnCrawlerGetOrderResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.GET_ORDER.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), getOrderRequest, ZhongAnCrawlerGetOrderResponse.class, headers).getBody();
     }
 
     /**
      * 确认订单
+     *
      * @param confirmOrderRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerConfirmOrderResponse confirmOrder(ZhongAnCrawlerConfirmOrderRequest confirmOrderRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.CONFIRM_ORDER.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), confirmOrderRequest, ZhongAnCrawlerConfirmOrderResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.CONFIRM_ORDER.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), confirmOrderRequest, ZhongAnCrawlerConfirmOrderResponse.class, headers).getBody();
     }
 
     /**
      * 非车险提交核保
+     *
      * @param jyxUnderwritingRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerJyxUnderwritingResponse jyxUnderwriting(ZhongAnCrawlerJyxUnderwritingRequest jyxUnderwritingRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.JYX_UNDERWRITING.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), jyxUnderwritingRequest, ZhongAnCrawlerJyxUnderwritingResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.JYX_UNDERWRITING.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), jyxUnderwritingRequest, ZhongAnCrawlerJyxUnderwritingResponse.class, headers).getBody();
     }
 
     /**
      * 上传影像
+     *
      * @param imageRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerUploadImageResponse uploadImage(ZhongAnCrawlerUploadImageRequest imageRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.UPLOAD_IMAGE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), imageRequest, ZhongAnCrawlerUploadImageResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.UPLOAD_IMAGE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), imageRequest, ZhongAnCrawlerUploadImageResponse.class, headers).getBody();
     }
 
     /**
      * 获取支付链接
+     *
      * @param paymentRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerPaymentResponse payment(ZhongAnCrawlerPaymentRequest paymentRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.PAYMENT_LINK.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), paymentRequest, ZhongAnCrawlerPaymentResponse.class, headers ).getBody();
+        return requestComponent.formData(RequestUrl.PAYMENT_LINK.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), paymentRequest, ZhongAnCrawlerPaymentResponse.class, headers).getBody();
     }
 
     /**
      * 获取保单下载参数
+     *
      * @param downloadPolicyRequest
      * @param headers
      * @return
      */
     public ZhongAnCrawlerDownloadPolicyResponse downloadPolicy(ZhongAnCrawlerDownloadPolicyRequest downloadPolicyRequest, HttpHeaders headers) {
-        return requestComponent.objectPost(RequestUrl.DOWNLOAD_POLICY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), downloadPolicyRequest, ZhongAnCrawlerDownloadPolicyResponse.class, headers ).getBody();
+        return requestComponent.objectPost(RequestUrl.DOWNLOAD_POLICY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), downloadPolicyRequest, ZhongAnCrawlerDownloadPolicyResponse.class, headers).getBody();
+    }
+
+    public ZhongAnCrawlerCacheCarQueryResponse cacheCarInfo(ZhongAnCrawlerCacheCarQueryRequest cacheCarQueryRequest, HttpHeaders headers) {
+       return requestComponent.formData(RequestUrl.CACHE_CAR_QUERY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), cacheCarQueryRequest,ZhongAnCrawlerCacheCarQueryResponse.class, headers).getBody();
+
+    }
+
+    public ZhongAnCrawlerQuoteBaseResponse quoteBaseInfo(ZhongAnCrawlerQuoteBaseRequest parameters, HttpHeaders headers) {
+        return requestComponent.formData(RequestUrl.QUOTE_BASE_QUERY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), parameters,ZhongAnCrawlerQuoteBaseResponse.class, headers).getBody();
+
+    }
+
+    public String CacheInput(ZhongAnCrawlerCacheInputRequest cacheInputRequest, HttpHeaders headers) {
+        return requestComponent.formDataString(RequestUrl.CACHE_INPUT_KEY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), cacheInputRequest, headers);
+    }
+
+    public String carVinQuery(ZhongAnCrawlerCarVinRequest carVinRequest, HttpHeaders headers) {
+        return requestComponent.formDataString(RequestUrl.CAR_VIN_KEY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), carVinRequest, headers);
+
+    }
+
+    public String querySpecial(ZhongAnCrawlerQuerySpecialRequest querySpecialRequest, HttpHeaders headers) {
+        return requestComponent.formDataString(RequestUrl.QUERY_SPECIAL.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), querySpecialRequest, headers);
+
+    }
+
+    public String licenseSwitch(ZhongAnCrawlerLicenseSwitchRequest licenseSwitchRequest, HttpHeaders headers) {
+        return requestComponent.formDataString(RequestUrl.LICENCE_SEITCH.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), licenseSwitchRequest, headers);
+
+    }
+
+    public String initDataInfo(ZhongAnCrawlerInitDataRequest initDataRequest, HttpHeaders headers) {
+        return requestComponent.baseGetString(RequestUrl.INIT_DATA_KEY.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()),initDataRequest,headers);
+    }
+
+    public ZhongAnCrawlerQueryDetailQueryResponse detailQuery(ZhongAnCrawlerQueryDetailQueryRequest detailQueryRequest, HttpHeaders headers) {
+        return requestComponent.formData(RequestUrl.QUERY_DETAIL.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), detailQueryRequest,ZhongAnCrawlerQueryDetailQueryResponse.class, headers).getBody();
+    }
+
+    public ZhongAnCrawlerUploadInitDateResponse uploadInitDate(ZhongAnCrawlerUploadInitDateRequest uploadInitDateRequest, HttpHeaders headers) {
+        return requestComponent.formData(RequestUrl.UPLOAD_INIT_DATA.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), uploadInitDateRequest,ZhongAnCrawlerUploadInitDateResponse.class, headers).getBody();
+    }
+
+    public String markCompleted(ZhongAnCrawlerMarkRequest markRequest, HttpHeaders headers) {
+        return requestComponent.formDataString(RequestUrl.LICENCE_SEITCH.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), markRequest, headers);
+    }
+
+    public String policyList(ZhongAnCrawlerPolicyListRequest policyListRequest, HttpHeaders headers) {
+
+        return requestComponent.formDataString(RequestUrl.ORDER_LIST.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), policyListRequest, headers);
     }
 }

+ 10 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/constant/ZhongAnRequestConstant.java

@@ -13,13 +13,20 @@ public class ZhongAnRequestConstant {
     /**
      * 车型查询page参数
      */
-    public static final String CAR_QUERY_PAGE = "/vehicleModel/index";
+    public static final String CAR_QUERY_PAGE = "%2FbaseInfo";
+    public static final String CAR_vehicle_PAGE = "%2FvehicleModel%2Fvehicles";
 
+    /**
+     * 校验key %2FinsureEntry
+     */
+    public static final String CACHE_KEY_PAGE = "%2FinsureEntry";
     /**
      * 报价page参数
      */
     public static final String QUOTE_PAGE = "/insureProgram";
 
+    public static final String INIT_DATA = "/uploadFiles";
+
     /**
      * 订单相关page参数
      */
@@ -30,6 +37,8 @@ public class ZhongAnRequestConstant {
      */
     public static final String UPLOAD_IMAGE_PAGE = "%2FuploadInfo";
 
+    public static final String POLICY_LIST = "%2Forder%2FmyOrders";
+
     /**
      * 保单下载地址
      */

+ 27 - 5
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/constant/enums/RequestUrl.java

@@ -12,24 +12,46 @@ import lombok.Getter;
 @AllArgsConstructor
 @Getter
 public enum RequestUrl implements CrawlerRequestUrlStandard {
+
+    CACHE_INPUT_KEY("/open/bmw/index_controller/cache_input_query.json","校验key缓存"),
+
+    INIT_DATA_KEY("/open/common/init_data_controller/init_data.json","初始化"),
+
+    CAR_VIN_KEY("/open/bmw/car_controller/query_car_info.json","车架查询"),
+
     CAR_QUERY("/open/bmw/car_controller/query_vehicle_model.json", "车型查询"),
+    QUERY_SPECIAL("/open/common/special_flag_controller/query_special_flag.json", "query_special_flag"),
+
+    LICENCE_SEITCH("/open/bmw/index_controller/get_license_switch.json", "get_license_switch"),
+
+    CACHE_CAR_QUERY("/open/bmw/car_controller/cache_car_info.json", "缓存车辆信息"),
+
+    QUERY_DETAIL("/open/bmw/car_controller/query_detail_vehicle_model.json", "缓存车辆信息不正确时,调用"),
+
+
+
+    QUOTE_BASE_QUERY("/open/bmw/n/quote_controller/query_quote_base_info.json", "报价前准备接口"),
 
     QUOTE("/open/bmw/n/quote_controller/premium_trial.json", "报价"),
     CONFIRM_QUOTE("/open/bmw/quote_controller/confirm_quote_plan.json", "确认报价"),
     GET_ORDER("/open/bmw/policy_controller/get_order_info.json", "获取订单信息"),
-    CONFIRM_ORDER("https://c.zhongan.com/open/bmw/policy_controller/confirm_order.json", "确认订单"),
-    JYX_UNDERWRITING("https://c.zhongan.com/open/jyx/jyx_insure_controller/jyx_underwriting.json", "非车险提交核保"),
+    CONFIRM_ORDER("/open/bmw/policy_controller/confirm_order.json", "确认订单"),
+    JYX_UNDERWRITING("/open/jyx/jyx_insure_controller/jyx_underwriting.json", "非车险提交核保"),
+
+    UPLOAD_INIT_DATA("/open/distribution/distribute_controller/get_upload_init_data.json", "上传初始化数据"),
+
+    UPLOAD_IMAGE("/open/distribution/distribute_controller/upload_user_confirm_data.json", "正常流程上传影像"),
 
-    UPLOAD_IMAGE("https://c.zhongan.com/open/distribution/distribute_controller/upload_user_confirm_data.json", "正常流程上传影像"),
+    MARK_COMPLETED("/open/distribution/distribute_controller/mark_upload_completed.json", "核保"),
     /**
      * 通融申请的影像上传还需补充
      */
 
     PAYMENT_LINK("/open/newProcess/new_process_controller/qr_page_init_info.json", "获取支付链接"),
 
-    DOWNLOAD_POLICY("/open/bmw/n/query_controller/queryDocumentInfo.json", "获取保单下载路径"),
+    ORDER_LIST("/open/bmw/query_controller/query_policy_list.json", "订单列表"),
 
-    ;
+    DOWNLOAD_POLICY("/open/bmw/n/query_controller/queryDocumentInfo.json", "获取保单下载路径");
 
 
     private final String uri;

+ 1 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/ZhongAnCrawlerConfigureParameters.java

@@ -20,5 +20,5 @@ public class ZhongAnCrawlerConfigureParameters implements ConfigureParameters {
      */
     private String flowId;
 
-    private String flag;
+    private String flag = "0";
 }

+ 26 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/dto/NonAutoInfoDto.java

@@ -0,0 +1,26 @@
+package com.jzg.quotation.zhongan.crawler.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NonAutoInfoDto {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+    @JsonProperty("productCode")
+    private String productCode;
+
+    @JsonProperty("insuredFlag")
+    private String insuredFlag;
+
+    @JsonProperty("combination")
+    private String combination;
+
+}

+ 8 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerBaseRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serial;
@@ -14,9 +15,15 @@ import java.io.Serializable;
 public class ZhongAnCrawlerBaseRequest implements Serializable {
     @Serial
     private static final long serialVersionUID = 4225445134500846763L;
-
+    @JsonProperty("flowId")
     private String flowId;
+
+    @JsonProperty("page")
     private String page;
+
+    @JsonProperty("flag")
     private String flag;
+
+    @JsonProperty("i")
     private String i;
 }

+ 450 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCacheCarQueryRequest.java

@@ -0,0 +1,450 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerCarQueryResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerCacheCarQueryRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+
+    public ZhongAnCrawlerCacheCarQueryRequest(QuoteVo quoteVo, ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO vehicleDTO, ZhongAnCrawlerConfigureParameters parameters){
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        //组装缓存车辆信息
+        this.insurePlaceCode = ownersInfo.getCityCode();
+        this.insurePlace = ownersInfo.getCity();
+        this.thirdOrgCode = "";
+        this.vehicleLicencePlateNo = carInfoVo.getLicenseNo();
+        this.vehicleFrameNo = carInfoVo.getVinNo();
+        this.vehicleEngineNo = carInfoVo.getEngineNo();
+        this.vehicleRegisterDate = carInfoVo.getRegisterDate();
+        this.vehicleClass = "carSwitch";
+        this.vehicleTypeSubclass = " ";
+        this.vehicleOwnerName = ownersInfo.getName();
+        this.identifyType = "I";
+        this.identifyNo = ownersInfo.getIdentifyNumber();
+        this.saleCompanyName = "";
+        this.sale4SFlag = "";
+        this.saleCompanyAreaCode = "";
+        this.phone = "";
+        this.applicantName = "";
+        this.applicantPhone = "";
+        this.applicantCertificateNo = "";
+        this.modelName = vehicleDTO.getBrandName();
+        this.brandCode = vehicleDTO.getBrandCode();
+        this.vehicleName = vehicleDTO.getVehicleName();
+        this.vehicleBrand = vehicleDTO.getBrandName();
+
+        this.vehicleModelName = vehicleDTO.getBrandName();
+        this.vehicleModelCode = vehicleDTO.getVehicleCode();
+        this.modelsJy = vehicleDTO.getVehicleCode();
+        this.vehicleCap = carInfoVo.getLimitLoad();
+        this.curbWeight = vehicleDTO.getFullWeight();
+        this.exhaustMeasure = vehicleDTO.getDisplacement();
+        this.power = vehicleDTO.getPower();
+        this.creator = vehicleDTO.getCompanyName();
+        this.vehicleAcquisitionPrice = vehicleDTO.getPurchasePrice();
+        this.vehiclePassengerCap = vehicleDTO.getSeat();
+        this.gearBoxType = vehicleDTO.getGearBoxType();
+        this.configName = vehicleDTO.getConfigName();
+        this.taxType = vehicleDTO.getHfCode();
+        this.syxClassid = vehicleDTO.getSyxClassid();
+        this.vehicleType = "2";
+        this.modelEnergyType = "0";
+        this.fuelType = "D1";
+        this.desVehicleOwnerName = "";
+        this.applicantType = "PERSONAL";
+        this.applicantUseAttribute = "03";
+        this.useAttribute = "NONBUSINESS";
+        this.subOwnershipAttribute = "";
+        this.ownershipAttribute = "PER";
+        this.vehicleLicenceType = "";
+        this.callVehicleModelLibraryFlag = 1;
+
+        this.vehicleModelDesc = vehicleName + " " + gearBoxType + " " + configName + " " + vehiclePassengerCap + "座" + "(" + vehicleAcquisitionPrice + "元)";
+    }
+
+    /**
+     * 参保地编码
+     * 例如:140700 对应晋中市
+     */
+    @JsonProperty("insurePlaceCode")
+    private String insurePlaceCode;
+
+    /**
+     * 参保地名称
+     * 例如:晋中市
+     */
+    @JsonProperty("insurePlace")
+    private String insurePlace;
+
+    /**
+     * 第三方机构代码
+     * 为空表示未填写
+     */
+    @JsonProperty("thirdOrgCode")
+    private String thirdOrgCode;
+
+    /**
+     * 机动车车牌号
+     * 例如:晋AP169K
+     */
+    @JsonProperty("vehicleLicencePlateNo")
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 车辆车架号
+     * 车辆唯一标识,例如:LSGZG5355GS023672
+     */
+    @JsonProperty("vehicleFrameNo")
+    private String vehicleFrameNo;
+
+    /**
+     * 发动机号
+     * 例如:152243036
+     */
+    @JsonProperty("vehicleEngineNo")
+    private String vehicleEngineNo;
+
+    /**
+     * 车辆注册日期
+     * 格式:yyyy-MM-dd,例如:2016-09-05
+     */
+    @JsonProperty("vehicleRegisterDate")
+    private String vehicleRegisterDate;
+
+    /**
+     * 车辆类别
+     * 例如:carSwitch表示轿车类
+     */
+    @JsonProperty("vehicleClass")
+    private String vehicleClass;
+
+    /**
+     * 车辆类型子类
+     * 为空表示未填写
+     */
+    @JsonProperty("vehicleTypeSubclass")
+    private String vehicleTypeSubclass;
+
+    /**
+     * 交强险车辆类型
+     * 为空表示未填写
+     */
+    @JsonProperty("paVehicleType")
+    private String paVehicleType;
+
+    /**
+     * 车辆所有人姓名
+     * 例如:王卫星
+     */
+    @JsonProperty("vehicleOwnerName")
+    private String vehicleOwnerName;
+
+    /**
+     * 证件类型
+     * 例如:I表示身份证
+     */
+    @JsonProperty("identifyType")
+    private String identifyType;
+
+    /**
+     * 证件号码
+     * 例如:身份证号131127198510103870
+     */
+    @JsonProperty("identifyNo")
+    private String identifyNo;
+
+    /**
+     * 销售公司名称
+     * 为空表示未填写
+     */
+    @JsonProperty("saleCompanyName")
+    private String saleCompanyName;
+
+    /**
+     * 是否4S店销售标识
+     * 为空表示未填写
+     */
+    @JsonProperty("sale4SFlag")
+    private String sale4SFlag;
+
+    /**
+     * 销售公司区域代码
+     * 为空表示未填写
+     */
+    @JsonProperty("saleCompanyAreaCode")
+    private String saleCompanyAreaCode;
+
+    /**
+     * 联系电话
+     * 为空表示未填写
+     */
+    @JsonProperty("phone")
+    private String phone;
+
+    /**
+     * 申请人姓名
+     * 为空表示未填写
+     */
+    @JsonProperty("applicantName")
+    private String applicantName;
+
+    /**
+     * 申请人电话
+     * 为空表示未填写
+     */
+    @JsonProperty("applicantPhone")
+    private String applicantPhone;
+
+    /**
+     * 申请人证件号
+     * 为空表示未填写
+     */
+    @JsonProperty("applicantCertificateNo")
+    private String applicantCertificateNo;
+
+    /**
+     * 车型名称
+     * 例如:上汽通用雪佛兰
+     */
+    @JsonProperty("modelName")
+    private String modelName;
+
+    /**
+     * 品牌代码
+     * 例如:XFA1
+     */
+    @JsonProperty("brandCode")
+    private String brandCode;
+
+    /**
+     * 车辆名称
+     * 例如:雪佛兰SGM7156EAA2轿车
+     */
+    @JsonProperty("vehicleName")
+    private String vehicleName;
+
+    /**
+     * 车辆品牌
+     * 例如:上汽通用雪佛兰
+     */
+    @JsonProperty("vehicleBrand")
+    private String vehicleBrand;
+
+    /**
+     * 车辆型号详细描述
+     * 包含配置、年份等信息
+     */
+    @JsonProperty("vehicleModelDesc")
+    private String vehicleModelDesc;
+
+    /**
+     * 车辆型号名称
+     * 例如:上汽通用雪佛兰
+     */
+    @JsonProperty("vehicleModelName")
+    private String vehicleModelName;
+
+    /**
+     * 车辆型号代码
+     * 例如:XFABFD0032
+     */
+    @JsonProperty("vehicleModelCode")
+    private String vehicleModelCode;
+
+    /**
+     * 车型交易代码
+     * 例如:XFABFD0032
+     */
+    @JsonProperty("modelsJy")
+    private String modelsJy;
+
+    /**
+     * 车辆排量
+     * 为空表示未填写
+     */
+    @JsonProperty("vehicleCap")
+    private String vehicleCap;
+
+    /**
+     * 车辆整备质量
+     * 单位:kg,例如:1430
+     */
+    @JsonProperty("curbWeight")
+    private String curbWeight;
+
+    /**
+     * 排气量
+     * 单位:L,例如:1.49
+     */
+    @JsonProperty("exhaustMeasure")
+    private Double exhaustMeasure;
+
+    /**
+     * 发动机功率
+     * 单位:马力,例如:125
+     */
+    @JsonProperty("power")
+    private String power;
+
+    /**
+     * 车辆制造商
+     * 例如:上汽通用汽车有限公司
+     */
+    @JsonProperty("creator")
+    private String creator;
+
+    /**
+     * 车辆购置价格
+     * 单位:元,例如:204900
+     */
+    @JsonProperty("vehicleAcquisitionPrice")
+    private String vehicleAcquisitionPrice;
+
+    /**
+     * 车辆核定载客人数
+     * 例如:5座
+     */
+    @JsonProperty("vehiclePassengerCap")
+    private String vehiclePassengerCap;
+
+    /**
+     * 变速箱类型
+     * 例如:双离合变速器
+     */
+    @JsonProperty("gearBoxType")
+    private String gearBoxType;
+
+    /**
+     * 配置名称
+     * 例如:2016款 锐耀版
+     */
+    @JsonProperty("configName")
+    private String configName;
+
+    /**
+     * 税收类型
+     * 例如:0表示默认类型
+     */
+    @JsonProperty("taxType")
+    private String taxType;
+
+    /**
+     * 商业险类别ID
+     * 例如:KA
+     */
+    @JsonProperty("syxClassid")
+    private String syxClassid;
+
+    /**
+     * 车辆类型
+     * 例如:2表示小型客车
+     */
+    @JsonProperty("vehicleType")
+    private String vehicleType;
+
+    /**
+     * 能源类型
+     * 例如:0表示传统燃油
+     */
+    @JsonProperty("modelEnergyType")
+    private String modelEnergyType;
+
+    /**
+     * 燃油类型
+     * 例如:D1表示汽油
+     */
+    @JsonProperty("fuelType")
+    private String fuelType;
+
+    /**
+     * 指定车辆所有人姓名
+     * 为空表示未填写
+     */
+    @JsonProperty("desVehicleOwnerName")
+    private String desVehicleOwnerName;
+
+    /**
+     * 申请人类型
+     * 例如:PERSONAL表示个人
+     */
+    @JsonProperty("applicantType")
+    private String applicantType;
+
+    /**
+     * 申请人使用属性
+     * 例如:03表示非营运
+     */
+    @JsonProperty("applicantUseAttribute")
+    private String applicantUseAttribute;
+
+    /**
+     * 使用性质
+     * 例如:NONBUSINESS表示非营业
+     */
+    @JsonProperty("useAttribute")
+    private String useAttribute;
+
+    /**
+     * 子所有权属性
+     * 为空表示未填写
+     */
+    @JsonProperty("subOwnershipAttribute")
+    private String subOwnershipAttribute;
+
+    /**
+     * 所有权属性
+     * 例如:PER表示个人所有
+     */
+    @JsonProperty("ownershipAttribute")
+    private String ownershipAttribute;
+
+    /**
+     * 车辆牌照类型
+     * 为空表示未填写
+     */
+    @JsonProperty("vehicleLicenceType")
+    private String vehicleLicenceType;
+
+    /**
+     * 调用车辆模型库标识
+     * 例如:0表示未调用
+     */
+    @JsonProperty("callVehicleModelLibraryFlag")
+    private Integer callVehicleModelLibraryFlag;
+
+
+
+
+}

+ 84 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCacheInputRequest.java

@@ -0,0 +1,84 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Optional;
+
+@Data
+public class ZhongAnCrawlerCacheInputRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    /**
+     * "insurePlace": self.city_name,
+     * "insurePlaceCode": self.city_code,
+     * "thirdOrgCode": "",
+     * "licenseNo": self.licenseNo,
+     * "branchCode": "",
+     *
+     * "isOpenRenewalFlag": "0",
+     * "flowId": self.flowId,
+     * "page": "%2FinsureEntry",
+     * "i": "e",
+     * "flag": "0"
+     */
+    @JsonProperty("insurePlace")
+    private String insurePlace;
+
+    @JsonProperty("insurePlaceCode")
+    private String insurePlaceCode;
+
+    @JsonProperty("thirdOrgCode")
+    private String thirdOrgCode;
+
+    @JsonProperty("licenseNo")
+    private String licenseNo;
+
+    @JsonProperty("branchCode")
+    private String branchCode;
+
+    @JsonProperty("vehicleFrameNo")
+    private String vehicleFrameNo;
+
+    @JsonProperty("isOpenRenewalFlag")
+    private String isOpenRenewalFlag;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    public ZhongAnCrawlerCacheInputRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters){
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CACHE_KEY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setIsOpenRenewalFlag("0");
+        this.setThirdOrgCode("");
+        this.setBranchCode("");
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        this.insurePlaceCode =Optional.ofNullable(ownersInfo.getCityCode()).orElse("140100") ;
+        this.insurePlace = Optional.ofNullable(ownersInfo.getCity()).orElse("太原市");
+        this.licenseNo = carInfoVo.getLicenseNo();
+        this.vehicleFrameNo = carInfoVo.getVinNo();
+
+    }
+
+
+}

+ 22 - 3
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCarQueryRequest.java

@@ -1,5 +1,7 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
@@ -18,7 +20,7 @@ public class ZhongAnCrawlerCarQueryRequest extends ZhongAnCrawlerBaseRequest {
 
     public ZhongAnCrawlerCarQueryRequest(String vehicleBrand, ZhongAnCrawlerConfigureParameters parameters) {
         super.setFlowId(parameters.getFlowId());
-        super.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        super.setPage(ZhongAnRequestConstant.CAR_vehicle_PAGE);
         super.setFlag(parameters.getFlag());
         super.setI(ZhongAnRequestConstant.I_PARAM);
         this.vehicleBrand = vehicleBrand;
@@ -28,14 +30,31 @@ public class ZhongAnCrawlerCarQueryRequest extends ZhongAnCrawlerBaseRequest {
     /**
      * 品牌型号
      */
+    @JsonProperty("vehicleBrand")
     private String vehicleBrand;
+    @JsonProperty("brandName")
     private String brandName;
+    @JsonProperty("familyName")
     private String familyName;
+    @JsonProperty("familyCode")
     private String familyCode;
+    @JsonProperty("engine")
     private String engine;
+    @JsonProperty("start")
     private Integer start = 0;
-    private Integer limit = 12;
-    private String callVehicleModelLibraryFlag = "0";
+    @JsonProperty("limit")
+    private Integer limit = 30;
+    @JsonProperty("callVehicleModelLibraryFlag")
+    private String callVehicleModelLibraryFlag = "1";
+
+//    @JsonProperty("vehicleFrameNo")
+//    private String vehicleFrameNo;
+//
+//    @JsonProperty("passCheck")
+//    private String passCheck;
+
+
+
 
     /**
      * flowId				FJ14358876876b6b9550a

+ 44 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerCarVinRequest.java

@@ -0,0 +1,44 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerCarVinRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("vehicleFrameNo")
+    private String vehicleFrameNo;
+
+    @JsonProperty("passCheck")
+    private String passCheck;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    public ZhongAnCrawlerCarVinRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setVehicleFrameNo(quoteVo.getCarInfoVo().getVinNo());
+
+    }
+
+}

+ 98 - 21
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerConfirmOrderRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -8,6 +9,7 @@ import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameter
 import lombok.Data;
 
 import java.io.Serial;
+import java.util.Optional;
 
 /**
  * @description: 众安保险 确认订单 请求参数
@@ -15,15 +17,27 @@ import java.io.Serial;
  * @date: 2025/5/13 11:36
  **/
 @Data
-public class ZhongAnCrawlerConfirmOrderRequest extends ZhongAnCrawlerBaseRequest {
+public class ZhongAnCrawlerConfirmOrderRequest{
     @Serial
     private static final long serialVersionUID = -1296055575580182977L;
 
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
     public ZhongAnCrawlerConfirmOrderRequest(ZhongAnCrawlerConfigureParameters parameters, QuoteVo quoteVo) {
-        super.setFlowId(parameters.getFlowId());
-        super.setPage(ZhongAnRequestConstant.ORDER_PAGE);
-        super.setFlag(parameters.getFlag());
-        super.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.ORDER_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
 
         RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
         if (biRiskInfoVo != null && biRiskInfoVo.getStartDate() != null) {
@@ -37,105 +51,168 @@ public class ZhongAnCrawlerConfirmOrderRequest extends ZhongAnCrawlerBaseRequest
         } else {
             this.compelElectronicPolicy = "0";
         }
+        this.setDesOwnerMobile("");
         //车主信息
         CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
         this.ownerName = ownersInfo.getName();
         this.ownerMobile = ownersInfo.getMobile();
         this.ownerCertificateNo = ownersInfo.getIdentifyNumber();
-        this.ownerSex = ownersInfo.getGender();
+        this.ownerSex = (ownersInfo.getGender().equals("1")?"M":"W");
         this.ownerBirth = ownersInfo.getBirthday();
-        this.ownerEmail = ownersInfo.getEmail();
+        this.ownerEmail = Optional.ofNullable(ownersInfo.getEmail()).orElse("123456@qq.com");
         this.ownerProvinceCode = ownersInfo.getProvinceCode();
         this.ownerCityCode = ownersInfo.getCityCode();
         this.ownerAreaCode = ownersInfo.getCountyCode();
         this.ownerDetailAddress = ownersInfo.getAddr();
-        this.ownerCertificateType = ownersInfo.getDocumentsTypeCode();
+        this.ownerCertificateType = ownersInfo.getDocumentsTypeCode().equals("01") ? "I":"U";
+        this.ownerStreetCode="";
         //投保人信息
         CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
-        this.applicantCertificateType = policyHolderInfo.getDocumentsTypeCode();
+        this.applicantCertificateType = policyHolderInfo.getDocumentsTypeCode().equals("01") ? "I":"U";
         this.applicantName = policyHolderInfo.getName();
         this.applicantCertificateNo = policyHolderInfo.getIdentifyNumber();
         this.applicantMobile  = policyHolderInfo.getMobile();
-        this.applicantEmail = policyHolderInfo.getEmail();
+        this.applicantEmail = Optional.ofNullable(policyHolderInfo.getEmail()).orElse("123456@qq.com");
         this.applicantProvinceCode = policyHolderInfo.getProvinceCode();
         this.applicantCityCode = policyHolderInfo.getCityCode();
         this.applicantAreaCode = policyHolderInfo.getCountyCode();
         this.applicantDetailAddress = policyHolderInfo.getAddr();
-        this.applicantSex = policyHolderInfo.getGender();
+        this.applicantSex = policyHolderInfo.getGender().equals("1")?"M":"W";
         this.applicantBirth = policyHolderInfo.getBirthday();
         this.applicantCertiStartDate = policyHolderInfo.getIdentifyValidDate();
         this.applicantCertiEndDate = policyHolderInfo.getIdentifyValidEndDate();
         //被保人信息
         CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
-        this.insureCertificateType = insuredPersonInfo.getDocumentsTypeCode();
+        this.insureCertificateType = insuredPersonInfo.getDocumentsTypeCode().equals("01") ? "I":"U";
         this.insureName = insuredPersonInfo.getName();
         this.insureCertificateNo = insuredPersonInfo.getIdentifyNumber();
         this.insureMobile = insuredPersonInfo.getMobile();
-        this.insureEmail = insuredPersonInfo.getEmail();
+        this.insureEmail = Optional.ofNullable(insuredPersonInfo.getEmail()).orElse("123456@qq.com");
         this.insureProvinceCode = insuredPersonInfo.getProvinceCode();
         this.insureCityCode = insuredPersonInfo.getCityCode();
         this.insureAreaCode = insuredPersonInfo.getCountyCode();
         this.insureDetailAddress = insuredPersonInfo.getAddr();
-        this.insureSex = insuredPersonInfo.getGender();
+        this.insureSex = insuredPersonInfo.getGender().equals("1")?"M":"W";
         this.insureBirth = insuredPersonInfo.getBirthday();
-        this.insureType = insuredPersonInfo.getPersonType();
-        this.insuredIsOwner = String.valueOf(insuredPersonInfo.getCarOwner());
+        //客户类型
+        this.insureType = insuredPersonInfo.getProperty();
+        int carOwner = insuredPersonInfo.getCarOwner();
+        //是否为车主,平台页面未传
+        this.insuredIsOwner = String.valueOf(Optional.ofNullable(carOwner).orElse(1));
+
+        this.setPayStyle("individual");
+        this.quoteGreenWay = "0";
+        this.id="";
+        this.setSpecialPromiseReqJsonStr(new String[0]);
     }
 
+    @JsonProperty("desOwnerMobile")
     private String desOwnerMobile;
-    private String compelElectronicPolicy;
-    private String bizElectronicPolicy;
     //车主信息
+    @JsonProperty("ownerName")
     private String ownerName;
+    @JsonProperty("ownerMobile")
     private String ownerMobile;
+    @JsonProperty("ownerCertificateNo")
     private String ownerCertificateNo;
+    @JsonProperty("ownerSex")
     private String ownerSex;
+    @JsonProperty("ownerBirth")
     private String ownerBirth;
+    @JsonProperty("ownerEmail")
     private String ownerEmail;
+    @JsonProperty("compelElectronicPolicy")
+    private String compelElectronicPolicy;
+    @JsonProperty("bizElectronicPolicy")
+    private String bizElectronicPolicy;
+    @JsonProperty("ownerProvinceCode")
     private String ownerProvinceCode;
+    @JsonProperty("ownerCityCode")
     private String ownerCityCode;
+    @JsonProperty("ownerAreaCode")
     private String ownerAreaCode;
+
+    @JsonProperty("ownerStreetCode")
     private String ownerStreetCode;
+    @JsonProperty("ownerDetailAddress")
     private String ownerDetailAddress;
+    @JsonProperty("ownerCertificateType")
     private String ownerCertificateType;
     //投保人信息
+    @JsonProperty("applicantCertificateType")
     private String applicantCertificateType;
+    @JsonProperty("applicantName")
     private String applicantName;
+    @JsonProperty("applicantCertificateNo")
     private String applicantCertificateNo;
+    @JsonProperty("applicantMobile")
     private String applicantMobile;
+    @JsonProperty("applicantEmail")
     private String applicantEmail;
+    @JsonProperty("applicantProvinceCode")
     private String applicantProvinceCode;
+    @JsonProperty("applicantCityCode")
     private String applicantCityCode;
+    @JsonProperty("applicantAreaCode")
     private String applicantAreaCode;
+
+    @JsonProperty("applicantStreetCode")
     private String applicantStreetCode;
+    @JsonProperty("applicantDetailAddress")
     private String applicantDetailAddress;
+    @JsonProperty("applicantSex")
     private String applicantSex;
+    @JsonProperty("applicantBirth")
     private String applicantBirth;
+    @JsonProperty("applicantCertiStartDate")
     private String applicantCertiStartDate;
+    @JsonProperty("applicantCertiEndDate")
     private String applicantCertiEndDate;
 
     //被保人信息
+    @JsonProperty("insureCertificateType")
     private String insureCertificateType;
+    @JsonProperty("insureName")
     private String insureName;
+    @JsonProperty("insureCertificateNo")
     private String insureCertificateNo;
+    @JsonProperty("insureMobile")
     private String insureMobile;
+    @JsonProperty("insureEmail")
     private String insureEmail;
+    @JsonProperty("insureProvinceCode")
     private String insureProvinceCode;
+    @JsonProperty("insureCityCode")
     private String insureCityCode;
+    @JsonProperty("insureAreaCode")
     private String insureAreaCode;
+
+    @JsonProperty("insureStreetCode")
     private String insureStreetCode;
+    @JsonProperty("insureDetailAddress")
     private String insureDetailAddress;
+    @JsonProperty("insureSex")
     private String insureSex;
+    @JsonProperty("insureBirth")
     private String insureBirth;
+    @JsonProperty("insureType")
     private String insureType;
+    @JsonProperty("insuredIsOwner")
     private String insuredIsOwner;
 
-
+    @JsonProperty("payStyle")
     private String payStyle;
-    private String individual;
+
+    @JsonProperty("quoteGreenWay")
     private String quoteGreenWay;
+
+    @JsonProperty("id")
     private String id;
+
+    @JsonProperty("specialPromiseCode")
     private String specialPromiseCode;
-    private String specialPromiseReqJsonStr;
+
+    @JsonProperty("specialPromiseReqJsonStr")
+    private String[] specialPromiseReqJsonStr;
 
 }

+ 17 - 4
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerConfirmQuoteRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
@@ -16,10 +17,22 @@ public class ZhongAnCrawlerConfirmQuoteRequest extends ZhongAnCrawlerBaseRequest
     @Serial
     private static final long serialVersionUID = -8327366400876679302L;
 
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
     public ZhongAnCrawlerConfirmQuoteRequest(ZhongAnCrawlerConfigureParameters parameters) {
-        super.setFlowId(parameters.getFlowId());
-        super.setPage(ZhongAnRequestConstant.ORDER_PAGE);
-        super.setFlag(parameters.getFlag());
-        super.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.QUOTE_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
     }
 }

+ 18 - 5
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerGetOrderRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
@@ -12,14 +13,26 @@ import java.io.Serial;
  * @date: 2025/5/13 18:39
  **/
 @Data
-public class ZhongAnCrawlerGetOrderRequest extends ZhongAnCrawlerBaseRequest {
+public class ZhongAnCrawlerGetOrderRequest{
     @Serial
     private static final long serialVersionUID = 8308587186430537899L;
 
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
     public ZhongAnCrawlerGetOrderRequest(ZhongAnCrawlerConfigureParameters parameters) {
-        super.setFlowId(parameters.getFlowId());
-        super.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
-        super.setFlag(parameters.getFlag());
-        super.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.ORDER_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
     }
 }

+ 41 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerInitDataRequest.java

@@ -0,0 +1,41 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerInitDataRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("callback")
+    private String callback;
+
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    public ZhongAnCrawlerInitDataRequest(ZhongAnCrawlerConfigureParameters parameters) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag("2,3,5");
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setCallback("__jp1");
+    }
+
+}

+ 2 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerJyxUnderwritingRequest.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
@@ -23,5 +24,6 @@ public class ZhongAnCrawlerJyxUnderwritingRequest extends ZhongAnCrawlerBaseRequ
         super.setI(ZhongAnRequestConstant.I_PARAM);
         this.quoteId = quoteId;
     }
+    @JsonProperty("quoteId")
     private String quoteId;
 }

+ 44 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerLicenseSwitchRequest.java

@@ -0,0 +1,44 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerLicenseSwitchRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("insurePlaceCode")
+    private String insurePlaceCode;
+
+    @JsonProperty("thirdOrgCode")
+    private String thirdOrgCode;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    public ZhongAnCrawlerLicenseSwitchRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setInsurePlaceCode(quoteVo.getOwnersInfo().getCityCode());
+
+    }
+
+}

+ 34 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerLoginRequest.java

@@ -0,0 +1,34 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+@Data
+public class ZhongAnCrawlerLoginRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    private String partnerChannelCode;
+
+    private String partnerUserAccount;
+
+    private String partnerChildChannelCode;
+
+    private String promotionNo;
+
+    private String productId;
+
+    private String policySource;
+
+    private String subaoBizContent;
+
+    private String insurerCode;
+
+
+
+
+}

+ 45 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerMarkRequest.java

@@ -0,0 +1,45 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerConfirmOrderResponse;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerMarkRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("orderNo")
+    private String orderNo;
+
+    @JsonProperty("location")
+    private String location;
+
+    public ZhongAnCrawlerMarkRequest(ZhongAnCrawlerConfigureParameters parameters,String ordersNo) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.INIT_DATA);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.orderNo = ordersNo;
+        this.location = "";
+
+    }
+
+}

+ 7 - 2
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerPaymentRequest.java

@@ -1,5 +1,8 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
 
 import java.io.Serial;
@@ -16,10 +19,12 @@ public class ZhongAnCrawlerPaymentRequest implements Serializable {
     @Serial
     private static final long serialVersionUID = -2686784809685360418L;
 
-    public ZhongAnCrawlerPaymentRequest(String policyId) {
+    public ZhongAnCrawlerPaymentRequest(String policyId, String checkCode) {
         this.policyId = policyId;
+        this.checkCode = checkCode;
     }
-
+    @JsonProperty("policyId")
     private String policyId;
+    @JsonProperty("checkCode")
     private String checkCode;//可为空
 }

+ 56 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerPolicyListRequest.java

@@ -0,0 +1,56 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+import org.springframework.core.io.ByteArrayResource;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerPolicyListRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+
+    @JsonProperty("queryConditon")
+    private String queryConditon;
+
+    @JsonProperty("page")
+    private String page;
+    @JsonProperty("flag")
+    private String flag;
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("status")
+    private String status;
+
+    @JsonProperty("pageIndex")
+    private String pageIndex;
+
+    @JsonProperty("queryType")
+    private String queryType;
+
+
+
+    public ZhongAnCrawlerPolicyListRequest(String license,ZhongAnCrawlerConfigureParameters parameters) {
+
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.POLICY_LIST);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setQueryConditon(license);
+        this.setStatus("1");
+        this.setPageIndex("1");
+        this.setQueryType("1");
+    }
+
+
+}

+ 55 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQueryDetailQueryRequest.java

@@ -0,0 +1,55 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerCacheCarQueryResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerQueryDetailQueryRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("vehicleCode")
+    private String vehicleCode;
+
+    @JsonProperty("vehicleCode")
+    private String callVehicleModelLibraryFlag;
+
+
+    public ZhongAnCrawlerQueryDetailQueryRequest(ZhongAnCrawlerCacheCarQueryResponse cacheCarQueryResponse, ZhongAnCrawlerConfigureParameters parameters){
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+
+        ZhongAnCrawlerCacheCarQueryResponse.ValueDTO.DataDTO.PlatVehicleList platVehicleList = cacheCarQueryResponse.getValue().getDatas().getPlatVehicleList().get(0);
+
+        this.vehicleCode=platVehicleList.getVehicleCode();
+    }
+
+
+
+
+
+}

+ 45 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuerySpecialRequest.java

@@ -0,0 +1,45 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerQuerySpecialRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("vehicleRegisterDate")
+    private String vehicleRegisterDate;
+
+    @JsonProperty("placeCode")
+    private String placeCode;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    public ZhongAnCrawlerQuerySpecialRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.CAR_QUERY_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setVehicleRegisterDate(quoteVo.getCarInfoVo().getRegisterDate());
+        this.setPlaceCode(quoteVo.getOwnersInfo().getCityCode());
+
+    }
+
+}

+ 43 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuoteBaseRequest.java

@@ -0,0 +1,43 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+@Data
+@NoArgsConstructor
+public class ZhongAnCrawlerQuoteBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("quoteType")
+    private Integer quoteType;
+
+    public ZhongAnCrawlerQuoteBaseRequest(ZhongAnCrawlerConfigureParameters parameters){
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.QUOTE_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.setQuoteType(0);
+
+    }
+
+
+}

+ 73 - 35
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerQuoteRequest.java

@@ -1,13 +1,17 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import com.jzg.quotation.zhongan.crawler.entity.dto.CoverageInfoDTO;
+import com.jzg.quotation.zhongan.crawler.entity.dto.NonAutoInfoDto;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerQuoteBaseResponse;
 import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serial;
 import java.util.ArrayList;
@@ -19,69 +23,103 @@ import java.util.List;
  * @date: 2025/5/12 15:26
  **/
 @Data
-public class ZhongAnCrawlerQuoteRequest extends ZhongAnCrawlerBaseRequest {
+public class ZhongAnCrawlerQuoteRequest{
     @Serial
     private static final long serialVersionUID = -5514389426425862446L;
 
-    public ZhongAnCrawlerQuoteRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters) {
-        super.setFlowId(parameters.getFlowId());
-        super.setPage(ZhongAnRequestConstant.QUOTE_PAGE);
-        super.setFlag(parameters.getFlag());
-        super.setI(ZhongAnRequestConstant.I_PARAM);
+    @JsonProperty("flowId")
+    private String flowId;
 
-        RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
-        if (biRiskInfoVo != null && biRiskInfoVo.getStartDate() != null) {
-            this.addBusi = "1";
-        } else {
-            this.addBusi = "0";
-        }
-        RiskInfoVo ciRiskInfoVo = quoteVo.getCiRiskInfoVo();
-        if (ciRiskInfoVo != null && ciRiskInfoVo.getStartDate() != null) {
-            this.addCompel = "1";
-        } else {
-            this.addCompel = "0";
-        }
-        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
-        List<CoverageInfoDTO> coverageInfoDTOS = new ArrayList<>();
-        if (kindInfoVoList != null && kindInfoVoList.size() > 0) {
-            for (KindInfoVo kindInfoVo : kindInfoVoList) {
-                CoverageInfoDTO coverageInfoDTO = new CoverageInfoDTO();
-                coverageInfoDTO.setProductId(kindInfoVo.getKindCode());
-                coverageInfoDTO.setAmount(kindInfoVo.getAmount());
-                coverageInfoDTOS.add(coverageInfoDTO);
-            }
-        }
-        this.coverageInfo = JSONObject.toJSONString(coverageInfoDTOS);
-    }
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
 
     /**
      * 是否选择商业险(1,是;0,否)
      */
+    @JsonProperty("addBusi")
     private String addBusi;
+
+    @JsonProperty("coverageInfo")
     private String coverageInfo;
     /**
      * 是否选择交强险(1,是;0,否)
      */
+    @JsonProperty("addCompel")
     private String addCompel;
+
+    @JsonProperty("addTax")
     private String addTax = "0";
     /**
      * 商业险生效日期
      */
+    @JsonProperty("effectiveDate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private String effectiveDate;
     /**
-     *
-     * 
-     *
-     *
-     *
      * 交强险生效日期
      */
+    @JsonProperty("compelInsEffectiveDate")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
     private String compelInsEffectiveDate;
     /**
      * 非车信息
      */
+    @JsonProperty("nonAutoInfo")
     private String nonAutoInfo;
 
+    public ZhongAnCrawlerQuoteRequest(QuoteVo quoteVo, ZhongAnCrawlerConfigureParameters parameters, ZhongAnCrawlerQuoteBaseResponse quoteBaseResponse) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.QUOTE_PAGE);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+
+        RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
+        if (biRiskInfoVo != null && biRiskInfoVo.getStartDate() != null) {
+            this.addBusi = "1";
+            this.setEffectiveDate(biRiskInfoVo.getStartDate());
+        } else {
+            this.addBusi = "0";
+        }
+        RiskInfoVo ciRiskInfoVo = quoteVo.getCiRiskInfoVo();
+        if (ciRiskInfoVo != null && ciRiskInfoVo.getStartDate() != null) {
+            this.addCompel = "1";
+            this.setCompelInsEffectiveDate(ciRiskInfoVo.getStartDate());
+        } else {
+            this.addCompel = "0";
+        }
+//        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+
+        List<ZhongAnCrawlerQuoteBaseResponse.ValueDTO.QuoteCoverageListDTO> quoteCoverageList = quoteBaseResponse.getValue().getQuoteCoverageList();
+
+        List<CoverageInfoDTO> coverageInfoDTOS = new ArrayList<>();
+
+        if (quoteCoverageList != null && quoteCoverageList.size() > 0) {
+            for (ZhongAnCrawlerQuoteBaseResponse.ValueDTO.QuoteCoverageListDTO quoteCoverage: quoteCoverageList) {
+                CoverageInfoDTO coverageInfoDTO = new CoverageInfoDTO();
+                coverageInfoDTO.setProductId(quoteCoverage.getProductId());
+                coverageInfoDTO.setAmount(quoteCoverage.getAmount());
+                coverageInfoDTOS.add(coverageInfoDTO);
+            }
+        }
+        this.coverageInfo = JSONObject.toJSONString(coverageInfoDTOS);
+
+        List<NonAutoInfoDto> nonAutoInfoDtos = new ArrayList<>();
+        NonAutoInfoDto jtywxV24 = new NonAutoInfoDto("kp_jtywx_v24", "1", "6");
+        NonAutoInfoDto wjsGabV6 = new NonAutoInfoDto("wjs_gab_v6", "0", null);
+
+        nonAutoInfoDtos.add(jtywxV24);
+        nonAutoInfoDtos.add(wjsGabV6);
+
+        this.nonAutoInfo = JSONObject.toJSONString(nonAutoInfoDtos);
+
+    }
+
     /**
      * flowId								FJ14358876876b6b9550a
      * page								/insureProgram

+ 18 - 3
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerUploadImageRequest.java

@@ -1,8 +1,11 @@
 package com.jzg.quotation.zhongan.crawler.entity.request;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
 import lombok.Data;
+import org.springframework.core.io.ByteArrayResource;
 
 import java.io.File;
 import java.io.Serial;
@@ -18,9 +21,14 @@ public class ZhongAnCrawlerUploadImageRequest implements Serializable {
     @Serial
     private static final long serialVersionUID = 6616361166719063753L;
 
-    public ZhongAnCrawlerUploadImageRequest(String imageType, File fileItem, String orderNo, String policyId, ZhongAnCrawlerConfigureParameters parameters) {
+    public ZhongAnCrawlerUploadImageRequest(String imageType, InsuranceImageVo.ImageDTO imageDTO, String orderNo, String policyId, ZhongAnCrawlerConfigureParameters parameters) {
         this.imageType = imageType;
-        this.fileItem = fileItem;
+        this.fileItem = new ByteArrayResource(imageDTO.getImageByte()) {
+            @Override
+            public String getFilename() {
+                return imageDTO.getImageName(); // 必须重写此方法
+            }
+        };;
         this.orderNo = orderNo;
         this.policyId = policyId;
         this.page = ZhongAnRequestConstant.UPLOAD_IMAGE_PAGE;
@@ -36,12 +44,19 @@ public class ZhongAnCrawlerUploadImageRequest implements Serializable {
      * 行驶证副本			    7
      * 其他                  99
      */
+    @JsonProperty("imageType")
     private String imageType;
 
-    private File fileItem;
+    @JsonProperty("fileItem")
+    private ByteArrayResource fileItem;
+    @JsonProperty("orderNo")
     private String orderNo;
+    @JsonProperty("policyId")
     private String policyId;
+    @JsonProperty("page")
     private String page;
+    @JsonProperty("flag")
     private String flag;
+    @JsonProperty("flowId")
     private String flowId;
 }

+ 45 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerUploadInitDateRequest.java

@@ -0,0 +1,45 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerConfirmOrderResponse;
+import lombok.Data;
+
+import java.io.Serial;
+
+@Data
+public class ZhongAnCrawlerUploadInitDateRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("page")
+    private String page;
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("i")
+    private String i;
+
+    @JsonProperty("policyId")
+    private String policyId;
+
+    @JsonProperty("checkCode")
+    private String checkCode;
+
+    public ZhongAnCrawlerUploadInitDateRequest(ZhongAnCrawlerConfirmOrderResponse.ValueDTO.DataDTO dataDTO, ZhongAnCrawlerConfigureParameters parameters) {
+        this.setFlowId(parameters.getFlowId());
+        this.setPage(ZhongAnRequestConstant.INIT_DATA);
+        this.setFlag(parameters.getFlag());
+        this.setI(ZhongAnRequestConstant.I_PARAM);
+        this.policyId = dataDTO.getPolicyId();
+        this.checkCode = "";
+
+    }
+
+}

+ 4 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerBaseResponse.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.response;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serial;
@@ -15,10 +16,13 @@ public class ZhongAnCrawlerBaseResponse implements Serializable {
     @Serial
     private static final long serialVersionUID = 2513263996059644680L;
 
+    @JsonProperty("errorMsg")
     private String errorMsg;
 
+    @JsonProperty("errorCode")
     private String errorCode;
 
+    @JsonProperty("success")
     private Boolean success;
 
 }

+ 108 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerCacheCarQueryResponse.java

@@ -0,0 +1,108 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+public class ZhongAnCrawlerCacheCarQueryResponse extends ZhongAnCrawlerBaseResponse{
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    private String ruleMsgTips;
+
+    private ValueDTO value;
+
+    private AdditionalInfoDTO additionalInfo;
+
+    @Data
+    public static class ValueDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -1L;
+
+        private DataDTO datas;
+
+        private Boolean isNewCar;
+
+        @Data
+        public static class DataDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = -1L;
+
+            private List<PlatVehicleList> platVehicleList;
+
+            private String modelEnergyType;
+
+            @Data
+            @NoArgsConstructor
+            public static class PlatVehicleList implements Serializable{
+
+                @Serial
+                private static final long serialVersionUID = -11111L;
+
+                private String analogyVehiclePrice;
+                private String analogyVehiclePriceWithTax;
+                private String brand;
+                private String brandTypeCode;
+                private String deptName;
+                private String engineDesc;
+                private String modelEnergyType;
+                private String pfBrandCode;
+                private String pfCategoryCode;
+                private String pfCompanyCode;
+                private String pfConfModel;
+                private String pfDeptCode;
+                private String pfFamilycode;
+                private String pfNoticeType;
+                private String pfVehicleClass;
+                private String pfVehicleMangline;
+                private String rExhaustCapacity;
+                private String rVehicleName;
+                private String rbCode;
+                private String refcode1;
+                private String refcode2;
+                private String setNumber;
+                private String tradeName;
+                private String vehicleClass;
+                private String vehicleClassCode;
+                private String vehicleCode;
+                private String vehicleDescription;
+                private String vehiclePrice;
+                private String vehiclePriceWithTax;
+                private String yearPattern;
+
+            }
+
+        }
+    }
+
+
+
+
+
+    @Data
+    public static class AdditionalInfoDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -1L;
+
+        @JsonProperty("quoteId")
+        private Long quoteId;
+
+        @JsonProperty("zaFlowId")
+        private String zaFlowId;
+
+        @JsonProperty("isSupportRepeatInsure")
+        private String isSupportRepeatInsure;
+
+
+
+
+    }
+}

+ 87 - 85
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerPaymentResponse.java

@@ -1,9 +1,11 @@
 package com.jzg.quotation.zhongan.crawler.entity.response;
 
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
-import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -11,127 +13,127 @@ import java.util.List;
  * @author: shenwd
  * @date: 2025/5/15 11:30
  **/
+@NoArgsConstructor
 @Data
 public class ZhongAnCrawlerPaymentResponse extends ZhongAnCrawlerBaseResponse{
     @Serial
     private static final long serialVersionUID = -605747703921866090L;
 
-    private String ruleMsgTips;
 
+    @JsonProperty("value")
     private ValueDTO value;
-
+    @JsonProperty("additionalInfo")
     private AdditionalInfoDTO additionalInfo;
 
+    @NoArgsConstructor
     @Data
-    public static class ValueDTO implements Serializable {
-        @Serial
-        private static final long serialVersionUID = 7631482513604543586L;
-        private DataDTO datas;
+    public static class ValueDTO {
+        @JsonProperty("datas")
+        private DatasDTO datas;
 
+        @NoArgsConstructor
         @Data
-        public static class DataDTO implements Serializable {
-            @Serial
-            private static final long serialVersionUID = -1305720504073237441L;
-            /**
-             * 支付链接
-             */
-            private String shareShortUrl;
-
-            private String isShowSmsButton;
-
-            private String redictUrl;
-
+        public static class DatasDTO {
+            @JsonProperty("bizCoinsType")
+            private String bizCoinsType;
+            @JsonProperty("coinsType")
             private String coinsType;
-
+            @JsonProperty("initInfo")
             private InitInfoDTO initInfo;
-
+            @JsonProperty("isChangeFee")
             private String isChangeFee;
+            @JsonProperty("isShowSmsButton")
+            private String isShowSmsButton;
+            @JsonProperty("redictUrl")
+            private String redictUrl;
+            @JsonProperty("shareShortUrl")
+            private String shareShortUrl;
 
+            @NoArgsConstructor
             @Data
-            public static class InitInfoDTO implements Serializable {
-                @Serial
-                private static final long serialVersionUID = 3749340540417195000L;
-                private String vehicleName;
-
-                private String businessDiscount;
-
-                private String miniProgramPaySwitch;
-
-                private String splitPayFlag;
-
-                private String modelEnergyType;
-
-                private String taxPremium;
-
-                private String showVAT;
-
-                private String ownerName;
-
-                private String compelDiscount;
-
-                private String insurePlaceCode;
+            public static class InitInfoDTO {
 
+                @JsonProperty("agentUserCode")
+                private String agentUserCode;
+                @JsonProperty("applicantName")
+                private String applicantName;
+                @JsonProperty("applicantPersonnelType")
                 private String applicantPersonnelType;
-
-                private String productType;
-
+                @JsonProperty("applySignStageFlag")
                 private String applySignStageFlag;
-
+                @JsonProperty("bizPremium")
+                private String bizPremium;
+                @JsonProperty("businessDiscount")
+                private String businessDiscount;
+                @JsonProperty("compelDiscount")
+                private String compelDiscount;
+                @JsonProperty("compelPremium")
+                private String compelPremium;
+                @JsonProperty("electricApplyPolicyFlag")
                 private String electricApplyPolicyFlag;
-
-                private String orderNo;
-
-                private String agentUserCode;
-
-                private String isEnableQrCode;
-
-                private String premuim;
-
-                private String applicantName;
-
-                private List<JyxPolicyDTO> jyxPolicyList;
-
+                @JsonProperty("enterprisePayFlag")
                 private String enterprisePayFlag;
-
-                private String compelPremium;
-
-                private String quoteId;
-
-                private String payExpireDate;
-
+                @JsonProperty("insurePlaceCode")
+                private String insurePlaceCode;
+                @JsonProperty("insurePlaceName")
                 private String insurePlaceName;
-
-                private String personnelType;
-
-                private String ownerPhoneNo;
-
-                private String bizPremium;
-
+                @JsonProperty("isEnableQrCode")
+                private String isEnableQrCode;
+                @JsonProperty("isNeedRealName")
                 private String isNeedRealName;
+                @JsonProperty("jyxPolicyList")
+                private List<JyxPolicyListDTO> jyxPolicyList;
+                @JsonProperty("miniProgramPaySwitch")
+                private String miniProgramPaySwitch;
+                @JsonProperty("modelEnergyType")
+                private String modelEnergyType;
+                @JsonProperty("orderNo")
+                private String orderNo;
+                @JsonProperty("ownerName")
+                private String ownerName;
+                @JsonProperty("ownerPhoneNo")
+                private String ownerPhoneNo;
+                @JsonProperty("payExpireDate")
+                private String payExpireDate;
+                @JsonProperty("personnelType")
+                private String personnelType;
+                @JsonProperty("premuim")
+                private String premuim;
+                @JsonProperty("productType")
+                private String productType;
+                @JsonProperty("quoteId")
+                private String quoteId;
+                @JsonProperty("showVAT")
+                private String showVAT;
+                @JsonProperty("splitPayFlag")
+                private String splitPayFlag;
+                @JsonProperty("taxPremium")
+                private String taxPremium;
+                @JsonProperty("vehicleName")
+                private String vehicleName;
 
+                @NoArgsConstructor
                 @Data
-                public static class JyxPolicyDTO implements Serializable {
-                    @Serial
-                    private static final long serialVersionUID = 202583596174143067L;
+                public static class JyxPolicyListDTO {
+                    @JsonProperty("coverage")
                     private String coverage;
-
+                    @JsonProperty("premium")
                     private String premium;
-
+                    @JsonProperty("insuredFlag")
                     private String insuredFlag;
-
+                    @JsonProperty("combination")
                     private String combination;
-
+                    @JsonProperty("isCombinePay")
                     private String isCombinePay;
-
+                    @JsonProperty("productMode")
                     private String productMode;
                 }
             }
         }
     }
 
+    @NoArgsConstructor
     @Data
-    public static class AdditionalInfoDTO implements Serializable {
-        @Serial
-        private static final long serialVersionUID = -2976499652780707864L;
+    public static class AdditionalInfoDTO {
     }
 }

+ 45 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerPolicyListResponse.java

@@ -0,0 +1,45 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerPolicyListResponse extends ZhongAnCrawlerBaseResponse{
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("ruleMsgTips")
+    private String ruleMsgTips;
+    @JsonProperty("value")
+    private ValueDTO value;
+    @JsonProperty("additionalInfo")
+    private AdditionalInfoDTO additionalInfo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ValueDTO {
+        @JsonProperty("datas")
+        private DatasDTO datas;
+
+        @NoArgsConstructor
+        @Data
+        public static class DatasDTO {
+            @JsonProperty("maxPage")
+            private Integer maxPage;
+            @JsonProperty("policyLists")
+            private List<?> policyLists;
+
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AdditionalInfoDTO {
+    }
+}

+ 138 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQueryDetailQueryResponse.java

@@ -0,0 +1,138 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerQueryDetailQueryResponse {
+
+
+    @JsonProperty("errorMsg")
+    private String errorMsg;
+    @JsonProperty("ruleMsgTips")
+    private String ruleMsgTips;
+    @JsonProperty("errorCode")
+    private String errorCode;
+    @JsonProperty("value")
+    private ValueDTO value;
+    @JsonProperty("additionalInfo")
+    private AdditionalInfoDTO additionalInfo;
+    @JsonProperty("success")
+    private Boolean success;
+
+    @NoArgsConstructor
+    @Data
+    public static class ValueDTO {
+        @JsonProperty("datas")
+        private DatasDTO datas;
+
+        @NoArgsConstructor
+        @Data
+        public static class DatasDTO {
+            @JsonProperty("vehicleDetailInfo")
+            private VehicleDetailInfoDTO vehicleDetailInfo;
+
+            @NoArgsConstructor
+            @Data
+            public static class VehicleDetailInfoDTO {
+                @JsonProperty("vehicleCode")
+                private String vehicleCode;
+                @JsonProperty("vehicleName")
+                private String vehicleName;
+                @JsonProperty("companyName")
+                private String companyName;
+                @JsonProperty("companyCode")
+                private String companyCode;
+                @JsonProperty("brandName")
+                private String brandName;
+                @JsonProperty("brandCode")
+                private String brandCode;
+                @JsonProperty("familyName")
+                private String familyName;
+                @JsonProperty("familyCode")
+                private String familyCode;
+                @JsonProperty("remark")
+                private String remark;
+                @JsonProperty("vehicleClassCode")
+                private String vehicleClassCode;
+                @JsonProperty("vehicleClass")
+                private String vehicleClass;
+                @JsonProperty("vehicleImport")
+                private String vehicleImport;
+                @JsonProperty("purchasePrice")
+                private Integer purchasePrice;
+                @JsonProperty("purchasePriceTax")
+                private Integer purchasePriceTax;
+                @JsonProperty("kindredPrice")
+                private Integer kindredPrice;
+                @JsonProperty("kindredPriceTax")
+                private String kindredPriceTax;
+                @JsonProperty("jqxClassid")
+                private String jqxClassid;
+                @JsonProperty("jqxClassname")
+                private String jqxClassname;
+                @JsonProperty("syxClassid")
+                private String syxClassid;
+                @JsonProperty("syxClassname")
+                private String syxClassname;
+                @JsonProperty("seat")
+                private String seat;
+                @JsonProperty("fullWeight")
+                private String fullWeight;
+                @JsonProperty("fullWeightMax")
+                private Integer fullWeightMax;
+                @JsonProperty("fullWeightMin")
+                private Integer fullWeightMin;
+                @JsonProperty("displacement")
+                private Double displacement;
+                @JsonProperty("marketDate")
+                private String marketDate;
+                @JsonProperty("gearBoxType")
+                private String gearBoxType;
+                @JsonProperty("engineDesc")
+                private String engineDesc;
+                @JsonProperty("groupName")
+                private String groupName;
+                @JsonProperty("groupCode")
+                private String groupCode;
+                @JsonProperty("stopFlag")
+                private String stopFlag;
+                @JsonProperty("vehicleHyName")
+                private String vehicleHyName;
+                @JsonProperty("vehicleHyCode")
+                private String vehicleHyCode;
+                @JsonProperty("configName")
+                private String configName;
+                @JsonProperty("hfCode")
+                private String hfCode;
+                @JsonProperty("hfName")
+                private String hfName;
+                @JsonProperty("vehiclePubName")
+                private String vehiclePubName;
+                @JsonProperty("vehiclePubCode")
+                private String vehiclePubCode;
+                @JsonProperty("yearPattern")
+                private String yearPattern;
+                @JsonProperty("power")
+                private String power;
+                @JsonProperty("familyShortName")
+                private String familyShortName;
+                @JsonProperty("powerType")
+                private String powerType;
+                @JsonProperty("powerTypeCode")
+                private String powerTypeCode;
+                @JsonProperty("airBagNum")
+                private String airBagNum;
+                @JsonProperty("vehicleHyCCode")
+                private String vehicleHyCCode;
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AdditionalInfoDTO {
+    }
+}

+ 246 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQuoteBaseResponse.java

@@ -0,0 +1,246 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerQuoteBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("errorMsg")
+    private String errorMsg;
+    @JsonProperty("ruleMsgTips")
+    private String ruleMsgTips;
+    @JsonProperty("errorCode")
+    private String errorCode;
+    @JsonProperty("value")
+    private ValueDTO value;
+    @JsonProperty("additionalInfo")
+    private AdditionalInfoDTO additionalInfo;
+    @JsonProperty("success")
+    private Boolean success;
+
+    @NoArgsConstructor
+    @Data
+    public static class ValueDTO {
+        @JsonProperty("quoteCoverageList")
+        private List<QuoteCoverageListDTO> quoteCoverageList;
+        @JsonProperty("showCoverageList")
+        private List<ShowCoverageListDTO> showCoverageList;
+        @JsonProperty("baseInfo")
+        private BaseInfoDTO baseInfo;
+        @JsonProperty("jyxInsureDTOList")
+        private List<JyxInsureDTOListDTO> jyxInsureDTOList;
+        @JsonProperty("amountList")
+        private List<AmountListDTO> amountList;
+
+        @NoArgsConstructor
+        @Data
+        public static class BaseInfoDTO {
+            @JsonProperty("vehicleModelDesc")
+            private String vehicleModelDesc;
+            @JsonProperty("vehicleOwnerName")
+            private String vehicleOwnerName;
+            @JsonProperty("insurePlaceName")
+            private String insurePlaceName;
+            @JsonProperty("insurePlaceCode")
+            private String insurePlaceCode;
+            @JsonProperty("modelEnergyType")
+            private String modelEnergyType;
+            @JsonProperty("vehiclePassengerCap")
+            private Integer vehiclePassengerCap;
+            @JsonProperty("vehicleLicencePlateNo")
+            private String vehicleLicencePlateNo;
+            @JsonProperty("vehicleActualPrice")
+            private String vehicleActualPrice;
+            @JsonProperty("isInsureBusinessInsurance")
+            private String isInsureBusinessInsurance;
+            @JsonProperty("isInsureCompelInsurance")
+            private String isInsureCompelInsurance;
+            @JsonProperty("businessInsEffectiveDate")
+            private Long businessInsEffectiveDate;
+            @JsonProperty("compelInsEffectiveDate")
+            private Long compelInsEffectiveDate;
+            @JsonProperty("syxClassid")
+            private String syxClassid;
+            @JsonProperty("vehicleUsageType")
+            private String vehicleUsageType;
+            @JsonProperty("quoteId")
+            private String quoteId;
+            @JsonProperty("instantEffectiveDate")
+            private Long instantEffectiveDate;
+            @JsonProperty("productModel")
+            private String productModel;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class QuoteCoverageListDTO {
+            @JsonProperty("productDefCode")
+            private String productDefCode;
+            @JsonProperty("policyProductCode")
+            private String policyProductCode;
+            @JsonProperty("productDefName")
+            private String productDefName;
+            @JsonProperty("amount")
+            private String amount;
+            @JsonProperty("standPremium")
+            private String standPremium;
+            @JsonProperty("premium")
+            private String premium;
+            @JsonProperty("isNonDeductible")
+            private Integer isNonDeductible;
+            @JsonProperty("baseRiderType")
+            private String baseRiderType;
+            @JsonProperty("productId")
+            private String productId;
+            @JsonProperty("showOrder")
+            private String showOrder;
+            @JsonProperty("greenWayCoverage")
+            private Boolean greenWayCoverage;
+            @JsonProperty("pureRiskPremium")
+            private String pureRiskPremium;
+            @JsonProperty("premiumRate")
+            private String premiumRate;
+            @JsonProperty("seats")
+            private String seats;
+            @JsonProperty("coverageTemplateCode")
+            private String coverageTemplateCode;
+            @JsonProperty("shortName")
+            private String shortName;
+            @JsonProperty("deductibleFee")
+            private String deductibleFee;
+            @JsonProperty("baseRiskId")
+            private Integer baseRiskId;
+            @JsonProperty("dutyAttributeValue")
+            private String dutyAttributeValue;
+            @JsonProperty("parentTemplateCode")
+            private String parentTemplateCode;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class ShowCoverageListDTO {
+            @JsonProperty("additionalRiderList")
+            private List<AdditionalRiderListDTO> additionalRiderList;
+            @JsonProperty("productId")
+            private Integer productId;
+            @JsonProperty("baseRiderType")
+            private String baseRiderType;
+            @JsonProperty("amount")
+            private String amount;
+            @JsonProperty("totalCoveragePremium")
+            private Double totalCoveragePremium;
+            @JsonProperty("productDefName")
+            private String productDefName;
+            @JsonProperty("isNonDeductible")
+            private Integer isNonDeductible;
+            @JsonProperty("showOrder")
+            private String showOrder;
+
+            @NoArgsConstructor
+            @Data
+            public static class AdditionalRiderListDTO {
+                @JsonProperty("additionalRiderList")
+                private List<?> additionalRiderList;
+                @JsonProperty("productId")
+                private Integer productId;
+                @JsonProperty("baseRiderType")
+                private String baseRiderType;
+                @JsonProperty("baseRiskId")
+                private Integer baseRiskId;
+                @JsonProperty("amount")
+                private String amount;
+                @JsonProperty("totalCoveragePremium")
+                private Double totalCoveragePremium;
+                @JsonProperty("productDefName")
+                private String productDefName;
+                @JsonProperty("isNonDeductible")
+                private Integer isNonDeductible;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class JyxInsureDTOListDTO {
+            @JsonProperty("productCode")
+            private String productCode;
+            @JsonProperty("productName")
+            private String productName;
+            @JsonProperty("campaignDefId")
+            private Integer campaignDefId;
+            @JsonProperty("campaignName")
+            private String campaignName;
+            @JsonProperty("agentUserCode")
+            private String agentUserCode;
+            @JsonProperty("showJiaYiXian")
+            private String showJiaYiXian;
+            @JsonProperty("insureJiaYiFlag")
+            private String insureJiaYiFlag;
+            @JsonProperty("vehiclePassengerCap")
+            private Integer vehiclePassengerCap;
+            @JsonProperty("jyxEnsureSeatNo")
+            private Integer jyxEnsureSeatNo;
+            @JsonProperty("jyxPremium")
+            private String jyxPremium;
+            @JsonProperty("combination")
+            private String combination;
+            @JsonProperty("driverAccidentInsuranceFlag")
+            private String driverAccidentInsuranceFlag;
+            @JsonProperty("driverAccidentInsuranceAmountOptions")
+            private String driverAccidentInsuranceAmountOptions;
+            @JsonProperty("zhiYingJyx")
+            private String zhiYingJyx;
+            @JsonProperty("isShortPolicy")
+            private String isShortPolicy;
+            @JsonProperty("supportSingleSell")
+            private String supportSingleSell;
+            @JsonProperty("isSupportInstant")
+            private String isSupportInstant;
+            @JsonProperty("productMode")
+            private String productMode;
+            @JsonProperty("bindInsurance")
+            private String bindInsurance;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class AmountListDTO {
+            @JsonProperty("extraMap")
+            private ExtraMapDTO extraMap;
+            @JsonProperty("id")
+            private Integer id;
+            @JsonProperty("dictId")
+            private Integer dictId;
+            @JsonProperty("parentId")
+            private Integer parentId;
+            @JsonProperty("name")
+            private String name;
+            @JsonProperty("code")
+            private String code;
+            @JsonProperty("extra")
+            private String extra;
+            @JsonProperty("level")
+            private Integer level;
+            @JsonProperty("childItems")
+            private List<?> childItems;
+
+            @NoArgsConstructor
+            @Data
+            public static class ExtraMapDTO {
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AdditionalInfoDTO {
+    }
+}

+ 8 - 8
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerQuoteResponse.java

@@ -66,7 +66,7 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
 
             private String agentUserCode;
 
-            private Integer currentDateStr;
+            private Long currentDateStr;
 
             private Boolean isImportCar;
 
@@ -157,7 +157,7 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
             public static class LoanVehicleDTO implements Serializable {
                 @Serial
                 private static final long serialVersionUID = -9208226282120682664L;
-                private Integer instantEffectiveDate;
+                private Long instantEffectiveDate;
 
                 private String isShowDTPicker;
 
@@ -190,9 +190,9 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
 
                 private Double totalPremium;
 
-                private Integer compelPremium;
+                private Double compelPremium;
 
-                private Integer taxPremium;
+                private Double taxPremium;
 
                 private String taxCode;
 
@@ -204,7 +204,7 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
 
                 private String isPayTax;
 
-                private Integer nonTotalPremium;
+                private Double nonTotalPremium;
 
                 @Data
                 public static class VehicleCoverageListDTO implements Serializable {
@@ -216,11 +216,11 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
 
                     private String baseRiderType;
 
-                    private String premium;
+                    private Double premium;
 
                     private String amount;
 
-                    private Integer totalCoveragePremium;
+                    private Double totalCoveragePremium;
 
                     private String productDefName;
 
@@ -261,7 +261,7 @@ public class ZhongAnCrawlerQuoteResponse extends ZhongAnCrawlerBaseResponse {
 
                 private Integer jyxEnsureSeatNo;
 
-                private String jyxPremium;
+                private Double jyxPremium;
 
                 private String driverAccidentInsuranceFlag;
 

+ 7 - 4
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerUploadImageResponse.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.entity.response;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 import java.io.Serial;
@@ -11,26 +12,28 @@ import java.io.Serializable;
  * @date: 2025/5/14 11:20
  **/
 @Data
-public class ZhongAnCrawlerUploadImageResponse implements Serializable {
+public class ZhongAnCrawlerUploadImageResponse extends ZhongAnCrawlerBaseResponse{
     @Serial
     private static final long serialVersionUID = -8752369054975444468L;
-
+    @JsonProperty("value")
     private ValueDTO value;
-
+    @JsonProperty("additionalInfo")
     private AdditionalInfoDTO additionalInfo;
 
     @Data
     public static class ValueDTO implements Serializable {
         @Serial
         private static final long serialVersionUID = 8428987717523097930L;
+        @JsonProperty("datas")
         private DataDTO datas;
 
         @Data
         public static class DataDTO implements Serializable {
             @Serial
             private static final long serialVersionUID = -6591203866369844410L;
+            @JsonProperty("uploadedFilePath")
             private String uploadedFilePath;
-
+            @JsonProperty("encFileImageName")
             private String encFileImageName;
         }
     }

+ 95 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerUploadInitDateResponse.java

@@ -0,0 +1,95 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class ZhongAnCrawlerUploadInitDateResponse extends ZhongAnCrawlerBaseResponse{
+
+    @Serial
+    private static final long serialVersionUID = -1L;
+
+    @JsonProperty("value")
+    private ValueDTO value;
+    @JsonProperty("additionalInfo")
+    private AdditionalInfoDTO additionalInfo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ValueDTO {
+        @JsonProperty("datas")
+        private DatasDTO datas;
+
+        @NoArgsConstructor
+        @Data
+        public static class DatasDTO {
+
+            @JsonProperty("transferFlag")
+            private String transferFlag;
+            @JsonProperty("orderNo")
+            private String orderNo;
+            @JsonProperty("vehicleFrameNo")
+            private String vehicleFrameNo;
+            @JsonProperty("imageData")
+            private List<ImageDataDTO> imageData;
+            @JsonProperty("campaignId")
+            private Integer campaignId;
+            @JsonProperty("agentUserCode")
+            private String agentUserCode;
+            @JsonProperty("compelRuleEffectiveTimes")
+            private String compelRuleEffectiveTimes;
+            @JsonProperty("compelEffectiveDate")
+            private String compelEffectiveDate;
+            @JsonProperty("applicantName")
+            private String applicantName;
+            @JsonProperty("quoteId")
+            private String quoteId;
+            @JsonProperty("compelCoinsType")
+            private String compelCoinsType;
+            @JsonProperty("vehicleLicencePlateNo")
+            private String vehicleLicencePlateNo;
+            @JsonProperty("checkCode")
+            private String checkCode;
+            @JsonProperty("bizEffectiveDate")
+            private String bizEffectiveDate;
+            @JsonProperty("bizExpiryDate")
+            private String bizExpiryDate;
+            @JsonProperty("bizApplyNo")
+            private String bizApplyNo;
+            @JsonProperty("manualAuditStatus")
+            private String manualAuditStatus;
+            @JsonProperty("compelExpiryDate")
+            private String compelExpiryDate;
+            @JsonProperty("compelApplyNo")
+            private String compelApplyNo;
+            @JsonProperty("businessRuleEffectiveTimes")
+            private String businessRuleEffectiveTimes;
+            @JsonProperty("insurePlaceCode")
+            private String insurePlaceCode;
+
+            @NoArgsConstructor
+            @Data
+            public static class ImageDataDTO {
+                @JsonProperty("imageType")
+                private Integer imageType;
+                @JsonProperty("imageTypeName")
+                private String imageTypeName;
+                @JsonProperty("imageUrl")
+                private String imageUrl;
+                @JsonProperty("encFileImageName")
+                private String encFileImageName;
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AdditionalInfoDTO {
+    }
+}

+ 1 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/Repository/ZhongAnCrawlerOrderRepository.java → tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/repository/ZhongAnCrawlerOrderRepository.java

@@ -1,4 +1,4 @@
-package com.jzg.quotation.zhongan.crawler.Repository;
+package com.jzg.quotation.zhongan.crawler.repository;
 
 import com.jzg.quotation.zhongan.crawler.entity.po.ZhongAnCrawlerOrder;
 import org.springframework.data.mongodb.repository.MongoRepository;

+ 1 - 1
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerOrderServiceImpl.java

@@ -1,6 +1,6 @@
 package com.jzg.quotation.zhongan.crawler.service.Impl;
 
-import com.jzg.quotation.zhongan.crawler.Repository.ZhongAnCrawlerOrderRepository;
+import com.jzg.quotation.zhongan.crawler.repository.ZhongAnCrawlerOrderRepository;
 import com.jzg.quotation.zhongan.crawler.entity.po.ZhongAnCrawlerOrder;
 import com.jzg.quotation.zhongan.crawler.service.ZhongAnCrawlerOrderService;
 import lombok.RequiredArgsConstructor;

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

@@ -1,18 +1,28 @@
 package com.jzg.quotation.zhongan.crawler.service.Impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 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.MinioUtils;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 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.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.commons.utils.HttpUtil;
+import com.jzg.quotation.zhongan.crawler.JsonUtil;
 import com.jzg.quotation.zhongan.crawler.build.ZhongAnCrawlerQuoteResultsVoBuild;
+import com.jzg.quotation.zhongan.crawler.component.ZhongAnCrawlerCacheComponent;
 import com.jzg.quotation.zhongan.crawler.component.ZhongAnCrawlerRequestComponent;
 import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
 import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
@@ -22,13 +32,14 @@ import com.jzg.quotation.zhongan.crawler.entity.response.*;
 import com.jzg.quotation.zhongan.crawler.service.ZhongAnCrawlerOrderService;
 import com.jzg.quotation.zhongan.crawler.service.ZhongAnCrawlerRequest;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.util.Base64;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -45,8 +56,16 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
 
     private final ZhongAnCrawlerOrderService zhongAnCrawlerOrderService;
 
+    private final ZhongAnCrawlerCacheComponent zhongAnCrawlerCacheComponent;
+
+    @Value("${zhongAn.id}")
+    private String zhongAnId;
+
+    private final PlatformClient platformClient;
+
     /**
      * 登录
+     *
      * @param loginBase 登录信息
      */
     @Override
@@ -62,38 +81,100 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
+        //登录众安
+        loginCookieCache(zhongAnId);
+        zhongAnCrawlerCacheComponent.setCache(quoteVo.getOwnersInfo().getIdentifyNumber(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.IDENTIFY_NUMBER);
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         //获取配置信息
         ZhongAnCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZhongAnCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername());
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
+        String flowId = parameters.getFlowId();
+        if (StringUtils.isEmpty(flowId)) {
+            parameters.setFlowId(zhongAnCrawlerCacheComponent.getFlowId(zhongAnId));
+        }
+        //校验key,缓存
+        ZhongAnCrawlerCacheInputRequest cacheInputRequest = new ZhongAnCrawlerCacheInputRequest(quoteVo, parameters);
+        String cacheInput = zhongAnCrawlerRequestComponent.CacheInput(cacheInputRequest, headers);
+
+        ZhongAnCrawlerInitDataRequest initDataRequest = new ZhongAnCrawlerInitDataRequest(parameters);
+        String initDataInfo = zhongAnCrawlerRequestComponent.initDataInfo(initDataRequest, headers);
+        //车架查询
+        ZhongAnCrawlerCarVinRequest carVinRequest = new ZhongAnCrawlerCarVinRequest(quoteVo, parameters);
+        String carVinQuery = zhongAnCrawlerRequestComponent.carVinQuery(carVinRequest, headers);
+
 
         //车型查询
         ZhongAnCrawlerCarQueryRequest carQueryRequest = new ZhongAnCrawlerCarQueryRequest(carInfoVo.getBrandName(), parameters);
         List<ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO> vehicleDTOList = zhongAnCrawlerRequestComponent.carQuery(carQueryRequest, headers);
         ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO vehicleDTO = CarModelsFilterUtils.to(vehicleDTOList, carInfoVo);
 
+        ZhongAnCrawlerQuerySpecialRequest querySpecialRequest = new ZhongAnCrawlerQuerySpecialRequest(quoteVo, parameters);
+        String querySpecial = zhongAnCrawlerRequestComponent.querySpecial(querySpecialRequest, headers);
+
+        ZhongAnCrawlerLicenseSwitchRequest licenseSwitchRequest = new ZhongAnCrawlerLicenseSwitchRequest(quoteVo, parameters);
+        String licenseSwitch = zhongAnCrawlerRequestComponent.licenseSwitch(licenseSwitchRequest, headers);
+
+
+        ZhongAnCrawlerCacheCarQueryRequest cacheCarQueryRequest = new ZhongAnCrawlerCacheCarQueryRequest(quoteVo, vehicleDTO, parameters);
+//        String cacheCarQueryResponse = zhongAnCrawlerRequestComponent.cacheCarInfo(cacheCarQueryRequest,headers);
+        ZhongAnCrawlerCacheCarQueryResponse cacheCarQueryResponse = zhongAnCrawlerRequestComponent.cacheCarInfo(cacheCarQueryRequest, headers);
+        if (cacheCarQueryResponse != null && StringUtils.isNotEmpty(cacheCarQueryResponse.getErrorMsg())) {
+            if (cacheCarQueryResponse.getErrorCode().equals("A12512")) {
+                ZhongAnCrawlerQueryDetailQueryRequest detailQueryRequest = new ZhongAnCrawlerQueryDetailQueryRequest(cacheCarQueryResponse, parameters);
+                ZhongAnCrawlerQueryDetailQueryResponse queryDetailQueryResponse = zhongAnCrawlerRequestComponent.detailQuery(detailQueryRequest, headers);
+
+                ZhongAnCrawlerQueryDetailQueryResponse.ValueDTO.DatasDTO.VehicleDetailInfoDTO vehicleDetailInfo = queryDetailQueryResponse.getValue().getDatas().getVehicleDetailInfo();
+                ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO vehicleDTO1 = BeanUtil.copyProperties(vehicleDetailInfo, ZhongAnCrawlerCarQueryResponse.ValueDTO.DataDTO.ResultDTO.VehicleDTO.class);
+
+                ZhongAnCrawlerCacheCarQueryRequest zhongAnCrawlerCacheCarQueryRequest = new ZhongAnCrawlerCacheCarQueryRequest(quoteVo, vehicleDTO1, parameters);
+                ZhongAnCrawlerCacheCarQueryResponse cacheCarQueryResponse1 = zhongAnCrawlerRequestComponent.cacheCarInfo(zhongAnCrawlerCacheCarQueryRequest, headers);
+                if (cacheCarQueryResponse1 != null && StringUtils.isNotEmpty(cacheCarQueryResponse1.getErrorMsg())) {
+                    throw new SystemException(cacheCarQueryResponse1.getErrorMsg());
+                }
+
+            } else {
+
+                throw new SystemException(cacheCarQueryResponse.getErrorMsg());
+            }
+        }
+
+        ZhongAnCrawlerQuoteBaseRequest quoteBaseRequest = new ZhongAnCrawlerQuoteBaseRequest(parameters);
+        ZhongAnCrawlerQuoteBaseResponse quoteBaseResponse = zhongAnCrawlerRequestComponent.quoteBaseInfo(quoteBaseRequest, headers);
+//        ZhongAnCrawlerQuoteBaseResponse zhongAnCrawlerQuoteBaseResponse = JsonUtil.readObjcet(str, ZhongAnCrawlerQuoteBaseResponse.class);
+
         //报价
-        ZhongAnCrawlerQuoteRequest quoteRequest = new ZhongAnCrawlerQuoteRequest(quoteVo, parameters);
+        ZhongAnCrawlerQuoteRequest quoteRequest = new ZhongAnCrawlerQuoteRequest(quoteVo, parameters, quoteBaseResponse);
         ZhongAnCrawlerQuoteResponse quoteResponse = zhongAnCrawlerRequestComponent.quote(quoteRequest, headers);
+        if (quoteResponse != null && StringUtils.isNotEmpty(quoteResponse.getErrorMsg())) {
+            throw new SystemException(quoteResponse.getErrorMsg());
+        }
 
         //确认报价
         ZhongAnCrawlerConfirmQuoteRequest confirmQuoteRequest = new ZhongAnCrawlerConfirmQuoteRequest(parameters);
-        zhongAnCrawlerRequestComponent.confirmQuote(confirmQuoteRequest, headers);
+        String s = zhongAnCrawlerRequestComponent.confirmQuote(confirmQuoteRequest, headers);
 
         //获取订单信息,需要获取quoteId
         ZhongAnCrawlerGetOrderRequest getOrderRequest = new ZhongAnCrawlerGetOrderRequest(parameters);
         ZhongAnCrawlerGetOrderResponse getOrderResponse = zhongAnCrawlerRequestComponent.getOrder(getOrderRequest, headers);
+        zhongAnCrawlerCacheComponent.setCache(getOrderResponse.getValue().getDatas().getQuoteId(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.QUOTE_ID);
 
         //确认订单
         ZhongAnCrawlerConfirmOrderRequest confirmOrderRequest = new ZhongAnCrawlerConfirmOrderRequest(parameters, quoteVo);
         ZhongAnCrawlerConfirmOrderResponse confirmOrderResponse = zhongAnCrawlerRequestComponent.confirmOrder(confirmOrderRequest, headers);
+        ZhongAnCrawlerConfirmOrderResponse.ValueDTO.DataDTO dataDTO = confirmOrderResponse.getValue().getDatas();
+        zhongAnCrawlerCacheComponent.setCache(dataDTO.getOrderNo(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.ORDER_NO);
+        zhongAnCrawlerCacheComponent.setCache(dataDTO.getPolicyId(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.POLICY_ID);
 
         //非车险提交核保
         ZhongAnCrawlerJyxUnderwritingRequest jyxUnderwritingRequest = new ZhongAnCrawlerJyxUnderwritingRequest(parameters, getOrderResponse.getValue().getDatas().getQuoteId());
         ZhongAnCrawlerJyxUnderwritingResponse jyxUnderwritingResponse = zhongAnCrawlerRequestComponent.jyxUnderwriting(jyxUnderwritingRequest, headers);
 
-        ZhongAnCrawlerConfirmOrderResponse.ValueDTO.DataDTO dataDTO = confirmOrderResponse.getValue().getDatas();
+        ZhongAnCrawlerUploadInitDateRequest zhongAnCrawlerUploadInitDateRequest = new ZhongAnCrawlerUploadInitDateRequest(dataDTO, parameters);
+        ZhongAnCrawlerUploadInitDateResponse uploadInitDateResponse = zhongAnCrawlerRequestComponent.uploadInitDate(zhongAnCrawlerUploadInitDateRequest, headers);
+        zhongAnCrawlerCacheComponent.setCache(uploadInitDateResponse.getValue().getDatas(), quoteVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.INITDATE);
+
+
         ZhongAnCrawlerOrder zhongAnCrawlerOrder = new ZhongAnCrawlerOrder();
         zhongAnCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
         zhongAnCrawlerOrder.setOrderNo(dataDTO.getOrderNo());
@@ -102,6 +183,66 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
         return ZhongAnCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, quoteResponse.getValue().getDatas());
     }
 
+    //登录
+    private void loginCookieCache(String zhongAnId) {
+        try {
+
+            Map<String, String> params = new HashMap<>();
+            params.put("partnerChannelCode", "m18x462r");
+            params.put("partnerUserAccount", zhongAnId);
+            params.put("partnerChildChannelCode", "");
+            params.put("promotionNo", "0c033ab79c6847c0878342480aef76a1");
+            params.put("productId", "10676");
+            params.put("policySource", "40");
+            params.put("subaoBizContent", "");
+            params.put("insurerCode", "ZHONGANCAR");
+
+
+            Map<String, String> headers = new HashMap<>();
+            headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36");
+            headers.put("Accept", "application/json, text/plain, */*");
+
+            // 发送第一个请求,不跟随重定向
+            String url = "https://www.cyouzai.com/busi-integration/channel/baoBiaoH5Redirect";
+            HttpURLConnection connection = HttpUtil.sendGetRequest(url, params, headers, false);
+            String firstLocation = connection.getHeaderField("Location");
+            connection.disconnect();
+
+            System.out.println(firstLocation);
+
+            // 发送第二个请求,不跟随重定向
+            connection = HttpUtil.sendGetRequest(firstLocation, null, headers, false);
+            String secondLocation = connection.getHeaderField("Location");
+            connection.disconnect();
+
+            // 发送第三个请求,不跟随重定向
+            connection = HttpUtil.sendGetRequest(secondLocation, null, headers, false);
+            Map<String, List<String>> responseHeaders = connection.getHeaderFields();
+            connection.disconnect();
+
+            // 提取zaLoginCookieKey
+            String zaLoginCookieKey = HttpUtil.extractZaLoginCookieKey(responseHeaders);
+            if (zaLoginCookieKey != null && !zaLoginCookieKey.isEmpty()) {
+                // 获取Location头
+                String thirdLocation = connection.getHeaderField("Location");
+
+                // 提取flowId
+                String flowId = HttpUtil.extractFlowId(thirdLocation);
+                //缓存数据
+                zhongAnCrawlerCacheComponent.cacheCookie(zaLoginCookieKey, flowId, zhongAnId);
+
+                System.out.println("key==" + zaLoginCookieKey + "------flowId=" + flowId);
+
+            } else {
+                throw new SystemException("未获取到-----zaLoginCookieKey");
+            }
+
+        } catch (Exception e) {
+            throw new SystemException("message", "请求发生错误: " + e.getMessage());
+        }
+
+    }
+
     /**
      * 提交核保 子订单
      *
@@ -109,7 +250,35 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      */
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
-        return null;
+        loginCookieCache(zhongAnId);
+        AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
+        ZhongAnCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZhongAnCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
+        String flowId = parameters.getFlowId();
+        if (StringUtils.isEmpty(flowId)) {
+            parameters.setFlowId(zhongAnCrawlerCacheComponent.getFlowId(zhongAnId));
+        }
+        String ordersNo = zhongAnCrawlerCacheComponent.getCache(underwritingVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.ORDER_NO);
+        ZhongAnCrawlerMarkRequest markRequest = new ZhongAnCrawlerMarkRequest(parameters, ordersNo);
+        String markCompleted = zhongAnCrawlerRequestComponent.markCompleted(markRequest, headers);
+
+        ZhongAnCrawlerOrder zhongAnCrawlerOrder = zhongAnCrawlerOrderService.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
+
+        ZhongAnCrawlerUploadInitDateResponse.ValueDTO.DatasDTO initData = zhongAnCrawlerCacheComponent.getInitData(underwritingVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.INITDATE);
+        ZhongAnCrawlerPaymentRequest paymentRequest = new ZhongAnCrawlerPaymentRequest(zhongAnCrawlerOrder.getPolicyId(), initData.getCheckCode());
+        ZhongAnCrawlerPaymentResponse payment = zhongAnCrawlerRequestComponent.payment(paymentRequest, headers);
+        zhongAnCrawlerCacheComponent.setCache(payment.getValue().getDatas().getInitInfo(),underwritingVo.getOrder().getOrdersNo()+ZhongAnCrawlerCacheComponent.PAYMENT);
+
+        UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+//        underwritingResultsVo.setPaymentLink(payment.getValue().getDatas().getShareShortUrl());
+        //核保结果
+        underwritingResultsVo.setUnderwritingResult("核保成功");
+//        //核保状态
+        underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+//        //保司订单号
+        underwritingResultsVo.setCompanyOrderNo(ordersNo);
+
+        return underwritingResultsVo;
     }
 
     /**
@@ -119,16 +288,20 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      */
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
+        loginCookieCache(zhongAnId);
+        PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
         OrderBase orderBase = paymentLinkVo.getOrder();
-        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         //获取配置信息
-        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername());
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
 
         ZhongAnCrawlerOrder zhongAnCrawlerOrder = zhongAnCrawlerOrderService.findByOrdersNo(orderBase.getOrdersNo());
-        
-        ZhongAnCrawlerPaymentRequest paymentRequest = new ZhongAnCrawlerPaymentRequest(zhongAnCrawlerOrder.getPolicyId());
+
+        ZhongAnCrawlerUploadInitDateResponse.ValueDTO.DatasDTO initData = zhongAnCrawlerCacheComponent.getInitData(orderBase.getOrdersNo() + ZhongAnCrawlerCacheComponent.INITDATE);
+        ZhongAnCrawlerPaymentRequest paymentRequest = new ZhongAnCrawlerPaymentRequest(zhongAnCrawlerOrder.getPolicyId(), initData.getCheckCode());
         ZhongAnCrawlerPaymentResponse payment = zhongAnCrawlerRequestComponent.payment(paymentRequest, headers);
-        return null;
+        paymentLinkResultsVo.setPaymentLink(payment.getValue().getDatas().getShareShortUrl());
+
+        return paymentLinkResultsVo;
     }
 
     /**
@@ -139,40 +312,71 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      * 行驶证副本			    7
      * 其他                 99
      * 还有通融申请流程的影像上传待处理
+     *
      * @param insuranceUploadImageVo
      */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        loginCookieCache(zhongAnId);
         OrderBase orderBase = insuranceUploadImageVo.getOrder();
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         //获取配置信息
         ZhongAnCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZhongAnCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername());
-
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
+        String flowId = parameters.getFlowId();
+        if (StringUtils.isEmpty(flowId)) {
+            parameters.setFlowId(zhongAnCrawlerCacheComponent.getFlowId(zhongAnId));
+        }
         ZhongAnCrawlerOrder zhongAnCrawlerOrder = zhongAnCrawlerOrderService.findByOrdersNo(orderBase.getOrdersNo());
         for (InsuranceImageVo insuranceImageVo : insuranceUploadImageVo.getImageVoList()) {
-            for (InsuranceImageVo.ImageDTO imageDTO: insuranceImageVo.getImageBase64List()) {
-                //根据参数,确定影像类型;暂时默认99
+            //C01行驶证正面,C02车主身份证正面,D01行驶证反面
+            if (insuranceImageVo.getImageCode().equals("C01")) {
+                String imageType = "6";
+                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+
+            } else if (insuranceImageVo.getImageCode().equals("C02")) {
+                String imageType = "4";
+                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+
+            } else if (insuranceImageVo.getImageCode().equals("D01")) {
+                String imageType = "7";
+                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+
+            } else if (insuranceImageVo.getImageCode().equals("D02")) {
+                String imageType = "5";
+                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+            } else {
                 String imageType = "99";
-                String imageBase64Str = imageDTO.getImageBase64Str();
-                byte[] imageBytes = Base64.getDecoder().decode(imageBase64Str);
-                //需要设置一个临时图片路径
-                FileOutputStream fileOutputStream = null;
-                String filePath = "图片临时路径";
-                try {
-                    fileOutputStream = new FileOutputStream(filePath);
-                    fileOutputStream.write(imageBytes);
-                    fileOutputStream.close();
-                } catch (FileNotFoundException e) {
-                    throw new RuntimeException(e);
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
+                List<InsuranceImageVo.ImageDTO> imageBase64List = insuranceImageVo.getImageBase64List();
+                for (InsuranceImageVo.ImageDTO imageDTO : imageBase64List) {
+                    extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
                 }
-                File file = new File(filePath);
-                ZhongAnCrawlerUploadImageRequest uploadImageRequest = new ZhongAnCrawlerUploadImageRequest(imageType, file, zhongAnCrawlerOrder.getOrderNo(), zhongAnCrawlerOrder.getPolicyId(), parameters);
-                ZhongAnCrawlerUploadImageResponse uploadImageResponse = zhongAnCrawlerRequestComponent.uploadImage(uploadImageRequest, headers);
             }
+
+        }
+    }
+
+
+    private void extracted(ZhongAnCrawlerConfigureParameters parameters, HttpHeaders headers, ZhongAnCrawlerOrder zhongAnCrawlerOrder, String imageType, InsuranceImageVo.ImageDTO imageDTO) {
+        ZhongAnCrawlerUploadImageRequest uploadImageRequest = new ZhongAnCrawlerUploadImageRequest(imageType, imageDTO, zhongAnCrawlerOrder.getOrderNo(), zhongAnCrawlerOrder.getPolicyId(), parameters);
+        ZhongAnCrawlerUploadImageResponse uploadImageResponse = zhongAnCrawlerRequestComponent.uploadImage(uploadImageRequest, headers);
+        if (uploadImageResponse != null && StringUtils.isNotEmpty(uploadImageResponse.getErrorMsg())) {
+            throw new SystemException(uploadImageResponse.getErrorMsg());
+        }
+
+    }
+
+    public  byte[] convert(String filePath) throws IOException {
+        File file = new File(filePath);
+        byte[] binaryData = new byte[(int) file.length()];
+        try (FileInputStream fis = new FileInputStream(file)) {
+            fis.read(binaryData); // 读取全部字节到数组
         }
+        return binaryData;
     }
 
     /**
@@ -182,10 +386,11 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      */
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
+        loginCookieCache(zhongAnId);
         OrderBase orderBase = downloadPolicyVo.getOrder();
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         //获取配置信息
-        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername());
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
 
         ZhongAnCrawlerOrder zhongAnCrawlerOrder = zhongAnCrawlerOrderService.findByOrdersNo(orderBase.getOrdersNo());
         String orderNo = zhongAnCrawlerOrder.getOrderNo();
@@ -233,6 +438,22 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
      */
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws JsonProcessingException {
-        return null;
+        loginCookieCache(zhongAnId);
+        AttributionInformationVo attributionInformationVo = orderStatusVo.getOrder().getAttributionInformationVo();
+        //获取配置信息
+        ZhongAnCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZhongAnCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        HttpHeaders headers = zhongAnCrawlerRequestComponent.getHeaders(zhongAnId);
+        String flowId = parameters.getFlowId();
+        if (StringUtils.isEmpty(flowId)) {
+            parameters.setFlowId(zhongAnCrawlerCacheComponent.getFlowId(zhongAnId));
+        }
+
+        ZhongAnCrawlerPaymentResponse.ValueDTO.DatasDTO.InitInfoDTO payment = zhongAnCrawlerCacheComponent.getPayment(orderStatusVo.getOrder().getOrdersNo() + ZhongAnCrawlerCacheComponent.PAYMENT);
+        ZhongAnCrawlerPolicyListRequest policyListRequest = new ZhongAnCrawlerPolicyListRequest(payment.getVehicleName(),parameters);
+        String s = zhongAnCrawlerRequestComponent.policyList(policyListRequest,headers);
+
+        OrderStatusResultVo orderStatusResultVo= new OrderStatusResultVo();
+
+        return orderStatusResultVo;
     }
 }

+ 5 - 3
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysAmountAuditingServiceImpl.java

@@ -25,6 +25,7 @@ import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.Objects;
@@ -125,6 +126,7 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void verifyAmount(AmountAuditEditParam param) {
         SysAmountAuditing audit = this.getById(param.getId());
         if(audit.getAuditingStatus() > 0){
@@ -152,9 +154,9 @@ public class SysAmountAuditingServiceImpl extends ServiceImpl<SysAmountAuditingM
                 // 更新用户账户
                 SysUserAccount userAccount = userAccountService.queryByUserId(audit.getUserId());
                 AssertionUtils.isFail(Objects.isNull(userAccount), "用户账户数据异常!");
-                AssertionUtils.isFail(audit.getAmount().compareTo(userAccount.getSumAmountUnpaid()) > 0, "提现金额大于账户余额!");
-                userAccount.setSumAmountPaid(audit.getAmount());
-                userAccount.setSumAmountUnpaid(userAccount.getSumAmountUnpaid().add(audit.getAmount()));
+                AssertionUtils.isFail(audit.getAmount().compareTo(audit.getBalanceAmount()) > 0, "提现金额大于账户余额!");
+                userAccount.setSumAmountPaid(userAccount.getSumAmountPaid().add(audit.getAmount()));
+                userAccount.setSumAmountUnpaid(userAccount.getSumAmountUnpaid().subtract(audit.getAmount()));
                 userAccountService.saveOrUpdate(userAccount);
             }else{
                 AssertionUtils.isFail(true, "提现申请已被" + audit.getReceiveUser() + "领取!");

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/state/AuditState.java

@@ -8,7 +8,7 @@ public class AuditState {
         // 审核通过
         SUCCESS_AUDIT(1),
         // 审核失败
-        FAIL_AUDIT(1);
+        FAIL_AUDIT(2);
 
         private final int value;
 

+ 8 - 7
tenant/organization/src/main/java/com/jzg/organization/state/listener/AuditStateListener.java

@@ -4,6 +4,7 @@ import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.organization.state.AuditState;
 import jakarta.annotation.Resource;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.support.MessageBuilder;
 import org.springframework.statemachine.StateMachine;
@@ -19,15 +20,15 @@ import java.util.concurrent.atomic.AtomicBoolean;
 public class AuditStateListener {
 
     @Resource
-    private StateMachine<AuditState.AuditStateEnum, AuditState.AuditStateEvent> costStateMachine;
+    private StateMachine<AuditState.AuditStateEnum, AuditState.AuditStateEvent> auditStateMachine;
 
     private synchronized boolean sendEvent(Mono<Message<AuditState.AuditStateEvent>> message) {
         AtomicBoolean result = new AtomicBoolean(false);
         try {
-            costStateMachine.stop(); // 停止状态机
+            auditStateMachine.stop(); // 停止状态机
             Message<AuditState.AuditStateEvent> block = message.block();
             String orderStatus = (String) block.getHeaders().get("entity");
-            costStateMachine.getStateMachineAccessor().doWithAllRegions(accessor -> {
+            auditStateMachine.getStateMachineAccessor().doWithAllRegions(accessor -> {
                 accessor.resetStateMachineReactively(new DefaultStateMachineContext<>(
                         // 目标状态
                         AuditState.AuditStateEnum.fromValue(Integer.parseInt(orderStatus)),
@@ -36,10 +37,10 @@ public class AuditStateListener {
                         null  // 转换历史(通常为 null)
                 )).block();
             });
-            Mono<Void> startMono = costStateMachine.startReactively(); //启用状态机
+            Mono<Void> startMono = auditStateMachine.startReactively(); //启用状态机
             startMono.block();
 
-            Flux<StateMachineEventResult<AuditState.AuditStateEnum, AuditState.AuditStateEvent>> stateMachineEventResultFlux = costStateMachine.sendEvent(message);
+            Flux<StateMachineEventResult<AuditState.AuditStateEnum, AuditState.AuditStateEvent>> stateMachineEventResultFlux = auditStateMachine.sendEvent(message);
             StateMachineEventResult<AuditState.AuditStateEnum, AuditState.AuditStateEvent> eventResult = stateMachineEventResultFlux.blockFirst();
 
             if (eventResult != null && eventResult.getResultType() == StateMachineEventResult.ResultType.ACCEPTED) {
@@ -48,7 +49,7 @@ public class AuditStateListener {
         } catch (Exception e) {
 
         } finally {
-            costStateMachine.stopReactively();
+            auditStateMachine.stopReactively();
             return result.get();
         }
     }
@@ -57,7 +58,7 @@ public class AuditStateListener {
         StateResult stateResult = new StateResult();
         Mono<Message<AuditState.AuditStateEvent>> message = Mono.just(MessageBuilder.withPayload(event).setHeader("entity",auditStatus).build());
         stateResult.setResult(sendEvent(message));
-        stateResult.setCurrentState(costStateMachine.getState().getId().getValue());
+        stateResult.setCurrentState(auditStateMachine.getState().getId().getValue());
         return stateResult;
     }
 

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

@@ -83,6 +83,7 @@ tenant:
     - ins_ply_income
     - ins_ply_income_invoice
     - ins_ply_income_invoice_settlement
+    - sys_user_account
 
 
   ignoreLoginNames:

+ 2 - 2
tenant/organization/src/main/resources/mapper/SysUserAccountMapper.xml

@@ -54,7 +54,7 @@
         sys_user_account sua
         LEFT JOIN sys_user_jzg_info suji on suji.user_id = sua.user_id
         LEFT JOIN sys_user su on su.id = suji.user_id
-        LEFT JOIN sys_dept sd on sd.id = shji.dept_id
+        LEFT JOIN sys_dept sd on sd.id = suji.dept_id
         LEFT JOIN sys_organization_user_link soul on soul.user_id = suji.user_id
         LEFT JOIN sys_organization so on soul.organization_id = so.id
         <where>
@@ -68,6 +68,6 @@
                 and DATE_FORMAT(sua.create_time, '%Y-%m-%d') between #{param.createTimeStart} AND #{param.createTimeEnd}
             </if>
         </where>
-        ORDER BY sua create_time desc
+        ORDER BY sua.create_time desc
     </select>
 </mapper>

Some files were not shown because too many files changed in this diff