Explorar el Código

Merge branch 'quotation/zhongan'

wlq hace 1 año
padre
commit
b26af11e1e
Se han modificado 56 ficheros con 5536 adiciones y 3 borrados
  1. 1 0
      tenant/insurance/pom.xml
  2. 3 3
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/componet/YangGuangApiRequestComponent.java
  3. 60 0
      tenant/insurance/quotation-zhongan/pom.xml
  4. 52 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/JsonUtil.java
  5. 67 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnAPI.java
  6. 26 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnResponse1.java
  7. 41 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnResponse2.java
  8. 102 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnApplicant.java
  9. 30 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnBizDocumentInfo.java
  10. 87 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCacheCarInfo.java
  11. 30 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCompelDocumentInfo.java
  12. 126 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCoverage.java
  13. 54 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnDistribution.java
  14. 499 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnExtraInfoObj.java
  15. 59 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnFrontVehicleModelDTO.java
  16. 102 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnInsurant.java
  17. 85 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnJyxInsure.java
  18. 29 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnLoanVehicle.java
  19. 35 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnNonAutoDocumentInfo.java
  20. 22 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPayment.java
  21. 98 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicy.java
  22. 66 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicyDetail.java
  23. 13 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicyGrade.java
  24. 236 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPremiumTrial.java
  25. 24 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPromise.java
  26. 21 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnProperties.java
  27. 84 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnQueryPolicy.java
  28. 25 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnQueryPolicyList.java
  29. 59 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnTax.java
  30. 51 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleCoverage.java
  31. 353 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleDTO.java
  32. 251 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleModel.java
  33. 98 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleOwner.java
  34. 310 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePolicyDTO.java
  35. 446 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePolicyExtraInfo.java
  36. 75 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePremium.java
  37. 291 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnCacheCarInfoParam.java
  38. 21 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnPremiumTrialParamCoverageInfo.java
  39. 18 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnPremiumTrialParamNonAutoInfo.java
  40. 11 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnQueryDocumentInfoParam.java
  41. 10 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnQueryJyytVehicleModelParam.java
  42. 14 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheCarInfoResult.java
  43. 59 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheInputQueryParam.java
  44. 13 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheInputQueryResult.java
  45. 21 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnPremiumTrialResult.java
  46. 23 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryCarInfoResult.java
  47. 40 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryDocumentInfoResult.java
  48. 48 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryJyytVehicleModelResult.java
  49. 21 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyDetailResult.java
  50. 22 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyListResult.java
  51. 309 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIService.java
  52. 167 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnQuotaionApiBaseServiceImpl.java
  53. 190 0
      tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryCarInfoResultTest.java
  54. 139 0
      tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryJyytVehicleModelResultTest.java
  55. 257 0
      tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyDetailResultTest.java
  56. 142 0
      tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIServiceTest.java

+ 1 - 0
tenant/insurance/pom.xml

@@ -29,6 +29,7 @@
         <module>quotation-taikang</module>
         <module>quotation-ansheng</module>
         <module>quotation-hengbang</module>
+        <module>quotation-zhongan</module>
     </modules>
 
     <dependencies>

+ 3 - 3
tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/componet/YangGuangApiRequestComponent.java

@@ -6,7 +6,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.quotation.yangguang.api.entity.request.*;
 import com.jzg.quotation.yangguang.api.entity.response.*;
 import com.jzg.quotation.yangguang.api.properties.YangGuangApiProperties;
-import com.sunyard.insurance.encode.client.EncodeAccessParam;
+//import com.sunyard.insurance.encode.client.EncodeAccessParam;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.HttpException;
@@ -112,8 +112,8 @@ public class YangGuangApiRequestComponent {
         String url = yangGuangApiProperties.getUploadUrl();
         String secret = yangGuangApiProperties.getSecret();
         String referer = yangGuangApiProperties.getReferer();
-        String encode = EncodeAccessParam.getEncodeParam(String.valueOf(json), 1000L,secret);
-        responesStr = httpPost(url,"req", encode, referer);
+        //String encode = EncodeAccessParam.getEncodeParam(String.valueOf(json), 1000L,secret);
+        //responesStr = httpPost(url,"req", encode, referer);
         return responesStr;
     }
 

+ 60 - 0
tenant/insurance/quotation-zhongan/pom.xml

@@ -0,0 +1,60 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>tenant</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <artifactId>quotation-zhongan</artifactId>
+    <name>众安保险</name>
+    <packaging>jar</packaging>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib</artifactId>
+            <version>3.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct</artifactId>
+            <version>1.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mapstruct</groupId>
+            <artifactId>mapstruct-processor</artifactId>
+            <version>1.6.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok-mapstruct-binding</artifactId>
+            <version>0.2.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.jzg.organization.OrganizationApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 52 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/JsonUtil.java

@@ -0,0 +1,52 @@
+package com.jzg.quotation.zhongan.crawler;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import java.io.InputStream;
+
+public class JsonUtil {
+
+    private static final ObjectMapper mapper;
+
+    static {
+        mapper = new ObjectMapper();
+        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
+        // 注意:FAIL_ON_UNKNOWN_PROPERTIES 不要配置成 false。反序列化时,需要获取到未知字段。
+        //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+    }
+
+    public static <T> T readObjcet(String json, Class<T> clazz) {
+        try {
+            T t = mapper.readValue(json, clazz);
+            return t;
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static String toJsonString(Object object) {
+        try {
+            String json = mapper.writeValueAsString(object);
+            return json;
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 从 InputStream 解析 JSON 到对象
+     */
+    public static <T> T readObjcet(InputStream inputStream, Class<T> clazz) {
+        try {
+            return mapper.readValue(inputStream, clazz);
+        } catch (Exception e) {
+            throw new RuntimeException("JSON 解析失败", e);
+        }
+    }
+}

+ 67 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnAPI.java

@@ -0,0 +1,67 @@
+package com.jzg.quotation.zhongan.crawler.client;
+
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+
+public enum ZhongAnAPI implements CrawlerRequestUrlStandard {
+
+    QueryDocumentInfo("/open/bmw/n/query_controller/queryDocumentInfo.json", ""),
+    QueryPolicyDetail("/policy/policy_detail_controller/query_policy_detail.json", "获取保单详情"),
+    QueryPolicyList("/open/bmw/query_controller/query_policy_list.json", "查询保单列表"),
+    PremiumTrial("/open/bmw/n/quote_controller/premium_trial.json", "报价接口"),
+    CacheInputQuery("/open/bmw/index_controller/cache_input_query.json", "发起创建保单"),
+    CacheCarInfo("/open/bmw/car_controller/cache_car_info.json", "缓存保单数据"),
+    QueryCarInfo("/open/bmw/car_controller/query_car_info.json", "查询车信息"),
+    QueryJyytVehicleModel("/open/bmw/car_controller/query_jyyt_vehicle_model.json", "车型查询"),
+
+    ;
+
+    private final String uri;
+
+    private final String description;
+
+    private String url;
+
+    ZhongAnAPI(String uri, String description) {
+        this.uri = uri;
+        this.description = description;
+    }
+
+    @Override
+    public String getRequestDescription() {
+        return "";
+    }
+
+    @Override
+    public String uri() {
+        return "";
+    }
+
+    public String url() {
+        return url;
+    }
+
+    static {
+        initAPI("https://c.zhongan.com");
+    }
+
+    public void urlStartWith(String host) {
+        this.url = host + this.uri;
+    }
+
+
+    public static void initAPI(String host) {
+        if (host == null || host.isBlank()) {
+            return;
+        }
+
+        ZhongAnAPI[] values = ZhongAnAPI.values();
+
+        if (values.length == 0) {
+            return;
+        }
+
+        for (ZhongAnAPI api : values) {
+            api.urlStartWith(host);
+        }
+    }
+}

+ 26 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnResponse1.java

@@ -0,0 +1,26 @@
+package com.jzg.quotation.zhongan.crawler.client;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnResponse1<T> extends UnknownFieldEntity {
+    /** 响应状态码 */
+    @JsonProperty("resultCode")
+    private Integer resultCode;
+
+    /** 响应消息 */
+    @JsonProperty("resultMsg")
+    private String resultMsg;
+
+    @JsonProperty("returnFlag")
+    private Boolean returnFlag;
+
+    /** 响应主体数据 */
+    @JsonProperty("resultContent")
+    private T resultContent;
+}
+

+ 41 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/client/ZhongAnResponse2.java

@@ -0,0 +1,41 @@
+package com.jzg.quotation.zhongan.crawler.client;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnResponse2<T, E> extends UnknownFieldEntity {
+    /** 错误信息 */
+    @JsonProperty("errorMsg")
+    private String errorMsg;
+
+    /** 规则提示信息 */
+    @JsonProperty("ruleMsgTips")
+    private String ruleMsgTips;
+
+    /** 错误代码 */
+    @JsonProperty("errorCode")
+    private String errorCode;
+
+    /** 响应值 */
+    @JsonProperty("value")
+    private T value;
+
+    /** 附加信息 */
+    @JsonProperty("additionalInfo")
+    private E additionalInfo;
+
+    /** 是否成功 */
+    @JsonProperty("success")
+    private Boolean success;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("value", value);
+        addChildUnknownField("additionalInfo", additionalInfo);
+    }
+}
+

+ 102 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnApplicant.java

@@ -0,0 +1,102 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnApplicant extends UnknownFieldEntity {
+    /**
+     * 投保人ID
+     */
+    private Long id;
+    /**
+     * 核心用户ID
+     */
+    private Long coreUserId;
+    /**
+     * 车辆保单ID
+     */
+    private Long vehiclePolicyId;
+    /**
+     * 保单客户类型
+     */
+    private String policyCustomerType;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+    /**
+     * 证件号码
+     */
+    private String certificateNo;
+    /**
+     * 手机号
+     */
+    private String phoneNo;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 国籍
+     */
+    private String nationality;
+    /**
+     * 省份代码
+     */
+    private String province;
+    /**
+     * 城市代码
+     */
+    private String city;
+    /**
+     * 乡镇代码
+     */
+    private String town;
+    /**
+     * 街道
+     */
+    private String street;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 性别
+     */
+    private String sex;
+    /**
+     * 生日(时间戳)
+     */
+    private Long birthday;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 客户个人标识
+     */
+    private Boolean cusPersonFlg;
+    /**
+     * 人员类型
+     */
+    private String personnelType;
+    /**
+     * 验证结果
+     */
+    private String verifyResult;
+}

+ 30 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnBizDocumentInfo.java

@@ -0,0 +1,30 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnBizDocumentInfo extends UnknownFieldEntity {
+
+    /**
+     * 文档名称
+     */
+    private String name;
+
+    /**
+     * 文档类型
+     */
+    private String type;
+
+    /**
+     * 文档文件名
+     */
+    private String documentName;
+
+    /**
+     * 文档URL
+     */
+    private String documentUrl;
+}

+ 87 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCacheCarInfo.java

@@ -0,0 +1,87 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnCacheCarInfo extends UnknownFieldEntity {
+    /**
+     * 是否开放车牌号输入(0: 否, 1: 是)
+     */
+    private String isOpenVehicleLicenseNoInput;
+
+    /**
+     * 是否用户选择(0: 否, 1: 是)
+     */
+    private String isUserSelect;
+
+    /**
+     * 车牌号
+     */
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 投保地
+     */
+    private String insurePlace;
+
+    /**
+     * 个性化标志(SBBG)
+     */
+    @JsonProperty("IndividuatOfSBBGFlag")
+    private String individuatOfSBBGFlag;
+
+    /**
+     * 是否支持房屋(0: 否, 1: 是)
+     */
+    private String isSupportHouse;
+
+    /**
+     * 是否开放新车无前缀车牌(0: 否, 1: 是)
+     */
+    private String isOpenNewCarsUnprefixed;
+
+    /**
+     * 申请人类型(如 PERSONAL)
+     */
+    private String applicantType;
+
+    /**
+     * 是否为新车(false: 否, true: 是)
+     */
+    private Boolean isNewCar;
+
+    /**
+     * 车辆所有者信息
+     */
+    private ZhongAnVehicleOwner vehicleOwnerDTO;
+
+    /**
+     * 投保地代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 第三方机构代码
+     */
+    private String thirdOrgCode;
+
+    /**
+     * 申请人使用属性(如 03)
+     */
+    private String applicantUseAttribute;
+
+    @JsonProperty("vehicleExtDTO")
+    private ZhongAnVehicleDTO vehicleExtDTO;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("vehicleOwnerDTO", vehicleOwnerDTO);
+        addChildUnknownField("vehicleExtDTO", vehicleExtDTO);
+    }
+}

+ 30 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCompelDocumentInfo.java

@@ -0,0 +1,30 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnCompelDocumentInfo extends UnknownFieldEntity {
+
+    /**
+     * 文档名称
+     */
+    private String name;
+
+    /**
+     * 文档类型
+     */
+    private String type;
+
+    /**
+     * 文档文件名
+     */
+    private String documentName;
+
+    /**
+     * 文档URL
+     */
+    private String documentUrl;
+}

+ 126 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnCoverage.java

@@ -0,0 +1,126 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnCoverage extends UnknownFieldEntity {
+    /**
+     * 保障ID
+     */
+    private Long id;
+    /**
+     * 车辆保单ID
+     */
+    private Long vehiclePolicyId;
+    /**
+     * 产品定义代码
+     */
+    private String productDefCode;
+    /**
+     * 保单产品代码
+     */
+    private String policyProductCode;
+    /**
+     * 产品定义名称
+     */
+    private String productDefName;
+    /**
+     * 保额
+     */
+    private String amount;
+    /**
+     * 共保保额
+     */
+    private String coinsAmount;
+    /**
+     * 标准保费
+     */
+    private String standPremium;
+    /**
+     * 保费
+     */
+    private String premium;
+    /**
+     * 折扣
+     */
+    private String discount;
+    /**
+     * 共保保费
+     */
+    private String coinsPremium;
+    /**
+     * 生效日期
+     */
+    private Long effectiveDate;
+    /**
+     * 失效日期
+     */
+    private Long expiryDate;
+    /**
+     * 基础附加险类型
+     */
+    private String baseRiderType;
+    /**
+     * 共保标准保费
+     */
+    private String coinsStandPremium;
+    /**
+     * 创建者
+     */
+    private String creator;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改者
+     */
+    private String modifier;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 产品ID
+     */
+    private Long productId;
+    /**
+     * 显示保额
+     */
+    private String amountShow;
+    /**
+     * 共保不含税保费
+     */
+    private String coinsNoTaxPremium;
+    /**
+     * 共保税额
+     */
+    private String coinsTaxAmount;
+    /**
+     * 不含税保费
+     */
+    private String noTaxPremium;
+    /**
+     * 税额
+     */
+    private String taxAmount;
+    /**
+     * 税率
+     */
+    private String taxRate;
+    /**
+     * 显示顺序
+     */
+    private String showOrder;
+    /**
+     * 是否绿色投保保障
+     */
+    private Boolean greenWayCoverage;
+}

+ 54 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnDistribution.java

@@ -0,0 +1,54 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnDistribution extends UnknownFieldEntity {
+    /**
+     * 配送ID
+     */
+    private Long id;
+    /**
+     * 核心用户ID
+     */
+    private Long coreUserId;
+    /**
+     * 车辆保单ID
+     */
+    private Long vehiclePolicyId;
+    /**
+     * 保单客户类型
+     */
+    private String policyCustomerType;
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 客户个人标识
+     */
+    private Boolean cusPersonFlg;
+    /**
+     * 人员类型
+     */
+    private String personnelType;
+}

+ 499 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnExtraInfoObj.java

@@ -0,0 +1,499 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnExtraInfoObj extends UnknownFieldEntity {
+    /**
+     * 燃料类型
+     */
+    private String fuelType;
+
+    /**
+     * 税种类型
+     */
+    private String taxType;
+
+    /**
+     * 进口车标志
+     */
+    private String importCarFlag;
+
+    /**
+     * 平安保障开始日期
+     */
+    private String foreStartDateFromPingAn;
+
+    /**
+     * 车牌号
+     */
+    private String licenseNo;
+
+    /**
+     * 车架号
+     */
+    private String frameNo;
+
+    /**
+     * 发动机号
+     */
+    private String engineNo;
+
+    /**
+     * 计划代码
+     */
+    private String planCode;
+
+    /**
+     * 车辆型号名称
+     */
+    private String vehicleModelName;
+
+    /**
+     * 是否新车
+     */
+    private String isNewCar;
+
+    /**
+     * 实际价格
+     */
+    private String actalPrice;
+
+    /**
+     * 税票号
+     */
+    private String taxPrintNo;
+
+    /**
+     * 车辆家族代码
+     */
+    private String vehicleFamilyCode;
+
+    /**
+     * 车辆家族名称
+     */
+    private String vehicleFamilyName;
+
+    /**
+     * 车辆信息来源
+     */
+    private String vehicleInfoSource;
+
+    /**
+     * 车辆公开名称
+     */
+    private String vehiclePubName;
+
+    /**
+     * 车辆公开代码
+     */
+    private String vehiclePubCode;
+
+    /**
+     * 车辆车龄
+     */
+    private Integer vehicleAge;
+
+    /**
+     * 额外用户ID
+     */
+    private String extraUserId;
+
+    /**
+     * 城堡前端扩展信息
+     */
+    private String castleFrontExtroInfo;
+
+    /**
+     * 是否有上一份保单
+     */
+    private String hasLastPolicy;
+
+    /**
+     * 是否参与活动
+     */
+    private Boolean participateActivity;
+
+    /**
+     * 选择查询请求代码
+     */
+    private String choiceQueryRequestCode;
+
+    /**
+     * 强制查询请求代码
+     */
+    private String forceQueryRequestCode;
+
+    /**
+     * 再保险标志
+     */
+    private String reinsureFlag;
+
+    /**
+     * 离线投保标志
+     */
+    private String offInsureFlag;
+
+    /**
+     * 账户ID
+     */
+    private String accountId;
+
+    /**
+     * 发送投保到平安标志
+     */
+    private Boolean sendInsureToPAflag;
+
+    /**
+     * 会话ID
+     */
+    private String sessionId;
+
+    /**
+     * 用户ID
+     */
+    private String userId;
+
+    /**
+     * 系统代码
+     */
+    private String systemCode;
+
+    /**
+     * 车辆混合代码
+     */
+    private String vehicleHyCode;
+
+    /**
+     * 产品来源
+     */
+    private String productSource;
+
+    /**
+     * 品牌代码
+     */
+    private String brandCode;
+
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+
+    /**
+     * 证件日期
+     */
+    private String certificateDate;
+
+    /**
+     * 部门代码
+     */
+    private String departmentCode;
+
+    /**
+     * 业务最后保单号
+     */
+    private String bizLastPolicyNo;
+
+    /**
+     * 业务最后保单到期日期
+     */
+    private String bizLastPolicyExpireDate;
+
+    /**
+     * 渠道代码
+     */
+    private String channelCode;
+
+    /**
+     * 渠道类型
+     */
+    private String channelType;
+
+    /**
+     * 代理人扩展方式标签
+     */
+    private String agentExpandWayLabel;
+
+    /**
+     * 代理人业务类型标签
+     */
+    private String agentBizTypeLabel;
+
+    /**
+     * 代理人证件号
+     */
+    private String agentCertificateNo;
+
+    /**
+     * 经纪人代码
+     */
+    private String brokerCode;
+
+    /**
+     * 众安销售渠道代码
+     */
+    private String saleChannelCodeOfZA;
+
+    /**
+     * 众安销售渠道类型
+     */
+    private String saleChannelTypeOfZA;
+
+    /**
+     * 使用属性
+     */
+    private String useAttribute;
+
+    /**
+     * 所有权属性
+     */
+    private String ownershipAttribute;
+
+    /**
+     * 申请人人员类型
+     */
+    private String applicantPersonnelType;
+
+    /**
+     * 被保险人人员类型
+     */
+    private String insuredPersonnelType;
+
+    /**
+     * 代理人用户代码
+     */
+    private String agentUserCode;
+
+    /**
+     * 合作伙伴代理人代码
+     */
+    private String partnerAgentCode;
+
+    /**
+     * 出单日期
+     */
+    private String billDate;
+
+    /**
+     * 车主生日
+     */
+    private String vehicleOwnerBirthday;
+
+    /**
+     * 车主性别
+     */
+    private String vehicleOwnerSex;
+
+    /**
+     * 上限
+     */
+    private String upperLimit;
+
+    /**
+     * 下限
+     */
+    private String lowerLimit;
+
+    /**
+     * 平安佣金率
+     */
+    private String commissionRatePA;
+
+    /**
+     * 保单等级
+     */
+    private String policyGrade;
+
+    /**
+     * 商业险类ID
+     */
+    private String syxClassid;
+
+    /**
+     * 车库标志
+     */
+    private String garageFlag;
+
+    /**
+     * 车牌类型
+     */
+    private String vehicleLicenceType;
+
+    /**
+     * 交强险保费
+     */
+    private String jyPremium;
+
+    /**
+     * 功率
+     */
+    private String power;
+
+    /**
+     * 纯风险保费01
+     */
+    private String pureRiskPremium01;
+
+    /**
+     * 纯风险保费51
+     */
+    private String pureRiskPremium51;
+
+    /**
+     * 纯风险保费84
+     */
+    private String pureRiskPremium84;
+
+    /**
+     * 分公司代码
+     */
+    private String branchCode;
+
+    /**
+     * 车辆名称
+     */
+    private String vehicleName;
+
+    /**
+     * 贸易名称
+     */
+    private String tradeName;
+
+    /**
+     * 品牌
+     */
+    private String brand;
+
+    /**
+     * 部门名称
+     */
+    private String deptName;
+
+    /**
+     * 车辆样式
+     */
+    private String pmVehicleStyle;
+
+    /**
+     * 申请人使用属性
+     */
+    private String applicantUseAttribute;
+
+    /**
+     * 顶级合作伙伴代码
+     */
+    private String topPartnerCode;
+
+    /**
+     * 二级合作伙伴代码
+     */
+    private String secondPartnerCode;
+
+    /**
+     * 车辆类别
+     */
+    private String vehicleClass;
+
+    /**
+     * 用户设备号
+     */
+    private String userDeviceNo;
+
+    /**
+     * 用户IP
+     */
+    private String userIp;
+
+    /**
+     * 用户手机号
+     */
+    private String userPhoneNo;
+
+    /**
+     * 交强险进口车标志
+     */
+    private String jyImportCarFlag;
+
+    /**
+     * 自有核验结果
+     */
+    private String ownVerifyResult;
+
+    /**
+     * 车辆类型子类
+     */
+    private String vehicleTypeSubclass;
+
+    /**
+     * 车型能源类型
+     */
+    private String modelEnergyType;
+
+    /**
+     * 充电桩标志
+     */
+    private String chargingPileFlag;
+
+    /**
+     * 最后商用车延期标志
+     */
+    private String lastBusDelayFlag;
+
+    /**
+     * 查询日期
+     */
+    private String queryDate;
+
+    /**
+     * 首次报价标志
+     */
+    private String firstQuoteFlag;
+
+    /**
+     * 众安强制标志
+     */
+    private Boolean zaCompel;
+
+    /**
+     * 异地强制标志
+     */
+    private String relocationCompelFlag;
+
+    /**
+     * 异地强制地点
+     */
+    private String relocationCompelPlace;
+
+    /**
+     * 强制原产地
+     */
+    private String compelOrignPlace;
+
+    /**
+     * 能源特殊处理
+     */
+    private String energySpecialHandling;
+
+    /**
+     * 市场评估价值
+     */
+    private String marketEvaluateValue;
+
+    /**
+     * 新车折旧价格
+     */
+    private String newDepreciationPrice;
+
+    /**
+     * IP地址
+     */
+    private String ip;
+
+    /**
+     * 交强险标志
+     */
+    private String jy;
+}

+ 59 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnFrontVehicleModelDTO.java

@@ -0,0 +1,59 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnFrontVehicleModelDTO extends UnknownFieldEntity {
+    /**
+     * 车辆代码
+     */
+    private String vehicleCode;
+
+    /**
+     * 车辆名称
+     */
+    private String vehicleName;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 采购价格
+     */
+    private Integer purchasePrice; // 使用 Integer 避免精度问题,但原始 JSON 是数字
+
+    /**
+     * 座位数
+     */
+    private String seat;
+
+    /**
+     * 总重量
+     */
+    private String fullWeight;
+
+    /**
+     * 排量
+     */
+    private String displacement; // 使用 String 替代 double,避免精度问题
+
+    /**
+     * 变速箱类型
+     */
+    private String gearBoxType;
+
+    /**
+     * 配置名称
+     */
+    private String configName;
+}

+ 102 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnInsurant.java

@@ -0,0 +1,102 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnInsurant extends UnknownFieldEntity {
+    /**
+     * 被保险人ID
+     */
+    private Long id;
+    /**
+     * 核心用户ID
+     */
+    private Long coreUserId;
+    /**
+     * 车辆保单ID
+     */
+    private Long vehiclePolicyId;
+    /**
+     * 保单客户类型
+     */
+    private String policyCustomerType;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+    /**
+     * 证件号码
+     */
+    private String certificateNo;
+    /**
+     * 手机号
+     */
+    private String phoneNo;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 国籍
+     */
+    private String nationality;
+    /**
+     * 省份代码
+     */
+    private String province;
+    /**
+     * 城市代码
+     */
+    private String city;
+    /**
+     * 乡镇代码
+     */
+    private String town;
+    /**
+     * 街道
+     */
+    private String street;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 性别
+     */
+    private String sex;
+    /**
+     * 生日(时间戳)
+     */
+    private Long birthday;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 客户个人标识
+     */
+    private Boolean cusPersonFlg;
+    /**
+     * 人员类型
+     */
+    private String personnelType;
+    /**
+     * 验证结果
+     */
+    private String verifyResult;
+}

+ 85 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnJyxInsure.java

@@ -0,0 +1,85 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnJyxInsure {
+    /**
+     * 产品代码
+     */
+    private String productCode;
+    /**
+     * 产品名称
+     */
+    private String productName;
+    /**
+     * 活动定义ID
+     */
+    private Long campaignDefId;
+    /**
+     * 活动名称
+     */
+    private String campaignName;
+    /**
+     * 代理人用户代码
+     */
+    private String agentUserCode;
+    /**
+     * 是否显示驾意险
+     */
+    private String showJiaYiXian;
+    /**
+     * 是否投保驾意险
+     */
+    private String insureJiaYiFlag;
+    /**
+     * 车辆座位数
+     */
+    private String vehiclePassengerCap;
+    /**
+     * 驾意险座位数
+     */
+    private String jyxEnsureSeatNo;
+    /**
+     * 驾意险保费
+     */
+    private String jyxPremium;
+    /**
+     * 司机意外险标识
+     */
+    private String driverAccidentInsuranceFlag;
+    /**
+     * 司机意外险保额选项
+     */
+    private String driverAccidentInsuranceAmountOptions;
+    /**
+     * 是否自营驾意险
+     */
+    private String zhiYingJyx;
+    /**
+     * 是否为短期保单
+     */
+    private String isShortPolicy;
+    /**
+     * 是否支持单独销售
+     */
+    private String supportSingleSell;
+    /**
+     * 是否支持即时生效
+     */
+    private String isSupportInstant;
+    /**
+     * 产品模式
+     */
+    private String productMode;
+    /**
+     * 绑定保险
+     */
+    private String bindInsurance;
+    /**
+     * 组合标识(仅部分数据有)
+     */
+    private String combination;
+}

+ 29 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnLoanVehicle.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnLoanVehicle {
+    /**
+     * 即时生效日期
+     */
+    private Long instantEffectiveDate;
+    /**
+     * 是否显示日期选择器
+     */
+    private String isShowDTPicker;
+    /**
+     * 即时标识
+     */
+    private String instantFlag;
+    /**
+     * 生效日期
+     */
+    private String effectiveDate;
+    /**
+     * 交强险生效日期
+     */
+    private String comEffectiveDate;
+}

+ 35 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnNonAutoDocumentInfo.java

@@ -0,0 +1,35 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnNonAutoDocumentInfo extends UnknownFieldEntity {
+
+    /**
+     * 非车险名称
+     */
+    private String nonAutoName;
+
+    /**
+     * 非车险保单URL
+     */
+    private String nonAutoPolicyUrl;
+
+    /**
+     * 非车险保单文件名
+     */
+    private String nonAutoPolicyName;
+
+    /**
+     * 非车险发票URL
+     */
+    private String nonAutoInvoiceUrl;
+
+    /**
+     * 非车险发票文件名
+     */
+    private String nonAutoInvoiceName;
+}

+ 22 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPayment.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnPayment extends UnknownFieldEntity {
+    /**
+     * 支付金额
+     */
+    private String payAmount;
+    /**
+     * 净保费
+     */
+    private String netPremium;
+    /**
+     * 付款人姓名
+     */
+    private String payerName;
+}

+ 98 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicy.java

@@ -0,0 +1,98 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnPolicy extends UnknownFieldEntity {
+    /**
+     * 车辆保险DTO
+     */
+    private ZhongAnVehiclePolicyDTO vehiclePolicyDTO;
+
+    private ZhongAnVehicleDTO vehicleDTO;
+
+    /**
+     * 车主信息
+     */
+    private ZhongAnVehicleOwner vehicleOwner;
+
+    /**
+     * 投保人信息
+     */
+    private ZhongAnApplicant applicant;
+
+    /**
+     * 被保险人信息
+     */
+    private ZhongAnInsurant insurant;
+
+    /**
+     * 配送信息
+     */
+    private ZhongAnDistribution distribution;
+
+    /**
+     * 支付信息列表
+     */
+    private List<ZhongAnPayment> paymentList;
+
+    /**
+     * 保障列表
+     */
+    private List<ZhongAnCoverage> coverageList;
+
+    /**
+     * 承诺列表
+     */
+    private List<ZhongAnPromise> promiseList;
+
+    /**
+     * 电子投保签名链接
+     */
+    private String electricApplySignLink;
+
+    /**
+     * 属性信息
+     */
+    private ZhongAnProperties properties;
+
+    /**
+     * 平安综合投保标识
+     */
+    private String paComInsureFlag;
+
+    /**
+     * 平安投保标识
+     */
+    private String paInsureFlag;
+
+    /**
+     * 绿色投保报价
+     */
+    private String quoteGreenWay;
+
+    /**
+     * 贷款期限
+     */
+    private String loanTerm;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("vehiclePolicyDTO", vehiclePolicyDTO);
+        addChildUnknownField("vehicleDTO", vehicleDTO);
+        addChildUnknownField("vehicleOwner", vehicleOwner);
+        addChildUnknownField("applicant", applicant);
+        addChildUnknownField("insurant", insurant);
+        addChildUnknownField("distribution", distribution);
+        addChildUnknownField("paymentList", paymentList);
+        addChildUnknownField("coverageList", coverageList);
+        addChildUnknownField("promiseList", promiseList);
+        addChildUnknownField("properties", properties);
+    }
+}

+ 66 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicyDetail.java

@@ -0,0 +1,66 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+
+@Setter
+@Getter
+public class ZhongAnPolicyDetail extends UnknownFieldEntity {
+    /**
+     * 是否显示页脚
+     */
+    private String isYebShow;
+    /**
+     * 订单号
+     */
+    private String enOrderNo;
+    /**
+     * 车辆使用类型文本
+     */
+    @JsonProperty("VehicleUsageTypeText")
+    private String vehicleUsageTypeText;
+    /**
+     * 是否变更费用
+     */
+    private String isChangeFee;
+    /**
+     * 是否显示PDF
+     */
+    private String isPdfshow;
+    /**
+     * 支付方式名称
+     */
+    private String paymentWayTypeName;
+    /**
+     * 支付方式代码
+     */
+    private Integer paymentWayCode;
+    /**
+     * 是否显示VAT
+     */
+    private String isVATshow;
+    /**
+     * 车辆类型名称
+     */
+    private String vehicleTypeName;
+    /**
+     * 税种类型
+     */
+    private String taxType;
+    /**
+     * 保险策略
+     */
+    private ZhongAnPolicy policy;
+    /**
+     * 校验码
+     */
+    private String checkCode;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("policy", policy);
+    }
+}

+ 13 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPolicyGrade.java

@@ -0,0 +1,13 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnPolicyGrade {
+    /**
+     * PA等级
+     */
+    private String PA;
+}

+ 236 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPremiumTrial.java

@@ -0,0 +1,236 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnPremiumTrial extends UnknownFieldEntity {
+
+
+    /**
+     * 驾意险列表
+     */
+    private List<ZhongAnJyxInsure> jyxInsureList;
+
+    /**
+     * 税务支持类型
+     */
+    private String taxSupportType;
+
+    /**
+     * 保单等级
+     */
+    private ZhongAnPolicyGrade policyGrade;
+
+    /**
+     * 车辆所有权属性
+     */
+    private String ownershipAttribute;
+
+    /**
+     * 是否支持调整玻璃类型
+     */
+    private String isSupportAdjustGlassTypes;
+
+    /**
+     * 车辆电话
+     */
+    private String vehiclePhone;
+
+    /**
+     * 投保地
+     */
+    private String insurePlace;
+
+    /**
+     * 车型能源类型
+     */
+    private String modelEnergyType;
+
+    /**
+     * 商业险续保标识
+     */
+    private String bizRenewalFlag;
+
+    /**
+     * 车辆座位数
+     */
+    private String vehiclePassengerCap;
+
+    /**
+     * 投保地代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 商业险类目
+     */
+    private String syxClassid;
+
+    /**
+     * 车辆类型
+     */
+    private Integer vehicleType;
+
+    /**
+     * 车辆实际价格
+     */
+    private String vehicleActualPrice;
+
+    /**
+     * 是否为卡车或客车
+     */
+    private String truckAndBusFlag;
+
+    /**
+     * 是否显示比例切换
+     */
+    private String isShowRatioSwitch;
+
+    /**
+     * 代理人用户代码
+     */
+    private String agentUserCode;
+
+    /**
+     * 当前日期字符串(时间戳)
+     */
+    private Long currentDateStr;
+
+    /**
+     * 是否为进口车
+     */
+    private Boolean isImportCar;
+
+    /**
+     * 报价ID
+     */
+    private String quoteId;
+
+    /**
+     * 车辆保费信息
+     */
+    private ZhongAnVehiclePremium vehiclePremium;
+
+    /**
+     * 车辆注册日期
+     */
+    private String vehicleRegisterDate;
+
+    /**
+     * 贷款车辆信息
+     */
+    private ZhongAnLoanVehicle loanVehicleDTO;
+
+    /**
+     * 上次商业险到期日期
+     */
+    private String lastBizExpiryDate;
+
+    /**
+     * 是否过户车
+     */
+    private String transferFlag;
+
+    /**
+     * 商业险折扣
+     */
+    private String businessDiscount;
+
+    /**
+     * 车辆使用性质
+     */
+    private String vehicleUsageType;
+
+    /**
+     * 无赔款优待系数
+     */
+    private String noClaimAdjustRatio;
+
+    /**
+     * 最低损失金额
+     */
+    private String minDamageAmount;
+
+    /**
+     * 车辆型号描述
+     */
+    private String vehicleModelDesc;
+
+    /**
+     * 最高损失金额
+     */
+    private String maxDamageAmount;
+
+    /**
+     * 保单等级(PA)
+     */
+    private String policyGradePa;
+
+    /**
+     * 是否显示节假日覆盖
+     */
+    private String isShowHolidayCoverage;
+
+    /**
+     * 交通违法系数
+     */
+    private String trafficViolationRatio;
+
+    /**
+     * 车主姓名
+     */
+    private String vehicleOwnerName;
+
+    /**
+     * 身份证号码
+     */
+    private String identifyNo;
+
+    /**
+     * 投保标识
+     */
+    private Integer insureFlag;
+
+    /**
+     * 是否显示货物责任险覆盖
+     */
+    private String isShowGoodsDutyCoverage;
+
+    /**
+     * 自购价比例
+     */
+    private String selfPriceRatio;
+
+    /**
+     * 车牌号
+     */
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 是否新车
+     */
+    private String newVehicleFlag;
+
+    /**
+     * 存储的商业险保费
+     */
+    private String savedBusinessPremium;
+
+    /**
+     * 是否显示全险覆盖
+     */
+    private String isShowCompleteCoverage;
+
+    /**
+     * 是否显示节假日限额覆盖
+     */
+    private String isShowHolidayLimitCoverage;
+
+}
+
+

+ 24 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnPromise.java

@@ -0,0 +1,24 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnPromise extends UnknownFieldEntity {
+    /** 代码 */
+    private String code;
+    /** 承诺标识 */
+    private String promiseFlag;
+    /** 承诺类型 */
+    private String promiseType;
+    /** 业务类型 */
+    private String businessType;
+    /** 内容类型 */
+    private String contentType;
+    /** 内容 */
+    private String content;
+    /** 索引 */
+    private Integer index;
+}

+ 21 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnProperties.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnProperties extends UnknownFieldEntity {
+    /**
+     * 发票信息
+     */
+    @JsonProperty("invoice_info")
+    private String invoiceInfo;
+    /**
+     * 平安投保标识
+     */
+    @JsonProperty("pingan_insure_flag")
+    private String pinganInsureFlag;
+}

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

@@ -0,0 +1,84 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnQueryPolicy extends UnknownFieldEntity {
+    /**
+     * 报价ID
+     */
+    private String quoteId;
+
+    /**
+     * 创建时间
+     */
+    private String gmtCreated;
+
+    /**
+     * 车主姓名
+     */
+    private String vehicleOwner;
+
+    /**
+     * 车牌号
+     */
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 保险类型代码
+     */
+    private String insureTypeCode;
+
+    /**
+     * 车架号
+     */
+    private String vehicleFrameNo;
+
+    /**
+     * 生效日期
+     */
+    private String effectiveDate;
+
+    /**
+     * 到期日期
+     */
+    private String expiryDate;
+
+    /**
+     * 保费
+     */
+    private String premium;
+
+    /**
+     * 驾意险标志
+     */
+    private String insureJiaYiFlag;
+
+    /**
+     * 驾意险保费
+     */
+    private String jyxPremium;
+
+    /**
+     * 非车险保障
+     */
+    private String nonAutoCoverage;
+
+    /**
+     * 投保流程ID
+     */
+    private String insureFlowId;
+
+    /**
+     * 投保地代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 非车险名称
+     */
+    private String nonAutoName;
+}

+ 25 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnQueryPolicyList.java

@@ -0,0 +1,25 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnQueryPolicyList extends UnknownFieldEntity {
+    /** 代理控制标志 */
+    private String agentControlFlag;
+
+    /** 最大页数 */
+    private Integer maxPage;
+
+    /** 保单列表 */
+    private List<List<ZhongAnQueryPolicy>> policyLists;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("policyLists", policyLists);
+    }
+}

+ 59 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnTax.java

@@ -0,0 +1,59 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnTax extends UnknownFieldEntity {
+    /**
+     * 税保费
+     */
+    private String taxPremium;
+
+    /**
+     * 税种代码
+     */
+    private String taxCode;
+
+    /**
+     * 本年税
+     */
+    private String curYearTax;
+
+    /**
+     * 延迟支付金额
+     */
+    private String delayPayMoney;
+
+    /**
+     * 去年支付金额
+     */
+    private String lastYearPay;
+
+    /**
+     * 提示备注
+     */
+    private String promptRemark;
+
+    /**
+     * 纳税人ID
+     */
+    private String taxPayerId;
+
+    /**
+     * 手动税标志
+     */
+    private String manualTaxFlag;
+
+    /**
+     * 税开始日期
+     */
+    private String taxStartDate;
+
+    /**
+     * 税结束日期
+     */
+    private String taxEndDate;
+}

+ 51 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleCoverage.java

@@ -0,0 +1,51 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ZhongAnVehicleCoverage {
+    /**
+     * 附加险列表
+     */
+    private List<Object> additionalRiderList;
+    /**
+     * 产品ID
+     */
+    private Long productId;
+    /**
+     * 基础险种类型
+     */
+    private String baseRiderType;
+    /**
+     * 保费
+     */
+    private String premium;
+    /**
+     * 保额
+     */
+    private String amount;
+    /**
+     * 总覆盖保费
+     */
+    private String totalCoveragePremium;
+    /**
+     * 产品定义名称
+     */
+    private String productDefName;
+    /**
+     * 是否为不计免赔
+     */
+    private Integer isNonDeductible;
+    /**
+     * 基础险种ID(仅部分数据有)
+     */
+    private Long baseRiskId;
+    /**
+     * 责任属性值(仅部分数据有)
+     */
+    private String dutyAttributeValue;
+}

+ 353 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleDTO.java

@@ -0,0 +1,353 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnVehicleDTO extends UnknownFieldEntity {
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 车辆政策ID
+     */
+    private Long vehiclePolicyId;
+
+    /**
+     * 车牌号
+     */
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 发动机号
+     */
+    private String vehicleEngineNo;
+
+    /**
+     * 车架号
+     */
+    private String vehicleFrameNo;
+
+    /**
+     * 车辆品牌
+     */
+    private String vehicleBrand;
+
+    /**
+     * 车辆型号代码
+     */
+    private String vehicleModelCode;
+
+    /**
+     * 车辆型号名称
+     */
+    private String vehicleModelName;
+
+    /**
+     * 车辆用途类型
+     */
+    private String vehicleUsageType;
+
+    /**
+     * 使用属性
+     */
+    private String useAttribute;
+
+    /**
+     * 所有权属性
+     */
+    private String ownershipAttribute;
+
+    /**
+     * 车辆载客数
+     */
+    private Integer vehiclePassengerCap;
+
+    /**
+     * 车辆注册日期
+     */
+    private Long vehicleRegisterDate;
+
+    /**
+     * 车辆购置价格
+     */
+    private String vehicleAcquisitionPrice;
+
+    /**
+     * 车牌背景颜色
+     */
+    private String vehicleLicenceBackColor;
+
+    /**
+     * 车牌类型
+     */
+    private String vehicleLicenceType;
+
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+
+    /**
+     * 转让标志
+     */
+    private String transferFlag;
+
+    /**
+     * 整备质量
+     */
+    private String curbWeight;
+
+    /**
+     * 车型代码
+     */
+    private String modelsJy;
+
+    /**
+     * 排气量
+     */
+    private String exhaustMeasure;
+
+    /**
+     * 创建者
+     */
+    private String creator;
+
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+
+    /**
+     * 修改者
+     */
+    private String modifier;
+
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+
+    /**
+     * 是否删除
+     */
+    private String isDeleted;
+
+    /**
+     * 实际价格
+     */
+    private String actualPrice;
+
+    /**
+     * 新车标志
+     */
+    private String newVehicleFlag;
+
+    /**
+     * 是否进口车
+     */
+    private Boolean isImportCar;
+
+    /**
+     * 燃料类型
+     */
+    private String fuelType;
+
+    /**
+     * 额外信息
+     */
+    private String extraInfo;
+
+    /**
+     * 额外信息对象
+     */
+    private ZhongAnExtraInfoObj extraInfoObj;
+
+    /**
+     * 车辆家族代码
+     */
+    private String vehicleFamilyCode;
+
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+
+    /**
+     * 保单号
+     */
+    private String policyNo;
+
+    /**
+     * 第三方保单号
+     */
+    private String tpPolicyNo;
+
+    /**
+     * 转让车标志
+     */
+    private Boolean transferCarFlag;
+
+    /**
+     * 商业险类ID
+     */
+    private String syxClassid;
+
+    /**
+     * 车辆类别
+     */
+    private String vehicleClass;
+
+    /**
+     * 车型能源类型
+     */
+    private String modelEnergyType;
+
+    /**
+     * 车辆车龄
+     */
+    private Integer vehicleAge;
+
+    /**
+     * 车主姓名
+     */
+    private String vehicleOwnerName;
+
+    /**
+     * 身份证号
+     */
+    private String identifyNo;
+
+    /**
+     * 证件类型
+     */
+    private String identifyType;
+
+    /**
+     * 电话号码
+     */
+    private String phone;
+
+    /**
+     * 投保地代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 税种类型
+     */
+    private String taxType;
+
+
+    /** 额外信息对象 */
+    // private ExtraInfo extraInfoObj;
+
+    /**
+     * 车辆型号描述
+     */
+    private String vehicleModelDesc;
+
+
+    /**
+     * 车辆家族名称
+     */
+    private String vehicleFamilyName;
+
+    /**
+     * 车辆信息来源
+     */
+    private String vehicleInfoSource;
+
+    /**
+     * PA车辆类型
+     */
+    private String paVehicleType;
+
+    /**
+     * 活动ID
+     */
+    private Long campaignId;
+
+    /**
+     * 上限价格
+     */
+    private String upperLimit;
+
+    /**
+     * 下限价格
+     */
+    private String lowerLimit;
+
+    /**
+     * 第三方机构代码
+     */
+    private String thirdOrgCode;
+
+    /**
+     * 功率
+     */
+    private String power;
+
+    /**
+     * 进口车标志
+     */
+    private String jyImportCarFlag;
+
+    /**
+     * 车辆类型子类
+     */
+    private String vehicleTypeSubclass;
+
+
+    /**
+     * 注册日期(格式化)
+     */
+    private String registerDate;
+
+    /**
+     * 加密车架号
+     */
+    private String desVehicleFrameNo;
+
+    /**
+     * 加密发动机号
+     */
+    private String desVehicleEngineNo;
+
+    /**
+     * 加密证件号
+     */
+    private String desOcrCertiNo;
+
+    /**
+     * 加密身份证号
+     */
+    private String desIdNo;
+
+    /**
+     * 车辆来源
+     */
+    private String vehicleSource;
+
+    /** 前端车辆型号DTO */
+    private ZhongAnFrontVehicleModelDTO frontVehicleModelDTO;
+
+    /**
+     * 车辆型号列表
+     */
+    @JsonProperty("vehicleModelList")
+    private List<ZhongAnVehicleModel> vehicleModelList;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("frontVehicleModelDTO", frontVehicleModelDTO);
+        addChildUnknownField("vehicleModelList", vehicleModelList);
+    }
+}

+ 251 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleModel.java

@@ -0,0 +1,251 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnVehicleModel extends UnknownFieldEntity {
+    /**
+     * 车辆代码
+     */
+    private String vehicleCode;
+
+    /**
+     * 车辆名称
+     */
+    private String vehicleName;
+
+    /**
+     * 公司名称
+     */
+    private String companyName;
+
+    /**
+     * 公司代码
+     */
+    private String companyCode;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 品牌代码
+     */
+    private String brandCode;
+
+    /**
+     * 车系名称
+     */
+    private String familyName;
+
+    /**
+     * 车系代码
+     */
+    private String familyCode;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 车辆分类代码
+     */
+    private String vehicleClassCode;
+
+    /**
+     * 车辆分类
+     */
+    private String vehicleClass;
+
+    /**
+     * 车辆进口类型
+     */
+    private String vehicleImport;
+
+    /**
+     * 采购价格
+     */
+    private String purchasePrice;
+
+    /**
+     * 含税采购价格
+     */
+    private String purchasePriceTax;
+
+    /**
+     * 混合动力名称
+     */
+    private String vehicleHyName;
+
+    /**
+     * 混合动力代码
+     */
+    private String vehicleHyCode;
+
+    /**
+     * 配置名称
+     */
+    private String configName;
+
+    /**
+     * 车辆发布名称
+     */
+    private String vehiclePubName;
+
+    /**
+     * 年款
+     */
+    private String yearPattern;
+
+    /**
+     * 燃料类型
+     */
+    private String powerType;
+
+    /**
+     * 燃料类型代码
+     */
+    private String powerTypeCode;
+
+    /**
+     * 关联价格(元)
+     */
+    private Integer kindredPrice;
+
+    /**
+     * 关联含税价格(元)
+     */
+    private String kindredPriceTax;
+
+    /**
+     * 交强险类别ID
+     */
+    @JsonProperty("jqxClassid")
+    private String jqxClassid;
+
+    /**
+     * 交强险类别名称
+     */
+    private String jqxClassname;
+
+    /**
+     * 商业险类别ID
+     */
+    private String syxClassid;
+
+    /**
+     * 商业险类别名称
+     */
+    private String syxClassname;
+
+    /**
+     * 座位数
+     */
+    private String seat;
+
+    /**
+     * 总质量(kg)
+     */
+    private String fullWeight;
+
+    /**
+     * 总质量最大值(kg)
+     */
+    private Integer fullWeightMax;
+
+    /**
+     * 总质量最小值(kg)
+     */
+    private Integer fullWeightMin;
+
+    /**
+     * 排量(L)
+     */
+    private String displacement;
+
+    /**
+     * 上市日期(格式:YYYYMM)
+     */
+    private String marketDate;
+
+    /**
+     * 变速箱类型
+     */
+    private String gearBoxType;
+
+    /**
+     * 发动机描述
+     */
+    private String engineDesc;
+
+    /**
+     * 车辆重量(kg)
+     */
+    private String vehicleWeight;
+
+    /**
+     * 车组名称
+     */
+    private String groupName;
+
+    /**
+     * 车组代码
+     */
+    private String groupCode;
+
+    /**
+     * 停用标志(1-停用,0-启用)
+     */
+    private String stopFlag;
+
+    /**
+     * 环保代码
+     */
+    private String hfCode;
+
+    /**
+     * 环保名称
+     */
+    private String hfName;
+
+    /**
+     * 车辆发布代码
+     */
+    private String vehiclePubCode;
+
+    /**
+     * 功率(kW)
+     */
+    private String power;
+
+    /**
+     * 车辆尺寸(长*宽*高,单位:mm)
+     */
+    private String vehicleSize;
+
+    /**
+     * 车系简称
+     */
+    private String familyShortName;
+
+    /**
+     * 安全气囊数量
+     */
+    private String airBagNum;
+
+    /**
+     * 车辆混合C代码
+     */
+    private String vehicleHyCCode;
+
+    /**
+     * 最高车速(km/h)
+     */
+    private String topSpeed;
+}

+ 98 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehicleOwner.java

@@ -0,0 +1,98 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnVehicleOwner extends UnknownFieldEntity {
+    /**
+     * 车主ID
+     */
+    private Long id;
+    /**
+     * 核心用户ID
+     */
+    private Long coreUserId;
+    /**
+     * 车辆保单ID
+     */
+    private Long vehiclePolicyId;
+    /**
+     * 保单客户类型
+     */
+    private String policyCustomerType;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+    /**
+     * 证件号码
+     */
+    private String certificateNo;
+    /**
+     * 手机号
+     */
+    private String phoneNo;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 省份代码
+     */
+    private String province;
+    /**
+     * 城市代码
+     */
+    private String city;
+    /**
+     * 乡镇代码
+     */
+    private String town;
+    /**
+     * 街道
+     */
+    private String street;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 性别
+     */
+    private String sex;
+    /**
+     * 生日(时间戳)
+     */
+    private Long birthday;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 客户个人标识
+     */
+    private Boolean cusPersonFlg;
+    /**
+     * 人员类型
+     */
+    private String personnelType;
+    /**
+     * 验证结果
+     */
+    private String verifyResult;
+}

+ 310 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePolicyDTO.java

@@ -0,0 +1,310 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnVehiclePolicyDTO extends UnknownFieldEntity {
+    /**
+     * ID
+     */
+    private Long id;
+    /**
+     * 保险计划代码
+     */
+    private String insurePlanCode;
+    /**
+     * 会员用户ID
+     */
+    private String memberUserId;
+    /**
+     * 账户ID
+     */
+    private String accountId;
+    /**
+     * 保险单号
+     */
+    private String policyNo;
+    /**
+     * TP保险单号
+     */
+    private String tpPolicyNo;
+    /**
+     * 申请号
+     */
+    private String applyNo;
+    /**
+     * TP申请号
+     */
+    private String tpApplyNo;
+    /**
+     * 订单号
+     */
+    private String orderNo;
+    /**
+     * TP订单号
+     */
+    private String tpOrderNo;
+    /**
+     * 保险类型代码
+     */
+    private String insuranceTypeCode;
+    /**
+     * 活动定义ID
+     */
+    private Integer campaignDefId;
+    /**
+     * 套餐定义ID
+     */
+    private Integer packageDefId;
+    /**
+     * 保险类型
+     */
+    private String policyType;
+    /**
+     * 保险状态
+     *
+     * PAYMENTED_POLICY_INSURE:支付完成
+     */
+    private String policyStatus;
+    /**
+     * 保险状态文本
+     *
+     *
+     */
+    private String policyStatusText;
+    /**
+     * 车辆费用状态
+     */
+    private String vehicleFeeStatus;
+    /**
+     * 总保额
+     */
+    private String sumInsured;
+    /**
+     * 标准保费
+     */
+    private String standPremium;
+    /**
+     * 折扣
+     */
+    private String discount;
+    /**
+     * 保费
+     */
+    private String premium;
+    /**
+     * 无赔款优待系数
+     */
+    private String noClaimAdjustRatio;
+    /**
+     * 投保日期
+     */
+    private Long insureDate;
+    /**
+     * 签发日期
+     */
+    private Long issueDate;
+    /**
+     * 车辆费用日期
+     */
+    private Long vehicleFeeDate;
+    /**
+     * 接受日期
+     */
+    private Long acceptDate;
+    /**
+     * 平安接受日期
+     */
+    private Long pinganAcceptDate;
+    /**
+     * 生效日期
+     */
+    private Long effectiveDate;
+    /**
+     * 到期日期
+     */
+    private Long expiryDate;
+    /**
+     * 投保地点代码
+     */
+    private String insurePlaceCode;
+    /**
+     * 投保地点
+     */
+    private String insurePlace;
+    /**
+     * 共保类型
+     */
+    private Integer coinsType;
+    /**
+     * 共保比例
+     */
+    private Integer coinsurancePercentage;
+    /**
+     * 共保公司代码
+     */
+    private String coinsuranceCompanyCode;
+    /**
+     * 共保总保额
+     */
+    private String coinsSumInsured;
+    /**
+     * 共保保费
+     */
+    private String coinsPremium;
+    /**
+     * 共保标准保费
+     */
+    private String coinsStandPremium;
+    /**
+     * 创建者
+     */
+    private String creator;
+    /**
+     * 创建时间
+     */
+    private Long gmtCreated;
+    /**
+     * 修改者
+     */
+    private String modifier;
+    /**
+     * 修改时间
+     */
+    private Long gmtModified;
+    /**
+     * 是否已删除
+     */
+    private String isDeleted;
+    /**
+     * 报价ID
+     */
+    private Long quoteId;
+    /**
+     * 支付方式
+     */
+    private String paymentWay;
+    /**
+     * 子支付方式
+     */
+    private String subPaymentWay;
+    /**
+     * 投保标志
+     */
+    private Integer insureFlag;
+    /**
+     * 签名日期
+     */
+    private Long signDate;
+    /**
+     * 渠道源代码
+     */
+    private String channelSourceCode;
+    /**
+     * 渠道源名称
+     */
+    private String channelSourceName;
+    /**
+     * 销售产品代码
+     */
+    private String saleProductCode;
+    /**
+     * 销售产品名称
+     */
+    private String saleProductName;
+    /**
+     * 车辆保险额外信息
+     */
+    private ZhongAnVehiclePolicyExtraInfo vehiclePolicyExtraInfo;
+    /**
+     * 税信息
+     */
+    private ZhongAnTax tax;
+    /**
+     * 上一个计划代码
+     */
+    private Integer lastPlanCode;
+    /**
+     * PA组织代码
+     */
+    private String paOrgCode;
+    /**
+     * 平台组织代码
+     */
+    private String platformOgrCode;
+    /**
+     * utm来源
+     */
+    private String utmSource;
+    /**
+     * 无税共保保费
+     */
+    private String coinsNoTaxPremium;
+    /**
+     * 共保税额
+     */
+    private String coinsTaxAmount;
+    /**
+     * 无税保费
+     */
+    private String noTaxPremium;
+    /**
+     * 税额
+     */
+    private String taxAmount;
+    /**
+     * 合作伙伴ID
+     */
+    private Integer partnerId;
+    /**
+     * 合作伙伴名称
+     */
+    private String partnerName;
+    /**
+     * 原始共保保费
+     */
+    private String originalCoinsPremium;
+    /**
+     * 上一年度出险次数
+     */
+    private Integer busiLastClaimTimes;
+    /**
+     * 交通违规系数
+     */
+    private String trafficViolationRatio;
+    /**
+     * 产品来源
+     */
+    private String productSource;
+    /**
+     * 人员类型
+     */
+    private String personnelType;
+    /**
+     * 发票打印类型
+     */
+    private String invoicePrintType;
+    /**
+     * 第三方组织代码
+     */
+    private String thirdOrgCode;
+    /**
+     * 贷款期限
+     */
+    private String loanTerm;
+    /**
+     * 产品类型
+     */
+    private String productType;
+    /**
+     * 投保类型
+     */
+    private Integer insureType;
+    /**
+     * 自定价比例
+     */
+    private String selfPriceRatio;
+}

+ 446 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePolicyExtraInfo.java

@@ -0,0 +1,446 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnVehiclePolicyExtraInfo extends UnknownFieldEntity {
+    /**
+     * 额外用户ID
+     */
+    private String extraUserId;
+    /**
+     * 电话号码
+     */
+    private String phoneNo;
+    /**
+     * 银行订单号
+     */
+    private String bankOrderNo;
+    /**
+     * 业务号
+     */
+    private String businessNo;
+    /**
+     * 自取保单
+     */
+    private String getPolicyBySelf;
+    /**
+     * 系统代码
+     */
+    private String systemCode;
+    /**
+     * 产品来源
+     */
+    private String productSource;
+    /**
+     * 保险等级
+     */
+    private String policyGrade;
+    /**
+     * 签发代码
+     */
+    private String issueCode;
+    /**
+     * 即时标志
+     */
+    private String instantFlag;
+    /**
+     * 即时标志业务
+     */
+    private String instantFlagBusi;
+    /**
+     * 即时标志强制
+     */
+    private String instantFlagForce;
+    /**
+     * 贷款车辆标志
+     */
+    private String loanVehicleFlag;
+    /**
+     * 是否新车
+     */
+    private String isNewCar;
+    /**
+     * 第一受益人
+     */
+    private String firstBeneficiary;
+    /**
+     * 是否显示日期选择器
+     */
+    private String isShowDTPicker;
+    /**
+     * 业务显示日期选择器
+     */
+    private String bizShowDTPicker;
+    /**
+     * 强制显示日期选择器
+     */
+    private String forceShowDTPicker;
+    /**
+     * 默认生效日期
+     */
+    private String defaultEffectiveDate;
+    /**
+     * 业务最后保单号
+     */
+    private String bizLastPolicyNo;
+    /**
+     * 强制最后保单号
+     */
+    private String compelLastPolicyNo;
+    /**
+     * 渠道信息
+     */
+    private String channelInfo;
+    /**
+     * 支付时间
+     */
+    private String payTime;
+    /**
+     * TP序列号
+     */
+    private String tpSerialNo;
+    /**
+     * 最大赔付金额
+     */
+    private String maxClaimAmount;
+    /**
+     * 圈存支付号
+     */
+    private String circPaymentNo;
+    /**
+     * 支付方式
+     */
+    private String paymentWay;
+    /**
+     * 实际支付金额
+     */
+    private String actualPayAmount;
+    /**
+     * 是否代扣标志
+     */
+    private String isWithholdingFlag;
+    /**
+     * 代扣成功回退日期
+     */
+    private String withholdingSuccessBackDate;
+    /**
+     * 贷款车特殊承诺前部分
+     */
+    private String loanCarSpecialPromisePrePart;
+    /**
+     * 贷款车特殊承诺后部分
+     */
+    private String loanCarSpecialPromisePostPart;
+    /**
+     * 贷款车机构
+     */
+    private String loanCarOrg;
+    /**
+     * 贷款车子机构
+     */
+    private String loanCarSubOrg;
+    /**
+     * 是否需要分配
+     */
+    private String needDistribution;
+    /**
+     * 阅读确认时间
+     */
+    private String readConfirmTime;
+    /**
+     * 短信发送时间
+     */
+    private String smsSendTime;
+    /**
+     * 是否电子投保
+     */
+    private String isElectronicApply;
+    /**
+     * 电子投保短地址
+     */
+    private String electronicApplyShortAddr;
+    /**
+     * 签发代码回退时间
+     */
+    private String issueCodeBackTime;
+    /**
+     * 短链接
+     */
+    private String shortLink;
+    /**
+     * 申请有效期
+     */
+    private String applyValidDate;
+    /**
+     * 查询请求代码
+     */
+    private String queryRequestCode;
+    /**
+     * 电子投保保单标志
+     */
+    private String electricApplyPolicyFlag;
+    /**
+     * 新信用标志
+     */
+    private String newCreditFlag;
+    /**
+     * 特殊贷款ID
+     */
+    private String specialLoanId;
+    /**
+     * 是否线下支付
+     */
+    private String isOffLinePay;
+    /**
+     * 第三方机构代码
+     */
+    private String thirdOrgCode;
+    /**
+     * 第三方机构名称
+     */
+    private String thirdOrgName;
+    /**
+     * 输入者
+     */
+    private String inputBy;
+    /**
+     * 人员预付假标志
+     */
+    private String personAdvancePaymentFalseFlag;
+    /**
+     * 绿色通道状态
+     */
+    private String greenWayStatus;
+    /**
+     * 投保加意标志
+     */
+    private String insureJiaYiFlag;
+    /**
+     * 嘉益保费
+     */
+    private String jyxPremium;
+    /**
+     * 申请签名阶段标志
+     */
+    private String applySignStageFlag;
+    /**
+     * 材料阶段标志
+     */
+    private String materialsStageFlag;
+    /**
+     * QMX标志
+     */
+    private String qmxFlag;
+    /**
+     * 是否通过
+     */
+    private String isPassed;
+    /**
+     * 签发费用
+     */
+    private String issueFee;
+    /**
+     * 是否支持公司银联支付
+     */
+    private String isSupportUnionPayForCompany;
+    /**
+     * 申请人人员类型
+     */
+    private String applicantPersonnelType;
+    /**
+     * 报价标志
+     */
+    private String quotationFlag;
+    /**
+     * 预留保单号
+     */
+    private String reservedPolicyNo;
+    /**
+     * 部门代码
+     */
+    private String departmentCode;
+    /**
+     * 业务保单号
+     */
+    private String bizPolicyNo;
+    /**
+     * 销售代理代码
+     */
+    private String saleAgentCode;
+    /**
+     * SBT保单回填
+     */
+    private String sbtPolicyBackfill;
+    /**
+     * 无分配
+     */
+    private String noDistribution;
+    /**
+     * 绿色通道时间
+     */
+    private String greenWayTime;
+    /**
+     * 申请人使用属性
+     */
+    private String applicantUseAttribute;
+    /**
+     * 顶级合作伙伴代码
+     */
+    private String topPartnerCode;
+    /**
+     * 二级合作伙伴代码
+     */
+    private String secondPartnerCode;
+    /**
+     * 三级合作伙伴代码
+     */
+    private String thirdPartnerCode;
+    /**
+     * 四级合作伙伴代码
+     */
+    private String forthPartnerCode;
+    /**
+     * 合作伙伴代理代码
+     */
+    private String partnerAgentCode;
+    /**
+     * 代理扩展方式标签
+     */
+    private String agentExpandWayLabel;
+    /**
+     * 代理业务类型标签
+     */
+    private String agentBizTypeLabel;
+    /**
+     * 代理标志
+     */
+    private String agentFlag;
+    /**
+     * 业务电子保单
+     */
+    private String bizElectronicPolicy;
+    /**
+     * 强制电子保单
+     */
+    private String compelElectronicPolicy;
+    /**
+     * 上一年度城市
+     */
+    private String lastYearCity;
+    /**
+     * 上一年度城市代码
+     */
+    private String lastYearCityCode;
+    /**
+     * 车头车牌号
+     */
+    private String headStockLicencePlateNo;
+    /**
+     * 用户设备号
+     */
+    private String userDeviceNo;
+    /**
+     * 用户IP
+     */
+    private String userIp;
+    /**
+     * 用户电话号码
+     */
+    private String userPhoneNo;
+    /**
+     * 文档名称
+     */
+    private String documentationName;
+    /**
+     * 强制查询请求代码
+     */
+    private String forceQueryRequestCode;
+    /**
+     * 分期支付
+     */
+    private String splitPay;
+    /**
+     * 签名流请求
+     */
+    private String signFlowReq;
+    /**
+     * 支付类型
+     */
+    private String paymentType;
+    /**
+     * 是否已支付
+     */
+    private String isAlreadyPay;
+    /**
+     * 团队车辆材料标志
+     */
+    private String teamVehicleMaterialsFlag;
+    /**
+     * 强制申请结束日期
+     */
+    private String forceApplyEndDate;
+    /**
+     * 强制保单号
+     */
+    private String forcePolicyNo;
+    /**
+     * 资金比例
+     */
+    private String fundRatio;
+    /**
+     * 资金金额
+     */
+    private String fundAmount;
+    /**
+     * 应计标志
+     */
+    private String accrualFlag;
+    /**
+     * ZA强制
+     */
+    private String zaCompel;
+    /**
+     * 其它
+     */
+    private Object others;
+    /**
+     * 能源特殊处理
+     */
+    private String energySpecialHandling;
+    /**
+     * 搬迁强制标志
+     */
+    private String relocationCompelFlag;
+    /**
+     * 搬迁强制地点
+     */
+    private String relocationCompelPlace;
+    /**
+     * 强制原始地点
+     */
+    private String compelOrignPlace;
+    /**
+     * 约定地点代码
+     */
+    private String appointPlaceCode;
+    /**
+     * 自动代理投保类型
+     */
+    private String autoAgentInsureType;
+    /**
+     * 被保险人使用属性
+     */
+    private String insurantUseAttribute;
+    /**
+     * 订单编号
+     */
+    private String orderNumber;
+    /**
+     * BJS风险类型
+     */
+    private String bjsRiskType;
+}

+ 75 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/entity/ZhongAnVehiclePremium.java

@@ -0,0 +1,75 @@
+package com.jzg.quotation.zhongan.crawler.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ZhongAnVehiclePremium {
+    /**
+     * 是否投保商业险
+     */
+    private String isInsureBusinessInsurance;
+    /**
+     * 是否投保交强险
+     */
+    private String isInsureCompelInsurance;
+    /**
+     * 商业险生效日期
+     */
+    private Long businessInsEffectiveDate;
+    /**
+     * 商业险到期日期
+     */
+    private Long businessExpireDate;
+    /**
+     * 交强险生效日期
+     */
+    private Long compelInsEffectiveDate;
+    /**
+     * 商业险总保费
+     */
+    private String bizTotalPremium;
+    /**
+     * 交强险总保费
+     */
+    private String compelTotalPremium;
+    /**
+     * 总保费
+     */
+    private String totalPremium;
+    /**
+     * 交强险保费
+     */
+    private String compelPremium;
+    /**
+     * 车船税保费
+     */
+    private String taxPremium;
+    /**
+     * 税码
+     */
+    private String taxCode;
+    /**
+     * 车辆覆盖险种列表
+     */
+    private List<ZhongAnVehicleCoverage> vehicleCoverageList;
+    /**
+     * 车船税生效日期
+     */
+    private String taxEffectiveDate;
+    /**
+     * 车船税到期日期
+     */
+    private String taxExpiryDate;
+    /**
+     * 是否缴纳车船税
+     */
+    private String isPayTax;
+    /**
+     * 非总保费
+     */
+    private String nonTotalPremium;
+}

+ 291 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnCacheCarInfoParam.java

@@ -0,0 +1,291 @@
+package com.jzg.quotation.zhongan.crawler.model.param;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnCacheCarInfoParam extends UnknownFieldEntity {
+
+    /**
+     * 投保地区代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 投保地区
+     */
+    private String insurePlace;
+
+    /**
+     * 三级机构代码
+     */
+    private String thirdOrgCode;
+
+    /**
+     * 车牌号
+     */
+    private String vehicleLicencePlateNo;
+
+    /**
+     * 车架号
+     */
+    private String vehicleFrameNo;
+
+    /**
+     * 发动机号
+     */
+    private String vehicleEngineNo;
+
+    /**
+     * 车辆注册日期
+     */
+    private String vehicleRegisterDate;
+
+    /**
+     * 车辆类别
+     */
+    private String vehicleClass;
+
+    /**
+     * 车辆子类别
+     */
+    private String vehicleTypeSubclass;
+
+    /**
+     * 车辆类型代码
+     */
+    private String paVehicleType;
+
+    /**
+     * 车主姓名
+     */
+    private String vehicleOwnerName;
+
+    /**
+     * 证件类型
+     */
+    private String identifyType;
+
+    /**
+     * 证件号码
+     */
+    private String identifyNo;
+
+    /**
+     * 销售公司名称
+     */
+    private String saleCompanyName;
+
+    /**
+     * 是否4S店销售标志
+     */
+    private String sale4SFlag;
+
+    /**
+     * 销售公司地区代码
+     */
+    private String saleCompanyAreaCode;
+
+    /**
+     * 联系电话
+     */
+    private String phone;
+
+    /**
+     * 投保人姓名
+     */
+    private String applicantName;
+
+    /**
+     * 投保人电话
+     */
+    private String applicantPhone;
+
+    /**
+     * 投保人证件号码
+     */
+    private String applicantCertificateNo;
+
+    /**
+     * 加密车架号
+     */
+    private String desVehicleFrameNo;
+
+    /**
+     * 加密发动机号
+     */
+    private String desVehicleEngineNo;
+
+    /**
+     * 车型名称
+     */
+    private String modelName;
+
+    /**
+     * 品牌代码
+     */
+    private String brandCode;
+
+    /**
+     * 车辆名称
+     */
+    private String vehicleName;
+
+    /**
+     * 车辆品牌
+     */
+    private String vehicleBrand;
+
+    /**
+     * 车辆型号描述
+     */
+    private String vehicleModelDesc;
+
+    /**
+     * 车辆型号名称
+     */
+    private String vehicleModelName;
+
+    /**
+     * 车辆型号代码
+     */
+    private String vehicleModelCode;
+
+    /**
+     * 精友车型代码
+     */
+    private String modelsJy;
+
+    /**
+     * 核定载客
+     */
+    private String vehicleCap;
+
+    /**
+     * 整备质量
+     */
+    private String curbWeight;
+
+    /**
+     * 排量
+     */
+    private String exhaustMeasure;
+
+    /**
+     * 功率
+     */
+    private String power;
+
+    /**
+     * 生产商
+     */
+    private String creator;
+
+    /**
+     * 车辆购置价格
+     */
+    private String vehicleAcquisitionPrice;
+
+    /**
+     * 座位数
+     */
+    private String vehiclePassengerCap;
+
+    /**
+     * 变速箱类型
+     */
+    private String gearBoxType;
+
+    /**
+     * 配置名称
+     */
+    private String configName;
+
+    /**
+     * 税种类型
+     */
+    private String taxType;
+
+    /**
+     * 使用性质代码
+     */
+    private String syxClassid;
+
+    /**
+     * 车辆种类
+     */
+    private String vehicleType;
+
+    /**
+     * 能源类型
+     */
+    private String modelEnergyType;
+
+    /**
+     * 燃料类型
+     */
+    private String fuelType;
+
+    /**
+     * 加密车主姓名
+     */
+    private String desVehicleOwnerName;
+
+    /**
+     * 投保人类型
+     */
+    private String applicantType;
+
+    /**
+     * 投保人使用性质
+     */
+    private String applicantUseAttribute;
+
+    /**
+     * 使用性质
+     */
+    private String useAttribute;
+
+    /**
+     * 车辆所有权属性
+     */
+    private String subOwnershipAttribute;
+
+    /**
+     * 所有权属性
+     */
+    private String ownershipAttribute;
+
+    /**
+     * 号牌种类
+     */
+    private String vehicleLicenceType;
+
+    /**
+     * 是否调用车型库标志
+     */
+    private String callVehicleModelLibraryFlag;
+
+    /**
+     * 流程ID
+     */
+    private String flowId;
+
+    /**
+     * 页面
+     */
+    private String page;
+
+    /**
+     * 参数i
+     */
+    private String i;
+
+    /**
+     * 标志
+     */
+    private String flag;
+
+}

+ 21 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnPremiumTrialParamCoverageInfo.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.zhongan.crawler.model.param;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnPremiumTrialParamCoverageInfo extends UnknownFieldEntity {
+    /** 产品ID */
+    private String productId;
+
+    /** 金额 */
+    private String amount;
+
+    /** 责任属性类型 */
+    private String dutyAttributeType;
+
+    /** 责任属性值 */
+    private String dutyAttributeValue;
+}

+ 18 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnPremiumTrialParamNonAutoInfo.java

@@ -0,0 +1,18 @@
+package com.jzg.quotation.zhongan.crawler.model.param;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnPremiumTrialParamNonAutoInfo extends UnknownFieldEntity {
+    /** 产品代码 */
+    private String productCode;
+
+    /** 被保险人标志,1表示是,0表示否 */
+    private String insuredFlag;
+
+    /** 组合标识 */
+    private String combination;
+}

+ 11 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnQueryDocumentInfoParam.java

@@ -0,0 +1,11 @@
+package com.jzg.quotation.zhongan.crawler.model.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnQueryDocumentInfoParam {
+
+    private String orderNo;
+}

+ 10 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/param/ZhongAnQueryJyytVehicleModelParam.java

@@ -0,0 +1,10 @@
+package com.jzg.quotation.zhongan.crawler.model.param;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnQueryJyytVehicleModelParam extends UnknownFieldEntity {
+}

+ 14 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheCarInfoResult.java

@@ -0,0 +1,14 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnCacheCarInfoResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnCacheCarInfoResult, Object> {
+    }
+
+}

+ 59 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheInputQueryParam.java

@@ -0,0 +1,59 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnCacheInputQueryParam extends UnknownFieldEntity {
+    /**
+     * 投保地点
+     */
+    private String insurePlace;
+
+    /**
+     * 投保地点代码
+     */
+    private String insurePlaceCode;
+
+    /**
+     * 第三方机构代码(可能为空)
+     */
+    private String thirdOrgCode;
+
+    /**
+     * 车辆牌照号
+     */
+    private String licenseNo;
+
+    /**
+     * 分支机构代码(可能为空)
+     */
+    private String branchCode;
+
+    /**
+     * 是否开启续保标志(0-否,1-是,此处为0)
+     */
+    private String isOpenRenewalFlag;
+
+    /**
+     * 流程ID
+     */
+    private String flowId;
+
+    /**
+     * 页面路径
+     */
+    private String page;
+
+    /**
+     * 未知参数 i 的值
+     */
+    private String i;
+
+    /**
+     * 标志位(此处为0)
+     */
+    private String flag;
+}

+ 13 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnCacheInputQueryResult.java

@@ -0,0 +1,13 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnCacheInputQueryResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnCacheInputQueryResult, Object> {
+    }
+}

+ 21 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnPremiumTrialResult.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnPremiumTrial;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnPremiumTrialResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnPremiumTrialResult, Object> {
+    }
+
+    private ZhongAnPremiumTrial datas;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("datas", datas);
+    }
+}

+ 23 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryCarInfoResult.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnCacheCarInfo;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnQueryPolicyList;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnQueryCarInfoResult extends UnknownFieldEntity {
+
+    public static class Response extends ZhongAnResponse2<ZhongAnQueryCarInfoResult, Object> {
+    }
+
+    private ZhongAnCacheCarInfo datas;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("datas", datas);
+    }
+}

+ 40 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryDocumentInfoResult.java

@@ -0,0 +1,40 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnBizDocumentInfo;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnCompelDocumentInfo;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnNonAutoDocumentInfo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+public class ZhongAnQueryDocumentInfoResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnQueryDocumentInfoResult, Object> {
+    }
+
+    /**
+     * 商业险文档信息
+     */
+    private List<ZhongAnBizDocumentInfo> bizDocumentInfo;
+
+    /**
+     * 交强险文档信息
+     */
+    private List<ZhongAnCompelDocumentInfo> compelDocumentInfo;
+
+    /**
+     * 非车险文档信息
+     */
+    private List<ZhongAnNonAutoDocumentInfo> nonAutoDocumentInfo;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("bizDocumentInfo", bizDocumentInfo);
+        addChildUnknownField("compelDocumentInfo", compelDocumentInfo);
+        addChildUnknownField("nonAutoDocumentInfo", nonAutoDocumentInfo);
+    }
+}

+ 48 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryJyytVehicleModelResult.java

@@ -0,0 +1,48 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnVehicleModel;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class ZhongAnQueryJyytVehicleModelResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnQueryJyytVehicleModelResult, Object> {
+    }
+
+    private Data datas;
+
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("datas", datas);
+    }
+
+
+
+
+
+    @Setter
+    @Getter
+    public static class Data extends UnknownFieldEntity {
+        /**
+         * 最低价格车辆信息
+         */
+        private ZhongAnVehicleModel minPriceVehicle;
+
+        /**
+         * 车辆型号列表
+         */
+        private List<ZhongAnVehicleModel> vehicleModelList;
+
+        @Override
+        protected void addChildUnknownFields() {
+            addChildUnknownField("minPriceVehicle", minPriceVehicle);
+            addChildUnknownField("vehicleModelList", vehicleModelList);
+        }
+    }
+}

+ 21 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyDetailResult.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnPolicyDetail;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ZhongAnQueryPolicyDetailResult extends UnknownFieldEntity {
+    public static class Response extends ZhongAnResponse2<ZhongAnQueryPolicyDetailResult, Object> {
+    }
+
+    private ZhongAnPolicyDetail datas;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("datas", datas);
+    }
+}

+ 22 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyListResult.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.commons.utils.UnknownFieldEntity;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnResponse2;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnQueryPolicyList;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class ZhongAnQueryPolicyListResult extends UnknownFieldEntity {
+
+    public static class Response extends ZhongAnResponse2<ZhongAnQueryPolicyListResult, Object> {
+    }
+
+    private ZhongAnQueryPolicyList datas;
+
+    @Override
+    protected void addChildUnknownFields() {
+        addChildUnknownField("datas", datas);
+    }
+}

+ 309 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIService.java

@@ -0,0 +1,309 @@
+package com.jzg.quotation.zhongan.crawler.service;
+
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.zhongan.crawler.JsonUtil;
+import com.jzg.quotation.zhongan.crawler.client.ZhongAnAPI;
+import com.jzg.quotation.zhongan.crawler.model.param.ZhongAnCacheCarInfoParam;
+import com.jzg.quotation.zhongan.crawler.model.param.ZhongAnPremiumTrialParamCoverageInfo;
+import com.jzg.quotation.zhongan.crawler.model.param.ZhongAnPremiumTrialParamNonAutoInfo;
+import com.jzg.quotation.zhongan.crawler.model.result.*;
+import jakarta.annotation.Resource;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import java.util.List;
+
+@Service
+public class ZhongAnAPIService {
+    @Resource
+    private RequestComponent requestComponent;
+
+    public void setRequestComponent(RequestComponent requestComponent) {
+        this.requestComponent = requestComponent;
+    }
+
+    private <T> T post(ZhongAnAPI api, Object body, Class<T> resultClass, HttpHeaders headers) {
+        String paramString = JsonUtil.toJsonString(body);
+
+        ResponseEntity<String> responseEntity = requestComponent.post(api.url(), paramString, String.class, headers);
+
+        String responseEntityBody = responseEntity.getBody();
+
+        T objcet = JsonUtil.readObjcet(responseEntityBody, resultClass);
+
+        return objcet;
+    }
+
+    private <T> T form(ZhongAnAPI api, MultiValueMap<String, String> formData, Class<T> resultClass, HttpHeaders headers) {
+        ResponseEntity<String> responseEntity = requestComponent.form(api.url(), formData, String.class, headers);
+
+        String responseEntityBody = responseEntity.getBody();
+
+        T objcet = JsonUtil.readObjcet(responseEntityBody, resultClass);
+
+        return objcet;
+    }
+
+
+    /**
+     * 查询保单地址
+     * @return
+     */
+    public ZhongAnQueryCarInfoResult queryCarInfo(String token, String flowId) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("flowId", flowId);
+        param.set("vehicleFrameNo", "");
+        param.set("passCheck", "");
+        param.set("page", "%2FbaseInfo");
+        param.set("i", "e");
+        param.set("flag", "0");
+
+        ZhongAnQueryCarInfoResult.Response response = form(ZhongAnAPI.QueryCarInfo, param, ZhongAnQueryCarInfoResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    /**
+     * 车型查询
+     *
+     * @param token
+     * @param flowId
+     * @param vehicleFrameNo
+     * @return
+     */
+    public ZhongAnQueryJyytVehicleModelResult queryJyytVehicleModel(String token, String flowId, String vehicleFrameNo) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("flowId", flowId);
+        param.set("vehicleFrameNo", vehicleFrameNo);
+        param.set("callVehicleModelLibraryFlag", "0");
+        param.set("vehicleType", "");
+        param.set("page", "/baseInfo");
+        param.set("i", "e");
+        param.set("flag", "0");
+
+        ZhongAnQueryJyytVehicleModelResult.Response response = form(ZhongAnAPI.QueryJyytVehicleModel, param, ZhongAnQueryJyytVehicleModelResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+
+    /**
+     * 查询保单地址
+     * @return
+     */
+    public ZhongAnQueryDocumentInfoResult queryDocumentInfo(String token, String orderNo) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("orderNo", orderNo);
+
+        ZhongAnQueryDocumentInfoResult.Response response = form(ZhongAnAPI.QueryDocumentInfo, param, ZhongAnQueryDocumentInfoResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    public ZhongAnQueryPolicyDetailResult queryPolicyDetail(String token, String policyId) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("policyId", policyId);
+        param.set("appSource", "h5");
+//        param.set("page", "%2FpolicyDetail");
+//        param.set("flag", "0");
+
+        ZhongAnQueryPolicyDetailResult.Response response = form(ZhongAnAPI.QueryPolicyDetail, param, ZhongAnQueryPolicyDetailResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    /**
+     * 查询保单列表
+     *
+     * @param token
+     * @param flowId
+     * @param status 4:待处理。 2:待支付。 1:已支付
+     * @param chepaihao
+     * @return
+     */
+    public ZhongAnQueryPolicyListResult queryPolicyList(String token, String flowId, String status, String chepaihao) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("flowId", flowId);
+        param.set("pageIndex", "1");
+        param.set("queryType", "1");
+        param.set("page", "%2Forder%2FmyOrders");
+        param.set("i", " e");
+        param.set("flag", "0");
+        param.set("queryConditon", chepaihao);
+        param.set("status", status);
+
+        ZhongAnQueryPolicyListResult.Response response = form(ZhongAnAPI.QueryPolicyList, param, ZhongAnQueryPolicyListResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    /**
+     * 报价
+     * @param token
+     * @param flowId
+     * @param coverageInfo
+     * @param nonAutoInfo
+     * @return
+     */
+    public ZhongAnPremiumTrialResult premiumTrial(String token, String flowId, List<ZhongAnPremiumTrialParamCoverageInfo> coverageInfo, List<ZhongAnPremiumTrialParamNonAutoInfo>  nonAutoInfo) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.set("flowId", flowId);
+        param.set("page", "/insureProgram");
+        param.set("i", " e");
+        param.set("flag", "0");
+
+        if (coverageInfo != null && coverageInfo.size() > 0) {
+            String jsonString = JsonUtil.toJsonString(coverageInfo);
+            param.set("coverageInfo", jsonString);
+            param.set("addBusi", "1");
+        }
+
+        param.set("addCompel", "0");
+        param.set("addTax", "0");
+        param.set("isTrusted", "true");
+        param.set("effectiveDate", "2025-05-15");
+
+        if (nonAutoInfo != null && nonAutoInfo.size() > 0) {
+            String jsonString = JsonUtil.toJsonString(nonAutoInfo);
+            param.set("nonAutoInfo", jsonString);
+        }
+
+        ZhongAnPremiumTrialResult.Response response = form(ZhongAnAPI.PremiumTrial, param, ZhongAnPremiumTrialResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    /**
+     * 发起创建保险单
+     *
+     * @param token
+     * @param flowId
+     * @param zhongAnCacheInputQueryParam
+     * @return
+     */
+    public ZhongAnCacheInputQueryResult cacheInputQuery(String token, String flowId, ZhongAnCacheInputQueryParam zhongAnCacheInputQueryParam) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.add("insurePlaceCode", zhongAnCacheInputQueryParam.getInsurePlaceCode());
+        param.add("insurePlace", zhongAnCacheInputQueryParam.getInsurePlace());
+        param.add("thirdOrgCode", zhongAnCacheInputQueryParam.getThirdOrgCode());
+        param.add("licenseNo", zhongAnCacheInputQueryParam.getLicenseNo());
+        param.add("branchCode", zhongAnCacheInputQueryParam.getBranchCode());
+        param.add("isOpenRenewalFlag", zhongAnCacheInputQueryParam.getIsOpenRenewalFlag());
+        param.add("flowId", flowId);
+        param.add("page", "%2FinsureEntry");
+        param.add("i", "e");
+        param.add("flag", "0");
+
+        ZhongAnCacheInputQueryResult.Response response = form(ZhongAnAPI.CacheInputQuery, param, ZhongAnCacheInputQueryResult.Response.class, headers);
+
+        return response.getValue();
+    }
+
+    /**
+     * 将保单数据缓存起来
+     *
+     * 使用注意:此接口可能不支持并发!
+     *    目前观察到的一次登录会话中, cacheCarInfo 保存的数据是全局共享的,不具备数据隔离性:
+     *    1、会被后续的报价接口 {@link #premiumTrial}、 {@link #queryCarInfo} 使用到。
+     *    2、如果同时对多个车信息保存并报价,最后一次保存的车数据会将之前的其它车的数据覆盖,最终导致 premiumTrial 只会对最后一个车进行报价。
+     *    3、也可能与 flowId 有关系,可以测试一下 flowId 不一样的情况
+     *
+     * @param token
+     * @param zhongAnCacheCarInfoParam
+     * @return
+     */
+    public ZhongAnCacheCarInfoResult cacheCarInfo(String token, ZhongAnCacheCarInfoParam zhongAnCacheCarInfoParam) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Cookie", token);
+
+        MultiValueMap<String, String> param  = new LinkedMultiValueMap<>();
+        param.add("insurePlaceCode", zhongAnCacheCarInfoParam.getInsurePlaceCode());
+        param.add("insurePlace", zhongAnCacheCarInfoParam.getInsurePlace());
+        param.add("thirdOrgCode", zhongAnCacheCarInfoParam.getThirdOrgCode());
+        param.add("vehicleLicencePlateNo", zhongAnCacheCarInfoParam.getVehicleLicencePlateNo());
+        param.add("vehicleFrameNo", zhongAnCacheCarInfoParam.getVehicleFrameNo());
+        param.add("vehicleEngineNo", zhongAnCacheCarInfoParam.getVehicleEngineNo());
+        param.add("vehicleRegisterDate", zhongAnCacheCarInfoParam.getVehicleRegisterDate());
+        param.add("vehicleClass", zhongAnCacheCarInfoParam.getVehicleClass());
+        param.add("vehicleTypeSubclass", zhongAnCacheCarInfoParam.getVehicleTypeSubclass());
+        param.add("paVehicleType", zhongAnCacheCarInfoParam.getPaVehicleType());
+        param.add("vehicleOwnerName", zhongAnCacheCarInfoParam.getVehicleOwnerName());
+        param.add("identifyType", zhongAnCacheCarInfoParam.getIdentifyType());
+        param.add("identifyNo", zhongAnCacheCarInfoParam.getIdentifyNo());
+        param.add("saleCompanyName", zhongAnCacheCarInfoParam.getSaleCompanyName());
+        param.add("sale4SFlag", zhongAnCacheCarInfoParam.getSale4SFlag());
+        param.add("saleCompanyAreaCode", zhongAnCacheCarInfoParam.getSaleCompanyAreaCode());
+        param.add("phone", zhongAnCacheCarInfoParam.getPhone());
+        param.add("applicantName", zhongAnCacheCarInfoParam.getApplicantName());
+        param.add("applicantPhone", zhongAnCacheCarInfoParam.getApplicantPhone());
+        param.add("applicantCertificateNo", zhongAnCacheCarInfoParam.getApplicantCertificateNo());
+        param.add("desVehicleFrameNo", zhongAnCacheCarInfoParam.getDesVehicleFrameNo());
+        param.add("desVehicleEngineNo", zhongAnCacheCarInfoParam.getDesVehicleEngineNo());
+        param.add("modelName", zhongAnCacheCarInfoParam.getModelName());
+        param.add("brandCode", zhongAnCacheCarInfoParam.getBrandCode());
+        param.add("vehicleName", zhongAnCacheCarInfoParam.getVehicleName());
+        param.add("vehicleBrand", zhongAnCacheCarInfoParam.getVehicleBrand());
+        param.add("vehicleModelDesc", zhongAnCacheCarInfoParam.getVehicleModelDesc());
+        param.add("vehicleModelName", zhongAnCacheCarInfoParam.getVehicleModelName());
+        param.add("vehicleModelCode", zhongAnCacheCarInfoParam.getVehicleModelCode());
+        param.add("modelsJy", zhongAnCacheCarInfoParam.getModelsJy());
+        param.add("vehicleCap", zhongAnCacheCarInfoParam.getVehicleCap());
+        param.add("curbWeight", zhongAnCacheCarInfoParam.getCurbWeight());
+        param.add("exhaustMeasure", zhongAnCacheCarInfoParam.getExhaustMeasure());
+        param.add("power", zhongAnCacheCarInfoParam.getPower());
+        param.add("creator", zhongAnCacheCarInfoParam.getCreator());
+        param.add("vehicleAcquisitionPrice", zhongAnCacheCarInfoParam.getVehicleAcquisitionPrice());
+        param.add("vehiclePassengerCap", zhongAnCacheCarInfoParam.getVehiclePassengerCap());
+        param.add("gearBoxType", zhongAnCacheCarInfoParam.getGearBoxType());
+        param.add("configName", zhongAnCacheCarInfoParam.getConfigName());
+        param.add("taxType", zhongAnCacheCarInfoParam.getTaxType());
+        param.add("syxClassid", zhongAnCacheCarInfoParam.getSyxClassid());
+        param.add("vehicleType", zhongAnCacheCarInfoParam.getVehicleType());
+        param.add("modelEnergyType", zhongAnCacheCarInfoParam.getModelEnergyType());
+        param.add("fuelType", zhongAnCacheCarInfoParam.getFuelType());
+        param.add("desVehicleOwnerName", zhongAnCacheCarInfoParam.getDesVehicleOwnerName());
+        param.add("applicantType", zhongAnCacheCarInfoParam.getApplicantType());
+        param.add("applicantUseAttribute", zhongAnCacheCarInfoParam.getApplicantUseAttribute());
+        param.add("useAttribute", zhongAnCacheCarInfoParam.getUseAttribute());
+        param.add("subOwnershipAttribute", zhongAnCacheCarInfoParam.getSubOwnershipAttribute());
+        param.add("ownershipAttribute", zhongAnCacheCarInfoParam.getOwnershipAttribute());
+        param.add("vehicleLicenceType", zhongAnCacheCarInfoParam.getVehicleLicenceType());
+        param.add("callVehicleModelLibraryFlag", zhongAnCacheCarInfoParam.getCallVehicleModelLibraryFlag());
+        param.add("flowId", zhongAnCacheCarInfoParam.getFlowId());
+        param.add("page", zhongAnCacheCarInfoParam.getPage());
+        param.add("i", zhongAnCacheCarInfoParam.getI());
+        param.add("flag", zhongAnCacheCarInfoParam.getFlag());
+
+        ZhongAnCacheCarInfoResult.Response response = form(ZhongAnAPI.CacheCarInfo, param, ZhongAnCacheCarInfoResult.Response.class, headers);
+
+        if (response.getErrorCode().equals("")) {
+            return response.getValue();
+        }
+
+        throw new RuntimeException(response.getErrorMsg());
+    }
+}

+ 167 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnQuotaionApiBaseServiceImpl.java

@@ -0,0 +1,167 @@
+package com.jzg.quotation.zhongan.crawler.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.*;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.zhongan.crawler.model.entity.*;
+import com.jzg.quotation.zhongan.crawler.model.param.ZhongAnCacheCarInfoParam;
+import com.jzg.quotation.zhongan.crawler.model.param.ZhongAnPremiumTrialParamCoverageInfo;
+import com.jzg.quotation.zhongan.crawler.model.result.*;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class ZhongAnQuotaionApiBaseServiceImpl implements QuotationApiBaseService {
+
+    @Resource
+    private ZhongAnAPIService zhongAnAPIService;
+
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+
+        // 假设已经登录成功
+        String token = "";
+        String flowId = "";
+
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+
+        ZhongAnCacheInputQueryParam zhongAnCacheInputQueryParam = new ZhongAnCacheInputQueryParam();
+        zhongAnCacheInputQueryParam.setInsurePlace("晋城市");
+        zhongAnCacheInputQueryParam.setInsurePlaceCode("140500");
+        zhongAnCacheInputQueryParam.setLicenseNo(carInfoVo.getLicenseNo());
+
+
+        // 发起保险
+        // 此接口可能不支持并发,参看 cacheCarInfo 接口注释。
+        zhongAnAPIService.cacheInputQuery(token, flowId, zhongAnCacheInputQueryParam);
+
+        // 车型查询
+        ZhongAnQueryJyytVehicleModelResult zhongAnQueryJyytVehicleModelResult = zhongAnAPIService.queryJyytVehicleModel(token, flowId, carInfoVo.getVinNo());
+        ZhongAnVehicleModel minPriceVehicle = zhongAnQueryJyytVehicleModelResult.getDatas().getMinPriceVehicle();
+
+        ZhongAnCacheCarInfoParam zhongAnCacheCarInfoParam = new ZhongAnCacheCarInfoParam();
+        zhongAnCacheCarInfoParam.setInsurePlace("晋城市");
+        zhongAnCacheCarInfoParam.setInsurePlaceCode("140500");
+        zhongAnCacheCarInfoParam.setVehicleLicencePlateNo(carInfoVo.getLicenseNo());
+        zhongAnCacheCarInfoParam.setVehicleFrameNo(carInfoVo.getVinNo());
+        zhongAnCacheCarInfoParam.setVehicleEngineNo(carInfoVo.getEngineNo());
+        zhongAnCacheCarInfoParam.setVehicleRegisterDate(carInfoVo.getRegisterDate());
+        zhongAnCacheCarInfoParam.setVehicleOwnerName(ownersInfo.getName());
+        zhongAnCacheCarInfoParam.setIdentifyType("1"); // 身份证
+        zhongAnCacheCarInfoParam.setIdentifyNo(ownersInfo.getIdentifyNumber());
+        zhongAnCacheCarInfoParam.setModelName(minPriceVehicle.getBrandName());
+        zhongAnCacheCarInfoParam.setBrandCode(minPriceVehicle.getBrandCode());
+        zhongAnCacheCarInfoParam.setVehicleName(minPriceVehicle.getVehicleName());
+        zhongAnCacheCarInfoParam.setVehicleBrand(minPriceVehicle.getBrandName());
+        zhongAnCacheCarInfoParam.setVehicleModelName(minPriceVehicle.getBrandName());
+        zhongAnCacheCarInfoParam.setVehicleModelName(minPriceVehicle.getBrandName());
+        zhongAnCacheCarInfoParam.setVehicleModelCode(minPriceVehicle.getVehicleCode());
+        zhongAnCacheCarInfoParam.setModelsJy(minPriceVehicle.getVehicleCode());
+        zhongAnCacheCarInfoParam.setCurbWeight(minPriceVehicle.getFullWeight());
+        zhongAnCacheCarInfoParam.setExhaustMeasure(minPriceVehicle.getDisplacement());
+        zhongAnCacheCarInfoParam.setPower(minPriceVehicle.getPower());
+        zhongAnCacheCarInfoParam.setCreator(minPriceVehicle.getCompanyName());
+        zhongAnCacheCarInfoParam.setVehicleAcquisitionPrice(minPriceVehicle.getPurchasePrice());
+        zhongAnCacheCarInfoParam.setVehiclePassengerCap(minPriceVehicle.getSeat());
+        zhongAnCacheCarInfoParam.setGearBoxType(minPriceVehicle.getGearBoxType());
+        zhongAnCacheCarInfoParam.setConfigName(minPriceVehicle.getConfigName());
+        zhongAnCacheCarInfoParam.setTaxType(minPriceVehicle.getKindredPriceTax());
+        zhongAnCacheCarInfoParam.setSyxClassid(minPriceVehicle.getSyxClassid());
+        zhongAnCacheCarInfoParam.setFuelType(minPriceVehicle.getPowerType());
+        zhongAnCacheCarInfoParam.setModelEnergyType("0");
+        zhongAnCacheCarInfoParam.setVehicleType("2");
+        zhongAnCacheCarInfoParam.setDesVehicleOwnerName("");
+        zhongAnCacheCarInfoParam.setVehicleModelDesc("");
+        zhongAnCacheCarInfoParam.setVehicleCap("");
+        zhongAnCacheCarInfoParam.setApplicantType("PERSONAL");
+        zhongAnCacheCarInfoParam.setOwnershipAttribute("03");
+        zhongAnCacheCarInfoParam.setUseAttribute("NONBUSINESS");
+        zhongAnCacheCarInfoParam.setSubOwnershipAttribute("");
+        zhongAnCacheCarInfoParam.setOwnershipAttribute("PER");
+
+
+
+        // 保存车辆信息
+        // 此接口可能不支持并发,参看接口注释。
+        ZhongAnCacheCarInfoResult zhongAnCacheCarInfoResult = zhongAnAPIService.cacheCarInfo(token, zhongAnCacheCarInfoParam);
+
+        // 设置报价的险种
+        List<ZhongAnPremiumTrialParamCoverageInfo> coverageInfo =  new ArrayList<>();
+
+        // 报价
+        ZhongAnPremiumTrialResult zhongAnPremiumTrialResult = zhongAnAPIService.premiumTrial(token, flowId, coverageInfo, null);
+
+        ZhongAnPremiumTrial datas = zhongAnPremiumTrialResult.getDatas();
+
+        ZhongAnVehiclePremium vehiclePremium = datas.getVehiclePremium();
+
+        // 报价的商业险总金额
+        String bizTotalPremium = vehiclePremium.getBizTotalPremium();
+        // 报价的驾乘险总金额
+        String nonTotalPremium = vehiclePremium.getNonTotalPremium();
+
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+
+        ZhongAnQueryCarInfoResult zhongAnQueryCarInfoResult = zhongAnAPIService.queryCarInfo(token, flowId);
+
+        return quoteResultsVo;
+    }
+
+    @Override
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws JsonProcessingException {
+        return null;
+    }
+
+    @Override
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
+        return null;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+        String token = null;
+        ZhongAnQueryDocumentInfoResult zhongAnQueryDocumentInfoResult = zhongAnAPIService.queryDocumentInfo(token, orderBase.getOrdersNo());
+
+        List<ZhongAnBizDocumentInfo> bizDocumentInfo = zhongAnQueryDocumentInfoResult.getBizDocumentInfo();
+
+        for (ZhongAnBizDocumentInfo bizDocument : bizDocumentInfo) {
+            String url = "https://c.zhongan.com/open/bmw/n/query_controller/downloadDocument.json?orderNo=%s&fileName=%s&documentUrl=%s".formatted("orderNo",bizDocument.getDocumentName(), bizDocument.getDocumentUrl());
+
+            System.out.println(url);
+        }
+    }
+
+    @Override
+    public void queryOrderState(OrderStatusVo orderStatusVo) {
+        String token = null;
+
+        String policyId = null;
+
+
+        ZhongAnQueryPolicyDetailResult result = zhongAnAPIService.queryPolicyDetail(token, policyId);
+
+        ZhongAnPolicyDetail datas = result.getDatas();
+
+        ZhongAnPolicy policy = datas.getPolicy();
+
+        ZhongAnVehiclePolicyDTO vehiclePolicyDTO = policy.getVehiclePolicyDTO();
+
+        // PAYMENTED_POLICY_INSURE 支付完成状态
+        String policyStatus = vehiclePolicyDTO.getPolicyStatus();
+        String policyStatusText = vehiclePolicyDTO.getPolicyStatusText();
+
+
+    }
+}

+ 190 - 0
tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryCarInfoResultTest.java

@@ -0,0 +1,190 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.zhongan.crawler.JsonUtil;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class ZhongAnQueryCarInfoResultTest {
+
+    @Test
+    public void test() {
+        String json = """
+                
+                {
+                    "errorMsg": "",
+                    "ruleMsgTips": "",
+                    "errorCode": "",
+                    "value": {
+                        "datas": {
+                            "isOpenVehicleLicenseNoInput": "0",
+                            "isUserSelect": "1",
+                            "vehicleLicencePlateNo": "晋K7059T",
+                            "insurePlace": "晋中市-太谷县",
+                            "IndividuatOfSBBGFlag": "0",
+                            "isSupportHouse": "0",
+                            "isOpenNewCarsUnprefixed": "1",
+                            "applicantType": "PERSONAL",
+                            "isNewCar": false,
+                            "vehicleExtDTO": {
+                                "vehicleLicencePlateNo": "晋K7059T",
+                                "vehicleEngineNo": "22***15",
+                                "vehicleFrameNo": "LHGTG1******26217",
+                                "vehicleBrand": "广汽本田",
+                                "vehicleModelCode": "BTABGD0009",
+                                "vehicleModelName": "本田GHA6480KAC5A多用途乘用车2017款 两驱精英版",
+                                "vehicleUsageType": "NONBUSINESS_210",
+                                "useAttribute": "NONBUSINESS",
+                                "ownershipAttribute": "PER",
+                                "vehiclePassengerCap": 5,
+                                "vehicleRegisterDate": 1553443200000,
+                                "vehicleAcquisitionPrice": "203000",
+                                "vehicleLicenceBackColor": "01",
+                                "vehicleLicenceType": "02",
+                                "vehicleType": "11",
+                                "transferFlag": "0",
+                                "curbWeight": "1708",
+                                "modelsJy": "BTABGD0009",
+                                "exhaustMeasure": "1.498",
+                                "creator": "广汽本田汽车有限公司",
+                                "vehicleAge": 74,
+                                "vehicleOwnerName": "刘书君",
+                                "identifyNo": "372501198303144024",
+                                "identifyType": "I",
+                                "phone": "15388516493",
+                                "actualPrice": "114086.00",
+                                "insurePlaceCode": "140700",
+                                "newVehicleFlag": "0",
+                                "isImportCar": false,
+                                "fuelType": "D1",
+                                "taxType": "0",
+                                "extraInfo": "{\\"certificateType\\":\\"01\\",\\"chargingPileFlag\\":\\"2\\",\\"ownVerifyResult\\":\\"1\\",\\"participateActivity\\":false,\\"sale4SFlag\\":\\"\\",\\"saleCompanyAreaCode\\":\\"\\",\\"saleCompanyName\\":\\"\\",\\"sendInsureToPAflag\\":false,\\"zaCompel\\":false}",
+                                "extraInfoObj": {
+                                    "participateActivity": false,
+                                    "sendInsureToPAflag": false,
+                                    "certificateType": "01",
+                                    "ownVerifyResult": "1",
+                                    "saleCompanyName": "",
+                                    "saleCompanyAreaCode": "",
+                                    "sale4SFlag": "",
+                                    "chargingPileFlag": "2",
+                                    "zaCompel": false
+                                },
+                                "vehicleModelDesc": "本田GHA6480KAC5A多用途乘用车2017款 两驱精英版 2017款 两驱精英版",
+                                "vehicleFamilyCode": "BTA1AS",
+                                "vehicleFamilyName": "冠道",
+                                "vehicleInfoSource": "2",
+                                "certificateType": "01",
+                                "paVehicleType": "",
+                                "transferCarFlag": false,
+                                "campaignId": 1200001009,
+                                "upperLimit": "115226",
+                                "lowerLimit": "79861",
+                                "thirdOrgCode": "140726",
+                                "syxClassid": "KA",
+                                "power": "142",
+                                "vehicleClass": "carSwitch",
+                                "jyImportCarFlag": "2",
+                                "vehicleTypeSubclass": "",
+                                "modelEnergyType": "0",
+                                "registerDate": "2019-03-25",
+                                "desVehicleFrameNo": "5369d26692087b85e25ff15fcbcf808fd8c247ed26f6c881a888fe4df14e02736bd6312aa410e2de",
+                                "desVehicleEngineNo": "471da0d6489afd126417174bf6e67e50",
+                                "desOcrCertiNo": "",
+                                "desIdNo": "",
+                                "vehicleSource": "ZBXFQZ",
+                                "frontVehicleModelDTO": {
+                                    "vehicleCode": "BTABGD0009",
+                                    "vehicleName": "本田GHA6480KAC5A多用途乘用车",
+                                    "companyName": "广汽本田汽车有限公司",
+                                    "brandName": "广汽本田",
+                                    "purchasePrice": 203000,
+                                    "seat": "5",
+                                    "fullWeight": "1708",
+                                    "displacement": 1.498,
+                                    "gearBoxType": "CVT",
+                                    "configName": "2017款 两驱精英版"
+                                },
+                                "vehicleModelList": [
+                                    {
+                                        "vehicleCode": "BTABGD0009",
+                                        "vehicleName": "本田GHA6480KAC5A多用途乘用车",
+                                        "companyName": "广汽本田汽车有限公司",
+                                        "companyCode": "MK03138",
+                                        "brandName": "广汽本田",
+                                        "brandCode": "BTA1",
+                                        "familyName": "冠道",
+                                        "familyCode": "BTA1AS",
+                                        "remark": "CVT 两驱精英版 国Ⅴ",
+                                        "vehicleClassCode": "IC02",
+                                        "vehicleClass": "越野车类",
+                                        "vehicleImport": "合资",
+                                        "purchasePrice": 203000,
+                                        "purchasePriceTax": 220350,
+                                        "kindredPrice": 0,
+                                        "kindredPriceTax": "0",
+                                        "jqxClassid": "KA",
+                                        "jqxClassname": "六座以下客车",
+                                        "syxClassid": "KA",
+                                        "syxClassname": "六座以下客车",
+                                        "seat": "5",
+                                        "fullWeight": "1708",
+                                        "fullWeightMax": 1708,
+                                        "fullWeightMin": 1708,
+                                        "displacement": 1.498,
+                                        "marketDate": "201703",
+                                        "gearBoxType": "CVT",
+                                        "engineDesc": "1.5T",
+                                        "vehicleWeight": "2180",
+                                        "groupName": "冠道(16/10-20/03)",
+                                        "groupCode": "BTA1AS01",
+                                        "stopFlag": "1",
+                                        "vehicleHyName": "本田GHA6480KAC5A 精英版",
+                                        "vehicleHyCode": "BGQEGAUC0003",
+                                        "configName": "2017款 两驱精英版",
+                                        "hfCode": "0",
+                                        "hfName": "正常",
+                                        "vehiclePubName": "本田",
+                                        "vehiclePubCode": "GHA6480KAC5A",
+                                        "yearPattern": "2017",
+                                        "power": "142",
+                                        "vehicleSize": "4816*1942*1669",
+                                        "familyShortName": "冠道",
+                                        "powerType": "汽油",
+                                        "powerTypeCode": "D1",
+                                        "airBagNum": "4",
+                                        "vehicleHyCCode": "BGQEGAUC0003",
+                                        "topSpeed": "198"
+                                    }
+                                ]
+                            },
+                            "vehicleOwnerDTO": {
+                                "cusPersonFlg": false
+                            },
+                            "insurePlaceCode": "140700",
+                            "thirdOrgCode": "140726",
+                            "applicantUseAttribute": "03"
+                        }
+                    },
+                    "additionalInfo": {},
+                    "success": true
+                }
+                
+                """;
+
+        ZhongAnQueryCarInfoResult.Response result = JsonUtil.readObjcet(json, ZhongAnQueryCarInfoResult.Response.class);
+
+        assertNotNull(result);
+
+        Map<String, Object> unknownFields = result.getUnknownFields();
+
+        System.out.println();
+        System.out.println();
+        System.out.println(unknownFields);
+
+        assertNull(unknownFields);
+    }
+}

+ 139 - 0
tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryJyytVehicleModelResultTest.java

@@ -0,0 +1,139 @@
+package com.jzg.quotation.zhongan.crawler.model.result;
+
+import com.jzg.quotation.zhongan.crawler.JsonUtil;
+import org.junit.jupiter.api.Test;
+
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+public class ZhongAnQueryJyytVehicleModelResultTest {
+
+    @Test
+    public void test() {
+        String json = """
+                {
+                    "errorMsg": "",
+                    "ruleMsgTips": "",
+                    "errorCode": "",
+                    "value": {
+                        "datas": {
+                            "minPriceVehicle": {
+                                "vehicleCode": "BTABGD0009",
+                                "vehicleName": "本田GHA6480KAC5A多用途乘用车",
+                                "companyName": "广汽本田汽车有限公司",
+                                "companyCode": "MK03138",
+                                "brandName": "广汽本田",
+                                "brandCode": "BTA1",
+                                "familyName": "冠道",
+                                "familyCode": "BTA1AS",
+                                "remark": "CVT 两驱精英版 国Ⅴ",
+                                "vehicleClassCode": "IC02",
+                                "vehicleClass": "越野车类",
+                                "vehicleImport": "合资",
+                                "purchasePrice": 203000,
+                                "purchasePriceTax": 220350,
+                                "kindredPrice": 0,
+                                "kindredPriceTax": "0",
+                                "jqxClassid": "KA",
+                                "jqxClassname": "六座以下客车",
+                                "syxClassid": "KA",
+                                "syxClassname": "六座以下客车",
+                                "seat": "5",
+                                "fullWeight": "1708",
+                                "fullWeightMax": 1708,
+                                "fullWeightMin": 1708,
+                                "displacement": 1.498,
+                                "marketDate": "201703",
+                                "gearBoxType": "CVT",
+                                "engineDesc": "1.5T",
+                                "vehicleWeight": "2180",
+                                "groupName": "冠道(16/10-20/03)",
+                                "groupCode": "BTA1AS01",
+                                "stopFlag": "1",
+                                "vehicleHyName": "本田GHA6480KAC5A 精英版",
+                                "vehicleHyCode": "BGQEGAUC0003",
+                                "configName": "2017款 两驱精英版",
+                                "hfCode": "0",
+                                "hfName": "正常",
+                                "vehiclePubName": "本田",
+                                "vehiclePubCode": "GHA6480KAC5A",
+                                "yearPattern": "2017",
+                                "power": "142",
+                                "familyShortName": "冠道",
+                                "powerType": "汽油",
+                                "powerTypeCode": "D1"
+                            },
+                            "vehicleModelList": [
+                                {
+                                    "vehicleCode": "BTABGD0009",
+                                    "vehicleName": "本田GHA6480KAC5A多用途乘用车",
+                                    "companyName": "广汽本田汽车有限公司",
+                                    "companyCode": "MK03138",
+                                    "brandName": "广汽本田",
+                                    "brandCode": "BTA1",
+                                    "familyName": "冠道",
+                                    "familyCode": "BTA1AS",
+                                    "remark": "CVT 两驱精英版 国Ⅴ",
+                                    "vehicleClassCode": "IC02",
+                                    "vehicleClass": "越野车类",
+                                    "vehicleImport": "合资",
+                                    "purchasePrice": 203000,
+                                    "purchasePriceTax": 220350,
+                                    "kindredPrice": 0,
+                                    "kindredPriceTax": "0",
+                                    "jqxClassid": "KA",
+                                    "jqxClassname": "六座以下客车",
+                                    "syxClassid": "KA",
+                                    "syxClassname": "六座以下客车",
+                                    "seat": "5",
+                                    "fullWeight": "1708",
+                                    "fullWeightMax": 1708,
+                                    "fullWeightMin": 1708,
+                                    "displacement": 1.498,
+                                    "marketDate": "201703",
+                                    "gearBoxType": "CVT",
+                                    "engineDesc": "1.5T",
+                                    "vehicleWeight": "2180",
+                                    "groupName": "冠道(16/10-20/03)",
+                                    "groupCode": "BTA1AS01",
+                                    "stopFlag": "1",
+                                    "vehicleHyName": "本田GHA6480KAC5A 精英版",
+                                    "vehicleHyCode": "BGQEGAUC0003",
+                                    "configName": "2017款 两驱精英版",
+                                    "hfCode": "0",
+                                    "hfName": "正常",
+                                    "vehiclePubName": "本田",
+                                    "vehiclePubCode": "GHA6480KAC5A",
+                                    "yearPattern": "2017",
+                                    "power": "142",
+                                    "vehicleSize": "4816*1942*1669",
+                                    "familyShortName": "冠道",
+                                    "powerType": "汽油",
+                                    "powerTypeCode": "D1",
+                                    "airBagNum": "4",
+                                    "vehicleHyCCode": "BGQEGAUC0003",
+                                    "topSpeed": "198"
+                                }
+                            ]
+                        }
+                    },
+                    "additionalInfo": {},
+                    "success": true
+                }
+                """;
+
+        ZhongAnQueryJyytVehicleModelResult.Response result = JsonUtil.readObjcet(json, ZhongAnQueryJyytVehicleModelResult.Response.class);
+
+        assertNotNull(result);
+
+        Map<String, Object> unknownFields = result.getUnknownFields();
+
+        System.out.println();
+        System.out.println();
+        System.out.println(unknownFields);
+
+        assertNull(unknownFields);
+    }
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 257 - 0
tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/model/result/ZhongAnQueryPolicyDetailResultTest.java


+ 142 - 0
tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIServiceTest.java

@@ -0,0 +1,142 @@
+package com.jzg.quotation.zhongan.crawler.service;
+
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.zhongan.crawler.model.entity.ZhongAnBizDocumentInfo;
+import com.jzg.quotation.zhongan.crawler.model.result.ZhongAnQueryCarInfoResult;
+import com.jzg.quotation.zhongan.crawler.model.result.ZhongAnQueryDocumentInfoResult;
+import com.jzg.quotation.zhongan.crawler.model.result.ZhongAnQueryPolicyDetailResult;
+import io.netty.channel.ChannelOption;
+import io.netty.handler.ssl.SslContextBuilder;
+import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
+import io.netty.handler.timeout.ReadTimeoutHandler;
+import io.netty.handler.timeout.WriteTimeoutHandler;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.reactive.ReactorClientHttpConnector;
+import org.springframework.web.reactive.function.client.ExchangeFilterFunction;
+import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
+import reactor.netty.http.client.HttpClient;
+import reactor.netty.resources.ConnectionProvider;
+
+import java.time.Duration;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class ZhongAnAPIServiceTest {
+    private static final Logger logger = LoggerFactory.getLogger(ZhongAnAPIServiceTest.class);
+
+    private static ZhongAnAPIService zhongAnAPIService;
+
+
+    @BeforeAll
+    public static void before() {
+        // 启用SSL调试(查看握手过程)
+        //System.setProperty("javax.net.debug", "ssl:handshake");
+
+        // 配置HTTP连接池
+        ConnectionProvider connectionProvider = ConnectionProvider
+                .builder("http")
+                .maxConnections(500)
+                .maxIdleTime(Duration.ofSeconds(30))
+                .build();
+
+        // 配置HTTP客户端
+        HttpClient httpClient = reactor.netty.http.client.HttpClient
+                .create(connectionProvider)
+                .secure(ssl -> ssl.sslContext(
+                        SslContextBuilder.forClient()
+                                .trustManager(InsecureTrustManagerFactory.INSTANCE)
+                ))
+                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
+                .responseTimeout(Duration.ofSeconds(50))
+                .doOnConnected(conn ->
+                        conn.addHandlerLast(new ReadTimeoutHandler(50)).addHandlerLast(new WriteTimeoutHandler(50)));
+
+        WebClient.builder()
+                .clientConnector(new ReactorClientHttpConnector(httpClient))
+                .build();
+        // 构建WebClient实例
+        WebClient webClient = WebClient
+                .builder()
+                .clientConnector(new ReactorClientHttpConnector(httpClient))
+                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
+                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
+                .filter(ExchangeFilterFunction.ofRequestProcessor(
+                        clientRequest -> {
+                            // 打印请求头信息
+                            clientRequest
+                                    .headers()
+                                    .forEach((key, values) -> {
+                                        logger.info("请求头: {}: {}", key, values);
+                                    });
+                            return Mono.just(clientRequest);
+                        }
+                ))
+                .codecs(item->item.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
+                .build();
+
+
+        RequestComponent requestComponent = new RequestComponent(webClient);
+
+        zhongAnAPIService = new ZhongAnAPIService();
+        zhongAnAPIService.setRequestComponent(requestComponent);
+
+
+        //ChengTaiAPIHelper.initAPI("https://b2b.champion-ic.com");
+    }
+
+
+    @Test
+    public void queryDocumentInfo() {
+        String token = "zaLoginCookieKey=9b902b0ec92581f51587ce2a9da7019ec8f9582b1a43c0f437b9566049b486c2;";
+        ZhongAnQueryDocumentInfoResult zhongAnQueryDocumentInfoResult = zhongAnAPIService.queryDocumentInfo(token, "291e19533f8ee5b20d8eaf64ec4f43b5");
+
+        assertNotNull(zhongAnQueryDocumentInfoResult);
+
+        List<ZhongAnBizDocumentInfo> bizDocumentInfo = zhongAnQueryDocumentInfoResult.getBizDocumentInfo();
+
+        for (ZhongAnBizDocumentInfo bizDocument : bizDocumentInfo) {
+            String url = "https://c.zhongan.com/open/bmw/n/query_controller/downloadDocument.json?orderNo=%s&fileName=%s&documentUrl=%s".formatted("291e19533f8ee5b20d8eaf64ec4f43b5",bizDocument.getDocumentName(), bizDocument.getDocumentUrl());
+
+            System.out.println(url);
+        }
+    }
+
+    @Test
+    public void queryPolicyDetail() {
+        String token = "zaLoginCookieKey=9b902b0ec92581f51587ce2a9da7019ec8f9582b1a43c0f437b9566049b486c2;";
+        String policyId = "bd162dd1260519fc39aa446aee32d9ab";
+
+        ZhongAnQueryPolicyDetailResult result = zhongAnAPIService.queryPolicyDetail(token, policyId);
+
+        assertNotNull(result);
+
+        String policyStatus = result.getDatas().getPolicy().getVehiclePolicyDTO().getPolicyStatus();
+        String policyStatusText = result.getDatas().getPolicy().getVehiclePolicyDTO().getPolicyStatusText();
+
+        System.out.println(policyStatus);
+        System.out.println(policyStatusText);
+    }
+
+    @Test
+    public void queryCarInfo() {
+        String token = "zaLoginCookieKey=9b902b0ec92581f51587ce2a9da7019ec8f9582b1a43c0f437b9566049b486c2;";
+        String flowId = "FJ14309612196676b6cd4";
+
+        ZhongAnQueryCarInfoResult result = zhongAnAPIService.queryCarInfo(token, flowId);
+
+        assertNotNull(result);
+
+        Map<String, Object> unknownFields = result.getUnknownFields();
+
+        System.out.println();
+        System.out.println(unknownFields);
+    }
+}

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio