jinshihui пре 10 месеци
родитељ
комит
e7b78d34bb
47 измењених фајлова са 9019 додато и 22 уклоњено
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/EsmInsCompany.java
  2. 17 2
      commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java
  3. 26 5
      commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java
  4. 1 0
      tenant/insurance/pom.xml
  5. 80 7
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCompaniesRequest.java
  6. 2 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerQuotationResponse.java
  7. 0 4
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  8. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  9. 3 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/InsuranceCode.java
  10. 7 0
      tenant/insurance/quotation-summary/pom.xml
  11. 1 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  12. 230 0
      tenant/insurance/quotation-taishan/README.md
  13. 29 0
      tenant/insurance/quotation-taishan/pom.xml
  14. 138 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java
  15. 49 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanBuildingAttributionInformation.java
  16. 231 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerCacheComponent.java
  17. 150 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  18. 46 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/CertifyType.java
  19. 49 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/RequestUrl.java
  20. 30 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/constant/enums/ResponseCode.java
  21. 67 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/TaiShanCrawlerConfigureParameters.java
  22. 112 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/po/TaiShanCrawlerOrder.java
  23. 697 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/ProposalInfoDTO.java
  24. 21 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerBaseRequest.java
  25. 85 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerCarRequest.java
  26. 27 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerCheckTokenRequest.java
  27. 119 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerGetActualValueRequest.java
  28. 2240 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerQuotationRequest.java
  29. 139 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/request/TaiShanCrawlerUnderwritingRequest.java
  30. 70 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerBaseResponse.java
  31. 32 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerCaptchaResponse.java
  32. 255 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerCarResponse.java
  33. 55 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerCheckTokenResponse.java
  34. 46 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerCompaniesResponse.java
  35. 86 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerGetActualValueResponse.java
  36. 2529 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerQuotationResponse.java
  37. 72 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerUnderwritingResponse.java
  38. 87 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/response/TaiShanCrawlerVehicleConfirmationResponse.java
  39. 18 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/properties/TaiShanCrawlerProperties.java
  40. 19 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/repository/TaiShanCrawlerOrderRepository.java
  41. 28 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerOrderService.java
  42. 28 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerQuoteProcessService.java
  43. 12 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/TaiShanCrawlerRequest.java
  44. 53 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerOrderServiceImpl.java
  45. 54 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java
  46. 766 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  47. 209 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/util/TaiShanCrawlerUtils.java

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/EsmInsCompany.java

@@ -20,6 +20,9 @@ public class EsmInsCompany extends BaseModel {
 
     private String code;
 
+    /**
+     * 保险公司编码
+     */
     private String companyCode;
 
     private String name;

+ 17 - 2
commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java

@@ -124,6 +124,11 @@ public class CarInfoVo implements Serializable {
     @Schema(description = "车辆类型代码")
     private String carTypeCode;
 
+    /**
+     * 原始车型代码
+     */
+    private String origModelCde;
+
     @Schema(description = "车辆类型名称")
     private String carTypeName;
     /**
@@ -151,7 +156,6 @@ public class CarInfoVo implements Serializable {
     private String modelEnergyType;
 
     /**
-     * @see PropertyCode
      * 所属性质代码
      */
     @Schema(description = "所属性质代码")
@@ -159,8 +163,8 @@ public class CarInfoVo implements Serializable {
 
     @Schema(description = "所属性质名称")
     private String propertyName;
+
     /**
-     * @see LicenseColorCode
      * 号牌颜色代码
      */
     @Schema(description = "号牌颜色代码")
@@ -212,6 +216,7 @@ public class CarInfoVo implements Serializable {
      */
     @Schema(description = "是否贷款车")
     private boolean loanStatus;
+
     /* *
      * 所属性质(1个人 2企业 3机关)
      */
@@ -229,6 +234,16 @@ public class CarInfoVo implements Serializable {
     @Schema(description = "过户日期")
     private String transferDate;
 
+    /**
+     * 车辆型号
+     */
+    private String carModelNo;
+
+    /**
+     * 是否精确查询:1=精确匹配,0=模糊查询
+     */
+    private String isAccurate;
+
     /**
      * 获取 吨位数/核定载质量
      *

+ 26 - 5
commons/src/main/java/com/jzg/commons/entity/quote/vo/QuoteVo.java

@@ -35,36 +35,43 @@ public class QuoteVo implements Serializable {
      * 其他信息
      */
     private InsOrdersOtherInfoVo otherInfo;
+
     /**
      * 车辆信息
      */
     @Schema(description = "车辆信息")
     private CarInfoVo carInfoVo;
+
     /**
      * 车主
      */
     @Schema(description = "车主")
     private CustomerInfoVo ownersInfo;
+
     /**
      * 投保人
      */
     @Schema(description = "投保人")
     private CustomerInfoVo policyHolderInfo;
+
     /**
      * 被保人
      */
     @Schema(description = "被保人")
     private CustomerInfoVo insuredPersonInfo;
+
     /**
-     * 交强险 险种信息
+     * 交强险险种信息
      */
-    @Schema(description = "交强险 险种信息")
+    @Schema(description = "交强险险种信息")
     private RiskInfoVo ciRiskInfoVo;
+
     /**
-     * 商业险 险种信息
+     * 商业险险种信息
      */
-    @Schema(description = "商业险 险种信息")
+    @Schema(description = "商业险险种信息")
     private RiskInfoVo biRiskInfoVo;
+
     /**
      * 商业险信息
      */
@@ -83,17 +90,31 @@ public class QuoteVo implements Serializable {
     @Schema(description = "车船税信息")
     private VehicleAndVesselTaxVo vehicleAndVesselTaxVo;
 
+    /**
+     * 是否同车主0-否;1-是
+     */
     @Schema(description = "是否同车主0-否;1-是")
     private int carOwner;
 
+    /**
+     * 险种产品代码
+     */
     @Schema(description = "险种产品代码")
     private String productId;
 
+    /**
+     * 产品代码
+     */
+    private String productCode;
+
+    /**
+     * 特约条款
+     */
     @Schema(description = "特约")
     private List<InsCompanyClause> specialInfoVo;
 
     /**
-     * 订单数据库查询数据转 QuoteVo对象
+     * 订单数据库查询数据转QuoteVo对象
      *
      * @param insOrdersVo
      */

+ 1 - 0
tenant/insurance/pom.xml

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

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

@@ -5,36 +5,109 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 /**
- * @description: 渤海财险 【爬虫】 查询机构列表
- * @author: wenks
- * @date: 2025/2/28 10:51
+ * 渤海财险爬虫机构查询请求实体类
+ *
+ * <p>该类用于封装渤海财险爬虫系统中查询机构列表的请求参数。
+ * 通过调用渤海财险的机构查询API,获取可用的销售机构信息,
+ * 用于后续的归属信息构建和报价流程。</p>
+ *
+ * <p>主要功能:</p>
+ * <ul>
+ *   <li>支持按机构前缀查询机构列表</li>
+ *   <li>支持分页查询功能</li>
+ *   <li>包含操作员和登录公司信息用于权限验证</li>
+ *   <li>提供推荐码用于业务关联</li>
+ * </ul>
+ *
+ * <p>使用场景:</p>
+ * <ul>
+ *   <li>报价前的归属信息构建</li>
+ *   <li>机构权限验证</li>
+ *   <li>销售渠道配置</li>
+ * </ul>
+ *
+ * @author wenks
+ * @since 2025/2/28 10:51
+ * @version 1.0
  **/
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 public class BoHaiCrawlerCompaniesRequest {
 
+    /**
+     * 机构前缀代码
+     *
+     * <p>用于模糊查询机构的标识前缀,通常为机构的代码前几位。
+     * 例如:'BJ' 表示北京地区机构,'SH' 表示上海地区机构等。</p>
+     */
     private String companyPrefix;
 
+    /**
+     * 机构名称
+     *
+     * <p>机构的完整名称,支持精确查询。如果为null或空字符串,
+     * 则不作为查询条件,仅使用其他条件进行查询。</p>
+     */
     private String companyName;
 
+    /**
+     * 推荐代码
+     *
+     * <p>业务推荐码,用于标识业务来源或推荐人信息。
+     * 在某些业务场景下,此字段用于业绩归属和佣金计算。</p>
+     */
     private String recommendCode;
 
+    /**
+     * 登录公司代码
+     *
+     * <p>当前用户登录的公司标识,用于权限验证和机构范围限制。
+     * 只能查询当前登录公司有权限的机构信息。</p>
+     */
     private String loginCompany;
 
+    /**
+     * 分页页码
+     *
+     * <p>查询结果的页码,从1开始计数。
+     * 默认值为1,表示第一页。</p>
+     */
     private int pageNum;
 
+    /**
+     * 每页记录数
+     *
+     * <p>每页返回的最大记录数,用于控制查询结果的数量。
+     * 默认值为10,可根据实际需求调整。</p>
+     */
     private int pageSize;
 
+    /**
+     * 操作员代码
+     *
+     * <p>当前操作员的唯一标识,用于权限验证和操作日志记录。
+     * 同时也作为推荐码使用,关联业务归属。</p>
+     */
     private String operatorCode;
 
+    /**
+     * 便捷构造函数
+     *
+     * <p>提供常用的查询参数快速构造请求对象,使用默认的分页设置。
+     * 适用于大多数机构查询场景。</p>
+     *
+     * @param companyPrefix 机构前缀代码,不能为null
+     * @param loginCompany 登录公司代码,不能为null
+     * @param operatorCode 操作员代码,不能为null
+     */
     public BoHaiCrawlerCompaniesRequest(String companyPrefix, String loginCompany, String operatorCode) {
         this.companyPrefix = companyPrefix;
-        this.companyName = null;
+        this.companyName = null;        // 默认不按机构名称查询
         this.loginCompany = loginCompany;
-        this.recommendCode = operatorCode;
-        this.pageNum = 1;
-        this.pageSize = 10;
+        this.recommendCode = operatorCode;  // 推荐码使用操作员代码
+        this.pageNum = 1;              // 默认第一页
+        this.pageSize = 10;            // 默认每页10条记录
         this.operatorCode = operatorCode;
     }
 

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

@@ -22,6 +22,7 @@ public class BoHaiCrawlerQuotationResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = -7074383106771349265L;
+
     @JsonProperty("data")
     private DataDTO data;
 
@@ -350,6 +351,7 @@ public class BoHaiCrawlerQuotationResponse extends BoHaiBaseResponse {
                  */
                 @JsonProperty("premium")
                 private String premium;
+
                 @JsonProperty("floatingRate")
                 private String floatingRate;
             }

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

@@ -580,10 +580,6 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
 
         BoHaiCrawlerQuotationResponse boHaiCrawlerQuotationResponse = boHaiCrawlerRequestComponent.quotation(boHaiCrawlerQuotationRequest2, headers);
         log.info("boHaiCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(boHaiCrawlerQuotationResponse));
-        if(boHaiCrawlerQuotationResponse.getData() == null){
-            //报价失败
-            return BoHaiCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(boHaiCrawlerQuotationResponse);
-        }
 
         // 4.0 处理报价失败
         if (!ResponseCode.R_Z00001.equals(boHaiCrawlerQuotationResponse.getResponseCode())) {

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

@@ -299,7 +299,7 @@ public class RequestComponent {
      */
     public <Response> ResponseEntity<Response> post(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
         body = Optional.ofNullable(body).orElse("");
-        log.info("URL的值:{},body的值:{}", url, body);
+        log.info("URL的值:{},body的值:{}", url, body);
         WebClient webClient = selectNoSSLWebClient();
         try {
             // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据

+ 3 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/InsuranceCode.java

@@ -70,7 +70,6 @@ public class InsuranceCode {
     // 安盛天平财产保险股份有限公司
     public static final String INSURANCE_TPBX = "TPBX";
     public static final String INSURANCE_TPIC = "TPIC";
-    public static final String INSURANCE_TSBX = "TSBX";
     public static final String INSURANCE_ULIC = "ULIC";
     public static final String INSURANCE_UTIC = "UTIC";
     public static final String INSURANCE_XAIC = "XAIC";
@@ -98,4 +97,7 @@ public class InsuranceCode {
     public static final String INSURANCE_CHAC = "CHAC";
     // 大家财产保险股份有限公司
     public static final String  INSURANCE_DJPC = "DJPC";
+
+    // 泰山财险
+    public static final String  INSURANCE_TSBX = "TSBX";
 }

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

@@ -123,12 +123,19 @@
             <version>1.0-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-taishan</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+
         <!-- thymeleaf 模版类 -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>
         </dependency>
     </dependencies>
+
     <build>
         <plugins>
             <plugin>

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

@@ -237,8 +237,7 @@ public class UnifyOrderManager {
         insOrdersService.setUserAreaCode(quoteVo);
         //获取保司实体
         QuotationBaseService quoteService = companyFactory.getQuoteService(esmInsCompanyHttpResult.getData()
-                .getCompanyCode(), quoteVo.getOrder()
-                .getApiType(), sysQuoteConfigService, sysQuoteRedisService, platformClient, baseController);
+                .getCompanyCode(), quoteVo.getOrder().getApiType(), sysQuoteConfigService, sysQuoteRedisService, platformClient, baseController);
 
         // 添加车辆没有的参数: 车辆明细、人员信息
         QuoteInfoParameterFilling.setParameterSettings(quoteVo, esmInsCompanyHttpResult.getData().getCompanyCode());

+ 230 - 0
tenant/insurance/quotation-taishan/README.md

@@ -0,0 +1,230 @@
+# 泰山财险报价模块 (quotation-taishan)
+
+## 模块概述
+
+泰山财险报价模块是基于爬虫方式的保险报价服务,提供泰山财险的车辆保险报价、核保、支付等全流程功能。
+
+## 功能特性
+
+- ✅ 用户认证登录
+- ✅ 验证码识别
+- ✅ Token管理
+- ✅ 车型查询
+- ✅ 车辆信息确认
+- ✅ 交强险和商业险报价
+- ✅ 核保处理
+- ✅ 支付链接生成
+- ✅ 订单状态查询
+- ✅ 电子保单下载
+
+## 技术架构
+
+### 核心技术栈
+- **Spring Boot 3.0.0** - 应用框架
+- **Spring Cloud** - 微服务架构
+- **MyBatis-Plus 3.5.7** - ORM框架
+- **Redis** - 缓存管理
+- **MongoDB** - 文档存储
+- **Nacos** - 服务发现与配置管理
+- **Fastjson2** - JSON处理
+
+### 核心组件
+
+#### 1. 爬虫请求组件 (TaiShanCrawlerRequestComponent)
+- 统一的HTTP请求处理
+- 自动化验证码识别和处理
+- Token自动管理
+- 加密解密处理
+
+#### 2. 缓存组件 (TaiShanCrawlerCacheComponent)
+- Redis缓存管理
+- Token缓存
+- 会话信息缓存
+- 验证码缓存
+- 订单信息缓存
+
+#### 3. 工具类 (TaiShanCrawlerUtils)
+- DES/AES加密解密
+- MD5哈希生成
+- 随机字符串生成
+- 数据格式化
+
+## 项目结构
+
+```
+quotation-taishan/
+├── src/main/java/com/jzg/quotation/taishan/
+│   ├── TaiShanQuotationApplication.java          # 启动类
+│   ├── crawler/
+│   │   ├── component/                            # 核心组件
+│   │   │   ├── TaiShanCrawlerRequestComponent.java
+│   │   │   └── TaiShanCrawlerCacheComponent.java
+│   │   ├── constant/enums/                       # 枚举定义
+│   │   │   ├── RequestUrl.java
+│   │   │   ├── ResponseCode.java
+│   │   │   └── CertifyType.java
+│   │   ├── entity/                               # 实体类
+│   │   │   ├── po/                               # 数据库实体
+│   │   │   ├── request/                          # 请求实体
+│   │   │   └── response/                         # 响应实体
+│   │   ├── properties/                           # 配置属性
+│   │   ├── repository/                           # 数据访问层
+│   │   ├── service/                              # 业务逻辑层
+│   │   └── util/                                 # 工具类
+├── src/main/resources/
+│   ├── mapper/taishan/crawler/                   # MyBatis映射文件
+│   ├── application.yml                           # 主配置文件
+│   ├── application-dev.yml                       # 开发环境配置
+│   ├── application-test.yml                      # 测试环境配置
+│   └── application-prod.yml                      # 生产环境配置
+└── pom.xml                                       # Maven配置
+```
+
+## 配置说明
+
+### 泰山财险爬虫配置
+
+```yaml
+taishan:
+  crawler:
+    # API基础URL
+    base-url: https://api.taishan.com
+    base-url2: https://api2.taishan.com
+
+    # 认证信息
+    username: taishan_user
+    password: taishan_pass
+    operator-code: TAISHAN001
+    org-code: TAISHAN_ORG
+    org-name: 泰山财险
+
+    # Token
+    token: ""
+```
+
+### 数据库配置
+
+```yaml
+spring:
+  datasource:
+    url: jdbc:mysql://localhost:3306/jzg
+    username: root
+    password: 123456
+
+  redis:
+    host: localhost
+    port: 6379
+    database: 0
+
+  data:
+    mongodb:
+      host: localhost
+      port: 27017
+      database: jzg_taishan
+```
+
+## 接口说明
+
+### 1. 认证接口
+- **认证登录**: `/auth/login`
+- **获取验证码**: `/auth/captcha`
+
+### 2. Token管理接口
+- **创建Token**: `/token/create`
+- **校验Token**: `/token/check`
+
+### 3. 基础信息查询接口
+- **获取机构信息**: `/base/companies`
+- **获取渠道信息**: `/base/saleInfo`
+- **获取套餐信息**: `/base/channelPackages`
+
+### 4. 车辆相关接口
+- **车型查询**: `/vehicle/carModels`
+- **车辆确认**: `/vehicle/confirm`
+
+### 5. 报价相关接口
+- **报价**: `/quotation/price`
+- **核保**: `/quotation/underwriting`
+
+### 6. 支付相关接口
+- **支付凭证号查询**: `/payment/certiNoQuery`
+- **支付通知单号生成**: `/payment/noticeNoGeneration`
+- **生成支付链接**: `/payment/qrcode`
+
+### 7. 订单和保单相关接口
+- **查询订单状态**: `/order/status`
+- **下载电子保单**: `/policy/download`
+
+## 使用示例
+
+### 基本报价流程
+
+```java
+@Autowired
+private TaiShanCrawlerRequestComponent requestComponent;
+
+@Autowired
+private TaiShanCrawlerCacheComponent cacheComponent;
+
+// 1. 认证登录
+TaiShanCrawlerBaseResponse<String> authResponse = requestComponent.authenticate(
+    taiShanCrawlerProperties.getUsername(),
+    taiShanCrawlerProperties.getPassword()
+);
+
+// 2. 车型查询
+TaiShanCrawlerCarRequest carRequest = new TaiShanCrawlerCarRequest();
+carRequest.setModelName("朗逸");
+TaiShanCrawlerCarResponse carResponse = requestComponent.queryCarModels(carRequest, headers);
+
+// 3. 车辆确认
+TaiShanCrawlerVehicleConfirmationRequest confirmRequest = new TaiShanCrawlerVehicleConfirmationRequest();
+confirmRequest.setModelCode(carModel.getModelCode());
+TaiShanCrawlerVehicleConfirmationResponse confirmResponse = requestComponent.confirmVehicle(confirmRequest, headers);
+
+// 4. 报价
+TaiShanCrawlerQuotationRequest quoteRequest = buildQuotationRequest();
+TaiShanCrawlerQuotationResponse quoteResponse = requestComponent.quotation(quoteRequest, headers);
+
+// 5. 核保
+TaiShanCrawlerUnderwritingRequest underwritingRequest = buildUnderwritingRequest();
+TaiShanCrawlerUnderwritingResponse underwritingResponse = requestComponent.underwriting(underwritingRequest, headers);
+```
+
+## 部署说明
+
+### 环境要求
+- Java 17+
+- MySQL 8.0+
+- Redis 6.0+
+- MongoDB 4.4+
+- Maven 3.8+
+
+### 编译打包
+```bash
+mvn clean package -DskipTests
+```
+
+### 运行
+```bash
+java -jar quotation-taishan-1.0-SNAPSHOT.jar --spring.profiles.active=prod
+```
+
+## 注意事项
+
+1. **安全性**: 所有敏感信息请使用环境变量配置
+2. **监控**: 生产环境请开启日志和监控
+3. **缓存**: 合理设置缓存过期时间
+4. **限流**: 建议对第三方API调用进行限流控制
+5. **重试**: 建议对网络请求添加重试机制
+
+## 维护和更新
+
+- 定期检查第三方API的变更
+- 更新加密密钥
+- 监控系统运行状态
+- 及时处理异常情况
+
+## 联系方式
+
+如有问题请联系开发团队。

+ 29 - 0
tenant/insurance/quotation-taishan/pom.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>insurance</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>quotation-taishan</artifactId>
+
+    <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>
+    </dependencies>
+
+</project>

+ 138 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java

@@ -0,0 +1,138 @@
+package com.jzg.quotation.taishan.crawler.build;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationResponse;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 泰山财险爬虫报价结果构建器
+ * @author:
+ * @date:
+ **/
+public class TaiShanCrawlerQuoteResultsVoBuild {
+
+    /**
+     * 构建报价成功结果
+     * @param ordersNo
+     * @param quoteVo
+     * @param taiShanCrawlerQuotationResponse
+     * @return QuoteResultsVo
+     */
+    public static QuoteResultsVo buildQuoteResultsVo(String ordersNo, QuoteVo quoteVo, TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setOrdersNo(ordersNo);
+
+        // 设置交强险信息
+        if (taiShanCrawlerQuotationResponse.getResult().getCompulsoryInsurance() != null) {
+            quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(taiShanCrawlerQuotationResponse));
+        }
+
+        // 设置商业险信息
+        if (taiShanCrawlerQuotationResponse.getResult().getBusinessInsurance() != null) {
+            quoteResultsVo.setBiRiskInfoVo(buildBiRiskInfoVo(taiShanCrawlerQuotationResponse));
+            // 商业险险种信息
+            List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), taiShanCrawlerQuotationResponse.getResult().getBusinessInsurance().getItemKinds());
+            quoteResultsVo.setKindInfoVo(kindInfoVo);
+        }
+
+        // 交强保费 车船税 商业保费
+        buildPremium(quoteResultsVo, taiShanCrawlerQuotationResponse);
+        //设置报价状态:带核保
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+        return quoteResultsVo;
+    }
+
+    /**
+     * 构建交强险数据
+     * @param taiShanCrawlerQuotationResponse
+     * @return RiskInfoVo
+     */
+    public static RiskInfoVo buildCiRiskInfoVo(TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse) {
+        TaiShanCrawlerQuotationResponse.CompulsoryInsurance compulsoryInsurance = taiShanCrawlerQuotationResponse.getResult().getCompulsoryInsurance();
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        riskInfoVo.setStartDate(compulsoryInsurance.getProductInfo().getStartDate());
+        riskInfoVo.setEndDate(compulsoryInsurance.getProductInfo().getEndDate());
+        return riskInfoVo;
+    }
+
+    /**
+     * 构建商业险数据
+     * @param taiShanCrawlerQuotationResponse
+     * @return RiskInfoVo
+     */
+    public static RiskInfoVo buildBiRiskInfoVo(TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse) {
+        // 获取商业险数据
+        TaiShanCrawlerQuotationResponse.BusinessInsurance businessInsurance = taiShanCrawlerQuotationResponse.getResult().getBusinessInsurance();
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        riskInfoVo.setStartDate(businessInsurance.getProductInfo().getStartDate());
+        riskInfoVo.setEndDate(businessInsurance.getProductInfo().getEndDate());
+        return riskInfoVo;
+    }
+
+    /**
+     * 处理商业险信息
+     * @param kindInfoVo
+     * @param coverageListDTOS
+     * @return List<KindInfoVo> 处理后的险种列表
+     */
+    private static List<KindInfoVo> buildKindInfoVo(List<KindInfoVo> kindInfoVo, List<TaiShanCrawlerQuotationResponse.BusinessItemKind> coverageListDTOS) {
+        // 防御性编程:如果入参为空,直接返回,防止后续报错
+        if (kindInfoVo == null || coverageListDTOS == null || coverageListDTOS.isEmpty()) {
+            return kindInfoVo;
+        }
+        Map<String, TaiShanCrawlerQuotationResponse.BusinessItemKind> collect = coverageListDTOS.stream()
+                .collect(Collectors.toMap(TaiShanCrawlerQuotationResponse.BusinessItemKind::getKindCode, x -> x));
+
+        kindInfoVo.forEach(kind -> {
+            TaiShanCrawlerQuotationResponse.BusinessItemKind coverageListDTO = collect.get(kind.getKindCode());
+            if (Objects.nonNull(coverageListDTO) && coverageListDTO.getKindCode().equals(kind.getKindCode())) {
+                kind.setAmount(String.valueOf(coverageListDTO.getAmount()));//设置保额
+                kind.setPremium(String.valueOf(coverageListDTO.getPremium()));//设置保费
+            }
+        });
+        return kindInfoVo;
+    }
+
+    /**
+     * 设置商业险,交强险保费
+     * @param quoteResultsVo
+     * @param quotationResponse
+     */
+    private static void buildPremium(QuoteResultsVo quoteResultsVo, TaiShanCrawlerQuotationResponse quotationResponse) {
+        // 设置商业险保费
+        if (Objects.nonNull(quotationResponse.getResult().getBusinessInsurance())){
+            quoteResultsVo.getCosts().setBiPremium(String.valueOf(quotationResponse.getResult().getBusinessInsurance().getProductInfo().getPremium()));
+        }
+        // 设置交强险保费
+        if (Objects.nonNull(quotationResponse.getResult().getCompulsoryInsurance())) {
+            quoteResultsVo.getCosts().setCiPremium(String.valueOf(quotationResponse.getResult().getCompulsoryInsurance().getProductInfo().getPremium()));
+        }
+        // 设置车船税
+        if (Objects.nonNull(quotationResponse.getResult().getCompulsoryInsurance())) {
+            quoteResultsVo.getCosts().setVvTax(String.valueOf(quotationResponse.getResult().getCompulsoryInsurance().getCarShipTax().getSumTax()));
+        }
+    }
+
+    /**
+     * 处理报价失败结果
+     * @param taiShanCrawlerQuotationResponse
+     * @return QuoteResultsVo
+     */
+    public static QuoteResultsVo buildQuoteFailResultsVo(TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        // 交易流水号
+        quoteResultsVo.setCompanyOrderNo("");
+        // 报价失败提示
+        quoteResultsVo.setErrorMessage(taiShanCrawlerQuotationResponse.getMessage());
+        //设置报价状态
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+        return quoteResultsVo;
+    }
+
+}

+ 49 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanBuildingAttributionInformation.java

@@ -0,0 +1,49 @@
+package com.jzg.quotation.taishan.crawler.component;
+
+import com.jzg.quotation.taishan.crawler.entity.TaiShanCrawlerConfigureParameters;
+import com.jzg.quotation.taishan.crawler.entity.request.ProposalInfoDTO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+/**
+ * 泰山财险归属信息构建组件
+ * 用于构建机构、套餐、渠道等归属信息
+ *
+ * @author system
+ * @since 2025-01-01
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TaiShanBuildingAttributionInformation {
+
+    private final TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent;
+
+    /**
+     * 构建归属信息
+     *
+     * @param parameters 配置参数
+     * @param operatorCode 操作员代码
+     * @param headers 请求头
+     * @return 构建结果
+     */
+    public ProposalInfoDTO build(TaiShanCrawlerConfigureParameters parameters, String operatorCode, HttpHeaders headers) {
+        try {
+            // 机构查询
+            /*BoHaiCrawlerCompaniesRequest boHaiCrawlerCompaniesRequest = new BoHaiCrawlerCompaniesRequest(parameters.getCDptCde(), parameters.getLoginCompany(), operatorCode);
+            BoHaiCrawlerCompaniesResponse.ListDTO companies = boHaiCrawlerRequestComponent.companies(boHaiCrawlerCompaniesRequest, parameters.getCDptCde(), headers);
+            // 获取渠道信息
+            BoHaiCrawlerGetSaleInfoResponse saleInfo = boHaiCrawlerRequestComponent.getSaleInfo(operatorCode, headers);
+            // 渠道套餐查询
+            BoHaiCrawlerChannelPackagesRequest boHaiCrawlerChannelPackagesRequest = new BoHaiCrawlerChannelPackagesRequest(parameters, operatorCode);
+            BoHaiCrawlerChannelPackagesResponse boHaiCrawlerChannelPackagesResponse = boHaiCrawlerRequestComponent.channelPackages(boHaiCrawlerChannelPackagesRequest, parameters.getChannelPackages(), headers);
+            return new ProposalInfoDTO(companies, boHaiCrawlerChannelPackagesResponse, saleInfo, parameters.getLoginCompany());*/
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 231 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerCacheComponent.java

@@ -0,0 +1,231 @@
+package com.jzg.quotation.taishan.crawler.component;
+
+import com.alibaba.fastjson2.JSON;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.taishan.crawler.entity.po.TaiShanCrawlerOrder;
+import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description: 泰山财险爬虫缓存组件
+ * @author:
+ * @date:
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TaiShanCrawlerCacheComponent {
+
+    private final RedissonClient redissonClient;
+
+    private final TaiShanCrawlerProperties taiShanCrawlerProperties;
+
+    /**
+     * 缓存键前缀
+     */
+    private static final String CACHE_PREFIX = "taishan:crawler:";
+
+    /**
+     * Token缓存键
+     */
+    private static final String TOKEN_KEY = CACHE_PREFIX + "token:";
+
+    /**
+     * 订单信息缓存键
+     */
+    private static final String ORDER_KEY = CACHE_PREFIX + "order:";
+
+    /**
+     * 验证码缓存键
+     */
+    private static final String CAPTCHA_KEY = CACHE_PREFIX + "captcha:";
+
+    /**
+     * 会话缓存键
+     */
+    private static final String SESSION_KEY = CACHE_PREFIX + "session:";
+
+    /**
+     * Token缓存时间(小时)
+     */
+    private static final long TOKEN_EXPIRE_HOURS = 2;
+
+    /**
+     * 验证码缓存时间(分钟)
+     */
+    private static final long CAPTCHA_EXPIRE_MINUTES = 5;
+
+    /**
+     * 订单缓存时间(天)
+     */
+    private static final long ORDER_EXPIRE_DAYS = 7;
+
+    /**
+     * 会话缓存时间(小时)
+     */
+    private static final long SESSION_EXPIRE_HOURS = 1;
+
+
+    /**
+     * 缓存Token
+     *
+     * @param token Token字符串
+     */
+    public void cacheToken(String token) {
+        try {
+            String key = TOKEN_KEY ;
+            redissonClient.getBucket(key).set(token, TOKEN_EXPIRE_HOURS, TimeUnit.HOURS);
+        } catch (Exception e) {
+            log.error("Token缓存失败", e);
+            throw new SystemException("Token缓存失败");
+        }
+    }
+
+    /**
+     * 获取缓存的Token
+     *
+     * @return Token字符串
+     */
+    public String getToken() {
+        try {
+            String key = TOKEN_KEY ;
+            return (String) redissonClient.getBucket(key).get();
+        } catch (Exception e) {
+            log.error("获取Token失败", e);
+            return null;
+        }
+    }
+
+    /**
+     * 删除Token缓存
+     */
+    public void removeToken() {
+        try {
+            String key = TOKEN_KEY ;
+            redissonClient.getBucket(key).delete();
+        } catch (Exception e) {
+            log.error("Token缓存删除失败", e);
+        }
+    }
+
+    /**
+     * 缓存订单信息
+     *
+     * @param order 订单信息
+     */
+    public void cacheOrder(TaiShanCrawlerOrder order) {
+        try {
+            String key = ORDER_KEY + order.getOrderNo();
+            redissonClient.getBucket(key).set(JSON.toJSONString(order), ORDER_EXPIRE_DAYS, TimeUnit.DAYS);
+            log.info("订单信息缓存成功,订单号:{}", order.getOrderNo());
+        } catch (Exception e) {
+            log.error("订单信息缓存失败,订单号:{}", order.getOrderNo(), e);
+            throw new SystemException("订单信息缓存失败");
+        }
+    }
+
+    /**
+     * 获取缓存的订单信息
+     *
+     * @param orderNo 订单号
+     * @return 订单信息
+     */
+    public TaiShanCrawlerOrder getOrder(String orderNo) {
+        try {
+            String key = ORDER_KEY + orderNo;
+            String orderJson = (String) redissonClient.getBucket(key).get();
+            if (orderJson != null) {
+                return JSON.parseObject(orderJson, TaiShanCrawlerOrder.class);
+            }
+            return null;
+        } catch (Exception e) {
+            log.error("获取订单信息失败,订单号:{}", orderNo, e);
+            return null;
+        }
+    }
+
+    /**
+     * 缓存验证码
+     *
+     * @param captchaId 验证码ID
+     * @param captcha 验证码
+     */
+    public void cacheCaptcha(String captchaId, String captcha) {
+        try {
+            String key = CAPTCHA_KEY + captchaId;
+            redissonClient.getBucket(key).set(captcha, CAPTCHA_EXPIRE_MINUTES, TimeUnit.MINUTES);
+        } catch (Exception e) {
+            log.error("验证码缓存失败,ID:{}", captchaId, e);
+        }
+    }
+
+    /**
+     * 获取缓存的验证码
+     *
+     * @param captchaId 验证码ID
+     * @return 验证码
+     */
+    public String getCaptcha(String captchaId) {
+        try {
+            String key = CAPTCHA_KEY + captchaId;
+            return (String) redissonClient.getBucket(key).get();
+        } catch (Exception e) {
+            log.error("获取验证码失败,ID:{}", captchaId, e);
+            return null;
+        }
+    }
+
+    /**
+     * 缓存会话信息
+     *
+     * @param sessionId 会话ID
+     * @param sessionInfo 会话信息
+     */
+    public void cacheSession(String sessionId, String sessionInfo) {
+        try {
+            String key = SESSION_KEY + sessionId;
+            redissonClient.getBucket(key).set(sessionInfo, SESSION_EXPIRE_HOURS, TimeUnit.HOURS);
+            log.info("会话信息缓存成功,会话ID:{}", sessionId);
+        } catch (Exception e) {
+            log.error("会话信息缓存失败,会话ID:{}", sessionId, e);
+        }
+    }
+
+    /**
+     * 获取缓存的会话信息
+     *
+     * @param sessionId 会话ID
+     * @return 会话信息
+     */
+    public String getSession(String sessionId) {
+        try {
+            String key = SESSION_KEY + sessionId;
+            return (String) redissonClient.getBucket(key).get();
+        } catch (Exception e) {
+            log.error("获取会话信息失败,会话ID:{}", sessionId, e);
+            return null;
+        }
+    }
+
+    /**
+     * 删除会话信息
+     *
+     * @param sessionId 会话ID
+     */
+    public void removeSession(String sessionId) {
+        try {
+            String key = SESSION_KEY + sessionId;
+            redissonClient.getBucket(key).delete();
+            log.info("会话信息删除成功,会话ID:{}", sessionId);
+        } catch (Exception e) {
+            log.error("会话信息删除失败,会话ID:{}", sessionId, e);
+        }
+    }
+
+}

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

@@ -0,0 +1,150 @@
+package com.jzg.quotation.taishan.crawler.component;
+import com.alibaba.fastjson2.JSON;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.taishan.crawler.constant.enums.RequestUrl;
+import com.jzg.quotation.taishan.crawler.entity.request.*;
+import com.jzg.quotation.taishan.crawler.entity.response.*;
+import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import java.util.UUID;
+
+/**
+ * @description: 泰山财险爬虫请求组件
+ * @author:
+ * @date:
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class TaiShanCrawlerRequestComponent {
+
+    /**
+     * 循环次数
+     */
+    public static final int CIRCULATE_NUMBER = 3;
+
+    private final RequestComponent requestComponent;
+
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
+    private final TaiShanCrawlerProperties taiShanCrawlerProperties;
+
+
+
+    /**
+     * 创建Token
+     *
+     * @param operatorCode 操作员代码
+     * @param headers 请求头
+     * @return Token字符串
+     */
+    public String createToken(String operatorCode, HttpHeaders headers) {
+        //String url = RequestUrl.CREATE_TOKEN.getRequestUrl(taiShanCrawlerProperties.getBaseUrl());
+        String url = "";
+        MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
+        map.add("operatorCode", operatorCode);
+
+        TaiShanCrawlerBaseResponse<String> response = requestComponent.get(
+                url, map, "", TaiShanCrawlerBaseResponse.class, headers);
+
+        if (response.isSuccess()) {
+            return response.getResult();
+        } else {
+            throw new SystemException("创建Token失败: " + response.getReturnMessage());
+        }
+    }
+
+
+    /**
+     * 车型查询
+     *
+     * @param taiShanCrawlerCarRequest
+     * @param headers
+     * @return TaiShanCrawlerCarResponse
+     */
+    public TaiShanCrawlerCarResponse queryCarModels(TaiShanCrawlerCarRequest taiShanCrawlerCarRequest, HttpHeaders headers) {
+        String jsonString = JSON.toJSONString(taiShanCrawlerCarRequest);
+        log.info("TaiShanCrawlerCarRequest请求参数: {}", jsonString);
+        ResponseEntity<TaiShanCrawlerCarResponse> response = requestComponent.postWithMono(
+                RequestUrl.CAR.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                jsonString,
+                TaiShanCrawlerCarResponse.class,
+                headers
+        );
+        return response.getBody();
+    }
+
+    /**
+     * 获取车辆实际价值
+     *
+     * @param taiShanCrawlerGetActualValueRequest
+     * @param headers
+     * @return TaiShanCrawlerGetActualValueResponse
+     */
+    public TaiShanCrawlerGetActualValueResponse getActualValue(TaiShanCrawlerGetActualValueRequest taiShanCrawlerGetActualValueRequest, HttpHeaders headers) {
+        String jsonString = JSON.toJSONString(taiShanCrawlerGetActualValueRequest);
+        log.info("TaiShanCrawlerGetActualValueRequest请求参数: {}", jsonString);
+
+        ResponseEntity<TaiShanCrawlerGetActualValueResponse> response = requestComponent.postWithMono(
+                RequestUrl.ACTUALVALUE.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                jsonString,
+                TaiShanCrawlerGetActualValueResponse.class,
+                headers
+        );
+        return response.getBody();
+    }
+
+    /**
+     * 报价
+     *
+     * @param taiShanCrawlerQuotationRequest
+     * @param headers
+     * @return TaiShanCrawlerQuotationResponse 报价响应
+     */
+    public TaiShanCrawlerQuotationResponse quotation(TaiShanCrawlerQuotationRequest taiShanCrawlerQuotationRequest, HttpHeaders headers) {
+        String jsonString = JSON.toJSONString(taiShanCrawlerQuotationRequest);
+        log.info("TaiShanCrawlerQuotationRequest请求参数: {}", jsonString);
+
+        ResponseEntity<TaiShanCrawlerQuotationResponse> response = requestComponent.postWithMono(
+                RequestUrl.PRICE.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                jsonString,
+                TaiShanCrawlerQuotationResponse.class,
+                headers
+        );
+        return response.getBody();
+    }
+
+    /**
+     * 核保
+     *
+     * @param request 核保请求
+     * @param headers 请求头
+     * @return 核保响应
+     */
+    /*public TaiShanCrawlerUnderwritingResponse underwriting(TaiShanCrawlerUnderwritingRequest request, HttpHeaders headers) {
+        TaiShanCrawlerBaseRequest baseRequest = buildBaseRequest("UNDERWRITING", request);
+
+        ResponseEntity<TaiShanCrawlerBaseResponse> response = requestComponent.objectPost(
+                RequestUrl.UNDERWRITING.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                baseRequest,
+                TaiShanCrawlerBaseResponse.class,
+                headers
+        );
+
+        if (response.getBody().isSuccess()) {
+            return (TaiShanCrawlerUnderwritingResponse) response.getBody().getResult();
+        } else {
+            throw new SystemException("核保失败: " + response.getBody().getReturnMessage());
+        }
+    }*/
+
+}

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

@@ -0,0 +1,46 @@
+package com.jzg.quotation.taishan.crawler.constant.enums;
+
+/**
+ * @description: 泰山财险证书类型枚举
+ * @author:
+ * @date:
+ **/
+public enum CertifyType {
+
+    ID_CARD("01", "身份证"),
+    PASSPORT("02", "护照"),
+    OFFICER_CARD("03", "军官证"),
+    SOLDIER_CARD("04", "士兵证"),
+    RETURN_CERTIFICATE("05", "回乡证"),
+    HK_MACAU_PASS("06", "港澳通行证"),
+    TAIWAN_PASS("07", "台胞证"),
+    BUSINESS_LICENSE("08", "营业执照"),
+    ORGANIZATION_CODE("09", "组织机构代码证"),
+    TAX_REGISTRATION("10", "税务登记证"),
+    OTHER("99", "其他");
+
+    private final String code;
+    private final String description;
+
+    CertifyType(String code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public static CertifyType fromCode(String code) {
+        for (CertifyType certifyType : CertifyType.values()) {
+            if (certifyType.getCode().equals(code)) {
+                return certifyType;
+            }
+        }
+        return OTHER;
+    }
+}

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

@@ -0,0 +1,49 @@
+package com.jzg.quotation.taishan.crawler.constant.enums;
+
+/**
+ * @description: 泰山财险爬虫请求URL枚举
+ * @author:
+ * @date:
+ **/
+public enum RequestUrl {
+    // 车辆相关
+    CAR("/api_prod/ins/api/search/vehicle", "车型查询"),
+    ACTUALVALUE("/api_prod/ins/api/v1/actualvalue", "获取实际价格"),
+
+    // 报价相关
+    PRICE("/api_prod/ins/api/proposal/price", "报价"),
+    UNDERWRITING("/quotation/underwriting", "核保"),
+
+    // 影像上传
+    UPLOAD_IMAGE("/image/upload", "上传影像文件"),
+    UPLOAD_SUBMIT("/image/submit", "影像上传提交"),
+
+    // 支付相关
+    PAYMENTCERTINOQUERY("/payment/certiNoQuery", "支付凭证号查询"),
+    PAYMENTNOTICENO_GENERATION("/payment/noticeNoGeneration", "支付通知单号生成"),
+    QRCODE("/payment/qrcode", "生成支付链接"),
+
+    // 订单和保单相关
+    QUERY_ORDER_STATUS("/order/status", "查询订单状态"),
+    ELECTRON_POLICY_IO_DOWNLOAD("/policy/download", "下载电子保单");
+
+    private final String url;
+    private final String description;
+
+    RequestUrl(String url, String description) {
+        this.url = url;
+        this.description = description;
+    }
+
+    public String getRequestUrl(String baseUrl) {
+        return baseUrl + url;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.jzg.quotation.taishan.crawler.constant.enums;
+
+/**
+ * @description: 泰山财险爬虫响应代码枚举
+ * @author:
+ * @date:
+ **/
+public enum ResponseCode {
+
+    SUCCESS("200", "成功"),
+    SUCCESS1("H1", "接口调用成功"),
+    FAILURE("H3", "交强险发生重复投保,如继续投保商业险请取消勾选交强险");
+
+    private final String code;
+    private final String message;
+
+    ResponseCode(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+}

+ 67 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/TaiShanCrawlerConfigureParameters.java

@@ -0,0 +1,67 @@
+package com.jzg.quotation.taishan.crawler.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 泰山财险爬虫配置参数
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerConfigureParameters implements ConfigureParameters {
+
+    @Serial
+    private static final long serialVersionUID = 7708617198848601105L;
+    /**
+     * 保险公司代码
+     */
+    private String insuranceCompanyCode;
+
+    /**
+     * 渠道代码
+     */
+    private String channelCode;
+
+    /**
+     * 销售点代码
+     */
+    private String salesPointCode;
+
+    /**
+     * 操作员代码
+     */
+    private String operatorCode;
+
+    /**
+     * 机构代码
+     */
+    private String orgCode;
+
+    /**
+     * 用户名
+     */
+    private String username;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * API基础URL
+     */
+    private String baseUrl;
+
+    /**
+     * 备用API基础URL
+     */
+    private String baseUrl2;
+
+    /**
+     * Token
+     */
+    private String token;
+}

+ 112 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/entity/po/TaiShanCrawlerOrder.java

@@ -0,0 +1,112 @@
+package com.jzg.quotation.taishan.crawler.entity.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @description: 泰山财险爬虫订单实体
+ * @author:
+ * @date:
+ **/
+@Data
+@Document(collection = "taishan.crawler.order")
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaiShanCrawlerOrder {
+
+    /**
+     * MongoDB主键ID
+     */
+    @Id
+    private String id;
+
+    /**
+     * 系统内部订单号
+     */
+    private String ordersNo;
+
+    /**
+     * 泰山财险订单号(保司返回)
+     */
+    private String orderNo;
+
+    /**
+     * 业务唯一标识
+     */
+    private String busUniqueId;
+
+    /**
+     * 交强险投保单号
+     */
+    private String ciApplyNo;
+
+    /**
+     * 商业险投保单号
+     */
+    private String syApplyNo;
+
+    /**
+     * 非车投保单号
+     */
+    private String niApplyNumber;
+
+    /**
+     * 交强险保单号
+     */
+    private String ciPolicyNo;
+
+    /**
+     * 商业险保单号
+     */
+    private String biPolicyNo;
+
+    /**
+     * 非车险保单号
+     */
+    private String niPolicyNo;
+
+    /**
+     * 交强险保费
+     */
+    private String ciPremium;
+
+    /**
+     * 商业险保费
+     */
+    private String biPremium;
+
+    /**
+     * 总保费
+     */
+    private String totalPremium;
+
+    /**
+     * 报价是否成功
+     */
+    private Boolean quoteSuccess;
+
+    /**
+     * 错误信息
+     */
+    private String errorMsg;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

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

@@ -0,0 +1,697 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerCompaniesResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import java.io.Serial;
+import java.io.Serializable;
+/**
+ * 泰山保险报价投保信息DTO
+ * 用于封装保险报价请求中的投保相关信息
+ * 
+ * @author system
+ */
+@NoArgsConstructor
+@Data
+public class ProposalInfoDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -607088232798809605L;
+
+    /** 订单号 */
+    @JsonProperty("orderNo")
+    private String orderNo;
+    
+    /** 行驶证号 */
+    @JsonProperty("drivingsNo")
+    private String drivingsNo;
+    
+    /** 联合出单类型 1-商业 2-单交 */
+    @JsonProperty("mark")
+    private String mark;
+    
+    /** 交强险标识 */
+    @JsonProperty("jyMark")
+    private String jyMark;
+    
+    /** 公司部门代码 */
+    @JsonProperty("copdpt")
+    private String copdpt;
+    
+    /** 城市代码 */
+    @JsonProperty("cityCode")
+    private String cityCode;
+    
+    /** 登录公司 */
+    @JsonProperty("loginCompany")
+    private String loginCompany;
+    
+    /** 部门关联代码 */
+    @JsonProperty("dptRelCde")
+    private String dptRelCde;
+    
+    /** 状态 */
+    @JsonProperty("status")
+    private String status;
+    
+    /** 总保费 */
+    @JsonProperty("totalPremium")
+    private String totalPremium;
+    
+    /** 操作日期 */
+    @JsonProperty("operateDate")
+    private String operateDate;
+    
+    /** 电子保单必要性 */
+    @JsonProperty("nessElectronic")
+    private String nessElectronic;
+    
+    /** 电子保单完成状态 */
+    @JsonProperty("electronicFinish")
+    private String electronicFinish;
+    
+    /** 发送消息 */
+    @JsonProperty("sendMessage")
+    private String sendMessage;
+    
+    /** 电子保单 */
+    @JsonProperty("electronicPolicy")
+    private String electronicPolicy;
+    
+    /** 销售经理ID */
+    @JsonProperty("saleManagerId")
+    private String saleManagerId;
+    
+    /** 销售经理姓名 */
+    @JsonProperty("saleManagerName")
+    private String saleManagerName;
+    
+    /** 车牌号 */
+    @JsonProperty("licenseNumber")
+    private String licenseNumber;
+    
+    /** 组合产品代码 */
+    @JsonProperty("combinedProductCode")
+    private String combinedProductCode;
+    
+    /** 承保公司 */
+    @JsonProperty("underWriteCompany")
+    private String underWriteCompany;
+    
+    /** 承保机构名称 */
+    @JsonProperty("underwritingAgencyName")
+    private String underwritingAgencyName;
+    
+    /** 维修代码 */
+    @JsonProperty("repairCode")
+    private String repairCode;
+    
+    /** 维修名称 */
+    @JsonProperty("repairName")
+    private String repairName;
+    
+    /** 业务来源 */
+    @JsonProperty("businessSource")
+    private String businessSource;
+    
+    /** 机构代码 */
+    @JsonProperty("organizationCode")
+    private String organizationCode;
+    
+    /** 年份代码 */
+    @JsonProperty("yearCode")
+    private String yearCode;
+    
+    /** 序列代码 */
+    @JsonProperty("sequenceCode")
+    private String sequenceCode;
+    
+    /** 字符代码 */
+    @JsonProperty("characterCode")
+    private String characterCode;
+    
+    /** 代理人 */
+    @JsonProperty("agent")
+    private String agent;
+    
+    /** 代理人姓名 */
+    @JsonProperty("agentName")
+    private String agentName;
+    
+    /** 推荐人 */
+    @JsonProperty("referrer")
+    private String referrer;
+    
+    /** 推荐人身份证号 */
+    @JsonProperty("referrerIdentifyNo")
+    private String referrerIdentifyNo;
+    
+    /** 推荐人姓名 */
+    @JsonProperty("referrerName")
+    private String referrerName;
+    
+    /** 渠道代码 */
+    @JsonProperty("channelCode")
+    private String channelCode;
+    
+    /** 渠道名称 */
+    @JsonProperty("channelName")
+    private String channelName;
+    
+    /** 维修厂 */
+    @JsonProperty("repairFactory")
+    private String repairFactory;
+    
+    /** 维修厂名称 */
+    @JsonProperty("repairFactoryName")
+    private String repairFactoryName;
+    
+    /** 客服代码 */
+    @JsonProperty("customeServiceCode")
+    private String customeServiceCode;
+    
+    /** 销售代码 */
+    @JsonProperty("saleCode")
+    private String saleCode;
+    
+    /** 销售姓名 */
+    @JsonProperty("saleName")
+    private String saleName;
+    
+    /** 销售类型 */
+    @JsonProperty("saleType")
+    private String saleType;
+    
+    /** 销售编号 */
+    @JsonProperty("saleNo")
+    private String saleNo;
+    
+    /** 销售组代码 */
+    @JsonProperty("saleGroupCode")
+    private String saleGroupCode;
+    
+    /** 销售组名称 */
+    @JsonProperty("saleGroupName")
+    private String saleGroupName;
+    
+    /** 操作员代码 */
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+    
+    /** 操作员姓名 */
+    @JsonProperty("operatorName")
+    private String operatorName;
+    
+    /** 收费方式 */
+    @JsonProperty("feeType")
+    private String feeType;
+    
+    /** 争议解决方案 */
+    @JsonProperty("argueSolution")
+    private String argueSolution;
+    
+    /** 管理公司代码 */
+    @JsonProperty("manageCompanyCode")
+    private String manageCompanyCode;
+    
+    /** 公司性质 */
+    @JsonProperty("companyNature")
+    private String companyNature;
+    
+    /** 渠道来源 */
+    @JsonProperty("channelSource")
+    private String channelSource;
+    
+    /** 团队订单号 */
+    @JsonProperty("teamOrderNo")
+    private String teamOrderNo;
+    
+    /** 团队订单名称 */
+    @JsonProperty("teamOrderName")
+    private String teamOrderName;
+    
+    /** 报价ID */
+    @JsonProperty("quotePriceId")
+    private String quotePriceId;
+    
+    /** 代理销售 */
+    @JsonProperty("agentSales")
+    private String agentSales;
+    
+    /** 代理销售姓名 */
+    @JsonProperty("agentSaleName")
+    private String agentSaleName;
+    
+    /** 协议号 */
+    @JsonProperty("protocolNo")
+    private String protocolNo;
+    
+    /** 子协议号 */
+    @JsonProperty("subProtocolNo")
+    private String subProtocolNo;
+    
+    /** 农业标识 */
+    @JsonProperty("agricultureFlag")
+    private String agricultureFlag;
+    
+    /** 仲裁名称 */
+    @JsonProperty("arbitrationName")
+    private String arbitrationName;
+    
+    /** 来源 */
+    @JsonProperty("source")
+    private String source;
+    
+    /** 商业属性 */
+    @JsonProperty("cmmProp")
+    private String cmmProp;
+    
+    /** 车辆属性 */
+    @JsonProperty("avtProp")
+    private String avtProp;
+    
+    /** 团队属性 */
+    @JsonProperty("teamProp")
+    private String teamProp;
+    
+    /** 核保建议 */
+    @JsonProperty("underWriteAdvice")
+    private String underWriteAdvice;
+    
+    /** 关联保单号 */
+    @JsonProperty("relPolicyNo")
+    private String relPolicyNo;
+    
+    /** 总保费 */
+    @JsonProperty("sumPremium")
+    private String sumPremium;
+    
+    /** 是否电子保险 */
+    @JsonProperty("isElectronicInsurance")
+    private String isElectronicInsurance;
+    
+    /** 电子保险完成状态 */
+    @JsonProperty("electronicInsuranceFinish")
+    private String electronicInsuranceFinish;
+    
+    /** 是否身份采集 */
+    @JsonProperty("isIdentityColle")
+    private String isIdentityColle;
+    
+    /** 身份采集完成状态 */
+    @JsonProperty("identityColleFinish")
+    private String identityColleFinish;
+    
+    /** 是否验证码 */
+    @JsonProperty("isCaptcha")
+    private String isCaptcha;
+    
+    /** 验证码完成状态 */
+    @JsonProperty("captchaFinish")
+    private String captchaFinish;
+    
+    /** 机器码 */
+    @JsonProperty("machineCode")
+    private String machineCode;
+    
+    /** 销售禁用 */
+    @JsonProperty("salesDisabled")
+    private String salesDisabled;
+    
+    /** 推荐人禁用 */
+    @JsonProperty("referrerDisabled")
+    private String referrerDisabled;
+    
+    /** 部门代码 */
+    @JsonProperty("departmentCode")
+    private String departmentCode;
+    
+    /** 通知 */
+    @JsonProperty("inform")
+    private String inform;
+    
+    /** 是否大型产品 */
+    @JsonProperty("isDxProducts")
+    private String isDxProducts;
+    
+    /** 数据标识 */
+    @JsonProperty("dataFlag")
+    private String dataFlag;
+    
+    /** 推荐代码 */
+    @JsonProperty("recommendCode")
+    private String recommendCode;
+    
+    /** 加载模式 */
+    @JsonProperty("loadModel")
+    private String loadModel;
+    
+    /** 推荐子渠道 */
+    @JsonProperty("recSubChannel")
+    private String recSubChannel;
+    
+    /** 是否需要人脸识别 */
+    @JsonProperty("isNeedFaceRecognition")
+    private String isNeedFaceRecognition;
+    
+    /** 驾驶员标识 */
+    @JsonProperty("jsMark")
+    private String jsMark;
+    
+    /** EDR项目号 */
+    @JsonProperty("edrPrjNo")
+    private String edrPrjNo;
+    
+    /** 支付路径 */
+    @JsonProperty("payPath")
+    private String payPath;
+    
+    /** 渠道订单号 */
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+    
+    /** 续保合作 */
+    @JsonProperty("renewalCollaboration")
+    private String renewalCollaboration;
+    
+    /** 新渠道主代码 */
+    @JsonProperty("newChannelMajorCde")
+    private String newChannelMajorCde;
+    
+    /** 新渠道次代码 */
+    @JsonProperty("newChannelMinorCde")
+    private String newChannelMinorCde;
+    
+    /** 保单序列号 */
+    @JsonProperty("policySerialNo")
+    private String policySerialNo;
+    
+    /** 货币类型 */
+    @JsonProperty("currencyType")
+    private String currencyType;
+    
+    /** 是否互联网 */
+    @JsonProperty("isInternet")
+    private String isInternet;
+    
+    /** 销售员姓名 */
+    @JsonProperty("salesmanName")
+    private String salesmanName;
+    
+    /** 销售员身份证号 */
+    @JsonProperty("salesmanIdentifyNo")
+    private String salesmanIdentifyNo;
+    
+    /** 货币保费 */
+    @JsonProperty("currencyPrm")
+    private String currencyPrm;
+    
+    /** 汇率 */
+    @JsonProperty("exchangeRate")
+    private String exchangeRate;
+    
+    /** 总非车险保费 */
+    @JsonProperty("totalUncarPremium")
+    private String totalUncarPremium;
+    
+    /** 驾乘意外险标识 */
+    @JsonProperty("jabMark")
+    private String jabMark;
+    
+    /** 人伤保标识 */
+    @JsonProperty("rqbMark")
+    private String rqbMark;
+    
+    /** 特殊标识 */
+    @JsonProperty("specMark")
+    private String specMark;
+    
+    /** 前端介绍代码 */
+    @JsonProperty("frontIntroduceCde")
+    private String frontIntroduceCde;
+    
+    /** 前端介绍名称 */
+    @JsonProperty("frontIntroduceNme")
+    private String frontIntroduceNme;
+    
+    /** 关注微信标识 */
+    @JsonProperty("followWeChatFlag")
+    private String followWeChatFlag;
+    
+    /** 续保影像标识 */
+    @JsonProperty("renewImageFlag")
+    private String renewImageFlag;
+    
+    /** 线索ID */
+    @JsonProperty("leadsId")
+    private String leadsId;
+    
+    /** 渠道销售代码 */
+    @JsonProperty("chaSalesCde")
+    private String chaSalesCde;
+    
+    /** 渠道销售类型 */
+    @JsonProperty("chaSalesType")
+    private String chaSalesType;
+    
+    /** 业务标签 */
+    @JsonProperty("busiLabel")
+    private String busiLabel;
+    
+    /** 双录代码 */
+    @JsonProperty("dualRecordCde")
+    private String dualRecordCde;
+    
+    /** 双录类型 */
+    @JsonProperty("dualRecordType")
+    private String dualRecordType;
+    
+    /** 健康险标识 */
+    @JsonProperty("jkMark")
+    private String jkMark;
+    
+    /** 意外险标识 */
+    @JsonProperty("yyMark")
+    private String yyMark;
+    
+    /** 货运险标识 */
+    @JsonProperty("hyMark")
+    private String hyMark;
+    
+    /** 健康险住院标识 */
+    @JsonProperty("jkhosMark")
+    private String jkhosMark;
+    
+    /** 原始订单号 */
+    @JsonProperty("orderNoOrg")
+    private String orderNoOrg;
+    
+    /** 回溯标识 */
+    @JsonProperty("retrospectFlag")
+    private String retrospectFlag;
+    
+    /** 认证标识 */
+    @JsonProperty("authenticateFlag")
+    private String authenticateFlag;
+    
+    /** 自开业务类型 */
+    @JsonProperty("zkbsnsTyp")
+    private String zkbsnsTyp;
+    
+    /** 自开业务子类型 */
+    @JsonProperty("zkbsnsSubtyp")
+    private String zkbsnsSubtyp;
+    
+    /** 营销业务类型 */
+    @JsonProperty("yxbsnsTyp")
+    private String yxbsnsTyp;
+    
+    /** 银行代码 */
+    @JsonProperty("bankCde")
+    private String bankCde;
+    
+    /** 银行名称 */
+    @JsonProperty("bankName")
+    private String bankName;
+    
+    /** 银行子代码 */
+    @JsonProperty("bankSubCde")
+    private String bankSubCde;
+    
+    /** 银行子名称 */
+    @JsonProperty("bankSubName")
+    private String bankSubName;
+    
+    /** 关联部门代码 */
+    @JsonProperty("relDptCde")
+    private String relDptCde;
+    
+    /** 银行业务类型 */
+    @JsonProperty("bankBsnsTyp")
+    private String bankBsnsTyp;
+    
+    /** 交强险收费标识 */
+    @JsonProperty("jyChargeMark")
+    private String jyChargeMark;
+    
+    /** 核心订单号 */
+    @JsonProperty("orderNoCore")
+    private String orderNoCore;
+    
+    /** 交强险原保单号 */
+    @JsonProperty("jqPlyNoOrg")
+    private String jqPlyNoOrg;
+    
+    /** 商业险原保单号 */
+    @JsonProperty("syPlyNoOrg")
+    private String syPlyNoOrg;
+
+    /**
+     * 构造函数 - 根据渤海保险相关响应数据初始化投保信息
+     * 
+     * @param companies 公司信息
+     * @param response 渠道包响应
+     * @param saleInfo 销售信息
+     * @param loginCompany 登录公司
+     */
+    /*public ProposalInfoDTO(TaiShanCrawlerCompaniesResponse.ListDTO companies, TaiShanCrawlerChannelPackagesResponse response, TaiShanCrawlerGetSaleInfoResponse saleInfo, String loginCompany) {
+        this.orderNo = "";
+        this.drivingsNo = "";
+        this.mark = "2";
+        this.jyMark = "0";
+        this.copdpt = companies.getCDptCde();
+        String[] split = response.getDptRelCde().split(";");
+        if (split.length > 1) {
+            this.cityCode = split[1];
+        }
+        this.loginCompany = loginCompany;
+        this.dptRelCde = "";
+        this.status = "";
+        this.totalPremium = "";
+        this.operateDate = "";
+        this.nessElectronic = "1";
+        this.electronicFinish = "";
+        this.sendMessage = "";
+        this.electronicPolicy = "1";
+        this.saleManagerId = "";
+        this.saleManagerName = "";
+        this.licenseNumber = "";
+        this.combinedProductCode = response.getCombineProductCode();
+        this.underWriteCompany = companies.getCDptCde();
+        this.underwritingAgencyName = companies.getCDptNme();
+        this.repairCode = "";
+        this.repairName = "";
+        this.businessSource = response.getSource();
+        this.organizationCode = "";
+        this.yearCode = "";
+        this.sequenceCode = "";
+        this.characterCode = "";
+        this.agent = response.getAgencyCode();
+        this.agentName = response.getAgencyName();
+        this.referrer = response.getRecommend();
+        this.referrerIdentifyNo = "";
+        this.referrerName = "";
+        this.channelCode = response.getChannelCode();
+        this.channelName = "";
+        this.repairFactory = response.getReworkPlantCode();
+        this.repairFactoryName = "";
+        this.customeServiceCode = "";
+        this.saleCode = "";
+        this.saleName = "";
+        this.saleType = "";
+        this.saleNo = "";
+        this.saleGroupCode = "";
+        this.saleGroupName = "";
+        this.operatorCode = saleInfo.getRecommendCode();
+        this.operatorName = saleInfo.getRecommendName();
+        // 收费方式
+        this.feeType = "10";
+        this.argueSolution = "007001";
+        this.manageCompanyCode = companies.getManageCompanyCode();
+        this.companyNature = companies.getCompanyNature();
+        this.channelSource = "";
+        this.teamOrderNo = "";
+        this.teamOrderName = "";
+        this.quotePriceId = "";
+        this.agentSales = "";
+        this.agentSaleName = "";
+        this.protocolNo = "";
+        this.subProtocolNo = "";
+        this.agricultureFlag = "";
+        this.arbitrationName = "";
+        this.source = "";
+        this.cmmProp = "";
+        this.avtProp = "";
+        this.teamProp = "";
+        this.underWriteAdvice = "";
+        this.relPolicyNo = "";
+        this.sumPremium = "";
+        this.isElectronicInsurance = "0";
+        this.electronicInsuranceFinish = "";
+        this.isIdentityColle = "";
+        this.identityColleFinish = "";
+        this.isCaptcha = "1";
+        this.captchaFinish = "";
+        this.machineCode = "";
+        this.salesDisabled = "0";
+        this.referrerDisabled = "";
+        this.departmentCode = companies.getDepartmentCode();
+        this.inform = "";
+        this.isDxProducts = "0";
+        this.dataFlag = "";
+        this.recommendCode = "";
+        this.loadModel = response.getLoadModel();
+        // 推荐子渠道
+        this.recSubChannel = response.getRecSubChannel();
+        this.isNeedFaceRecognition = "";
+        this.jsMark = "0";
+        this.edrPrjNo = "";
+        this.payPath = "";
+        this.channelOrderNo = "";
+        this.renewalCollaboration = "0";
+        this.newChannelMajorCde = "";
+        this.newChannelMinorCde = "";
+        this.policySerialNo = "";
+        this.currencyType = "";
+        this.isInternet = "";
+        this.salesmanName = "";
+        this.salesmanIdentifyNo = "";
+        this.currencyPrm = "";
+        this.exchangeRate = "";
+        this.totalUncarPremium = "";
+        this.jabMark = "0";
+        this.rqbMark = "0";
+        this.specMark = "0";
+        this.frontIntroduceCde = "";
+        this.frontIntroduceNme = "";
+        this.followWeChatFlag = "0";
+        this.renewImageFlag = "0";
+        this.leadsId = "";
+        this.chaSalesCde = "";
+        this.chaSalesType = "";
+        this.busiLabel = "";
+        this.dualRecordCde = "";
+        this.dualRecordType = "";
+        this.jkMark = "0";
+        this.yyMark = "0";
+        this.hyMark = "0";
+        this.jkhosMark = "0";
+        this.orderNoOrg = "";
+        this.retrospectFlag = "";
+        this.authenticateFlag = "";
+        this.zkbsnsTyp = "";
+        this.zkbsnsSubtyp = "";
+        this.yxbsnsTyp = "";
+        this.bankCde = "";
+        this.bankName = "";
+        this.bankSubCde = "";
+        this.bankSubName = "";
+        this.relDptCde = "";
+        this.bankBsnsTyp = "";
+        this.jyChargeMark = "0";
+        this.orderNoCore = "";
+        this.jqPlyNoOrg = "";
+        this.syPlyNoOrg = "";
+    }*/
+
+}

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

@@ -0,0 +1,21 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 泰山财险爬虫基础请求实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerBaseRequest implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 5434844101285864911L;
+
+
+}

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

@@ -0,0 +1,85 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 泰山财险爬虫车型查询请求实体
+ * @author:
+ * @date:
+ **/
+@Data
+@NoArgsConstructor
+public class TaiShanCrawlerCarRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6588391261872927574L;
+
+    /**
+     * 车架号(VIN码)
+     */
+    @JsonProperty("frameNo")
+    @JSONField(ordinal = 1)
+    private String frameNo;
+
+    /**
+     * 产品代码
+     */
+    @JsonProperty("productCode")
+    @JSONField(ordinal = 2)
+    private String productCode;
+
+    /**
+     * 车辆型号
+     */
+    @JsonProperty("carModelNo")
+    @JSONField(ordinal = 3)
+    private String carModelNo;
+
+    /**
+     * 发动机号:发动机的唯一识别编码
+     */
+    @JsonProperty("engineNumber")
+    @JSONField(ordinal = 4)
+    private String engineNumber;
+
+    /**
+     * 是否精确查询:1=精确匹配,0=模糊查询
+     */
+    @JsonProperty("isAccurate")
+    @JSONField(ordinal = 5)
+    private String isAccurate;
+
+    /**
+     * 车型代码:标准化的车型编码(当前为空)
+     */
+    @JsonProperty("modelCode")
+    @JSONField(ordinal = 6)
+    private String modelCode;
+
+    /**
+     * 原始车型代码
+     */
+    @JsonProperty("origModelCde")
+    @JSONField(ordinal = 7)
+    private String origModelCde;
+
+    /**
+     * 部门代码
+     */
+    @JsonProperty("departmentCode")
+    @JSONField(ordinal = 8)
+    private String departmentCode;
+
+    /**
+     * 首次登记日期:车辆初次上牌/登记的日期
+     */
+    @JsonProperty("firstLoginDate")
+    @JSONField(ordinal = 9)
+    private String firstLoginDate;
+}

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

@@ -0,0 +1,27 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫校验Token请求实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerCheckTokenRequest {
+
+    /**
+     * Token
+     */
+    private String token;
+
+    /**
+     * 操作员代码
+     */
+    private String operatorCode;
+
+    /**
+     * 会话ID
+     */
+    private String sessionId;
+}

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

@@ -0,0 +1,119 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 泰山财险爬虫获取车辆实际价值请求实体类
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerGetActualValueRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2190496123695048020L;
+
+    /**
+     * 产品代码:保险产品编号
+     */
+    @JsonProperty("productCode")
+    @JSONField(name = "productCode", ordinal = 1)
+    private String productCode;
+
+    /**
+     * 购置价格:新车购置价(不含税)
+     */
+    @JsonProperty("purchaseValue")
+    @JSONField(name = "purchaseValue", ordinal = 2)
+    private String purchaseValue;
+
+    /**
+     * 注册日期:车辆首次登记时间
+     */
+    @JsonProperty("registerDate")
+    @JSONField(name = "registerDate", ordinal = 3)
+    private String registerDate;
+
+    /**
+     * 车辆类型:365001=客车,365002=货车
+     */
+    @JsonProperty("rideType")
+    @JSONField(name = "rideType", ordinal = 4)
+    private String rideType;
+
+    /**
+     * 车辆种类:详细分类代码
+     */
+    @JsonProperty("rideKind")
+    @JSONField(name = "rideKind", ordinal = 5)
+    private String rideKind;
+
+    /**
+     * 起保日期:保险生效开始时间
+     */
+    @JsonProperty("startDate")
+    @JSONField(name = "startDate", ordinal = 6)
+    private String startDate;
+
+    /**
+     * 使用性质:374001=家用,374002=营运
+     */
+    @JsonProperty("usage")
+    @JSONField(name = "usage", ordinal = 7)
+    private String usage;
+
+    /**
+     * 车辆名称:完整型号
+     */
+    @JsonProperty("vehicleName")
+    @JSONField(name = "vehicleName", ordinal = 8)
+    private String vehicleName;
+
+    /**
+     * 能源类型:0=燃油,1=混动,2=纯电
+     */
+    @JsonProperty("modelEneryType")
+    @JSONField(name = "modelEneryType", ordinal = 9)
+    private String modelEneryType;
+
+    /**
+     * 座位数:核定载客人数
+     */
+    @JsonProperty("seatNum")
+    @JSONField(name = "seatNum", ordinal = 10)
+    private String seatNum;
+
+    /**
+     * 原始型号名称:初始登记型号
+     */
+    @JsonProperty("origModelNme")
+    @JSONField(name = "origModelNme", ordinal = 11)
+    private String origModelNme;
+
+    /**
+     * 整备质量:车辆自重(KG)
+     */
+    @JsonProperty("origQualityMax")
+    @JSONField(name = "origQualityMax", ordinal = 12)
+    private String origQualityMax;
+
+    /**
+     * 吨位:载重量(乘用车为0)
+     */
+    @JsonProperty("tonage")
+    @JSONField(name = "tonage", ordinal = 13)
+    private String tonage;
+
+    /**
+     * 业务类型:A=家用,B=营运,C=出租
+     */
+    @JsonProperty("appTyp")
+    @JSONField(name = "appTyp", ordinal = 14)
+    private String appTyp;
+
+}

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

@@ -0,0 +1,2240 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @description: 泰山财险爬虫报价请求实体类
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerQuotationRequest implements Serializable {
+
+
+    @Serial
+    private static final long serialVersionUID = 3480840000578223016L;
+
+    /**
+     * 投保人信息
+     */
+    @JsonProperty("applicantInfo")
+    @JSONField(name = "applicantInfo", ordinal = 1)
+    private ApplicantInfo applicantInfo;
+
+    /**
+     * 系数信息(用于保费浮动计算)
+     */
+    @JsonProperty("coefficientInfo")
+    @JSONField(name = "coefficientInfo", ordinal = 2)
+    private CoefficientInfo coefficientInfo;
+
+    /**
+     * 商业险信息
+     */
+    @JsonProperty("businessInsurance")
+    @JSONField(name = "businessInsurance", ordinal = 3)
+    private BusinessInsurance businessInsurance;
+
+    /**
+     * 交强险信息
+     */
+    @JsonProperty("compulsoryInsurance")
+    @JSONField(name = "compulsoryInsurance", ordinal = 4)
+    private CompulsoryInsurance compulsoryInsurance;
+
+    /**
+     * 被保险人信息(同投保人)
+     */
+    @JsonProperty("insuredInfo")
+    @JSONField(name = "insuredInfo", ordinal = 5)
+    private InsuredInfo insuredInfo;
+
+    /**
+     * 投保单信息
+     */
+    @JsonProperty("proposalInfo")
+    @JSONField(name = "proposalInfo", ordinal = 6)
+    private ProposalInfo proposalInfo;
+
+    /**
+     * 车辆信息
+     */
+    @JsonProperty("vehicleInfo")
+    @JSONField(name = "vehicleInfo", ordinal = 7)
+    private VehicleInfo vehicleInfo;
+
+    /**
+     * 车主信息
+     */
+    @JsonProperty("vehicleOwnerInfo")
+    @JSONField(name = "vehicleOwnerInfo", ordinal = 8)
+    private VehicleOwnerInfo vehicleOwnerInfo;
+
+    /**
+     * 扁平化车辆信息
+     */
+    @JsonProperty("flatvhlInfo")
+    @JSONField(name = "flatvhlInfo", ordinal = 9)
+    private Object flatvhlInfo;
+
+    /**
+     * 家庭财产险
+     */
+    @JsonProperty("householdInsurance")
+    @JSONField(name = "householdInsurance", ordinal = 10)
+    private Object householdInsurance;
+
+    /**
+     * 国内货运险
+     */
+    @JsonProperty("dpInsurance")
+    @JSONField(name = "dpInsurance", ordinal = 11)
+    private Object dpInsurance;
+
+    /**
+     * 盗抢险
+     */
+    @JsonProperty("diInsurance")
+    @JSONField(name = "diInsurance", ordinal = 12)
+    private Object diInsurance;
+
+    /**
+     * 摩托车险
+     */
+    @JsonProperty("mcInsurance")
+    @JSONField(name = "mcInsurance", ordinal = 13)
+    private Object mcInsurance;
+
+    /**
+     * 玻璃单独破碎险
+     */
+    @JsonProperty("glInsurance")
+    @JSONField(name = "glInsurance", ordinal = 14)
+    private Object glInsurance;
+
+    /**
+     * 特种车险
+     */
+    @JsonProperty("tfInsurance")
+    @JSONField(name = "tfInsurance", ordinal = 15)
+    private Object tfInsurance;
+
+    /**
+     * 意外险
+     */
+    @JsonProperty("acInsurance")
+    @JSONField(name = "acInsurance", ordinal = 16)
+    private Object acInsurance;
+
+    /**
+     * 雇主责任险
+     */
+    @JsonProperty("gsInsurance")
+    @JSONField(name = "gsInsurance", ordinal = 17)
+    private Object gsInsurance;
+
+    /**
+     * 船舶险
+     */
+    @JsonProperty("mtInsurance")
+    @JSONField(name = "mtInsurance", ordinal = 18)
+    private Object mtInsurance;
+
+    /**
+     * 自行车险
+     */
+    @JsonProperty("btInsurance")
+    @JSONField(name = "btInsurance", ordinal = 19)
+    private Object btInsurance;
+
+    /**
+     * 家财险B款
+     */
+    @JsonProperty("householdBInsurance")
+    @JSONField(name = "householdBInsurance", ordinal = 20)
+    private Object householdBInsurance;
+
+    /**
+     * 家财险C款
+     */
+    @JsonProperty("householdCInsurance")
+    @JSONField(name = "householdCInsurance", ordinal = 21)
+    private Object householdCInsurance;
+
+    /**
+     * 个人意外险
+     */
+    @JsonProperty("paInsurance")
+    @JSONField(name = "paInsurance", ordinal = 22)
+    private Object paInsurance;
+
+    /**
+     * 健康险
+     */
+    @JsonProperty("hlInsurance")
+    @JSONField(name = "hlInsurance", ordinal = 23)
+    private Object hlInsurance;
+
+    /**
+     * 货运险
+     */
+    @JsonProperty("htInsurance")
+    @JSONField(name = "htInsurance", ordinal = 24)
+    private Object htInsurance;
+
+    /**
+     * 退货运费险
+     */
+    @JsonProperty("rtInsurance")
+    @JSONField(name = "rtInsurance", ordinal = 25)
+    private Object rtInsurance;
+
+    /**
+     * 门诊险
+     */
+    @JsonProperty("opdInsurance")
+    @JSONField(name = "opdInsurance", ordinal = 26)
+    private Object opdInsurance;
+
+    /**
+     * 投保人信息内部类
+     */
+    @Data
+    public static class ApplicantInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 联系地址
+         */
+        @JsonProperty("address")
+        @JSONField(name = "address", ordinal = 1)
+        private String address;
+
+        /**
+         * 城市代码(太原市)
+         */
+        @JsonProperty("city")
+        @JSONField(name = "city", ordinal = 2)
+        private String city;
+
+        /**
+         * 客户类型:1=个人,2=企业
+         */
+        @JsonProperty("clientType")
+        @JSONField(name = "clientType", ordinal = 3)
+        private String clientType;
+
+        /**
+         * 工作单位
+         */
+        @JsonProperty("workDpt")
+        @JSONField(name = "workDpt", ordinal = 4)
+        private String workDpt;
+
+        /**
+         * 区县代码
+         */
+        @JsonProperty("county")
+        @JSONField(name = "county", ordinal = 5)
+        private String county;
+
+        /**
+         * 电子邮箱
+         */
+        @JsonProperty("email")
+        @JSONField(name = "email", ordinal = 6)
+        private String email;
+
+        /**
+         * 投保人关系
+         */
+        @JsonProperty("appLink")
+        @JSONField(name = "appLink", ordinal = 7)
+        private String appLink;
+
+        /**
+         * 性别:106001=男,106002=女
+         */
+        @JsonProperty("gender")
+        @JSONField(name = "gender", ordinal = 8)
+        private String gender;
+
+        /**
+         * 证件有效期截止日期
+         */
+        @JsonProperty("identifyEndDate")
+        @JSONField(name = "identifyEndDate", ordinal = 9)
+        private String identifyEndDate;
+
+        /**
+         * 证件有效期标识:0=有期限,1=长期
+         */
+        @JsonProperty("identifyEndDateMrk")
+        @JSONField(name = "identifyEndDateMrk", ordinal = 10)
+        private String identifyEndDateMrk;
+
+        /**
+         * 身份证号
+         */
+        @JsonProperty("identifyNo")
+        @JSONField(name = "identifyNo", ordinal = 11)
+        private String identifyNo;
+
+        /**
+         * 证件类型:01=身份证
+         */
+        @JsonProperty("identifyType")
+        @JSONField(name = "identifyType", ordinal = 12)
+        private String identifyType;
+
+        /**
+         * 手机号
+         */
+        @JsonProperty("mobile")
+        @JSONField(name = "mobile", ordinal = 13)
+        private String mobile;
+
+        /**
+         * 客户编号(系统内部)
+         */
+        @JsonProperty("personId")
+        @JSONField(name = "personId", ordinal = 14)
+        private String personId;
+
+        /**
+         * 姓名
+         */
+        @JsonProperty("personName")
+        @JSONField(name = "personName", ordinal = 15)
+        private String personName;
+
+        /**
+         * 邮政编码
+         */
+        @JsonProperty("postCode")
+        @JSONField(name = "postCode", ordinal = 16)
+        private String postCode;
+
+        /**
+         * 省份代码(山西省)
+         */
+        @JsonProperty("province")
+        @JSONField(name = "province", ordinal = 17)
+        private String province;
+
+        /**
+         * 固定电话
+         */
+        @JsonProperty("tel")
+        @JSONField(name = "tel", ordinal = 18)
+        private String tel;
+
+        /**
+         * 职业代码
+         */
+        @JsonProperty("occupation")
+        @JSONField(name = "occupation", ordinal = 19)
+        private String occupation;
+
+        /**
+         * 工作地址
+         */
+        @JsonProperty("workArea")
+        @JSONField(name = "workArea", ordinal = 20)
+        private String workArea;
+
+        /**
+         * 是否非本地居民:0=否,1=是
+         */
+        @JsonProperty("nonResidents")
+        @JSONField(name = "nonResidents", ordinal = 21)
+        private String nonResidents;
+
+        /**
+         * 所属部门代码
+         */
+        @JsonProperty("ownDpt")
+        @JSONField(name = "ownDpt", ordinal = 22)
+        private String ownDpt;
+
+        /**
+         * 关系部门代码
+         */
+        @JsonProperty("relationDpt")
+        @JSONField(name = "relationDpt", ordinal = 23)
+        private String relationDpt;
+
+        /**
+         * 币种:人民币
+         */
+        @JsonProperty("currency")
+        @JSONField(name = "currency", ordinal = 24)
+        private String currency;
+
+        /**
+         * 所属地区:中国
+         */
+        @JsonProperty("ownAreaCde")
+        @JSONField(name = "ownAreaCde", ordinal = 25)
+        private String ownAreaCde;
+
+        /**
+         * 法人姓名(企业客户)
+         */
+        @JsonProperty("legalNme")
+        @JSONField(name = "legalNme", ordinal = 26)
+        private String legalNme;
+
+        /**
+         * 法人证件类型
+         */
+        @JsonProperty("legalCertfCls")
+        @JSONField(name = "legalCertfCls", ordinal = 27)
+        private String legalCertfCls;
+
+        /**
+         * 法人证件号
+         */
+        @JsonProperty("legalCertfCde")
+        @JSONField(name = "legalCertfCde", ordinal = 28)
+        private String legalCertfCde;
+
+        /**
+         * 法人证件有效期
+         */
+        @JsonProperty("legalCertfEndTm")
+        @JSONField(name = "legalCertfEndTm", ordinal = 29)
+        private String legalCertfEndTm;
+
+        /**
+         * 控股股东姓名
+         */
+        @JsonProperty("holdingNme")
+        @JSONField(name = "holdingNme", ordinal = 30)
+        private String holdingNme;
+
+        /**
+         * 控股股东证件类型
+         */
+        @JsonProperty("holdingCertfCls")
+        @JSONField(name = "holdingCertfCls", ordinal = 31)
+        private String holdingCertfCls;
+
+        /**
+         * 控股股东证件号
+         */
+        @JsonProperty("holdingCertfCde")
+        @JSONField(name = "holdingCertfCde", ordinal = 32)
+        private String holdingCertfCde;
+
+        /**
+         * 控股股东证件有效期
+         */
+        @JsonProperty("holdingCertfEndTm")
+        @JSONField(name = "holdingCertfEndTm", ordinal = 33)
+        private String holdingCertfEndTm;
+
+        /**
+         * 负责人姓名
+         */
+        @JsonProperty("chargeNme")
+        @JSONField(name = "chargeNme", ordinal = 34)
+        private String chargeNme;
+
+        /**
+         * 负责人证件类型
+         */
+        @JsonProperty("chargeCertfCls")
+        @JSONField(name = "chargeCertfCls", ordinal = 35)
+        private String chargeCertfCls;
+
+        /**
+         * 负责人证件号
+         */
+        @JsonProperty("chargeCertfCde")
+        @JSONField(name = "chargeCertfCde", ordinal = 36)
+        private String chargeCertfCde;
+
+        /**
+         * 负责人证件有效期
+         */
+        @JsonProperty("chargeCertfEndTm")
+        @JSONField(name = "chargeCertfEndTm", ordinal = 37)
+        private String chargeCertfEndTm;
+
+        /**
+         * 经营范围(企业客户)
+         */
+        @JsonProperty("businessScope")
+        @JSONField(name = "businessScope", ordinal = 38)
+        private String businessScope;
+
+        /**
+         * 是否车主:1=是,0=否
+         */
+        @JsonProperty("isOwner")
+        @JSONField(name = "isOwner", ordinal = 39)
+        private String isOwner;
+
+        /**
+         * 是否新市民
+         */
+        @JsonProperty("newCitizens")
+        @JSONField(name = "newCitizens", ordinal = 40)
+        private String newCitizens;
+
+        /**
+         * 是否电子签名:1=是
+         */
+        @JsonProperty("isElectronicSign")
+        @JSONField(name = "isElectronicSign", ordinal = 41)
+        private String isElectronicSign;
+
+        /**
+         * 是否北京电子投保人
+         */
+        @JsonProperty("isBjElectronicApplicant")
+        @JSONField(name = "isBjElectronicApplicant", ordinal = 42)
+        private String isBjElectronicApplicant;
+
+        /**
+         * 法人证件有效期标识
+         */
+        @JsonProperty("legalCertfEndTmMrk")
+        @JSONField(name = "legalCertfEndTmMrk", ordinal = 43)
+        private String legalCertfEndTmMrk;
+
+        /**
+         * 控股股东证件有效期标识
+         */
+        @JsonProperty("holdingCertfEndTmMrk")
+        @JSONField(name = "holdingCertfEndTmMrk", ordinal = 44)
+        private String holdingCertfEndTmMrk;
+
+        /**
+         * 负责人证件有效期标识
+         */
+        @JsonProperty("chargeCertfEndTmMrk")
+        @JSONField(name = "chargeCertfEndTmMrk", ordinal = 45)
+        private String chargeCertfEndTmMrk;
+
+        /**
+         * 年收入
+         */
+        @JsonProperty("inCome")
+        @JSONField(name = "inCome", ordinal = 46)
+        private String inCome;
+
+        /**
+         * 工作单位名称
+         */
+        @JsonProperty("workdptName")
+        @JSONField(name = "workdptName", ordinal = 47)
+        private String workdptName;
+
+        /**
+         * 家庭住址
+         */
+        @JsonProperty("homeAddr")
+        @JSONField(name = "homeAddr", ordinal = 48)
+        private String homeAddr;
+
+        /**
+         * 注册地址(企业)
+         */
+        @JsonProperty("registeredAddr")
+        @JSONField(name = "registeredAddr", ordinal = 49)
+        private String registeredAddr;
+
+        /**
+         * 注册资本
+         */
+        @JsonProperty("registeredCapital")
+        @JSONField(name = "registeredCapital", ordinal = 50)
+        private String registeredCapital;
+
+        /**
+         * 注册资本币种
+         */
+        @JsonProperty("registeredcapitalCur")
+        @JSONField(name = "registeredcapitalCur", ordinal = 51)
+        private String registeredcapitalCur;
+
+        /**
+         * 行业分类
+         */
+        @JsonProperty("industry")
+        @JSONField(name = "industry", ordinal = 52)
+        private String industry;
+
+        /**
+         * 是否小微企业
+         */
+        @JsonProperty("smallBiz")
+        @JSONField(name = "smallBiz", ordinal = 53)
+        private String smallBiz;
+
+        /**
+         * 证件签发日期
+         */
+        @JsonProperty("identifyStartDate")
+        @JSONField(name = "identifyStartDate", ordinal = 54)
+        private String identifyStartDate;
+    }
+
+    /**
+     * 系数信息内部类(用于保费浮动计算)
+     */
+    @Data
+    public static class CoefficientInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 交强险计算结束时间
+         */
+        @JsonProperty("jqCalEndTm")
+        @JSONField(name = "jqCalEndTm", ordinal = 1)
+        private String jqCalEndTm;
+
+        /**
+         * 交强险计算开始时间
+         */
+        @JsonProperty("jqCalStrtTm")
+        @JSONField(name = "jqCalStrtTm", ordinal = 2)
+        private String jqCalStrtTm;
+
+        /**
+         * 交强险无折扣原因
+         */
+        @JsonProperty("jqNdiscRsn")
+        @JSONField(name = "jqNdiscRsn", ordinal = 3)
+        private String jqNdiscRsn;
+
+        /**
+         * 交强险预留字段3
+         */
+        @JsonProperty("jqResvNum3")
+        @JSONField(name = "jqResvNum3", ordinal = 4)
+        private String jqResvNum3;
+
+        /**
+         * 交强险预留字段4
+         */
+        @JsonProperty("jqResvNum4")
+        @JSONField(name = "jqResvNum4", ordinal = 5)
+        private String jqResvNum4;
+
+        /**
+         * 商业险历史出险记录
+         */
+        @JsonProperty("syAgoClmRec")
+        @JSONField(name = "syAgoClmRec", ordinal = 6)
+        private String syAgoClmRec;
+
+        /**
+         * 商业险历史出险系数
+         */
+        @JsonProperty("syAgoClmRecCoeff")
+        @JSONField(name = "syAgoClmRecCoeff", ordinal = 7)
+        private String syAgoClmRecCoeff;
+
+        /**
+         * 商业险无赔款优待系数(NCD)
+         */
+        @JsonProperty("syNclmDisc")
+        @JSONField(name = "syNclmDisc", ordinal = 8)
+        private String syNclmDisc;
+
+        /**
+         * 商业险自主定价系数
+         */
+        @JsonProperty("syAutonomyCoef")
+        @JSONField(name = "syAutonomyCoef", ordinal = 9)
+        private String syAutonomyCoef;
+
+        /**
+         * 商业险计算结束时间
+         */
+        @JsonProperty("syCalEndTm")
+        @JSONField(name = "syCalEndTm", ordinal = 10)
+        private String syCalEndTm;
+
+        /**
+         * 商业险计算开始时间
+         */
+        @JsonProperty("syCalStrtTm")
+        @JSONField(name = "syCalStrtTm", ordinal = 11)
+        private String syCalStrtTm;
+
+        /**
+         * 商业险渠道系数
+         */
+        @JsonProperty("syChaCoef")
+        @JSONField(name = "syChaCoef", ordinal = 12)
+        private String syChaCoef;
+
+        /**
+         * 商业险交通违法系数
+         */
+        @JsonProperty("syTrafIrr")
+        @JSONField(name = "syTrafIrr", ordinal = 13)
+        private String syTrafIrr;
+
+        /**
+         * 自主定价预留字段
+         */
+        @JsonProperty("resvNumAutonomy")
+        @JSONField(name = "resvNumAutonomy", ordinal = 14)
+        private String resvNumAutonomy;
+    }
+
+    /**
+     * 商业险信息内部类
+     */
+    @Data
+    public static class BusinessInsurance implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 险种列表
+         */
+        @JsonProperty("itemKinds")
+        @JSONField(name = "itemKinds", ordinal = 1)
+        private List<ItemKind> itemKinds;
+
+        /**
+         * 产品信息
+         */
+        @JsonProperty("productInfo")
+        @JSONField(name = "productInfo", ordinal = 2)
+        private ProductInfo productInfo;
+
+        /**
+         * 特殊信息列表
+         */
+        @JsonProperty("specialInfos")
+        @JSONField(name = "specialInfos", ordinal = 3)
+        private List<Object> specialInfos;
+
+        /**
+         * 险种类别内部类
+         */
+        @Data
+        public static class ItemKind implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 1L;
+
+            /**
+             * 是否禁用
+             */
+            @JsonProperty("disabled")
+            @JSONField(name = "disabled", ordinal = 1)
+            private Boolean disabled;
+
+            /**
+             * 不计免赔标志
+             */
+            @JsonProperty("noDeductibleFlag")
+            @JSONField(name = "noDeductibleFlag", ordinal = 2)
+            private Boolean noDeductibleFlag;
+
+            /**
+             * 险种名称
+             */
+            @JsonProperty("kindName")
+            @JSONField(name = "kindName", ordinal = 3)
+            private String kindName;
+
+            /**
+             * 险种排序
+             */
+            @JsonProperty("kindSort")
+            @JSONField(name = "kindSort", ordinal = 4)
+            private Integer kindSort;
+
+            /**
+             * 主险标志
+             */
+            @JsonProperty("mainRiskFlag")
+            @JSONField(name = "mainRiskFlag", ordinal = 5)
+            private String mainRiskFlag;
+
+            /**
+             * 免赔额标志
+             */
+            @JsonProperty("deductibleFlag")
+            @JSONField(name = "deductibleFlag", ordinal = 6)
+            private Boolean deductibleFlag;
+
+            /**
+             * 保险金额
+             */
+            @JsonProperty("amount")
+            @JSONField(name = "amount", ordinal = 7)
+            private Object amount;
+
+            /**
+             * 费率
+             */
+            @JsonProperty("rate")
+            @JSONField(name = "rate", ordinal = 8)
+            private String rate;
+
+            /**
+             * 调整前保费
+             */
+            @JsonProperty("befPremium")
+            @JSONField(name = "befPremium", ordinal = 9)
+            private Integer befPremium;
+
+            /**
+             * 保费
+             */
+            @JsonProperty("premium")
+            @JSONField(name = "premium", ordinal = 10)
+            private Double premium;
+
+            /**
+             * 折扣系数
+             */
+            @JsonProperty("disCoef")
+            @JSONField(name = "disCoef", ordinal = 11)
+            private Double disCoef;
+
+            /**
+             * 免赔额
+             */
+            @JsonProperty("deductible")
+            @JSONField(name = "deductible", ordinal = 12)
+            private String deductible;
+
+            /**
+             * 免赔额折扣
+             */
+            @JsonProperty("ductDiscount")
+            @JSONField(name = "ductDiscount", ordinal = 13)
+            private String ductDiscount;
+
+            /**
+             * 赔偿限额等级
+             */
+            @JsonProperty("indemLmtLvl")
+            @JSONField(name = "indemLmtLvl", ordinal = 14)
+            private String indemLmtLvl;
+
+            /**
+             * 赔偿限额
+             */
+            @JsonProperty("indemLmt")
+            @JSONField(name = "indemLmt", ordinal = 15)
+            private Object indemLmt;
+
+            /**
+             * 责任天数限制
+             */
+            @JsonProperty("liabDaysLmt")
+            @JSONField(name = "liabDaysLmt", ordinal = 16)
+            private Object liabDaysLmt;
+
+            /**
+             * 每人限额
+             */
+            @JsonProperty("perAmt")
+            @JSONField(name = "perAmt", ordinal = 17)
+            private Object perAmt;
+
+            /**
+             * 玻璃类型
+             */
+            @JsonProperty("glassType")
+            @JSONField(name = "glassType", ordinal = 18)
+            private String glassType;
+
+            /**
+             * 特殊玻璃浮动
+             */
+            @JsonProperty("specialGlassFloat")
+            @JSONField(name = "specialGlassFloat", ordinal = 19)
+            private String specialGlassFloat;
+
+            /**
+             * 车损浮动
+             */
+            @JsonProperty("vhlDamageFloat")
+            @JSONField(name = "vhlDamageFloat", ordinal = 20)
+            private String vhlDamageFloat;
+
+            /**
+             * 每次事故赔偿限额
+             */
+            @JsonProperty("compenPerAmt")
+            @JSONField(name = "compenPerAmt", ordinal = 21)
+            private String compenPerAmt;
+
+            /**
+             * 每日赔偿限额
+             */
+            @JsonProperty("compenPerDay")
+            @JSONField(name = "compenPerDay", ordinal = 22)
+            private String compenPerDay;
+
+            /**
+             * 险种代码
+             */
+            @JsonProperty("kindCode")
+            @JSONField(name = "kindCode", ordinal = 23)
+            private String kindCode;
+
+            /**
+             * 免赔率
+             */
+            @JsonProperty("deductibleRatio")
+            @JSONField(name = "deductibleRatio", ordinal = 24)
+            private String deductibleRatio;
+
+            /**
+             * 调整前年保费
+             */
+            @JsonProperty("befAnnPrm")
+            @JSONField(name = "befAnnPrm", ordinal = 25)
+            private Integer befAnnPrm;
+
+            /**
+             * 纯风险保费
+             */
+            @JsonProperty("pureRiskPremium")
+            @JSONField(name = "pureRiskPremium", ordinal = 26)
+            private Double pureRiskPremium;
+
+            /**
+             * 基础保费
+             */
+            @JsonProperty("basePrm")
+            @JSONField(name = "basePrm", ordinal = 27)
+            private Double basePrm;
+
+            /**
+             * 年度保费
+             */
+            @JsonProperty("afterPremiumYear")
+            @JSONField(name = "afterPremiumYear", ordinal = 28)
+            private Double afterPremiumYear;
+
+            /**
+             * 计算保费
+             */
+            @JsonProperty("calcPrm")
+            @JSONField(name = "calcPrm", ordinal = 29)
+            private String calcPrm;
+
+            /**
+             * 道路救援预留
+             */
+            @JsonProperty("resvNumberRoad")
+            @JSONField(name = "resvNumberRoad", ordinal = 30)
+            private String resvNumberRoad;
+
+            /**
+             * 驾驶员预留
+             */
+            @JsonProperty("resvNumberDriver")
+            @JSONField(name = "resvNumberDriver", ordinal = 31)
+            private String resvNumberDriver;
+
+            /**
+             * 绝对免赔额
+             */
+            @JsonProperty("absoluteDeductible")
+            @JSONField(name = "absoluteDeductible", ordinal = 32)
+            private String absoluteDeductible;
+
+            /**
+             * 自主定价预留
+             */
+            @JsonProperty("resvNumAutonomy")
+            @JSONField(name = "resvNumAutonomy", ordinal = 33)
+            private String resvNumAutonomy;
+
+            /**
+             * 保额变动
+             */
+            @JsonProperty("amtVar")
+            @JSONField(name = "amtVar", ordinal = 34)
+            private String amtVar;
+
+            /**
+             * 保费变动
+             */
+            @JsonProperty("prmVar")
+            @JSONField(name = "prmVar", ordinal = 35)
+            private String prmVar;
+
+            /**
+             * 行ID
+             */
+            @JsonProperty("rowId")
+            @JSONField(name = "rowId", ordinal = 36)
+            private String rowId;
+
+            /**
+             * 附加险标志
+             */
+            @JsonProperty("addCvrgFlag")
+            @JSONField(name = "addCvrgFlag", ordinal = 37)
+            private String addCvrgFlag;
+
+            /**
+             * 取消标识
+             */
+            @JsonProperty("cancelMrk")
+            @JSONField(name = "cancelMrk", ordinal = 38)
+            private String cancelMrk;
+
+            /**
+             * 序号
+             */
+            @JsonProperty("seqNo")
+            @JSONField(name = "seqNo", ordinal = 39)
+            private String seqNo;
+
+            /**
+             * 主键ID
+             */
+            @JsonProperty("pkId")
+            @JSONField(name = "pkId", ordinal = 40)
+            private String pkId;
+        }
+
+        /**
+         * 产品信息内部类
+         */
+        @Data
+        public static class ProductInfo implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 1L;
+
+            /**
+             * 核保答案
+             */
+            @JsonProperty("answer")
+            @JSONField(name = "answer", ordinal = 1)
+            private String answer;
+
+            /**
+             * 审批ID
+             */
+            @JsonProperty("apId")
+            @JSONField(name = "apId", ordinal = 2)
+            private String apId;
+
+            /**
+             * 超限额标志
+             */
+            @JsonProperty("aboveThresholdFlag")
+            @JSONField(name = "aboveThresholdFlag", ordinal = 3)
+            private String aboveThresholdFlag;
+
+            /**
+             * 推荐调整值
+             */
+            @JsonProperty("recommAdjustValue")
+            @JSONField(name = "recommAdjustValue", ordinal = 4)
+            private String recommAdjustValue;
+
+            /**
+             * 保险期限(天)
+             */
+            @JsonProperty("day")
+            @JSONField(name = "day", ordinal = 5)
+            private String day;
+
+            /**
+             * EDR项目编号
+             */
+            @JsonProperty("edrPrjNo")
+            @JSONField(name = "edrPrjNo", ordinal = 6)
+            private String edrPrjNo;
+
+            /**
+             * 生效标志:0=未生效
+             */
+            @JsonProperty("effective")
+            @JSONField(name = "effective", ordinal = 7)
+            private String effective;
+
+            /**
+             * 保险终期
+             */
+            @JsonProperty("endDate")
+            @JSONField(name = "endDate", ordinal = 8)
+            private String endDate;
+
+            /**
+             * 原保险公司
+             */
+            @JsonProperty("origInsurer")
+            @JSONField(name = "origInsurer", ordinal = 9)
+            private String origInsurer;
+
+            /**
+             * 原保单号
+             */
+            @JsonProperty("origPlyNo")
+            @JSONField(name = "origPlyNo", ordinal = 10)
+            private String origPlyNo;
+
+            /**
+             * 保单号
+             */
+            @JsonProperty("policyNo")
+            @JSONField(name = "policyNo", ordinal = 11)
+            private String policyNo;
+
+            /**
+             * 总保费
+             */
+            @JsonProperty("premium")
+            @JSONField(name = "premium", ordinal = 12)
+            private String premium;
+
+            /**
+             * 投保单号
+             */
+            @JsonProperty("proposalNo")
+            @JSONField(name = "proposalNo", ordinal = 13)
+            private String proposalNo;
+
+            /**
+             * 投保单状态
+             */
+            @JsonProperty("proposalStatus")
+            @JSONField(name = "proposalStatus", ordinal = 14)
+            private String proposalStatus;
+
+            /**
+             * 核保问题
+             */
+            @JsonProperty("question")
+            @JSONField(name = "question", ordinal = 15)
+            private String question;
+
+            /**
+             * 保险起期
+             */
+            @JsonProperty("startDate")
+            @JSONField(name = "startDate", ordinal = 16)
+            private String startDate;
+
+            /**
+             * 商业险审批使用标志
+             */
+            @JsonProperty("syApUseFlg")
+            @JSONField(name = "syApUseFlg", ordinal = 17)
+            private String syApUseFlg;
+
+            /**
+             * 商业险预期折扣系数
+             */
+            @JsonProperty("syExpDisCoef")
+            @JSONField(name = "syExpDisCoef", ordinal = 18)
+            private String syExpDisCoef;
+
+            /**
+             * 商业险特殊预期折扣
+             */
+            @JsonProperty("sySpecialExpectDisc")
+            @JSONField(name = "sySpecialExpectDisc", ordinal = 19)
+            private String sySpecialExpectDisc;
+
+            /**
+             * 商业险费用折扣
+             */
+            @JsonProperty("syFeeDiscount")
+            @JSONField(name = "syFeeDiscount", ordinal = 20)
+            private String syFeeDiscount;
+
+            /**
+             * 商业险套餐ID
+             */
+            @JsonProperty("syMeale")
+            @JSONField(name = "syMeale", ordinal = 21)
+            private String syMeale;
+
+            /**
+             * 支付主键ID
+             */
+            @JsonProperty("payPkId")
+            @JSONField(name = "payPkId", ordinal = 22)
+            private String payPkId;
+
+            /**
+             * 风险保额
+             */
+            @JsonProperty("riskAmount")
+            @JSONField(name = "riskAmount", ordinal = 23)
+            private String riskAmount;
+
+            /**
+             * 投诉审批ID
+             */
+            @JsonProperty("tsApId")
+            @JSONField(name = "tsApId", ordinal = 24)
+            private String tsApId;
+
+            /**
+             * 积分
+             */
+            @JsonProperty("comPoints")
+            @JSONField(name = "comPoints", ordinal = 25)
+            private String comPoints;
+
+            /**
+             * 续保类别
+             */
+            @JsonProperty("renewalClass")
+            @JSONField(name = "renewalClass", ordinal = 26)
+            private String renewalClass;
+        }
+    }
+
+    /**
+     * 交强险信息内部类
+     */
+    @Data
+    public static class CompulsoryInsurance implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @JsonProperty("carShipTax")
+        @JSONField(name = "carShipTax", ordinal = 1)
+        private CarShipTax carShipTax;
+
+        @JsonProperty("itemKinds")
+        @JSONField(name = "itemKinds", ordinal = 2)
+        private List<ItemKind> itemKinds;
+
+        @JsonProperty("productInfo")
+        @JSONField(name = "productInfo", ordinal = 3)
+        private ProductInfo productInfo;
+
+        @JsonProperty("specialInfos")
+        @JSONField(name = "specialInfos", ordinal = 4)
+        private List<Object> specialInfos;
+
+        /**
+         * 车船税内部类
+         */
+        @Data
+        public static class CarShipTax implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 1L;
+
+            @JsonProperty("abateAmt")
+            @JSONField(name = "abateAmt", ordinal = 1)
+            private String abateAmt;
+
+            @JsonProperty("comDocumentNumber")
+            @JSONField(name = "comDocumentNumber", ordinal = 2)
+            private String comDocumentNumber;
+
+            @JsonProperty("taxOrg")
+            @JSONField(name = "taxOrg", ordinal = 3)
+            private String taxOrg;
+
+            @JsonProperty("taxOrgCde")
+            @JSONField(name = "taxOrgCde", ordinal = 4)
+            private String taxOrgCde;
+
+            @JsonProperty("deptNonlocal")
+            @JSONField(name = "deptNonlocal", ordinal = 5)
+            private String deptNonlocal;
+
+            @JsonProperty("freeRate")
+            @JSONField(name = "freeRate", ordinal = 6)
+            private String freeRate;
+
+            @JsonProperty("fuelType")
+            @JSONField(name = "fuelType", ordinal = 7)
+            private String fuelType;
+
+            @JsonProperty("overDueAmt")
+            @JSONField(name = "overDueAmt", ordinal = 8)
+            private String overDueAmt;
+
+            @JsonProperty("payEndTm")
+            @JSONField(name = "payEndTm", ordinal = 9)
+            private String payEndTm;
+
+            @JsonProperty("payStartTm")
+            @JSONField(name = "payStartTm", ordinal = 10)
+            private String payStartTm;
+
+            @JsonProperty("previousPay")
+            @JSONField(name = "previousPay", ordinal = 11)
+            private String previousPay;
+
+            @JsonProperty("taxActual")
+            @JSONField(name = "taxActual", ordinal = 12)
+            private String taxActual;
+
+            @JsonProperty("taxDocumentNumber")
+            @JSONField(name = "taxDocumentNumber", ordinal = 13)
+            private String taxDocumentNumber;
+
+            @JsonProperty("taxPaidAreaCode")
+            @JSONField(name = "taxPaidAreaCode", ordinal = 14)
+            private String taxPaidAreaCode;
+
+            @JsonProperty("taxPayWay")
+            @JSONField(name = "taxPayWay", ordinal = 15)
+            private String taxPayWay;
+
+            @JsonProperty("taxReductionReason")
+            @JSONField(name = "taxReductionReason", ordinal = 16)
+            private String taxReductionReason;
+
+            @JsonProperty("taxReliefPlan")
+            @JSONField(name = "taxReliefPlan", ordinal = 17)
+            private String taxReliefPlan;
+
+            @JsonProperty("taxVhlType")
+            @JSONField(name = "taxVhlType", ordinal = 18)
+            private String taxVhlType;
+
+            @JsonProperty("taxpayerIdentifier")
+            @JSONField(name = "taxpayerIdentifier", ordinal = 19)
+            private String taxpayerIdentifier;
+
+            @JsonProperty("taxPayerName")
+            @JSONField(name = "taxPayerName", ordinal = 20)
+            private String taxPayerName;
+
+            @JsonProperty("totalTax")
+            @JSONField(name = "totalTax", ordinal = 21)
+            private String totalTax;
+
+            @JsonProperty("unitTaxAmt")
+            @JSONField(name = "unitTaxAmt", ordinal = 22)
+            private String unitTaxAmt;
+
+            @JsonProperty("weight")
+            @JSONField(name = "weight", ordinal = 23)
+            private String weight;
+
+            @JsonProperty("vsTaxMrk")
+            @JSONField(name = "vsTaxMrk", ordinal = 24)
+            private String vsTaxMrk;
+
+            @JsonProperty("certificateDate")
+            @JSONField(name = "certificateDate", ordinal = 25)
+            private String certificateDate;
+
+            @JsonProperty("annualTaxDue")
+            @JSONField(name = "annualTaxDue", ordinal = 26)
+            private String annualTaxDue;
+
+            @JsonProperty("sumTaxDefault")
+            @JSONField(name = "sumTaxDefault", ordinal = 27)
+            private String sumTaxDefault;
+
+            @JsonProperty("sumOverDue")
+            @JSONField(name = "sumOverDue", ordinal = 28)
+            private String sumOverDue;
+
+            @JsonProperty("sumTax")
+            @JSONField(name = "sumTax", ordinal = 29)
+            private String sumTax;
+
+            @JsonProperty("annualTaxAmt")
+            @JSONField(name = "annualTaxAmt", ordinal = 30)
+            private String annualTaxAmt;
+
+            @JsonProperty("taxUnitTypeCode")
+            @JSONField(name = "taxUnitTypeCode", ordinal = 31)
+            private String taxUnitTypeCode;
+
+            @JsonProperty("taxLocationCode")
+            @JSONField(name = "taxLocationCode", ordinal = 32)
+            private String taxLocationCode;
+
+            @JsonProperty("calcTaxFlag")
+            @JSONField(name = "calcTaxFlag", ordinal = 33)
+            private String calcTaxFlag;
+
+            @JsonProperty("taxArrBgnTm")
+            @JSONField(name = "taxArrBgnTm", ordinal = 34)
+            private String taxArrBgnTm;
+
+            @JsonProperty("taxArrEndTm")
+            @JSONField(name = "taxArrEndTm", ordinal = 35)
+            private String taxArrEndTm;
+
+            @JsonProperty("declareStatuIa")
+            @JSONField(name = "declareStatuIa", ordinal = 36)
+            private String declareStatuIa;
+
+            @JsonProperty("aggTaxVar")
+            @JSONField(name = "aggTaxVar", ordinal = 37)
+            private String aggTaxVar;
+        }
+
+        /**
+         * 险种类别内部类(交强险)
+         */
+        @Data
+        public static class ItemKind implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 1L;
+
+            @JsonProperty("kindName")
+            @JSONField(name = "kindName", ordinal = 1)
+            private String kindName;
+
+            @JsonProperty("kindCode")
+            @JSONField(name = "kindCode", ordinal = 2)
+            private String kindCode;
+
+            @JsonProperty("amount")
+            @JSONField(name = "amount", ordinal = 3)
+            private Object amount;
+        }
+
+        /**
+         * 产品信息内部类(交强险)
+         */
+        @Data
+        public static class ProductInfo implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 1L;
+
+            @JsonProperty("day")
+            @JSONField(name = "day", ordinal = 1)
+            private String day;
+
+            @JsonProperty("endDate")
+            @JSONField(name = "endDate", ordinal = 2)
+            private String endDate;
+
+            @JsonProperty("startDate")
+            @JSONField(name = "startDate", ordinal = 3)
+            private String startDate;
+
+            @JsonProperty("renewMrk")
+            @JSONField(name = "renewMrk", ordinal = 4)
+            private String renewMrk;
+        }
+    }
+
+    /**
+     * 被保险人信息内部类(同投保人)
+     */
+    @Data
+    public static class InsuredInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 联系地址
+         */
+        @JsonProperty("address")
+        @JSONField(name = "address", ordinal = 1)
+        private String address;
+
+        /**
+         * 姓名
+         */
+        @JsonProperty("personName")
+        @JSONField(name = "personName", ordinal = 2)
+        private String personName;
+
+        /**
+         * 身份证号
+         */
+        @JsonProperty("identifyNo")
+        @JSONField(name = "identifyNo", ordinal = 3)
+        private String identifyNo;
+
+        /**
+         * 手机号
+         */
+        @JsonProperty("mobile")
+        @JSONField(name = "mobile", ordinal = 4)
+        private String mobile;
+
+        /**
+         * 是否车主:0=否
+         */
+        @JsonProperty("isOwner")
+        @JSONField(name = "isOwner", ordinal = 5)
+        private String isOwner;
+
+        /**
+         * 是否为投保人:1=是
+         */
+        @JsonProperty("isApplication")
+        @JSONField(name = "isApplication", ordinal = 6)
+        private String isApplication;
+
+        /**
+         * 预留文本1
+         */
+        @JsonProperty("resvTxt1")
+        @JSONField(name = "resvTxt1", ordinal = 7)
+        private String resvTxt1;
+
+        /**
+         * 与车主关系:11=本人
+         */
+        @JsonProperty("relationShip")
+        @JSONField(name = "relationShip", ordinal = 8)
+        private String relationShip;
+    }
+
+    /**
+     * 投保单信息内部类
+     */
+    @Data
+    public static class ProposalInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @JsonProperty("mark")
+        @JSONField(name = "mark", ordinal = 1)
+        private String mark;
+
+        @JsonProperty("houseMark")
+        @JSONField(name = "houseMark", ordinal = 2)
+        private String houseMark;
+
+        @JsonProperty("dpMark")
+        @JSONField(name = "dpMark", ordinal = 3)
+        private String dpMark;
+
+        @JsonProperty("mcMark")
+        @JSONField(name = "mcMark", ordinal = 4)
+        private String mcMark;
+
+        @JsonProperty("glMark")
+        @JSONField(name = "glMark", ordinal = 5)
+        private String glMark;
+
+        @JsonProperty("diMark")
+        @JSONField(name = "diMark", ordinal = 6)
+        private String diMark;
+
+        @JsonProperty("operateDate")
+        @JSONField(name = "operateDate", ordinal = 7)
+        private String operateDate;
+
+        @JsonProperty("loginCompany")
+        @JSONField(name = "loginCompany", ordinal = 8)
+        private String loginCompany;
+
+        @JsonProperty("combinedProductCode")
+        @JSONField(name = "combinedProductCode", ordinal = 9)
+        private String combinedProductCode;
+
+        @JsonProperty("dptRelCde")
+        @JSONField(name = "dptRelCde", ordinal = 10)
+        private String dptRelCde;
+
+        @JsonProperty("underWriteCompany")
+        @JSONField(name = "underWriteCompany", ordinal = 11)
+        private String underWriteCompany;
+
+        @JsonProperty("underwritingAgencyName")
+        @JSONField(name = "underwritingAgencyName", ordinal = 12)
+        private String underwritingAgencyName;
+
+        @JsonProperty("operatorCode")
+        @JSONField(name = "operatorCode", ordinal = 13)
+        private String operatorCode;
+
+        @JsonProperty("totalPremium")
+        @JSONField(name = "totalPremium", ordinal = 14)
+        private String totalPremium;
+
+        @JsonProperty("orderNo")
+        @JSONField(name = "orderNo", ordinal = 15)
+        private String orderNo;
+
+        @JsonProperty("status")
+        @JSONField(name = "status", ordinal = 16)
+        private String status;
+
+        @JsonProperty("proposalTime")
+        @JSONField(name = "proposalTime", ordinal = 17)
+        private String proposalTime;
+
+        @JsonProperty("agent")
+        @JSONField(name = "agent", ordinal = 18)
+        private String agent;
+
+        @JsonProperty("isIndependenceAgent")
+        @JSONField(name = "isIndependenceAgent", ordinal = 19)
+        private String isIndependenceAgent;
+
+        @JsonProperty("agentName")
+        @JSONField(name = "agentName", ordinal = 20)
+        private String agentName;
+
+        @JsonProperty("province")
+        @JSONField(name = "province", ordinal = 21)
+        private String province;
+
+        @JsonProperty("city")
+        @JSONField(name = "city", ordinal = 22)
+        private String city;
+
+        @JsonProperty("county")
+        @JSONField(name = "county", ordinal = 23)
+        private String county;
+
+        @JsonProperty("defaultChannel")
+        @JSONField(name = "defaultChannel", ordinal = 24)
+        private String defaultChannel;
+
+        @JsonProperty("saleCode")
+        @JSONField(name = "saleCode", ordinal = 25)
+        private String saleCode;
+
+        @JsonProperty("saleName")
+        @JSONField(name = "saleName", ordinal = 26)
+        private String saleName;
+
+        @JsonProperty("saleNo")
+        @JSONField(name = "saleNo", ordinal = 27)
+        private String saleNo;
+
+        @JsonProperty("pkgNo")
+        @JSONField(name = "pkgNo", ordinal = 28)
+        private String pkgNo;
+
+        @JsonProperty("teamOrderName")
+        @JSONField(name = "teamOrderName", ordinal = 29)
+        private String teamOrderName;
+
+        @JsonProperty("saleChannel")
+        @JSONField(name = "saleChannel", ordinal = 30)
+        private String saleChannel;
+
+        @JsonProperty("zxType")
+        @JSONField(name = "zxType", ordinal = 31)
+        private String zxType;
+
+        @JsonProperty("jointNo")
+        @JSONField(name = "jointNo", ordinal = 32)
+        private String jointNo;
+
+        @JsonProperty("itemSystem")
+        @JSONField(name = "itemSystem", ordinal = 33)
+        private String itemSystem;
+
+        @JsonProperty("syAdjustRate")
+        @JSONField(name = "syAdjustRate", ordinal = 34)
+        private String syAdjustRate;
+
+        @JsonProperty("renewMrk")
+        @JSONField(name = "renewMrk", ordinal = 35)
+        private String renewMrk;
+
+        @JsonProperty("riskScore")
+        @JSONField(name = "riskScore", ordinal = 36)
+        private String riskScore;
+
+        @JsonProperty("custGroups")
+        @JSONField(name = "custGroups", ordinal = 37)
+        private String custGroups;
+
+        @JsonProperty("spCust")
+        @JSONField(name = "spCust", ordinal = 38)
+        private String spCust;
+
+        @JsonProperty("baseCRemark")
+        @JSONField(name = "baseCRemark", ordinal = 39)
+        private String baseCRemark;
+
+        @JsonProperty("syTsFcId")
+        @JSONField(name = "syTsFcId", ordinal = 40)
+        private String syTsFcId;
+
+        @JsonProperty("jqTsFcId")
+        @JSONField(name = "jqTsFcId", ordinal = 41)
+        private String jqTsFcId;
+
+        @JsonProperty("spCustClass")
+        @JSONField(name = "spCustClass", ordinal = 42)
+        private String spCustClass;
+
+        @JsonProperty("salesmanName")
+        @JSONField(name = "salesmanName", ordinal = 43)
+        private String salesmanName;
+
+        @JsonProperty("certSalesmanNum")
+        @JSONField(name = "certSalesmanNum", ordinal = 44)
+        private String certSalesmanNum;
+
+        @JsonProperty("certificateName")
+        @JSONField(name = "certificateName", ordinal = 45)
+        private String certificateName;
+
+        @JsonProperty("certificatePhone")
+        @JSONField(name = "certificatePhone", ordinal = 46)
+        private String certificatePhone;
+
+        @JsonProperty("resultDetail")
+        @JSONField(name = "resultDetail", ordinal = 47)
+        private String resultDetail;
+
+        @JsonProperty("crtTm")
+        @JSONField(name = "crtTm", ordinal = 48)
+        private String crtTm;
+
+        @JsonProperty("singleJqFlag")
+        @JSONField(name = "singleJqFlag", ordinal = 49)
+        private String singleJqFlag;
+
+        @JsonProperty("spCustS")
+        @JSONField(name = "spCustS", ordinal = 50)
+        private String spCustS;
+
+        @JsonProperty("pkgNoS")
+        @JSONField(name = "pkgNoS", ordinal = 51)
+        private String pkgNoS;
+
+        @JsonProperty("greenInsure")
+        @JSONField(name = "greenInsure", ordinal = 52)
+        private String greenInsure;
+
+        @JsonProperty("isGreen")
+        @JSONField(name = "isGreen", ordinal = 53)
+        private Integer isGreen;
+    }
+
+    /**
+     * 车辆信息内部类
+     */
+    @Data
+    public static class VehicleInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @JsonProperty("aliasId")
+        @JSONField(name = "aliasId", ordinal = 1)
+        private String aliasId;
+
+        @JsonProperty("arbitrationName")
+        @JSONField(name = "arbitrationName", ordinal = 2)
+        private String arbitrationName;
+
+        @JsonProperty("argueSolution")
+        @JSONField(name = "argueSolution", ordinal = 3)
+        private String argueSolution;
+
+        @JsonProperty("brand")
+        @JSONField(name = "brand", ordinal = 4)
+        private String brand;
+
+        @JsonProperty("brandCode")
+        @JSONField(name = "brandCode", ordinal = 5)
+        private String brandCode;
+
+        @JsonProperty("brandId")
+        @JSONField(name = "brandId", ordinal = 6)
+        private String brandId;
+
+        @JsonProperty("carInspection")
+        @JSONField(name = "carInspection", ordinal = 7)
+        private String carInspection;
+
+        @JsonProperty("carName")
+        @JSONField(name = "carName", ordinal = 8)
+        private String carName;
+
+        @JsonProperty("categoryCode")
+        @JSONField(name = "categoryCode", ordinal = 9)
+        private String categoryCode;
+
+        @JsonProperty("categoryName")
+        @JSONField(name = "categoryName", ordinal = 10)
+        private String categoryName;
+
+        @JsonProperty("configType")
+        @JSONField(name = "configType", ordinal = 11)
+        private String configType;
+
+        @JsonProperty("deptCode")
+        @JSONField(name = "deptCode", ordinal = 12)
+        private String deptCode;
+
+        @JsonProperty("deptName")
+        @JSONField(name = "deptName", ordinal = 13)
+        private String deptName;
+
+        @JsonProperty("engineNo")
+        @JSONField(name = "engineNo", ordinal = 14)
+        private String engineNo;
+
+        @JsonProperty("exemptionInspectReason")
+        @JSONField(name = "exemptionInspectReason", ordinal = 15)
+        private String exemptionInspectReason;
+
+        @JsonProperty("feeType")
+        @JSONField(name = "feeType", ordinal = 16)
+        private String feeType;
+
+        @JsonProperty("fuelType")
+        @JSONField(name = "fuelType", ordinal = 17)
+        private String fuelType;
+
+        @JsonProperty("inspectionPerson")
+        @JSONField(name = "inspectionPerson", ordinal = 18)
+        private String inspectionPerson;
+
+        @JsonProperty("inspectionResult")
+        @JSONField(name = "inspectionResult", ordinal = 19)
+        private String inspectionResult;
+
+        @JsonProperty("inspectionTime")
+        @JSONField(name = "inspectionTime", ordinal = 20)
+        private String inspectionTime;
+
+        @JsonProperty("isAccurate")
+        @JSONField(name = "isAccurate", ordinal = 21)
+        private String isAccurate;
+
+        @JsonProperty("isFieldCar")
+        @JSONField(name = "isFieldCar", ordinal = 22)
+        private String isFieldCar;
+
+        @JsonProperty("isPlateNo")
+        @JSONField(name = "isPlateNo", ordinal = 23)
+        private String isPlateNo;
+
+        @JsonProperty("jqIsTransferCar")
+        @JSONField(name = "jqIsTransferCar", ordinal = 24)
+        private String jqIsTransferCar;
+
+        @JsonProperty("jqTransferDate")
+        @JSONField(name = "jqTransferDate", ordinal = 25)
+        private String jqTransferDate;
+
+        @JsonProperty("syIsTransferCar")
+        @JSONField(name = "syIsTransferCar", ordinal = 26)
+        private String syIsTransferCar;
+
+        @JsonProperty("syTransferDate")
+        @JSONField(name = "syTransferDate", ordinal = 27)
+        private String syTransferDate;
+
+        @JsonProperty("jqOrigReducCarShow")
+        @JSONField(name = "jqOrigReducCarShow", ordinal = 28)
+        private String jqOrigReducCarShow;
+
+        @JsonProperty("jqPrintDisplacement")
+        @JSONField(name = "jqPrintDisplacement", ordinal = 29)
+        private String jqPrintDisplacement;
+
+        @JsonProperty("jqQryCde")
+        @JSONField(name = "jqQryCde", ordinal = 30)
+        private String jqQryCde;
+
+        @JsonProperty("jqSpecialMrk")
+        @JSONField(name = "jqSpecialMrk", ordinal = 31)
+        private String jqSpecialMrk;
+
+        @JsonProperty("modelCde")
+        @JSONField(name = "modelCde", ordinal = 32)
+        private String modelCde;
+
+        @JsonProperty("modelIdCode")
+        @JSONField(name = "modelIdCode", ordinal = 33)
+        private String modelIdCode;
+
+        @JsonProperty("modelNme")
+        @JSONField(name = "modelNme", ordinal = 34)
+        private String modelNme;
+
+        @JsonProperty("ncdReason")
+        @JSONField(name = "ncdReason", ordinal = 35)
+        private String ncdReason;
+
+        @JsonProperty("negotiatedActulValue")
+        @JSONField(name = "negotiatedActulValue", ordinal = 36)
+        private String negotiatedActulValue;
+
+        @JsonProperty("negotiatedValue")
+        @JSONField(name = "negotiatedValue", ordinal = 37)
+        private String negotiatedValue;
+
+        @JsonProperty("newCarFlag")
+        @JSONField(name = "newCarFlag", ordinal = 38)
+        private String newCarFlag;
+
+        @JsonProperty("noComLastFloatRecord")
+        @JSONField(name = "noComLastFloatRecord", ordinal = 39)
+        private String noComLastFloatRecord;
+
+        @JsonProperty("noInspectReason")
+        @JSONField(name = "noInspectReason", ordinal = 40)
+        private String noInspectReason;
+
+        @JsonProperty("noticeType")
+        @JSONField(name = "noticeType", ordinal = 41)
+        private String noticeType;
+
+        @JsonProperty("origBusiClass")
+        @JSONField(name = "origBusiClass", ordinal = 42)
+        private String origBusiClass;
+
+        @JsonProperty("origFamilyName")
+        @JSONField(name = "origFamilyName", ordinal = 43)
+        private String origFamilyName;
+
+        @JsonProperty("origModelCde")
+        @JSONField(name = "origModelCde", ordinal = 44)
+        private String origModelCde;
+
+        @JsonProperty("origModelCode")
+        @JSONField(name = "origModelCode", ordinal = 45)
+        private String origModelCode;
+
+        @JsonProperty("origModelNme")
+        @JSONField(name = "origModelNme", ordinal = 46)
+        private String origModelNme;
+
+        @JsonProperty("origPower")
+        @JSONField(name = "origPower", ordinal = 47)
+        private String origPower;
+
+        @JsonProperty("origSeatMax")
+        @JSONField(name = "origSeatMax", ordinal = 48)
+        private String origSeatMax;
+
+        @JsonProperty("origSeatMin")
+        @JSONField(name = "origSeatMin", ordinal = 49)
+        private String origSeatMin;
+
+        @JsonProperty("origTonage")
+        @JSONField(name = "origTonage", ordinal = 50)
+        private String origTonage;
+
+        @JsonProperty("origWeightMax")
+        @JSONField(name = "origWeightMax", ordinal = 51)
+        private String origWeightMax;
+
+        @JsonProperty("origWeightMin")
+        @JSONField(name = "origWeightMin", ordinal = 52)
+        private String origWeightMin;
+
+        @JsonProperty("plateColor")
+        @JSONField(name = "plateColor", ordinal = 53)
+        private String plateColor;
+
+        @JsonProperty("plateNo")
+        @JSONField(name = "plateNo", ordinal = 54)
+        private String plateNo;
+
+        @JsonProperty("plateType")
+        @JSONField(name = "plateType", ordinal = 55)
+        private String plateType;
+
+        @JsonProperty("power")
+        @JSONField(name = "power", ordinal = 56)
+        private String power;
+
+        @JsonProperty("prodPlace")
+        @JSONField(name = "prodPlace", ordinal = 57)
+        private String prodPlace;
+
+        @JsonProperty("purchasePrice")
+        @JSONField(name = "purchasePrice", ordinal = 58)
+        private String purchasePrice;
+
+        @JsonProperty("recordCoefCi")
+        @JSONField(name = "recordCoefCi", ordinal = 59)
+        private String recordCoefCi;
+
+        @JsonProperty("regVhlTyp")
+        @JSONField(name = "regVhlTyp", ordinal = 60)
+        private String regVhlTyp;
+
+        @JsonProperty("registerDate")
+        @JSONField(name = "registerDate", ordinal = 61)
+        private String registerDate;
+
+        @JsonProperty("issueYm")
+        @JSONField(name = "issueYm", ordinal = 62)
+        private String issueYm;
+
+        @JsonProperty("searchCode")
+        @JSONField(name = "searchCode", ordinal = 63)
+        private String searchCode;
+
+        @JsonProperty("seatCount")
+        @JSONField(name = "seatCount", ordinal = 64)
+        private String seatCount;
+
+        @JsonProperty("series")
+        @JSONField(name = "series", ordinal = 65)
+        private String series;
+
+        @JsonProperty("seriesCode")
+        @JSONField(name = "seriesCode", ordinal = 66)
+        private String seriesCode;
+
+        @JsonProperty("syQryCde")
+        @JSONField(name = "syQryCde", ordinal = 67)
+        private String syQryCde;
+
+        @JsonProperty("tonage")
+        @JSONField(name = "tonage", ordinal = 68)
+        private String tonage;
+
+        @JsonProperty("tradeCode")
+        @JSONField(name = "tradeCode", ordinal = 69)
+        private String tradeCode;
+
+        @JsonProperty("tradeName")
+        @JSONField(name = "tradeName", ordinal = 70)
+        private String tradeName;
+
+        @JsonProperty("useNatureShow")
+        @JSONField(name = "useNatureShow", ordinal = 71)
+        private String useNatureShow;
+
+        @JsonProperty("vehicleCategoryCde")
+        @JSONField(name = "vehicleCategoryCde", ordinal = 72)
+        private String vehicleCategoryCde;
+
+        @JsonProperty("vehicleType")
+        @JSONField(name = "vehicleType", ordinal = 73)
+        private String vehicleType;
+
+        @JsonProperty("vhlCertDate")
+        @JSONField(name = "vhlCertDate", ordinal = 74)
+        private String vhlCertDate;
+
+        @JsonProperty("vhlCertNo")
+        @JSONField(name = "vhlCertNo", ordinal = 75)
+        private String vhlCertNo;
+
+        @JsonProperty("vhlCertType")
+        @JSONField(name = "vhlCertType", ordinal = 76)
+        private String vhlCertType;
+
+        @JsonProperty("vin")
+        @JSONField(name = "vin", ordinal = 77)
+        private String vin;
+
+        @JsonProperty("weight")
+        @JSONField(name = "weight", ordinal = 78)
+        private String weight;
+
+        @JsonProperty("syNcdReason")
+        @JSONField(name = "syNcdReason", ordinal = 79)
+        private String syNcdReason;
+
+        @JsonProperty("jqNcdReason")
+        @JSONField(name = "jqNcdReason", ordinal = 80)
+        private String jqNcdReason;
+
+        @JsonProperty("insureYears")
+        @JSONField(name = "insureYears", ordinal = 81)
+        private String insureYears;
+
+        @JsonProperty("claimTimes")
+        @JSONField(name = "claimTimes", ordinal = 82)
+        private String claimTimes;
+
+        @JsonProperty("claimAdjustLevel")
+        @JSONField(name = "claimAdjustLevel", ordinal = 83)
+        private String claimAdjustLevel;
+
+        @JsonProperty("teamCarId")
+        @JSONField(name = "teamCarId", ordinal = 84)
+        private String teamCarId;
+
+        @JsonProperty("ocrUuId")
+        @JSONField(name = "ocrUuId", ordinal = 85)
+        private String ocrUuId;
+
+        @JsonProperty("useNatureShowName")
+        @JSONField(name = "useNatureShowName", ordinal = 86)
+        private String useNatureShowName;
+
+        @JsonProperty("singleJqSyQryCde")
+        @JSONField(name = "singleJqSyQryCde", ordinal = 87)
+        private String singleJqSyQryCde;
+
+        @JsonProperty("modelEneryType")
+        @JSONField(name = "modelEneryType", ordinal = 88)
+        private String modelEneryType;
+
+        @JsonProperty("pureRange")
+        @JSONField(name = "pureRange", ordinal = 89)
+        private String pureRange;
+
+        @JsonProperty("otherEnergyTypeDesc")
+        @JSONField(name = "otherEnergyTypeDesc", ordinal = 90)
+        private String otherEnergyTypeDesc;
+
+        @JsonProperty("industryModelCode")
+        @JSONField(name = "industryModelCode", ordinal = 91)
+        private String industryModelCode;
+
+        @JsonProperty("newIndustryCode")
+        @JSONField(name = "newIndustryCode", ordinal = 92)
+        private String newIndustryCode;
+
+        @JsonProperty("emotoPower")
+        @JSONField(name = "emotoPower", ordinal = 93)
+        private String emotoPower;
+
+        @JsonProperty("maxSpeed")
+        @JSONField(name = "maxSpeed", ordinal = 94)
+        private String maxSpeed;
+
+        @JsonProperty("printUsageCde")
+        @JSONField(name = "printUsageCde", ordinal = 95)
+        private String printUsageCde;
+
+        @JsonProperty("printUsageCdeFlag")
+        @JSONField(name = "printUsageCdeFlag", ordinal = 96)
+        private String printUsageCdeFlag;
+
+        @JsonProperty("carAge")
+        @JSONField(name = "carAge", ordinal = 97)
+        private String carAge;
+
+        @JsonProperty("printUsageCdeSub")
+        @JSONField(name = "printUsageCdeSub", ordinal = 98)
+        private String printUsageCdeSub;
+
+        @JsonProperty("jqCResvTxt20")
+        @JSONField(name = "jqCResvTxt20", ordinal = 99)
+        private String jqCResvTxt20;
+
+        @JsonProperty("syCResvTxt20")
+        @JSONField(name = "syCResvTxt20", ordinal = 100)
+        private String syCResvTxt20;
+
+        @JsonProperty("syUuid")
+        @JSONField(name = "syUuid", ordinal = 101)
+        private String syUuid;
+
+        @JsonProperty("jqUuid")
+        @JSONField(name = "jqUuid", ordinal = 102)
+        private String jqUuid;
+
+        @JsonProperty("useNature")
+        @JSONField(name = "useNature", ordinal = 103)
+        private String useNature;
+
+        @JsonProperty("overseasVehicleFlag")
+        @JSONField(name = "overseasVehicleFlag", ordinal = 104)
+        private String overseasVehicleFlag;
+
+        @JsonProperty("specialVehicleFlag")
+        @JSONField(name = "specialVehicleFlag", ordinal = 105)
+        private String specialVehicleFlag;
+    }
+
+    /**
+     * 车主信息内部类
+     */
+    @Data
+    public static class VehicleOwnerInfo implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 地址
+         */
+        @JsonProperty("address")
+        @JSONField(name = "address", ordinal = 1)
+        private String address;
+
+        /**
+         * 出生年份
+         */
+        @JsonProperty("yearOfBirth")
+        @JSONField(name = "yearOfBirth", ordinal = 2)
+        private String yearOfBirth;
+
+        /**
+         * 客户类型:个人
+         */
+        @JsonProperty("clientType")
+        @JSONField(name = "clientType", ordinal = 3)
+        private String clientType;
+
+        /**
+         * 性别:男
+         */
+        @JsonProperty("gender")
+        @JSONField(name = "gender", ordinal = 4)
+        private String gender;
+
+        /**
+         * 身份证号
+         */
+        @JsonProperty("identifyNo")
+        @JSONField(name = "identifyNo", ordinal = 5)
+        private String identifyNo;
+
+        /**
+         * 证件类型
+         */
+        @JsonProperty("identifyType")
+        @JSONField(name = "identifyType", ordinal = 6)
+        private String identifyType;
+
+        /**
+         * 车主姓名
+         */
+        @JsonProperty("personName")
+        @JSONField(name = "personName", ordinal = 7)
+        private String personName;
+
+        /**
+         * 省份
+         */
+        @JsonProperty("province")
+        @JSONField(name = "province", ordinal = 8)
+        private String province;
+
+        /**
+         * 城市
+         */
+        @JsonProperty("city")
+        @JSONField(name = "city", ordinal = 9)
+        private String city;
+
+        /**
+         * 区县
+         */
+        @JsonProperty("county")
+        @JSONField(name = "county", ordinal = 10)
+        private String county;
+
+        /**
+         * 年龄
+         */
+        @JsonProperty("personAge")
+        @JSONField(name = "personAge", ordinal = 11)
+        private Integer personAge;
+    }
+
+}

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

@@ -0,0 +1,139 @@
+package com.jzg.quotation.taishan.crawler.entity.request;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫核保请求实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerUnderwritingRequest {
+
+    /**
+     * 报价单号
+     */
+    private String quoteNo;
+
+    /**
+     * 确认的报价信息
+     */
+    private ConfirmedQuotationInfo confirmedQuotation;
+
+    /**
+     * 投保人信息确认
+     */
+    private ApplicantConfirmation applicantInfo;
+
+    /**
+     * 被保险人信息确认
+     */
+    private InsuredConfirmation insuredInfo;
+
+    /**
+     * 保单送达信息
+     */
+    private DeliveryInfo deliveryInfo;
+
+    @Data
+    public static class ConfirmedQuotationInfo {
+        /**
+         * 交强险保费
+         */
+        private Double compulsoryPremium;
+
+        /**
+         * 商业险保费
+         */
+        private Double commercialPremium;
+
+        /**
+         * 总保费
+         */
+        private Double totalPremium;
+
+        /**
+         * 保险起期
+         */
+        private String startDate;
+
+        /**
+         * 保险止期
+         */
+        private String endDate;
+    }
+
+    @Data
+    public static class ApplicantConfirmation {
+        /**
+         * 姓名
+         */
+        private String name;
+
+        /**
+         * 证件类型
+         */
+        private String certType;
+
+        /**
+         * 证件号码
+         */
+        private String certNo;
+
+        /**
+         * 手机号
+         */
+        private String mobile;
+
+        /**
+         * 邮箱
+         */
+        private String email;
+    }
+
+    @Data
+    public static class InsuredConfirmation {
+        /**
+         * 姓名
+         */
+        private String name;
+
+        /**
+         * 证件类型
+         */
+        private String certType;
+
+        /**
+         * 证件号码
+         */
+        private String certNo;
+
+        /**
+         * 与投保人关系
+         */
+        private String relation;
+    }
+
+    @Data
+    public static class DeliveryInfo {
+        /**
+         * 保单送达方式
+         */
+        private String deliveryMethod;
+
+        /**
+         * 送达地址
+         */
+        private String deliveryAddress;
+
+        /**
+         * 收件人
+         */
+        private String recipient;
+
+        /**
+         * 收件人电话
+         */
+        private String recipientPhone;
+    }
+}

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

@@ -0,0 +1,70 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.jzg.quotation.taishan.crawler.constant.enums.ResponseCode;
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫基础响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerBaseResponse<T> {
+
+    /**
+     * 响应头
+     */
+    private Head head;
+
+    /**
+     * 响应数据
+     */
+    private T result;
+
+    /**
+     * 响应代码
+     */
+    private String returnCode;
+
+    /**
+     * 响应消息
+     */
+    private String returnMessage;
+
+    @Data
+    public static class Head {
+        /**
+         * 交易代码
+         */
+        private String transCode;
+
+        /**
+         * 交易类型
+         */
+        private String transType;
+
+        /**
+         * 时间戳
+         */
+        private String timestamp;
+
+        /**
+         * 版本号
+         */
+        private String version;
+    }
+
+    /**
+     * 判断请求是否成功
+     */
+    public boolean isSuccess() {
+        return ResponseCode.SUCCESS.getCode().equals(returnCode);
+    }
+
+    /**
+     * 获取响应代码枚举
+     */
+    /*public ResponseCode getResponseCode() {
+        return ResponseCode.fromCode(returnCode);
+    }*/
+}

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

@@ -0,0 +1,32 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫验证码响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerCaptchaResponse {
+
+    /**
+     * 验证码图片Base64
+     */
+    private String img;
+
+    /**
+     * 验证码ID
+     */
+    private String captchaId;
+
+    /**
+     * 识别后的验证码文本
+     */
+    private String captcha;
+
+    /**
+     * 验证码过期时间(毫秒)
+     */
+    private Long expireTime;
+}

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

@@ -0,0 +1,255 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 泰山财险爬虫车型查询响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerCarResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6527940542526079395L;
+
+    /**
+     * 响应状态码:200表示请求成功
+     */
+    @JsonProperty("code")
+    @JSONField(ordinal = 1)
+    private String code;
+
+    /**
+     * 响应消息:请求处理结果描述
+     */
+    @JsonProperty("message")
+    @JSONField(ordinal = 2)
+    private String message;
+
+    /**
+     * 查询结果数组:可能返回多个匹配的车型配置
+     */
+    @JsonProperty("result")
+    @JSONField(ordinal = 3)
+    private List<CarModelInfo> result;
+
+    /**
+     * 车型信息内部类
+     */
+    @Data
+    public static class CarModelInfo implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 车型代码:系统内部车型唯一标识
+         */
+        @JsonProperty("carModelCode")
+        @JSONField(ordinal = 1)
+        private String carModelCode;
+
+        /**
+         * 车型名称:官方完整型号名称
+         */
+        @JsonProperty("carModelName")
+        @JSONField(ordinal = 2)
+        private String carModelName;
+
+        /**
+         * 品牌ID:品牌在系统中的唯一编码
+         */
+        @JsonProperty("carBrandId")
+        @JSONField(ordinal = 3)
+        private String carBrandId;
+
+        /**
+         * 品牌名称:中文品牌显示名称
+         */
+        @JsonProperty("cbrandName")
+        @JSONField(ordinal = 4)
+        private String cbrandName;
+
+        /**
+         * 车系名称:车辆所属系列(如途观、帕萨特)
+         */
+        @JsonProperty("carFamilyName")
+        @JSONField(ordinal = 5)
+        private String carFamilyName;
+
+        /**
+         * 车辆检索码:用于快速查询的标准化代码
+         */
+        @JsonProperty("carSearchCode")
+        @JSONField(ordinal = 6)
+        private String carSearchCode;
+
+        /**
+         * 车型别名ID:具体配置版本的唯一标识(空=基础车型)
+         */
+        @JsonProperty("carAliasId")
+        @JSONField(ordinal = 7)
+        private String carAliasId;
+
+        /**
+         * 车型别名:具体配置版本名称(如"1.8T豪华版")
+         */
+        @JsonProperty("carVehicleAlias")
+        @JSONField(ordinal = 8)
+        private String carVehicleAlias;
+
+        /**
+         * 新车购置价(不含税):用于计算车损险保额
+         */
+        @JsonProperty("newVehiclePrice")
+        @JSONField(ordinal = 9)
+        private String newVehiclePrice;
+
+        /**
+         * 新车购置价(含税):实际购车价格
+         */
+        @JsonProperty("newVehiclePriceTax")
+        @JSONField(ordinal = 10)
+        private String newVehiclePriceTax;
+
+        /**
+         * 新车同类价格(不含税):同配置其他颜色/年款参考价
+         */
+        @JsonProperty("newKindredPrice")
+        @JSONField(ordinal = 11)
+        private String newKindredPrice;
+
+        /**
+         * 新车同类价格(含税)
+         */
+        @JsonProperty("newKindredPriceTax")
+        @JSONField(ordinal = 12)
+        private String newKindredPriceTax;
+
+        /**
+         * 核定座位数:影响座位险保费
+         */
+        @JsonProperty("newSeatNumber")
+        @JSONField(ordinal = 13)
+        private String newSeatNumber;
+
+        /**
+         * 原始座位数最小值:用于座位数变更场景
+         */
+        @JsonProperty("newOrigSeatMin")
+        @JSONField(ordinal = 14)
+        private String newOrigSeatMin;
+
+        /**
+         * 原始座位数最大值
+         */
+        @JsonProperty("newOrigSeatMax")
+        @JSONField(ordinal = 15)
+        private String newOrigSeatMax;
+
+        /**
+         * 吨位:货车/专用车的载重量(乘用车为空)
+         */
+        @JsonProperty("ntonage")
+        @JSONField(ordinal = 16)
+        private String ntonage;
+
+        /**
+         * 整车质量最小值(KG):车辆自重下限
+         */
+        @JsonProperty("newOrigQualityMin")
+        @JSONField(ordinal = 17)
+        private String newOrigQualityMin;
+
+        /**
+         * 整车质量最大值(KG):车辆自重上限
+         */
+        @JsonProperty("newOrigQualityMax")
+        @JSONField(ordinal = 18)
+        private String newOrigQualityMax;
+
+        /**
+         * 排量(升):发动机排量,影响车船税
+         */
+        @JsonProperty("carLntSrc")
+        @JSONField(ordinal = 19)
+        private String carLntSrc;
+
+        /**
+         * 业务分类:A=家用车,B=营运车等
+         */
+        @JsonProperty("carBusiClass")
+        @JSONField(ordinal = 20)
+        private String carBusiClass;
+
+        /**
+         * 车辆类型代码:标准化车辆分类编码
+         */
+        @JsonProperty("carVhlTyp")
+        @JSONField(ordinal = 21)
+        private String carVhlTyp;
+
+        /**
+         * 进口标志:1=进口,2=国产,3=合资
+         */
+        @JsonProperty("importFlag")
+        @JSONField(ordinal = 22)
+        private String importFlag;
+
+        /**
+         * 行业标准车型代码:中保协统一车型编码
+         */
+        @JsonProperty("industryModelCode")
+        @JSONField(ordinal = 23)
+        private String industryModelCode;
+
+        /**
+         * 车辆减免标识:0=无减免,1=有减免(如新能源)
+         */
+        @JsonProperty("carReducCarShow")
+        @JSONField(ordinal = 24)
+        private String carReducCarShow;
+
+        /**
+         * 能源类型:FT001=汽油,FT002=柴油,FT003=新能源等
+         */
+        @JsonProperty("carEnergyType")
+        @JSONField(ordinal = 25)
+        private String carEnergyType;
+
+        /**
+         * 新行业代码:预留字段
+         */
+        @JsonProperty("newIndustryCode")
+        @JSONField(ordinal = 26)
+        private String newIndustryCode;
+
+        /**
+         * 车型能源类型:0=传统燃油,1=混动,2=纯电等
+         */
+        @JsonProperty("modelEneryType")
+        @JSONField(ordinal = 27)
+        private String modelEneryType;
+
+        /**
+         * 车身长度(毫米):影响部分地区停车费保险
+         */
+        @JsonProperty("carLength")
+        @JSONField(ordinal = 28)
+        private String carLength;
+
+        /**
+         * 停售标志:0=在售,1=停售(影响续保和理赔)
+         */
+        @JsonProperty("stopFlag")
+        @JSONField(ordinal = 29)
+        private String stopFlag;
+    }
+}

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

@@ -0,0 +1,55 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫校验Token响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerCheckTokenResponse {
+
+    /**
+     * Token是否有效
+     */
+    private Boolean valid;
+
+    /**
+     * 新Token(如果需要更新)
+     */
+    private String newToken;
+
+    /**
+     * Token过期时间
+     */
+    private Long expireTime;
+
+    /**
+     * 操作员信息
+     */
+    private OperatorInfo operatorInfo;
+
+    @Data
+    public static class OperatorInfo {
+        /**
+         * 操作员代码
+         */
+        private String operatorCode;
+
+        /**
+         * 操作员姓名
+         */
+        private String operatorName;
+
+        /**
+         * 机构代码
+         */
+        private String orgCode;
+
+        /**
+         * 机构名称
+         */
+        private String orgName;
+    }
+}

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

@@ -0,0 +1,46 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class TaiShanCrawlerCompaniesResponse {
+
+    @JsonProperty("pageNum")
+    private Integer pageNum;
+
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    @JsonProperty("list")
+    private List<ListDTO> list;
+
+    @JsonProperty("total")
+    private Integer total;
+
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ListDTO {
+        @JsonProperty("parentCode")
+        private String parentCode;
+        @JsonProperty("relationCode")
+        private String relationCode;
+        @JsonProperty("companyNature")
+        private String companyNature;
+        @JsonProperty("manageCompanyCode")
+        private String manageCompanyCode;
+        @JsonProperty("departmentCode")
+        private String departmentCode;
+        @JsonProperty("cDptCde")
+        private String cDptCde;
+        @JsonProperty("cDptNme")
+        private String cDptNme;
+    }
+}

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

@@ -0,0 +1,86 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 泰山财险爬虫获取车辆实际价值响应实体类
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerGetActualValueResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2190496123695048021L;
+
+    /**
+     * 响应状态码:200=成功
+     */
+    @JsonProperty("code")
+    @JSONField(name = "code", ordinal = 1)
+    private String code;
+
+    /**
+     * 响应消息:请求处理结果
+     */
+    @JsonProperty("message")
+    @JSONField(name = "message", ordinal = 2)
+    private String message;
+
+    /**
+     * 响应结果数据
+     */
+    @JsonProperty("result")
+    @JSONField(name = "result", ordinal = 3)
+    private Result result;
+
+    /**
+     * 结果数据内部类
+     */
+    @Data
+    public static class Result implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2190496123695048022L;
+
+        /**
+         * 车辆实际价值:折旧后的现值(用于车损险保额)
+         */
+        @JsonProperty("actualValue")
+        @JSONField(name = "actualValue", ordinal = 1)
+        private String actualValue;
+
+        /**
+         * 使用年限代码:标准化年限编码
+         */
+        @JsonProperty("usedYearCode")
+        @JSONField(name = "usedYearCode", ordinal = 2)
+        private String usedYearCode;
+
+        /**
+         * 已使用年数:车龄(整年)
+         */
+        @JsonProperty("usedYear")
+        @JSONField(name = "usedYear", ordinal = 3)
+        private String usedYear;
+
+        /**
+         * 已使用月数:不足一年的月份
+         */
+        @JsonProperty("usedMonth")
+        @JSONField(name = "usedMonth", ordinal = 4)
+        private String usedMonth;
+
+        /**
+         * 折旧率:年折旧百分比
+         */
+        @JsonProperty("rate")
+        @JSONField(name = "rate", ordinal = 5)
+        private String rate;
+    }
+}

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

@@ -0,0 +1,2529 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * 泰康爬虫报价响应实体类
+ * 包含投保单信息、投保人信息、被保险人信息、车主信息、车辆信息、
+ * 交强险、商业险以及其他各类保险产品的完整响应数据
+ *
+ * @author system
+ * @since 2025-11-19
+ */
+@Data
+public class TaiShanCrawlerQuotationResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 4605254182808038151L;
+
+    /**
+     * 响应状态码
+     */
+    @JsonProperty("code")
+    @JSONField(ordinal = 1)
+    private String code;
+
+    /**
+     * 响应消息
+     */
+    @JsonProperty("message")
+    @JSONField(ordinal = 2)
+    private String message;
+
+    /**
+     * 响应结果数据
+     */
+    @JsonProperty("result")
+    @JSONField(ordinal = 3)
+    private Result result;
+
+    /**
+     * 响应结果内部类
+     */
+    @Data
+    public static class Result {
+        /**
+         * 投保单信息
+         */
+        @JsonProperty("proposalInfo")
+        @JSONField(ordinal = 1)
+        private ProposalInfo proposalInfo;
+
+        /**
+         * 投保人信息
+         */
+        @JsonProperty("applicantInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private ApplicantInfo applicantInfo;
+
+        /**
+         * 被保险人信息
+         */
+        @JsonProperty("insuredInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private InsuredInfo insuredInfo;
+
+        /**
+         * 车主信息
+         */
+        @JsonProperty("vehicleOwnerInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private VehicleOwnerInfo vehicleOwnerInfo;
+
+        /**
+         * 车辆信息
+         */
+        @JsonProperty("vehicleInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private VehicleInfo vehicleInfo;
+
+        /**
+         * 交强险信息
+         */
+        @JsonProperty("compulsoryInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private CompulsoryInsurance compulsoryInsurance;
+
+        /**
+         * 商业险信息
+         */
+        @JsonProperty("businessInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private BusinessInsurance businessInsurance;
+
+        /**
+         * 家财险信息
+         */
+        @JsonProperty("householdInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private HouseholdInsurance householdInsurance;
+
+        /**
+         * 家财险B款信息
+         */
+        @JsonProperty("householdBInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private HouseholdBInsurance householdBInsurance;
+
+        /**
+         * 特种车险信息
+         */
+        @JsonProperty("tfInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private TfInsurance tfInsurance;
+
+        /**
+         * 意外险信息
+         */
+        @JsonProperty("acInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private AcInsurance acInsurance;
+
+        /**
+         * 雇主责任险信息
+         */
+        @JsonProperty("gsInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private GsInsurance gsInsurance;
+
+        /**
+         * 家财险C款信息
+         */
+        @JsonProperty("householdCInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private HouseholdCInsurance householdCInsurance;
+
+        /**
+         * 货运险信息
+         */
+        @JsonProperty("dpInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private DpInsurance dpInsurance;
+
+        /**
+         * 个人意外险信息
+         */
+        @JsonProperty("paInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private PaInsurance paInsurance;
+
+        /**
+         * 摩托车险信息
+         */
+        @JsonProperty("mcInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private McInsurance mcInsurance;
+
+        /**
+         * 玻璃险信息
+         */
+        @JsonProperty("glInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private GlInsurance glInsurance;
+
+        /**
+         * 健康险信息
+         */
+        @JsonProperty("hlInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 18)
+        private HlInsurance hlInsurance;
+
+        /**
+         * 盗抢险信息
+         */
+        @JsonProperty("diInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 19)
+        private DiInsurance diInsurance;
+
+        /**
+         * 船舶险信息
+         */
+        @JsonProperty("mtInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 20)
+        private MtInsurance mtInsurance;
+
+        /**
+         * 货运险信息(重复字段)
+         */
+        @JsonProperty("htInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 21)
+        private HtInsurance htInsurance;
+
+        /**
+         * 自行车险信息
+         */
+        @JsonProperty("btInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 22)
+        private BtInsurance btInsurance;
+
+        /**
+         * 退货运费险信息
+         */
+        @JsonProperty("rtInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 23)
+        private RtInsurance rtInsurance;
+
+        /**
+         * 门诊险信息
+         */
+        @JsonProperty("opdInsurance")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 24)
+        private OpdInsurance opdInsurance;
+
+        /**
+         * 系数信息
+         */
+        @JsonProperty("coefficientInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 25)
+        private CoefficientInfo coefficientInfo;
+
+        /**
+         * 异常信息
+         */
+        @JsonProperty("exception")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 26)
+        private Exception exception;
+
+        /**
+         * 受益人列表
+         */
+        @JsonProperty("benefitedList")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 27)
+        private String benefitedList;
+    }
+
+    /**
+     * 投保单信息
+     * 包含订单的基本信息、渠道信息、机构信息、销售信息等
+     */
+    @Data
+    public static class ProposalInfo {
+        /**
+         * 订单号
+         */
+        @JsonProperty("orderNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String orderNo;
+
+        /**
+         * 部门层级关系代码
+         * 格式:省;市;区县;机构代码
+         */
+        @JsonProperty("dptRelCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String dptRelCde;
+
+        /**
+         * 登录机构代码
+         */
+        @JsonProperty("loginCompany")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String loginCompany;
+
+        /**
+         * 组合产品代码
+         */
+        @JsonProperty("combinedProductCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String combinedProductCode;
+
+        /**
+         * 默认渠道代码
+         */
+        @JsonProperty("defaultChannel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String defaultChannel;
+
+        /**
+         * 承保机构代码
+         */
+        @JsonProperty("underWriteCompany")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String underWriteCompany;
+
+        /**
+         * 承保机构名称
+         */
+        @JsonProperty("underWriteCompanyname")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String underWriteCompanyname;
+
+        /**
+         * 承保机构全称
+         */
+        @JsonProperty("underwritingAgencyName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String underwritingAgencyName;
+
+        /**
+         * 销售员代码
+         */
+        @JsonProperty("saleCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String saleCode;
+
+        /**
+         * 销售员工号(身份证号)
+         */
+        @JsonProperty("saleNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String saleNo;
+
+        /**
+         * 销售员电话
+         */
+        @JsonProperty("saleTel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String saleTel;
+
+        /**
+         * 销售员姓名
+         */
+        @JsonProperty("saleName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String saleName;
+
+        /**
+         * 销售渠道
+         * 02=柜面
+         */
+        @JsonProperty("saleChannel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String saleChannel;
+
+        /**
+         * 代理人代码
+         */
+        @JsonProperty("agent")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String agent;
+
+        /**
+         * 代理人姓名
+         */
+        @JsonProperty("agentName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private String agentName;
+
+        /**
+         * 是否独立代理人
+         */
+        @JsonProperty("isIndependenceAgent")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private String isIndependenceAgent;
+
+        /**
+         * 省份代码
+         */
+        @JsonProperty("province")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private String province;
+
+        /**
+         * 城市代码
+         */
+        @JsonProperty("city")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 18)
+        private String city;
+
+        /**
+         * 区县代码
+         */
+        @JsonProperty("county")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 19)
+        private String county;
+
+        /**
+         * 方案号
+         */
+        @JsonProperty("pkgNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 20)
+        private String pkgNo;
+
+        /**
+         * 方案号S
+         */
+        @JsonProperty("pkgNoS")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 21)
+        private String pkgNoS;
+
+        /**
+         * 团队订单名称
+         */
+        @JsonProperty("teamOrderName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 22)
+        private String teamOrderName;
+
+        /**
+         * 投保时间
+         */
+        @JsonProperty("proposalTime")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 23)
+        private String proposalTime;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 24)
+        private String operatorCode;
+
+        /**
+         * 操作时间
+         */
+        @JsonProperty("operateDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 25)
+        private String operateDate;
+
+        /**
+         * 共保号
+         */
+        @JsonProperty("jointNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 26)
+        private String jointNo;
+
+        /**
+         * 商业险综合调整费率
+         */
+        @JsonProperty("syAdjustRate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 27)
+        private String syAdjustRate;
+
+        /**
+         * 总保费
+         * 包含交强险+商业险+车船税
+         */
+        @JsonProperty("totalPremium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 28)
+        private String totalPremium;
+
+        /**
+         * 商业险标识
+         * 1=投保
+         */
+        @JsonProperty("mark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 29)
+        private String mark;
+
+        /**
+         * 家财险标识
+         */
+        @JsonProperty("houseMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 30)
+        private String houseMark;
+
+        /**
+         * 家财险B款标识
+         */
+        @JsonProperty("houseBMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 31)
+        private String houseBMark;
+
+        /**
+         * 特种车险标识
+         */
+        @JsonProperty("tfcmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 32)
+        private String tfcmark;
+
+        /**
+         * 意外险标识
+         */
+        @JsonProperty("actmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 33)
+        private String actmark;
+
+        /**
+         * 雇主责任险标识
+         */
+        @JsonProperty("gasmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 34)
+        private String gasmark;
+
+        /**
+         * 家财险C款标识
+         */
+        @JsonProperty("houseCMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 35)
+        private String houseCMark;
+
+        /**
+         * 货运险标识
+         */
+        @JsonProperty("dpMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 36)
+        private String dpMark;
+
+        /**
+         * 盗抢险标识
+         */
+        @JsonProperty("diMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 37)
+        private String diMark;
+
+        /**
+         * 健康险标识
+         */
+        @JsonProperty("hlMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 38)
+        private String hlMark;
+
+        /**
+         * 个人意外险标识
+         */
+        @JsonProperty("paMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 39)
+        private String paMark;
+
+        /**
+         * 摩托车险标识
+         */
+        @JsonProperty("mcMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 40)
+        private String mcMark;
+
+        /**
+         * 玻璃险标识
+         */
+        @JsonProperty("glMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 41)
+        private String glMark;
+
+        /**
+         * 船舶险标识
+         */
+        @JsonProperty("mtmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 42)
+        private String mtmark;
+
+        /**
+         * 货运险标识(重复)
+         */
+        @JsonProperty("htmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 43)
+        private String htmark;
+
+        /**
+         * 自行车险标识
+         */
+        @JsonProperty("btmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 44)
+        private String btmark;
+
+        /**
+         * 退货运费险标识
+         */
+        @JsonProperty("rtmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 45)
+        private String rtmark;
+
+        /**
+         * 门诊险标识
+         */
+        @JsonProperty("opdmark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 46)
+        private String opdmark;
+
+        /**
+         * 投保单状态
+         * 1=已保存
+         */
+        @JsonProperty("status")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 47)
+        private String status;
+
+        /**
+         * EDR项目编号
+         */
+        @JsonProperty("edrPrjNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 48)
+        private String edrPrjNo;
+
+        /**
+         * 订单流水号
+         */
+        @JsonProperty("orderSerialNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 49)
+        private String orderSerialNo;
+
+        /**
+         * 是否变更标识
+         */
+        @JsonProperty("isChangeMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 50)
+        private String isChangeMark;
+
+        /**
+         * 续保标识
+         * 0=新保
+         */
+        @JsonProperty("renewMrk")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 51)
+        private String renewMrk;
+
+        /**
+         * 交强险保额
+         */
+        @JsonProperty("jqAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 52)
+        private String jqAmount;
+
+        /**
+         * 商业险保额
+         */
+        @JsonProperty("syAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 53)
+        private String syAmount;
+
+        /**
+         * 项目系统
+         */
+        @JsonProperty("itemSystem")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 54)
+        private String itemSystem;
+
+        /**
+         * 来源系统
+         */
+        @JsonProperty("source")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 55)
+        private String source;
+
+        /**
+         * 备注
+         */
+        @JsonProperty("reMark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 56)
+        private String reMark;
+
+        /**
+         * 基础C备注
+         */
+        @JsonProperty("baseCRemark")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 57)
+        private String baseCRemark;
+
+        /**
+         * 机器码
+         */
+        @JsonProperty("machineCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 58)
+        private String machineCode;
+
+        /**
+         * 上年保单号
+         */
+        @JsonProperty("lastPolicyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 59)
+        private String lastPolicyNo;
+
+        /**
+         * 风险评分
+         */
+        @JsonProperty("riskScore")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 60)
+        private String riskScore;
+
+        /**
+         * 风险评估详情
+         * 包含各项风险评估结果
+         */
+        @JsonProperty("resultDetail")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 61)
+        private String resultDetail;
+
+        /**
+         * 创建时间
+         */
+        @JsonProperty("crtTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 62)
+        private String crtTm;
+
+        /**
+         * 单交强险标志
+         */
+        @JsonProperty("singleJqFlag")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 63)
+        private String singleJqFlag;
+
+        /**
+         * 特殊客户
+         */
+        @JsonProperty("spCust")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 64)
+        private String spCust;
+
+        /**
+         * 特殊客户S
+         */
+        @JsonProperty("spCustS")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 65)
+        private String spCustS;
+
+        /**
+         * 特殊客户分类
+         */
+        @JsonProperty("spCustClass")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 66)
+        private String spCustClass;
+
+        /**
+         * 客户群组
+         */
+        @JsonProperty("custGroups")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 67)
+        private String custGroups;
+
+        /**
+         * 业务员姓名
+         */
+        @JsonProperty("salesmanName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 68)
+        private String salesmanName;
+
+        /**
+         * 业务员证书号
+         */
+        @JsonProperty("certSalesmanNum")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 69)
+        private String certSalesmanNum;
+
+        /**
+         * 证书名称
+         */
+        @JsonProperty("certificateName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 70)
+        private String certificateName;
+
+        /**
+         * 证书电话
+         */
+        @JsonProperty("certificatePhone")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 71)
+        private String certificatePhone;
+
+        /**
+         * 救援标志
+         */
+        @JsonProperty("rescueFlg")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 72)
+        private String rescueFlg;
+
+        /**
+         * 商业险特殊预期折扣
+         */
+        @JsonProperty("sySpecialExpectDisc")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 73)
+        private String sySpecialExpectDisc;
+
+        /**
+         * 商业险特殊方案ID
+         */
+        @JsonProperty("syTsFcId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 74)
+        private String syTsFcId;
+
+        /**
+         * 交强险特殊方案ID
+         */
+        @JsonProperty("jqTsFcId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 75)
+        private String jqTsFcId;
+
+        /**
+         * 绿色投保标志
+         */
+        @JsonProperty("greenInsure")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 76)
+        private String greenInsure;
+
+        /**
+         * 是否绿色通道
+         */
+        @JsonProperty("isGreen")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 77)
+        private String isGreen;
+    }
+
+    /**
+     * 投保人信息
+     * 包含投保申请人的基本信息、联系方式、证件信息等
+     */
+    @Data
+    public static class ApplicantInfo {
+        /**
+         * 客户唯一标识ID
+         * 通常是系统内部生成的唯一主键
+         */
+        @JsonProperty("personId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String personId;
+
+        /**
+         * 客户类型
+         * 1=个人客户, 2=团体/企业客户
+         */
+        @JsonProperty("clientType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String clientType;
+
+        /**
+         * 投保人/申请人姓名
+         */
+        @JsonProperty("personName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String personName;
+
+        /**
+         * 证件类型
+         * 01=居民身份证 (行业标准代码)
+         */
+        @JsonProperty("identifyType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String identifyType;
+
+        /**
+         * 证件号码
+         */
+        @JsonProperty("identifyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String identifyNo;
+
+        /**
+         * 性别代码
+         * 106001 通常对应系统字典表,此处指男性
+         */
+        @JsonProperty("gender")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String gender;
+
+        /**
+         * 移动电话
+         */
+        @JsonProperty("mobile")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String mobile;
+
+        /**
+         * 电子邮箱
+         */
+        @JsonProperty("email")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String email;
+
+        /**
+         * 详细联系地址
+         */
+        @JsonProperty("address")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String address;
+
+        /**
+         * 是否车主
+         * 用于车险业务判断
+         * 1=是, 0=否
+         */
+        @JsonProperty("isOwner")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String isOwner;
+
+        /**
+         * 是否签署电子投保单/电子签名
+         * 1=是, 0=否
+         */
+        @JsonProperty("isElectronicSign")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String isElectronicSign;
+
+        /**
+         * 反洗钱风险等级代码
+         * 920001 对应具体等级,如低风险
+         */
+        @JsonProperty("antiRiskLevel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String antiRiskLevel;
+    }
+
+    /**
+     * 被保险人信息
+     * 包含被保险人的基本信息、关系信息、反洗钱等级等
+     */
+    @Data
+    public static class InsuredInfo {
+        /**
+         * 客户唯一标识ID
+         */
+        @JsonProperty("personId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String personId;
+
+        /**
+         * 被保险人姓名
+         */
+        @JsonProperty("personName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String personName;
+
+        /**
+         * 证件号码
+         */
+        @JsonProperty("identifyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String identifyNo;
+
+        /**
+         * 是否车主
+         * 0=否(实际同一人)
+         */
+        @JsonProperty("isOwner")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String isOwner;
+
+        /**
+         * 是否投保人
+         * 1=是
+         */
+        @JsonProperty("isApplication")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String isApplication;
+
+        /**
+         * 预留文本1
+         * 193001 对应具体含义
+         */
+        @JsonProperty("resvTxt1")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String resvTxt1;
+
+        /**
+         * 与车主关系
+         * 11=本人
+         */
+        @JsonProperty("relationShip")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String relationShip;
+
+        /**
+         * 反洗钱风险等级
+         */
+        @JsonProperty("antiRiskLevel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String antiRiskLevel;
+    }
+
+    /**
+     * 车主信息
+     * 包含车辆所有人的基本信息、年龄、性别等
+     */
+    @Data
+    public static class VehicleOwnerInfo {
+        /**
+         * 客户类型
+         */
+        @JsonProperty("clientType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String clientType;
+
+        /**
+         * 车主姓名
+         */
+        @JsonProperty("personName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String personName;
+
+        /**
+         * 证件类型
+         */
+        @JsonProperty("identifyType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String identifyType;
+
+        /**
+         * 证件号码
+         */
+        @JsonProperty("identifyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String identifyNo;
+
+        /**
+         * 出生年份
+         */
+        @JsonProperty("yearOfBirth")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String yearOfBirth;
+
+        /**
+         * 性别代码
+         * 106001 对应系统字典表,通常指男性
+         */
+        @JsonProperty("gender")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String gender;
+
+        /**
+         * 车主年龄
+         */
+        @JsonProperty("personAge")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String personAge;
+    }
+
+    /**
+     * 车辆信息
+     * 包含车辆的详细信息,如车牌号、VIN码、发动机号、型号、品牌等
+     */
+    @Data
+    public static class VehicleInfo {
+        /**
+         * 车牌号
+         */
+        @JsonProperty("plateNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String plateNo;
+
+        /**
+         * 是否有车牌号
+         */
+        @JsonProperty("isPlateNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String isPlateNo;
+
+        /**
+         * VIN码(车辆识别码)
+         */
+        @JsonProperty("vin")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String vin;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String engineNo;
+
+        /**
+         * 注册日期
+         */
+        @JsonProperty("registerDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String registerDate;
+
+        /**
+         * 车型名称
+         */
+        @JsonProperty("modelNme")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String modelNme;
+
+        /**
+         * 是否精确匹配
+         */
+        @JsonProperty("isAccurate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String isAccurate;
+
+        /**
+         * 使用性质代码
+         */
+        @JsonProperty("useNatureShow")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String useNatureShow;
+
+        /**
+         * 使用性质名称
+         * 家庭自用汽车
+         */
+        @JsonProperty("useNatureShowName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String useNatureShowName;
+
+        /**
+         * 车辆类型代码
+         */
+        @JsonProperty("vehicleType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String vehicleType;
+
+        /**
+         * 车辆类别代码
+         */
+        @JsonProperty("vehicleCategoryCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String vehicleCategoryCde;
+
+        /**
+         * 注册车辆类型
+         */
+        @JsonProperty("regVhlTyp")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String regVhlTyp;
+
+        /**
+         * 号牌类型
+         */
+        @JsonProperty("plateType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String plateType;
+
+        /**
+         * 新车购置价
+         */
+        @JsonProperty("purchasePrice")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String purchasePrice;
+
+        /**
+         * 车辆现值(折旧后)
+         */
+        @JsonProperty("negotiatedValue")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private String negotiatedValue;
+
+        /**
+         * 座位数
+         */
+        @JsonProperty("seatCount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private String seatCount;
+
+        /**
+         * 牌照颜色
+         */
+        @JsonProperty("plateColor")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private String plateColor;
+
+        /**
+         * 是否外地车
+         */
+        @JsonProperty("isFieldCar")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 18)
+        private String isFieldCar;
+
+        /**
+         * 功率(排量)
+         */
+        @JsonProperty("power")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 19)
+        private String power;
+
+        /**
+         * 整备质量
+         */
+        @JsonProperty("weight")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 20)
+        private String weight;
+
+        /**
+         * 是否新车
+         */
+        @JsonProperty("newCarFlag")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 21)
+        private String newCarFlag;
+
+        /**
+         * 车辆年检状态
+         */
+        @JsonProperty("carInspection")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 22)
+        private String carInspection;
+
+        /**
+         * 免检原因
+         */
+        @JsonProperty("exemptionInspectReason")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 23)
+        private String exemptionInspectReason;
+
+        /**
+         * 车型代码
+         */
+        @JsonProperty("modelCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 24)
+        private String modelCde;
+
+        /**
+         * 商业险查询代码
+         */
+        @JsonProperty("syQryCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 25)
+        private String syQryCde;
+
+        /**
+         * 交强险查询代码
+         */
+        @JsonProperty("jqQryCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 26)
+        private String jqQryCde;
+
+        /**
+         * 品牌ID
+         */
+        @JsonProperty("brandId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 27)
+        private String brandId;
+
+        /**
+         * 上年无赔款记录
+         * NCD-2(2年无赔)
+         */
+        @JsonProperty("noComLastFloatRecord")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 28)
+        private String noComLastFloatRecord;
+
+        /**
+         * 实际协商价值
+         */
+        @JsonProperty("negotiatedActulValue")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 29)
+        private String negotiatedActulValue;
+
+        /**
+         * 品牌
+         * 上海大众
+         */
+        @JsonProperty("brand")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 30)
+        private String brand;
+
+        /**
+         * 品牌代码
+         */
+        @JsonProperty("brandCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 31)
+        private String brandCode;
+
+        /**
+         * 车辆名称
+         */
+        @JsonProperty("carName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 32)
+        private String carName;
+
+        /**
+         * 类别代码
+         */
+        @JsonProperty("categoryCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 33)
+        private String categoryCode;
+
+        /**
+         * 类别名称
+         * 越野汽车
+         */
+        @JsonProperty("categoryName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 34)
+        private String categoryName;
+
+        /**
+         * 配置类型
+         */
+        @JsonProperty("configType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 35)
+        private String configType;
+
+        /**
+         * 部门代码
+         */
+        @JsonProperty("deptCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 36)
+        private String deptCode;
+
+        /**
+         * 部门名称
+         * 合资
+         */
+        @JsonProperty("deptName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 37)
+        private String deptName;
+
+        /**
+         * 车型ID代码
+         */
+        @JsonProperty("modelIdCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 38)
+        private String modelIdCode;
+
+        /**
+         * 车系
+         */
+        @JsonProperty("series")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 39)
+        private String series;
+
+        /**
+         * 车系代码
+         */
+        @JsonProperty("seriesCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 40)
+        private String seriesCode;
+
+        /**
+         * 交易代码
+         */
+        @JsonProperty("tradeCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 41)
+        private String tradeCode;
+
+        /**
+         * 交易名称
+         */
+        @JsonProperty("tradeName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 42)
+        private String tradeName;
+
+        /**
+         * 产地
+         */
+        @JsonProperty("prodPlace")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 43)
+        private String prodPlace;
+
+        /**
+         * 交强险NCD原因
+         * C3类型
+         */
+        @JsonProperty("jqNcdReason")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 44)
+        private String jqNcdReason;
+
+        /**
+         * 连续投保年限
+         */
+        @JsonProperty("insureYears")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 45)
+        private String insureYears;
+
+        /**
+         * 出险次数
+         */
+        @JsonProperty("claimTimes")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 46)
+        private String claimTimes;
+
+        /**
+         * 理赔调整等级
+         */
+        @JsonProperty("claimAdjustLevel")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 47)
+        private String claimAdjustLevel;
+
+        /**
+         * OCR识别UUID
+         */
+        @JsonProperty("ocrUuId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 48)
+        private String ocrUuId;
+
+        /**
+         * 交强险UUID
+         */
+        @JsonProperty("jqUuid")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 49)
+        private String jqUuid;
+
+        /**
+         * 商业险UUID
+         */
+        @JsonProperty("syUuid")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 50)
+        private String syUuid;
+
+        /**
+         * 车型能源类型
+         */
+        @JsonProperty("modelEneryType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 51)
+        private String modelEneryType;
+
+        /**
+         * 行业车型代码
+         */
+        @JsonProperty("industryModelCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 52)
+        private String industryModelCode;
+
+        /**
+         * 车龄
+         */
+        @JsonProperty("carAge")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 53)
+        private String carAge;
+
+        /**
+         * 商业险是否过户车
+         */
+        @JsonProperty("syIsTransferCar")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 54)
+        private String syIsTransferCar;
+
+        /**
+         * 交强险是否过户车
+         */
+        @JsonProperty("jqIsTransferCar")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 55)
+        private String jqIsTransferCar;
+
+        /**
+         * 发证年月
+         */
+        @JsonProperty("issueYm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 56)
+        private String issueYm;
+
+        /**
+         * 交强险预留文本20
+         */
+        @JsonProperty("jqCResvTxt20")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 57)
+        private String jqCResvTxt20;
+
+        /**
+         * 商业险预留文本20
+         */
+        @JsonProperty("syCResvTxt20")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 58)
+        private String syCResvTxt20;
+    }
+
+    /**
+     * 交强险信息
+     * 包含机动车交通事故责任强制保险的产品信息、责任限额和车船税信息
+     */
+    @Data
+    public static class CompulsoryInsurance {
+        /**
+         * 交强险产品信息
+         * 包含起止日期、保费等基本信息
+         */
+        @JsonProperty("productInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private ProductInfo productInfo;
+
+        /**
+         * 交强险责任限额列表
+         * 包含死亡伤残、医疗费用、财产损失等各分项限额
+         */
+        @JsonProperty("itemKinds")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private java.util.List<ItemKind> itemKinds;
+
+        /**
+         * 车船税信息
+         * 包含税额计算、缴税方式等
+         */
+        @JsonProperty("carShipTax")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private CarShipTax carShipTax;
+
+        /**
+         * 特殊信息列表
+         */
+        @JsonProperty("specialInfos")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private java.util.List<Object> specialInfos;
+    }
+
+    /**
+     * 商业险信息
+     * 包含机动车商业保险的产品信息、各险种明细、设备信息等
+     */
+    @Data
+    public static class BusinessInsurance {
+        /**
+         * 商业险产品信息
+         * 包含起止日期、总保费、风险保额等
+         */
+        @JsonProperty("productInfo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private BusinessProductInfo productInfo;
+
+        /**
+         * 商业险险种明细列表
+         * 包含第三者责任险、车上人员责任险等各险种详细信息
+         */
+        @JsonProperty("itemKinds")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private java.util.List<BusinessItemKind> itemKinds;
+
+        /**
+         * 设备信息
+         * 如行车记录仪、GPS设备等
+         */
+        @JsonProperty("deviceInfos")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String deviceInfos;
+
+        /**
+         * 特殊信息列表
+         */
+        @JsonProperty("specialInfos")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private java.util.List<Object> specialInfos;
+
+        /**
+         * 充电桩信息
+         * 适用于新能源车辆
+         */
+        @JsonProperty("chargingPiles")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String chargingPiles;
+    }
+
+    /**
+     * 交强险产品信息
+     * 包含保险期间、保费、风险保额等基本信息
+     */
+    @Data
+    public static class ProductInfo {
+        /**
+         * 保险开始日期
+         */
+        @JsonProperty("startDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String startDate;
+
+        /**
+         * 保险结束日期
+         */
+        @JsonProperty("endDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String endDate;
+
+        /**
+         * 生效标志
+         */
+        @JsonProperty("effective")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String effective;
+
+        /**
+         * 保险天数
+         */
+        @JsonProperty("day")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String day;
+
+        /**
+         * 交强险保费
+         * 570元
+         */
+        @JsonProperty("premium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String premium;
+
+        /**
+         * 审批ID
+         */
+        @JsonProperty("apId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String apId;
+
+        /**
+         * 风险保额
+         * 200000.0(20万)
+         */
+        @JsonProperty("riskAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String riskAmount;
+
+        /**
+         * 保险项目标志
+         */
+        @JsonProperty("insureItemFlag")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String insureItemFlag;
+    }
+
+    /**
+     * 商业险产品信息
+     * 包含商业险保险期间、保费、风险保额等详细信息
+     */
+    @Data
+    public static class BusinessProductInfo {
+        /**
+         * 保险开始日期
+         */
+        @JsonProperty("startDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String startDate;
+
+        /**
+         * 保险结束日期
+         */
+        @JsonProperty("endDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String endDate;
+
+        /**
+         * 生效标志
+         */
+        @JsonProperty("effective")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String effective;
+
+        /**
+         * 保险天数
+         */
+        @JsonProperty("day")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String day;
+
+        /**
+         * 商业险套餐ID
+         */
+        @JsonProperty("syMeale")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String syMeale;
+
+        /**
+         * 商业险审批使用标志
+         */
+        @JsonProperty("syApUseFlg")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String syApUseFlg;
+
+        /**
+         * 商业险费用折扣
+         */
+        @JsonProperty("syFeeDiscount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String syFeeDiscount;
+
+        /**
+         * 商业险总保费
+         * 739.71元
+         */
+        @JsonProperty("premium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String premium;
+
+        /**
+         * 审批ID
+         */
+        @JsonProperty("apId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String apId;
+
+        /**
+         * 风险保额
+         * 2100000.0(210万)
+         */
+        @JsonProperty("riskAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String riskAmount;
+
+        /**
+         * 超限额标志
+         */
+        @JsonProperty("aboveThresholdFlag")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String aboveThresholdFlag;
+
+        /**
+         * 推荐调整值
+         */
+        @JsonProperty("recommAdjustValue")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String recommAdjustValue;
+    }
+
+    /**
+     * 交强险险种信息
+     * 包含交强险各分项的责任限额和保费信息
+     */
+    @Data
+    public static class ItemKind {
+        /**
+         * 险种代码
+         * 如030055=交强险死亡伤残赔偿限额
+         */
+        @JsonProperty("kindCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String kindCode;
+
+        /**
+         * 险种名称
+         */
+        @JsonProperty("kindName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String kindName;
+
+        /**
+         * 赔偿限额
+         * 如180000(18万)
+         */
+        @JsonProperty("amount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String amount;
+
+        /**
+         * 调整前保费
+         * 如950.0元
+         */
+        @JsonProperty("befPremium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String befPremium;
+
+        /**
+         * 基础保费
+         */
+        @JsonProperty("basePrm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String basePrm;
+
+        /**
+         * 调整前年保费
+         */
+        @JsonProperty("befAnnPrm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String befAnnPrm;
+
+        /**
+         * 险种排序
+         */
+        @JsonProperty("kindSort")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String kindSort;
+    }
+
+    /**
+     * 商业险险种信息
+     * 包含商业险各险种的详细保费计算、保额、折扣系数等
+     */
+    @Data
+    public static class BusinessItemKind {
+        /**
+         * 险种代码
+         * 如030018=第三者责任险
+         */
+        @JsonProperty("kindCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String kindCode;
+
+        /**
+         * 险种名称
+         */
+        @JsonProperty("kindName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String kindName;
+
+        /**
+         * 保额
+         * 如2000000.0(200万)
+         */
+        @JsonProperty("amount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String amount;
+
+        /**
+         * 调整前保费
+         */
+        @JsonProperty("befPremium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String befPremium;
+
+        /**
+         * 折扣系数
+         * 0.77476(NCD系数0.7×其他系数)
+         */
+        @JsonProperty("disCoef")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String disCoef;
+
+        /**
+         * 赔偿限额等级
+         */
+        @JsonProperty("indemLmtLvl")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String indemLmtLvl;
+
+        /**
+         * 赔偿限额
+         */
+        @JsonProperty("indemLmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String indemLmt;
+
+        /**
+         * 座位数限制
+         * 1个座位
+         */
+        @JsonProperty("liabDaysLmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String liabDaysLmt;
+
+        /**
+         * 每座保额
+         */
+        @JsonProperty("perAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String perAmt;
+
+        /**
+         * 调整前年保费
+         */
+        @JsonProperty("befAnnPrm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String befAnnPrm;
+
+        /**
+         * 基础保费
+         */
+        @JsonProperty("basePrm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String basePrm;
+
+        /**
+         * 年度保费
+         */
+        @JsonProperty("afterPremiumYear")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String afterPremiumYear;
+
+        /**
+         * 计算保费
+         */
+        @JsonProperty("calcPrm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String calcPrm;
+
+        /**
+         * 自主定价系数
+         * 1.1068
+         */
+        @JsonProperty("resvNumAutonomy")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String resvNumAutonomy;
+
+        /**
+         * 费率
+         */
+        @JsonProperty("rate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private String rate;
+
+        /**
+         * 实际保费
+         */
+        @JsonProperty("premium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private String premium;
+
+        /**
+         * 险种排序
+         */
+        @JsonProperty("kindSort")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private String kindSort;
+    }
+
+    /**
+     * 车船税信息
+     * 包含车船税的计算方法、缴税方式、减免政策等详细信息
+     */
+    @Data
+    public static class CarShipTax {
+        /**
+         * 缴税方式
+         * 3T5002对应具体缴税方式
+         */
+        @JsonProperty("taxPayWay")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String taxPayWay;
+
+        /**
+         * 缴税起期
+         */
+        @JsonProperty("payStartTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String payStartTm;
+
+        /**
+         * 缴税止期
+         */
+        @JsonProperty("payEndTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String payEndTm;
+
+        /**
+         * 纳税人姓名
+         */
+        @JsonProperty("taxPayerName")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String taxPayerName;
+
+        /**
+         * 纳税人识别号
+         */
+        @JsonProperty("taxpayerIdentifier")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String taxpayerIdentifier;
+
+        /**
+         * 单位税额
+         * 360.0(1.6L-2.0L排量年税额)
+         */
+        @JsonProperty("unitTaxAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String unitTaxAmt;
+
+        /**
+         * 实际税额
+         */
+        @JsonProperty("taxActual")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String taxActual;
+
+        /**
+         * 上年已缴税额
+         */
+        @JsonProperty("previousPay")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String previousPay;
+
+        /**
+         * 滞纳金
+         */
+        @JsonProperty("overDueAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String overDueAmt;
+
+        /**
+         * 税费总计
+         */
+        @JsonProperty("totalTax")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String totalTax;
+
+        /**
+         * 减免原因
+         */
+        @JsonProperty("taxReductionReason")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String taxReductionReason;
+
+        /**
+         * 减免方案
+         */
+        @JsonProperty("taxReliefPlan")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String taxReliefPlan;
+
+        /**
+         * 减免金额
+         */
+        @JsonProperty("abateAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String abateAmt;
+
+        /**
+         * 减免比例
+         */
+        @JsonProperty("freeRate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String freeRate;
+
+        /**
+         * 燃料类型
+         * FT001=汽油
+         */
+        @JsonProperty("fuelType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private String fuelType;
+
+        /**
+         * 支付ID
+         */
+        @JsonProperty("payId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private String payId;
+
+        /**
+         * 申报状态
+         */
+        @JsonProperty("declareStatuIa")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private String declareStatuIa;
+
+        /**
+         * 计税标志
+         * 1=已计算
+         */
+        @JsonProperty("calcTaxFlag")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 18)
+        private String calcTaxFlag;
+
+        /**
+         * 征税地代码
+         * 140000(山西省)
+         */
+        @JsonProperty("taxLocationCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 19)
+        private String taxLocationCode;
+
+        /**
+         * 税额单位类型
+         */
+        @JsonProperty("taxUnitTypeCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 20)
+        private String taxUnitTypeCode;
+
+        /**
+         * 年度税额
+         */
+        @JsonProperty("annualTaxAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 21)
+        private String annualTaxAmt;
+
+        /**
+         * 超期日期
+         */
+        @JsonProperty("exceedDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 22)
+        private String exceedDate;
+
+        /**
+         * 超期天数
+         */
+        @JsonProperty("exceedDaysCount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 23)
+        private String exceedDaysCount;
+
+        /**
+         * 免税金额
+         */
+        @JsonProperty("taxFreeAmt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 24)
+        private String taxFreeAmt;
+
+        /**
+         * 应缴年税额
+         */
+        @JsonProperty("annualTaxDue")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 25)
+        private String annualTaxDue;
+
+        /**
+         * 欠税总额
+         */
+        @JsonProperty("sumTaxDefault")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 26)
+        private String sumTaxDefault;
+
+        /**
+         * 滞纳金总额
+         */
+        @JsonProperty("sumOverDue")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 27)
+        private String sumOverDue;
+
+        /**
+         * 税额合计
+         */
+        @JsonProperty("sumTax")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 28)
+        private String sumTax;
+    }
+
+    /**
+     * 系数信息
+     * 包含商业险和交强险的各类折扣系数、NCD系数等定价参数
+     */
+    @Data
+    public static class CoefficientInfo {
+        /**
+         * 商业险历史出险记录
+         * NCD-2(2年无赔)
+         */
+        @JsonProperty("syAgoClmRec")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String syAgoClmRec;
+
+        /**
+         * 商业险历史出险系数
+         * 0.7(优惠30%)
+         */
+        @JsonProperty("syAgoClmRecCoeff")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String syAgoClmRecCoeff;
+
+        /**
+         * 商业险无赔款优待系数(NCD)
+         */
+        @JsonProperty("syNclmDisc")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String syNclmDisc;
+
+        /**
+         * 商业险交通违法系数
+         */
+        @JsonProperty("syTrafIrr")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String syTrafIrr;
+
+        /**
+         * 商业险渠道系数
+         */
+        @JsonProperty("syChaCoef")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String syChaCoef;
+
+        /**
+         * 商业险自主定价系数
+         */
+        @JsonProperty("syAutonomyCoef")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String syAutonomyCoef;
+
+        /**
+         * 商业险计算开始时间
+         */
+        @JsonProperty("syCalStrtTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String syCalStrtTm;
+
+        /**
+         * 商业险计算结束时间
+         */
+        @JsonProperty("syCalEndTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String syCalEndTm;
+
+        /**
+         * 交强险计算开始时间
+         */
+        @JsonProperty("jqCalStrtTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String jqCalStrtTm;
+
+        /**
+         * 交强险计算结束时间
+         */
+        @JsonProperty("jqCalEndTm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String jqCalEndTm;
+
+        /**
+         * 交强险预留数字3
+         * -0.4(优惠40%)
+         */
+        @JsonProperty("jqResvNum3")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String jqResvNum3;
+
+        /**
+         * 交强险预留数字4
+         * -0.4
+         */
+        @JsonProperty("jqResvNum4")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String jqResvNum4;
+
+        /**
+         * 交强险无折扣原因
+         */
+        @JsonProperty("jqNdiscRsn")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String jqNdiscRsn;
+
+        /**
+         * 自主定价预留系数
+         */
+        @JsonProperty("resvNumAutonomy")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String resvNumAutonomy;
+    }
+
+    /**
+     * 异常信息
+     * 包含接口调用的状态和错误信息
+     */
+    @Data
+    public static class Exception {
+        /**
+         * 异常代码
+         * H1=成功
+         */
+        @JsonProperty("code")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String code;
+
+        /**
+         * 异常消息
+         * 接口调用成功
+         */
+        @JsonProperty("msg")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String msg;
+    }
+
+    // 以下是各类保险的空结构体,主要为了保持JSON结构的完整性
+
+    /**
+     * 家财险信息
+     */
+    @Data
+    public static class HouseholdInsurance {
+        @JsonProperty("orderNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String orderNo;
+
+        @JsonProperty("seatCount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String seatCount;
+
+        @JsonProperty("jqProposalNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String jqProposalNo;
+
+        @JsonProperty("syProposalNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String syProposalNo;
+
+        @JsonProperty("unCarTypeCode")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String unCarTypeCode;
+
+        @JsonProperty("uncarId")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String uncarId;
+
+        @JsonProperty("startDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String startDate;
+
+        @JsonProperty("endDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String endDate;
+
+        @JsonProperty("premium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String premium;
+
+        @JsonProperty("riskAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String riskAmount;
+
+        @JsonProperty("proposalNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String proposalNo;
+
+        @JsonProperty("policyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String policyNo;
+
+        @JsonProperty("number")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String number;
+
+        @JsonProperty("specialContent")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String specialContent;
+
+        @JsonProperty("uncarShortRate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 15)
+        private String uncarShortRate;
+
+        @JsonProperty("address")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 16)
+        private String address;
+
+        @JsonProperty("uuid")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 17)
+        private String uuid;
+
+        @JsonProperty("dptCde")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 18)
+        private String dptCde;
+
+        @JsonProperty("useNatureShow")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 19)
+        private String useNatureShow;
+
+        @JsonProperty("applicant")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 20)
+        private String applicant;
+
+        @JsonProperty("insured")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 21)
+        private String insured;
+
+        @JsonProperty("itemKinds")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 22)
+        private String itemKinds;
+
+        @JsonProperty("schemeList")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 23)
+        private String schemeList;
+
+        @JsonProperty("amt")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 24)
+        private String amt;
+
+        @JsonProperty("prm")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 25)
+        private String prm;
+
+        @JsonProperty("uncarSubmitSign")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 26)
+        private String uncarSubmitSign;
+
+        @JsonProperty("resvTxt2")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 27)
+        private String resvTxt2;
+
+        @JsonProperty("houseAddress")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 28)
+        private String houseAddress;
+
+        @JsonProperty("accType")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 29)
+        private String accType;
+
+        @JsonProperty("houseCity")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 30)
+        private String houseCity;
+
+        @JsonProperty("applicantEnterlogo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 31)
+        private String applicantEnterlogo;
+
+        @JsonProperty("insuredEnterlogo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 32)
+        private String insuredEnterlogo;
+
+        @JsonProperty("novhlAge")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 33)
+        private String novhlAge;
+
+        @JsonProperty("licenseKey")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 34)
+        private String licenseKey;
+
+        @JsonProperty("businessYears")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 35)
+        private String businessYears;
+
+        @JsonProperty("id")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 36)
+        private String id;
+
+        @JsonProperty("jsUuid")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 37)
+        private String jsUuid;
+    }
+
+    /**
+     * 家财险B款信息
+     */
+    @Data
+    public static class HouseholdBInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 特种车险信息
+     */
+    @Data
+    public static class TfInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 意外险信息
+     */
+    @Data
+    public static class AcInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 雇主责任险信息
+     */
+    @Data
+    public static class GsInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 家财险C款信息
+     */
+    @Data
+    public static class HouseholdCInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 货运险信息
+     */
+    @Data
+    public static class DpInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 个人意外险信息
+     */
+    @Data
+    public static class PaInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 摩托车险信息
+     */
+    @Data
+    public static class McInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 玻璃险信息
+     */
+    @Data
+    public static class GlInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 健康险信息
+     */
+    @Data
+    public static class HlInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 盗抢险信息
+     */
+    @Data
+    public static class DiInsurance {
+        @JsonProperty("premium")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
+        private String premium;
+
+        @JsonProperty("riskAmount")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
+        private String riskAmount;
+
+        @JsonProperty("proposalNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
+        private String proposalNo;
+
+        @JsonProperty("policyNo")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
+        private String policyNo;
+
+        @JsonProperty("specialContent")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 5)
+        private String specialContent;
+
+        @JsonProperty("resvNumAutonomy")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 6)
+        private String resvNumAutonomy;
+
+        @JsonProperty("startDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 7)
+        private String startDate;
+
+        @JsonProperty("endDate")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 8)
+        private String endDate;
+
+        @JsonProperty("day")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 9)
+        private String day;
+
+        @JsonProperty("uncarSubmitSign")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 10)
+        private String uncarSubmitSign;
+
+        @JsonProperty("diKinds")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 11)
+        private String diKinds;
+
+        @JsonProperty("schemeList")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 12)
+        private String schemeList;
+
+        @JsonProperty("id")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 13)
+        private String id;
+
+        @JsonProperty("uuid")
+        @com.alibaba.fastjson.annotation.JSONField(ordinal = 14)
+        private String uuid;
+    }
+
+    /**
+     * 船舶险信息
+     */
+    @Data
+    public static class MtInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 货运险信息(重复字段)
+     */
+    @Data
+    public static class HtInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 自行车险信息
+     */
+    @Data
+    public static class BtInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 退货运费险信息
+     */
+    @Data
+    public static class RtInsurance extends HouseholdInsurance {
+    }
+
+    /**
+     * 门诊险信息
+     */
+    @Data
+    public static class OpdInsurance extends HouseholdInsurance {
+    }
+}

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

@@ -0,0 +1,72 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫核保响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerUnderwritingResponse {
+
+    /**
+     * 核保结果
+     */
+    private Boolean success;
+
+    /**
+     * 保单号
+     */
+    private String policyNo;
+
+    /**
+     * 交强险保单号
+     */
+    private String compulsoryPolicyNo;
+
+    /**
+     * 商业险保单号
+     */
+    private String commercialPolicyNo;
+
+    /**
+     * 核保状态
+     */
+    private String underwritingStatus;
+
+    /**
+     * 核保时间
+     */
+    private String underwritingTime;
+
+    /**
+     * 生效时间
+     */
+    private String effectiveTime;
+
+    /**
+     * 总保费
+     */
+    private Double totalPremium;
+
+    /**
+     * 支付链接
+     */
+    private String paymentUrl;
+
+    /**
+     * 核保消息
+     */
+    private String message;
+
+    /**
+     * 错误代码(如果核保失败)
+     */
+    private String errorCode;
+
+    /**
+     * 错误信息(如果核保失败)
+     */
+    private String errorMessage;
+}

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

@@ -0,0 +1,87 @@
+package com.jzg.quotation.taishan.crawler.entity.response;
+
+import lombok.Data;
+
+/**
+ * @description: 泰山财险爬虫车辆确认响应实体
+ * @author:
+ * @date:
+ **/
+@Data
+public class TaiShanCrawlerVehicleConfirmationResponse {
+
+    /**
+     * 确认结果
+     */
+    private Boolean success;
+
+    /**
+     * 车型代码
+     */
+    private String modelCode;
+
+    /**
+     * 车型名称
+     */
+    private String modelName;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 车系名称
+     */
+    private String seriesName;
+
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+
+    /**
+     * 座位数
+     */
+    private Integer seatCount;
+
+    /**
+     * 排量
+     */
+    private Double displacement;
+
+    /**
+     * 车价
+     */
+    private Double vehiclePrice;
+
+    /**
+     * 新车购置价
+     */
+    private Double newVehiclePrice;
+
+    /**
+     * 是否新能源汽车
+     */
+    private Boolean isNewEnergy;
+
+    /**
+     * 燃油类型
+     */
+    private String fuelType;
+
+    /**
+     * 变速箱类型
+     */
+    private String transmissionType;
+
+    /**
+     * 风险等级
+     */
+    private String riskLevel;
+
+    /**
+     * 错误信息(如果确认失败)
+     */
+    private String errorMessage;
+}

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

@@ -0,0 +1,18 @@
+package com.jzg.quotation.taishan.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 泰山财险爬虫配置属性
+ * @author:
+ * @date:
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "taishan.crawler")
+public class TaiShanCrawlerProperties {
+
+    private String baseUrl;
+}

+ 19 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/repository/TaiShanCrawlerOrderRepository.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.taishan.crawler.repository;
+
+import com.jzg.quotation.taishan.crawler.entity.po.TaiShanCrawlerOrder;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * @description: 泰山财险爬虫订单仓库
+ * @author:
+ * @date:
+ **/
+public interface TaiShanCrawlerOrderRepository extends MongoRepository<TaiShanCrawlerOrder, String> {
+
+    /**
+     *
+     * @param ordersNo
+     * @return TaiShanCrawlerOrder
+     */
+    TaiShanCrawlerOrder findByOrdersNo(String ordersNo);
+}

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

@@ -0,0 +1,28 @@
+package com.jzg.quotation.taishan.crawler.service;
+
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.taishan.crawler.entity.po.TaiShanCrawlerOrder;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationResponse;
+
+/**
+ * @description: 泰山财险爬虫订单服务
+ * @author:
+ * @date:
+ **/
+public interface TaiShanCrawlerOrderService {
+
+    /**
+     * 保存订单
+     * @param quoteVo
+     * @param taiShanCrawlerQuotationResponse
+     * @param success
+     */
+    void save(QuoteVo quoteVo, TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse, boolean success);
+
+    /**
+     * 根据订单号查询订单
+     * @param ordersNo
+     * @return TaiShanCrawlerOrder
+     */
+    TaiShanCrawlerOrder getById(String ordersNo);
+}

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

@@ -0,0 +1,28 @@
+package com.jzg.quotation.taishan.crawler.service;
+
+import org.springframework.http.HttpHeaders;
+
+/**
+ * @description: 泰山财险爬虫报价流程服务
+ * @author :jinshihui
+ * @date: 2025年9月17日16:28:40
+ **/
+public interface TaiShanCrawlerQuoteProcessService {
+
+    /**
+     * 登录
+     * @param username 用户名
+     * @param password 密码
+     * @return String
+     */
+    String login(String username, String password);
+
+    /**
+     * 获取请求头
+     * @param username 用户名
+     * @param password 密码
+     * @return HttpHeaders
+     */
+    HttpHeaders getHeaders(String username, String password);
+
+}

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

@@ -0,0 +1,12 @@
+package com.jzg.quotation.taishan.crawler.service;
+
+import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
+
+/**
+ * @description: 泰山财险爬虫请求
+ * @author:
+ * @date:
+ **/
+public interface TaiShanCrawlerRequest extends QuotationCrawlerBaseService {
+
+}

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

@@ -0,0 +1,53 @@
+package com.jzg.quotation.taishan.crawler.service.impl;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.taishan.crawler.entity.po.TaiShanCrawlerOrder;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationResponse;
+import com.jzg.quotation.taishan.crawler.repository.TaiShanCrawlerOrderRepository;
+import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerOrderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import java.time.LocalDateTime;
+
+/**
+ * @description: 泰山财险爬虫订单服务实现
+ * @author:
+ * @date:
+ **/
+@Service
+@RequiredArgsConstructor
+public class TaiShanCrawlerOrderServiceImpl implements TaiShanCrawlerOrderService {
+
+    private final TaiShanCrawlerOrderRepository taiShanCrawlerOrderRepository;
+
+    @Override
+    public void save(QuoteVo quoteVo, TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse, boolean success) {
+        TaiShanCrawlerOrder order = new TaiShanCrawlerOrder();
+        order.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        order.setOrderNo("");
+        order.setQuoteSuccess(success);
+
+        /*if (taiShanCrawlerQuotationResponse.getData().getTrafficPolicy() != null) {
+            order.setCiApplyNo(taiShanCrawlerQuotationResponse.getData().getTrafficPolicy().getApplicationNo());
+            order.setCiPremium(taiShanCrawlerQuotationResponse.getData().getTrafficPolicy().getPremium());
+        }
+
+        if (taiShanCrawlerQuotationResponse.getData().getBusinessPolicy() != null) {
+            order.setSyApplyNo(taiShanCrawlerQuotationResponse.getData().getBusinessPolicy().getApplicationNo());
+            order.setBiPremium(taiShanCrawlerQuotationResponse.getData().getBusinessPolicy().getPremium());
+        }*/
+
+        order.setTotalPremium(taiShanCrawlerQuotationResponse.getResult().getProposalInfo().getTotalPremium());
+        order.setCreateTime(LocalDateTime.now());
+        order.setUpdateTime(LocalDateTime.now());
+
+        if (!success) {
+            //order.setErrorMsg(taiShanCrawlerQuotationResponse.getResponseMsg());
+        }
+        taiShanCrawlerOrderRepository.save(order);
+    }
+
+    @Override
+    public TaiShanCrawlerOrder getById(String ordersNo) {
+        return taiShanCrawlerOrderRepository.findByOrdersNo(ordersNo);
+    }
+}

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

@@ -0,0 +1,54 @@
+package com.jzg.quotation.taishan.crawler.service.impl;
+
+import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerCacheComponent;
+import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerRequestComponent;
+import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerCheckTokenRequest;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerCheckTokenResponse;
+import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerQuoteProcessService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+/**
+ * @description: 泰山财险爬虫报价流程服务实现
+ * @author:
+ * @date:
+ **/
+@Service
+@RequiredArgsConstructor
+public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuoteProcessService {
+
+    private final TaiShanCrawlerCacheComponent taiShanCrawlerCacheComponent;
+
+    private final TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent;
+
+    // 登陆次数
+    public static final int LOGINS_NUMBER = 3;
+
+    /**
+     * 登录
+     * @param username 用户名
+     * @param password 密码
+     * @return String 返回token信息
+     */
+    @Override
+    public String login(String username, String password) {
+        return null;
+    }
+
+    /**
+     * 获取请求头
+     * @param username 用户名
+     * @param password 密码
+     * @return HttpHeaders
+     */
+    @Override
+    public HttpHeaders getHeaders(String username, String password) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.set("Authorization", " Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI1MzAiLCJhdXRoIjoiUk9MRV9FTVBUWV9DQVJEX05PLFJPTEVfT1BFUkFUT1IiLCJwYXNzd29yZF9leHBpcmUiOi01OSwiZXhwIjoxNzY0Mjk4OTk4fQ.XFfqHp1hLMO8fCSmjiVmNjbQMXtS-yD7f9yUrJu1t9yHFgNYzzGPPRVzAPyRNX3IqR2O-HfDBal0UH4HX8sYyQ");
+        httpHeaders.set("Login-Complete", " 11030001");
+        httpHeaders.set("Source","0");
+        return httpHeaders;
+    }
+
+}

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

@@ -0,0 +1,766 @@
+package com.jzg.quotation.taishan.crawler.service.impl;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.zxing.NotFoundException;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.quotation.taishan.crawler.build.TaiShanCrawlerQuoteResultsVoBuild;
+import com.jzg.quotation.taishan.crawler.component.TaiShanBuildingAttributionInformation;
+import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerCacheComponent;
+import com.jzg.quotation.taishan.crawler.component.TaiShanCrawlerRequestComponent;
+import com.jzg.quotation.taishan.crawler.constant.enums.ResponseCode;
+import com.jzg.quotation.taishan.crawler.entity.TaiShanCrawlerConfigureParameters;
+import com.jzg.quotation.taishan.crawler.entity.po.TaiShanCrawlerOrder;
+import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerCarRequest;
+import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerGetActualValueRequest;
+import com.jzg.quotation.taishan.crawler.entity.request.TaiShanCrawlerQuotationRequest;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerCarResponse;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerGetActualValueResponse;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationResponse;
+import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerUnderwritingResponse;
+import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerOrderService;
+import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerQuoteProcessService;
+import com.jzg.quotation.taishan.crawler.service.TaiShanCrawlerRequest;
+import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
+import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 泰山财险爬虫报价服务实现类
+ *
+ * <p>通过模拟浏览器操作的方式实现泰山财险的完整报价流程</p>
+ *
+ * @author
+ * @since
+ */
+@QuoteCrawlerService(value = InsuranceCode.INSURANCE_TSBX)
+@RequiredArgsConstructor
+@Slf4j
+public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
+
+    private final TaiShanCrawlerRequestComponent taiShanCrawlerRequestComponent;
+
+    /**
+     * 归属信息构建组件,用于构建机构、套餐、渠道等归属信息
+     */
+    private final TaiShanBuildingAttributionInformation taiShanBuildingAttributionInformation;
+
+    private final TaiShanCrawlerCacheComponent taiShanCrawlerCacheComponent;
+
+    private final TaiShanCrawlerOrderService taiShanCrawlerOrderService;
+
+    private final TaiShanCrawlerQuoteProcessService taiShanCrawlerQuoteProcessService;
+
+
+    /**
+     * 登录
+     *
+     * @param loginBase 登录信息
+     */
+    @Override
+    public void login(LoginBase loginBase) {
+        taiShanCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
+    }
+
+    /**
+     * 报价
+     *
+     * @param quoteVo 报价实体
+     * @return QuoteResultsVo
+     */
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) {
+        // 1.0 归属信息
+        AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
+        //获取请求头
+        HttpHeaders headers = taiShanCrawlerQuoteProcessService.getHeaders("","");
+
+        TaiShanCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaiShanCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
+
+        // 2.1 车辆查询
+        TaiShanCrawlerCarResponse taiShanCrawlerCarResponse = null;
+        try {
+            TaiShanCrawlerCarRequest taiShanCrawlerCarRequest = new TaiShanCrawlerCarRequest();
+            taiShanCrawlerCarRequest.setFrameNo(quoteVo.getCarInfoVo().getVinNo());
+            taiShanCrawlerCarRequest.setProductCode(quoteVo.getProductCode());
+            taiShanCrawlerCarRequest.setCarModelNo(quoteVo.getCarInfoVo().getCarModelNo());
+            taiShanCrawlerCarRequest.setEngineNumber(quoteVo.getCarInfoVo().getEngineNo());
+            taiShanCrawlerCarRequest.setIsAccurate("1");
+            taiShanCrawlerCarRequest.setModelCode(quoteVo.getCarInfoVo().getCarTypeCode());
+            taiShanCrawlerCarRequest.setOrigModelCde(quoteVo.getCarInfoVo().getOrigModelCde());
+            taiShanCrawlerCarRequest.setDepartmentCode("11030001");
+            taiShanCrawlerCarRequest.setFirstLoginDate(quoteVo.getCarInfoVo().getRegisterDate());
+
+            taiShanCrawlerCarResponse = taiShanCrawlerRequestComponent.queryCarModels(taiShanCrawlerCarRequest, headers);
+            log.info("taiShanCrawlerCarResponse参数的值:{}", JSON.toJSONString(taiShanCrawlerCarResponse));
+
+            //2.2 获取车辆实际价值
+            TaiShanCrawlerGetActualValueRequest taiShanCrawlerGetActualValueRequest = new TaiShanCrawlerGetActualValueRequest();
+            taiShanCrawlerGetActualValueRequest.setProductCode(quoteVo.getProductCode());
+            taiShanCrawlerGetActualValueRequest.setPurchaseValue(quoteVo.getCarInfoVo().getPurchasePrice());
+            taiShanCrawlerGetActualValueRequest.setRegisterDate(quoteVo.getCarInfoVo().getRegisterDate()+" 00:00:00");
+            taiShanCrawlerGetActualValueRequest.setRideType("365001");
+            taiShanCrawlerGetActualValueRequest.setRideKind("VHL001");
+            taiShanCrawlerGetActualValueRequest.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate());
+            taiShanCrawlerGetActualValueRequest.setUsage("374001");
+            taiShanCrawlerGetActualValueRequest.setVehicleName(quoteVo.getCarInfoVo().getCarModelNo());
+            taiShanCrawlerGetActualValueRequest.setModelEneryType("0");
+            taiShanCrawlerGetActualValueRequest.setSeatNum(quoteVo.getCarInfoVo().getSeatCount());
+            taiShanCrawlerGetActualValueRequest.setOrigModelNme(quoteVo.getCarInfoVo().getCarModelNo());
+            taiShanCrawlerGetActualValueRequest.setOrigQualityMax(quoteVo.getCarInfoVo().getCompleteKerbMass());
+            taiShanCrawlerGetActualValueRequest.setTonage("0.0");
+            taiShanCrawlerGetActualValueRequest.setAppTyp("A");
+
+            TaiShanCrawlerGetActualValueResponse taiShanCrawlerGetActualValueResponse = taiShanCrawlerRequestComponent.getActualValue(taiShanCrawlerGetActualValueRequest, headers);
+            log.info("taiShanCrawlerGetActualValueResponse参数的值:{}", JSON.toJSONString(taiShanCrawlerGetActualValueResponse));
+            String currentValue = taiShanCrawlerGetActualValueResponse.getResult().getActualValue();
+            log.info("车辆当前价值:{}", currentValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+
+        // 3.0 报价接口
+        TaiShanCrawlerQuotationRequest taiShanCrawlerQuotationRequest = buildQuotationRequest(quoteVo);
+        TaiShanCrawlerQuotationResponse taiShanCrawlerQuotationResponse = taiShanCrawlerRequestComponent.quotation(taiShanCrawlerQuotationRequest, headers);
+        log.info("taiShanCrawlerQuotationResponse参数的值:{}", JSON.toJSONString(taiShanCrawlerQuotationResponse));
+
+        // 4.0 处理报价失败
+        if (!ResponseCode.SUCCESS.getCode().equals(taiShanCrawlerQuotationResponse.getCode())) {
+            taiShanCrawlerOrderService.save(quoteVo, taiShanCrawlerQuotationResponse, false);
+            return TaiShanCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(taiShanCrawlerQuotationResponse);
+        } else {
+            //报价成功
+            taiShanCrawlerOrderService.save(quoteVo, taiShanCrawlerQuotationResponse, true);
+            return TaiShanCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, taiShanCrawlerQuotationResponse);
+        }
+    }
+
+    @Override
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
+        return null;
+    }
+
+    @Override
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws Exception {
+        return null;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    @Override
+    public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
+        return null;
+    }
+
+    @Override
+    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
+        return null;
+    }
+
+
+    /**
+     * 构建泰山财险报价请求对象
+     *
+     * @param quoteVo
+     * @return TaiShanCrawlerQuotationRequest
+     */
+    private TaiShanCrawlerQuotationRequest buildQuotationRequest(QuoteVo quoteVo) {
+        TaiShanCrawlerQuotationRequest taiShanCrawlerQuotationRequest = new TaiShanCrawlerQuotationRequest();
+
+        // 设置投保人信息
+        TaiShanCrawlerQuotationRequest.ApplicantInfo applicantInfo = new TaiShanCrawlerQuotationRequest.ApplicantInfo();
+        applicantInfo.setAddress(quoteVo.getPolicyHolderInfo().getAddr());
+        applicantInfo.setCity("140100");
+        applicantInfo.setClientType("1");
+        applicantInfo.setWorkDpt("");
+        applicantInfo.setCounty("140181");
+        applicantInfo.setEmail("514342704@qq.com");
+        applicantInfo.setAppLink("");
+        applicantInfo.setGender("106001");
+        applicantInfo.setIdentifyEndDate("2026-05-17 00:00:00");
+        applicantInfo.setIdentifyEndDateMrk("0");
+        applicantInfo.setIdentifyNo("140111197110052416");
+        applicantInfo.setIdentifyType("01");
+        applicantInfo.setMobile("15536066611");
+        applicantInfo.setPersonId("9202505766405");
+        applicantInfo.setPersonName("刘文广");
+        applicantInfo.setPostCode("030000");
+        applicantInfo.setProvince("140000");
+        applicantInfo.setTel("");
+        applicantInfo.setOccupation("20000");
+        applicantInfo.setWorkArea(quoteVo.getPolicyHolderInfo().getAddr());
+        applicantInfo.setNonResidents("0");
+        applicantInfo.setOwnDpt("D08");
+        applicantInfo.setRelationDpt("R100104");
+        applicantInfo.setCurrency("CNY");
+        applicantInfo.setOwnAreaCde("CHN");
+        applicantInfo.setLegalNme("");
+        applicantInfo.setLegalCertfCls("");
+        applicantInfo.setLegalCertfCde("");
+        applicantInfo.setLegalCertfEndTm("");
+        applicantInfo.setHoldingNme("");
+        applicantInfo.setHoldingCertfCls("");
+        applicantInfo.setHoldingCertfCde("");
+        applicantInfo.setHoldingCertfEndTm("");
+        applicantInfo.setChargeNme("");
+        applicantInfo.setChargeCertfCls("");
+        applicantInfo.setChargeCertfCde("");
+        applicantInfo.setChargeCertfEndTm("");
+        applicantInfo.setBusinessScope("");
+        applicantInfo.setIsOwner("1");
+        applicantInfo.setNewCitizens("");
+        applicantInfo.setIsElectronicSign("1");
+        applicantInfo.setIsBjElectronicApplicant("");
+        applicantInfo.setLegalCertfEndTmMrk("0");
+        applicantInfo.setHoldingCertfEndTmMrk("0");
+        applicantInfo.setChargeCertfEndTmMrk("0");
+        applicantInfo.setInCome("");
+        applicantInfo.setWorkdptName("");
+        applicantInfo.setHomeAddr("");
+        applicantInfo.setRegisteredAddr("");
+        applicantInfo.setRegisteredCapital("");
+        applicantInfo.setRegisteredcapitalCur("");
+        applicantInfo.setIndustry("");
+        applicantInfo.setSmallBiz("");
+        applicantInfo.setIdentifyStartDate("2006-05-17 00:00:00");
+        taiShanCrawlerQuotationRequest.setApplicantInfo(applicantInfo);
+
+        // 设置系数信息
+        TaiShanCrawlerQuotationRequest.CoefficientInfo coefficientInfo = new TaiShanCrawlerQuotationRequest.CoefficientInfo();
+        coefficientInfo.setJqCalEndTm("");
+        coefficientInfo.setJqCalStrtTm("");
+        coefficientInfo.setJqNdiscRsn("");
+        coefficientInfo.setJqResvNum3("");
+        coefficientInfo.setJqResvNum4("");
+        coefficientInfo.setSyAgoClmRec("");
+        coefficientInfo.setSyAgoClmRecCoeff("");
+        coefficientInfo.setSyNclmDisc("");
+        coefficientInfo.setSyAutonomyCoef("");
+        coefficientInfo.setSyCalEndTm("");
+        coefficientInfo.setSyCalStrtTm("");
+        coefficientInfo.setSyChaCoef("");
+        coefficientInfo.setSyTrafIrr("");
+        coefficientInfo.setResvNumAutonomy("");
+        taiShanCrawlerQuotationRequest.setCoefficientInfo(coefficientInfo);
+
+        List<KindInfoVo> kindInfoVo = quoteVo.getKindInfoVo();
+        // 设置商业险信息
+        TaiShanCrawlerQuotationRequest.BusinessInsurance businessInsurance = new TaiShanCrawlerQuotationRequest.BusinessInsurance();
+        if(kindInfoVo.size() == 3){
+            //包含第三者责任险、车上人员责任险(驾驶人)、车上人员责任险(乘客)
+            // 创建商业险险种列表
+            List<TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind> businessItemKinds = new ArrayList<>();
+            // 第三者责任险
+            TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind1 = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind();
+            itemKind1.setDisabled(false);
+            itemKind1.setNoDeductibleFlag(false);
+            itemKind1.setKindName("第三者责任险");
+            itemKind1.setKindSort(2);
+            itemKind1.setMainRiskFlag("");
+            itemKind1.setDeductibleFlag(false);
+            itemKind1.setAmount("2000000");
+            itemKind1.setRate("");
+            itemKind1.setBefPremium(0);
+            itemKind1.setPremium(0.0);
+            itemKind1.setDisCoef(0.0);
+            itemKind1.setDeductible("");
+            itemKind1.setDuctDiscount("");
+            itemKind1.setIndemLmtLvl("306006017");
+            itemKind1.setIndemLmt("2000000");
+            itemKind1.setLiabDaysLmt("");
+            itemKind1.setPerAmt("");
+            itemKind1.setGlassType("");
+            itemKind1.setSpecialGlassFloat("");
+            itemKind1.setVhlDamageFloat("");
+            itemKind1.setCompenPerAmt("");
+            itemKind1.setCompenPerDay("");
+            itemKind1.setKindCode("030018");
+            itemKind1.setDeductibleRatio("");
+            itemKind1.setBefAnnPrm(0);
+            itemKind1.setPureRiskPremium(0.0);
+            itemKind1.setBasePrm(0.0);
+            itemKind1.setAfterPremiumYear(0.0);
+            itemKind1.setCalcPrm("0");
+            itemKind1.setResvNumberRoad("");
+            itemKind1.setResvNumberDriver("");
+            itemKind1.setAbsoluteDeductible("");
+            itemKind1.setResvNumAutonomy("");
+            itemKind1.setAmtVar("0.0");
+            itemKind1.setPrmVar("0.0");
+            itemKind1.setRowId("");
+            itemKind1.setAddCvrgFlag("");
+            itemKind1.setCancelMrk("");
+            itemKind1.setSeqNo("");
+            itemKind1.setPkId("");
+            businessItemKinds.add(itemKind1);
+
+            // 车上人员责任险(驾驶人)
+            TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind2 = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind();
+            itemKind2.setDisabled(false);
+            itemKind2.setNoDeductibleFlag(false);
+            itemKind2.setKindName("车上人员责任险(驾驶人)");
+            itemKind2.setKindSort(3);
+            itemKind2.setMainRiskFlag("");
+            itemKind2.setDeductibleFlag(false);
+            itemKind2.setAmount("10000");
+            itemKind2.setRate("");
+            itemKind2.setBefPremium(0);
+            itemKind2.setPremium(0.0);
+            itemKind2.setDisCoef(0.0);
+            itemKind2.setDeductible("");
+            itemKind2.setDuctDiscount("");
+            itemKind2.setIndemLmtLvl("390N19");
+            itemKind2.setIndemLmt(10000);
+            itemKind2.setLiabDaysLmt(1);
+            itemKind2.setPerAmt("");
+            itemKind2.setGlassType("");
+            itemKind2.setSpecialGlassFloat("");
+            itemKind2.setVhlDamageFloat("");
+            itemKind2.setCompenPerAmt("");
+            itemKind2.setCompenPerDay("");
+            itemKind2.setKindCode("030001");
+            itemKind2.setDeductibleRatio("");
+            itemKind2.setBefAnnPrm(0);
+            itemKind2.setPureRiskPremium(0.0);
+            itemKind2.setBasePrm(0.0);
+            itemKind2.setAfterPremiumYear(0.0);
+            itemKind2.setCalcPrm("0");
+            itemKind2.setResvNumberRoad("");
+            itemKind2.setResvNumberDriver("");
+            itemKind2.setAbsoluteDeductible("");
+            itemKind2.setResvNumAutonomy("");
+            itemKind2.setAmtVar("0.0");
+            itemKind2.setPrmVar("0.0");
+            itemKind2.setRowId("");
+            itemKind2.setAddCvrgFlag("");
+            itemKind2.setCancelMrk("");
+            itemKind2.setSeqNo("");
+            itemKind2.setPkId("");
+            businessItemKinds.add(itemKind2);
+
+            // 车上人员责任险(乘客)
+            TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind3 = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind();
+            itemKind3.setDisabled(false);
+            itemKind3.setNoDeductibleFlag(false);
+            itemKind3.setKindName("车上人员责任险(乘客)");
+            itemKind3.setKindSort(4);
+            itemKind3.setMainRiskFlag("");
+            itemKind3.setDeductibleFlag(false);
+            itemKind3.setAmount(40000);
+            itemKind3.setRate("");
+            itemKind3.setBefPremium(0);
+            itemKind3.setPremium(0);
+            itemKind3.setDisCoef(0);
+            itemKind3.setDeductible("");
+            itemKind3.setDuctDiscount("");
+            itemKind3.setIndemLmtLvl("390N18");
+            itemKind3.setIndemLmt(10000);
+            itemKind3.setLiabDaysLmt(4);
+            itemKind3.setPerAmt(10000);
+            itemKind3.setGlassType("");
+            itemKind3.setSpecialGlassFloat("");
+            itemKind3.setVhlDamageFloat("");
+            itemKind3.setCompenPerAmt("");
+            itemKind3.setCompenPerDay("");
+            itemKind3.setKindCode("030009");
+            itemKind3.setDeductibleRatio("");
+            itemKind3.setBefAnnPrm(0);
+            itemKind3.setPureRiskPremium(0);
+            itemKind3.setBasePrm(0);
+            itemKind3.setAfterPremiumYear(0);
+            itemKind3.setCalcPrm("0");
+            itemKind3.setResvNumberRoad("");
+            itemKind3.setResvNumberDriver("");
+            itemKind3.setAbsoluteDeductible("");
+            itemKind3.setResvNumAutonomy("");
+            itemKind3.setAmtVar("0.0");
+            itemKind3.setPrmVar("0.0");
+            itemKind3.setRowId("");
+            itemKind3.setAddCvrgFlag("");
+            itemKind3.setCancelMrk("");
+            itemKind3.setSeqNo("");
+            itemKind3.setPkId("");
+
+            businessItemKinds.add(itemKind3);
+            businessInsurance.setItemKinds(businessItemKinds);
+        }
+
+        // 附加医保外用药责任险(三者险)
+        /*TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind4 = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind();
+        itemKind4.setKindName("附加医保外用药责任险(三者险)");
+        itemKind4.setKindCode("033630");
+        itemKind4.setAmount(100000);
+        itemKind4.setIndemLmt(100000);
+        businessItemKinds.add(itemKind4);*/
+
+        // 设置商业险产品信息
+        TaiShanCrawlerQuotationRequest.BusinessInsurance.ProductInfo productInfo = new TaiShanCrawlerQuotationRequest.BusinessInsurance.ProductInfo();
+        productInfo.setAnswer("");
+        productInfo.setApId("");
+        productInfo.setAboveThresholdFlag("");
+        productInfo.setRecommAdjustValue("");
+        productInfo.setDay("365");
+        productInfo.setEdrPrjNo("");
+        productInfo.setEffective("0");
+        productInfo.setEndDate("2026-11-29 23:59:59");
+        productInfo.setOrigInsurer("");
+        productInfo.setOrigPlyNo("");
+        productInfo.setPolicyNo("");
+        productInfo.setPremium("");
+        productInfo.setProposalNo("");
+        productInfo.setProposalStatus("");
+        productInfo.setQuestion("");
+        productInfo.setStartDate("2025-11-30 00:00:00");
+        productInfo.setSyApUseFlg("1");
+        productInfo.setSyExpDisCoef("");
+        productInfo.setSySpecialExpectDisc("");
+        productInfo.setSyFeeDiscount("");
+        productInfo.setSyMeale("BI6f0906496d81d918549b2a3b1f086660");
+        productInfo.setPayPkId("");
+        productInfo.setRiskAmount("");
+        productInfo.setTsApId("");
+        productInfo.setComPoints("");
+        productInfo.setRenewalClass("");
+        businessInsurance.setProductInfo(productInfo);
+
+        // 设置特殊信息列表(空列表)
+        businessInsurance.setSpecialInfos(new ArrayList<>());
+        taiShanCrawlerQuotationRequest.setBusinessInsurance(businessInsurance);
+
+        // 设置交强险信息
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance compulsoryInsurance = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance();
+
+        // 设置车船税信息
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.CarShipTax carShipTax = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.CarShipTax();
+        carShipTax.setAbateAmt("");
+        carShipTax.setComDocumentNumber("");
+        carShipTax.setTaxOrg("");
+        carShipTax.setTaxOrgCde("");
+        carShipTax.setDeptNonlocal("");
+        carShipTax.setFreeRate("");
+        carShipTax.setFuelType("FT001");
+        carShipTax.setOverDueAmt("");
+        carShipTax.setPayEndTm("2025-12-31");
+        carShipTax.setPayStartTm("2025-01-01");
+        carShipTax.setPreviousPay("");
+        carShipTax.setTaxActual("");
+        carShipTax.setTaxDocumentNumber("");
+        carShipTax.setTaxPaidAreaCode("");
+        carShipTax.setTaxPayWay("3T5002");
+        carShipTax.setTaxReductionReason("");
+        carShipTax.setTaxReliefPlan("");
+        carShipTax.setTaxVhlType("");
+        carShipTax.setTaxpayerIdentifier("142429196310082123");
+        carShipTax.setTaxPayerName("孟宪梅");
+        carShipTax.setTotalTax("");
+        carShipTax.setUnitTaxAmt("");
+        carShipTax.setWeight("");
+        carShipTax.setVsTaxMrk("");
+        carShipTax.setCertificateDate("");
+        carShipTax.setAnnualTaxDue("");
+        carShipTax.setSumTaxDefault("");
+        carShipTax.setSumOverDue("");
+        carShipTax.setSumTax("");
+        carShipTax.setAnnualTaxAmt("");
+        carShipTax.setTaxUnitTypeCode("");
+        carShipTax.setTaxLocationCode("");
+        carShipTax.setCalcTaxFlag("");
+        carShipTax.setTaxArrBgnTm("");
+        carShipTax.setTaxArrEndTm("");
+        carShipTax.setDeclareStatuIa("");
+        carShipTax.setAggTaxVar("");
+        compulsoryInsurance.setCarShipTax(carShipTax);
+
+        // 设置交强险责任限额列表
+        List<TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind> compulsoryItemKinds = new ArrayList<>();
+
+        // 交强险死亡伤残赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind5 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind5.setKindName("交强险死亡伤残赔偿限额");
+        itemKind5.setKindCode("030055");
+        itemKind5.setAmount(180000);
+        compulsoryItemKinds.add(itemKind5);
+
+        // 交强险医疗费用赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind6 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind6.setKindName("交强险医疗费用赔偿限额");
+        itemKind6.setKindCode("030056");
+        itemKind6.setAmount(18000);
+        compulsoryItemKinds.add(itemKind6);
+
+        // 交强险财产损失赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind7 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind7.setKindName("交强险财产损失赔偿限额");
+        itemKind7.setKindCode("030057");
+        itemKind7.setAmount(2000);
+        compulsoryItemKinds.add(itemKind7);
+
+        // 交强险无责任死亡伤残赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind8 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind8.setKindName("交强险无责任死亡伤残赔偿限额");
+        itemKind8.setKindCode("030058");
+        itemKind8.setAmount(18000);
+        compulsoryItemKinds.add(itemKind8);
+
+        // 交强险无责任医疗费用赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind9 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind9.setKindName("交强险无责任医疗费用赔偿限额");
+        itemKind9.setKindCode("030059");
+        itemKind9.setAmount(1800);
+        compulsoryItemKinds.add(itemKind9);
+
+        // 交强险无责任财产损失赔偿限额
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind itemKind10 = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ItemKind();
+        itemKind10.setKindName("交强险无责任财产损失赔偿限额");
+        itemKind10.setKindCode("030060");
+        itemKind10.setAmount(100);
+        compulsoryItemKinds.add(itemKind10);
+        compulsoryInsurance.setItemKinds(compulsoryItemKinds);
+
+        // 设置交强险产品信息
+        TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ProductInfo compulsoryProductInfo = new TaiShanCrawlerQuotationRequest.CompulsoryInsurance.ProductInfo();
+        compulsoryProductInfo.setDay("365");
+        compulsoryProductInfo.setEndDate("2026-11-29 23:59:59");
+        compulsoryProductInfo.setStartDate("2025-11-30 00:00:00");
+        compulsoryProductInfo.setRenewMrk("");
+        compulsoryInsurance.setProductInfo(compulsoryProductInfo);
+
+        // 设置特殊信息列表(空列表)
+        compulsoryInsurance.setSpecialInfos(new ArrayList<>());
+        taiShanCrawlerQuotationRequest.setCompulsoryInsurance(compulsoryInsurance);
+
+        // 设置被保险人信息(同投保人)
+        TaiShanCrawlerQuotationRequest.InsuredInfo insuredInfo = new TaiShanCrawlerQuotationRequest.InsuredInfo();
+        insuredInfo.setAddress(quoteVo.getInsuredPersonInfo().getAddr());
+        insuredInfo.setPersonName("刘文广");
+        insuredInfo.setIdentifyNo("140111197110052416");
+        insuredInfo.setMobile("15536066611");
+        insuredInfo.setIsOwner("0");
+        insuredInfo.setIsApplication("1");
+        insuredInfo.setResvTxt1("193001");
+        insuredInfo.setRelationShip("11");
+        taiShanCrawlerQuotationRequest.setInsuredInfo(insuredInfo);
+
+        // 设置投保单信息
+        TaiShanCrawlerQuotationRequest.ProposalInfo proposalInfo = new TaiShanCrawlerQuotationRequest.ProposalInfo();
+        proposalInfo.setMark("1");
+        proposalInfo.setHouseMark("0");
+        proposalInfo.setDpMark("0");
+        proposalInfo.setMcMark("0");
+        proposalInfo.setGlMark("0");
+        proposalInfo.setDiMark("0");
+        proposalInfo.setOperateDate("2025-11-18 11:06:48");
+        proposalInfo.setLoginCompany("11030001");
+        proposalInfo.setCombinedProductCode("1369");
+        proposalInfo.setDptRelCde("00;11;1103;11030001");
+        proposalInfo.setUnderWriteCompany("11030001");
+        proposalInfo.setUnderwritingAgencyName("11030001--非车险业务部");
+        proposalInfo.setOperatorCode("582530");
+        proposalInfo.setTotalPremium("");
+        proposalInfo.setOrderNo("");
+        proposalInfo.setStatus("");
+        proposalInfo.setProposalTime("");
+        proposalInfo.setAgent("");
+        proposalInfo.setIsIndependenceAgent("");
+        proposalInfo.setAgentName("");
+        proposalInfo.setProvince("140000");
+        proposalInfo.setCity("140100");
+        proposalInfo.setCounty("140109");
+        proposalInfo.setDefaultChannel("");
+        proposalInfo.setSaleCode("582530");
+        proposalInfo.setSaleName("罗辑");
+        proposalInfo.setSaleNo("140322199701026622");
+        proposalInfo.setPkgNo("");
+        proposalInfo.setTeamOrderName("");
+        proposalInfo.setSaleChannel("02");
+        proposalInfo.setZxType("");
+        proposalInfo.setJointNo("");
+        proposalInfo.setItemSystem("S002");
+        proposalInfo.setSyAdjustRate("");
+        proposalInfo.setRenewMrk("");
+        proposalInfo.setRiskScore("");
+        proposalInfo.setCustGroups("");
+        proposalInfo.setSpCust("");
+        proposalInfo.setBaseCRemark("");
+        proposalInfo.setSyTsFcId("");
+        proposalInfo.setJqTsFcId("");
+        proposalInfo.setSpCustClass("");
+        proposalInfo.setSalesmanName("");
+        proposalInfo.setCertSalesmanNum("");
+        proposalInfo.setCertificateName("");
+        proposalInfo.setCertificatePhone("");
+        proposalInfo.setResultDetail("");
+        proposalInfo.setCrtTm("");
+        proposalInfo.setSingleJqFlag("");
+        proposalInfo.setSpCustS("");
+        proposalInfo.setPkgNoS("");
+        proposalInfo.setGreenInsure("0");
+        proposalInfo.setIsGreen(0);
+        taiShanCrawlerQuotationRequest.setProposalInfo(proposalInfo);
+
+        // 设置车辆信息
+        TaiShanCrawlerQuotationRequest.VehicleInfo vehicleInfo = new TaiShanCrawlerQuotationRequest.VehicleInfo();
+        vehicleInfo.setAliasId("");
+        vehicleInfo.setArbitrationName("");
+        vehicleInfo.setArgueSolution("007001");
+        vehicleInfo.setBrand("");
+        vehicleInfo.setBrandCode("");
+        vehicleInfo.setBrandId("DZA2");
+        vehicleInfo.setCarInspection("305005003");
+        vehicleInfo.setCarName("");
+        vehicleInfo.setCategoryCode("");
+        vehicleInfo.setCategoryName("");
+        vehicleInfo.setConfigType("");
+        vehicleInfo.setDeptCode("");
+        vehicleInfo.setDeptName("");
+        vehicleInfo.setEngineNo("N03232");
+        vehicleInfo.setExemptionInspectReason("383003");
+        vehicleInfo.setFeeType("1");
+        vehicleInfo.setFuelType("");
+        vehicleInfo.setInspectionPerson("");
+        vehicleInfo.setInspectionResult("");
+        vehicleInfo.setInspectionTime("");
+        vehicleInfo.setIsAccurate("1");
+        vehicleInfo.setIsFieldCar("0");
+        vehicleInfo.setIsPlateNo("0");
+        vehicleInfo.setJqIsTransferCar("0");
+        vehicleInfo.setJqTransferDate("");
+        vehicleInfo.setSyIsTransferCar("0");
+        vehicleInfo.setSyTransferDate("");
+        vehicleInfo.setJqOrigReducCarShow("0");
+        vehicleInfo.setJqPrintDisplacement("");
+        vehicleInfo.setJqQryCde("");
+        vehicleInfo.setJqSpecialMrk("");
+        vehicleInfo.setModelCde("DZABFD0023");
+        vehicleInfo.setModelIdCode("");
+        vehicleInfo.setModelNme("大众汽车SVW6451MED多用途乘用车");
+        vehicleInfo.setNcdReason("");
+        vehicleInfo.setNegotiatedActulValue("50160.0");
+        vehicleInfo.setNegotiatedValue("50160.0");
+        vehicleInfo.setNewCarFlag("0");
+        vehicleInfo.setNoComLastFloatRecord("");
+        vehicleInfo.setNoInspectReason("");
+        vehicleInfo.setNoticeType("");
+        vehicleInfo.setOrigBusiClass("A");
+        vehicleInfo.setOrigFamilyName("途观");
+        vehicleInfo.setOrigModelCde("DZABFD0023");
+        vehicleInfo.setOrigModelCode("BSHCTHUC0014");
+        vehicleInfo.setOrigModelNme("大众汽车SVW6451MED多用途乘用车");
+        vehicleInfo.setOrigPower("1.798");
+        vehicleInfo.setOrigSeatMax("");
+        vehicleInfo.setOrigSeatMin("");
+        vehicleInfo.setOrigTonage("");
+        vehicleInfo.setOrigWeightMax("1710.0");
+        vehicleInfo.setOrigWeightMin("1710.0");
+        vehicleInfo.setPlateColor("01");
+        vehicleInfo.setPlateNo("晋A0862C");
+        vehicleInfo.setPlateType("02");
+        vehicleInfo.setPower("1.798");
+        vehicleInfo.setProdPlace("2");
+        vehicleInfo.setPurchasePrice("250800.0");
+        vehicleInfo.setRecordCoefCi("");
+        vehicleInfo.setRegVhlTyp("K33");
+        vehicleInfo.setRegisterDate("2013-08-21");
+        vehicleInfo.setIssueYm("2013-08-22");
+        vehicleInfo.setSearchCode("DZQC-SVW6451MED");
+        vehicleInfo.setSeatCount("5");
+        vehicleInfo.setSeries("");
+        vehicleInfo.setSeriesCode("");
+        vehicleInfo.setSyQryCde("");
+        vehicleInfo.setTonage("");
+        vehicleInfo.setTradeCode("");
+        vehicleInfo.setTradeName("");
+        vehicleInfo.setUseNatureShow("374001");
+        vehicleInfo.setVehicleCategoryCde("VHL001");
+        vehicleInfo.setVehicleType("365001");
+        vehicleInfo.setVhlCertDate("");
+        vehicleInfo.setVhlCertNo("");
+        vehicleInfo.setVhlCertType("");
+        vehicleInfo.setVin("LSVUM65N9D2052229");
+        vehicleInfo.setWeight("1710.0");
+        vehicleInfo.setSyNcdReason("");
+        vehicleInfo.setJqNcdReason("");
+        vehicleInfo.setInsureYears("");
+        vehicleInfo.setClaimTimes("");
+        vehicleInfo.setClaimAdjustLevel("");
+        vehicleInfo.setTeamCarId("");
+        vehicleInfo.setOcrUuId("");
+        vehicleInfo.setUseNatureShowName("家庭自用汽车");
+        vehicleInfo.setSingleJqSyQryCde("");
+        vehicleInfo.setModelEneryType("0");
+        vehicleInfo.setPureRange("");
+        vehicleInfo.setOtherEnergyTypeDesc("");
+        vehicleInfo.setIndustryModelCode("BSHCTHUC0014");
+        vehicleInfo.setNewIndustryCode("");
+        vehicleInfo.setEmotoPower("");
+        vehicleInfo.setMaxSpeed("");
+        vehicleInfo.setPrintUsageCde("");
+        vehicleInfo.setPrintUsageCdeFlag("0");
+        vehicleInfo.setCarAge("12");
+        vehicleInfo.setPrintUsageCdeSub("");
+        vehicleInfo.setJqCResvTxt20("");
+        vehicleInfo.setSyCResvTxt20("");
+        vehicleInfo.setSyUuid("SY_017edbb0-101c-400b-868-1763434060682");
+        vehicleInfo.setJqUuid("JQ_017edbb0-101c-400b-868-1763434060682");
+        vehicleInfo.setUseNature("");
+        vehicleInfo.setOverseasVehicleFlag("");
+        vehicleInfo.setSpecialVehicleFlag("");
+        taiShanCrawlerQuotationRequest.setVehicleInfo(vehicleInfo);
+
+        // 设置车主信息
+        TaiShanCrawlerQuotationRequest.VehicleOwnerInfo vehicleOwnerInfo = new TaiShanCrawlerQuotationRequest.VehicleOwnerInfo();
+        vehicleOwnerInfo.setAddress("");
+        vehicleOwnerInfo.setYearOfBirth("1971");
+        vehicleOwnerInfo.setClientType("1");
+        vehicleOwnerInfo.setGender("106001");
+        vehicleOwnerInfo.setIdentifyNo("140111197110052416");
+        vehicleOwnerInfo.setIdentifyType("01");
+        vehicleOwnerInfo.setPersonName("刘文广");
+        vehicleOwnerInfo.setProvince("");
+        vehicleOwnerInfo.setCity("");
+        vehicleOwnerInfo.setCounty("");
+        vehicleOwnerInfo.setPersonAge(54);
+        taiShanCrawlerQuotationRequest.setVehicleOwnerInfo(vehicleOwnerInfo);
+
+        // 设置扁平化车辆信息(空对象)
+        taiShanCrawlerQuotationRequest.setFlatvhlInfo(new Object());
+
+        // 以下为未使用的其他险种(均为空对象)
+        taiShanCrawlerQuotationRequest.setHouseholdInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setDpInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setDiInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setMcInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setGlInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setTfInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setAcInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setGsInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setMtInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setBtInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setHouseholdBInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setHouseholdCInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setPaInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setHlInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setHtInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setRtInsurance(new Object());
+        taiShanCrawlerQuotationRequest.setOpdInsurance(new Object());
+        return taiShanCrawlerQuotationRequest;
+    }
+}

+ 209 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/util/TaiShanCrawlerUtils.java

@@ -0,0 +1,209 @@
+package com.jzg.quotation.taishan.crawler.util;
+
+import lombok.extern.slf4j.Slf4j;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.SecureRandom;
+import java.util.Base64;
+
+/**
+ * @description: 泰山财险爬虫工具类
+ * @author:
+ * @date:
+ **/
+@Slf4j
+public class TaiShanCrawlerUtils {
+
+    /**
+     * DES加密密钥
+     */
+    private static final String DES_KEY = "taishan123456";
+
+    /**
+     * DES向量
+     */
+    private static final String DES_IV = "taishaniv";
+
+    /**
+     * AES加密密钥
+     */
+    private static final String AES_KEY = "taishanaes1234567";
+
+    /**
+     * AES向量
+     */
+    private static final String AES_IV = "taishanaesinitvec";
+
+    /**
+     * DES加密
+     *
+     * @param data 明文数据
+     * @return 加密后的字符串
+     */
+    public static String desEncrypt(String data) {
+        try {
+            SecretKeySpec keySpec = new SecretKeySpec(DES_KEY.getBytes(StandardCharsets.UTF_8), "DES");
+            IvParameterSpec ivSpec = new IvParameterSpec(DES_IV.getBytes(StandardCharsets.UTF_8));
+
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+
+            byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
+            return Base64.getEncoder().encodeToString(encrypted);
+        } catch (Exception e) {
+            log.error("DES加密失败", e);
+            throw new RuntimeException("DES加密失败", e);
+        }
+    }
+
+    /**
+     * DES解密
+     *
+     * @param encryptedData 加密数据
+     * @return 解密后的字符串
+     */
+    public static String desDecrypt(String encryptedData) {
+        try {
+            SecretKeySpec keySpec = new SecretKeySpec(DES_KEY.getBytes(StandardCharsets.UTF_8), "DES");
+            IvParameterSpec ivSpec = new IvParameterSpec(DES_IV.getBytes(StandardCharsets.UTF_8));
+
+            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+
+            byte[] decoded = Base64.getDecoder().decode(encryptedData);
+            byte[] decrypted = cipher.doFinal(decoded);
+
+            return new String(decrypted, StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            log.error("DES解密失败", e);
+            throw new RuntimeException("DES解密失败", e);
+        }
+    }
+
+    /**
+     * AES加密
+     *
+     * @param data 明文数据
+     * @return 加密后的字符串
+     */
+    public static String aesEncrypt(String data) {
+        try {
+            SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), "AES");
+            IvParameterSpec ivSpec = new IvParameterSpec(AES_IV.getBytes(StandardCharsets.UTF_8));
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+
+            byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
+            return Base64.getEncoder().encodeToString(encrypted);
+        } catch (Exception e) {
+            log.error("AES加密失败", e);
+            throw new RuntimeException("AES加密失败", e);
+        }
+    }
+
+    /**
+     * AES解密
+     *
+     * @param encryptedData 加密数据
+     * @return 解密后的字符串
+     */
+    public static String aesDecrypt(String encryptedData) {
+        try {
+            SecretKeySpec keySpec = new SecretKeySpec(AES_KEY.getBytes(StandardCharsets.UTF_8), "AES");
+            IvParameterSpec ivSpec = new IvParameterSpec(AES_IV.getBytes(StandardCharsets.UTF_8));
+
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+
+            byte[] decoded = Base64.getDecoder().decode(encryptedData);
+            byte[] decrypted = cipher.doFinal(decoded);
+
+            return new String(decrypted, StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            log.error("AES解密失败", e);
+            throw new RuntimeException("AES解密失败", e);
+        }
+    }
+
+    /**
+     * 生成MD5值
+     *
+     * @param data 原始数据
+     * @return MD5哈希值
+     */
+    public static String generateMD5(String data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] hashBytes = md.digest(data.getBytes(StandardCharsets.UTF_8));
+
+            StringBuilder sb = new StringBuilder();
+            for (byte b : hashBytes) {
+                sb.append(String.format("%02x", b));
+            }
+            return sb.toString();
+        } catch (Exception e) {
+            log.error("MD5生成失败", e);
+            throw new RuntimeException("MD5生成失败", e);
+        }
+    }
+
+    /**
+     * 生成随机字符串
+     *
+     * @param length 字符串长度
+     * @return 随机字符串
+     */
+    public static String generateRandomString(int length) {
+        SecureRandom random = new SecureRandom();
+        StringBuilder sb = new StringBuilder();
+
+        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+        for (int i = 0; i < length; i++) {
+            sb.append(chars.charAt(random.nextInt(chars.length())));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 生成批次号
+     *
+     * @return 批次号
+     */
+    public static String generateBatchNumber() {
+        long timestamp = System.currentTimeMillis();
+        String random = generateRandomString(6);
+        return "TS" + timestamp + random;
+    }
+
+    /**
+     * 格式化车牌号
+     *
+     * @param licensePlate 原始车牌号
+     * @return 格式化后的车牌号
+     */
+    public static String formatLicensePlate(String licensePlate) {
+        if (licensePlate == null || licensePlate.trim().isEmpty()) {
+            return "";
+        }
+        return licensePlate.toUpperCase().replaceAll("[\\s-_]", "");
+    }
+
+    /**
+     * 格式化车架号
+     *
+     * @param vin 原始车架号
+     * @return 格式化后的车架号
+     */
+    public static String formatVin(String vin) {
+        if (vin == null || vin.trim().isEmpty()) {
+            return "";
+        }
+        return vin.toUpperCase().replaceAll("[\\s-_]", "");
+    }
+}