Bläddra i källkod

Merge remote-tracking branch 'refs/remotes/origin/master' into dev_jzg_lipf_v20260518

lipf 4 månader sedan
förälder
incheckning
1458257d4a
13 ändrade filer med 1335 tillägg och 21 borttagningar
  1. 1 0
      gateway/src/main/java/com/jzg/config/CorsConfig.java
  2. 3 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java
  3. 4 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  4. 17 3
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  5. 4 2
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanDuplicateInsuranceComponents.java
  6. 6 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java
  7. 2 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerImageUploadRequest.java
  8. 34 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerRiskManagementRequest.java
  9. 1200 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerRiskManagementResponse.java
  10. 1 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerOrderServiceImpl.java
  11. 40 3
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java
  12. 9 4
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/service/impl/YangGuangApiRequestImpl.java
  13. 14 3
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java

+ 1 - 0
gateway/src/main/java/com/jzg/config/CorsConfig.java

@@ -42,6 +42,7 @@ public class CorsConfig {
         corsConfiguration.addAllowedOrigin("http://192.168.0.20:81");
         corsConfiguration.addAllowedOrigin("http://192.168.0.59:9000");
         corsConfiguration.addAllowedOrigin("http://192.168.1.61:9000");
+        corsConfiguration.addAllowedOrigin("http://192.168.1.159:9000");
         // 允许的方法
         corsConfiguration.addAllowedMethod("*");
         // 允许的头信息

+ 3 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java

@@ -32,7 +32,9 @@ public class AsyncGetPayLink {
     @Async("asyncTaskExecutor")
     public void paymentLink(QuotationBaseService quoteService,OrderBase order, String companyCode ){
         try {
-            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)){
+            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
+                    || StringUtils.equals(CompanyConstants.TSBX.getCompanyCode(),companyCode)
+            ){
                 PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
                 paymentLinkVo.setOrder(order);
                 CompletableFuture<PaymentLinkResultsVo> future = CompletableFuture.completedFuture(doUpdatePaymentLink(paymentLinkVo, quoteService));

+ 4 - 4
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -779,10 +779,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 ordersCosts.setOrderNo(ordersNo);
             }
             if (BeanUtil.isNotEmpty(quoteResponse) && BeanUtil.isNotEmpty(quoteResponse.getCosts())) {
-                BigDecimal ciPremium = quoteResponse.getCosts().getCiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getCiPremium());
-                BigDecimal biPremium = quoteResponse.getCosts().getBiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getBiPremium());
-                BigDecimal niPremium = quoteResponse.getCosts().getNiPremium() == null ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getNiPremium());
-                BigDecimal vvTax = new BigDecimal(quoteResponse.getCosts().getVvTax());
+                BigDecimal ciPremium = quoteResponse.getCosts().getCiPremium() == null || quoteResponse.getCosts().getCiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getCiPremium());
+                BigDecimal biPremium = quoteResponse.getCosts().getBiPremium() == null || quoteResponse.getCosts().getBiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getBiPremium());
+                BigDecimal niPremium = quoteResponse.getCosts().getNiPremium() == null || quoteResponse.getCosts().getNiPremium().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getNiPremium());
+                BigDecimal vvTax = quoteResponse.getCosts().getVvTax() == null || quoteResponse.getCosts().getVvTax().isEmpty() ? new BigDecimal("0.00") : new BigDecimal(quoteResponse.getCosts().getVvTax());
                 ordersCosts.setJqPremium(ciPremium);
                 ordersCosts.setSyPremium(biPremium);
                 ordersCosts.setJyPremium(niPremium);

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

@@ -1,5 +1,6 @@
 package com.jzg.quotation.taishan.crawler.component;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.taishan.crawler.constant.enums.RequestUrl;
@@ -239,7 +240,7 @@ public class TaiShanCrawlerRequestComponent {
      * @return TaiShanCrawlerUnderwritingResponse
      */
     public TaiShanCrawlerUnderwritingResponse underwriting(TaiShanCrawlerUnderwritingRequest request, HttpHeaders headers) {
-        TaiShanCrawlerUnderwritingResponse response = get(RequestUrl.UNDERWRITING, request, TaiShanCrawlerUnderwritingResponse.class, headers,null);
+        TaiShanCrawlerUnderwritingResponse response = get(RequestUrl.UNDERWRITING, request, TaiShanCrawlerUnderwritingResponse.class, headers,"");
         return response;
     }
 
@@ -264,7 +265,20 @@ public class TaiShanCrawlerRequestComponent {
      * @return TaiShanCrawlerPaymentCardResponse
      */
     public TaiShanCrawlerPaymentCardResponse getPaymentCard(TaiShanCrawlerPaymentCardRequest request, HttpHeaders headers) {
-        TaiShanCrawlerPaymentCardResponse response = get(RequestUrl.UNDERWRITING, request, TaiShanCrawlerPaymentCardResponse.class, headers,null);
+        TaiShanCrawlerPaymentCardResponse response = get(RequestUrl.PAYMENT_CARD, request, TaiShanCrawlerPaymentCardResponse.class, headers,"");
+        return response;
+    }
+
+
+    /**
+     * 风险管控
+     *
+     * @param request
+     * @param headers
+     * @return TaiShanCrawlerRiskManagementResponse
+     */
+    public TaiShanCrawlerRiskManagementResponse getRiskManagement(TaiShanCrawlerRiskManagementRequest request, HttpHeaders headers) {
+        TaiShanCrawlerRiskManagementResponse response = get(RequestUrl.RISK_MANAGEMENT, request, TaiShanCrawlerRiskManagementResponse.class, headers,"");
         return response;
     }
 
@@ -310,7 +324,7 @@ public class TaiShanCrawlerRequestComponent {
      * @return
      */
     public TaiShanCrawlerPaymentInfoResponse getPayInfo(TaiShanCrawlerPaymentInfoRequest paymentInfoRequest, HttpHeaders headers) {
-        TaiShanCrawlerPaymentInfoResponse response = get(RequestUrl.PAYMENT_INFO, paymentInfoRequest, TaiShanCrawlerPaymentInfoResponse.class, headers,null);
+        TaiShanCrawlerPaymentInfoResponse response = get(RequestUrl.PAYMENT_INFO, paymentInfoRequest, TaiShanCrawlerPaymentInfoResponse.class, headers,"");
         return response;
     }
 

+ 4 - 2
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanDuplicateInsuranceComponents.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.taishan.crawler.component;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.taishan.crawler.constant.enums.ResultEnum;
@@ -40,6 +41,7 @@ public class TaiShanDuplicateInsuranceComponents extends ResponseMessageAbstract
 
     @Override
     public TaiShanCrawlerQuotationResponse messageHandler(TaiShanCrawlerQuotationRequest request, TaiShanCrawlerQuotationResponse response, HttpHeaders headers, int repeatNumber) {
+        log.info("response参数的值:{}", JSON.toJSONString(response));
         TaiShanCrawlerQuotationResponse.ResultDTO.ExceptionDTO exception = response.getResult().getException();
         log.info("{}\n\t---------> {}", "泰山财险重复投保处理", exception.getMsg());
         String errMsg = exception.getMsg();
@@ -63,7 +65,7 @@ public class TaiShanDuplicateInsuranceComponents extends ResponseMessageAbstract
                 lastEndDate = getTheExpiryDate(reMark, THE_SY_FIRST_REGEX);
 
             }
-            if(StringUtils.isBlank(lastEndDate)){
+            if(StringUtils.isNotBlank(lastEndDate)){
                 DateTimeFormatter formatter =
                         DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                 LocalDateTime timeObj =
@@ -90,7 +92,7 @@ public class TaiShanDuplicateInsuranceComponents extends ResponseMessageAbstract
                 lastEndDate = getTheExpiryDate(reMark, THE_JQ_FIRST_REGEX);
 
             }
-            if(StringUtils.isBlank(lastEndDate)){
+            if(StringUtils.isNotBlank(lastEndDate)){
                 DateTimeFormatter formatter =
                         DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                 LocalDateTime timeObj =

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

@@ -31,6 +31,9 @@ public enum RequestUrl {
     PAYMENT_INFO("/api_prod/insurance/api/pay/info", "获取支付信息"),
     PAYMENT_CARD("/api_prod/insurance/api/pay/payment_card", "获取交易单号"),
 
+    //风险管控
+    RISK_MANAGEMENT("/api_prod/ins/api/proposal/riskmanagement", "风险管控"),
+
     // 查询订单
     QUERY_ORDER_STATUS("/api_prod/insurance/api/order/list", "查询订单状态"),
 
@@ -46,6 +49,9 @@ public enum RequestUrl {
     }
 
     public String getRequestUrl(String baseUrl) {
+        if (baseUrl != null && baseUrl.endsWith("/") && url != null && url.startsWith("/")) {
+            return baseUrl + url.substring(1);
+        }
         return baseUrl + url;
     }
 

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

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -111,6 +112,7 @@ public class TaiShanCrawlerImageUploadRequest implements Serializable {
      * 包含图片的文件名和二进制数据
      */
     @Data
+    @NoArgsConstructor
     @AllArgsConstructor
     public static class ImageInfo implements Serializable {
         @Serial

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

@@ -0,0 +1,34 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+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;
+
+/**
+ * @description: 泰山财险爬虫风险管控请求实体类
+ * @author:
+ * @date:
+ **/
+@Data
+@NoArgsConstructor
+public class TaiShanCrawlerRiskManagementRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2190496123695048040L;
+
+    /**
+     * 投保单号
+     */
+    @JsonProperty("proposalNo")
+    @JSONField(name = "proposalNo", ordinal = 1)
+    private String proposalNo;
+
+    public TaiShanCrawlerRiskManagementRequest(String proposalNo) {
+        this.proposalNo = proposalNo;
+    }
+}

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

@@ -0,0 +1,1200 @@
+package com.jzg.quotation.taishan.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;
+
+/**
+ * @description: 泰山财险爬虫风险管控响应实体
+ * 用于接收风险管控接口的响应数据
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerRiskManagementResponse implements Serializable, TaiShanCrawlerBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -2190496123695048030L;
+
+    /**
+     * 响应状态码:200=成功
+     */
+    @JsonProperty("code")
+    @JSONField(name = "code", ordinal = 1)
+    private String code;
+
+    /**
+     * 响应消息:请求处理结果
+     */
+    @JsonProperty("message")
+    @JSONField(name = "message", ordinal = 2)
+    private String message;
+
+    /**
+     * 响应结果数据
+     */
+    @JsonProperty("result")
+    @JSONField(name = "result", ordinal = 3)
+    private Result result;
+
+    /**
+     * 结果数据内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class Result implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048031L;
+
+        /**
+         * 平台评分
+         */
+        @JsonProperty("ptScore")
+        @JSONField(name = "ptScore", ordinal = 1)
+        private String ptScore;
+
+        /**
+         * 泰山评分
+         */
+        @JsonProperty("tsScore")
+        @JSONField(name = "tsScore", ordinal = 2)
+        private String tsScore;
+
+        /**
+         * CHD等级
+         */
+        @JsonProperty("chdGrade")
+        @JSONField(name = "chdGrade", ordinal = 3)
+        private String chdGrade;
+
+        /**
+         * 里程评分
+         */
+        @JsonProperty("mileageScore")
+        @JSONField(name = "mileageScore", ordinal = 4)
+        private String mileageScore;
+
+        /**
+         * 整体精算折扣
+         */
+        @JsonProperty("entireActuaryDiscount")
+        @JSONField(name = "entireActuaryDiscount", ordinal = 5)
+        private String entireActuaryDiscount;
+
+        /**
+         * 经验比率
+         */
+        @JsonProperty("exRatio")
+        @JSONField(name = "exRatio", ordinal = 6)
+        private String exRatio;
+
+        /**
+         * 商业综合评分
+         */
+        @JsonProperty("comPoints")
+        @JSONField(name = "comPoints", ordinal = 7)
+        private String comPoints;
+
+        /**
+         * 全国驾驶评分
+         */
+        @JsonProperty("driveCountryScore")
+        @JSONField(name = "driveCountryScore", ordinal = 8)
+        private String driveCountryScore;
+
+        /**
+         * 省内驾驶评分
+         */
+        @JsonProperty("driveProvinceScore")
+        @JSONField(name = "driveProvinceScore", ordinal = 9)
+        private String driveProvinceScore;
+
+        /**
+         * 网络标识
+         */
+        @JsonProperty("netWorkFlag")
+        @JSONField(name = "netWorkFlag", ordinal = 10)
+        private String netWorkFlag;
+
+        /**
+         * 商业25年保费
+         */
+        @JsonProperty("syPrm25")
+        @JSONField(name = "syPrm25", ordinal = 11)
+        private String syPrm25;
+
+        /**
+         * 交强25年保费
+         */
+        @JsonProperty("jqPrm25")
+        @JSONField(name = "jqPrm25", ordinal = 12)
+        private String jqPrm25;
+
+        /**
+         * 泰山预测
+         */
+        @JsonProperty("tsForeCast")
+        @JSONField(name = "tsForeCast", ordinal = 13)
+        private String tsForeCast;
+
+        /**
+         * 续保等级
+         */
+        @JsonProperty("renewalClass")
+        @JSONField(name = "renewalClass", ordinal = 14)
+        private String renewalClass;
+
+        /**
+         * 描述
+         */
+        @JsonProperty("desc")
+        @JSONField(name = "desc", ordinal = 15)
+        private String desc;
+
+        /**
+         * 是否有评分
+         */
+        @JsonProperty("yesornoScore")
+        @JSONField(name = "yesornoScore", ordinal = 16)
+        private String yesornoScore;
+
+        /**
+         * 状态
+         */
+        @JsonProperty("status")
+        @JSONField(name = "status", ordinal = 17)
+        private String status;
+
+        /**
+         * 全险种评分
+         */
+        @JsonProperty("fullCoverageScore")
+        @JSONField(name = "fullCoverageScore", ordinal = 18)
+        private String fullCoverageScore;
+
+        /**
+         * 商业险评分
+         */
+        @JsonProperty("liabilityOnlyScore")
+        @JSONField(name = "liabilityOnlyScore", ordinal = 19)
+        private String liabilityOnlyScore;
+
+        /**
+         * 交强险评分
+         */
+        @JsonProperty("ctpOnlyScore")
+        @JSONField(name = "ctpOnlyScore", ordinal = 20)
+        private String ctpOnlyScore;
+
+        /**
+         * 月份
+         */
+        @JsonProperty("month")
+        @JSONField(name = "month", ordinal = 21)
+        private String month;
+
+        /**
+         * 风险等级
+         */
+        @JsonProperty("riskLevel")
+        @JSONField(name = "riskLevel", ordinal = 22)
+        private String riskLevel;
+
+        /**
+         * 创建时间
+         */
+        @JsonProperty("crtTm")
+        @JSONField(name = "crtTm", ordinal = 23)
+        private String crtTm;
+
+        /**
+         * 因子
+         */
+        @JsonProperty("factor")
+        @JSONField(name = "factor", ordinal = 24)
+        private String factor;
+
+        /**
+         * 核保因子
+         */
+        @JsonProperty("underWriteFactor")
+        @JSONField(name = "underWriteFactor", ordinal = 25)
+        private String underWriteFactor;
+
+        /**
+         * 是否来自APP
+         */
+        @JsonProperty("isFromApps")
+        @JSONField(name = "isFromApps", ordinal = 26)
+        private String isFromApps;
+
+        /**
+         * P值等级
+         */
+        @JsonProperty("pvalue")
+        @JSONField(name = "pvalue", ordinal = 27)
+        private String pvalue;
+
+        /**
+         * 里程节点评分
+         */
+        @JsonProperty("milepostScore")
+        @JSONField(name = "milepostScore", ordinal = 28)
+        private String milepostScore;
+
+        /**
+         * 创建时间戳
+         */
+        @JsonProperty("crtTms")
+        @JSONField(name = "crtTms", ordinal = 29)
+        private String crtTms;
+
+        /**
+         * C档位
+         */
+        @JsonProperty("ctranche")
+        @JSONField(name = "ctranche", ordinal = 30)
+        private String ctranche;
+
+        /**
+         * C里程节点评分
+         */
+        @JsonProperty("cmilepostScore")
+        @JSONField(name = "cmilepostScore", ordinal = 31)
+        private String cmilepostScore;
+
+        /**
+         * 交易创建时间
+         */
+        @JsonProperty("tcrtTm")
+        @JSONField(name = "tcrtTm", ordinal = 32)
+        private String tcrtTm;
+
+        /**
+         * 里程节点标识
+         */
+        @JsonProperty("milepostFlag")
+        @JSONField(name = "milepostFlag", ordinal = 33)
+        private String milepostFlag;
+
+        /**
+         * 交强基准ELR1
+         */
+        @JsonProperty("billCtpElr1")
+        @JSONField(name = "billCtpElr1", ordinal = 34)
+        private String billCtpElr1;
+
+        /**
+         * 商业基准ELR1
+         */
+        @JsonProperty("billComElr1")
+        @JSONField(name = "billComElr1", ordinal = 35)
+        private String billComElr1;
+
+        /**
+         * 基准ELR1
+         */
+        @JsonProperty("billElr1")
+        @JSONField(name = "billElr1", ordinal = 36)
+        private String billElr1;
+
+        /**
+         * 数量
+         */
+        @JsonProperty("count")
+        @JSONField(name = "count", ordinal = 37)
+        private String count;
+
+        /**
+         * 数量时间
+         */
+        @JsonProperty("countTm")
+        @JSONField(name = "countTm", ordinal = 38)
+        private String countTm;
+
+        /**
+         * 评分
+         */
+        @JsonProperty("score")
+        @JSONField(name = "score", ordinal = 39)
+        private String score;
+
+        /**
+         * 评分等级
+         */
+        @JsonProperty("scoreLevel")
+        @JSONField(name = "scoreLevel", ordinal = 40)
+        private String scoreLevel;
+
+        /**
+         * T100评分
+         */
+        @JsonProperty("t100Score")
+        @JSONField(name = "t100Score", ordinal = 41)
+        private String t100Score;
+
+        /**
+         * 动态风险评分
+         */
+        @JsonProperty("dynamicRiskScore")
+        @JSONField(name = "dynamicRiskScore", ordinal = 42)
+        private String dynamicRiskScore;
+
+        /**
+         * 静态风险评分
+         */
+        @JsonProperty("staticRiskScore")
+        @JSONField(name = "staticRiskScore", ordinal = 43)
+        private String staticRiskScore;
+
+        /**
+         * 静态评分等级
+         */
+        @JsonProperty("staticScoreLevel")
+        @JSONField(name = "staticScoreLevel", ordinal = 44)
+        private String staticScoreLevel;
+
+        /**
+         * 动态评分等级
+         */
+        @JsonProperty("dynamicScoreLevel")
+        @JSONField(name = "dynamicScoreLevel", ordinal = 45)
+        private String dynamicScoreLevel;
+
+        /**
+         * 费用
+         */
+        @JsonProperty("fee")
+        @JSONField(name = "fee", ordinal = 46)
+        private String fee;
+
+        /**
+         * 商业赔付率BZ
+         */
+        @JsonProperty("lossRatioBz")
+        @JSONField(name = "lossRatioBz", ordinal = 47)
+        private String lossRatioBz;
+
+        /**
+         * 商业赔付率BZB
+         */
+        @JsonProperty("lossRatioBzb")
+        @JSONField(name = "lossRatioBzb", ordinal = 48)
+        private String lossRatioBzb;
+
+        /**
+         * 赔付率B
+         */
+        @JsonProperty("lossRatioB")
+        @JSONField(name = "lossRatioB", ordinal = 49)
+        private String lossRatioB;
+
+        /**
+         * 赔付率BA
+         */
+        @JsonProperty("lossRatioBa")
+        @JSONField(name = "lossRatioBa", ordinal = 50)
+        private String lossRatioBa;
+
+        /**
+         * 综合赔付率
+         */
+        @JsonProperty("lossRatioAll")
+        @JSONField(name = "lossRatioAll", ordinal = 51)
+        private String lossRatioAll;
+
+        /**
+         * 交强基准赔付率
+         */
+        @JsonProperty("ctpBaselr")
+        @JSONField(name = "ctpBaselr", ordinal = 52)
+        private String ctpBaselr;
+
+        /**
+         * 交强三责基准赔付率
+         */
+        @JsonProperty("ctptpBaselr")
+        @JSONField(name = "ctptpBaselr", ordinal = 53)
+        private String ctptpBaselr;
+
+        /**
+         * 交强三责人伤基准赔付率
+         */
+        @JsonProperty("ctptpodBaselr")
+        @JSONField(name = "ctptpodBaselr", ordinal = 54)
+        private String ctptpodBaselr;
+
+        /**
+         * 三责基准赔付率
+         */
+        @JsonProperty("tpBaselr")
+        @JSONField(name = "tpBaselr", ordinal = 55)
+        private String tpBaselr;
+
+        /**
+         * 三责人伤基准赔付率
+         */
+        @JsonProperty("tpodBaselr")
+        @JSONField(name = "tpodBaselr", ordinal = 56)
+        private String tpodBaselr;
+
+        /**
+         * 风险预警
+         */
+        @JsonProperty("riskWarning")
+        @JSONField(name = "riskWarning", ordinal = 57)
+        private String riskWarning;
+
+        /**
+         * 高风险名单
+         */
+        @JsonProperty("highRiskList")
+        @JSONField(name = "highRiskList", ordinal = 58)
+        private String highRiskList;
+
+        /**
+         * 高速标识
+         */
+        @JsonProperty("highwayFlag")
+        @JSONField(name = "highwayFlag", ordinal = 59)
+        private String highwayFlag;
+
+        /**
+         * 预测性质
+         */
+        @JsonProperty("predictedNature")
+        @JSONField(name = "predictedNature", ordinal = 60)
+        private String predictedNature;
+
+        /**
+         * 日均活跃里程
+         */
+        @JsonProperty("activedailyMileavg")
+        @JSONField(name = "activedailyMileavg", ordinal = 61)
+        private String activedailyMileavg;
+
+        /**
+         * 平均速度
+         */
+        @JsonProperty("speedavg")
+        @JSONField(name = "speedavg", ordinal = 62)
+        private String speedavg;
+
+        /**
+         * 每日活跃次数
+         */
+        @JsonProperty("timesPerActiveday")
+        @JSONField(name = "timesPerActiveday", ordinal = 63)
+        private String timesPerActiveday;
+
+        /**
+         * 特殊容量标识
+         */
+        @JsonProperty("specCapFlag")
+        @JSONField(name = "specCapFlag", ordinal = 64)
+        private String specCapFlag;
+
+        /**
+         * 过夜频率
+         */
+        @JsonProperty("overnightFreq")
+        @JSONField(name = "overnightFreq", ordinal = 65)
+        private String overnightFreq;
+
+        /**
+         * 品牌组
+         */
+        @JsonProperty("brandGroup")
+        @JSONField(name = "brandGroup", ordinal = 66)
+        private String brandGroup;
+
+        /**
+         * 维度列表
+         */
+        @JsonProperty("dimensionList")
+        @JSONField(name = "dimensionList", ordinal = 67)
+        private List<DimensionItem> dimensionList;
+
+        /**
+         * 车辆容量
+         */
+        @JsonProperty("vehicleCapacity")
+        @JSONField(name = "vehicleCapacity", ordinal = 68)
+        private String vehicleCapacity;
+
+        /**
+         * 品牌
+         */
+        @JsonProperty("brand")
+        @JSONField(name = "brand", ordinal = 69)
+        private String brand;
+
+        /**
+         * 燃料类型
+         */
+        @JsonProperty("fuelType")
+        @JSONField(name = "fuelType", ordinal = 70)
+        private String fuelType;
+
+        /**
+         * 车辆结构
+         */
+        @JsonProperty("structure")
+        @JSONField(name = "structure", ordinal = 71)
+        private String structure;
+
+        /**
+         * 排量
+         */
+        @JsonProperty("sweptVolume")
+        @JSONField(name = "sweptVolume", ordinal = 72)
+        private String sweptVolume;
+
+        /**
+         * 车长
+         */
+        @JsonProperty("vehicleLength")
+        @JSONField(name = "vehicleLength", ordinal = 73)
+        private String vehicleLength;
+
+        /**
+         * 车宽
+         */
+        @JsonProperty("vehicleWidth")
+        @JSONField(name = "vehicleWidth", ordinal = 74)
+        private String vehicleWidth;
+
+        /**
+         * 车高
+         */
+        @JsonProperty("vehicleHeight")
+        @JSONField(name = "vehicleHeight", ordinal = 75)
+        private String vehicleHeight;
+
+        /**
+         * 车龄
+         */
+        @JsonProperty("vehicleAge")
+        @JSONField(name = "vehicleAge", ordinal = 76)
+        private String vehicleAge;
+
+        /**
+         * 额定功率
+         */
+        @JsonProperty("ratedPower")
+        @JSONField(name = "ratedPower", ordinal = 77)
+        private String ratedPower;
+
+        /**
+         * 品牌系列
+         */
+        @JsonProperty("brandSeries")
+        @JSONField(name = "brandSeries", ordinal = 78)
+        private String brandSeries;
+
+        /**
+         * 年度里程
+         */
+        @JsonProperty("mileageAnnual")
+        @JSONField(name = "mileageAnnual", ordinal = 79)
+        private String mileageAnnual;
+
+        /**
+         * 年度行驶时长
+         */
+        @JsonProperty("drivingtimeAnnual")
+        @JSONField(name = "drivingtimeAnnual", ordinal = 80)
+        private String drivingtimeAnnual;
+
+        /**
+         * 年度活跃天数
+         */
+        @JsonProperty("activedaysAnnual")
+        @JSONField(name = "activedaysAnnual", ordinal = 81)
+        private String activedaysAnnual;
+
+        /**
+         * 年度次数
+         */
+        @JsonProperty("timesAnnual")
+        @JSONField(name = "timesAnnual", ordinal = 82)
+        private String timesAnnual;
+
+        /**
+         * 日均活跃里程均值
+         */
+        @JsonProperty("activedailyMileageAvg")
+        @JSONField(name = "activedailyMileageAvg", ordinal = 83)
+        private String activedailyMileageAvg;
+
+        /**
+         * 日均活跃时长均值
+         */
+        @JsonProperty("activedailyDurationAvg")
+        @JSONField(name = "activedailyDurationAvg", ordinal = 84)
+        private String activedailyDurationAvg;
+
+        /**
+         * 里程均值
+         */
+        @JsonProperty("mileavg")
+        @JSONField(name = "mileavg", ordinal = 85)
+        private String mileavg;
+
+        /**
+         * 平均速度1
+         */
+        @JsonProperty("speedavg1")
+        @JSONField(name = "speedavg1", ordinal = 86)
+        private String speedavg1;
+
+        /**
+         * 年度夜间次数
+         */
+        @JsonProperty("nighttimesAnnual")
+        @JSONField(name = "nighttimesAnnual", ordinal = 87)
+        private String nighttimesAnnual;
+
+        /**
+         * 年度超速次数
+         */
+        @JsonProperty("overspeedtimesAnnual")
+        @JSONField(name = "overspeedtimesAnnual", ordinal = 88)
+        private String overspeedtimesAnnual;
+
+        /**
+         * 年度超载次数
+         */
+        @JsonProperty("overloadtimesAnnual")
+        @JSONField(name = "overloadtimesAnnual", ordinal = 89)
+        private String overloadtimesAnnual;
+
+        /**
+         * 年度异地次数
+         */
+        @JsonProperty("diffplacetimesAnnual")
+        @JSONField(name = "diffplacetimesAnnual", ordinal = 90)
+        private String diffplacetimesAnnual;
+
+        /**
+         * 疲劳混合频率
+         */
+        @JsonProperty("fatigueMixFreq")
+        @JSONField(name = "fatigueMixFreq", ordinal = 91)
+        private String fatigueMixFreq;
+
+        /**
+         * 超速频率
+         */
+        @JsonProperty("overspeedFreq")
+        @JSONField(name = "overspeedFreq", ordinal = 92)
+        private String overspeedFreq;
+
+        /**
+         * 长途频率
+         */
+        @JsonProperty("longdistanceFreq")
+        @JSONField(name = "longdistanceFreq", ordinal = 93)
+        private String longdistanceFreq;
+
+        /**
+         * 分散度
+         */
+        @JsonProperty("dispersion")
+        @JSONField(name = "dispersion", ordinal = 94)
+        private String dispersion;
+
+        /**
+         * 活动半径
+         */
+        @JsonProperty("activeRadiu")
+        @JSONField(name = "activeRadiu", ordinal = 95)
+        private String activeRadiu;
+
+        /**
+         * 短途次数
+         */
+        @JsonProperty("dsTxcs")
+        @JSONField(name = "dsTxcs", ordinal = 96)
+        private String dsTxcs;
+
+        /**
+         * 常驻城市占比
+         */
+        @JsonProperty("usualCityCntPct")
+        @JSONField(name = "usualCityCntPct", ordinal = 97)
+        private String usualCityCntPct;
+
+        /**
+         * TOP5省份列表
+         */
+        @JsonProperty("top5List")
+        @JSONField(name = "top5List", ordinal = 98)
+        private List<ProvinceItem> top5List;
+
+        /**
+         * 省份列表
+         */
+        @JsonProperty("provincesList")
+        @JSONField(name = "provincesList", ordinal = 99)
+        private List<ProvinceItem> provincesList;
+
+        /**
+         * 工作日频率
+         */
+        @JsonProperty("weekdayFreq")
+        @JSONField(name = "weekdayFreq", ordinal = 100)
+        private String weekdayFreq;
+
+        /**
+         * 节假日频率
+         */
+        @JsonProperty("holidayFreq")
+        @JSONField(name = "holidayFreq", ordinal = 101)
+        private String holidayFreq;
+
+        /**
+         * 黎明里程频率
+         */
+        @JsonProperty("dawnMileageFreq")
+        @JSONField(name = "dawnMileageFreq", ordinal = 102)
+        private String dawnMileageFreq;
+
+        /**
+         * 上午里程频率
+         */
+        @JsonProperty("morningMileageFreq")
+        @JSONField(name = "morningMileageFreq", ordinal = 103)
+        private String morningMileageFreq;
+
+        /**
+         * 下午里程频率
+         */
+        @JsonProperty("afternoonMileageFreq")
+        @JSONField(name = "afternoonMileageFreq", ordinal = 104)
+        private String afternoonMileageFreq;
+
+        /**
+         * 黄昏里程频率
+         */
+        @JsonProperty("duskMileageFreq")
+        @JSONField(name = "duskMileageFreq", ordinal = 105)
+        private String duskMileageFreq;
+
+        /**
+         * 晚间里程频率
+         */
+        @JsonProperty("eveningMileageFreq")
+        @JSONField(name = "eveningMileageFreq", ordinal = 106)
+        private String eveningMileageFreq;
+
+        /**
+         * 夜间里程频率
+         */
+        @JsonProperty("nightMileageFreq")
+        @JSONField(name = "nightMileageFreq", ordinal = 107)
+        private String nightMileageFreq;
+
+        /**
+         * 车型评分
+         */
+        @JsonProperty("carScore")
+        @JSONField(name = "carScore", ordinal = 108)
+        private String carScore;
+
+        /**
+         * 系列评分
+         */
+        @JsonProperty("seriesScore")
+        @JSONField(name = "seriesScore", ordinal = 109)
+        private String seriesScore;
+
+        /**
+         * 评分更新时间
+         */
+        @JsonProperty("scoreUpdateTm")
+        @JSONField(name = "scoreUpdateTm", ordinal = 110)
+        private String scoreUpdateTm;
+
+        /**
+         * 全家庭评分
+         */
+        @JsonProperty("homeallScore")
+        @JSONField(name = "homeallScore", ordinal = 111)
+        private String homeallScore;
+
+        /**
+         * 安全评分
+         */
+        @JsonProperty("safeScore")
+        @JSONField(name = "safeScore", ordinal = 112)
+        private String safeScore;
+
+        /**
+         * 安全时间
+         */
+        @JsonProperty("safeTm")
+        @JSONField(name = "safeTm", ordinal = 113)
+        private String safeTm;
+
+        /**
+         * 交强PA类型
+         */
+        @JsonProperty("jqpaType")
+        @JSONField(name = "jqpaType", ordinal = 114)
+        private String jqpaType;
+
+        /**
+         * 商业PA类型
+         */
+        @JsonProperty("sypaType")
+        @JSONField(name = "sypaType", ordinal = 115)
+        private String sypaType;
+
+        /**
+         * 泰山分
+         */
+        @JsonProperty("ctsScore")
+        @JSONField(name = "ctsScore", ordinal = 116)
+        private String ctsScore;
+
+        /**
+         * 新评分
+         */
+        @JsonProperty("newscore")
+        @JSONField(name = "newscore", ordinal = 117)
+        private String newscore;
+
+        /**
+         * 新创建时间
+         */
+        @JsonProperty("newcrtTm")
+        @JSONField(name = "newcrtTm", ordinal = 118)
+        private String newcrtTm;
+
+        /**
+         * 半年里程
+         */
+        @JsonProperty("halfYearMileage")
+        @JSONField(name = "halfYearMileage", ordinal = 119)
+        private String halfYearMileage;
+
+        /**
+         * 黄昏里程
+         */
+        @JsonProperty("twilightMileage")
+        @JSONField(name = "twilightMileage", ordinal = 120)
+        private String twilightMileage;
+
+        /**
+         * 夜间驾驶里程
+         */
+        @JsonProperty("driveNightMileage")
+        @JSONField(name = "driveNightMileage", ordinal = 121)
+        private String driveNightMileage;
+
+        /**
+         * 驾驶次数
+         */
+        @JsonProperty("driveTimes")
+        @JSONField(name = "driveTimes", ordinal = 122)
+        private String driveTimes;
+
+        /**
+         * 驾驶里程
+         */
+        @JsonProperty("driveMileage")
+        @JSONField(name = "driveMileage", ordinal = 123)
+        private String driveMileage;
+
+        /**
+         * 驾驶天数
+         */
+        @JsonProperty("driveDays")
+        @JSONField(name = "driveDays", ordinal = 124)
+        private String driveDays;
+
+        /**
+         * 法律高风险
+         */
+        @JsonProperty("legalHighRisk")
+        @JSONField(name = "legalHighRisk", ordinal = 125)
+        private String legalHighRisk;
+
+        /**
+         * 法律高风险状态
+         */
+        @JsonProperty("legalHighRiskStatus")
+        @JSONField(name = "legalHighRiskStatus", ordinal = 126)
+        private String legalHighRiskStatus;
+
+        /**
+         * 车载档位
+         */
+        @JsonProperty("carloadTranche")
+        @JSONField(name = "carloadTranche", ordinal = 127)
+        private String carloadTranche;
+
+        /**
+         * 中型车载档位
+         */
+        @JsonProperty("mdlCarloadTranche")
+        @JSONField(name = "mdlCarloadTranche", ordinal = 128)
+        private String mdlCarloadTranche;
+
+        /**
+         * 小型车载档位
+         */
+        @JsonProperty("smlCarloadTranche")
+        @JSONField(name = "smlCarloadTranche", ordinal = 129)
+        private String smlCarloadTranche;
+
+        /**
+         * 创建时间2
+         */
+        @JsonProperty("crtTm2")
+        @JSONField(name = "crtTm2", ordinal = 130)
+        private String crtTm2;
+
+        /**
+         * 逆向标识
+         */
+        @JsonProperty("revShort")
+        @JSONField(name = "revShort", ordinal = 131)
+        private String revShort;
+
+        /**
+         * 欺诈查询数据
+         */
+        @JsonProperty("fraudQueryData")
+        @JSONField(name = "fraudQueryData", ordinal = 132)
+        private FraudQueryData fraudQueryData;
+
+        /**
+         * 全国位置评分信息
+         */
+        @JsonProperty("qgwzScoreInfo")
+        @JSONField(name = "qgwzScoreInfo", ordinal = 133)
+        private QgwzScoreInfo qgwzScoreInfo;
+
+        /**
+         * GB APQ信息
+         */
+        @JsonProperty("gbAPQInfo")
+        @JSONField(name = "gbAPQInfo", ordinal = 134)
+        private GbAPQInfo gbAPQInfo;
+
+        /**
+         * YZT评分数据
+         */
+        @JsonProperty("yztScoreData")
+        @JSONField(name = "yztScoreData", ordinal = 135)
+        private YztScoreData yztScoreData;
+
+        /**
+         * C类型
+         */
+        @JsonProperty("cType")
+        @JSONField(name = "cType", ordinal = 136)
+        private String cType;
+
+        /**
+         * T创建时间2
+         */
+        @JsonProperty("tCrtTm2")
+        @JSONField(name = "tCrtTm2", ordinal = 137)
+        private String tCrtTm2;
+    }
+
+    /**
+     * 维度项内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class DimensionItem implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048032L;
+
+        /**
+         * 维度键
+         */
+        @JsonProperty("key")
+        @JSONField(name = "key", ordinal = 1)
+        private String key;
+
+        /**
+         * 维度值
+         */
+        @JsonProperty("value")
+        @JSONField(name = "value", ordinal = 2)
+        private String value;
+
+        /**
+         * 维度索引
+         */
+        @JsonProperty("index")
+        @JSONField(name = "index", ordinal = 3)
+        private String index;
+    }
+
+    /**
+     * 省份项内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ProvinceItem implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048033L;
+
+        /**
+         * 省份
+         */
+        @JsonProperty("province")
+        @JSONField(name = "province", ordinal = 1)
+        private String province;
+
+        /**
+         * 次数
+         */
+        @JsonProperty("times")
+        @JSONField(name = "times", ordinal = 2)
+        private String times;
+    }
+
+    /**
+     * 欺诈查询数据内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class FraudQueryData implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048034L;
+
+        /**
+         * 结果列表
+         */
+        @JsonProperty("resultList")
+        @JSONField(name = "resultList", ordinal = 1)
+        private ResultList resultList;
+    }
+
+    /**
+     * 结果列表内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ResultList implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048035L;
+
+        /**
+         * 结果项列表
+         */
+        @JsonProperty("resultItem")
+        @JSONField(name = "resultItem", ordinal = 1)
+        private List<ResultItem> resultItem;
+    }
+
+    /**
+     * 结果项内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ResultItem implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048036L;
+
+        /**
+         * 规则编码
+         */
+        @JsonProperty("ruleCode")
+        @JSONField(name = "ruleCode", ordinal = 1)
+        private String ruleCode;
+
+        /**
+         * 规则名称
+         */
+        @JsonProperty("ruleName")
+        @JSONField(name = "ruleName", ordinal = 2)
+        private String ruleName;
+    }
+
+    /**
+     * 全国位置评分信息内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class QgwzScoreInfo implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048037L;
+
+        /**
+         * 全国位置评分
+         */
+        @JsonProperty("qgwzScore")
+        @JSONField(name = "qgwzScore", ordinal = 1)
+        private String qgwzScore;
+
+        /**
+         * 调用时间
+         */
+        @JsonProperty("tcallTime")
+        @JSONField(name = "tcallTime", ordinal = 2)
+        private String tcallTime;
+    }
+
+    /**
+     * GB APQ信息内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class GbAPQInfo implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048038L;
+
+        /**
+         * GB APQ评分
+         */
+        @JsonProperty("gbAPQScore")
+        @JSONField(name = "gbAPQScore", ordinal = 1)
+        private String gbAPQScore;
+    }
+
+    /**
+     * YZT评分数据内部类
+     */
+    @NoArgsConstructor
+    @Data
+    public static class YztScoreData implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048039L;
+
+        /**
+         * 百分位数
+         */
+        @JsonProperty("centile")
+        @JSONField(name = "centile", ordinal = 1)
+        private String centile;
+
+        /**
+         * 创建时间3
+         */
+        @JsonProperty("crtTm3")
+        @JSONField(name = "crtTm3", ordinal = 2)
+        private String crtTm3;
+    }
+}

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

@@ -22,7 +22,7 @@ public class TaiShanCrawlerOrderServiceImpl implements TaiShanCrawlerOrderServic
 
     @Override
     public void save(TaiShanCrawlerQuotationSaveResponse taiShanCrawlerQuotationSaveResponse, TaiShanCrawlerOrder order) {
-        order.setOrderNo(taiShanCrawlerQuotationSaveResponse.getResult().getPaInsurance().getOrderNo());
+        order.setOrderNo(taiShanCrawlerQuotationSaveResponse.getResult().getProposalInfo().getOrderNo());
 
         // 交强险
         if (taiShanCrawlerQuotationSaveResponse.getResult().getCompulsoryInsurance() != null) {

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

@@ -1,5 +1,6 @@
 package com.jzg.quotation.taishan.crawler.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.quote.enums.base.ExpenseRequestUrl;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.identify.SliderCaptchaVo;
@@ -16,6 +17,7 @@ import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerVerifyRes
 import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerQuoteProcessService;
 import com.jzg.quotation.taishan.crawler.util.TaiShanCrawlerUtils;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
@@ -34,6 +36,7 @@ import java.util.concurrent.ThreadLocalRandom;
  **/
 @Service
 @RequiredArgsConstructor
+@Slf4j
 public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuoteProcessService {
 
     private final TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent;
@@ -170,12 +173,46 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
      */
     @Override
     public HttpHeaders getHeaders(String username, String comCode) {
-        String authorization = taiShanCrawlerCacheComponent.getAuthorization(username);
+        String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTUsImV4cCI6MTc4MTY4NzIzMn0.ldWz9TMY4AJ75VE0Bk1mkzAXPC9jJNMIWL82n0kGHrBwASgGvBxO3fe7orHbCIowt0athoRn1zA9m5ZNnO7olg";
         HttpHeaders httpHeaders = new HttpHeaders();
+        
+        httpHeaders.set("Accept", "application/json, text/plain, */*");
+        httpHeaders.set("Accept-Language", "zh-CN,zh;q=0.9");
+        httpHeaders.set("Cache-Control", "no-cache");
+        httpHeaders.set("Connection", "keep-alive");
+        httpHeaders.set("Content-Type", "application/json;charset=UTF-8");
+        httpHeaders.set("Host", "kc.taishanpic.com.cn");
+        httpHeaders.set("Origin", "https://kc.taishanpic.com.cn");
+        httpHeaders.set("Pragma", "no-cache");
+        httpHeaders.set("Referer", "https://kc.taishanpic.com.cn/pc_prod/underwriting/insurance");
+        httpHeaders.set("Sec-Fetch-Dest", "empty");
+        httpHeaders.set("Sec-Fetch-Mode", "cors");
+        httpHeaders.set("Sec-Fetch-Site", "same-origin");
+        httpHeaders.set("Source", "0");
+        httpHeaders.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36");
+        httpHeaders.set("sec-ch-ua", "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Google Chrome\";v=\"122\"");
+        httpHeaders.set("sec-ch-ua-mobile", "?0");
+        httpHeaders.set("sec-ch-ua-platform", "\"Windows\"");
+        
         httpHeaders.set("Authorization", authorization);
-        httpHeaders.set("Authorization", "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI1MzAiLCJhdXRoIjoiUk9MRV9FTVBUWV9DQVJEX05PLFJPTEVfT1BFUkFUT1IiLCJwYXNzd29yZF9leHBpcmUiOi04NywiZXhwIjoxNzY2NzI5MTg1fQ.80zkJmVQoc1kvjWiGMzbc5kaWY56FpVN-NAW3qCldeEGX61wPLmh_9sgyl7Oy_fFnmghC5szZrZEuN_byucCFw");
         httpHeaders.set("Login-Complete", comCode);
-        httpHeaders.set("Source","0");
+        
+        int randomInteger = ThreadLocalRandom.current().nextInt(1, 11);
+        long currentTimeMillis = System.currentTimeMillis();
+        
+        long seconds = currentTimeMillis / 1000;
+        long milliseconds = currentTimeMillis % 1000;
+        String timeStr = seconds + "." + milliseconds;
+        String serialNo = md5Encrypt(String.valueOf(randomInteger) + timeStr);
+        httpHeaders.set("Serial-NO", serialNo);
+        
+        String t = String.valueOf(currentTimeMillis);
+        httpHeaders.set("T", t);
+        
+        String signatureStr = "20250227210036" + "20250227210106" + t + authorization;
+        String a = md5Encrypt(signatureStr);
+        httpHeaders.set("a", a);
+        
         return httpHeaders;
     }
 

+ 9 - 4
tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/service/impl/YangGuangApiRequestImpl.java

@@ -93,7 +93,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
         // 报价
         YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest = new YangGuangAccuracyCalculateRequest(quoteVo, carModel, parameters);
         yangGuangAccuracyCalculateRequest.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
-        return recursiveQuote(yangGuangAccuracyCalculateRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url);
+        return recursiveQuote(yangGuangAccuracyCalculateRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url, 0);
     }
 
     /**
@@ -106,9 +106,14 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
                                           YangGuangQueryVehicleModelResponse.carmodellist carModel,
                                           YangGuangQueryVehicleModelResponse yangGuangQueryVehicleModelResponse,
                                           QuoteVo quoteVo,
-                                          YangGuangConfigureParameters parameters,String url) throws JsonProcessingException {
+                                          YangGuangConfigureParameters parameters,String url,int quoteNum) throws JsonProcessingException {
+
 
         YangGuangAccuracyCalculateResponse response = yangGuangApiRequestComponent.accuracyCalculaye(request,url);
+        //加入限制
+        if (quoteNum >= 3) {
+            return handleFailedQuote(response, quoteVo);
+        }
         if (!response.getErrorCode().equals("0") || StringUtils.isNotEmpty(response.getRemarkCi())) {
             String endDate = extractEndDate(response);
             // 交强重复投保处理
@@ -120,7 +125,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
                 quoteVo.getCiRiskInfoVo().setStartDate(newDateStr);
                 YangGuangAccuracyCalculateRequest newRequest = new YangGuangAccuracyCalculateRequest(quoteVo, carModel,parameters);
                 newRequest.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
-                return recursiveQuote(newRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url);
+                return recursiveQuote(newRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url, quoteNum + 1);
             }
             return handleFailedQuote(response, quoteVo);
         } else {
@@ -137,7 +142,7 @@ public class YangGuangApiRequestImpl implements YangGuangApiRequest {
                     quoteVo.getBiRiskInfoVo().setStartDate(biStartTime.format(outputFormatter));
                     YangGuangAccuracyCalculateRequest newRequest = new YangGuangAccuracyCalculateRequest(quoteVo, carModel,parameters);
                     newRequest.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
-                    return recursiveQuote(newRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url);
+                    return recursiveQuote(newRequest, carModel, yangGuangQueryVehicleModelResponse,quoteVo, parameters, url, quoteNum + 1);
                 }
             }
             return handleSuccessfulQuote(response, quoteVo);

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

@@ -110,10 +110,21 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
 
     @Override
     public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
-        String username = detectLoginRequest.getUsername();
-        String password = detectLoginRequest.getPassword();
-        return true;
+        // 先从缓存取
+        Map<Object, Object> cacheMap = redissonClient.getMap(ZHONGAN_COOKIE + zhongAnId);
+        if (cacheMap != null && !cacheMap.isEmpty()) {
+            System.out.println("[" + zhongAnId + "] 从 Redisson 缓存读取登录信息");
+            return true;
+        }
+
+        // 缓存没有 执行登录
+        LoginResult result = zhongAnCrawlerCacheComponent.loginCookieCache(zhongAnId, productId);
 
+        // 登录成功 存缓存
+        if (result.getCode() == 200) {
+            zhongAnCrawlerCacheComponent.cacheCookie(result.getZaLoginCookieKey(), result.getFlowId(), zhongAnId);
+        }
+        return result.getCode() == 200;
     }