jinshihui 11 месяцев назад
Родитель
Сommit
d980866da7
26 измененных файлов с 3889 добавлено и 308 удалено
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java
  2. 2 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java
  3. 0 2
      commons/src/main/java/com/jzg/commons/entity/report/dto/UserTreeDto.java
  4. 48 23
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java
  5. 6 2
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/RequestUrl.java
  6. 1 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest.java
  7. 0 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest1.java
  8. 38 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest2.java
  9. 221 62
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest.java
  10. 70 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest1.java
  11. 752 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerQuotationRequest2.java
  12. 157 7
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust.java
  13. 348 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust1.java
  14. 26 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust2.java
  15. 136 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CarModelDataDTO.java
  16. 396 6
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleInfoDTO.java
  17. 4 6
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerBaseResponse1.java
  18. 590 136
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse.java
  19. 402 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse1.java
  20. 28 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerVehicleConfirmationResponse.java
  21. 1 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerQuoteProcessServiceImpl.java
  22. 508 14
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  23. 2 2
      tenant/insurance/quotation-commons/pom.xml
  24. 103 17
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  25. 28 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/JacksonConfig.java
  26. 19 27
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java

@@ -26,6 +26,9 @@ public class CarInfoVo implements Serializable {
     @Serial
     private static final long serialVersionUID = -1999956887911522472L;
 
+    /**
+     * 订单号
+     */
     @TableId(value = "order_no", type = IdType.ASSIGN_ID)
     private String orderNo;
 

+ 2 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java

@@ -73,11 +73,13 @@ public class QuoteVo implements Serializable {
      */
     @Schema(description = "商业险信息")
     private List<KindInfoVo> kindInfoVo;
+
     /**
      * 非车险
      */
     @Schema(description = "非车险")
     private List<AccidentalDrivingVo> accidentalDrivings;
+
     /**
      * 车船税信息
      */

+ 0 - 2
commons/src/main/java/com/jzg/commons/entity/report/dto/UserTreeDto.java

@@ -1,6 +1,4 @@
 package com.jzg.commons.entity.report.dto;
-
-;
 import com.jzg.commons.entity.po.SysDept;
 import com.jzg.commons.entity.vo.SysDeptVo;
 import com.jzg.commons.util.StringUtils;

+ 48 - 23
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java

@@ -5,15 +5,18 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.bohai.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.bohai.crawler.entity.request.*;
+import com.jzg.quotation.bohai.crawler.entity.request.quote.CarModelDataDTO;
 import com.jzg.quotation.bohai.crawler.entity.response.*;
 import com.jzg.quotation.bohai.crawler.properties.BoHaiCrawlerProperties;
 import com.jzg.quotation.bohai.crawler.util.DESEncryption;
+import com.jzg.quotation.bohai.crawler.util.DESUtil;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
@@ -60,6 +63,7 @@ public class BoHaiCrawlerRequestComponent {
 
     /**
      * 验证码
+     *
      * @param frequency
      * @return BoHaiCrawlerCaptchaResponse
      */
@@ -88,6 +92,7 @@ public class BoHaiCrawlerRequestComponent {
 
     /**
      * 处理验证码
+     *
      * @param res
      * @return int
      */
@@ -149,27 +154,47 @@ public class BoHaiCrawlerRequestComponent {
     }
 
     /**
-     * 请求
+     * 请求(请求参数加密)
      *
      * @param crawlerRequestUrlStandard
-     * @param request 报价请求体
+     * @param request                   报价请求体
      * @param responseClass
      * @param headers
      * @return BoHaiResponse
      */
     public <BoHaiResponse> BoHaiResponse request(CrawlerRequestUrlStandard crawlerRequestUrlStandard, Object request, Class<BoHaiResponse> responseClass, HttpHeaders headers) {
-        // 参数加密
-        BoHaiCrawlerBaseRequest crawlerBaseRequest = new BoHaiCrawlerBaseRequest(request);
-        //ResponseEntity<BoHaiCrawlerBaseResponse> responseEntity = requestComponent.objectPost("", crawlerBaseRequest, BoHaiCrawlerBaseResponse.class, headers);
-        ResponseEntity<BoHaiCrawlerBaseResponse> responseEntity = requestComponent.objectPost(RequestUrl.CAR.getRequestUrl(boHaiCrawlerProperties.getBaseUrl()), crawlerBaseRequest, BoHaiCrawlerBaseResponse.class, headers);
-        BoHaiCrawlerBaseResponse boHaiCrawlerBaseResponse = responseEntity.getBody();
-        AssertionUtils.isEmpty(boHaiCrawlerBaseResponse, "请求异常请重试");
-        if (!"200".equals(boHaiCrawlerBaseResponse.getCode())) {
-            throw new SystemException(boHaiCrawlerBaseResponse.getMessage());
+        try {
+            /*String jsonString = JSON.toJSONString(request);
+            log.info("请求参数:{}", jsonString);
+            // 参数加密
+            String encrypt = DESUtil.encrypt(jsonString, "c2lub3NvZnQuY2hhbm5lbC55ZHBpYw==");
+            log.info("请求参数加密:{}", encrypt);
+            //生成md5值
+            String md5Value = DESUtil.md5(encrypt + "c2lub3NvZnQuY2hhbm5lbC55ZHBpYw==");
+            log.info("请求参数md5的值:{}", md5Value);*/
+
+            String encrypt = "V7akVmOaI/zGPxaIQJ4fCBb3o3T9hBPGinrPT2FkIG2vJkPEWl5Q0qtxf1SUSjX1tgu3OAU37r0rA/ex3ucfdr181Zyuda5MJTUKeSrPqsqBBVP4wGM9r3wxmVff5tOtT11WpGPlkpycNFMICdcRHUDuwNilXxO4YH4ZO0rLaX4jRqWaJCV/qT5JyNyx/Eng4nBPUKaufENPdilIpaBSzk+Z4CjhcPaHbI9aSTEdgLJi5mVWUW1+eNZ/Jebs6Xa8acWKvCDGd1ZaXVXxSToSfU2tueaSkM13Jz78TxJ0zNlBMlU2I96sM5PIkfwjt3+9Re4tz+3vPY1QNLiVIazDZUZguflOoIUwuxsiE7ML2I7K3JJSu1BjDvVIQBtDd21b5wz0HJvclpOuUcCzotL6d0fs1Ml4OZDfbUxEtnbE9bImTKBbcGnxazEKih02LJNAzHIgnty812pNIqMp953tNO8GuNWKGi2ihWkyh315pLO4vN+ZUHuupmmSOuqgKPpnfGyoF4o9xzeLjLpKZ+RhvvJ4z62zhLqtnpJIjH1feihhcOrRulz/RZ1/Pdggv/veV8KkArczSZdfVUPx3OiQ3VkRdkfEg6QzvYITvmkV9PBwUNDB8CL+ltGyYOta6yRINCmF3WIOrf+ELqDTKfxpbq7qLNzShMnrzCW0/DpNXCPvaAARS+le2pBEl4vwhzaHSPiKH6HdvZ89dKSv3WAbUQX/J49z6lmrohhp0q5jX0bjlCgZn3GnqcMQD/FKcWIY62Vo1CJwzCJJmYNAEhkAJEB9/fuYSoCUd6KDz7nPp9+CbqjEo786xIydkoa53/N/5nn61vXrL9STJDRbi5ieFoFnbBwbNHREz4y1P19OZy8ns/vTbI0pvVpqCd0C4auRUupvc4vvT8/nXFpvualOFXUo2P07c/d+MSCjSjhY2hQE04Dx3KrxPaFCt892oh9lRv2vW0yjK+DP3oCVbYg1nk75NjujjWE4sE8GNzW2+mGaYotPcPQ1pvNNIjAacM5SLyRk/yS3ghOaYotPcPQ1ppSi8T8urKHLaJvaU1gbMLtpqmGNp28HZAHYh351WGTI+XHYRd8/U2UHWtn4DT7JI4w6Uua2sccpXgSDDbiSNNvPDaXvKjLqnhEL1PZ8mos21bBX7yAIDWmZSiRl3iaQL0xTlw/Cd8KsGPi65JFbfRAIY0BQu9N36MRVNhpHbhSN6gRd0Z7szd6xN9dZLpk6Yyj1tM5SmZ2P/GW3WAx+ldmKca+TvHljBV94708Q+fJpnlXZ5VH65sVTlKgtqFNCa/Ap9gXNbbGRy7lSMBz9uMRiw+dgeozVjM+KnnkCbBz3a+6xjTeFOpD8KoTgPXafR6kmqVWuncV5RJKmGjtf78L6wstIPeVgNVeTDorlUNPYPbYP28qLrfPlQNd3nYmh7XHptDhfEOiE38+CJd9yUb1rShNQYSUtMxf8OKHXemXQuBzqqGo7ZfsoW0WkGUeQ6Q==";
+
+            String md5Value = "70780a559801c71296c15f0b1488a6c6";
+
+            BoHaiCrawlerVehicleConfirmationReqeust2 boHaiCrawlerVehicleConfirmationReqeust2 = new BoHaiCrawlerVehicleConfirmationReqeust2();
+            boHaiCrawlerVehicleConfirmationReqeust2.setEncryptionData(encrypt);
+            boHaiCrawlerVehicleConfirmationReqeust2.setMd5(md5Value);
+
+            //真正的请求
+            ResponseEntity<String> responseEntity = requestComponent.objectPost2(RequestUrl.VEHICLECONFIRMATION.getRequestUrl(boHaiCrawlerProperties.getBaseUrl2()), boHaiCrawlerVehicleConfirmationReqeust2, String.class, headers);
+
+            String responseString = responseEntity.getBody();
+            log.info("请求返回参数:{}", responseString);
+
+            AssertionUtils.isEmpty(responseString, "请求异常请重试");
+            // 参数解密
+            String decrypt = DESUtil.decrypt(responseString);
+            return JSON.parseObject(decrypt, responseClass);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
         }
-        // 参数解密
-        String decrypt = DESEncryption.decrypt(boHaiCrawlerBaseResponse.getResult());
-        return JSON.parseObject(decrypt, responseClass);
     }
 
 
@@ -184,17 +209,18 @@ public class BoHaiCrawlerRequestComponent {
      */
     public <BoHaiResponse> BoHaiResponse request1(CrawlerRequestUrlStandard crawlerRequestUrlStandard, Object request, Class<BoHaiResponse> responseClass, HttpHeaders headers) {
         // 参数
-        BoHaiCrawlerBaseRequest1 crawlerBaseRequest = new BoHaiCrawlerBaseRequest1(request);
+        //BoHaiCrawlerBaseRequest1 crawlerBaseRequest = new BoHaiCrawlerBaseRequest1(request);
         //ResponseEntity<BoHaiCrawlerBaseResponse> responseEntity = requestComponent.objectPost("", crawlerBaseRequest, BoHaiCrawlerBaseResponse.class, headers);
-        ResponseEntity<BoHaiCrawlerBaseResponse1> responseEntity = requestComponent.objectPost(RequestUrl.CAR.getRequestUrl(boHaiCrawlerProperties.getBaseUrl()), crawlerBaseRequest, BoHaiCrawlerBaseResponse1.class, headers);
+        ResponseEntity<BoHaiCrawlerBaseResponse1> responseEntity = requestComponent.objectPost(RequestUrl.CAR.getRequestUrl(boHaiCrawlerProperties.getBaseUrl()), request, BoHaiCrawlerBaseResponse1.class, headers);
         BoHaiCrawlerBaseResponse1 boHaiCrawlerBaseResponse = responseEntity.getBody();
-        log.info("boHaiCrawlerBaseResponse参数的值:{}",JSON.toJSONString(boHaiCrawlerBaseResponse));
+        log.info("boHaiCrawlerBaseResponse参数的值:{}", JSON.toJSONString(boHaiCrawlerBaseResponse));
 
         AssertionUtils.isEmpty(boHaiCrawlerBaseResponse, "请求异常请重试");
-        if (!"200".equals(boHaiCrawlerBaseResponse.getCode())) {
+        if (!boHaiCrawlerBaseResponse.getCode().equals(Integer.valueOf(0))) {
             throw new SystemException(boHaiCrawlerBaseResponse.getMsg());
         }
-        return JSON.parseObject("", responseClass);
+        CarModelDataDTO data = boHaiCrawlerBaseResponse.getData();
+        return JSON.parseObject(JSON.toJSONString(data), responseClass);
     }
 
     /**
@@ -219,7 +245,6 @@ public class BoHaiCrawlerRequestComponent {
     }
 
 
-
     /**
      * 获取渠道信息
      *
@@ -271,8 +296,8 @@ public class BoHaiCrawlerRequestComponent {
      * @param headers
      * @return BoHaiCrawlerVehicleConfirmationResponse
      */
-    public BoHaiCrawlerVehicleConfirmationResponse vehicleConfirmation(BoHaiCrawlerVehicleConfirmationReqeust boHaiCrawlerVehicleConfirmationReqeust, HttpHeaders headers) {
-        return request(RequestUrl.CAR, boHaiCrawlerVehicleConfirmationReqeust, BoHaiCrawlerVehicleConfirmationResponse.class, headers);
+    public BoHaiCrawlerVehicleConfirmationResponse2 vehicleConfirmation(BoHaiCrawlerVehicleConfirmationReqeust1 boHaiCrawlerVehicleConfirmationReqeust1, HttpHeaders headers) {
+        return request(RequestUrl.VEHICLECONFIRMATION, boHaiCrawlerVehicleConfirmationReqeust1, BoHaiCrawlerVehicleConfirmationResponse2.class, headers);
     }
 
 
@@ -283,8 +308,8 @@ public class BoHaiCrawlerRequestComponent {
      * @param headers
      * @return BoHaiCrawlerQuotationResponse
      */
-    public BoHaiCrawlerQuotationResponse quotation(BoHaiCrawlerQuotationRequest boHaiCrawlerQuotationRequest, HttpHeaders headers) {
-        return request(RequestUrl.PRICE, boHaiCrawlerQuotationRequest, BoHaiCrawlerQuotationResponse.class, headers);
+    public BoHaiCrawlerQuotationResponse quotation(BoHaiCrawlerQuotationRequest2 boHaiCrawlerQuotationRequest2, HttpHeaders headers) {
+        return request(RequestUrl.PRICE, boHaiCrawlerQuotationRequest2, BoHaiCrawlerQuotationResponse.class, headers);
     }
 
 }

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

@@ -24,9 +24,13 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
 
     // 报价
     CAR("/app-carmodelinfo/netins/jyPreCarModelFill/queryJYPreCarModelFill", "车型查询"),
-    VEHICLECONFIRMATION("","车辆确认"),
+
+    VEHICLECONFIRMATION("/motor/pspcs/Channel/channelTask/channelTaskMain.do","车辆确认"),
+
     ACTUAL_VALUE("/api_vhl_prod/api/actualvalue", "计算折旧价格"),
-    PRICE("/api_vhl_prod/api/price", "报价"),
+
+    PRICE("/motor/pspcs/Channel/channelTask/channelTaskMain.do", "计算保费"),
+
     SAVE("/api_vhl_prod/api/save", "保存订单"),
     INIT_DATA("/api_vhl_prod/imp/web/page/init_data", "初始化数据"),
     //上传影像

+ 1 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest.java

@@ -9,7 +9,7 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * @description: 渤海财险 爬虫 基础请求体
+ * @description: 渤海财险 爬虫 基础请求体(数据加密)
  * @author:
  * @date:
  **/

+ 0 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest1.java

@@ -24,7 +24,6 @@ public class BoHaiCrawlerBaseRequest1 implements Serializable {
     private String data;
 
     public BoHaiCrawlerBaseRequest1(Object data) {
-        //this.data = DESEncryption.encryptObjectToStr(data);
         this.data = data.toString();
     }
 }

+ 38 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerBaseRequest2.java

@@ -0,0 +1,38 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.jzg.quotation.bohai.crawler.util.DESEncryption;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 爬虫 基础请求体(数据加密)
+ * @author:
+ * @date:
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerBaseRequest2 implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2304961708114602898L;
+
+    /**
+     * 加密数据
+     */
+    private String encryptionData;
+
+    /**
+     * MD5校验值
+     */
+    private String md5;
+
+    public BoHaiCrawlerBaseRequest2(Object data,String md5) {
+        this.encryptionData = DESEncryption.encryptObjectToStr(data);
+        this.md5 = md5;
+    }
+}

+ 221 - 62
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest.java

@@ -2,94 +2,253 @@ package com.jzg.quotation.bohai.crawler.entity.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
-import lombok.Data;
-import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * 渤海保险爬虫车辆查询请求实体
+ * 渤海财险车辆查询请求参数实体类
  *
  * @author system
+ * @date 2025/09/28
  */
-@NoArgsConstructor
-@Data
 public class BoHaiCrawlerCarRequest implements Serializable {
 
     @Serial
     private static final long serialVersionUID = 3887879260967024252L;
 
-    /** 页码 */
-    @JsonProperty("pageNo")
-    private Integer pageNo;
-
-    /** 每页大小 */
-    @JsonProperty("pageSize")
-    private Integer pageSize;
-    /**
-     * 品牌型号
-     */
-    @JsonProperty("vehicleName")
-    private String vehicleName;
-
-    /** 地区代码 */
-    @JsonProperty("areaCode")
-    private String areaCode;
     /**
-     * 订单号 可以为空
+     * 请求头信息
      */
-    @JsonProperty("orderNo")
-    private String orderNo;
+    @JsonProperty("head")
+    private Head head;
 
-    /** 部门代码 */
-    @JsonProperty("dptCode")
-    private String dptCode;
-    /**
-     * 发动机号
-     */
-    @JsonProperty("engineNo")
-    private String engineNo;
-    /**
-     * 车架号
-     */
-    @JsonProperty("vin")
-    private String vin;
     /**
-     * 车牌号
+     * 请求数据
      */
-    @JsonProperty("licensePlateNo")
-    private String licensePlateNo;
-    /**
-     * 号牌种类
-     */
-    @JsonProperty("queryMod")
-    private String queryMod;
+    @JsonProperty("data")
+    private Data data;
 
-    /** 操作员代码 */
-    @JsonProperty("operatorCode")
-    private String operatorCode;
+    public BoHaiCrawlerCarRequest() {
+    }
 
     /**
      * 构造函数
      *
      * @param carInfoVo 车辆信息
-     * @param areaCode 地区代码
+     * @param loginCompany 登录公司
      * @param dptCode 部门代码
-     * @param operatorCode 操作员代码
+     * @param userCode 用户代码
      */
-    public BoHaiCrawlerCarRequest(CarInfoVo carInfoVo, String areaCode, String dptCode, String operatorCode) {
-        this.pageNo = 1;
-        this.pageSize = 30;
-        this.vehicleName = carInfoVo.getBrandName();
-        this.areaCode = areaCode;
-        this.orderNo = null;
-        this.dptCode = dptCode;
-        this.engineNo = carInfoVo.getEngineNo();
-        this.vin = carInfoVo.getVinNo();
-        this.licensePlateNo = carInfoVo.getLicenseNo();
-        this.queryMod = carInfoVo.getLicenseKindCode();
-        this.operatorCode = operatorCode;
+    public BoHaiCrawlerCarRequest(CarInfoVo carInfoVo, String loginCompany, String dptCode, String userCode) {
+        this.head = new Head();
+        this.head.setChannelCode("");
+        this.head.setComCode(loginCompany != null ? loginCompany : "");
+        this.head.setTransDate("");
+
+        this.data = new Data();
+        this.data.setComCode("14070201");
+        this.data.setResourceTypeCode("004");
+        this.data.setVin(carInfoVo != null ? carInfoVo.getVinNo() : "");
+        this.data.setPlateNumber(carInfoVo != null ? carInfoVo.getLicenseNo() : "");
+        this.data.setNewCarFlag("0");
+        this.data.setPlateNoType(carInfoVo != null && carInfoVo.getLicenseKindCode() != null ? carInfoVo.getLicenseKindCode() : "02");
+        this.data.setPlateNoColor("01");
+        this.data.setVehicleModels(carInfoVo != null ? carInfoVo.getBrandName() : "");
+        this.data.setOperatorCode(userCode != null ? userCode : "");
+    }
+
+    public Head getHead() {
+        return head;
+    }
+
+    public void setHead(Head head) {
+        this.head = head;
     }
 
+    public Data getData() {
+        return data;
+    }
+
+    public void setData(Data data) {
+        this.data = data;
+    }
+
+    /**
+     * 请求头信息
+     */
+    public static class Head {
+        /**
+         * 渠道代码
+         */
+        @JsonProperty("channelCode")
+        private String channelCode;
+
+        /**
+         * 公司代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 交易日期
+         */
+        @JsonProperty("transDate")
+        private String transDate;
+
+        public String getChannelCode() {
+            return channelCode;
+        }
+
+        public void setChannelCode(String channelCode) {
+            this.channelCode = channelCode;
+        }
+
+        public String getComCode() {
+            return comCode;
+        }
+
+        public void setComCode(String comCode) {
+            this.comCode = comCode;
+        }
+
+        public String getTransDate() {
+            return transDate;
+        }
+
+        public void setTransDate(String transDate) {
+            this.transDate = transDate;
+        }
+    }
+
+    /**
+     * 请求数据
+     */
+    public static class Data {
+        /**
+         * 公司代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 资源类型代码
+         */
+        @JsonProperty("resourceTypeCode")
+        private String resourceTypeCode;
+
+        /**
+         * 车架号
+         */
+        @JsonProperty("vin")
+        private String vin;
+
+        /**
+         * 车牌号
+         */
+        @JsonProperty("plateNumber")
+        private String plateNumber;
+
+        /**
+         * 新车标志 0-否 1-是
+         */
+        @JsonProperty("newCarFlag")
+        private String newCarFlag;
+
+        /**
+         * 号牌种类
+         */
+        @JsonProperty("plateNoType")
+        private String plateNoType;
+
+        /**
+         * 号牌颜色
+         */
+        @JsonProperty("plateNoColor")
+        private String plateNoColor;
+
+        /**
+         * 车辆型号
+         */
+        @JsonProperty("vehicleModels")
+        private String vehicleModels;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        public String getComCode() {
+            return comCode;
+        }
+
+        public void setComCode(String comCode) {
+            this.comCode = comCode;
+        }
+
+        public String getResourceTypeCode() {
+            return resourceTypeCode;
+        }
+
+        public void setResourceTypeCode(String resourceTypeCode) {
+            this.resourceTypeCode = resourceTypeCode;
+        }
+
+        public String getVin() {
+            return vin;
+        }
+
+        public void setVin(String vin) {
+            this.vin = vin;
+        }
+
+        public String getPlateNumber() {
+            return plateNumber;
+        }
+
+        public void setPlateNumber(String plateNumber) {
+            this.plateNumber = plateNumber;
+        }
+
+        public String getNewCarFlag() {
+            return newCarFlag;
+        }
+
+        public void setNewCarFlag(String newCarFlag) {
+            this.newCarFlag = newCarFlag;
+        }
+
+        public String getPlateNoType() {
+            return plateNoType;
+        }
+
+        public void setPlateNoType(String plateNoType) {
+            this.plateNoType = plateNoType;
+        }
+
+        public String getPlateNoColor() {
+            return plateNoColor;
+        }
+
+        public void setPlateNoColor(String plateNoColor) {
+            this.plateNoColor = plateNoColor;
+        }
+
+        public String getVehicleModels() {
+            return vehicleModels;
+        }
+
+        public void setVehicleModels(String vehicleModels) {
+            this.vehicleModels = vehicleModels;
+        }
+
+        public String getOperatorCode() {
+            return operatorCode;
+        }
+
+        public void setOperatorCode(String operatorCode) {
+            this.operatorCode = operatorCode;
+        }
+    }
 }

+ 70 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest1.java

@@ -0,0 +1,70 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 渤海财险车辆查询请求参数实体类
+ *
+ * @author system
+ * @date 2025/09/28
+ */
+@Data
+@NoArgsConstructor
+public class BoHaiCrawlerCarRequest1 implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3887879260967024252L;
+
+
+    /**
+     * head : {"channelCode":"","comCode":"","transDate":""}
+     * data : {"comCode":"14070201","resourceTypeCode":"004","vin":"LS5A33LR9GB320680","plateNumber":"晋AP535C","newCarFlag":"0","plateNoType":"02","plateNoColor":"01","vehicleModels":"长安牌SC7143C","operatorCode":"114050281"}
+     */
+
+    private HeadBean head;
+    private DataBean data;
+
+    @NoArgsConstructor
+    @Data
+    public static class HeadBean {
+        /**
+         * channelCode :
+         * comCode :
+         * transDate :
+         */
+
+        private String channelCode;
+        private String comCode;
+        private String transDate;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class DataBean {
+        /**
+         * comCode : 14070201
+         * resourceTypeCode : 004
+         * vin : LS5A33LR9GB320680
+         * plateNumber : 晋AP535C
+         * newCarFlag : 0
+         * plateNoType : 02
+         * plateNoColor : 01
+         * vehicleModels : 长安牌SC7143C
+         * operatorCode : 114050281
+         */
+
+        private String comCode;
+        private String resourceTypeCode;
+        private String vin;
+        private String plateNumber;
+        private String newCarFlag;
+        private String plateNoType;
+        private String plateNoColor;
+        private String vehicleModels;
+        private String operatorCode;
+    }
+}

+ 752 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerQuotationRequest2.java

@@ -0,0 +1,752 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.bohai.crawler.entity.BoHaiCrawlerConfigureParameters;
+import com.jzg.quotation.bohai.enums.dictionary.Risk;
+import lombok.Data;
+import javax.swing.plaf.nimbus.State;
+import java.util.List;
+
+/**
+ * 渤海财险爬虫—报价请求载体
+ * 用于封装一次完整的报价入参:请求头、业务数据以及登录上下文。
+ * 仅为数据承载对象(DTO),不包含业务逻辑。
+ */
+@Data
+public class BoHaiCrawlerQuotationRequest2 {
+
+    /** 请求头信息,含交易码/类型/令牌等 */
+    private Head head;
+    /** 业务主体数据,含车辆、被保人、险种等 */
+    private BusinessData businessData;
+    /** 登录机构代码(承保机构) */
+    private String loginCom;
+    /** 当前操作员代码 */
+    private String userCode;
+    /** 一级用户/渠道主账号(若有多级账号体系) */
+    private String firstUserCode;
+
+    /**
+     * 请求头
+     */
+    @Data
+    public static class Head {
+        /** 交易码 */
+        private String transCode;
+        /** 交易类型 */
+        private String transType;
+        /** 访问令牌 */
+        private String token;
+    }
+
+    /**
+     * 业务数据
+     */
+    @Data
+    public static class BusinessData {
+        /** 业务主信息(投保基本信息) */
+        private BusinessMainInfo businessMainInfo;
+        /** 车辆信息(车型、车况等) */
+        private CarInfo carInfo;
+        /** 被保险人列表(投保人/被保人/车主等) */
+        private List<Insured> insuredList;
+        /** 险种集合(商业险/交强险及其条款) */
+        private List<Risk> riskList;
+    }
+
+    /**
+     * 业务主信息
+     */
+    @Data
+    public static class BusinessMainInfo {
+        /** 业务订单号/流水号 */
+        private String orderNo;
+        /** 定价方式(是否定损/议价等) */
+        private String fixPriceType;
+        /** 风控标志(是否触发风控) */
+        private String riskControlFlag;
+        /** 请求唯一标识 */
+        private String uuid;
+        /** 试算次数/试算标记 */
+        private Integer trial;
+        /** 争议解决方式 */
+        private String argueSolution;
+        /** 仲裁机构名称 */
+        private String arbitBoardName;
+        /** 业务类型(个商、车商、直销等) */
+        private String businessType;
+        /** 机构代码(归属机构/承保机构) */
+        private String comCode;
+        /** 业务一级分类 */
+        private String businessCategories1;
+        /** 业务二级分类 */
+        private String businessCategories2;
+        /** 业务三级分类 */
+        private String businessCategories3;
+        /** 处理人代码(经办人) */
+        private String handlerCode;
+        /** 中介/代理代码 */
+        private String agentCode;
+        /** 中介/代理名称 */
+        private String agentName;
+        /** 协议/协议号 */
+        private String agreementNo;
+        /** 城市代码 */
+        private String cityCode;
+        /** 区县代码 */
+        private String countyCode;
+        /** 受理/操作日期 */
+        private String operateDate;
+        /** 目标客户标识(是否目标客户) */
+        private String goalInsuredFlag;
+        /** 承保单位/核算单位 */
+        private String underUnit;
+        /** 核保识别类型 */
+        private String identifyType;
+        /** 核保识别明细 */
+        private String identifyDetail;
+        /** 核保识别编号 */
+        private String identifyCode;
+        /** 核保识别VIP标志 */
+        private String identifyVip;
+        /** 计算机IP(操作IP) */
+        private String computerIp;
+        /** 主车种标志(渤海字段) */
+        private String mainCarKindBC;
+        /** 资源类型代码(渠道来源) */
+        private String resourceTypeCode;
+        /** 期望折扣 */
+        private String expectDiscount;
+        /** 报案号/报备号(如有) */
+        private String reportNo;
+        /** 期望佣金 */
+        private String expectedCommission;
+        /** 业务属性(新保/续保等) */
+        private String businessAttribute;
+        /** 渠道类型 */
+        private String channelType;
+        /** 销售人员证件号 */
+        private String salerIdentifyNumber;
+        /** 销售平台/门店标识 */
+        private String sdId;
+        /** 投保方式(同步/投保模式) */
+        private String tbMode;
+        /** 交强险归属单位代码 */
+        private String bussUnitCodeCI;
+        /** 商业险归属单位代码 */
+        private String bussUnitCode;
+        /** 定价模式(标准/自主等) */
+        private String priceMode;
+        /** 高风险评估编号 */
+        private String highRiskAssessId;
+        /** 客户回流类型/再营销类型 */
+        private String reCustomerType;
+        /** 上年调整值(经验调) */
+        private String lastYearAdjustValue;
+    }
+
+    /**
+     * 车辆信息
+     */
+    @Data
+   public static class CarInfo {
+        /** 车辆详细信息 */
+        private ItemCarInfo itemCarInfo;
+
+        /**
+         * 价格信息列表
+         */
+        private List<Object> chargingInfoList;
+
+        /**
+         * 设备列表
+         */
+        private List<Object> deviceList;
+    }
+
+    /**
+     * 车辆详细信息
+     */
+    @Data
+    public static class ItemCarInfo {
+        /** 登记/合格证编号 */
+        private String certificateNo;
+        /** 证件类型(行驶证/登记证等) */
+        private String certificateType;
+        /** 其它能源类型描述 */
+        private String otherEnergyTypeDesc;
+        /** 纯电续航里程 */
+        private String pureRange;
+        /** 燃料类型(渤海字段) */
+        private String pmFuelType;
+        /** 验车状态 */
+        private String carCheckStatus;
+        /** 实际价值/评估价 */
+        private String actualValue;
+        /** 其他使用性质(渤海字段) */
+        private String otherNature7BI;
+        /** 协议价/议定价 */
+        private String negotiatedValue;
+        /** 是否新车标志 */
+        private String newVehicleFlag;
+        /** 号牌号码 */
+        private String licenseNo;
+        /** 车架号(VIN) */
+        private String frameNo;
+        /** 发动机号 */
+        private String engineNo;
+        /** VIN 码 */
+        private String vinNo;
+        /** 无牌标志 */
+        private String noLicenseFlag;
+        /** 号牌底色代码 */
+        private String licenseColorCode;
+        /** 使用性质代码(营运/非营运) */
+        private String useNatureCode;
+        /** 主车种代码 */
+        private String mainCarKindCode;
+        /** 车种代码 */
+        private String carKindCode;
+        /** 品牌型号名称 */
+        private String brandName;
+        /** 核定载客数 */
+        private String seatCount;
+        /** 核定载质量/吨位 */
+        private String tonCount;
+        /** 购置价(新车购置价) */
+        private String purchasePrice;
+        /** 基础购置价(车型基价) */
+        private String basePurchasePrice;
+        /** 排量/功率(L/kW) */
+        private Double exhaustScale;
+        /** 注册日期(初登) */
+        private String enrollDate;
+        /** 使用年限(商业险口径) */
+        private String useYearsBI;
+        /** 使用年限(交强险口径) */
+        private Integer useYearsCI;
+        /** 使用年限(设备口径) */
+        private String useYearsDI;
+        /** 过户标志 */
+        private String chgOwnerFlag;
+        /** 过户类型标志 */
+        private String chgTypeFlag;
+        /** 过户日期 */
+        private String chgOwnerDate;
+        /** 国别属性 */
+        private String countryNature;
+        /** 车型代码(平台车型ID) */
+        private String modelCode;
+        /** 行驶里程数(公里) */
+        private Integer runMiles;
+        /** 行驶地域代码 */
+        private String runAreaCode;
+        /** 交通违法记录说明 */
+        private String trafficViolationRecords;
+        /** 车身颜色代码 */
+        private String colorCode;
+        /** 制造厂商 */
+        private String madeFactory;
+        /** 出厂日期 */
+        private String makeDate;
+        /** 品牌系列 */
+        private String vehicleBrand;
+        /** 整备质量(kg) */
+        private Integer completeKerbMass;
+        /** 号牌种类代码 */
+        private String licenseKindCode;
+        /** 号牌分类 */
+        private String licenseCategory;
+        /** 续保标志(商业险) */
+        private String renewalFlagBI;
+        /** 出险频度等级/损失等级 */
+        private String damagedFactorGrade;
+        /** 特种车标志 */
+        private String specialVehicleFlag;
+        /** 按揭/贷款车辆标志 */
+        private String loanVehicleFlag;
+        /** 占比/份额(共保/共管) */
+        private String proportion;
+        /** 节能/新能源标志 */
+        private String energySavingOrNewEnergy;
+        /** 上次承保公司代码 */
+        private String lastProducerCode;
+        /** 抵押/债权标志 */
+        private String debtFlag;
+        /** 限行/限制标志 */
+        private String restricFlag;
+        /** 查询流水号(核档/车型查询) */
+        private String searchSequenceNo;
+        /** 是否营运出租车(网约/出租) */
+        private String isTaxi;
+        /** 燃料类型1 */
+        private String fuelType1;
+        /** 指定查询区域 */
+        private String specifiedQueryArea;
+        /** 行业车型代码 */
+        private String industryCarTypeCode;
+        /** 行业车型名称 */
+        private String industryCarTypeName;
+        /** 是否ABS */
+        private String carABSFlag;
+        /** 燃料类型2 */
+        private String fuelType2;
+        /** 微型车标志 */
+        private String miniCar;
+        /** 车辆所在地代码 */
+        private String carAddressCode;
+        /** 证件签发日期 */
+        private String issueDate;
+        /** 是否新加装设备 */
+        private String newDeviceFlag;
+        /** 发票号 */
+        private String invoiceNo;
+        /** 车主地址 */
+        private String ownerAddress;
+        /** 牵引车类型 */
+        private String tractorType;
+        /** 无赔优调整原因 */
+        private String noClaimAdjustReason;
+        /** 无赔优年数(商业险) */
+        private String noDamageYearsBI;
+        /** 无赔优年数(交强险) */
+        private String noDamageYearsCI;
+        /** 忠诚度未调整原因 */
+        private String noLoyaltyAdjustReason;
+        /** 动力类型(油/电/混动等) */
+        private String powerType;
+        /** 动力类型代码 */
+        private String powerTypeCode;
+        /** 车系 */
+        private String series;
+        /** 车系代码 */
+        private String seriesCode;
+        /** 优先服务商类型 */
+        private String priorityServicerType;
+        /** 优先服务商代码 */
+        private String priorityServicerCode;
+        /** 通知类型 */
+        private String noticeType;
+        /** 纯风险保费 */
+        private String pureRiskPremium;
+        /** 外籍/外地车标志 */
+        private String ecdemicVehicleFlag;
+        /** 新车标志 */
+        private String newCarFlag;
+        /** 预填排量(展示用途) */
+        private String prnExhaustScale;
+        /** 预填整备质量(展示用途) */
+        private String prnCompleteKerbMassNew;
+        /** 是否网约车标志 */
+        private Integer isNetworkCar;
+        /** 功率(kW) */
+        private String power;
+        /** 使用性质(如家用/营运) */
+        private String carUsage;
+        /** 验车人员 */
+        private String carChecker;
+        /** 验车时间 */
+        private String carCheckTime;
+        /** 核档/校验原因 */
+        private String verifyReason;
+        /** 延迟验车天数 */
+        private String carCheckDelayDays;
+        /** 核档其他原因说明 */
+        private String verifyReasonOtherReason;
+        /** 核档状态 */
+        private String verifyStatus;
+        /** 验车不通过原因 */
+        private String carCheckReason;
+        /** 验车其他原因 */
+        private String carCheckOtherReason;
+        /** 风险类型 */
+        private String riskType;
+        /** 车型唯一标识(外部平台) */
+        private String vehicleStyleUniqueId;
+        /** 是否新车(逻辑标识) */
+        private String isNewCar;
+        /** 交易前置车牌号(如查二手车) */
+        private String jyPreCarNo;
+
+    }
+
+    /**
+     * 被保险人
+     */
+    @Data
+    public static class Insured {
+        /** 序号(列表顺序) */
+        private String serialNo;
+        /** 客户代码(保险公司侧客户号) */
+        private String insuredCode;
+        /** 证件号/统一社会信用代码 */
+        private String identifyNumber;
+        /** 证件类型 */
+        private String identifyType;
+        /** 姓名/单位名称 */
+        private String insuredName;
+        /** 关系标志(1投保人/2被保人/3受益人等) */
+        private String insuredFlag;
+        /** 客户类型(个人/团体) */
+        private String insuredType;
+        /** 性别(个人适用) */
+        private String gender;
+        /** 客户性质(企事业等属性) */
+        private String insuredNature;
+        /** 固定电话 */
+        private String phoneNumber;
+        /** 手机号 */
+        private String mobile;
+        /** 通讯地址 */
+        private String insuredAddress;
+        /** 邮编 */
+        private String postCode;
+        /** 邮寄地址 */
+        private String postAddress;
+        /** 组织机构代码(旧) */
+        private String orgCode;
+        /** 年龄(个人适用) */
+        private Object age;
+        /** 生日(yyyy-MM-dd) */
+        private String birthDay;
+        /** 是否个体工商户 */
+        private String isIndividualBusi;
+        /** 公民身份标识(渤海字段) */
+        private String appliCitizenshipBC;
+        /** 国家/地区代码(渤海字段) */
+        private String appliCountryBC;
+        /** 邮箱 */
+        private String email;
+        /** 营业执照类型(单位适用) */
+        private String businessLicenseType;
+        /** 民族(个人适用) */
+        private String nation;
+        /** 证件地址 */
+        private String identifyAddress;
+        /** 证件有效期起 */
+        private String identifyStartDate;
+        /** 证件有效期止 */
+        private String identifyEndDate;
+        /** 与车辆关系(所有人/使用人等) */
+        private String carInsuredRelation;
+        /** 业务分类(客户分群) */
+        private String businessSort;
+        /** 联系人姓名 */
+        private String linkerName;
+        /** 是否特定关系人 */
+        private String isSpecialDInsured;
+        /** 特定关系人姓名 */
+        private String specialDInsuredName;
+        /** 特定关系人证件类型 */
+        private String specialDInsuredIDType;
+        /** 特定关系人证件号 */
+        private String specialDInsuredID;
+        /** 无特定关系人证明标记 */
+        private String noSpecialDInsuredP;
+        /** 是否指定受益人 */
+        private String benefitFlag;
+        /** 是否绿色产业客户 */
+        private String isGreenIndustryFlag;
+        /** 绿色产业一级编码 */
+        private String greenIndustryFCode;
+        /** 绿色产业二级编码 */
+        private String greenIndustrySCode;
+        /** 绿色产业三级编码 */
+        private String greenIndustryTCode;
+    }
+
+    /**
+     * 险种信息
+     */
+    @Data
+    public static class Risk {
+        /** 险别条款明细列表 */
+        private List<ItemKind> itemKindList;
+        /** 险种主信息(生效时间、折扣、系数等) */
+        private RiskMainInfo riskMainInfo;
+        /** 车船税信息(仅交强险相关) */
+        private CarShipTaxInfo carShipTaxInfo;
+    }
+    /**
+     * 险别条款
+     */
+    @Data
+    public static class ItemKind {
+        /** 险别序号 */
+        private String itemKindNo;
+        /** 险别代码 */
+        private String kindCode;
+        /** 险别名称 */
+        private String kindName;
+        /** 操作类型(新增/变更等) */
+        private String operateType;
+        /** 起期(yyyy-MM-dd) */
+        private String startDate;
+        /** 起期小时(00-24) */
+        private String startHour;
+        /** 止期(yyyy-MM-dd) */
+        private String endDate;
+        /** 止期小时(00-24) */
+        private String endHour;
+        /** 保额 */
+        private String amount;
+        /** 单位保额(按单位计价时使用) */
+        private String unitAmount;
+        /** 数量(座/件/次等) */
+        private String quantity;
+        /** 计费方式代码 */
+        private String modeCode;
+        /** 计费方式名称 */
+        private String modeName;
+        /** 短期费率标志 */
+        private String shortRateFlag;
+        /** 短期费率 */
+        private String shortRate;
+        /** 计算标志(是否计费) */
+        private String calculateFlag;
+        /** 费率(基础或实用) */
+        private String rate;
+        /** 不计免赔标志 */
+        private String notDeductibleFlag;
+        /** 免赔率/免赔比例 */
+        private String deductibleRatio;
+        /** 折扣系数(险别层面) */
+        private String discount;
+        /** 调整系数(人工或渠道) */
+        private String adjustRate;
+        /** 其它取值(如保额档次/档位) */
+        private String value;
+
+        // getter/setter省略
+    }
+    /**
+     * 险种主信息
+     */
+    @Data
+    public static class RiskMainInfo {
+        /** 是否含驾意险费用 */
+        private String isDrivingFee;
+        /** 农险标志 */
+        private String agriflag;
+        /** 险类代码(车险类) */
+        private String classCode;
+        /** 险种代码(交强/商业) */
+        private String riskCode;
+        /** 合同号/保单号(历史) */
+        private String contractNo;
+        /** 折扣(险种层面) */
+        private String discount;
+        /** 币种 */
+        private String currency;
+        /** 上年保单号 */
+        private String lastPolicyNo;
+        /** 续保标志 */
+        private String renewalFlag;
+        /** 起保日期 */
+        private String startDate;
+        /** 起保小时 */
+        private String startHour;
+        /** 止保日期 */
+        private String endDate;
+        /** 止保小时 */
+        private String endHour;
+        /** 是否即时生效 */
+        private String immediatelyActiveFlag;
+        /** 生效开始时间 */
+        private String activeStartTime;
+        /** 生效结束时间 */
+        private String activeEndTime;
+        /** 查询序号(核保/核价查询) */
+        private String querySequenceNo;
+        /** 确认序号(确认报价/核保) */
+        private String confirmSequenceNo;
+        /** 是否有特别约定 */
+        private String specialContractFlag;
+        /** 特别约定摘要 */
+        private String specialContractSummary;
+        /** 无波动费率标志 */
+        private String noneFluctuateFlag;
+        /** 无赔优系数(NCD) */
+        private String ncdCoefficient;
+        /** 渠道系数 */
+        private String channelCoefficient;
+        /** 承保系数(核保系数) */
+        private String underwritingCoefficient;
+        /** 调整系数(人工校正) */
+        private String adjustCoefficient;
+        /** 交通违法系数 */
+        private String trafficViolationCoefficient;
+        /** 渠道系数变动值 */
+        private String channelCoefficientVariation;
+        /** 承保系数变动值 */
+        private String underwritingCoefficientVariation;
+        /** 是否需要出报价 */
+        private String ifNeedQuote;
+        /** 期望费率 */
+        private String hopeRate;
+        /** 投保单号 */
+        private String proposalNo;
+        /** 客户属性 */
+        private String customerProperty;
+        /** 风险系数 */
+        private String riskCoefficient;
+        /** 商业因素系数 */
+        private String businessCoefficient;
+        /** 车辆因素系数 */
+        private String vehicleCoefficient;
+        /** 客户因素系数 */
+        private String customerCoefficient;
+        /** 车队系数 */
+        private String fleetCoefficient;
+        /** 条款类型 */
+        private String clauseType;
+        /** 签单日期 */
+        private String signDate;
+        /** 操作日期 */
+        private String operateDate;
+        /** 录入日期 */
+        private String inputDate;
+        /** 图片校验码 */
+        private String pictureVerificationCode;
+        /** 特别批复码 */
+        private String specialApprovalCode;
+        /** 团单编码/集团代码 */
+        private String groupBillCode;
+        /** 定价方案ID/价格ID */
+        private String priceId;
+        /** 不含税金额 */
+        private String noTaxAmount;
+        /** 税额 */
+        private String taxAmount;
+        /** 定价调整值 */
+        private String pricingAdjustValue;
+        /** 经验定价调整值 */
+        private String expPricingAdjustValue;
+        /** 不浮动费用率 */
+        private String NoneFluctuateFeeRate;
+
+        // getter/setter省略
+    }
+    /**
+     * 车船税信息
+     */
+    @Data
+    public static class CarShipTaxInfo {
+        /** 完税/免税凭证日期 */
+        private String taxDocumentDate;
+        /** 缴税所在地代码 */
+        private String taxPaidAreaCode;
+        /** 纳税人标识(类型+号码组合) */
+        private String taxPayerIdentifier;
+        /** 纳税人名称 */
+        private String taxPayerName;
+        /** 纳税人证件类型 */
+        private String taxPayerIdentifyNumberType;
+        /** 纳税人证件号码 */
+        private String taxPayerIdentifyNumber;
+        /** 纳税人组织机构代码 */
+        private String taxPayerOrgCode;
+        /** 空载质量(车船税口径) */
+        private Integer unladenMassCS;
+        /** 号牌分类(车船税口径) */
+        private String licenseCategory;
+        /** 证书/凭证日期 */
+        private String certificateDate;
+        /** 税务机构代码 */
+        private String taxComCode;
+        /** 税务机构名称 */
+        private String taxComName;
+        /** 税目代码 */
+        private String taxItemCode;
+        /** 税目名称 */
+        private String taxItemName;
+        /** 减免税标志 */
+        private String taxRelifFlag;
+        /** 减免税原因 */
+        private String reliefReason;
+        /** 计税基数 */
+        private String baseTaxation;
+        /** 减免税额 */
+        private String taxRelief;
+        /** 减免税比例 */
+        private String reliefRate;
+        /** 减免税说明 */
+        private String reliefDescription;
+        /** 已缴/免税凭证号 */
+        private String paidFreeCertificate;
+        /** 免税原因 */
+        private String exemptionReason;
+        /** 计费方式(按年/按月等) */
+        private String calculateMode;
+        /** 是否补缴上年税费 */
+        private String payLastYear;
+        /** 上年保单止期(参考) */
+        private String hisPolicyEndDate;
+        /** 补缴余额 */
+        private String payBalanceFee;
+        /** 滞纳金起算日期 */
+        private String lateFeeStartDate;
+        /** 是否计算滞纳金 */
+        private String calLateFeeFlag;
+        /** 是否计算补缴余额 */
+        private String calPayBalanceFeeFlag;
+        /** 税种类型 */
+        private String taxType;
+        /** 税务编号类型 */
+        private String taxNumType;
+        /** 税务编号 */
+        private String taxNum;
+        /** 缴税日期 */
+        private String payTaxDate;
+        /** 车主性质(个人/单位) */
+        private String carOwnerNature;
+        /** 整备质量(车船税口径) */
+        private String completeKerbMass;
+        /** 车主姓名/单位名称 */
+        private String carOwnerName;
+        /** 地址(行政区划) */
+        private String addressName;
+        /** 邮寄地址 */
+        private String postAddress;
+        /** 邮编 */
+        private String postCode;
+        /** 联系电话 */
+        private String phoneNumber;
+        /** 车辆所在地代码 */
+        private String carAddressCode;
+        /** 单位名称(单位车主适用) */
+        private String companyName;
+        /** 组织机构证书号/单位证件号 */
+        private String unitCertiNo;
+        /** 注册地址 */
+        private String registeredAddress;
+        /** 原号牌号码(过户/变更) */
+        private String preLicenseNo;
+        /** 交易日期 */
+        private String transactionDate;
+        /** 备用日期1 */
+        private String extendDate1;
+        /** 计算机编号/流水 */
+        private String computerNo;
+        /** 国家代码 */
+        private String countryCode;
+        /** 车辆所在地街道代码 */
+        private String carAddressStreetCode;
+        /** 使用性质(税收口径) */
+        private String useType;
+        /** 统一社会信用代码(单位) */
+        private String creditCode;
+        /** 缴税开始日期 */
+        private String payStartDate;
+        /** 缴税结束日期 */
+        private String payEndDate;
+        /** 是否计算税费 */
+        private String calFeeFlag;
+        /** 身份识别号(税务) */
+        private String identificationNo;
+        /** 证件类型(税务) */
+        private String certificateType;
+    }
+}

+ 157 - 7
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust.java

@@ -36,15 +36,27 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
     @Serial
     private static final long serialVersionUID = 5738667931387435773L;
 
+    /**
+     * 车辆信息
+     */
     @JsonProperty("vehicle")
     private VehicleDTO vehicle;
 
+    /**
+     * 车主信息
+     */
     @JsonProperty("carOwner")
     private CarOwnerDTO carOwner;
 
+    /**
+     * 投保人信息
+     */
     @JsonProperty("holder")
     private HolderDTO holder;
 
+    /**
+     * 被保险人信息
+     */
     @JsonProperty("insureder")
     private InsurederDTO insureder;
 
@@ -103,6 +115,9 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("plateNo")
         private String plateNo;
 
+        /**
+         * 号牌类型
+         */
         @JsonProperty("licenseType")
         private String licenseType;
 
@@ -130,6 +145,9 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("moldName")
         private String moldName;
 
+        /**
+         * 车型代码
+         */
         @JsonProperty("modelCode")
         private String modelCode;
         /**
@@ -139,6 +157,9 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         private String seatCount;
 
 
+        /**
+         * 购车发票日期
+         */
         @JsonProperty("purchaseinvoicesDate")
         private String purchaseinvoicesDate;
 
@@ -208,33 +229,49 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("transferDate")
         private String transferDate;
 
+        /**
+         * 行驶证车辆类型
+         */
         @JsonProperty("vehicleTypeOfDrivingPermit")
         private String vehicleTypeOfDrivingPermit;
 
+        /**
+         * 二手车标志
+         */
         @JsonProperty("secondHandVehicleFlag")
         private String secondHandVehicleFlag;
 
 
         public VehicleDTO(CarInfoVo carInfo, BoHaiCrawlerCarResponse vehicleModelsDTO, String effectDate) {
             this.carVin = carInfo.getVinNo();
-            this.vehicleModelCode = vehicleModelsDTO.getList().get(0).getVehicleModelCode();
+            //车型编码
+            //this.vehicleModelCode = vehicleModelsDTO.getList().get(0).getModelCode();
+            this.vehicleModelCode = vehicleModelsDTO.getPrpDCarModels().get(0).getModelCode();
             this.engineNo = carInfo.getEngineNo();
             this.plateNo = carInfo.getLicenseNo();
             this.licenseType = "02";
             this.registerDate = carInfo.getRegisterDate();
-            this.purchasePrice = vehicleModelsDTO.getList().get(0).getPurchasePrice();
+            //this.purchasePrice = vehicleModelsDTO.getList().get(0).getPurchasePrice();
+            this.purchasePrice = vehicleModelsDTO.getPrpDCarModels().get(0).getPurchasePrice();
+
             // 新车
             this.newVehicleFlag = StringUtils.isNotEmpty(carInfo.getLicenseNo()) ? "0" : "1";
             //车型名称 (品牌型号)
-            this.moldName = vehicleModelsDTO.getList().get(0).getMoldName();
+            //this.moldName = vehicleModelsDTO.getList().get(0).getMoldName();
+            this.moldName = vehicleModelsDTO.getPrpDCarModels().get(0).getModelName();
+
             //模型编码
-            this.modelCode = vehicleModelsDTO.getList().get(0).getModelCode();
+            //this.modelCode = vehicleModelsDTO.getList().get(0).getModelCode();
+            this.modelCode = vehicleModelsDTO.getPrpDCarModels().get(0).getModelCode();
 
             this.seatCount = carInfo.getSeatCount();
             this.tonNumber = StringUtils.isEmpty(carInfo.getLimitLoad()) ? "0": carInfo.getLimitLoad();
             this.fuelType = carInfo.getEnergyTypeCode();
             this.emptyWeight = carInfo.getCompleteKerbMass();
-            this.exhaustMeasure = vehicleModelsDTO.getList().get(0).getVehicleExhaust();
+            //排气量
+            //this.exhaustMeasure = vehicleModelsDTO.getList().get(0).getExhaustScale();
+            this.exhaustMeasure = vehicleModelsDTO.getPrpDCarModels().get(0).getModelName();
+
             this.effectDate = effectDate;
             this.vehicleKind = carInfo.getCarKindCode();
             this.vehicleAffNature = carInfo.getPropertyCode();
@@ -256,18 +293,33 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
 
         private static final long serialVersionUID = 8709315851618789033L;
 
+        /**
+         * 证件类型
+         */
         @JsonProperty("certType")
         private String certType;
 
+        /**
+         * 车主姓名
+         */
         @JsonProperty("ownerName")
         private String ownerName;
 
+        /**
+         * 证件号码
+         */
         @JsonProperty("certNo")
         private String certNo;
 
+        /**
+         * 地址
+         */
         @JsonProperty("address")
         private String address;
 
+        /**
+         * 电话号码
+         */
         @JsonProperty("phoneNumber")
         private String phoneNumber;
 
@@ -277,7 +329,7 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("customerType")
         private String customerType;
         /**
-         *
+         * 证件类型标识
          */
         @JsonProperty("certiType")
         private String certiType;
@@ -319,9 +371,15 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("distName")
         private String distName;
 
+        /**
+         * 居住地址
+         */
         @JsonProperty("residentialAddress")
         private String residentialAddress;
 
+        /**
+         * 出生日期
+         */
         @JsonProperty("birthday")
         private String birthday;
 
@@ -351,51 +409,99 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
 
         private static final long serialVersionUID = -2088635630636574306L;
 
+        /**
+         * 证件类型
+         */
         @JsonProperty("certType")
         private String certType;
 
+        /**
+         * 投保人姓名
+         */
         @JsonProperty("holderName")
         private String holderName;
 
+        /**
+         * 证件号码
+         */
         @JsonProperty("certNo")
         private String certNo;
 
+        /**
+         * 地址
+         */
         @JsonProperty("address")
         private String address;
 
+        /**
+         * 电话号码
+         */
         @JsonProperty("phoneNumber")
         private String phoneNumber;
 
+        /**
+         * 民族
+         */
         @JsonProperty("nation")
         private String nation;
 
+        /**
+         * 证件开始日期
+         */
         @JsonProperty("certiStartDate")
         private String certiStartDate;
 
+        /**
+         * 证件结束日期
+         */
         @JsonProperty("certiEndDate")
         private String certiEndDate;
 
+        /**
+         * 证件类型标识
+         */
         @JsonProperty("certiType")
         private String certiType;
 
+        /**
+         * 签发机关
+         */
         @JsonProperty("issuer")
         private String issuer;
 
+        /**
+         * 邮箱
+         */
         @JsonProperty("email")
         private String email;
 
+        /**
+         * 发票类型
+         */
         @JsonProperty("invoiceType")
         private String invoiceType;
 
+        /**
+         * 商业险格式类型
+         */
         @JsonProperty("bizFormatType")
         private String bizFormatType;
 
+        /**
+         * 交强险格式类型
+         */
         @JsonProperty("forceFormatType")
         private String forceFormatType;
 
+        /**
+         * 电子投保标识
+         */
         @JsonProperty("elecApplicationFlag")
         private String elecApplicationFlag;
 
+        /**
+         * 客户类型
+         */
         @JsonProperty("customerType")
         private String customerType;
 
@@ -431,9 +537,15 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("distName")
         private String distName;
 
+        /**
+         * 居住地址
+         */
         @JsonProperty("residentialAddress")
         private String residentialAddress;
 
+        /**
+         * 出生日期
+         */
         @JsonProperty("birthday")
         private String birthday;
 
@@ -475,36 +587,69 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
 
         private static final long serialVersionUID = 1045840175935280892L;
 
+        /**
+         * 证件类型
+         */
         @JsonProperty("certType")
         private String certType;
 
+        /**
+         * 被保险人姓名
+         */
         @JsonProperty("insuredName")
         private String insuredName;
 
+        /**
+         * 证件号码
+         */
         @JsonProperty("certNo")
         private String certNo;
 
+        /**
+         * 地址
+         */
         @JsonProperty("address")
         private String address;
 
+        /**
+         * 电话号码
+         */
         @JsonProperty("phoneNumber")
         private String phoneNumber;
 
+        /**
+         * 民族
+         */
         @JsonProperty("nation")
         private String nation;
 
+        /**
+         * 证件开始日期
+         */
         @JsonProperty("certiStartDate")
         private String certiStartDate;
 
+        /**
+         * 证件结束日期
+         */
         @JsonProperty("certiEndDate")
         private String certiEndDate;
 
+        /**
+         * 证件类型标识
+         */
         @JsonProperty("certiType")
         private String certiType;
 
+        /**
+         * 客户类型
+         */
         @JsonProperty("customerType")
         private String customerType;
 
+        /**
+         * 邮箱
+         */
         @JsonProperty("email")
         private String email;
 
@@ -540,10 +685,15 @@ public class BoHaiCrawlerVehicleConfirmationReqeust {
         @JsonProperty("distName")
         private String distName;
 
+        /**
+         * 居住地址
+         */
         @JsonProperty("residentialAddress")
         private String residentialAddress;
 
-
+        /**
+         * 出生日期
+         */
         @JsonProperty("birthday")
         private String birthday;
 

+ 348 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust1.java

@@ -0,0 +1,348 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 车辆确认请求接口
+ * @author: shenwd
+ * @date: 2025/3/3 16:53
+ **/
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerVehicleConfirmationReqeust1 implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5738667931387435773L;
+
+    /**
+     * 请求头信息
+     */
+    @JSONField(ordinal = 1)
+    @JsonProperty("head")
+    private HeadDTO head;
+
+    /**
+     * 请求体信息
+     */
+    @JSONField(ordinal = 2)
+    @JsonProperty("body")
+    private BodyDTO body;
+
+    /**
+     * 请求头信息DTO
+     */
+    @NoArgsConstructor
+    @Data
+    public static class HeadDTO implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 交易代码
+         */
+        @JsonProperty("transCode")
+        private String transCode;
+
+        /**
+         * 交易类型
+         */
+        @JsonProperty("transType")
+        private String transType;
+
+        /**
+         * 令牌
+         */
+        @JsonProperty("token")
+        private String token;
+    }
+
+    /**
+     * 请求体信息DTO
+     */
+    @NoArgsConstructor
+    @Data
+    public static class BodyDTO implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 基本费率代码
+         */
+        @JsonProperty("basicRateCode")
+        private String basicRateCode;
+
+        /**
+         * 机构代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 生效日期
+         */
+        @JsonProperty("effectiveDate")
+        private String effectiveDate;
+
+        /**
+         * 到期日期
+         */
+        @JsonProperty("expireDate")
+        private String expireDate;
+
+        /**
+         * 结束小时
+         */
+        @JsonProperty("endHour")
+        private String endHour;
+
+        /**
+         * 开始小时
+         */
+        @JsonProperty("startHour")
+        private String startHour;
+
+        /**
+         * 险种代码
+         */
+        @JsonProperty("riskCode")
+        private String riskCode;
+
+        /**
+         * 业务性质
+         */
+        @JsonProperty("businessNature")
+        private String businessNature;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        private String engineNo;
+
+        /**
+         * 车架号/VIN
+         */
+        @JsonProperty("VIN")
+        private String vin;
+
+        /**
+         * 车牌号
+         */
+        @JsonProperty("licensePlateNo")
+        private String licensePlateNo;
+
+        /**
+         * 车牌类型
+         */
+        @JsonProperty("licensePlateType")
+        private String licensePlateType;
+
+        /**
+         * 初登日期
+         */
+        @JsonProperty("firstRegisterDate")
+        private String firstRegisterDate;
+
+        /**
+         * 车型代码(系统内部车型唯一标识)
+         */
+        @JsonProperty("modelCode")
+        private String modelCode;
+
+        /**
+         * 平台车型代码
+         */
+        @JsonProperty("platFormModelCode")
+        private String platFormModelCode;
+
+        /**
+         * 通知类型
+         */
+        @JsonProperty("noticeType")
+        private String noticeType;
+
+        /**
+         * 车型
+         */
+        @JsonProperty("vehicleModel")
+        private String vehicleModel;
+
+        /**
+         * 车型描述
+         */
+        @JsonProperty("vehicleStyleDesc")
+        private String vehicleStyleDesc;
+
+        /**
+         * 车名
+         */
+        @JsonProperty("carName")
+        private String carName;
+
+        /**
+         * 车辆品牌
+         */
+        @JsonProperty("vehicleBrand")
+        private String vehicleBrand;
+
+        /**
+         * 制造厂
+         */
+        @JsonProperty("madeFactory")
+        private String madeFactory;
+
+        /**
+         * 排量(L)
+         */
+        @JsonProperty("exhaustScale")
+        private Double exhaustScale;
+
+        /**
+         * 排气量
+         */
+        @JsonProperty("displacement")
+        private String displacement;
+
+        /**
+         * 功率
+         */
+        @JsonProperty("power")
+        private String power;
+
+        /**
+         * 车型能源类型
+         */
+        @JsonProperty("modelEnergyType")
+        private String modelEnergyType;
+
+        /**
+         * 纯电动续航里程
+         */
+        @JsonProperty("pureRange")
+        private String pureRange;
+
+        /**
+         * 主车型代码
+         */
+        @JsonProperty("mainCarKindCode")
+        private String mainCarKindCode;
+
+        /**
+         * 动力类型代码
+         */
+        @JsonProperty("motorTypeCode")
+        private String motorTypeCode;
+
+        /**
+         * 机动车主类型代码
+         */
+        @JsonProperty("motorMainTypeCode")
+        private String motorMainTypeCode;
+
+        /**
+         * 机动车使用类型代码
+         */
+        @JsonProperty("motorUsageTypeCode")
+        private String motorUsageTypeCode;
+
+        /**
+         * 额定载客量
+         */
+        @JsonProperty("ratedPassengerCapacity")
+        private String ratedPassengerCapacity;
+
+        /**
+         * 核定载客人数
+         */
+        @JsonProperty("limitLoadPerson")
+        private String limitLoadPerson;
+
+        /**
+         * 吨位
+         */
+        @JsonProperty("tonnage")
+        private String tonnage;
+
+        /**
+         * 核定载质量
+         */
+        @JsonProperty("limitLoad")
+        private String limitLoad;
+
+        /**
+         * 整备质量
+         */
+        @JsonProperty("wholeWeight")
+        private String wholeWeight;
+
+        /**
+         * 更换价值
+         */
+        @JsonProperty("replacementValue")
+        private String replacementValue;
+
+        /**
+         * 新车标志
+         */
+        @JsonProperty("newVehicleFlag")
+        private String newVehicleFlag;
+
+        /**
+         * 疫区车标志
+         */
+        @JsonProperty("ecdemicVehicleFlag")
+        private String ecdemicVehicleFlag;
+
+        /**
+         * 是否I3险标志
+         */
+        @JsonProperty("isI3RiskFlag")
+        private String isI3RiskFlag;
+
+        /**
+         * LF日期
+         */
+        @JsonProperty("lfDate")
+        private String lfDate;
+
+        /**
+         * 发证日期
+         */
+        @JsonProperty("certificateDate")
+        private String certificateDate;
+
+        /**
+         * 车主性质
+         */
+        @JsonProperty("carOwnerNature")
+        private String carOwnerNature;
+
+        /**
+         * 车主证件类型
+         */
+        @JsonProperty("carOwnerIdentifyType")
+        private String carOwnerIdentifyType;
+
+        /**
+         * 销售渠道参考代码
+         */
+        @JsonProperty("salesChannelRefCode")
+        private String salesChannelRefCode;
+
+        /**
+         * 精准价格机构代码
+         */
+        @JsonProperty("PrecisePriceComCode")
+        private Boolean precisePriceComCode;
+    }
+
+
+}

+ 26 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust2.java

@@ -0,0 +1,26 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 车辆确认真正的请求接口
+ * @author: shenwd
+ * @date: 2025/3/3 16:53
+ **/
+@Data
+public class BoHaiCrawlerVehicleConfirmationReqeust2 implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5738667931387435773L;
+
+    private String encryptionData;
+
+    private String md5;
+
+}

+ 136 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CarModelDataDTO.java

@@ -0,0 +1,136 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.ALWAYS)
+public class CarModelDataDTO {
+    
+    @JsonProperty("basePart")
+    private Object basePart;
+    
+    @JsonProperty("prpDCarModels")
+    private List<PrpDCarModel> prpDCarModels;
+    
+    @JsonProperty("modelPrices")
+    private Object modelPrices;
+    
+    @JsonProperty("jyCarModelFill")
+    private JyCarModelFill jyCarModelFill;
+    
+    @JsonProperty("jyFillErrorMsg")
+    private String jyFillErrorMsg;
+    
+    @JsonProperty("preFillErrorMsg")
+    private String preFillErrorMsg;
+    
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class PrpDCarModel {
+        private String modelCode;
+        private String industryCarTypeCode;
+        private String industryCarTypeName;
+        private String shorthandCode;
+        private String carKind;
+        private String carStyle;
+        private String modelName;
+        private String carSeriesName;
+        private String seatCount;
+        private String tonCount;
+        private String exhaustScale;
+        private String factory;
+        private String countryCode;
+        private String purchasePrice;
+        private String riskScope;
+        private String validDate;
+        private String validstatus;
+        private String remark;
+        private String flag;
+        private String coefficient1;
+        private String coefficient2;
+        private String carBrand;
+        private String carYear;
+        private String carSeriesCode;
+        private String completeKerbMass;
+        private String riskType;
+        private String factoryCode;
+        private String carBrandCode;
+        private String safeDevice;
+        private String airbag;
+        private String absFlag;
+        private String seatCountUpper;
+        private String seatCountLower;
+        private String purchasePriceTax;
+        private String analogPrice;
+        private String analogPriceTax;
+        private String powerType;
+        private String powerTypeCode;
+        private String hfName;
+        private String hfCode;
+        private String groupName;
+        private String groupCode;
+        private String newVehiclecLass;
+        private String newVehicleClassCode;
+        private String seatMin;
+        private String seatMax;
+        private String power;
+        private String marketDate;
+        private String syxClassname;
+        private String cfactoryId;
+        private String cfamilId;
+        private String ctransmissionType;
+        private String crefVegicleId;
+        private String cqualityMin;
+        private String ckindRedCar;
+        private String tdateCreated;
+        private String tdateUpdated;
+        private String syxclassId;
+        private String jqxclassId;
+        private String nstate;
+    }
+    
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class JyCarModelFill {
+        private String referenceNo;
+        private String reTimestamp;
+        private String isNewCar;
+        private String plateNumber;
+        private String vinCodeRe;
+        private String trackingNumber;
+        private String overallStatus;
+        private String overallMessage;
+        private String transactionID;
+        private String responseVersion;
+        private String resultCode;
+        private String resultDesc;
+        private String vinCode;
+        private String curbWeight;
+        private String displacement;
+        private String engineModel;
+        private String engineNumber;
+        private String powerNum;
+        private String ratedCapacity;
+        private String ratedLoad;
+        private String totalMassTraction;
+        private String useCharacter;
+        private String registerDate;
+        private String comCode;
+        private String operatorCode;
+        private String resourceTypeCode;
+        private String plateNoColor;
+        private String validStatus;
+    }
+}

+ 396 - 6
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleInfoDTO.java

@@ -9,206 +9,596 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 
+/**
+ * 渤海保险车辆信息请求DTO
+ * 包含车辆基本信息、证件信息、价格信息等完整数据
+ */
 @NoArgsConstructor
 @Data
 public class VehicleInfoDTO {
 
+    /**
+     * 车辆代码
+     */
     @JsonProperty("vehicleCode")
     private String vehicleCode;
+
+    /**
+     * 交强险问题
+     */
     @JsonProperty("jqQuestion")
     private String jqQuestion;
+
+    /**
+     * 交强险答案
+     */
     @JsonProperty("jqAnswer")
     private String jqAnswer;
+
+    /**
+     * 商业险问题
+     */
     @JsonProperty("syQuestion")
     private String syQuestion;
+
+    /**
+     * 商业险答案
+     */
     @JsonProperty("syAnswer")
     private String syAnswer;
+
+    /**
+     * 保费标志
+     */
     @JsonProperty("premiumFlag")
     private String premiumFlag;
+
+    /**
+     * 纯范围
+     */
     @JsonProperty("pureRange")
     private String pureRange;
+
+    /**
+     * 车牌号
+     */
     @JsonProperty("plateNo")
     private String plateNo;
+
+    /**
+     * 是否有车牌号
+     */
     @JsonProperty("isPlateNo")
     private String isPlateNo;
+
+    /**
+     * VIN码
+     */
     @JsonProperty("vin")
     private String vin;
+
+    /**
+     * 发动机号
+     */
     @JsonProperty("engineNo")
     private String engineNo;
+
+    /**
+     * 车牌类型
+     */
     @JsonProperty("plateType")
     private String plateType;
+
+    /**
+     * 是否外地车
+     */
     @JsonProperty("isFieldCar")
     private String isFieldCar;
+
+    /**
+     * 注册日期
+     */
     @JsonProperty("registerDate")
     private String registerDate;
+
+    /**
+     * 发证日期
+     */
     @JsonProperty("certificationDate")
     private String certificationDate;
+
+    /**
+     * 品牌名称
+     */
     @JsonProperty("brandName")
     private String brandName;
+
+    /**
+     * 品牌
+     */
     @JsonProperty("brand")
     private String brand;
+
+    /**
+     * 车型
+     */
     @JsonProperty("motorType")
     private String motorType;
+
+    /**
+     * 使用性质显示
+     */
     @JsonProperty("useNatureShow")
     private String useNatureShow;
+
+    /**
+     * 车辆类型
+     */
     @JsonProperty("vehicleType")
     private String vehicleType;
+
+    /**
+     * 座位数
+     */
     @JsonProperty("seatCount")
     private String seatCount;
+
+    /**
+     * 购置价
+     */
     @JsonProperty("purchasePrice")
     private String purchasePrice;
+
+    /**
+     * 协商价值
+     */
     @JsonProperty("negotiatedValue")
     private String negotiatedValue;
+
+    /**
+     * 排量
+     */
     @JsonProperty("displacement")
     private String displacement;
+
+    /**
+     * 燃料类型
+     */
     @JsonProperty("fuelType")
     private String fuelType;
+
+    /**
+     * 核定载重
+     */
     @JsonProperty("approvedLoad")
     private String approvedLoad;
+
+    /**
+     * 是否过户车
+     */
     @JsonProperty("isTransferCar")
     private String isTransferCar;
+
+    /**
+     * 特殊标记
+     */
     @JsonProperty("specialMark")
     private String specialMark;
+
+    /**
+     * 贷款车辆标志
+     */
     @JsonProperty("loanVehicleFlag")
     private String loanVehicleFlag;
+
+    /**
+     * 购车日期
+     */
     @JsonProperty("buyCarDate")
     private String buyCarDate;
+
+    /**
+     * 新车标志
+     */
     @JsonProperty("newCarFlag")
     private String newCarFlag;
+
+    /**
+     * 重量
+     */
     @JsonProperty("weight")
     private String weight;
+
+    /**
+     * 协商实际价值
+     */
     @JsonProperty("negotiatedActulValue")
     private String negotiatedActulValue;
+
+    /**
+     * 颜色代码
+     */
     @JsonProperty("colorCode")
     private String colorCode;
+
+    /**
+     * 功率
+     */
     @JsonProperty("power")
     private String power;
+
+    /**
+     * 车队ID
+     */
     @JsonProperty("teamCarId")
     private String teamCarId;
+
+    /**
+     * 车辆校验代码
+     */
     @JsonProperty("vehicleCheckCode")
     private String vehicleCheckCode;
+
+    /**
+     * 车辆证件类型
+     */
     @JsonProperty("vhlCertType")
     private String vhlCertType;
+
+    /**
+     * 车辆证件号
+     */
     @JsonProperty("vhlCertNo")
     private String vhlCertNo;
+
+    /**
+     * 车辆证件日期
+     */
     @JsonProperty("vhlCertDate")
     private String vhlCertDate;
+
+    /**
+     * 吨位
+     */
     @JsonProperty("tonnage")
     private String tonnage;
+    /**
+     * 车主姓名
+     */
     @JsonProperty("carOwnerName")
     private String carOwnerName;
+
+    /**
+     * 过户日期
+     */
     @JsonProperty("transferDate")
     private String transferDate;
+
+    /**
+     * 车牌颜色
+     */
     @JsonProperty("plateColor")
     private String plateColor;
+
+    /**
+     * 登记日期
+     */
     @JsonProperty("enrollDate")
     private String enrollDate;
+
+    /**
+     * 国别性质
+     */
     @JsonProperty("countryNature")
     private String countryNature;
+
+    /**
+     * 车型名称
+     */
     @JsonProperty("carModelName")
     private String carModelName;
+
+    /**
+     * 车辆使用类型
+     */
     @JsonProperty("carUserType")
     private String carUserType;
+
+    /**
+     * 实际价值
+     */
     @JsonProperty("actualValue")
     private String actualValue;
+
+    /**
+     * 与被保险人关系
+     */
     @JsonProperty("relationWithInsured")
     private String relationWithInsured;
+
+    /**
+     * 车架号错误
+     */
     @JsonProperty("frmNoError")
     private String frmNoError;
+
+    /**
+     * 内部客户
+     */
     @JsonProperty("innerCustomer")
     private String innerCustomer;
+
+    /**
+     * 产品系统
+     */
     @JsonProperty("productSystem")
     private String productSystem;
+
+    /**
+     * 抵押标记
+     */
     @JsonProperty("mortgageMrk")
     private String mortgageMrk;
+
+    /**
+     * 过户滚存
+     */
     @JsonProperty("transferRoll")
     private String transferRoll;
+
+    /**
+     * 过户滚存时间
+     */
     @JsonProperty("transferRollTime")
     private String transferRollTime;
+
+    /**
+     * 车辆代码上海
+     */
     @JsonProperty("vehCodeSH")
     private String vehCodeSH;
+
+    /**
+     * 车辆年份
+     */
     @JsonProperty("carYear")
     private String carYear;
+
+    /**
+     * 查询代码
+     */
     @JsonProperty("queryCode")
     private String queryCode;
+
+    /**
+     * 交强险查询代码
+     */
     @JsonProperty("jqQueryCode")
     private String jqQueryCode;
+
+    /**
+     * 最后支付期数
+     */
     @JsonProperty("lastPayNum")
     private String lastPayNum;
+
+    /**
+     * 去年NCD
+     */
     @JsonProperty("lastYearNCD")
     private String lastYearNCD;
+
+    /**
+     * NCD费率
+     */
     @JsonProperty("rateNCD")
     private String rateNCD;
+
+    /**
+     * 预剂量
+     */
     @JsonProperty("predose")
     private String predose;
+
+    /**
+     * 是否修理
+     */
     @JsonProperty("isRepair")
     private String isRepair;
+
+    /**
+     * 修理代码
+     */
     @JsonProperty("repairCode")
     private String repairCode;
+
+    /**
+     * 修理名称
+     */
     @JsonProperty("repairName")
     private String repairName;
+
+    /**
+     * 使用性质交管
+     */
     @JsonProperty("useNatureJG")
     private String useNatureJG;
+
+    /**
+     * 挂车
+     */
     @JsonProperty("haulge")
     private String haulge;
+
+    /**
+     * 是否成功
+     */
     @JsonProperty("isSuccess")
     private String isSuccess;
+
+    /**
+     * 玻璃类型
+     */
     @JsonProperty("glassType")
     private String glassType;
+
+    /**
+     * 车主信息类型
+     */
     @JsonProperty("ownerMessageType")
     private String ownerMessageType;
+
+    /**
+     * 挂车使用代码
+     */
     @JsonProperty("traUsageCde")
     private String traUsageCde;
+
+    /**
+     * 新销售名称
+     */
     @JsonProperty("newSalesName")
     private String newSalesName;
+
+    /**
+     * 新销售区域代码
+     */
     @JsonProperty("newSalesAreaCode")
     private String newSalesAreaCode;
+
+    /**
+     * 销售商店
+     */
     @JsonProperty("saleShop")
     private String saleShop;
+
+    /**
+     * 特殊风险标志
+     */
     @JsonProperty("specialRiskFlag")
     private String specialRiskFlag;
+
+    /**
+     * 车辆类型一级
+     */
     @JsonProperty("vehicleTypeFirst")
     private String vehicleTypeFirst;
+
+    /**
+     * 车辆类型二级
+     */
     @JsonProperty("vehicleTypeSecond")
     private String vehicleTypeSecond;
+
+    /**
+     * 新功率
+     */
     @JsonProperty("newPower")
     private String newPower;
+
+    /**
+     * 车队订单号
+     */
     @JsonProperty("teamOrderNo")
     private String teamOrderNo;
+
+    /**
+     * 车队订单名称
+     */
     @JsonProperty("teamOrderName")
     private String teamOrderName;
+
+    /**
+     * 确认代码
+     */
     @JsonProperty("affirmCde")
     private String affirmCde;
+
+    /**
+     * 车型能源类型
+     */
     @JsonProperty("modelEnergyType")
     private String modelEnergyType;
+
+    /**
+     * 最高时速
+     */
     @JsonProperty("topSpeed")
     private String topSpeed;
+
+    /**
+     * 是否OCR
+     */
     @JsonProperty("isOcr")
     private String isOcr;
+
+    /**
+     * 车辆样式唯一ID
+     */
     @JsonProperty("vehicleStyleUniqueId")
     private String vehicleStyleUniqueId;
+
+    /**
+     * 行业车型代码
+     */
     @JsonProperty("industryModelCode")
     private String industryModelCode;
+
+    /**
+     * 港牌号
+     */
     @JsonProperty("hkPlateNo")
     private String hkPlateNo;
+
+    /**
+     * 行驶区域
+     */
     @JsonProperty("drivingArea")
     private String drivingArea;
+
+    /**
+     * 历史信息
+     */
     @JsonProperty("historicalInformation")
     private String historicalInformation;
+
+    /**
+     * 车辆ID
+     */
     @JsonProperty("carId")
     private String carId;
+
+    /**
+     * 车辆类型名称
+     */
     @JsonProperty("vehicleTypeName")
     private String vehicleTypeName;
+
+    /**
+     * OCR任务ID
+     */
     @JsonProperty("ocrTaskId")
     private String ocrTaskId;
+
+    /**
+     * 新车辆类型
+     */
     @JsonProperty("vehicleTypeNew")
     private String vehicleTypeNew;
 
+    /**
+     * 构造函数
+     * 从车辆信息和爬虫响应数据构建车辆信息DTO
+     *
+     * @param carInfoVo 车辆基本信息
+     * @param car 爬虫响应中的车辆数据
+     * @param ownerName 车主姓名
+     */
     public VehicleInfoDTO(CarInfoVo carInfoVo, BoHaiCrawlerCarResponse.ListDTO car, String ownerName) {
         this.pureRange = "";
         this.approvedLoad = carInfoVo.getLimitLoad();
-        this.brand = car.getVehicleName();
-        this.brandName = car.getVehicleId();
+        //this.brand = car.getVehicleName();
+        this.brandName = car.getModelCode();
         this.buyCarDate = "";
         this.carOwnerName = ownerName;
         /*UsedYearCode usedYearCode = UsedYearCode.getUsedYearCode(daJiaCrawlerActualValueResponse.getUsedYear());
@@ -216,8 +606,8 @@ public class VehicleInfoDTO {
 
         this.certificationDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
         this.colorCode = "";
-        this.countryNature = car.getVehicleType();
-        this.displacement = car.getVehicleExhaust();
+        this.countryNature = car.getCarStyle();
+        this.displacement = car.getExhaustScale();
         this.engineNo = carInfoVo.getEngineNo();
         this.fuelType = carInfoVo.getEnergyTypeCode();
         this.glassType = "";
@@ -259,7 +649,7 @@ public class VehicleInfoDTO {
         this.seatCount = carInfoVo.getSeatCount();
         this.useNatureShow = carInfoVo.getVehicleUseCode();
         this.vehicleCheckCode = "";
-        this.vehicleCode = car.getBrandId();
+        this.vehicleCode = car.getCarBrandCode();
         this.vehicleType = carInfoVo.getCarKindDetailIdCode();
         this.vhlCertDate = "";
         this.vhlCertNo = "";
@@ -279,6 +669,6 @@ public class VehicleInfoDTO {
         this.vehicleStyleUniqueId = "";
         this.industryModelCode = "";
         this.ocrTaskId = "";
-        this.vehicleTypeNew = car.getVehicleTypeNew();
+        this.vehicleTypeNew = car.getNewVehicleClassCode();
     }
 }

+ 4 - 6
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerBaseResponse1.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.bohai.crawler.entity.response;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.crawler.entity.request.quote.CarModelDataDTO;
 import lombok.Data;
 
 import java.io.Serial;
@@ -19,25 +20,22 @@ public class BoHaiCrawlerBaseResponse1 {
     /**
      * 状态码
      */
-    @JsonProperty("code")
-    private String code;
+    //@JsonProperty("code")
+    private Integer code;
 
     /**
      * 返回信息
      */
-    @JsonProperty("msg")
     private String msg;
 
     /**
      * 时间戳
      */
-    @JsonProperty("time")
     private Long time;
 
     /**
      * 结果
      */
-    @JsonProperty("data")
-    private String data;
+    private CarModelDataDTO data;
 
 }

+ 590 - 136
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse.java

@@ -1,7 +1,9 @@
 package com.jzg.quotation.bohai.crawler.entity.response;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.crawler.entity.request.quote.CarModelDataDTO;
 import com.jzg.quotation.commons.filter.CarModelsFilter;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -9,6 +11,10 @@ import java.io.Serial;
 import java.io.Serializable;
 import java.util.List;
 
+/**
+ * 渤海保险车辆信息爬虫响应类
+ * 包含分页查询的车辆列表数据
+ */
 @NoArgsConstructor
 @Data
 public class BoHaiCrawlerCarResponse implements Serializable {
@@ -16,21 +22,50 @@ public class BoHaiCrawlerCarResponse implements Serializable {
     @Serial
     private static final long serialVersionUID = 8290844541630850445L;
 
-    @JsonProperty("pageNum")
-    private Integer pageNum;
-
-    @JsonProperty("pageSize")
-    private Integer pageSize;
-
-    @JsonProperty("list")
-    private List<ListDTO> list;
-
-    @JsonProperty("total")
-    private Integer total;
-
-    @JsonProperty("channelOrderNo")
-    private String channelOrderNo;
-
+    /**
+     * 车辆列表
+     */
+    /*@JsonProperty("list")
+    private List<ListDTO> list;*/
+
+
+    /**
+     * 基础部分
+     */
+    @JsonProperty("basePart")
+    private Object basePart;
+
+    @JsonProperty("prpDCarModels")
+    private List<PrpDCarModel> prpDCarModels;
+
+    /**
+     * 车型价格列表
+     */
+    @JsonProperty("modelPrices")
+    private Object modelPrices;
+
+    /**
+     * 交管车辆模型填充信息
+     */
+    @JsonProperty("jyCarModelFill")
+    private JyCarModelFill jyCarModelFill;
+
+    /**
+     * 交管填充错误信息
+     */
+    @JsonProperty("jyFillErrorMsg")
+    private String jyFillErrorMsg;
+
+    /**
+     * 预填错误信息
+     */
+    @JsonProperty("preFillErrorMsg")
+    private String preFillErrorMsg;
+
+    /**
+     * 渤海保险车辆信息DTO
+     * 包含车辆基本信息、配置参数、价格等详细数据
+     */
     @NoArgsConstructor
     @Data
     public static class ListDTO implements Serializable, CarModelsFilter {
@@ -40,202 +75,621 @@ public class BoHaiCrawlerCarResponse implements Serializable {
         /**
          * 车型代码
          */
-        @JsonProperty("vehicleId")
-        private String vehicleId;
+        @JsonProperty("modelCode")
+        private String modelCode;
 
-        @JsonProperty("brandId")
-        private String brandId;
         /**
-         * 车型名称
+         * 行业车型代码
          */
-        @JsonProperty("vehicleName")
-        private String vehicleName;
+        @JsonProperty("industryCarTypeCode")
+        private String industryCarTypeCode;
 
         /**
-         * 车型编码
+         * 行业车型名称
          */
-        @JsonProperty("vehicleModelCode")
-        private String vehicleModelCode;
+        @JsonProperty("industryCarTypeName")
+        private String industryCarTypeName;
 
-        @JsonProperty("vehicleAlias")
-        private String vehicleAlias;
-
-        @JsonProperty("vehicleMaker")
-        private String vehicleMaker;
         /**
-         * 上市年份
+         * 简称代码
          */
-        @JsonProperty("yearPattern")
-        private String yearPattern;
+        @JsonProperty("shorthandCode")
+        private String shorthandCode;
 
-        @JsonProperty("brandName")
-        private String brandName;
+        /**
+         * 车辆种类
+         */
+        @JsonProperty("carKind")
+        private String carKind;
 
-        @JsonProperty("familyName")
-        private String familyName;
+        /**
+         * 车辆类型
+         */
+        @JsonProperty("carStyle")
+        private String carStyle;
 
-        @JsonProperty("vehicleClass")
-        private String vehicleClass;
+        /**
+         * 车型名称
+         */
+        @JsonProperty("modelName")
+        private String modelName;
 
-        @JsonProperty("vehicleType")
-        private String vehicleType;
+        /**
+         * 车系名称
+         */
+        @JsonProperty("carSeriesName")
+        private String carSeriesName;
 
-        @JsonProperty("syxClassname")
-        private String syxClassname;
+        /**
+         * 座位数
+         */
+        @JsonProperty("seatCount")
+        private String seatCount;
 
-        @JsonProperty("jqxClassname")
-        private String jqxClassname;
+        /**
+         * 吨位
+         */
+        @JsonProperty("tonCount")
+        private String tonCount;
 
-        @JsonProperty("searchCode")
-        private String searchCode;
         /**
          * 排量
          */
-        @JsonProperty("vehicleExhaust")
-        private String vehicleExhaust;
+        @JsonProperty("exhaustScale")
+        private String exhaustScale;
 
-        @JsonProperty("vehicleTonnage")
-        private String vehicleTonnage;
         /**
-         * 核定载客
+         * 厂家
          */
-        @JsonProperty("vehicleSeat")
-        private Integer vehicleSeat;
+        @JsonProperty("factory")
+        private String factory;
 
-        @JsonProperty("vehiclePriceTax")
-        private Integer vehiclePriceTax;
+        /**
+         * 国别代码
+         */
+        @JsonProperty("countryCode")
+        private String countryCode;
 
-        @JsonProperty("antiTheft")
-        private String antiTheft;
+        /**
+         * 购置价
+         */
+        @JsonProperty("purchasePrice")
+        private String purchasePrice;
 
-        @JsonProperty("airbag")
-        private String airbag;
+        /**
+         * 风险范围
+         */
+        @JsonProperty("riskScope")
+        private String riskScope;
 
-        @JsonProperty("absFlag")
-        private String absFlag;
+        /**
+         * 有效日期
+         */
+        @JsonProperty("validDate")
+        private String validDate;
 
-        @JsonProperty("transmissionType")
-        private String transmissionType;
+        /**
+         * 有效状态
+         */
+        @JsonProperty("validstatus")
+        private String validstatus;
 
+        /**
+         * 备注
+         */
         @JsonProperty("remark")
         private String remark;
 
-        @JsonProperty("qualityMax")
-        private Integer qualityMax;
+        /**
+         * 标志
+         */
+        @JsonProperty("flag")
+        private String flag;
 
-        @JsonProperty("qualityMin")
-        private Integer qualityMin;
+        /**
+         * 系数1
+         */
+        @JsonProperty("coefficient1")
+        private String coefficient1;
 
         /**
-         * 新车购置价
+         * 系数2
          */
-        @JsonProperty("vehiclePrice")
-        private String vehiclePrice;
+        @JsonProperty("coefficient2")
+        private String coefficient2;
 
-        @JsonProperty("vehiclePriceTax1")
-        private String vehiclePriceTax1;
+        /**
+         * 车辆品牌
+         */
+        @JsonProperty("carBrand")
+        private String carBrand;
 
-        @JsonProperty("factoryId")
-        private String factoryId;
+        /**
+         * 车辆年款
+         */
+        @JsonProperty("carYear")
+        private String carYear;
 
-        @JsonProperty("power")
-        private String power;
         /**
-         * 功率
+         * 车系代码
          */
-        @JsonProperty("vehicleTypeNew")
-        private String vehicleTypeNew;
+        @JsonProperty("carSeriesCode")
+        private String carSeriesCode;
+
         /**
-         * 燃料类型代码
+         * 整备质量
          */
-        @JsonProperty("powerTypeCode")
-        private String powerTypeCode;
+        @JsonProperty("completeKerbMass")
+        private String completeKerbMass;
+
+        /**
+         * 风险类型
+         */
+        @JsonProperty("riskType")
+        private String riskType;
+
+        /**
+         * 厂家代码
+         */
+        @JsonProperty("factoryCode")
+        private String factoryCode;
+
+        /**
+         * 车辆品牌代码
+         */
+        @JsonProperty("carBrandCode")
+        private String carBrandCode;
+
         /**
-         * 燃料类型名称
+         * 安全装置
          */
-        @JsonProperty("powerTypeName")
-        private String powerTypeName;
+        @JsonProperty("safeDevice")
+        private String safeDevice;
 
-        @JsonProperty("travelTaxMark")
-        private String travelTaxMark;
+        /**
+         * 气囊
+         */
+        @JsonProperty("airbag")
+        private String airbag;
 
-        @JsonProperty("vehicleHyCode")
-        private String vehicleHyCode;
+        /**
+         * ABS标志
+         */
+        @JsonProperty("absFlag")
+        private String absFlag;
 
-        @JsonProperty("vehicleHyName")
-        private String vehicleHyName;
+        /**
+         * 座位数上限
+         */
+        @JsonProperty("seatCountUpper")
+        private String seatCountUpper;
 
-        @JsonProperty("cfrmNo")
-        private String cfrmNo;
+        /**
+         * 座位数下限
+         */
+        @JsonProperty("seatCountLower")
+        private String seatCountLower;
 
-        @JsonProperty("cengNo")
-        private String cengNo;
+        /**
+         * 购置价税
+         */
+        @JsonProperty("purchasePriceTax")
+        private String purchasePriceTax;
 
-        @JsonProperty("cplateNo")
-        private String cplateNo;
+        /**
+         * 模拟价格
+         */
+        @JsonProperty("analogPrice")
+        private String analogPrice;
 
-        @JsonProperty("ncurbWt")
-        private String ncurbWt;
+        /**
+         * 模拟价格税
+         */
+        @JsonProperty("analogPriceTax")
+        private String analogPriceTax;
 
-        @JsonProperty("cplateTyp")
-        private String cplateTyp;
+        /**
+         * 动力类型
+         */
+        @JsonProperty("powerType")
+        private String powerType;
 
-        @JsonProperty("ttransferDate")
-        private String ttransferDate;
+        /**
+         * 动力类型代码
+         */
+        @JsonProperty("powerTypeCode")
+        private String powerTypeCode;
 
-        @JsonProperty("cregVhlTyp")
-        private String cregVhlTyp;
+        /**
+         * 减半名称
+         */
+        @JsonProperty("hfName")
+        private String hfName;
 
-        @JsonProperty("cvhlTyp")
-        private String cvhlTyp;
+        /**
+         * 减半代码
+         */
+        @JsonProperty("hfCode")
+        private String hfCode;
 
-        @JsonProperty("cusageCde")
-        private String cusageCde;
+        /**
+         * 分组名称
+         */
+        @JsonProperty("groupName")
+        private String groupName;
 
-        @JsonProperty("cfstRegYmBar")
-        private String cfstRegYmBar;
+        /**
+         * 分组代码
+         */
+        @JsonProperty("groupCode")
+        private String groupCode;
 
-        @JsonProperty("nseatNum")
-        private String nseatNum;
+        /**
+         * 新车辆分类
+         */
+        @JsonProperty("newVehiclecLass")
+        private String newVehiclecLass;
 
-        @JsonProperty("ntonage")
-        private String ntonage;
+        /**
+         * 新车辆分类代码
+         */
+        @JsonProperty("newVehicleClassCode")
+        private String newVehicleClassCode;
 
-        @JsonProperty("ndisplacement")
-        private String ndisplacement;
+        /**
+         * 座位最小值
+         */
+        @JsonProperty("seatMin")
+        private String seatMin;
 
-        @JsonProperty("cregOwner")
-        private String cregOwner;
+        /**
+         * 座位最大值
+         */
+        @JsonProperty("seatMax")
+        private String seatMax;
 
-        @JsonProperty("ctraUsageCde")
-        private String ctraUsageCde;
+        /**
+         * 功率
+         */
+        @JsonProperty("power")
+        private String power;
 
-        @JsonProperty("chaulge")
-        private String chaulge;
+        /**
+         * 上市日期
+         */
+        @JsonProperty("marketDate")
+        private String marketDate;
 
-        @JsonProperty("tcertificateDate")
-        private String tcertificateDate;
+        /**
+         * 商业险分类名称
+         */
+        @JsonProperty("syxClassname")
+        private String syxClassname;
 
-        @JsonProperty("cfuelType")
-        private String cfuelType;
+        /**
+         * 厂家ID
+         */
+        @JsonProperty("cfactoryId")
+        private String cfactoryId;
 
-        @JsonProperty("cmodelEnergyType")
-        private String cmodelEnergyType;
+        /**
+         * 车系ID
+         */
+        @JsonProperty("cfamilId")
+        private String cfamilId;
 
-        @JsonProperty("moldName")
-        private String moldName;
+        /**
+         * 变速器类型
+         */
+        @JsonProperty("ctransmissionType")
+        private String ctransmissionType;
 
-        @JsonProperty("modelCode")
-        private String modelCode;
+        /**
+         * 车辆ID
+         */
+        @JsonProperty("crefVegicleId")
+        private String crefVegicleId;
+
+        /**
+         * 质量最小值
+         */
+        @JsonProperty("cqualityMin")
+        private String cqualityMin;
+
+        /**
+         * 红色车辆标识
+         */
+        @JsonProperty("ckindRedCar")
+        private String ckindRedCar;
+
+        /**
+         * 创建时间
+         */
+        @JsonProperty("tdateCreated")
+        private String tdateCreated;
+
+        /**
+         * 更新时间
+         */
+        @JsonProperty("tdateUpdated")
+        private String tdateUpdated;
+
+        /**
+         * 商业险分类ID
+         */
+        @JsonProperty("syxclassId")
+        private String syxclassId;
+
+        /**
+         * 交强险分类ID
+         */
+        @JsonProperty("jqxclassId")
+        private String jqxclassId;
+
+        /**
+         * 状态
+         */
+        @JsonProperty("nstate")
+        private String nstate;
 
         @Override
         public String getCarYear() {
-            return yearPattern;
+            return carYear;
         }
 
         @Override
         public String getPurchasePrice() {
-            return vehiclePrice;
+            return purchasePrice;
         }
     }
+
+    /**
+     * 交管车辆模型填充信息
+     * 对应JSON中的jyCarModelFill对象
+     */
+    @NoArgsConstructor
+    @Data
+    public static class JyCarModelFill implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1234567890123456789L;
+
+        /**
+         * 参考号
+         */
+        @JsonProperty("referenceNo")
+        private String referenceNo;
+
+        /**
+         * 时间戳
+         */
+        @JsonProperty("reTimestamp")
+        private String reTimestamp;
+
+        /**
+         * 是否新车
+         */
+        @JsonProperty("isNewCar")
+        private String isNewCar;
+
+        /**
+         * 车牌号
+         */
+        @JsonProperty("plateNumber")
+        private String plateNumber;
+
+        /**
+         * VIN码
+         */
+        @JsonProperty("vinCodeRe")
+        private String vinCodeRe;
+
+        /**
+         * 追踪号
+         */
+        @JsonProperty("trackingNumber")
+        private String trackingNumber;
+
+        /**
+         * 整体状态
+         */
+        @JsonProperty("overallStatus")
+        private String overallStatus;
+
+        /**
+         * 整体消息
+         */
+        @JsonProperty("overallMessage")
+        private String overallMessage;
+
+        /**
+         * 交易ID
+         */
+        @JsonProperty("transactionID")
+        private String transactionID;
+
+        /**
+         * 响应版本
+         */
+        @JsonProperty("responseVersion")
+        private String responseVersion;
+
+        /**
+         * 结果代码
+         */
+        @JsonProperty("resultCode")
+        private String resultCode;
+
+        /**
+         * 结果描述
+         */
+        @JsonProperty("resultDesc")
+        private String resultDesc;
+
+        /**
+         * VIN码
+         */
+        @JsonProperty("vinCode")
+        private String vinCode;
+
+        /**
+         * 整备质量
+         */
+        @JsonProperty("curbWeight")
+        private String curbWeight;
+
+        /**
+         * 排量
+         */
+        @JsonProperty("displacement")
+        private String displacement;
+
+        /**
+         * 发动机型号
+         */
+        @JsonProperty("engineModel")
+        private String engineModel;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNumber")
+        private String engineNumber;
+
+        /**
+         * 功率
+         */
+        @JsonProperty("powerNum")
+        private String powerNum;
+
+        /**
+         * 额定载客
+         */
+        @JsonProperty("ratedCapacity")
+        private String ratedCapacity;
+
+        /**
+         * 额定载荷
+         */
+        @JsonProperty("ratedLoad")
+        private String ratedLoad;
+
+        /**
+         * 总质量牵引
+         */
+        @JsonProperty("totalMassTraction")
+        private String totalMassTraction;
+
+        /**
+         * 使用性质
+         */
+        @JsonProperty("useCharacter")
+        private String useCharacter;
+
+        /**
+         * 注册日期
+         */
+        @JsonProperty("registerDate")
+        private String registerDate;
+
+        /**
+         * 机构代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        /**
+         * 资源类型代码
+         */
+        @JsonProperty("resourceTypeCode")
+        private String resourceTypeCode;
+
+        /**
+         * 车牌颜色
+         */
+        @JsonProperty("plateNoColor")
+        private String plateNoColor;
+
+        /**
+         * 有效状态
+         */
+        @JsonProperty("validStatus")
+        private String validStatus;
+    }
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class PrpDCarModel {
+        private String modelCode;
+        private String industryCarTypeCode;
+        private String industryCarTypeName;
+        private String shorthandCode;
+        private String carKind;
+        private String carStyle;
+        private String modelName;
+        private String carSeriesName;
+        private String seatCount;
+        private String tonCount;
+        private String exhaustScale;
+        private String factory;
+        private String countryCode;
+
+        /**
+         * 购买价值
+         */
+        private String purchasePrice;
+
+        private String riskScope;
+        private String validDate;
+        private String validstatus;
+        private String remark;
+        private String flag;
+        private String coefficient1;
+        private String coefficient2;
+        private String carBrand;
+        private String carYear;
+        private String carSeriesCode;
+        private String completeKerbMass;
+        private String riskType;
+        private String factoryCode;
+        private String carBrandCode;
+        private String safeDevice;
+        private String airbag;
+        private String absFlag;
+        private String seatCountUpper;
+        private String seatCountLower;
+        private String purchasePriceTax;
+        private String analogPrice;
+        private String analogPriceTax;
+        private String powerType;
+        private String powerTypeCode;
+        private String hfName;
+        private String hfCode;
+        private String groupName;
+        private String groupCode;
+        private String newVehiclecLass;
+        private String newVehicleClassCode;
+        private String seatMin;
+        private String seatMax;
+        private String power;
+        private String marketDate;
+        private String syxClassname;
+        private String cfactoryId;
+        private String cfamilId;
+        private String ctransmissionType;
+        private String crefVegicleId;
+        private String cqualityMin;
+        private String ckindRedCar;
+        private String tdateCreated;
+        private String tdateUpdated;
+        private String syxclassId;
+        private String jqxclassId;
+        private String nstate;
+    }
 }

+ 402 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse1.java

@@ -0,0 +1,402 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.filter.CarModelsFilter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 渤海保险车辆信息爬虫响应类
+ * 包含分页查询的车辆列表数据
+ */
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCarResponse1 implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8290844541630850445L;
+
+    /**
+     * 当前页码
+     */
+    @JsonProperty("pageNum")
+    private Integer pageNum;
+
+    /**
+     * 每页大小
+     */
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    /**
+     * 车辆列表
+     */
+    @JsonProperty("list")
+    private List<ListDTO> list;
+
+    /**
+     * 总数
+     */
+    @JsonProperty("total")
+    private Integer total;
+
+    /**
+     * 渠道订单号
+     */
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+
+    /**
+     * 渤海保险车辆信息DTO
+     * 包含车辆基本信息、配置参数、价格等详细数据
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ListDTO implements Serializable, CarModelsFilter {
+        @Serial
+        private static final long serialVersionUID = -9139048419262298709L;
+
+        /**
+         * 车型代码
+         */
+        @JsonProperty("vehicleId")
+        private String vehicleId;
+
+        /**
+         * 品牌ID
+         */
+        @JsonProperty("brandId")
+        private String brandId;
+        /**
+         * 车型名称
+         */
+        @JsonProperty("vehicleName")
+        private String vehicleName;
+
+        /**
+         * 车型编码
+         */
+        @JsonProperty("vehicleModelCode")
+        private String vehicleModelCode;
+
+        /**
+         * 车型别名
+         */
+        @JsonProperty("vehicleAlias")
+        private String vehicleAlias;
+
+        /**
+         * 车辆制造商
+         */
+        @JsonProperty("vehicleMaker")
+        private String vehicleMaker;
+        /**
+         * 上市年份
+         */
+        @JsonProperty("yearPattern")
+        private String yearPattern;
+
+        /**
+         * 品牌名称
+         */
+        @JsonProperty("brandName")
+        private String brandName;
+
+        /**
+         * 车系名称
+         */
+        @JsonProperty("familyName")
+        private String familyName;
+
+        /**
+         * 车辆级别
+         */
+        @JsonProperty("vehicleClass")
+        private String vehicleClass;
+
+        /**
+         * 车辆类型
+         */
+        @JsonProperty("vehicleType")
+        private String vehicleType;
+
+        /**
+         * 商业险分类名称
+         */
+        @JsonProperty("syxClassname")
+        private String syxClassname;
+
+        /**
+         * 交强险分类名称
+         */
+        @JsonProperty("jqxClassname")
+        private String jqxClassname;
+
+        /**
+         * 搜索代码
+         */
+        @JsonProperty("searchCode")
+        private String searchCode;
+        /**
+         * 排量
+         */
+        @JsonProperty("vehicleExhaust")
+        private String vehicleExhaust;
+
+        /**
+         * 车辆吨位
+         */
+        @JsonProperty("vehicleTonnage")
+        private String vehicleTonnage;
+        /**
+         * 核定载客
+         */
+        @JsonProperty("vehicleSeat")
+        private Integer vehicleSeat;
+
+        /**
+         * 车辆价税
+         */
+        @JsonProperty("vehiclePriceTax")
+        private Integer vehiclePriceTax;
+
+        /**
+         * 防盗装置
+         */
+        @JsonProperty("antiTheft")
+        private String antiTheft;
+
+        /**
+         * 安全气囊
+         */
+        @JsonProperty("airbag")
+        private String airbag;
+
+        /**
+         * ABS标志
+         */
+        @JsonProperty("absFlag")
+        private String absFlag;
+
+        /**
+         * 变速器类型
+         */
+        @JsonProperty("transmissionType")
+        private String transmissionType;
+
+        /**
+         * 备注
+         */
+        @JsonProperty("remark")
+        private String remark;
+
+        /**
+         * 最大质量
+         */
+        @JsonProperty("qualityMax")
+        private Integer qualityMax;
+
+        /**
+         * 最小质量
+         */
+        @JsonProperty("qualityMin")
+        private Integer qualityMin;
+
+        /**
+         * 新车购置价
+         */
+        @JsonProperty("vehiclePrice")
+        private String vehiclePrice;
+
+        /**
+         * 车辆价税1
+         */
+        @JsonProperty("vehiclePriceTax1")
+        private String vehiclePriceTax1;
+
+        /**
+         * 厂家ID
+         */
+        @JsonProperty("factoryId")
+        private String factoryId;
+
+        /**
+         * 功率
+         */
+        @JsonProperty("power")
+        private String power;
+        /**
+         * 车辆类型(新)
+         */
+        @JsonProperty("vehicleTypeNew")
+        private String vehicleTypeNew;
+        /**
+         * 燃料类型代码
+         */
+        @JsonProperty("powerTypeCode")
+        private String powerTypeCode;
+        /**
+         * 燃料类型名称
+         */
+        @JsonProperty("powerTypeName")
+        private String powerTypeName;
+
+        /**
+         * 车船税标志
+         */
+        @JsonProperty("travelTaxMark")
+        private String travelTaxMark;
+
+        /**
+         * 车辆型号代码
+         */
+        @JsonProperty("vehicleHyCode")
+        private String vehicleHyCode;
+
+        /**
+         * 车辆型号名称
+         */
+        @JsonProperty("vehicleHyName")
+        private String vehicleHyName;
+
+        /**
+         * 底盘型号
+         */
+        @JsonProperty("cfrmNo")
+        private String cfrmNo;
+
+        /**
+         * 发动机型号
+         */
+        @JsonProperty("cengNo")
+        private String cengNo;
+
+        /**
+         * 车牌号码
+         */
+        @JsonProperty("cplateNo")
+        private String cplateNo;
+
+        /**
+         * 整备质量
+         */
+        @JsonProperty("ncurbWt")
+        private String ncurbWt;
+
+        /**
+         * 车牌类型
+         */
+        @JsonProperty("cplateTyp")
+        private String cplateTyp;
+
+        /**
+         * 过户日期
+         */
+        @JsonProperty("ttransferDate")
+        private String ttransferDate;
+
+        /**
+         * 注册车辆类型
+         */
+        @JsonProperty("cregVhlTyp")
+        private String cregVhlTyp;
+
+        /**
+         * 车辆类型代码
+         */
+        @JsonProperty("cvhlTyp")
+        private String cvhlTyp;
+
+        /**
+         * 使用性质代码
+         */
+        @JsonProperty("cusageCde")
+        private String cusageCde;
+
+        /**
+         * 初登日期
+         */
+        @JsonProperty("cfstRegYmBar")
+        private String cfstRegYmBar;
+
+        /**
+         * 座位数
+         */
+        @JsonProperty("nseatNum")
+        private String nseatNum;
+
+        /**
+         * 吨位
+         */
+        @JsonProperty("ntonage")
+        private String ntonage;
+
+        /**
+         * 排量
+         */
+        @JsonProperty("ndisplacement")
+        private String ndisplacement;
+
+        /**
+         * 注册所有人
+         */
+        @JsonProperty("cregOwner")
+        private String cregOwner;
+
+        /**
+         * 挂车使用性质代码
+         */
+        @JsonProperty("ctraUsageCde")
+        private String ctraUsageCde;
+
+        /**
+         * 挂车
+         */
+        @JsonProperty("chaulge")
+        private String chaulge;
+
+        /**
+         * 发证日期
+         */
+        @JsonProperty("tcertificateDate")
+        private String tcertificateDate;
+
+        /**
+         * 燃料类型
+         */
+        @JsonProperty("cfuelType")
+        private String cfuelType;
+
+        /**
+         * 车型能源类型
+         */
+        @JsonProperty("cmodelEnergyType")
+        private String cmodelEnergyType;
+
+        /**
+         * 型号名称
+         */
+        @JsonProperty("moldName")
+        private String moldName;
+
+        /**
+         * 型号代码
+         */
+        @JsonProperty("modelCode")
+        private String modelCode;
+
+        @Override
+        public String getCarYear() {
+            return yearPattern;
+        }
+
+        @Override
+        public String getPurchasePrice() {
+            return vehiclePrice;
+        }
+    }
+}

+ 28 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerVehicleConfirmationResponse.java

@@ -9,7 +9,9 @@ import java.io.Serial;
 import java.util.List;
 
 /**
- * @description: 车辆确认 返回数据
+ * 渤海保险爬虫车辆确认响应实体
+ * 用于接收和封装渤海保险API返回的车辆确认信息
+ * 
  * @author: shenwd
  * @date: 2025/3/3 16:52
  **/
@@ -19,48 +21,73 @@ public class BoHaiCrawlerVehicleConfirmationResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = -1117358781373926565L;
+    
+    /** 车辆确认数据 */
     @JsonProperty("data")
     private DataDTO data;
 
+    /**
+     * 车辆确认数据载体
+     */
     @NoArgsConstructor
     @Data
     public static class DataDTO {
+        /** 车辆型号列表 */
         @JsonProperty("vehicleModels")
         private List<VehicleModelsDTO> vehicleModels;
 
+        /**
+         * 车辆型号信息实体
+         */
         @NoArgsConstructor
         @Data
         public static class VehicleModelsDTO {
+            /** 车系编码 */
             @JsonProperty("familyCode")
             private String familyCode;
+            /** 车系名称 */
             @JsonProperty("familyName")
             private String familyName;
+            /** 发动机排量 */
             @JsonProperty("engineCapacity")
             private String engineCapacity;
+            /** 车辆别名 */
             @JsonProperty("vehicleAlias")
             private String vehicleAlias;
+            /** 购置价格 */
             @JsonProperty("purchasePrice")
             private String purchasePrice;
+            /** 车型名称 */
             @JsonProperty("moldName")
             private String moldName;
+            /** 座位数 */
             @JsonProperty("seatCount")
             private String seatCount;
+            /** 车型特征编码 */
             @JsonProperty("moldCharacterCode")
             private String moldCharacterCode;
+            /** 产地 */
             @JsonProperty("producingArea")
             private String producingArea;
+            /** 车辆品牌 */
             @JsonProperty("vehicleBrand")
             private String vehicleBrand;
+            /** 年款 */
             @JsonProperty("yearPattern")
             private String yearPattern;
+            /** 整备质量 */
             @JsonProperty("emptyWeight")
             private String emptyWeight;
+            /** 载质量 */
             @JsonProperty("carryingCapacity")
             private Object carryingCapacity;
+            /** 减费代码JY */
             @JsonProperty("deductionDueCodeJY")
             private String deductionDueCodeJY;
+            /** 燃料类型 */
             @JsonProperty("fuelType")
             private String fuelType;
+            /** 当前价值 */
             @JsonProperty("currentValue")
             private String currentValue;
         }

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

@@ -83,7 +83,7 @@ public class BoHaiCrawlerQuoteProcessServiceImpl implements BoHaiCrawlerQuotePro
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
         return headers;*/
         HttpHeaders httpHeaders = new HttpHeaders();
-        httpHeaders.set("Cookie", "HTTPOnly; Cookie=!xYQ2/Q39MswXtx61yv2qnldjEk8Kb5kWS+Q36Hh2Gsub6H7LkrHMR8tMoc9QXJhl51iUnZx77WCCiJ0=");
+        httpHeaders.set("Cookie", "HTTPOnly; Cookie=!nWlhN+KeEYSeye21yv2qnldjEk8Kb9NrbshGomNlDw5h9g3lSal2Gb9pNc81nEf0UOCqFH0E/WkCBk4=;");
         return httpHeaders;
     }
 

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

@@ -28,6 +28,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -91,17 +92,432 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         //String orderNo = generateOrderNo(parameters, headers);
 
         // 2.1 车辆查询
-        BoHaiCrawlerCarRequest boHaiCrawlerCarRequest = new BoHaiCrawlerCarRequest(quoteVo.getCarInfoVo(), parameters.getLoginCompany(), parameters.getCDptCde(), userCode);
-        BoHaiCrawlerCarResponse boHaiCrawlerCarResponse = boHaiCrawlerRequestComponent.car(boHaiCrawlerCarRequest, headers);
+        BoHaiCrawlerCarResponse boHaiCrawlerCarResponse = null;
+        try {
+            BoHaiCrawlerCarRequest boHaiCrawlerCarRequest = new BoHaiCrawlerCarRequest(quoteVo.getCarInfoVo(), parameters.getLoginCompany(), parameters.getCDptCde(), userCode);
+            boHaiCrawlerCarResponse = boHaiCrawlerRequestComponent.car(boHaiCrawlerCarRequest, headers);
+            log.info("boHaiCrawlerCarResponse参数的值:{}", JSON.toJSONString(boHaiCrawlerCarResponse));
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
 
         //2.2 车辆确认
-        Map<String, Object> vehicleConfirmationResult = getVehicleConfirmationResponse(quoteVo, boHaiCrawlerCarResponse, parameters, headers);
-        //获取车辆当前价值
-        String currentValue = (String) vehicleConfirmationResult.get("currentValue");
+        String currentValue = null;
+        try {
+            Map<String, Object> vehicleConfirmationResult = getVehicleConfirmationResponse(quoteVo, boHaiCrawlerCarResponse, parameters, headers);
+            //获取车辆当前价值
+            currentValue = (String) vehicleConfirmationResult.get("currentValue");
+            log.info("车辆当前价值:{}", currentValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
 
         // 3.0 报价接口
-        BoHaiCrawlerQuotationRequest boHaiCrawlerQuotationRequest = new BoHaiCrawlerQuotationRequest(parameters, quoteVo, currentValue, "", quoteVo.getAccidentalDrivings(), "");
-        BoHaiCrawlerQuotationResponse boHaiCrawlerQuotationResponse = boHaiCrawlerRequestComponent.quotation(boHaiCrawlerQuotationRequest, headers);
+        /*BoHaiCrawlerQuotationRequest boHaiCrawlerQuotationRequest = new BoHaiCrawlerQuotationRequest(parameters, quoteVo, currentValue, "", quoteVo.getAccidentalDrivings(), "");*/
+        BoHaiCrawlerQuotationRequest2 boHaiCrawlerQuotationRequest2 = new BoHaiCrawlerQuotationRequest2();
+        BoHaiCrawlerQuotationRequest2.Head head = new BoHaiCrawlerQuotationRequest2.Head();
+        head.setTransType("Req");
+        head.setTransCode("PremiumProposal");
+        head.setToken("114050281-4668f68536a7e145b87f94fd14449d77");
+        boHaiCrawlerQuotationRequest2.setHead(head);
+
+        // 使用 setter 方式设置 businessData、insuredList、riskList、以及登录信息
+        BoHaiCrawlerQuotationRequest2.BusinessData businessData = new BoHaiCrawlerQuotationRequest2.BusinessData();
+
+        // 业务主信息
+        BoHaiCrawlerQuotationRequest2.BusinessMainInfo mainInfo = new BoHaiCrawlerQuotationRequest2.BusinessMainInfo();
+        mainInfo.setOrderNo("O140703302025063172");
+        mainInfo.setFixPriceType("Y2");
+        mainInfo.setRiskControlFlag("");
+        mainInfo.setUuid("");
+        mainInfo.setTrial(1);
+        mainInfo.setArgueSolution("1");
+        mainInfo.setArbitBoardName("");
+        mainInfo.setBusinessType("OTemp");
+        mainInfo.setComCode("14070201");
+        mainInfo.setBusinessCategories1("1");
+        mainInfo.setBusinessCategories2("2");
+        mainInfo.setBusinessCategories3("A06");
+        mainInfo.setHandlerCode("114050281");
+        mainInfo.setAgentCode("M140301000249");
+        mainInfo.setAgentName("太原天勤保险代理有限公司");
+        mainInfo.setAgreementNo("C142024004345_2");
+        mainInfo.setCityCode("140700");
+        mainInfo.setCountyCode("140781");
+        mainInfo.setOperateDate("2025-10-09");
+        mainInfo.setGoalInsuredFlag("2");
+        mainInfo.setUnderUnit("");
+        mainInfo.setIdentifyType("006");
+        mainInfo.setIdentifyDetail("00001");
+        mainInfo.setIdentifyCode("");
+        mainInfo.setIdentifyVip("");
+        mainInfo.setComputerIp("");
+        mainInfo.setMainCarKindBC("0");
+        mainInfo.setResourceTypeCode("004");
+        mainInfo.setExpectDiscount("");
+        mainInfo.setReportNo("");
+        mainInfo.setExpectedCommission("");
+        mainInfo.setBusinessAttribute("2");
+        mainInfo.setChannelType("");
+        mainInfo.setSalerIdentifyNumber("");
+        mainInfo.setSdId("");
+        mainInfo.setTbMode("");
+        mainInfo.setBussUnitCodeCI("");
+        mainInfo.setBussUnitCode("");
+        mainInfo.setPriceMode("");
+        mainInfo.setHighRiskAssessId("");
+        mainInfo.setReCustomerType("");
+        mainInfo.setLastYearAdjustValue("");
+        businessData.setBusinessMainInfo(mainInfo);
+
+        // 车辆信息
+        BoHaiCrawlerQuotationRequest2.CarInfo carInfo = new BoHaiCrawlerQuotationRequest2.CarInfo();
+        BoHaiCrawlerQuotationRequest2.ItemCarInfo item = new BoHaiCrawlerQuotationRequest2.ItemCarInfo();
+        item.setCertificateNo("");
+        item.setCertificateType("");
+        item.setOtherEnergyTypeDesc("");
+        item.setPureRange("");
+        item.setPmFuelType("A");
+        item.setCarCheckStatus("");
+        //实际价值
+        item.setActualValue("15380.00");
+        item.setOtherNature7BI("0");
+        //协商价值
+        item.setNegotiatedValue("15380.00");
+        item.setNewVehicleFlag("0");
+        item.setLicenseNo("晋K38V85");
+        item.setFrameNo("LJDLAA197D0029125");
+        item.setEngineNo("D5685636");
+        item.setVinNo("LJDLAA197D0029125");
+        item.setNoLicenseFlag("");
+        item.setLicenseColorCode("01");
+        item.setUseNatureCode("8A");
+        item.setMainCarKindCode("A");
+        item.setCarKindCode("A0");
+        item.setBrandName("起亚YQZ7143A轿车");
+        item.setSeatCount("5");
+        item.setTonCount("0.0000");
+        item.setPurchasePrice("76900");
+        item.setBasePurchasePrice("76900");
+        item.setExhaustScale(1.396);
+        item.setEnrollDate("2013-10-14");
+        item.setUseYearsBI("12");
+        item.setUseYearsCI(11);
+        item.setUseYearsDI("");
+        item.setChgOwnerFlag("1");
+        item.setChgTypeFlag("0");
+        item.setChgOwnerDate("2024-11-05");
+        item.setCountryNature("C");
+        item.setModelCode("KED1014DFY");
+        item.setRunMiles(20000);
+        item.setRunAreaCode("02");
+        item.setTrafficViolationRecords("0");
+        item.setColorCode("99");
+        item.setMadeFactory("东风悦达起亚汽车有限公司");
+        item.setMakeDate("");
+        item.setVehicleBrand("起亚");
+        item.setCompleteKerbMass(1087);
+        item.setLicenseKindCode("02");
+        item.setLicenseCategory("K33");
+        item.setRenewalFlagBI("0");
+        item.setDamagedFactorGrade("");
+        item.setSpecialVehicleFlag("0");
+        item.setLoanVehicleFlag("0");
+        item.setProportion("");
+        item.setEnergySavingOrNewEnergy("0");
+        item.setLastProducerCode("0");
+        item.setDebtFlag("");
+        item.setRestricFlag("00");
+        item.setSearchSequenceNo("");
+        item.setIsTaxi("0");
+        item.setFuelType1("0");
+        item.setSpecifiedQueryArea("");
+        item.setIndustryCarTypeCode("BYDLKFUC0007");
+        item.setIndustryCarTypeName("起亚YQZ7143A GLS");
+        item.setCarABSFlag(null);
+        item.setFuelType2("");
+        item.setMiniCar("");
+        item.setCarAddressCode("");
+        item.setIssueDate("2013-10-14");
+        item.setNewDeviceFlag("0");
+        item.setInvoiceNo("");
+        item.setOwnerAddress("");
+        item.setTractorType("");
+        item.setNoClaimAdjustReason("");
+        item.setNoDamageYearsBI("");
+        item.setNoDamageYearsCI("");
+        item.setNoLoyaltyAdjustReason("");
+        item.setPowerType("汽油");
+        item.setPowerTypeCode("D1");
+        item.setSeries("K2");
+        item.setSeriesCode(null);
+        item.setPriorityServicerType("0");
+        item.setPriorityServicerCode("");
+        item.setNoticeType("YQZ7143A");
+        item.setPureRiskPremium("0.0");
+        item.setEcdemicVehicleFlag("0");
+        item.setNewCarFlag("0");
+        item.setPrnExhaustScale("");
+        item.setPrnCompleteKerbMassNew("");
+        item.setIsNetworkCar(0);
+        item.setPower("78.7");
+        item.setCarUsage("起亚牌YQZ7143A");
+        item.setCarChecker("");
+        item.setCarCheckTime("2025-10-09 17:14");
+        item.setVerifyReason("");
+        item.setCarCheckDelayDays("");
+        item.setVerifyReasonOtherReason("");
+        item.setVerifyStatus("");
+        item.setCarCheckReason("");
+        item.setCarCheckOtherReason("");
+        item.setRiskType("1");
+        item.setVehicleStyleUniqueId("14970");
+        item.setIsNewCar("0");
+        item.setJyPreCarNo("c44a2adbb1a145b58ff7e1aef164ebd6");
+        carInfo.setItemCarInfo(item);
+        carInfo.setChargingInfoList(java.util.Collections.emptyList());
+        carInfo.setDeviceList(java.util.Collections.emptyList());
+        businessData.setCarInfo(carInfo);
+
+        // 被保险人列表
+        java.util.List<BoHaiCrawlerQuotationRequest2.Insured> insuredList = new java.util.ArrayList<>();
+        BoHaiCrawlerQuotationRequest2.Insured insured1 = new BoHaiCrawlerQuotationRequest2.Insured();
+        insured1.setSerialNo("1");
+        insured1.setInsuredCode("");
+        insured1.setIdentifyNumber("");
+        insured1.setIdentifyType("01");
+        insured1.setInsuredName("");
+        insured1.setInsuredFlag("2");
+        insured1.setInsuredType("1");
+        insured1.setGender("");
+        insured1.setInsuredNature("3");
+        insured1.setPhoneNumber("");
+        insured1.setMobile("");
+        insured1.setInsuredAddress("");
+        insured1.setPostCode("");
+        insured1.setPostAddress("");
+        insured1.setOrgCode("");
+        insured1.setAge("");
+        insured1.setBirthDay("");
+        insured1.setIsIndividualBusi("");
+        insured1.setAppliCitizenshipBC("01");
+        insured1.setAppliCountryBC("008zg");
+        insured1.setEmail("");
+        insured1.setBusinessLicenseType("");
+        insured1.setNation("");
+        insured1.setIdentifyAddress("");
+        insured1.setIdentifyStartDate("");
+        insured1.setIdentifyEndDate("");
+        insured1.setCarInsuredRelation("");
+
+        insured1.setBusinessSort("15");
+        insured1.setLinkerName("");
+        insured1.setSpecialDInsuredName("");
+        insured1.setSpecialDInsuredIDType("");
+        insured1.setSpecialDInsuredID("");
+        insured1.setNoSpecialDInsuredP("");
+        insured1.setIsGreenIndustryFlag("");
+        insured1.setGreenIndustryFCode("");
+        insured1.setGreenIndustrySCode("");
+        insured1.setGreenIndustryTCode("");
+        insuredList.add(insured1);
+
+        BoHaiCrawlerQuotationRequest2.Insured insured2 = new BoHaiCrawlerQuotationRequest2.Insured();
+        insured2.setSerialNo("2");
+        insured2.setInsuredCode("");
+        insured2.setIdentifyNumber("142626196108011016");
+        insured2.setIdentifyType("01");
+        insured2.setInsuredName("段志文");
+        insured2.setInsuredFlag("1");
+        insured2.setInsuredType("1");
+        insured2.setGender("1");
+        insured2.setInsuredNature("3");
+        insured2.setPhoneNumber("");
+        insured2.setMobile("");
+        insured2.setInsuredAddress("");
+        insured2.setPostCode("");
+        insured2.setPostAddress("");
+        insured2.setOrgCode("");
+        insured2.setAge(64);
+        insured2.setBirthDay("1961-08-01");
+        insured2.setIsIndividualBusi("");
+        insured2.setAppliCitizenshipBC("01");
+        insured2.setAppliCountryBC("008zg");
+        insured2.setEmail("");
+        insured2.setBusinessLicenseType("");
+        insured2.setNation("");
+        insured2.setIdentifyAddress("");
+        insured2.setIdentifyStartDate("");
+        insured2.setIdentifyEndDate("");
+        insured2.setCarInsuredRelation("1");
+        insured2.setBusinessSort("15");
+        insured2.setLinkerName("");
+        insured2.setIsSpecialDInsured("0");
+        insured2.setSpecialDInsuredName("");
+        insured2.setSpecialDInsuredIDType("");
+        insured2.setSpecialDInsuredID("");
+        insured2.setNoSpecialDInsuredP("1");
+        insured2.setBenefitFlag("0");
+        insured2.setIsGreenIndustryFlag("");
+        insured2.setGreenIndustryFCode("");
+        insured2.setGreenIndustrySCode("");
+        insured2.setGreenIndustryTCode("");
+        insuredList.add(insured2);
+
+        BoHaiCrawlerQuotationRequest2.Insured insured3 = new BoHaiCrawlerQuotationRequest2.Insured();
+        insured3.setSerialNo("3");
+        insured3.setInsuredCode("");
+        insured3.setIdentifyNumber("142626196108011016");
+        insured3.setIdentifyType("01");
+        insured3.setInsuredName("段志文");
+        insured3.setInsuredFlag("3");
+        insured3.setInsuredType("1");
+        insured3.setGender("1");
+        insured3.setInsuredNature("1");
+        insured3.setPhoneNumber("");
+        insured3.setMobile("");
+        insured3.setInsuredAddress("");
+        insured3.setPostCode("");
+        insured3.setPostAddress("");
+        insured3.setOrgCode("");
+        insured3.setAge("");
+        insured3.setBirthDay("1961-08-01");
+        insured3.setIsIndividualBusi("");
+        insured3.setAppliCitizenshipBC("01");
+        insured3.setAppliCountryBC("008zg");
+        insured3.setEmail("");
+        insured3.setBusinessLicenseType("");
+        insured3.setNation("");
+        insured3.setIdentifyAddress("");
+        insured3.setIdentifyStartDate("");
+        insured3.setIdentifyEndDate("");
+        insured3.setCarInsuredRelation("");
+        insured3.setBusinessSort("15");
+        insured3.setLinkerName("");
+        insured3.setSpecialDInsuredName("");
+        insured3.setSpecialDInsuredIDType("");
+        insured3.setSpecialDInsuredID("");
+        insured3.setNoSpecialDInsuredP("");
+        insuredList.add(insured3);
+        businessData.setInsuredList(insuredList);
+
+        // 风险列表
+        List<BoHaiCrawlerQuotationRequest2.Risk> riskList = new java.util.ArrayList<>();
+        // 交强险
+        BoHaiCrawlerQuotationRequest2.Risk jqRisk = new BoHaiCrawlerQuotationRequest2.Risk();
+        List<BoHaiCrawlerQuotationRequest2.ItemKind> jqItemKinds = new java.util.ArrayList<>();
+
+        //交强险列表
+        BoHaiCrawlerQuotationRequest2.ItemKind jqItem = new BoHaiCrawlerQuotationRequest2.ItemKind();
+        jqItem.setItemKindNo("0");
+        jqItem.setKindCode("BZ");
+        jqItem.setKindName("机动车交通事故责任强制保险");
+        jqItem.setOperateType("");
+        jqItem.setShortRateFlag("2");
+        jqItem.setCalculateFlag("Y");
+        jqItem.setNotDeductibleFlag("0");
+        jqItemKinds.add(jqItem);
+        jqRisk.setItemKindList(jqItemKinds);
+
+        BoHaiCrawlerQuotationRequest2.RiskMainInfo jqMain = new BoHaiCrawlerQuotationRequest2.RiskMainInfo();
+        jqMain.setIsDrivingFee("1");
+        jqMain.setAgriflag("012001");
+        jqMain.setRiskCode("0330");
+        jqMain.setCurrency("CNY");
+        jqMain.setRenewalFlag("0");
+        jqMain.setStartDate("2025-10-10");
+        jqMain.setStartHour("0");
+        jqMain.setEndDate("2026-10-09");
+        jqMain.setEndHour("24");
+        jqMain.setNoneFluctuateFlag("N1");
+        jqMain.setChannelCoefficient("1.00");
+        jqMain.setCustomerCoefficient("364001");
+        jqMain.setFleetCoefficient("365000");
+        jqMain.setSignDate("2025-10-09");
+        jqMain.setOperateDate("2025-10-09");
+        jqMain.setInputDate("2025-10-09");
+        jqMain.setPricingAdjustValue("1");
+        jqMain.setNoneFluctuateFeeRate("N1");
+        jqRisk.setRiskMainInfo(jqMain);
+
+        BoHaiCrawlerQuotationRequest2.CarShipTaxInfo taxInfo = new BoHaiCrawlerQuotationRequest2.CarShipTaxInfo();
+        taxInfo.setTaxPayerIdentifier("142626196108011016");
+        taxInfo.setTaxPayerName("段志文");
+        taxInfo.setTaxPayerIdentifyNumberType("01");
+        taxInfo.setTaxPayerIdentifyNumber("142626196108011016");
+        taxInfo.setUnladenMassCS(1087);
+        taxInfo.setLicenseCategory("K33");
+        taxInfo.setCertificateDate("2013-10-14");
+        taxInfo.setTaxItemCode("A");
+        taxInfo.setTaxItemName("载客汽车");
+        taxInfo.setTaxRelifFlag("1");
+        taxInfo.setCalculateMode("1");
+        taxInfo.setCalLateFeeFlag("0");
+        taxInfo.setCalPayBalanceFeeFlag("0");
+        taxInfo.setTaxType("1");
+        taxInfo.setTaxNumType("1");
+        taxInfo.setPayTaxDate("202510");
+        taxInfo.setCarOwnerNature("1");
+        taxInfo.setCarAddressCode("120000");
+        taxInfo.setUseType("100");
+        taxInfo.setCalFeeFlag("00");
+        jqRisk.setCarShipTaxInfo(taxInfo);
+        riskList.add(jqRisk);
+
+        // 商业险(车辆损失险)
+        BoHaiCrawlerQuotationRequest2.Risk syRisk = new BoHaiCrawlerQuotationRequest2.Risk();
+        List<BoHaiCrawlerQuotationRequest2.ItemKind> syItemKinds = new java.util.ArrayList<>();
+        BoHaiCrawlerQuotationRequest2.ItemKind syItem = new BoHaiCrawlerQuotationRequest2.ItemKind();
+        syItem.setItemKindNo("1");
+        syItem.setKindCode("A");
+        syItem.setKindName("车辆损失险");
+        syItem.setStartDate("2025-12-01");
+        syItem.setStartHour("0");
+        syItem.setEndDate("2026-11-30");
+        syItem.setEndHour("24");
+        syItem.setAmount("15380.00");
+        syItem.setShortRateFlag("3");
+        syItem.setCalculateFlag("Y");
+        syItem.setNotDeductibleFlag("0");
+        syItemKinds.add(syItem);
+        syRisk.setItemKindList(syItemKinds);
+
+        BoHaiCrawlerQuotationRequest2.RiskMainInfo syMain = new BoHaiCrawlerQuotationRequest2.RiskMainInfo();
+        syMain.setIsDrivingFee("1");
+        syMain.setAgriflag("012001");
+        syMain.setRiskCode("0380");
+        syMain.setCurrency("CNY");
+        syMain.setRenewalFlag("0");
+        syMain.setStartDate("2025-12-01");
+        syMain.setStartHour("0");
+        syMain.setEndDate("2026-11-30");
+        syMain.setEndHour("24");
+        syMain.setNcdCoefficient("1");
+        syMain.setChannelCoefficient("1.00");
+        syMain.setCustomerProperty("001");
+        syMain.setRiskCoefficient("362003");
+        syMain.setBusinessCoefficient("363000");
+        syMain.setVehicleCoefficient("000");
+        syMain.setCustomerCoefficient("364001");
+        syMain.setFleetCoefficient("365000");
+        syMain.setClauseType("F91");
+        syMain.setSignDate("2025-10-09");
+        syMain.setOperateDate("2025-10-09");
+        syMain.setInputDate("2025-10-09");
+        syRisk.setRiskMainInfo(syMain);
+        riskList.add(syRisk);
+        businessData.setRiskList(riskList);
+
+        // 赋值到请求对象
+        boHaiCrawlerQuotationRequest2.setBusinessData(businessData);
+        boHaiCrawlerQuotationRequest2.setLoginCom("14070201");
+        boHaiCrawlerQuotationRequest2.setUserCode("114050281");
+        boHaiCrawlerQuotationRequest2.setFirstUserCode("114050281");
+
+        BoHaiCrawlerQuotationResponse boHaiCrawlerQuotationResponse = boHaiCrawlerRequestComponent.quotation(boHaiCrawlerQuotationRequest2, headers);
+        log.info("boHaiCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(boHaiCrawlerQuotationResponse));
 
         // 4.0 处理报价失败
         if (!ResponseCode.R_Z00001.equals(boHaiCrawlerQuotationResponse.getResponseCode())) {
@@ -200,7 +616,8 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
     }
 
     /**
-     *查询订单状态
+     * 查询订单状态
+     *
      * @param orderStatusVo
      * @return
      */
@@ -229,7 +646,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      * @param headers
      * @return Map<String, Object>
      */
-    private Map<String, Object> getVehicleConfirmationResponse(QuoteVo quoteVo, BoHaiCrawlerCarResponse boHaiCrawlerCarResponse, BoHaiCrawlerConfigureParameters parameters,HttpHeaders headers) {
+    private Map<String, Object> getVehicleConfirmationResponse(QuoteVo quoteVo, BoHaiCrawlerCarResponse boHaiCrawlerCarResponse, BoHaiCrawlerConfigureParameters parameters, HttpHeaders headers) {
         // 车主信息
         CustomerInfoVo ownerInfo = quoteVo.getOwnersInfo();
         PersonAreaVo ownerInfoArea = new PersonAreaVo(ownerInfo);
@@ -240,13 +657,90 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
         PersonAreaVo policyHolderArea = new PersonAreaVo(policyHolderInfo);
 
-        BoHaiCrawlerVehicleConfirmationReqeust vehicleConfirmationReqeust = new BoHaiCrawlerVehicleConfirmationReqeust(parameters, quoteVo, boHaiCrawlerCarResponse, ownerInfoArea, insuredPersonArea, policyHolderArea);
-
-        BoHaiCrawlerVehicleConfirmationResponse boHaiCrawlerVehicleConfirmationResponse = boHaiCrawlerRequestComponent.vehicleConfirmation(vehicleConfirmationReqeust,headers);
+        /*BoHaiCrawlerVehicleConfirmationReqeust vehicleConfirmationReqeust = new BoHaiCrawlerVehicleConfirmationReqeust(parameters, quoteVo, boHaiCrawlerCarResponse, ownerInfoArea, insuredPersonArea, policyHolderArea);*/
+        BoHaiCrawlerVehicleConfirmationReqeust1 boHaiCrawlerVehicleConfirmationReqeust1 = new BoHaiCrawlerVehicleConfirmationReqeust1();
+        // 车辆确认请求头
+        BoHaiCrawlerVehicleConfirmationReqeust1.HeadDTO headDTO = new BoHaiCrawlerVehicleConfirmationReqeust1.HeadDTO();
+        headDTO.setTransCode("CarModelsQuery");
+        headDTO.setTransType("Req");
+        //token先写死
+        headDTO.setToken("114050281-de6614d0af8b92ed9fd72f3ea80b324d");
+        boHaiCrawlerVehicleConfirmationReqeust1.setHead(headDTO);
+
+        BoHaiCrawlerVehicleConfirmationReqeust1.BodyDTO bodyDTO = new BoHaiCrawlerVehicleConfirmationReqeust1.BodyDTO();
+        bodyDTO.setBasicRateCode("");
+
+        // 登录机构编码,先写死
+        bodyDTO.setComCode("14070201");
+        bodyDTO.setEffectiveDate("2025-09-30");
+        bodyDTO.setExpireDate("2026-09-29");
+        bodyDTO.setEndHour("24");
+        bodyDTO.setStartHour("0");
+        bodyDTO.setRiskCode("0380");
+        bodyDTO.setBusinessNature("2");
+        bodyDTO.setEngineNo(boHaiCrawlerCarResponse.getJyCarModelFill().getEngineNumber());
+        bodyDTO.setVin(boHaiCrawlerCarResponse.getJyCarModelFill().getVinCode());
+        bodyDTO.setLicensePlateNo(boHaiCrawlerCarResponse.getJyCarModelFill().getPlateNumber());
+        //车牌类型
+        bodyDTO.setLicensePlateType("02");
+        bodyDTO.setFirstRegisterDate(boHaiCrawlerCarResponse.getJyCarModelFill().getRegisterDate());
+        bodyDTO.setModelCode(boHaiCrawlerCarResponse.getPrpDCarModels().get(0).getIndustryCarTypeCode());
+        //平台车型代码
+        bodyDTO.setPlatFormModelCode(boHaiCrawlerCarResponse.getPrpDCarModels().get(0).getIndustryCarTypeCode());
+        bodyDTO.setNoticeType("");
+        bodyDTO.setVehicleModel(boHaiCrawlerCarResponse.getPrpDCarModels().get(0).getModelCode());
+        bodyDTO.setVehicleStyleDesc("K33");
+        bodyDTO.setCarName("");
+        bodyDTO.setVehicleBrand("");
+        bodyDTO.setMadeFactory("");
+
+        //车辆动力参数
+        //排量
+        bodyDTO.setExhaustScale(1.373);
+        bodyDTO.setDisplacement("");
+        bodyDTO.setPower("103");
+        bodyDTO.setModelEnergyType("0");
+        bodyDTO.setPureRange("");
+
+        //车辆类型分类
+        bodyDTO.setMainCarKindCode("A");
+        bodyDTO.setMotorTypeCode("A0");
+        bodyDTO.setMotorMainTypeCode("A");
+        bodyDTO.setMotorUsageTypeCode("8A");
+
+        //车辆载重/载客信息
+        //核定载客量
+        bodyDTO.setRatedPassengerCapacity("5");
+        bodyDTO.setLimitLoadPerson("5");
+        bodyDTO.setTonnage("0.0000");
+        bodyDTO.setLimitLoad("0.0000");
+        bodyDTO.setWholeWeight("");
+
+        //价格与价值信息
+        log.info("购买价值:{}", boHaiCrawlerCarResponse.getPrpDCarModels().get(0).getPurchasePrice());
+        bodyDTO.setReplacementValue(boHaiCrawlerCarResponse.getPrpDCarModels().get(0).getPurchasePrice());
+
+        //车辆状态标志
+        bodyDTO.setNewVehicleFlag("");
+        bodyDTO.setEcdemicVehicleFlag("");
+        bodyDTO.setIsI3RiskFlag("0");
+
+        //其他信息
+        bodyDTO.setLfDate("");
+        bodyDTO.setCertificateDate("");
+        bodyDTO.setCarOwnerNature("1");
+        // 车主证件类型 01:表示身份证
+        bodyDTO.setCarOwnerIdentifyType("01");
+        bodyDTO.setSalesChannelRefCode("");
+        bodyDTO.setPrecisePriceComCode(true);
+        boHaiCrawlerVehicleConfirmationReqeust1.setBody(bodyDTO);
+
+        //调用车辆确认接口
+        BoHaiCrawlerVehicleConfirmationResponse2 boHaiCrawlerVehicleConfirmationResponse = boHaiCrawlerRequestComponent.vehicleConfirmation(boHaiCrawlerVehicleConfirmationReqeust1, headers);
+        log.info("boHaiCrawlerVehicleConfirmationResponse参数的值:{}", JSON.toJSONString(boHaiCrawlerVehicleConfirmationResponse));
 
         Map<String, Object> map = new HashMap<>();
-        map.put("vehicleModelsDTO", boHaiCrawlerCarResponse.getList().get(0));
-        map.put("vehicleConfirmationResponse", boHaiCrawlerVehicleConfirmationResponse);
+        map.put("currentValue", boHaiCrawlerVehicleConfirmationResponse.getVehiclePriceList().get(0).getActualValue());
         return map;
     }
 }

+ 2 - 2
tenant/insurance/quotation-commons/pom.xml

@@ -49,8 +49,8 @@
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
-                    <source>14</source>
-                    <target>14</target>
+                    <source>15</source>
+                    <target>15</target>
                 </configuration>
             </plugin>
         </plugins>

+ 103 - 17
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -1,6 +1,4 @@
 package com.jzg.quotation.commons.component;
-
-
 import com.alibaba.fastjson2.JSON;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.config.WebClientConfig;
@@ -51,13 +49,30 @@ public class RequestComponent {
 
     /**
      * 创建无SSL的WebClient
+     *
      * @return WebClient
      */
     private WebClient selectNoSSLWebClient() {
         try {
             if (webClientConfig != null) {
-                return webClientConfig.createWebClient();
-                //return null;
+                return webClientConfig.clientBuilder();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("创建安全WebClient失败,使用默认WebClient", e);
+        }
+        return webClient;
+    }
+
+    /**
+     * 创建无SSL的WebClient
+     *
+     * @return WebClient
+     */
+    private WebClient selectNoSSLWebClient2() {
+        try {
+            if (webClientConfig != null) {
+                return webClientConfig.clientBuilder1();
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -112,6 +127,9 @@ public class RequestComponent {
     public static Consumer<HttpHeaders> setHeaders(HttpHeaders headers) {
         return httpHeaders -> {
             httpHeaders.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36");
+            httpHeaders.add(HttpHeaders.ACCEPT, "application/json");
+            httpHeaders.add(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9");
+            httpHeaders.add(HttpHeaders.CACHE_CONTROL, "no-cache");
             if (headers != null) {
                 httpHeaders.addAll(headers);
             }
@@ -202,6 +220,7 @@ public class RequestComponent {
                 .toEntity(responseClass)
                 .block();
     }
+
     //返回字符串
     public String baseGetString(String url, Object initDataRequest, HttpHeaders headers) {
         MultiValueMap<String, String> multiValueMap = RequestObjectConversion.convertMultiValueStringMap(initDataRequest);
@@ -236,7 +255,7 @@ public class RequestComponent {
     /**
      * @param url           请求地址
      * @param param         拼接的请求参数
-     * @param description  描述信息
+     * @param description   描述信息
      * @param responseClass 响应返回类
      * @param <Response>    响应实体
      * @return 响应
@@ -246,30 +265,84 @@ public class RequestComponent {
     }
 
     /**
+     * 构造post请求 返回的content-type:application/json;charset=UTF-8
      * @param url           请求地址
      * @param body          请求体
      * @param responseClass 响应类
      * @param headers       请求头
      * @param <Response>    响应实体
-     * @return 响应
+     * @return <Response> ResponseEntity<Response> 响应
      */
     public <Response> ResponseEntity<Response> post(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
         if (log.isDebugEnabled()) {
             log.debug("request body is {}", body);
         }
         body = Optional.ofNullable(body).orElse("");
-        log.info("URL的值:{},body的值:{},headers的值:{}",url,JSON.toJSONString(body),JSON.toJSONString(headers));
+        log.info("URL的值:{},body的值:{}", url, body);
+
+        String cookie = "HTTPOnly; Cookie=!nWlhN+KeEYSeye21yv2qnldjEk8Kb9NrbshGomNlDw5h9g3lSal2Gb9pNc81nEf0UOCqFH0E/WkCBk4=; JSESSIONID=0002PPgTB0CRmLqKNT7J4yf05S8:2QC5VNQ9QS:1RBTVLUT0B";
+        String sessionId = "114050281_Z29iq6s0yGo8CATOUi5povI1759975733997";
+
         //WebClient webClient = selectWebClient(url);
         WebClient webClient = selectNoSSLWebClient();
         try {
             return webClient.post()
                     .uri(url)
-                    .headers(setHeaders(headers))
+                    //.headers(setHeaders(headers))
+                    .header(HttpHeaders.COOKIE, cookie)
+                    .header("sessionId",sessionId)
+                    .header(HttpHeaders.ACCEPT, "application/json,text/html,text/json,*/*")
+                    .header(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9")
+                    .header(HttpHeaders.CACHE_CONTROL, "no-cache")
                     .body(BodyInserters.fromValue(body))
                     .retrieve()
                     .toEntity(responseClass)
                     .block();
-        }catch (WebClientResponseException e) {
+        } catch (WebClientResponseException e) {
+            e.printStackTrace();
+            // 如果服务端返回非2xx状态码
+            System.err.println("状态码: " + e.getRawStatusCode());
+            System.err.println("响应体: " + e.getResponseBodyAsString());
+            throw e;
+        }
+    }
+
+
+    /**
+     * 构造post请求,返回的content-type:text/json;charset=UTF-8
+     * @param url           请求地址
+     * @param body          请求体
+     * @param responseClass 响应类
+     * @param headers       请求头
+     * @param <Response>    响应实体
+     * @return <Response> ResponseEntity<Response> 响应
+     */
+    public <Response> ResponseEntity<Response> post2(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
+        if (log.isDebugEnabled()) {
+            log.debug("request body is {}", body);
+        }
+        body = Optional.ofNullable(body).orElse("");
+        log.info("URL的值:{},body的值:{}", url, body);
+
+        String cookie = "HTTPOnly; Cookie=!nWlhN+KeEYSeye21yv2qnldjEk8Kb9NrbshGomNlDw5h9g3lSal2Gb9pNc81nEf0UOCqFH0E/WkCBk4=; JSESSIONID=0002PPgTB0CRmLqKNT7J4yf05S8:2QC5VNQ9QS:1RBTVLUT0B";
+        String sessionId = "114050281_Z29iq6s0yGo8CATOUi5povI1759975733997";
+
+        WebClient webClient = selectNoSSLWebClient2();
+        try {
+            return webClient.post()
+                    .uri(url)
+                    //.headers(setHeaders(headers))
+                    .header(HttpHeaders.COOKIE, cookie)
+                    .header("sessionId",sessionId)
+                    .header(HttpHeaders.ACCEPT, "application/json,text/html,text/json,*/*")
+                    .header(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9")
+                    .header(HttpHeaders.CACHE_CONTROL, "no-cache")
+                    .body(BodyInserters.fromValue(body))
+                    .retrieve()
+                    .toEntity(responseClass)
+                    //.bodyToMono(responseClass)
+                    .block();
+        } catch (WebClientResponseException e) {
             e.printStackTrace();
             // 如果服务端返回非2xx状态码
             System.err.println("状态码: " + e.getRawStatusCode());
@@ -280,11 +353,12 @@ public class RequestComponent {
 
     /**
      * gbk
+     *
      * @param url           请求地址
      * @param body          请求体
      * @param responseClass 响应类
      * @param headers       请求头
-     * @param <T>    响应实体
+     * @param <T>           响应实体
      * @return 响应
      */
     public <T> Mono<T> postGbk(String url, String body, Class<T> responseClass, HttpHeaders headers) {
@@ -344,19 +418,16 @@ public class RequestComponent {
     }
 
 
-
-
     /**
      * @param url           请求地址
      * @param body          请求体
      * @param responseClass 响应类
      * @param headers       请求头
      * @param <Response>    响应实体
-     * @return 响应
+     * @return <Response> ResponseEntity<Response> 响应
      */
     public <Response> ResponseEntity<Response> stringPost(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
         String requestBody = JSON.toJSONString(body);
-        log.info("请求参数:{}",requestBody);
         return post(url, requestBody, responseClass, headers);
     }
 
@@ -397,8 +468,6 @@ public class RequestComponent {
 //                .block();
 
 
-
-
         return webClient.post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))
@@ -413,6 +482,7 @@ public class RequestComponent {
         MultiValueMap<String, Object> multiValueMap = RequestObjectConversion.convertMultiValueMap(body);
         return formDatazhongan1(url, multiValueMap, responseClass, headers);
     }
+
     public <Response> ResponseEntity<Response> formDatazhongan1(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers) {
 
         return webClient.post()
@@ -440,7 +510,7 @@ public class RequestComponent {
         return block;
     }
 
-    public <Response> ResponseEntity<Response> formUrlencoded(String url,  BodyInserters.FormInserter<String> formInserter, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> formUrlencoded(String url, BodyInserters.FormInserter<String> formInserter, Class<Response> responseClass, HttpHeaders headers) {
         return webClient.post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))
@@ -592,6 +662,22 @@ public class RequestComponent {
         return stringPost(url, body, responseClass, headers);
     }
 
+
+    /**
+     * POST请求
+     *
+     * @param url           请求地址
+     * @param body          请求体
+     * @param responseClass 响应返回类
+     * @param headers       请求头
+     * @param <Response>    响应返回
+     * @return 响应
+     */
+    public <Response> ResponseEntity<Response> objectPost2(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
+        String requestBody = JSON.toJSONString(body);
+        return post2(url, requestBody, responseClass, headers);
+    }
+
     /**
      * POST请求返回响应体包装对象
      *

+ 28 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/JacksonConfig.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.commons.config;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+@Configuration
+public class JacksonConfig {
+
+    @Bean
+    @Primary
+    public ObjectMapper objectMapper() {
+        ObjectMapper mapper = new ObjectMapper();
+        // 注册 JSR310 模块支持 Java 8 时间类型
+        mapper.registerModule(new JavaTimeModule());
+
+        // 禁用将日期写为时间戳
+        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+        return mapper;
+    }
+}

+ 19 - 27
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java

@@ -87,35 +87,27 @@ public class WebClientConfig {
         })).build();
     }
 
-    /**
-     * 创建普通的无SSLWebClient对象
-     * @return WebClient
-     * @throws Exception
-     */
-    public WebClient createWebClient() throws Exception {
-        TrustManager[] trustAllCerts = new TrustManager[] {
-                new X509TrustManager() {
-                    public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
-                    public void checkClientTrusted(X509Certificate[] certs, String authType) { }
-                    public void checkServerTrusted(X509Certificate[] certs, String authType) { }
-                }
-        };
-
-        SSLContext sslContext = SSLContext.getInstance("TLS");
-        sslContext.init(null, trustAllCerts, new SecureRandom());
-
-        SslContext nettyContext = SslContextBuilder.forClient()
-                .trustManager(InsecureTrustManagerFactory.INSTANCE)
-                .build();
-
-        HttpClient httpClient = HttpClient.create()
-                .secure(sslSpec -> sslSpec.sslContext(nettyContext));
-
-        return WebClient.builder()
-                .clientConnector(new ReactorClientHttpConnector(httpClient))
-                .build();
+    //@Bean(name = "clientBuilder1")
+    public WebClient clientBuilder1() {
+        // 配置默认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
      *