Răsfoiți Sursa

Merge remote-tracking branch 'origin/master'

Qchen 3 luni în urmă
părinte
comite
daa573f36b
100 a modificat fișierele cu 11027 adăugiri și 112 ștergeri
  1. 5 5
      authentication/src/main/java/com/jzg/controller/SendSmsCodeController.java
  2. 1 2
      authentication/src/main/java/com/jzg/service/impl/InitializePartnerCommissionServiceImpl.java
  3. 6 6
      authentication/src/main/resources/application-dev.yml
  4. 2 2
      commons/src/main/java/com/jzg/commons/core/base/BaseController.java
  5. 0 3
      commons/src/main/java/com/jzg/commons/entity/dto/ApplyWithdrawParam.java
  6. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java
  7. 4 3
      commons/src/main/java/com/jzg/commons/entity/po/SysRelationPerson.java
  8. 14 12
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  9. 5 1
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java
  10. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/AmountAuditVo.java
  11. 11 0
      commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostVo.java
  12. 6 1
      commons/src/main/java/com/jzg/commons/util/Base64Utils.java
  13. 2 2
      commons/src/main/java/com/jzg/commons/util/CompressUtil.java
  14. 8 0
      commons/src/main/java/com/jzg/commons/util/DateTimeUtils.java
  15. 1 1
      commons/src/main/java/com/jzg/commons/util/FileUtil.java
  16. 8 3
      commons/src/main/java/com/jzg/commons/util/IDCardUtils.java
  17. 6 1
      commons/src/main/java/com/jzg/commons/util/ImageUtil.java
  18. 1 1
      commons/src/main/java/com/jzg/commons/util/MinioUtils.java
  19. 6 1
      commons/src/main/java/com/jzg/commons/util/ObjectUtil.java
  20. 6 7
      commons/src/main/java/com/jzg/commons/util/PDFUtil.java
  21. 7 5
      commons/src/main/java/com/jzg/commons/util/ServletUtils.java
  22. 7 3
      commons/src/main/java/com/jzg/commons/util/UnionPayUtils.java
  23. 1 1
      commons/src/main/java/com/jzg/commons/util/comparble/SchemaAnnotationUtils.java
  24. 2 4
      consoleStatistics/src/main/resources/application-dev.yml
  25. 2 2
      gateway/src/main/resources/application-dev.yml
  26. 4 4
      partner/src/main/resources/application-dev.yml
  27. 2 2
      platform/src/main/resources/application-dev.yml
  28. 4 4
      tenant/costsorrule/src/main/resources/application-dev.yml
  29. 1 0
      tenant/insurance/pom.xml
  30. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  31. 10 5
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  32. 8 9
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  33. 5 20
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilterUtils.java
  34. 13 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  35. 59 0
      tenant/insurance/quotation-dadi/pom.xml
  36. 115 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java
  37. 77 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerCacheComponent.java
  38. 828 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java
  39. 4 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/InsuranceMap.java
  40. 101 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelKindInfo.java
  41. 532 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelVehicleInsurance.java
  42. 596 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiNewEnergyVehicleInsurance.java
  43. 72 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/enums/RequestUrl.java
  44. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/po/DaDiCrawlerOrder.java
  45. 39 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/DaDiCrawlerConfigureParameters.java
  46. 56 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiAgencyAgreementInfoRequest.java
  47. 20 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiAgentListRequest.java
  48. 569 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiApplicantInfoRequest.java
  49. 33 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiBaseRequest.java
  50. 75 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiCrawlerAuthenticateRequest.java
  51. 21 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiEleProposalQRCoreDataRequest.java
  52. 662 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java
  53. 65 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiJointSalesRequest.java
  54. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiOrderInfoRequest.java
  55. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiPayNoDataRequest.java
  56. 15 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQueryOrderInfoRequest.java
  57. 386 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java
  58. 482 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSaveFileIdxRequest.java
  59. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSpecialInformationRequest.java
  60. 69 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSubmitOrderRequest.java
  61. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiTaxConfigRequest.java
  62. 101 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiTemporaryOrderRequest.java
  63. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUnderwritingRequest.java
  64. 48 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUploadImageRequest.java
  65. 355 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleChannelRequest.java
  66. 612 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleModelRequest.java
  67. 136 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehiclePricRequest.java
  68. 170 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDivehicleOwnerInfoRequest.java
  69. 19 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiCurTaskRequest.java
  70. 446 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInsuredInfoRequest.java
  71. 146 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInvoiceRequest.java
  72. 288 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiSaveInfoRequest.java
  73. 87 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiAgencyAgreementInfoResponse.java
  74. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiAgentInfoResponse.java
  75. 37 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiBaseResponse.java
  76. 105 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerAuthenticateResponse.java
  77. 33 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerCaptchaResponse.java
  78. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCurTaskResponse.java
  79. 18 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiEleProposalQRCoreDataResponse.java
  80. 34 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiGetUnderwritingResponse.java
  81. 202 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java
  82. 45 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiOrderInfoResponse.java
  83. 343 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiOssInitParamResponse.java
  84. 27 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiPayNoDataResponse.java
  85. 721 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderInfoResponse.java
  86. 42 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderStatusResponse.java
  87. 463 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java
  88. 142 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSaveFileIdxResponse.java
  89. 67 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSpecialInformationResponse.java
  90. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSubmitOrderResponse.java
  91. 28 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTaxConfigResponse.java
  92. 20 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTemporaryOrderResponse.java
  93. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiUploadImageResponse.java
  94. 273 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleChannelInfoResponse.java
  95. 57 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleCheckInfoResponse.java
  96. 39 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehiclePricResponse.java
  97. 542 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/network/NetworkRequest.java
  98. 21 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/properties/DaDiCrawlerProperties.java
  99. 19 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/repository/DaDiCrawlerOrderReposiroty.java
  100. 15 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/DaDiCrawlerOrderService.java

+ 5 - 5
authentication/src/main/java/com/jzg/controller/SendSmsCodeController.java

@@ -65,7 +65,7 @@ public class SendSmsCodeController {
         try {
             url = String.format(URL, mobile, TPL_ID, URLEncoder.encode("#code#=" + variable, "utf-8"), KEY);
         } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
+            log.error("print:",e);
         }
         JSONObject jsonObject = JSONObject.parseObject(doGet(url));
         int error_code = jsonObject.getIntValue("error_code");
@@ -117,23 +117,23 @@ public class SendSmsCodeController {
                 result = sbf.toString();
             }
         } catch (MalformedURLException e) {
-            e.printStackTrace();
+            log.error("doGet:",e);
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("doGet:IOException",e);
         } finally {
             // 关闭资源
             if (null != bufferedReader) {
                 try {
                     bufferedReader.close();
                 } catch (IOException e) {
-                    e.printStackTrace();
+                    log.error("doGet1",e);
                 }
             }
             if (null != inputStream) {
                 try {
                     inputStream.close();
                 } catch (IOException e) {
-                    e.printStackTrace();
+                    log.error("doGet2",e);
                 }
             }
             if (connection != null) {

+ 1 - 2
authentication/src/main/java/com/jzg/service/impl/InitializePartnerCommissionServiceImpl.java

@@ -26,8 +26,7 @@ public class InitializePartnerCommissionServiceImpl implements InitializePartner
         try {
             distributionClient.initializeCommissionDetails(userId,tokenStore.getTokenByUsername(mobile));
         }catch (Exception e){
-            log.error("初始化用户佣金失败:{}", e.getMessage());
-            e.printStackTrace();
+            log.error("初始化用户佣金失败:{}", e.getMessage(),e);
         }
     }
 }

+ 6 - 6
authentication/src/main/resources/application-dev.yml

@@ -2,14 +2,14 @@ spring:
   cloud:
     nacos:
       server-addr: 192.168.5.250:8848
-      username: nacos
-      password: nacos
+      username:
+      password:
       config:
         file-extension: yaml
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
   config:
     import:
       - nacos:mysql
@@ -35,8 +35,8 @@ seata:
       server-addr: 192.168.5.250:8848
       group: SEATA_GROUP
       namespace: ba488f58-c785-49b4-9c02-b5d9b8a965a5
-      username: nacos
-      password: nacos
+      username:
+      password:
       # registry.conf中,配置cluster名称
       cluster: default
 wechat:

+ 2 - 2
commons/src/main/java/com/jzg/commons/core/base/BaseController.java

@@ -115,7 +115,7 @@ public class BaseController {
 
         List<String> userPerms = new ArrayList<>();
         String userJsonStr = redissonClient.getBucket(authorizationHeader).get().toString();
-        log.info("获取平台权限:authorizationHeader=[{}],userJsonStr=[{}]",authorizationHeader, userJsonStr);
+        //log.info("获取平台权限:authorizationHeader=[{}],userJsonStr=[{}]",authorizationHeader, userJsonStr);
         JSONObject userInfo = JSONObject.parseObject(userJsonStr);
         JSONArray auths = userInfo.getJSONArray("auths");
         auths.forEach(auth->{
@@ -152,7 +152,7 @@ public class BaseController {
         }
         valiedToken(authorizationHeader);
         String userJsonStr = redissonClient.getBucket(authorizationHeader).get().toString();
-        log.info("authorizationHeader=[{}], userJsonStr=[{}]",authorizationHeader, userJsonStr);
+        //log.info("authorizationHeader=[{}], userJsonStr=[{}]",authorizationHeader, userJsonStr);
         JSONObject userInfo = JSONObject.parseObject(userJsonStr);
         return userInfo.getString("system");
     }

+ 0 - 3
commons/src/main/java/com/jzg/commons/entity/dto/ApplyWithdrawParam.java

@@ -1,12 +1,9 @@
 package com.jzg.commons.entity.dto;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.jzg.commons.core.base.PageRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 
 @Schema(description = "申请提现param")
 @Data

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/dto/SysUserJzgInfoBankCardDto.java

@@ -27,6 +27,9 @@ public class SysUserJzgInfoBankCardDto implements Serializable {
     @Schema(description = "用户名称")
     private String name;
 
+    @Schema(description = "用户表的username")
+    private String username;
+
     @Schema(description = "银行名称")
     private String bankName;
 

+ 4 - 3
commons/src/main/java/com/jzg/commons/entity/po/SysRelationPerson.java

@@ -1,13 +1,12 @@
 
 package com.jzg.commons.entity.po;
 
-import java.io.Serializable;
-import java.util.Date;
-
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
+
 /**
  * 合伙人/推荐人和机构负责人关系表
  * @TableName sys_relation_person
@@ -17,6 +16,8 @@ import lombok.Data;
 public class SysRelationPerson extends BaseModel {
 
 
+    @Serial
+    private static final long serialVersionUID = -6394009209924555421L;
     @Schema(description = "主键")
     private Long id;
 

+ 14 - 12
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -371,19 +371,21 @@ public class QuoteEchoVo extends QuoteVo {
             }
         });
         // 添加交强险种信息
-        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
-            KindInfoVo jqKindInfoVo = new KindInfoVo();
-            jqKindInfoVo.setKindCode("J1");
-            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
-            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
-                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
-            }
-            jqKindInfoVo.setAmount("200000");
-            jqKindInfoVo.setServiceTimes("200000");
-            jqKindInfoVo.setUnitAmount("200000");
-            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
+//        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
+//            KindInfoVo jqKindInfoVo = new KindInfoVo();
+//            jqKindInfoVo.setKindCode("J1");
+//            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
+//            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
+//                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
+//            }
+//            jqKindInfoVo.setAmount("200000");
+//            jqKindInfoVo.setServiceTimes("200000");
+//            jqKindInfoVo.setUnitAmount("200000");
+//            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
+//        }
+        // 移除交强
+        insOrdersVo.getKindInfoVo().removeIf(item -> "J1".equals(item.getKindCode()));
 
-        }
         this.setKindInfoVo(insOrdersVo.getKindInfoVo());
         this.setAccidentalDrivings(insOrdersVo.getAccidentalDrivings());
         this.setVehicleAndVesselTaxVo(insOrdersVo.getVehicleAndVesselTaxVo());

+ 5 - 1
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java

@@ -2,7 +2,6 @@ package com.jzg.commons.entity.quote.vo.aggregated;
 
 
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.quote.vo.ExpenseFactor;
@@ -142,6 +141,11 @@ public class QuoteResultsVo implements Serializable {
      */
     private String errorMessage;
 
+    /**
+     * 交强险重复信息
+     */
+    private String jqRepeatinfo;
+
     /**
      * 评分VO
      */

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/vo/AmountAuditVo.java

@@ -1,6 +1,7 @@
 package com.jzg.commons.entity.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -76,6 +77,11 @@ public class AmountAuditVo  extends BaseModel {
     @Schema(description = "内部银行卡开户行名称")
     private String bankName;
 
+    @TableField(exist = false)
+    @ExcelProperty("银行卡持卡人姓名")
+    @Schema(description = "银行卡持卡人姓名")
+    private String cardHolderName;
+
     @ExcelProperty("内部银行卡开户行号")
     @Schema(description = "内部银行卡开户行号")
     private String bankNum;

+ 11 - 0
commons/src/main/java/com/jzg/commons/entity/vo/PtlAgreementCostVo.java

@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.aop.LogDescriptionField;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -72,6 +74,15 @@ public class PtlAgreementCostVo {
     @Schema(description = "审核不通过原因")
     private String reviewDescription;
 
+    @Schema(description = "交强险入口手续费比例")
+    private String jqEntranceFeeRatio;
+
+    @Schema(description = "商业险入口手续费比例")
+    private String syEntranceFeeRatio;
+
+    @Schema(description = "驾意险入口手续费比例")
+    private String jyEntranceFeeRatio;
+
     @Schema(description = "费用类型集合")
     private List<PtlAgreementCostTypeVo> ptlAgreementCostTypeList;
 

+ 6 - 1
commons/src/main/java/com/jzg/commons/util/Base64Utils.java

@@ -1,6 +1,9 @@
 package com.jzg.commons.util;
 
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 
@@ -8,6 +11,8 @@ import java.util.Base64;
  * 2021/6/4
  **/
 public class Base64Utils {
+
+    private static final Logger log = LoggerFactory.getLogger(Base64Utils.class);
     /**
      * 判断图片base64字符串的文件格式
      *
@@ -53,7 +58,7 @@ public class Base64Utils {
                 b = Base64.getDecoder().decode(s);
                 result = new String(b, StandardCharsets.UTF_8);
             } catch (Exception e) {
-                e.printStackTrace();
+                log.error("Exception",e);
             }
         }
         return result;

+ 2 - 2
commons/src/main/java/com/jzg/commons/util/CompressUtil.java

@@ -106,7 +106,7 @@ public class CompressUtil {
             }
             return dest;
         } catch (ZipException e) {
-            e.printStackTrace();
+            log.error("zip:",e);
         }
         return null;
     }
@@ -154,7 +154,7 @@ public class CompressUtil {
             }
             zipFile.delete();
         } catch (ZipException e) {
-            e.printStackTrace();
+            log.error("unZip",e);
         }
     }
 

+ 8 - 0
commons/src/main/java/com/jzg/commons/util/DateTimeUtils.java

@@ -84,4 +84,12 @@ public class DateTimeUtils {
         return dateTime.format(DateTimeFormatter.ofPattern(pattern));
     }
 
+    /**
+     * 获取当前时间(格式化)
+     * @param format 时间格式
+     * @return 当前时间
+     */
+    public static String getFormatTime(String format) {
+        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(format));
+    }
 }

+ 1 - 1
commons/src/main/java/com/jzg/commons/util/FileUtil.java

@@ -232,7 +232,7 @@ public class FileUtil {
                 url = url.replaceAll(tmp, URLEncoder.encode(tmp, "UTF-8"));
             }
         } catch (UnsupportedEncodingException e) {
-            e.printStackTrace();
+            log.error("urlEncodeChinese",e);
         }
         return url;
     }

+ 8 - 3
commons/src/main/java/com/jzg/commons/util/IDCardUtils.java

@@ -1,5 +1,8 @@
 package com.jzg.commons.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -14,6 +17,8 @@ import java.util.regex.Pattern;
  * @date: 2025/3/3 17:35
  **/
 public class IDCardUtils {
+
+    private static final Logger log = LoggerFactory.getLogger(IDCardUtils.class);
     /**
      * <p>
      * 身份证号码合法性校验。
@@ -68,10 +73,10 @@ public class IDCardUtils {
                     return false;
                 }
             } catch (NumberFormatException e) {
-                e.printStackTrace();
+                log.error("idCardValidate",e);
                 return false;
             } catch (ParseException e) {
-                e.printStackTrace();
+                log.error("idCardValidate1",e);
                 return false;
             }
             if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
@@ -269,7 +274,7 @@ public class IDCardUtils {
             }
             return age;
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("getAgeFromIDCard",e);
         }
         return 0;
     }

+ 6 - 1
commons/src/main/java/com/jzg/commons/util/ImageUtil.java

@@ -1,5 +1,8 @@
 package com.jzg.commons.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
@@ -13,6 +16,8 @@ import java.util.Base64;
  */
 public class ImageUtil {
 
+    private static final Logger log = LoggerFactory.getLogger(ImageUtil.class);
+
     /**
      * base64转BufferedImage对象
      * @param base64String
@@ -30,7 +35,7 @@ public class ImageUtil {
             BufferedImage image = ImageIO.read(bis);
             return image;
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("base64ToBufferedImage",e);
             return null;
         }
     }

+ 1 - 1
commons/src/main/java/com/jzg/commons/util/MinioUtils.java

@@ -277,7 +277,7 @@ public class MinioUtils {
             byte[] bytes = Base64.getEncoder().encode(base64.trim().getBytes());
             stream = new ByteArrayInputStream(bytes);
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("base64ToInputStream",e);
         }
         return stream;
     }

+ 6 - 1
commons/src/main/java/com/jzg/commons/util/ObjectUtil.java

@@ -1,8 +1,13 @@
 package com.jzg.commons.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.lang.reflect.Field;
 
 public class ObjectUtil {
+
+    private static final Logger log = LoggerFactory.getLogger(ObjectUtil.class);
     /**
      * 判断该对象是否所有属性为空
      * 返回ture表示所有属性为null,返回false表示不是所有属性都是null
@@ -26,7 +31,7 @@ public class ObjectUtil {
                     break;
                 }
             } catch (IllegalAccessException e) {
-                e.printStackTrace();
+                log.error("IllegalAccessException",e);
             }
         }
 

+ 6 - 7
commons/src/main/java/com/jzg/commons/util/PDFUtil.java

@@ -50,7 +50,6 @@ public class PDFUtil {
      * 将base64编码转换成PDF
      * @param base64sString
      * @param filePath
-     *    
      */
     public static void base64StringToPDF(String base64sString, String filePath) {
         BufferedInputStream bin = null;
@@ -82,14 +81,14 @@ public class PDFUtil {
             //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题
             bout.flush();
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("base64StringToPDF",e);
         }  finally {
             try {
                 bin.close();
                 fout.close();
                 bout.close();
             } catch (IOException e) {
-                e.printStackTrace();
+                log.error("base64StringToPDF",e);
             }
         }
     }
@@ -126,9 +125,9 @@ public class PDFUtil {
         //    return encoder.encodeBuffer(bytes).trim();
             return Base64Convert.byteToBase64(bytes);
         } catch (FileNotFoundException e) {
-            e.printStackTrace();
+            log.error("FileNotFoundException",e);
         } catch (IOException e) {
-            e.printStackTrace();
+            log.error("IOException",e);
         }finally{
             try {
                 fin.close();
@@ -136,7 +135,7 @@ public class PDFUtil {
                 bout.close();
 //              deleteDir(encriptPath.getParent());
             } catch (IOException e) {
-                e.printStackTrace();
+                log.error("IOException",e);
             }
         }
         return null;
@@ -554,7 +553,7 @@ public class PDFUtil {
                 InputStream inputStream = u.toURL().openStream();
                 FileUtil.copyInputStreamToFile(inputStream, file);
             }catch(Exception e){
-                e.printStackTrace();
+                log.error(e.getMessage(),e);
             }
             return file.getPath();
         } else {

+ 7 - 5
commons/src/main/java/com/jzg/commons/util/ServletUtils.java

@@ -13,6 +13,8 @@ import jakarta.servlet.ServletRequest;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
@@ -22,8 +24,9 @@ import org.springframework.web.context.request.ServletRequestAttributes;
  *
  * @author dongxin
  */
-public class ServletUtils
-{
+public class ServletUtils {
+
+    private static final Logger log = LoggerFactory.getLogger(ServletUtils.class);
     /**
      * 获取String参数
      */
@@ -145,9 +148,8 @@ public class ServletUtils
             response.setCharacterEncoding("utf-8");
             response.getWriter().print(string);
         }
-        catch (IOException e)
-        {
-            e.printStackTrace();
+        catch (IOException e) {
+            log.error("IOException",e);
         }
     }
 

+ 7 - 3
commons/src/main/java/com/jzg/commons/util/UnionPayUtils.java

@@ -1,5 +1,8 @@
 package com.jzg.commons.util;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
@@ -7,6 +10,8 @@ import java.util.Random;
 
 public class UnionPayUtils {
 
+    private static final Logger log = LoggerFactory.getLogger(UnionPayUtils.class);
+
 
     /**
      * 生成定长的随机数
@@ -48,11 +53,10 @@ public class UnionPayUtils {
             }
             return hexString.toString();
         } catch (NoSuchAlgorithmException e) {
-            e.printStackTrace();
+            log.error("NoSuchAlgorithmException",e);
         } catch (Exception e) {
-            e.printStackTrace();
+            log.error("Exception",e);
         }
-
         return "ERROR";
     }
 

+ 1 - 1
commons/src/main/java/com/jzg/commons/util/comparble/SchemaAnnotationUtils.java

@@ -29,7 +29,7 @@ public class SchemaAnnotationUtils {
             }
             return null;
         } catch (NoSuchFieldException e) {
-            e.printStackTrace();
+            log.error("NoSuchFieldException", e);
         }
         return null;
     }

+ 2 - 4
consoleStatistics/src/main/resources/application-dev.yml

@@ -6,12 +6,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        #namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
-        namespace: ba488f58-c785-49b4-9c02-b5d9b8a965a5
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        #namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
-        namespace: ba488f58-c785-49b4-9c02-b5d9b8a965a5
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
   config:
     import:
       - nacos:mysql

+ 2 - 2
gateway/src/main/resources/application-dev.yml

@@ -18,10 +18,10 @@ spring:
         import-check:
           enabled: false
         file-extension: yaml
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
 
     gateway:
       routes:

+ 4 - 4
partner/src/main/resources/application-dev.yml

@@ -2,14 +2,14 @@ spring:
   cloud:
     nacos:
       server-addr: 192.168.5.250:8848
-      username: nacos
-      password: nacos
+      username:
+      password:
       config:
         file-extension: yaml
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
   config:
     import:
       - nacos:mysql

+ 2 - 2
platform/src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        namespace: 353f8f05-4d2c-4a17-b64d-b678408f5759
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
   config:
     import:
       - nacos:mysql

+ 4 - 4
tenant/costsorrule/src/main/resources/application-dev.yml

@@ -2,14 +2,14 @@ spring:
   cloud:
     nacos:
       server-addr: 192.168.5.250:8848
-      username: nacos
-      password: nacos
+      username:
+      password:
       config:
         file-extension: yaml
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
         group: DEFAULT_GROUP
       discovery:
-        namespace: 9fceaca4-c1d2-4bb8-aac9-f64d4b7de73c
+        namespace: 4efb5e2a-71db-4a19-9550-bb69d437698d
   config:
     import:
       - nacos:mysql

+ 1 - 0
tenant/insurance/pom.xml

@@ -16,6 +16,7 @@
         <module>quotation-commons</module>
         <module>quotation-summary</module>
         <module>quotation-dajia</module>
+        <module>quotation-dadi</module>
         <module>quotation-zhongmei</module>
         <module>quotation-zijin</module>
         <module>quotation-bohai</module>

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java

@@ -39,7 +39,8 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
 
         if (!calculatePremiumApply.getCode().equals(200)) {
             quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
-            quoteResultsVo.setErrorMessage(calculatePremiumApply.getMessage());
+            String message = calculatePremiumApply.getMessage();
+            quoteResultsVo.setErrorMessage(message.contains("。") ? message.substring(0, message.indexOf("。")) : message);
             return quoteResultsVo;
         }
         List<AnShengCrawlerCalculatePremiumApplyResponse.DataDTO.ContractsDTO> contracts = calculatePremiumApply.getData()

+ 10 - 5
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.collect.Lists;
 import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.constant.enums.DepartmentPlanCode;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerGetUserDetailResponse;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerSearchVehicleByVinResponse;
@@ -52,7 +53,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
         }
         if (!ObjectUtils.isEmpty(quoteVo.getBiRiskInfoVo())) {
             ContractsDTO baseContracts = getBaseContracts(quoteVo.getBiRiskInfoVo(), quoteVo, dataDTO, customerNegotiatePrice, userDetailResponse, departmentPlanCode.getCode(), departmentPlanCode.getProductCode(), checkVehicleCodeSecret);
-            baseContracts.addBusinessInsurance(quoteVo.getKindInfoVo());
+            baseContracts.addBusinessInsurance(quoteVo.getKindInfoVo(),quoteVo);
             baseContracts.addBiPolicyRatios();
             this.contracts.add(baseContracts);
         }
@@ -153,10 +154,14 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
             System.out.println(i);
         }
 
-        public void addBusinessInsurance(List<KindInfoVo> kindInfoVo) {
+        public void addBusinessInsurance(List<KindInfoVo> kindInfoVo, QuoteVo quoteVo) {
+            String seatCount = String.valueOf(Integer.parseInt(quoteVo.getCarInfoVo().getSeatCount()) - 1);
             for (KindInfoVo kind : kindInfoVo) {
-                PolicyCoveragesDTO policyCoveragesDTO = new PolicyCoveragesDTO(kind);
-                this.policyCoverages.add(policyCoveragesDTO);
+                PolicyCoveragesDTO dto = new PolicyCoveragesDTO(kind);
+                String code = dto.getDutyCode();
+                if (StringUtils.equalsAny(code, "APL", "APLDUOM")) dto.setSeats(seatCount);
+                else if (StringUtils.equalsAny(code, "ADL", "NEADL")) dto.setSeats("1");
+                policyCoverages.add(dto);
             }
         }
 
@@ -854,7 +859,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.autoModelChnName = brandAutoModel.getAutoModelChnName();
                 this.licenceTypeCode = carInfoVo.getLicenseKindCode();
                 this.ecdemicVehicleFlag = "0";
-                this.vehicleTonnages = "0";
+                this.vehicleTonnages = dataDTO.getBrandAutoModel().getTonsString();
                 this.power = brandAutoModel.getPower();
                 this.maxDesignSpeed = 0;
                 //this.runCardCertificateDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());

+ 8 - 9
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -84,7 +84,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
         DepartmentPlanCode departmentPlanCode = DepartmentPlanCode.PLAN_109;
         // 新能源
-        if (quoteVo.getCarInfoVo().isNewEnergyMark()) {
+        if (StringUtils.equals("1",quoteVo.getCarInfoVo().getEnergyTypeCode())) {
             departmentPlanCode = DepartmentPlanCode.PLAN_113;
         }
 
@@ -97,9 +97,6 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 车架号查询
         AnShengCrawlerSearchVehicleByVinRequest anShengCrawlerSearchVehicleByVinRequest = new AnShengCrawlerSearchVehicleByVinRequest(quoteVo.getCarInfoVo(), userDetailResponse.getDepartmentCode(), userDetailResponse.getAgentCode(),userDetailResponse.getRealBusinessType());
         List<AnShengCrawlerSearchVehicleByVinResponse.DataDTO> dataDTOS = anShengCrawlerRequestComponent.searchVehicleByVin(anShengCrawlerSearchVehicleByVinRequest, httpHeaders);
-        if (Objects.isNull(dataDTOS)){
-            throw new SystemException("车型查询错误");
-        }
         AnShengCrawlerSearchVehicleByVinResponse.DataDTO dataDTO = CarModelsFilterUtils.to(dataDTOS, quoteVo.getCarInfoVo());
         // 报价
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
@@ -109,11 +106,13 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 处理重复投保
         if (calculatePremiumApply.getMessage().contains("重复投保")) {
             String startTime = extractDuplicateEndTime(calculatePremiumApply.getMessage());
-            String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
-            crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceBeginTime(startTime);
-            crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceEndTime(endTime);
-            log.info("安盛报价重复投保参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
-            calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
+            if (StringUtils.isNotEmpty(startTime)){
+                String endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
+                crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceBeginTime(startTime);
+                crawlerCalculatePremiumApply.getContracts().get(0).getPolicyBase().setInsuranceEndTime(endTime);
+                log.info("安盛报价重复投保参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
+                calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
+            }
         }
         if (calculatePremiumApply.getCode() == 200) {
             // 缓存报价信息

+ 5 - 20
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/filter/CarModelsFilterUtils.java

@@ -9,32 +9,22 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 /**
- * @description 过滤车型
  * @author wenks
+ * @description 过滤车型
  * @date 2023/8/22 9:54
  **/
 public final class CarModelsFilterUtils {
 
     public static <T extends CarModelsFilter> T to(List<T> carModelsFilterList, CarInfoVo carInfo) {
-        if (carModelsFilterList.isEmpty()) {
+        if (carModelsFilterList == null) {
             throw new SystemException("核心查询车型失败 请联系业务人员处理");
         }
         List<T> stadarCarDTOS = new ArrayList<>();
         if (!StringUtils.isEmpty(carInfo.getCarYear())) {
-            stadarCarDTOS = carModelsFilterList
-                    .stream()
-                    .filter(car -> carInfo
-                            .getCarYear()
-                            .equals(car.getCarYear()))
-                    .collect(Collectors.toList());
+            stadarCarDTOS = carModelsFilterList.stream().filter(car -> carInfo.getCarYear().equals(car.getCarYear())).collect(Collectors.toList());
         }
         if (!StringUtils.isEmpty(carInfo.getSeatCount())) {
-            stadarCarDTOS = stadarCarDTOS
-                    .stream()
-                    .filter(car -> carInfo
-                            .getSeatCount()
-                            .equals(car.getSeatCount()))
-                    .collect(Collectors.toList());
+            stadarCarDTOS = stadarCarDTOS.stream().filter(car -> carInfo.getSeatCount().equals(car.getSeatCount())).collect(Collectors.toList());
         }
 
         if (!stadarCarDTOS.isEmpty()) {
@@ -43,12 +33,7 @@ public final class CarModelsFilterUtils {
             stadarCarDTOS = carModelsFilterList;
         }
 
-        carModelsFilterList = carModelsFilterList
-                .stream()
-                .filter(car -> carInfo
-                        .getPurchasePrice()
-                        .equals(String.valueOf(car.getPurchasePrice())))
-                .collect(Collectors.toList());
+        carModelsFilterList = carModelsFilterList.stream().filter(car -> carInfo.getPurchasePrice().equals(String.valueOf(car.getPurchasePrice()))).collect(Collectors.toList());
 
         if (carModelsFilterList.isEmpty()) {
             return stadarCarDTOS.get(0);

+ 13 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -116,13 +116,25 @@ public class DateUtil {
         return simpleDateFormat.format(date);
     }
 
+    /**
+     * 获取当前日期的前n天或后n天(正数为后n天,负数为前n天)
+     *
+     * @param n 天数偏移量
+     * @return 格式化后的日期字符串 yyyy-MM-dd
+     */
+    public static String getCurrentDate(int n) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DAY_OF_MONTH, n);
+        return formatDate(calendar.getTime(), "yyyy-MM-dd");
+    }
+
     /**
      * 根据传入的时间,获取当前年
      *
      * @param date Date
      * @return 格式化后的字符串
      */
-    public static String yyyy(Date date) {
+    public static String getTheCurrentYear(Date date) {
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy");
         return simpleDateFormat.format(date);
     }

+ 59 - 0
tenant/insurance/quotation-dadi/pom.xml

@@ -0,0 +1,59 @@
+<?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-dadi</artifactId>
+    <name>大地财险</name>
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
+                <configuration>
+                    <source>17</source>
+                    <target>17</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>3.3.1</version>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <!-- 阿里云 OSS SDK -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.17.4</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 115 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java

@@ -0,0 +1,115 @@
+package com.jzg.quotation.dadi.crawler.build;
+
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+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.commons.utils.DateTimeUtil;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiQuoteResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import org.apache.http.util.TextUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/26 17:20
+ */
+public class DaDiCrawlerQuoteResultVoBuild {
+
+    public static QuoteResultsVo build(QuoteVo quoteVo, DaDiQuoteResponse daDiQuoteResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+        DaDiQuoteResponse.UwResultDTO uwResult = daDiQuoteResponse.getUwResult();
+        String uwTypeText = DaDiVehicleUtils.UW_TYPE_DICT.get(uwResult.getUwType());
+        String eMsg = "";
+        String jq_repeatinfo = "";
+
+        List<DaDiQuoteResponse.UwResultDTO.UnderwriteRuleInfosDTO> underwriteRuleInfos = uwResult.getUnderwriteRuleInfos();
+
+        for (DaDiQuoteResponse.UwResultDTO.UnderwriteRuleInfosDTO underwriteRuleInfo : underwriteRuleInfos) {
+            if (!"3".equals(underwriteRuleInfo.getUwType())) {
+                quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.PAY_PENDING);
+                eMsg += underwriteRuleInfo.getRuleDescription() + ";";
+            }
+        }
+
+        if (!TextUtils.isEmpty(eMsg) && !TextUtils.isEmpty(uwTypeText) && !uwTypeText.contains("人工核保")) {
+            quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+            quoteResultsVo.setErrorMessage(uwTypeText);
+            return quoteResultsVo;
+        } else if (!TextUtils.isEmpty(eMsg) && !TextUtils.isEmpty(uwTypeText) && uwTypeText.contains("人工核保")) {
+            jq_repeatinfo += eMsg + uwTypeText;
+            quoteResultsVo.setJqRepeatinfo(jq_repeatinfo);
+        }
+
+        //交强险
+        RiskInfoVo ciRiskInfoVo = buildCiInfo(daDiQuoteResponse);
+        ciRiskInfoVo.setRiskCode(quoteVo.getCiRiskInfoVo().getRiskCode());
+        quoteResultsVo.setCiRiskInfoVo(ciRiskInfoVo);
+
+        //商业险
+        RiskInfoVo biRiskInfoVo = buildBiInfo(daDiQuoteResponse);
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            biRiskInfoVo.setRiskCode(quoteVo.getBiRiskInfoVo().getRiskCode());
+            quoteResultsVo.setBiRiskInfoVo(biRiskInfoVo);
+        }
+
+        //设置保费,车船税,投保单号
+        buildParams(daDiQuoteResponse, quoteResultsVo);
+        return quoteResultsVo;
+    }
+
+    private static RiskInfoVo buildBiInfo(DaDiQuoteResponse daDiQuoteResponse) {
+        RiskInfoVo biRiskInfoVo = new RiskInfoVo();
+        return getRiskInfoVo(false, true, biRiskInfoVo, daDiQuoteResponse);
+    }
+
+    public static RiskInfoVo buildCiInfo(DaDiQuoteResponse daDiQuoteResponse) {
+        RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
+
+        return getRiskInfoVo(true, false, ciRiskInfoVo, daDiQuoteResponse);
+    }
+
+    private static RiskInfoVo getRiskInfoVo(boolean isCiInfo, boolean isBiInfo, RiskInfoVo riskInfoVo, DaDiQuoteResponse daDiQuoteResponse) {
+        String begintime = "";
+        String endtime = "";
+        if (isCiInfo) {
+            begintime = daDiQuoteResponse.getInsurancePlan().getTrafficEffectiveStartDate();
+            endtime = daDiQuoteResponse.getInsurancePlan().getTrafficEffectiveEndDate();
+        } else if (isBiInfo) {
+            begintime = daDiQuoteResponse.getInsurancePlan().getBusinessEffectiveStartDate();
+            endtime = daDiQuoteResponse.getInsurancePlan().getBusinessEffectiveEndDate();
+        }
+        if (TextUtils.isEmpty(begintime) || TextUtils.isEmpty(endtime)) {
+            return null;
+        }
+        LocalDateTime startDate = DateTimeUtil.parseDate(begintime);
+        riskInfoVo.setStartDate(DateTimeUtil.format(startDate, DateTimeUtil.DATETIME_PATTERN));
+        LocalDateTime endDate = DateTimeUtil.parseDate(endtime);
+        riskInfoVo.setEndDate(DateTimeUtil.format(endDate, DateTimeUtil.DATETIME_PATTERN));
+        return riskInfoVo;
+    }
+
+    public static void buildParams(DaDiQuoteResponse daDiQuoteResponse, QuoteResultsVo quoteResultsVo) {
+        //交强险保费
+        int trafficDuePremium = daDiQuoteResponse.getInsurancePlan().getTrafficDuePremium();
+        quoteResultsVo.getCosts().setCiPremium(String.valueOf(trafficDuePremium));
+        //商业险保费
+        int businessDuePremium = daDiQuoteResponse.getInsurancePlan().getBusinessDuePremium();
+        quoteResultsVo.getCosts().setBiPremium(String.valueOf(businessDuePremium));
+        //车船税
+        int sumPayment = daDiQuoteResponse.getInsurancePlan().getTax().getSumPayment();
+        quoteResultsVo.getCosts().setVvTax(String.valueOf(sumPayment));
+        //设置非车保费
+//        quoteResultsVo.getCosts().setNiPremium(proposalResponse.getAccidentTotalPremium());
+
+        //总保费
+        int sumPremium = trafficDuePremium + businessDuePremium + sumPayment;
+        quoteResultsVo.getCosts().setSumPremium(String.valueOf(sumPremium));
+    }
+
+}

+ 77 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerCacheComponent.java

@@ -0,0 +1,77 @@
+package com.jzg.quotation.dadi.crawler.component;
+
+import lombok.RequiredArgsConstructor;
+import org.redisson.api.RBucket;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+
+@Component
+@RequiredArgsConstructor
+public class DaDiCrawlerCacheComponent {
+
+    private final RedissonClient redissonClient;
+
+    public static final String DADI_TOKEN = "dadi:token:";
+
+    public static final String DADI_THIRDCOMECODE = "dadi:thirdComeCode:";
+
+    public static final Duration DADI_TOKEN_TIME = Duration.ofHours(6L);
+
+    /**
+     * 缓存 token 信息
+     *
+     * @param username 用户名
+     * @param token    token
+     */
+    public void cacheToken(String username, String token) {
+        RBucket<String> bucket = redissonClient.getBucket(DADI_TOKEN + username);
+        bucket.set(token, DADI_TOKEN_TIME);
+    }
+
+    /**
+     * 获取token
+     *
+     * @param username 用户名
+     * @return 用户名
+     */
+    public String getToken(String username) {
+        RBucket<String> bucket = redissonClient.getBucket(DADI_TOKEN + username);
+        return bucket.get();
+    }
+
+    /**
+     * 缓存 渠道码 信息
+     *
+     * @param username      用户名
+     * @param thirdComeCode 渠道码
+     */
+    public void cacheThirdComeCode(String username, String thirdComeCode) {
+        RBucket<String> bucket = redissonClient.getBucket(DADI_THIRDCOMECODE + username);
+        bucket.set(thirdComeCode, DADI_TOKEN_TIME);
+    }
+
+    /**
+     * 获取渠道码
+     *
+     * @param username 用户名
+     * @return 渠道码
+     */
+    public String getThirdComeCode(String username) {
+        RBucket<String> bucket = redissonClient.getBucket(DADI_THIRDCOMECODE + username);
+        return bucket.get();
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param username 用户名
+     */
+    public void removeToken(String username) {
+        RBucket<String> tokenBucket = redissonClient.getBucket(DADI_TOKEN + username);
+        RBucket<String> thirdComeCodeBucket = redissonClient.getBucket(DADI_THIRDCOMECODE + username);
+        tokenBucket.delete();
+        thirdComeCodeBucket.delete();
+    }
+}

+ 828 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java

@@ -0,0 +1,828 @@
+package com.jzg.quotation.dadi.crawler.component;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.jzg.commons.entity.po.SysUploadFiles;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingVo;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.commons.exception.ValidateException;
+import com.jzg.commons.util.DateTimeUtils;
+import com.jzg.commons.util.MinioUtils;
+import com.jzg.quotation.commons.client.PlatformClient;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.dadi.crawler.constant.entity.DaDiFuelVehicleInsurance;
+import com.jzg.quotation.dadi.crawler.constant.entity.DaDiNewEnergyVehicleInsurance;
+import com.jzg.quotation.dadi.crawler.constant.enums.RequestUrl;
+import com.jzg.quotation.dadi.crawler.constant.po.DaDiCrawlerOrder;
+import com.jzg.quotation.dadi.crawler.entity.DaDiCrawlerConfigureParameters;
+import com.jzg.quotation.dadi.crawler.entity.request.*;
+import com.jzg.quotation.dadi.crawler.entity.response.*;
+import com.jzg.quotation.dadi.crawler.network.NetworkRequest;
+import com.jzg.quotation.dadi.crawler.properties.DaDiCrawlerProperties;
+import com.jzg.quotation.dadi.utils.CaptchaUtils;
+import com.jzg.quotation.dadi.utils.DaDiAESUtils;
+import com.jzg.quotation.dadi.utils.DaDiAliOssUtils;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.IOUtils;
+import org.apache.http.util.TextUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 爬虫请求组件
+ * @date 2026/05/21 14:41
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class DaDiCrawlerRequestComponent {
+
+    private final MinioUtils minioUtils;
+
+    private final NetworkRequest networkRequest;
+
+    private final PlatformClient platformClient;
+
+    private final DaDiAliOssUtils daDiAliOssUtils;
+
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
+    private final DaDiCrawlerProperties daDiCrawlerProperties;
+
+    private final DaDiCrawlerCacheComponent daDiCrawlerCacheComponent;
+
+    private static final Pattern JQ_PATTERN = Pattern.compile("起保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2});终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2});");
+
+    /**
+     * 验证码
+     *
+     * @return
+     */
+    public DaDiCrawlerCaptchaResponse captcha() {
+        try {
+            // 请求 - 使用Hutool网络工具类
+            String url = RequestUrl.IDENTIFY_CODE.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+            String responseBody = networkRequest.doPost(url);
+            DaDiCrawlerCaptchaResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiCrawlerCaptchaResponse.class);
+
+            String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+            DaDiCrawlerCaptchaResponse recordResponse = JSONObject.parseObject(resJson, DaDiCrawlerCaptchaResponse.class);
+
+            // 识别验证码
+            String systemCode = exteriorUtilsRequest.captchaIdentify(recordResponse.getSrc());
+            daDiCrawlerCaptcha.setSrc(systemCode);
+            daDiCrawlerCaptcha.setRandomNum(recordResponse.getRandomNum());
+            daDiCrawlerCaptcha.setSolve(CaptchaUtils.solveToString(systemCode));
+            log.info("识别的验证码[{}],验证码编号[{}],验证码计算结果[{}]", systemCode, recordResponse.getRandomNum(), CaptchaUtils.solveToString(systemCode));
+            return daDiCrawlerCaptcha;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    /**
+     * 登录
+     *
+     * @param username  用户名称
+     * @param password  密码
+     * @param captcha   验证码
+     * @param randomNum 验证码编号
+     * @return 成功返回Token和用户信息
+     */
+    public DaDiCrawlerAuthenticateResponse daDiLogin(String username, String password, String captcha, String randomNum) {
+        try {
+            String url = RequestUrl.LOGIN.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+            DaDiCrawlerAuthenticateRequest authenticateRequest = new DaDiCrawlerAuthenticateRequest(password, username, captcha, randomNum);
+            String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(authenticateRequest));
+            String responseBody = networkRequest.doPost(url, requestBody);
+            log.info("\n----------------------> 登录请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+            DaDiBaseResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+            if (!daDiCrawlerCaptcha.isSuccess()) {
+                throw new ValidateException(daDiCrawlerCaptcha.getMsg());
+            }
+            String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+            DaDiCrawlerAuthenticateResponse daDiCrawlerAuthenticateResponse = JSONObject.parseObject(resJson, DaDiCrawlerAuthenticateResponse.class);
+            log.info("\n----------------------> 响应结果解析成功, \n----------------------> 解析结果:[{}],\n----------------------> 解析token:[{}],", resJson, daDiCrawlerAuthenticateResponse.getToken());
+            return daDiCrawlerAuthenticateResponse;
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 获取Token
+     */
+    public String getToken(String username, String password) {
+        String token = daDiCrawlerCacheComponent.getToken(username);
+        if (!StringUtils.hasLength(token)) {
+            // 登录验证码获取
+            DaDiCrawlerCaptchaResponse captchaResponse = captcha();
+            log.info("获取到的验证码[{}],验证码编号[{}]", captchaResponse.getSrc(), captchaResponse.getRandomNum());
+            DaDiCrawlerAuthenticateResponse daDiCrawlerAuthenticateResponse = daDiLogin(username, password, captchaResponse.getSolve(), captchaResponse.getRandomNum());
+            daDiCrawlerCacheComponent.cacheToken(username, daDiCrawlerAuthenticateResponse.getToken());
+            daDiCrawlerCacheComponent.cacheThirdComeCode(username, daDiCrawlerAuthenticateResponse.getThirdComeCode());
+            return daDiCrawlerAuthenticateResponse.getToken();
+        }
+        return token;
+    }
+
+    /**
+     * 获取代理信息
+     *
+     * @param headers
+     * @param parameters
+     * @return
+     */
+    public DaDiAgentInfoResponse getAgentInfo(HttpHeaders headers, DaDiCrawlerConfigureParameters parameters, String username) throws Exception {
+        String url = RequestUrl.GET_LOGIN_COM_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiAgentListRequest authenticateRequest = new DaDiAgentListRequest(parameters.getAgentName(), username);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(authenticateRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+//        log.info("\n----------------------> 获取代理信息列表请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiCrawlerCaptcha.isSuccess()) {
+            if (daDiCrawlerCaptcha.getCode().equals("10000")) {
+                daDiCrawlerCacheComponent.removeToken(username);
+            }
+            throw new ValidateException(daDiCrawlerCaptcha.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+        List<DaDiAgentInfoResponse> daDiAgentInfoResponseList = JSONObject.parseArray(resJson, DaDiAgentInfoResponse.class);
+//        log.info("\n----------------------> 获取代理信息列表结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiAgentInfoResponse daDiAgentInfoResponse = daDiAgentInfoResponseList.stream().filter(agentInfo -> agentInfo.getAgentCode().equals(parameters.getAgentName())).findFirst().orElse(null);
+        return daDiAgentInfoResponse;
+    }
+
+    /**
+     * 获取代理协议信息
+     *
+     * @param headers
+     * @param agentInfo
+     * @return
+     */
+    public DaDiAgencyAgreementInfoResponse getAgencyAgreementInfo(HttpHeaders headers, DaDiAgentInfoResponse agentInfo) throws Exception {
+        String url = RequestUrl.GET_AGENCY_AGREEMENT_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiAgencyAgreementInfoRequest authenticateRequest = new DaDiAgencyAgreementInfoRequest(agentInfo.getAgentCode(), "DEJ", agentInfo.getBusinessSource(), agentInfo.getAgentCode(), agentInfo.getUserCode());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(authenticateRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+//        log.info("\n----------------------> 获取代理协议信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiCrawlerCaptcha.isSuccess()) {
+            throw new ValidateException(daDiCrawlerCaptcha.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+//        log.info("\n----------------------> 获取代理协议信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiAgencyAgreementInfoResponse daDiAgencyAgreementInfoResponse = JSONObject.parseObject(resJson, DaDiAgencyAgreementInfoResponse.class);
+        return daDiAgencyAgreementInfoResponse;
+    }
+
+    /**
+     * 获取车辆渠道信息
+     *
+     * @param headers
+     * @param carInfo 车辆信息
+     * @return
+     */
+    public DaDiVehicleChannelInfoResponse.CarModel getDaDiVehicleChannelInfo(HttpHeaders headers, CarInfoVo carInfo, DaDiAgentInfoResponse agentInfo, DaDiVehiclePricResponse vehiclePricVo) throws Exception {
+        String url = RequestUrl.QUERY_CAR_MODEL.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiVehicleModelRequest carModelRequest = new DaDiVehicleModelRequest(carInfo, new DaDiVehicleChannelInfoResponse.CarModel(), agentInfo, vehiclePricVo);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(carModelRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取车辆渠道信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiCrawlerCaptcha.isSuccess()) {
+            throw new ValidateException(daDiCrawlerCaptcha.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+        log.info("\n----------------------> 获取车辆渠道信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiVehicleChannelInfoResponse daDiVehicleChannelInfo = JSONObject.parseObject(resJson, DaDiVehicleChannelInfoResponse.class);
+        DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO = new DaDiVehicleChannelInfoResponse.CarModel();
+        if (daDiVehicleChannelInfo.getCarModels().size() > 0) {
+            if (daDiVehicleChannelInfo.getCarModels().size() == 1) {
+                vehicleModelVO = daDiVehicleChannelInfo.getCarModels().get(0);
+            } else {
+                for (DaDiVehicleChannelInfoResponse.CarModel item : daDiVehicleChannelInfo.getCarModels()) {
+                    if (item.getSeatCount() >= Integer.parseInt(carInfo.getSeatCount()) || item.getPurchasePrice() == Double.parseDouble(carInfo.getPurchasePrice()) || TextUtils.isEmpty(carInfo.getCarYear()) ? true : item.getMarketYear() == carInfo.getCarYear()) {
+                        vehicleModelVO = item;
+                        break;
+                    }
+                    if (item.getSeatCount() >= Integer.parseInt(carInfo.getSeatCount()) || item.getPurchasePrice() > Double.parseDouble(carInfo.getPurchasePrice())) {
+                        vehicleModelVO = item;
+                        break;
+                    }
+                    if (item.getSeatCount() >= Integer.parseInt(carInfo.getSeatCount()) || TextUtils.isEmpty(carInfo.getCarYear()) ? true : item.getMarketYear() == carInfo.getCarYear()) {
+                        vehicleModelVO = item;
+                        break;
+                    }
+                }
+            }
+        } else {
+            throw new ValidateException("车型查询异常,请联系开发人员");
+        }
+        if (vehicleModelVO == null) {
+            throw new ValidateException("未匹配到车型,请更换车型后重新报价");
+        } else {
+            vehicleModelVO.setSeatCount(Integer.parseInt(carInfo.getSeatCount()));
+            if (!TextUtils.isEmpty(carInfo.getLimitLoad())) {
+                vehicleModelVO.setTonCount(Integer.parseInt(carInfo.getLimitLoad()));
+            }
+            if (!TextUtils.isEmpty(carInfo.getCompleteKerbMass())) {
+                vehicleModelVO.setNet(Integer.parseInt(carInfo.getCompleteKerbMass()));
+            }
+        }
+        DaDiVehicleCheckInfoResponse daDiVehicleCheckInfo = checkCarModel(headers, carInfo, vehicleModelVO, agentInfo, vehiclePricVo);
+        if (daDiVehicleCheckInfo.getSameFlag().equals("N")) {
+            vehicleModelVO.setVehicleJingyou(daDiVehicleCheckInfo.getCarModelList().get(0).getVehicleJingyou());
+        } else {
+            DaDiVehicleChannelInfoResponse.VehicleJingyou vehicleJingyou = vehicleModelVO.getVehicleJingyou();
+            vehicleJingyou.setIndustryVehicleCode(daDiVehicleCheckInfo.getCarModelList().get(0).getIndustryVehicleCode());
+            vehicleModelVO.setVehicleJingyou(vehicleJingyou);
+        }
+        if (!TextUtils.isEmpty(carInfo.getDisplacement())) {
+            vehicleModelVO.getVehicleJingyou().setDisplacement(carInfo.getDisplacement());
+        }
+        return vehicleModelVO;
+    }
+
+    /**
+     * 验证车型信息
+     *
+     * @param headers
+     * @param vehicleModelVO 车辆信息
+     * @return
+     */
+    private DaDiVehicleCheckInfoResponse checkCarModel(HttpHeaders headers, CarInfoVo carInfo, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO, DaDiAgentInfoResponse agentInfo, DaDiVehiclePricResponse vehiclePricVo) throws Exception {
+        String url = RequestUrl.CHECK_CAR_MODEL.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiVehicleModelRequest carModelRequest = new DaDiVehicleModelRequest(carInfo, vehicleModelVO, agentInfo, vehiclePricVo);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(carModelRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 验证车型信息信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiCrawlerCaptcha = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiCrawlerCaptcha.isSuccess()) {
+            throw new ValidateException(daDiCrawlerCaptcha.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiCrawlerCaptcha.getData());
+        log.info("\n----------------------> 验证车型信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiVehicleCheckInfoResponse daDiVehicleCheckInfo = JSONObject.parseObject(resJson, DaDiVehicleCheckInfoResponse.class);
+        return daDiVehicleCheckInfo;
+    }
+
+
+    /**
+     * 获取车辆价格信息
+     *
+     * @param headers                   请求头
+     * @param carInfo                   车辆信息
+     * @param daDiVehicleChannelRequest 渠道信息
+     * @return
+     */
+    public DaDiVehiclePricResponse getDaDiVehiclePric(HttpHeaders headers, CarInfoVo carInfo, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO) throws Exception {
+        String url = RequestUrl.GET_CAR_PRICE.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiVehiclePricRequest daDiVehiclePricRequest = new DaDiVehiclePricRequest(carInfo, daDiVehicleChannelRequest, vehicleModelVO);
+        // === 发送请求 ===
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiVehiclePricRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取车辆价格信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取车辆价格信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiVehiclePricResponse daDiVehiclePricResponse = JSONObject.parseObject(resJson, DaDiVehiclePricResponse.class);
+        return daDiVehiclePricResponse;
+    }
+
+    /**
+     * 获取订单号
+     *
+     * @param headers
+     * @param quoteVo 报价信息
+     * @return
+     */
+    public String getOrderNo(HttpHeaders headers, QuoteVo quoteVo, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO, DaDiAgentInfoResponse agentInfoVo, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDivehicleOwnerInfoRequest daDivehicleOwnerInfoRequest, DaDiVehiclePricResponse vehiclePricVo) throws Exception {
+        String url = RequestUrl.GET_TEMPORARY_ORDER.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiVehicleModelRequest carModelRequest = new DaDiVehicleModelRequest(quoteVo.getCarInfoVo(), vehicleModelVO, agentInfoVo, vehiclePricVo);
+        DaDiTemporaryOrderRequest daDiTemporaryOrder = new DaDiTemporaryOrderRequest(quoteVo, agentInfoVo, daDiVehicleChannelRequest, carModelRequest, daDivehicleOwnerInfoRequest);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiTemporaryOrder));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+//        log.info("\n----------------------> 获取订单号请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+//        log.info("\n----------------------> 获取订单号结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiTemporaryOrderResponse daDiTemporaryOrderResponse = JSONObject.parseObject(resJson, DaDiTemporaryOrderResponse.class);
+        return daDiTemporaryOrderResponse.getOrderId();
+    }
+
+    /**
+     * 获取尊享保障方案
+     *
+     * @param headers                   请求头
+     * @param daDiVehicleChannelRequest 渠道信息
+     * @param orderNo                   订单号
+     */
+    public DaDiJointSalesResponse getJointSales(HttpHeaders headers, QuoteVo quoteVo, DaDiVehicleChannelRequest daDiVehicleChannelRequest, String orderNo) throws Exception {
+        String url = RequestUrl.GET_JOINT_SALES.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiJointSalesRequest daDiJointSalesRequest = new DaDiJointSalesRequest(daDiVehicleChannelRequest, orderNo, quoteVo.getCarInfoVo());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiJointSalesRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取尊享保障方案请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取尊享保障方案结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiJointSalesResponse daDiJointSalesResponse = JSONObject.parseObject(resJson, DaDiJointSalesResponse.class);
+        return daDiJointSalesResponse;
+    }
+
+    /**
+     * 获取税种信息
+     *
+     * @param headers                   请求头
+     * @param quoteVo                   报价信息
+     * @param daDiVehicleChannelRequest 渠道信息
+     * @param orderId                   订单号
+     */
+    public DaDiTaxConfigResponse getTaxConfig(HttpHeaders headers, String orderId, QuoteVo quoteVo, DaDiVehicleChannelRequest daDiVehicleChannelRequest) throws Exception {
+        String url = RequestUrl.GET_TAX_CONFIG.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiTaxConfigRequest daDiTaxConfigRequest = new DaDiTaxConfigRequest(daDiVehicleChannelRequest.getComCode(), daDiVehicleChannelRequest.getUserCode(), orderId);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiTaxConfigRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取税种信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取税种信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiTaxConfigResponse daDiTaxConfigResponse = JSONObject.parseObject(resJson, DaDiTaxConfigResponse.class);
+        return daDiTaxConfigResponse;
+    }
+
+    /**
+     * 获取特约信息
+     *
+     * @param headers                   请求头
+     * @param daDiVehicleChannelRequest 渠道信息
+     * @param orderNo                   订单号
+     */
+    public DaDiSpecialInformationResponse getSpecialInformation(HttpHeaders headers, DaDiVehicleChannelRequest daDiVehicleChannelRequest, String orderNo) throws Exception {
+        String url = RequestUrl.GET_SPECIAL_INFORMATION.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiSpecialInformationRequest daDiSpecialInformationRequest = new DaDiSpecialInformationRequest(daDiVehicleChannelRequest.getComCode(), daDiVehicleChannelRequest.getUserCode(), orderNo);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiSpecialInformationRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+//        log.info("\n----------------------> 获取特约信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+//        log.info("\n----------------------> 获取特约信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiSpecialInformationResponse daDiSpecialInformationResponse = JSONObject.parseObject(resJson, DaDiSpecialInformationResponse.class);
+        return daDiSpecialInformationResponse;
+    }
+
+    /**
+     * 获取报价信息
+     *
+     * @param headers 渠道信息
+     * @param quoteVo 报价信息
+     */
+    public DaDiQuoteResponse getDaDiQuote(HttpHeaders headers, String orderId, List<DaDiQuoteResponse.ChecksDTO> checks, QuoteVo quoteVo, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO, DaDiAgentInfoResponse agentInfoVo, DaDiVehiclePricResponse vehiclePricVo) throws Exception {
+
+        DaDiFuelVehicleInsurance daDiFuelVehicleInsurance = new DaDiFuelVehicleInsurance();
+//        log.info("\n----------------------> 燃油车险类型, \n----------------------> 燃油车险类型:[{}],", JSON.toJSONString(daDiFuelVehicleInsurance));
+
+        DaDiNewEnergyVehicleInsurance daDiNewEnergyVehicleInsurance = new DaDiNewEnergyVehicleInsurance();
+//        log.info("\n----------------------> 新能源车险类型, \n----------------------> 新能源车险类型:[{}],", JSON.toJSONString(daDiNewEnergyVehicleInsurance));
+
+        //2.4 获取尊享保障方案
+        DaDiJointSalesResponse jointSales = null;
+        if (!CollUtil.isEmpty(quoteVo.getAccidentalDrivings())) {
+            jointSales = getJointSales(headers, quoteVo, daDiVehicleChannelRequest, orderId);
+        }
+
+        //2.6 获取特约信息
+        DaDiSpecialInformationResponse specialInformation = getSpecialInformation(headers, daDiVehicleChannelRequest, orderId);
+
+        // 获取税务信息
+        DaDiTaxConfigResponse taxConfig = getTaxConfig(headers, orderId, quoteVo, daDiVehicleChannelRequest);
+        //构造车型信息
+        DaDiVehicleModelRequest carModelRequest = new DaDiVehicleModelRequest(quoteVo.getCarInfoVo(), vehicleModelVO, agentInfoVo, vehiclePricVo);
+        //构造车险信息
+        DaDiInsurancePlanRequest daDiInsurancePlanRequest = new DaDiInsurancePlanRequest(quoteVo, taxConfig, carModelRequest, daDiFuelVehicleInsurance, daDiNewEnergyVehicleInsurance, specialInformation, jointSales);
+
+        String url = RequestUrl.CALCULATION_PREMIUM.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+
+        DaDiQuoteRequest daDiQuoteRequest = new DaDiQuoteRequest(quoteVo, orderId, checks, daDiVehicleChannelRequest.getComCode(), daDiInsurancePlanRequest, carModelRequest, daDiVehicleChannelRequest);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQuoteRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取报价信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取报价信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiQuoteResponse daDiQuoteResponse = JSONObject.parseObject(resJson, DaDiQuoteResponse.class);
+        //重复投保
+        DaDiQuoteResponse.TrafficReinsureInfoDTO trafficReinsureInfoDTO = daDiQuoteResponse.getTrafficReinsureInfo();
+        String trafficErrorMessage = daDiQuoteResponse.getTrafficErrorMessage();
+
+        //验证码
+        List<DaDiQuoteResponse.ChecksDTO> checksList = daDiQuoteResponse.getChecks();
+
+        // 无重复投保信息,直接返回
+        if (trafficReinsureInfoDTO == null && TextUtils.isEmpty(trafficErrorMessage) && CollectionUtils.isEmpty(checksList)) {
+            DaDiQuoteResponse.UwResultDTO uwResult = daDiQuoteResponse.getUwResult();
+            String uwTypeText = DaDiVehicleUtils.UW_TYPE_DICT.get(uwResult.getUwType());
+            String eMsg = "";
+            List<DaDiQuoteResponse.UwResultDTO.UnderwriteRuleInfosDTO> underwriteRuleInfos = uwResult.getUnderwriteRuleInfos();
+
+            for (DaDiQuoteResponse.UwResultDTO.UnderwriteRuleInfosDTO underwriteRuleInfo : underwriteRuleInfos) {
+                if (!"3".equals(underwriteRuleInfo.getUwType())) {
+                    eMsg += underwriteRuleInfo.getRuleDescription() + ";";
+                }
+            }
+
+            if (!TextUtils.isEmpty(eMsg) && !TextUtils.isEmpty(uwTypeText) && !uwTypeText.contains("人工核保")) {
+                throw new ValidateException(uwTypeText + ":" + eMsg);
+            }
+            saveInfo(headers, quoteVo, orderId, daDiQuoteResponse, daDiVehicleChannelRequest, carModelRequest);
+            return daDiQuoteResponse;
+        }
+
+        // 提取起保/终保日期
+        String startTime = trafficReinsureInfoDTO != null ? trafficReinsureInfoDTO.getEffectiveEndDate() + ":00" : null;
+        String endTime = null;
+        if (!TextUtils.isEmpty(startTime)) {
+            String beginDateStr = DateUtil.strAllToDateToStr(startTime, "yyyy-MM-dd HH:mm:ss", "yyyyMMddHHmmss");
+            endTime = trafficReinsureInfoDTO != null ? DateUtil.getNextYearDateStrTranfer(beginDateStr) : null;
+            if (trafficReinsureInfoDTO != null) {
+                log.info("识别到交强重复投保,重复投保单号:{},重复起保时间:{},终保时间:{}", trafficReinsureInfoDTO.getPolicyNo(), startTime, endTime);
+            }
+        }
+
+        // 若日期不完整,尝试从错误消息中正则提取
+        if (TextUtils.isEmpty(startTime) && !TextUtils.isEmpty(trafficErrorMessage)) {
+            Matcher jqMatcher = JQ_PATTERN.matcher(trafficErrorMessage);
+            if (jqMatcher.find()) {
+                startTime = jqMatcher.group(1);
+                endTime = jqMatcher.group(2);
+            } else {
+                throw new ValidateException(trafficErrorMessage);
+            }
+        }
+
+        // 有起保日期,更新风险信息并重新报价
+        if (!TextUtils.isEmpty(startTime)) {
+            RiskInfoVo ciRisk = quoteVo.getCiRiskInfoVo();
+            ciRisk.setStartDate(startTime);
+            ciRisk.setEndDate(endTime);
+            quoteVo.setCiRiskInfoVo(ciRisk);
+            return getDaDiQuote(headers, orderId, new ArrayList<>(), quoteVo, daDiVehicleChannelRequest, vehicleModelVO, agentInfoVo, vehiclePricVo);
+        }
+
+        if (CollectionUtils.isNotEmpty(checksList)) {
+            for (DaDiQuoteResponse.ChecksDTO item : checksList) {
+                // 识别验证码
+                String systemCode = exteriorUtilsRequest.captchaIdentify(item.getCheckCode());
+                item.setCheckCode(systemCode);
+            }
+            return getDaDiQuote(headers, orderId, checksList, quoteVo, daDiVehicleChannelRequest, vehicleModelVO, agentInfoVo, vehiclePricVo);
+        }
+
+        // 无法自动处理,抛出异常
+        String message = trafficReinsureInfoDTO != null ? String.format("识别到交强重复投保,重复投保单号:%s,重复起保时间:%s,终保时间:%s", trafficReinsureInfoDTO.getPolicyNo(), startTime, endTime) : trafficErrorMessage;
+        throw new ValidateException(message);
+
+    }
+
+    /**
+     * 保存订单信息
+     */
+    public void saveInfo(HttpHeaders headers, QuoteVo quoteVo, String orderId, DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleModelRequest carModelRequest) throws Exception {
+        String url = RequestUrl.SAVE_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        String token = headers.getFirst("X-Access-Token");
+        DadiSaveInfoRequest dadiSaveInfoRequest = new DadiSaveInfoRequest(quoteVo, daDiQuoteResponse, daDiVehicleChannelRequest, carModelRequest, orderId, token);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(dadiSaveInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 保存信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        getCurTaskProgress(headers, quoteVo, orderId, daDiVehicleChannelRequest, daDiQuoteResponse, carModelRequest);
+    }
+
+    /**
+     * 获取月任务
+     *
+     * @param headers
+     * @param quoteVo
+     * @param daDiVehicleChannelRequest
+     */
+    public DaDiCurTaskResponse getCurTaskProgress(HttpHeaders headers, QuoteVo quoteVo, String orderId, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleModelRequest carModelRequest) throws Exception {
+        String url = RequestUrl.CUR_TASK_PROGRESS.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DadiCurTaskRequest dadiSaveInfoRequest = new DadiCurTaskRequest(daDiVehicleChannelRequest.getComCode(), daDiVehicleChannelRequest.getUserCode(), daDiVehicleChannelRequest.getAgentCode());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(dadiSaveInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取月任务请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取获取月任务结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiCurTaskResponse daDiCurTaskResponse = JSONObject.parseObject(resJson, DaDiCurTaskResponse.class);
+        insuredInfo(headers, quoteVo, orderId, daDiCurTaskResponse, daDiQuoteResponse, daDiVehicleChannelRequest, carModelRequest);
+        return daDiCurTaskResponse;
+    }
+
+    /**
+     * 保存人员信息
+     *
+     * @param quoteVo
+     * @param daDiCurTaskResponse
+     */
+    public void insuredInfo(HttpHeaders headers, QuoteVo quoteVo, String orderId, DaDiCurTaskResponse daDiCurTaskResponse, DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleModelRequest carModelRequest) throws Exception {
+        String url = RequestUrl.INSURED_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DadiInsuredInfoRequest.QuoteRequest quoteRequest = new DadiInsuredInfoRequest.QuoteRequest(quoteVo, daDiCurTaskResponse, daDiQuoteResponse, daDiVehicleChannelRequest, carModelRequest, orderId);
+        DadiInsuredInfoRequest dadiSaveInfoRequest = new DadiInsuredInfoRequest(quoteVo, orderId, quoteRequest, daDiVehicleChannelRequest.getComCode(), daDiVehicleChannelRequest.getUserCode());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(dadiSaveInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 保存人员信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 保存人员信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+    }
+
+    /**
+     * 提交订单
+     *
+     * @param quoteVo
+     * @param orderId
+     * @param daDiQuoteResponse
+     * @param daDiVehicleChannelRequest
+     */
+    public DaDiSubmitOrderResponse submitOrder(HttpHeaders headers, QuoteVo quoteVo, String orderId, DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleChannelRequest daDiVehicleChannelRequest) throws Exception {
+        String url = RequestUrl.SUBMIT_ORDER.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiSubmitOrderRequest daDiSubmitOrderRequest = new DaDiSubmitOrderRequest(orderId, daDiVehicleChannelRequest.getComCode(), daDiVehicleChannelRequest.getUserCode(), new ArrayList<>());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiSubmitOrderRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 提交订单请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 提交订单结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiSubmitOrderResponse daDiSubmitOrderResponse = JSONObject.parseObject(resJson, DaDiSubmitOrderResponse.class);
+        return daDiSubmitOrderResponse;
+    }
+
+    /**
+     * 获取核保信息
+     */
+    public DaDiGetUnderwritingResponse getUnderwriting(HttpHeaders headers, UnderwritingVo underwritingVo, DaDiCrawlerOrder daDiCrawlerOrder) throws Exception {
+        AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
+        String url = RequestUrl.SUBMIT_UNDERWRITE.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        String thirdComeCode = daDiCrawlerCacheComponent.getThirdComeCode(attributionInformationVo.getUsername());
+        DaDiUnderwritingRequest daDiUnderwritingRequest = new DaDiUnderwritingRequest(daDiCrawlerOrder.getPlyappno(), thirdComeCode, attributionInformationVo.getUsername());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiUnderwritingRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取核保信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取核保信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiGetUnderwritingResponse daDiGetUnderwritingResponse = JSONObject.parseObject(resJson, DaDiGetUnderwritingResponse.class);
+        return daDiGetUnderwritingResponse;
+    }
+
+    /**
+     * 获取订单信息
+     */
+    public DaDiOrderInfoResponse getOrderInfo(HttpHeaders headers, AttributionInformationVo attributionInformationVo, String orderId) throws Exception {
+        String url = RequestUrl.ORDER_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiOrderInfoRequest daDiOrderInfoRequest = new DaDiOrderInfoRequest(attributionInformationVo.getUsername(), orderId);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiOrderInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取订单信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取订单信息结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiOrderInfoResponse daDiGetOrderInfoResponse = JSONObject.parseObject(resJson, DaDiOrderInfoResponse.class);
+        return daDiGetOrderInfoResponse;
+    }
+
+    /**
+     * 获取支付号
+     */
+    public DaDiPayNoDataResponse getPayNo(HttpHeaders headers, String orderId, AttributionInformationVo attributionInformationVo) throws Exception {
+        String url = RequestUrl.GET_PAY_NO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        String thirdComeCode = daDiCrawlerCacheComponent.getThirdComeCode(attributionInformationVo.getUsername());
+        DaDiPayNoDataRequest daDiEleProposalQRCoreDataRequest = new DaDiPayNoDataRequest(orderId, thirdComeCode, attributionInformationVo.getUsername());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiEleProposalQRCoreDataRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取支付号请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取支付号结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiPayNoDataResponse daDiEleProposalQRCoreDataResponse = JSONObject.parseObject(resJson, DaDiPayNoDataResponse.class);
+        return daDiEleProposalQRCoreDataResponse;
+    }
+
+    /**
+     * 获取支付二维码
+     */
+    public DaDiEleProposalQRCoreDataResponse getEleProposalQRCoreData(HttpHeaders headers, String orderId, AttributionInformationVo attributionInformationVo) throws Exception {
+        String url = RequestUrl.GET_ELE_PROPOSAL_QR_CORE.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        String thirdComeCode = daDiCrawlerCacheComponent.getThirdComeCode(attributionInformationVo.getUsername());
+        DaDiEleProposalQRCoreDataRequest daDiEleProposalQRCoreDataRequest = new DaDiEleProposalQRCoreDataRequest(orderId, thirdComeCode, attributionInformationVo.getUsername());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiEleProposalQRCoreDataRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 获取支付二维码请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 获取支付二维码结果解析成功, \n----------------------> 解析结果:[{}],", resJson);
+        DaDiEleProposalQRCoreDataResponse daDiEleProposalQRCoreDataResponse = JSONObject.parseObject(resJson, DaDiEleProposalQRCoreDataResponse.class);
+        return daDiEleProposalQRCoreDataResponse;
+    }
+
+    /**
+     * 订单详情查询
+     */
+    public DaDiQueryOrderInfoResponse queryOrderInfo(HttpHeaders headers, String orderId, AttributionInformationVo attributionInformationVo) throws Exception {
+        String url = RequestUrl.QUERY_ORDER_INFO.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiQueryOrderInfoRequest daDiQueryOrderInfoRequest = new DaDiQueryOrderInfoRequest(orderId, attributionInformationVo.getUsername());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQueryOrderInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 订单详情查询请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 订单详情查询结果解析成功,  \n----------------------> 解析结果:[{}],", resJson);
+        DaDiQueryOrderInfoResponse daDiQueryOrderInfoResponse = JSONObject.parseObject(resJson, DaDiQueryOrderInfoResponse.class);
+        return daDiQueryOrderInfoResponse;
+    }
+
+    /**
+     * 订单状态查询
+     */
+    public DaDiQueryOrderStatusResponse queryOrderStatus(HttpHeaders headers, String orderId, AttributionInformationVo attributionInformationVo) throws Exception {
+        String url = RequestUrl.QUERY_ORDER_STATUS.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        DaDiQueryOrderInfoRequest daDiQueryOrderInfoRequest = new DaDiQueryOrderInfoRequest(orderId, attributionInformationVo.getUsername());
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQueryOrderInfoRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 订单状态查询请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 订单状态查询结果解析成功,  \n----------------------> 解析结果:[{}],", resJson);
+        DaDiQueryOrderStatusResponse daDiQueryOrderStatusResponse = JSONObject.parseObject(resJson, DaDiQueryOrderStatusResponse.class);
+        return daDiQueryOrderStatusResponse;
+    }
+
+    /**
+     * 上传影像
+     */
+    public DaDiUploadImageResponse uploadImage(HttpHeaders headers, String orderId, AttributionInformationVo attributionInformationVo) throws Exception {
+        DaDiOrderInfoResponse orderInfo = getOrderInfo(headers, attributionInformationVo, orderId);
+        String bussNo = TextUtils.isEmpty(orderInfo.getBusinessApplicationNo()) ? orderInfo.getTrafficApplicationNo() : orderInfo.getBusinessApplicationNo();
+        String url = RequestUrl.UPLOAD_IMAGE.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
+        String thirdComeCode = daDiCrawlerCacheComponent.getThirdComeCode(attributionInformationVo.getUsername());
+        DaDiUploadImageRequest daDiUploadImageRequest = new DaDiUploadImageRequest(bussNo, attributionInformationVo.getUsername(), thirdComeCode);
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiUploadImageRequest));
+        String responseBody = networkRequest.doPost(url, requestBody, headers);
+        log.info("\n----------------------> 上传图片请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);
+        if (!daDiBaseResponse.isSuccess()) {
+            throw new ValidateException(daDiBaseResponse.getMsg());
+        }
+        String resJson = DaDiAESUtils.decryptStr(daDiBaseResponse.getData());
+        log.info("\n----------------------> 上传图片结果解析成功,  \n----------------------> 解析结果:[{}],", resJson);
+        DaDiUploadImageResponse daDiUploadImageResponse = JSONObject.parseObject(resJson, DaDiUploadImageResponse.class);
+        daDiUploadImageResponse.setBussNo(bussNo);
+        return daDiUploadImageResponse;
+    }
+
+    /**
+     * OSS初始化参数
+     */
+    public DaDiOssInitParamResponse getOssInitParam(String imagetoken) {
+        String url = RequestUrl.OSS_INIT_PARAM.getUri() + "?token=" + imagetoken + "&t=" + System.currentTimeMillis();
+        networkRequest.setCookie("token", imagetoken);
+        String responseBody = networkRequest.doGet(url, null, null);
+        log.info("\n----------------------> OSS初始化参数请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiOssInitParamResponse daDiOssInitParamResponse = JSONObject.parseObject(responseBody, DaDiOssInitParamResponse.class);
+        if (daDiOssInitParamResponse.getAccessKeyVo() == null) {
+            throw new ValidateException("获取oss初始化参数失败");
+        }
+        return daDiOssInitParamResponse;
+    }
+
+    /**
+     * 上传影像
+     *
+     * @param imageVoList 影像列表
+     */
+    public void uploadAliOssImage(List<InsuranceImageVo> imageVoList, String bussNo, DaDiOssInitParamResponse ossInitParam) throws Exception {
+        for (InsuranceImageVo insuranceImageVo : imageVoList) {
+            for (InsuranceImageVo.ImageDTO imageDTO : insuranceImageVo.getImageBase64List()) {
+                // 根据imageId查询文件信息
+                SysUploadFiles uploadFile = platformClient.getUploadFile(imageDTO.getImageId());
+                if (uploadFile == null) {
+                    log.error("大地上传影像失败,未找到文件信息,imageId:{}", imageDTO.getImageId());
+                    continue;
+                }
+                // 获取文件名
+                String fileName = uploadFile.getFileName();
+                // 获取文件流
+                String imgUrl = minioUtils.getPresignedObjectUrl(uploadFile.getBucketName(), fileName);
+                log.info("大地影像上传,获取文件预签名URL,imgUrl:{}", imgUrl);
+                InputStream inputStream = minioUtils.getObject(uploadFile.getBucketName(), fileName);
+                log.info("大地影像上传,获取获取文件流,inputStream:{}", inputStream);
+                if (inputStream == null) {
+                    log.error("大地上传影像失败,获取文件预签名URL失败,imageId:{}", imageDTO.getImageId());
+                    continue;
+                }
+                // 下载文件内容为byte[]
+                byte[] imageBytes = IOUtils.toByteArray(inputStream);
+                if (imageBytes == null || imageBytes.length == 0) {
+                    log.error("大地上传影像失败,文件内容为空,imageId:{}", imageDTO.getImageId());
+                    continue;
+                }
+                log.info("大地下载影像成功,imageId:{},fileName:{}", imageDTO.getImageId(), fileName);
+                // 构造文件名
+                fileName = "UW/" + DateTimeUtils.getFormatTime("yyyy/MM/dd/HH") + "/" + bussNo + "/" + UUID.randomUUID().toString().replace("-", "") + ".jpg";
+                String upload = daDiAliOssUtils.upload(ossInitParam, imageBytes, fileName);
+                log.info("大地上传影像成功,imageId:{},upload---->:{}", imageDTO.getImageId(), upload);
+                String base64Str = imageDTO.getImageBase64Str();
+                if (base64Str.startsWith("http")) {
+                    base64Str = minioUtils.getBase64Str(uploadFile.getBucketName(), uploadFile.getFileName());
+                }
+                imageDTO.setImageBase64Str(base64Str);
+                SaveFileIdx(ossInitParam, bussNo, imageDTO, fileName, insuranceImageVo.getImageCode());
+            }
+        }
+    }
+
+    public DaDiSaveFileIdxResponse SaveFileIdx(DaDiOssInitParamResponse ossInitParam, String bussNo, InsuranceImageVo.ImageDTO image, String imageName, String imgType) throws Exception {
+        String url = RequestUrl.SAVE_FILE_IDX.getUri();
+        networkRequest.setCookie("token", ossInitParam.getToken());
+        DaDiSaveFileIdxRequest daDiSaveFileIdxRequest = new DaDiSaveFileIdxRequest(ossInitParam, bussNo, image, imageName, imgType);
+        String requestBody = JSON.toJSONString(daDiSaveFileIdxRequest);
+        String responseBody = networkRequest.doPost(url, requestBody, null);
+        log.info("\n----------------------> 保存影像索引请求成功, \n----------------------> 响应结果:[{}],", responseBody);
+        DaDiSaveFileIdxResponse daDiSaveFileIdxResponse = JSONObject.parseObject(responseBody, DaDiSaveFileIdxResponse.class);
+        return daDiSaveFileIdxResponse;
+    }
+
+
+}
+

+ 4 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/InsuranceMap.java

@@ -0,0 +1,4 @@
+package com.jzg.quotation.dadi.crawler.constant;
+
+public final class InsuranceMap {
+}

+ 101 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelKindInfo.java

@@ -0,0 +1,101 @@
+package com.jzg.quotation.dadi.crawler.constant.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地车险】 保单信息 险种信息
+ * @date 2026/5/25 17:41
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DaDiFuelKindInfo {
+    /**
+     * 险种编码
+     */
+    private String kindCode;
+
+    /**
+     * 险种名称
+     */
+    private String kindName;
+
+    /**
+     * 险种标识
+     */
+    private String kindFlag;
+
+    /**
+     * 风险索引
+     */
+    private String riskIndex;
+
+    /**
+     * 是否选中
+     */
+    private Boolean selected;
+
+    /**
+     * 保额
+     */
+    private String amount;
+
+    /**
+     * 每座保额
+     */
+    private String unitAmount;
+
+    /**
+     * 座位数/份数
+     */
+    private String quantity;
+
+    /**
+     * 保费
+     */
+    private String premium;
+
+    /**
+     * 标准保费
+     */
+    private String standardPremium;
+
+    /**
+     * 不计免赔保费
+     */
+    private String nonDeductiblePremium;
+
+    /**
+     * 不计免赔保费率
+     */
+    private String nonDeductiblePremiumRate;
+
+    /**
+     * 不计免赔标准保费
+     */
+    private String nonDeductibleStandardPremium;
+
+    /**
+     * 免赔率
+     */
+    private String deductibleRate;
+
+    /**
+     * 免赔额
+     */
+    private String deductibleValue;
+
+    /**
+     * 破损代码
+     */
+    private String brokenCode;
+
+    /**
+     * 费率
+     */
+    private String rate;
+}

+ 532 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelVehicleInsurance.java

@@ -0,0 +1,532 @@
+package com.jzg.quotation.dadi.crawler.constant.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地车险】 燃油车险 保单信息
+ * @date 2026/5/25 17:25
+ */
+@Data
+public class DaDiFuelVehicleInsurance {
+
+    /**
+     * 机动车损失保险
+     */
+    @SerializedName("A")
+    private DaDiFuelKindInfo a;
+
+    /**
+     * 机动车第三者责任保险
+     */
+    @SerializedName("B")
+    private DaDiFuelKindInfo b;
+
+    /**
+     * 机动车车上人员责任保险(司机)
+     */
+    @SerializedName("D3")
+    private DaDiFuelKindInfo d3;
+
+    /**
+     * 机动车车上人员责任保险(乘客)
+     */
+    @SerializedName("D4")
+    private DaDiFuelKindInfo d4;
+
+    /**
+     * 附加车身划痕损失险
+     */
+    @SerializedName("L")
+    private DaDiFuelKindInfo l;
+
+    /**
+     * 附加法定节假日限额翻倍险
+     */
+    @SerializedName("BD")
+    private DaDiFuelKindInfo bd;
+
+    /**
+     * 医保外用药险(三者)
+     */
+    @SerializedName("SY_FJ_YBW1")
+    private DaDiFuelKindInfo syFjYbw1;
+
+    /**
+     * 医保外用药险(司机)
+     */
+    @SerializedName("SY_FJ_YBW3")
+    private DaDiFuelKindInfo syFjYbw3;
+
+    /**
+     * 医保外用药险(乘客)
+     */
+    @SerializedName("SY_FJ_YBW2")
+    private DaDiFuelKindInfo syFjYbw2;
+
+    /**
+     * 附加道路救援服务特约条款
+     */
+    @SerializedName("TY1")
+    private DaDiFuelKindInfo ty1;
+
+    /**
+     * 附加车辆安全检测特约条款
+     */
+    @SerializedName("TY2")
+    private DaDiFuelKindInfo ty2;
+
+    /**
+     * 附加代为驾驶服务特约条款
+     */
+    @SerializedName("TY3")
+    private DaDiFuelKindInfo ty3;
+
+    /**
+     * 附加代为送检服务特约条款
+     */
+    @SerializedName("TY4")
+    private DaDiFuelKindInfo ty4;
+
+    /**
+     * 免赔率(车损)
+     */
+    @SerializedName("MJ1")
+    private DaDiFuelKindInfo mj1;
+
+    /**
+     * 免赔率(三者)
+     */
+    @SerializedName("MJ2")
+    private DaDiFuelKindInfo mj2;
+
+    /**
+     * 免赔率(司机)
+     */
+    @SerializedName("MJ3")
+    private DaDiFuelKindInfo mj3;
+
+    /**
+     * 免赔率(乘客)
+     */
+    @SerializedName("MJ4")
+    private DaDiFuelKindInfo mj4;
+
+    /**
+     * 精神损害抚慰金险(三者)
+     */
+    @SerializedName("SY_FJ_YBW4")
+    private DaDiFuelKindInfo syFjYbw4;
+
+    /**
+     * 精神损害抚慰金险(乘客)
+     */
+    @SerializedName("SY_FJ_YBW5")
+    private DaDiFuelKindInfo syFjYbw5;
+
+    /**
+     * 精神损害抚慰金险(司机)
+     */
+    @SerializedName("SY_FJ_YBW6")
+    private DaDiFuelKindInfo syFjYbw6;
+
+
+    /**
+     * 默认构造函数,初始化所有燃油车险种默认值
+     */
+    public DaDiFuelVehicleInsurance() {
+        // A - 机动车损失保险
+        this.a = new DaDiFuelKindInfo();
+        a.setKindCode("C101332");
+        a.setKindName("机动车损失保险");
+        a.setSelected(true);
+        a.setAmount("29350.8");
+        a.setUnitAmount("");
+        a.setQuantity("");
+        a.setPremium("");
+        a.setStandardPremium("");
+        a.setNonDeductiblePremium("");
+        a.setNonDeductiblePremiumRate("");
+        a.setNonDeductibleStandardPremium("");
+        a.setDeductibleRate("0");
+        a.setDeductibleValue("0");
+        a.setBrokenCode("");
+        a.setRate("");
+
+        // B - 机动车第三者责任保险
+        this.b = new DaDiFuelKindInfo();
+        b.setKindCode("C101352");
+        b.setKindName("机动车第三者责任保险");
+        b.setSelected(false);
+        b.setAmount("2000000");
+        b.setUnitAmount("");
+        b.setQuantity("");
+        b.setPremium("");
+        b.setStandardPremium("");
+        b.setNonDeductiblePremium("");
+        b.setNonDeductiblePremiumRate("");
+        b.setNonDeductibleStandardPremium("");
+        b.setDeductibleRate("");
+        b.setDeductibleValue("");
+        b.setBrokenCode("");
+        b.setRate("");
+
+        // D3 - 机动车车上人员责任保险(司机)
+        this.d3 = new DaDiFuelKindInfo();
+        d3.setKindCode("C101353");
+        d3.setKindName("机动车车上人员责任保险(司机)");
+        d3.setSelected(false);
+        d3.setAmount("10000");
+        d3.setUnitAmount("");
+        d3.setQuantity("");
+        d3.setPremium("");
+        d3.setStandardPremium("");
+        d3.setNonDeductiblePremium("");
+        d3.setNonDeductiblePremiumRate("");
+        d3.setNonDeductibleStandardPremium("");
+        d3.setDeductibleRate("");
+        d3.setDeductibleValue("");
+        d3.setBrokenCode("");
+        d3.setRate("");
+
+        // D4 - 机动车车上人员责任保险(乘客)
+        this.d4 = new DaDiFuelKindInfo();
+        d4.setKindCode("C101354");
+        d4.setKindName("机动车车上人员责任保险(乘客)");
+        d4.setSelected(false);
+        d4.setAmount("60000");
+        d4.setUnitAmount("10000");
+        d4.setQuantity("6");
+        d4.setPremium("");
+        d4.setStandardPremium("");
+        d4.setNonDeductiblePremium("");
+        d4.setNonDeductiblePremiumRate("");
+        d4.setNonDeductibleStandardPremium("");
+        d4.setDeductibleRate("");
+        d4.setDeductibleValue("");
+        d4.setBrokenCode("");
+        d4.setRate("");
+
+        // L - 附加车身划痕损失险
+        this.l = new DaDiFuelKindInfo();
+        l.setKindCode("C101369");
+        l.setKindName("附加车身划痕损失险");
+        l.setSelected(true);
+        l.setAmount("2000");
+        l.setUnitAmount("");
+        l.setQuantity("");
+        l.setPremium("");
+        l.setStandardPremium("");
+        l.setNonDeductiblePremium("");
+        l.setNonDeductiblePremiumRate("");
+        l.setNonDeductibleStandardPremium("");
+        l.setDeductibleRate("");
+        l.setDeductibleValue("");
+        l.setBrokenCode("");
+        l.setRate("");
+
+        // BD - 附加法定节假日限额翻倍险
+        this.bd = new DaDiFuelKindInfo();
+        bd.setKindCode("C101371");
+        bd.setKindName("附加法定节假日限额翻倍险");
+        bd.setSelected(true);
+        bd.setAmount("2000000");
+        bd.setUnitAmount("");
+        bd.setQuantity("");
+        bd.setPremium("");
+        bd.setStandardPremium("");
+        bd.setNonDeductiblePremium("");
+        bd.setNonDeductiblePremiumRate("");
+        bd.setNonDeductibleStandardPremium("");
+        bd.setDeductibleRate("");
+        bd.setDeductibleValue("");
+        bd.setBrokenCode("");
+        bd.setRate("");
+
+        // SY_FJ_YBW1 - 医保外用药险(三者)
+        this.syFjYbw1 = new DaDiFuelKindInfo();
+        syFjYbw1.setKindCode("C101361");
+        syFjYbw1.setKindName("医保外用药险(三者)");
+        syFjYbw1.setSelected(false);
+        syFjYbw1.setAmount("100000");
+        syFjYbw1.setUnitAmount("");
+        syFjYbw1.setQuantity("");
+        syFjYbw1.setPremium("");
+        syFjYbw1.setStandardPremium("");
+        syFjYbw1.setNonDeductiblePremium("");
+        syFjYbw1.setNonDeductiblePremiumRate("");
+        syFjYbw1.setNonDeductibleStandardPremium("");
+        syFjYbw1.setDeductibleRate("");
+        syFjYbw1.setDeductibleValue("");
+        syFjYbw1.setBrokenCode("");
+        syFjYbw1.setRate("");
+
+        // SY_FJ_YBW3 - 医保外用药险(司机)
+        this.syFjYbw3 = new DaDiFuelKindInfo();
+        syFjYbw3.setKindCode("C101382");
+        syFjYbw3.setKindName("医保外用药险(司机)");
+        syFjYbw3.setSelected(false);
+        syFjYbw3.setAmount("10000");
+        syFjYbw3.setUnitAmount("");
+        syFjYbw3.setQuantity("");
+        syFjYbw3.setPremium("");
+        syFjYbw3.setStandardPremium("");
+        syFjYbw3.setNonDeductiblePremium("");
+        syFjYbw3.setNonDeductiblePremiumRate("");
+        syFjYbw3.setNonDeductibleStandardPremium("");
+        syFjYbw3.setDeductibleRate("");
+        syFjYbw3.setDeductibleValue("");
+        syFjYbw3.setBrokenCode("");
+        syFjYbw3.setRate("");
+
+        // SY_FJ_YBW2 - 医保外用药险(乘客)
+        this.syFjYbw2 = new DaDiFuelKindInfo();
+        syFjYbw2.setKindCode("C101383");
+        syFjYbw2.setKindName("医保外用药险(乘客)");
+        syFjYbw2.setSelected(true);
+        syFjYbw2.setAmount("600000");
+        syFjYbw2.setUnitAmount("100000");
+        syFjYbw2.setQuantity("6");
+        syFjYbw2.setPremium("");
+        syFjYbw2.setStandardPremium("");
+        syFjYbw2.setNonDeductiblePremium("");
+        syFjYbw2.setNonDeductiblePremiumRate("");
+        syFjYbw2.setNonDeductibleStandardPremium("");
+        syFjYbw2.setDeductibleRate("");
+        syFjYbw2.setDeductibleValue("");
+        syFjYbw2.setBrokenCode("");
+        syFjYbw2.setRate("");
+
+        // TY1 - 附加道路救援服务特约条款
+        this.ty1 = new DaDiFuelKindInfo();
+        ty1.setKindCode("C101372");
+        ty1.setKindName("附加道路救援服务特约条款");
+        ty1.setSelected(false);
+        ty1.setAmount("");
+        ty1.setUnitAmount("");
+        ty1.setQuantity("2");
+        ty1.setPremium("");
+        ty1.setStandardPremium("");
+        ty1.setNonDeductiblePremium("");
+        ty1.setNonDeductiblePremiumRate("");
+        ty1.setNonDeductibleStandardPremium("");
+        ty1.setDeductibleRate("");
+        ty1.setDeductibleValue("");
+        ty1.setBrokenCode("");
+        ty1.setRate("");
+
+        // TY2 - 附加车辆安全检测特约条款
+        this.ty2 = new DaDiFuelKindInfo();
+        ty2.setKindCode("C101373");
+        ty2.setKindName("附加车辆安全检测特约条款");
+        ty2.setSelected(false);
+        ty2.setAmount("");
+        ty2.setUnitAmount("");
+        ty2.setQuantity("1");
+        ty2.setPremium("");
+        ty2.setStandardPremium("");
+        ty2.setNonDeductiblePremium("");
+        ty2.setNonDeductiblePremiumRate("");
+        ty2.setNonDeductibleStandardPremium("");
+        ty2.setDeductibleRate("");
+        ty2.setDeductibleValue("");
+        ty2.setBrokenCode("");
+        ty2.setRate("");
+
+        // TY3 - 附加代为驾驶服务特约条款
+        this.ty3 = new DaDiFuelKindInfo();
+        ty3.setKindCode("C101374");
+        ty3.setKindName("附加代为驾驶服务特约条款");
+        ty3.setSelected(true);
+        ty3.setAmount("");
+        ty3.setUnitAmount("");
+        ty3.setQuantity("1");
+        ty3.setPremium("");
+        ty3.setStandardPremium("");
+        ty3.setNonDeductiblePremium("");
+        ty3.setNonDeductiblePremiumRate("");
+        ty3.setNonDeductibleStandardPremium("");
+        ty3.setDeductibleRate("");
+        ty3.setDeductibleValue("");
+        ty3.setBrokenCode("");
+        ty3.setRate("");
+
+        // TY4 - 附加代为送检服务特约条款
+        this.ty4 = new DaDiFuelKindInfo();
+        ty4.setKindCode("C101375");
+        ty4.setKindName("附加代为送检服务特约条款");
+        ty4.setSelected(false);
+        ty4.setAmount("");
+        ty4.setUnitAmount("");
+        ty4.setQuantity("1");
+        ty4.setPremium("");
+        ty4.setStandardPremium("");
+        ty4.setNonDeductiblePremium("");
+        ty4.setNonDeductiblePremiumRate("");
+        ty4.setNonDeductibleStandardPremium("");
+        ty4.setDeductibleRate("");
+        ty4.setDeductibleValue("");
+        ty4.setBrokenCode("");
+        ty4.setRate("");
+
+        // MJ1 - 免赔率(车损)
+        this.mj1 = new DaDiFuelKindInfo();
+        mj1.setKindCode("C101362");
+        mj1.setKindName("免赔率(车损)");
+        mj1.setSelected(true);
+        mj1.setAmount("");
+        mj1.setUnitAmount("");
+        mj1.setQuantity("");
+        mj1.setPremium("");
+        mj1.setStandardPremium("");
+        mj1.setNonDeductiblePremium("");
+        mj1.setNonDeductiblePremiumRate("");
+        mj1.setNonDeductibleStandardPremium("");
+        mj1.setDeductibleRate("0.05");
+        mj1.setDeductibleValue("0");
+        mj1.setBrokenCode("");
+        mj1.setRate("");
+
+        // MJ2 - 免赔率(三者)
+        this.mj2 = new DaDiFuelKindInfo();
+        mj2.setKindCode("C101363");
+        mj2.setKindName("免赔率(三者)");
+        mj2.setSelected(true);
+        mj2.setAmount("");
+        mj2.setUnitAmount("");
+        mj2.setQuantity("");
+        mj2.setPremium("");
+        mj2.setStandardPremium("");
+        mj2.setNonDeductiblePremium("");
+        mj2.setNonDeductiblePremiumRate("");
+        mj2.setNonDeductibleStandardPremium("");
+        mj2.setDeductibleRate("0.05");
+        mj2.setDeductibleValue("");
+        mj2.setBrokenCode("");
+        mj2.setRate("");
+
+        // MJ3 - 免赔率(司机)
+        this.mj3 = new DaDiFuelKindInfo();
+        mj3.setKindCode("C101364");
+        mj3.setKindName("免赔率(司机)");
+        mj3.setSelected(true);
+        mj3.setAmount("");
+        mj3.setUnitAmount("");
+        mj3.setQuantity("");
+        mj3.setPremium("");
+        mj3.setStandardPremium("");
+        mj3.setNonDeductiblePremium("");
+        mj3.setNonDeductiblePremiumRate("");
+        mj3.setNonDeductibleStandardPremium("");
+        mj3.setDeductibleRate("0.05");
+        mj3.setDeductibleValue("");
+        mj3.setBrokenCode("");
+        mj3.setRate("");
+
+        // MJ4 - 免赔率(乘客)
+        this.mj4 = new DaDiFuelKindInfo();
+        mj4.setKindCode("C101365");
+        mj4.setKindName("免赔率(乘客)");
+        mj4.setSelected(true);
+        mj4.setAmount("");
+        mj4.setUnitAmount("");
+        mj4.setQuantity("");
+        mj4.setPremium("");
+        mj4.setStandardPremium("");
+        mj4.setNonDeductiblePremium("");
+        mj4.setNonDeductiblePremiumRate("");
+        mj4.setNonDeductibleStandardPremium("");
+        mj4.setDeductibleRate("0.05");
+        mj4.setDeductibleValue("");
+        mj4.setBrokenCode("");
+        mj4.setRate("");
+
+        // SY_FJ_YBW4 - 精神损害抚慰金险(三者)
+        this.syFjYbw4 = new DaDiFuelKindInfo();
+        syFjYbw4.setKindCode("C101360");
+        syFjYbw4.setKindName("精神损害抚慰金险(三者)");
+        syFjYbw4.setSelected(true);
+        syFjYbw4.setAmount("10000");
+        syFjYbw4.setUnitAmount("");
+        syFjYbw4.setQuantity("");
+        syFjYbw4.setPremium("");
+        syFjYbw4.setStandardPremium("");
+        syFjYbw4.setNonDeductiblePremium("");
+        syFjYbw4.setNonDeductiblePremiumRate("");
+        syFjYbw4.setNonDeductibleStandardPremium("");
+        syFjYbw4.setDeductibleRate("");
+        syFjYbw4.setDeductibleValue("");
+        syFjYbw4.setBrokenCode("");
+        syFjYbw4.setRate("");
+
+        // SY_FJ_YBW5 - 精神损害抚慰金险(乘客)
+        this.syFjYbw5 = new DaDiFuelKindInfo();
+        syFjYbw5.setKindCode("C101381");
+        syFjYbw5.setKindName("精神损害抚慰金险(乘客)");
+        syFjYbw5.setSelected(true);
+        syFjYbw5.setAmount("40000");
+        syFjYbw5.setUnitAmount("10000");
+        syFjYbw5.setQuantity("4");
+        syFjYbw5.setPremium("");
+        syFjYbw5.setStandardPremium("");
+        syFjYbw5.setNonDeductiblePremium("");
+        syFjYbw5.setNonDeductiblePremiumRate("");
+        syFjYbw5.setNonDeductibleStandardPremium("");
+        syFjYbw5.setDeductibleRate("");
+        syFjYbw5.setDeductibleValue("");
+        syFjYbw5.setBrokenCode("");
+        syFjYbw5.setRate("");
+
+        // SY_FJ_YBW6 - 精神损害抚慰金险(司机)
+        this.syFjYbw6 = new DaDiFuelKindInfo();
+        syFjYbw6.setKindCode("C101380");
+        syFjYbw6.setKindName("精神损害抚慰金险(司机)");
+        syFjYbw6.setSelected(true);
+        syFjYbw6.setAmount("10000");
+        syFjYbw6.setUnitAmount("");
+        syFjYbw6.setQuantity("");
+        syFjYbw6.setPremium("");
+        syFjYbw6.setStandardPremium("");
+        syFjYbw6.setNonDeductiblePremium("");
+        syFjYbw6.setNonDeductiblePremiumRate("");
+        syFjYbw6.setNonDeductibleStandardPremium("");
+        syFjYbw6.setDeductibleRate("");
+        syFjYbw6.setDeductibleValue("");
+        syFjYbw6.setBrokenCode("");
+        syFjYbw6.setRate("");
+    }
+
+    /**
+     * 将实体类转换为Map,key为险种标识,value为险种信息
+     */
+    public Map<String, DaDiFuelKindInfo> toMap() {
+        Map<String, DaDiFuelKindInfo> map = new LinkedHashMap<>();
+        map.put("A", this.a);
+        map.put("B", this.b);
+        map.put("D3", this.d3);
+        map.put("D4", this.d4);
+        map.put("L", this.l);
+        map.put("BD", this.bd);
+        map.put("SY_FJ_YBW1", this.syFjYbw1);
+        map.put("SY_FJ_YBW3", this.syFjYbw3);
+        map.put("SY_FJ_YBW2", this.syFjYbw2);
+        map.put("TY1", this.ty1);
+        map.put("TY2", this.ty2);
+        map.put("TY3", this.ty3);
+        map.put("TY4", this.ty4);
+        map.put("MJ1", this.mj1);
+        map.put("MJ2", this.mj2);
+        map.put("MJ3", this.mj3);
+        map.put("MJ4", this.mj4);
+        map.put("SY_FJ_YBW4", this.syFjYbw4);
+        map.put("SY_FJ_YBW5", this.syFjYbw5);
+        map.put("SY_FJ_YBW6", this.syFjYbw6);
+        return map;
+    }
+
+}

+ 596 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiNewEnergyVehicleInsurance.java

@@ -0,0 +1,596 @@
+package com.jzg.quotation.dadi.crawler.constant.entity;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地车险】 新能源车险 保单信息
+ * @date 2026/5/25 17:25
+ */
+@Data
+public class DaDiNewEnergyVehicleInsurance {
+
+    /**
+     * 新能源汽车损失保险
+     */
+    @SerializedName("A")
+    private DaDiFuelKindInfo a;
+
+    /**
+     * 新能源汽车第三者责任保险
+     */
+    @SerializedName("B")
+    private DaDiFuelKindInfo b;
+
+    /**
+     * 新能源汽车车上人员责任保险(司机)
+     */
+    @SerializedName("D3")
+    private DaDiFuelKindInfo d3;
+
+    /**
+     * 新能源汽车车上人员责任保险(乘客)
+     */
+    @SerializedName("D4")
+    private DaDiFuelKindInfo d4;
+
+    /**
+     * 附加车身划痕损失险
+     */
+    @SerializedName("L")
+    private DaDiFuelKindInfo l;
+
+    /**
+     * 附加法定节假日限额翻倍险
+     */
+    @SerializedName("BD")
+    private DaDiFuelKindInfo bd;
+
+    /**
+     * 医保外用药险(三者)
+     */
+    @SerializedName("SY_FJ_YBW1")
+    private DaDiFuelKindInfo syFjYbw1;
+
+    /**
+     * 医保外用药险(司机)
+     */
+    @SerializedName("SY_FJ_YBW3")
+    private DaDiFuelKindInfo syFjYbw3;
+
+    /**
+     * 医保外用药险(乘客)
+     */
+    @SerializedName("SY_FJ_YBW2")
+    private DaDiFuelKindInfo syFjYbw2;
+
+    /**
+     * 附加道路救援服务特约条款(新能源)
+     */
+    @SerializedName("TY1")
+    private DaDiFuelKindInfo ty1;
+
+    /**
+     * 附加车辆安全检测特约条款(新能源)
+     */
+    @SerializedName("TY2")
+    private DaDiFuelKindInfo ty2;
+
+    /**
+     * 附加代为驾驶服务特约条款(新能源)
+     */
+    @SerializedName("TY3")
+    private DaDiFuelKindInfo ty3;
+
+    /**
+     * 附加代为送检服务特约条款(新能源)
+     */
+    @SerializedName("TY4")
+    private DaDiFuelKindInfo ty4;
+
+    /**
+     * 免赔率(车损)
+     */
+    @SerializedName("MJ1")
+    private DaDiFuelKindInfo mj1;
+
+    /**
+     * 免赔率(三者)
+     */
+    @SerializedName("MJ2")
+    private DaDiFuelKindInfo mj2;
+
+    /**
+     * 免赔率(司机)
+     */
+    @SerializedName("MJ3")
+    private DaDiFuelKindInfo mj3;
+
+    /**
+     * 免赔率(乘客)
+     */
+    @SerializedName("MJ4")
+    private DaDiFuelKindInfo mj4;
+
+    /**
+     * 附加外部电网故障损失险
+     */
+    @SerializedName("SY_WBDWGZ")
+    private DaDiFuelKindInfo syWbdwgz;
+
+    /**
+     * 精神损害抚慰金险(三者)
+     */
+    @SerializedName("SY_FJ_YBW4")
+    private DaDiFuelKindInfo syFjYbw4;
+
+    /**
+     * 精神损害抚慰金险(乘客)
+     */
+    @SerializedName("SY_FJ_YBW5")
+    private DaDiFuelKindInfo syFjYbw5;
+
+    /**
+     * 精神损害抚慰金险(司机)
+     */
+    @SerializedName("SY_FJ_YBW6")
+    private DaDiFuelKindInfo syFjYbw6;
+
+    /**
+     * 默认构造函数,初始化所有新能源车险种默认值
+     */
+    public DaDiNewEnergyVehicleInsurance() {
+        // A - 新能源汽车损失保险
+        this.a = new DaDiFuelKindInfo();
+        a.setKindCode("C101570");
+        a.setKindName("新能源汽车损失保险");
+        a.setKindFlag("");
+        a.setRiskIndex("");
+        a.setSelected(true);
+        a.setAmount("96799.2");
+        a.setUnitAmount("");
+        a.setQuantity("");
+        a.setPremium("");
+        a.setStandardPremium("");
+        a.setNonDeductiblePremium("");
+        a.setNonDeductiblePremiumRate("");
+        a.setNonDeductibleStandardPremium("");
+        a.setDeductibleRate("0");
+        a.setDeductibleValue("0");
+        a.setBrokenCode("");
+        a.setRate("");
+
+        // B - 新能源汽车第三者责任保险
+        this.b = new DaDiFuelKindInfo();
+        b.setKindCode("C101571");
+        b.setKindName("新能源汽车第三者责任保险");
+        b.setKindFlag("");
+        b.setRiskIndex("");
+        b.setSelected(false);
+        b.setAmount("2000000");
+        b.setUnitAmount("");
+        b.setQuantity("");
+        b.setPremium("");
+        b.setStandardPremium("");
+        b.setNonDeductiblePremium("");
+        b.setNonDeductiblePremiumRate("");
+        b.setNonDeductibleStandardPremium("");
+        b.setDeductibleRate("");
+        b.setDeductibleValue("");
+        b.setBrokenCode("");
+        b.setRate("");
+
+        // D3 - 新能源汽车车上人员责任保险(司机)
+        this.d3 = new DaDiFuelKindInfo();
+        d3.setKindCode("C101572");
+        d3.setKindName("新能源汽车车上人员责任保险(司机)");
+        d3.setKindFlag("");
+        d3.setRiskIndex("");
+        d3.setSelected(false);
+        d3.setAmount("10000");
+        d3.setUnitAmount("");
+        d3.setQuantity("");
+        d3.setPremium("");
+        d3.setStandardPremium("");
+        d3.setNonDeductiblePremium("");
+        d3.setNonDeductiblePremiumRate("");
+        d3.setNonDeductibleStandardPremium("");
+        d3.setDeductibleRate("");
+        d3.setDeductibleValue("");
+        d3.setBrokenCode("");
+        d3.setRate("");
+
+        // D4 - 新能源汽车车上人员责任保险(乘客)
+        this.d4 = new DaDiFuelKindInfo();
+        d4.setKindCode("C101573");
+        d4.setKindName("新能源汽车车上人员责任保险(乘客)");
+        d4.setKindFlag("");
+        d4.setRiskIndex("");
+        d4.setSelected(false);
+        d4.setAmount("40000");
+        d4.setUnitAmount("10000");
+        d4.setQuantity("4");
+        d4.setPremium("");
+        d4.setStandardPremium("");
+        d4.setNonDeductiblePremium("");
+        d4.setNonDeductiblePremiumRate("");
+        d4.setNonDeductibleStandardPremium("");
+        d4.setDeductibleRate("");
+        d4.setDeductibleValue("");
+        d4.setBrokenCode("");
+        d4.setRate("");
+
+        // L - 附加车身划痕损失险
+        this.l = new DaDiFuelKindInfo();
+        l.setKindCode("C101369");
+        l.setKindName("附加车身划痕损失险");
+        l.setKindFlag("");
+        l.setRiskIndex("");
+        l.setSelected(true);
+        l.setAmount("2000");
+        l.setUnitAmount("");
+        l.setQuantity("");
+        l.setPremium("");
+        l.setStandardPremium("");
+        l.setNonDeductiblePremium("");
+        l.setNonDeductiblePremiumRate("");
+        l.setNonDeductibleStandardPremium("");
+        l.setDeductibleRate("");
+        l.setDeductibleValue("");
+        l.setBrokenCode("");
+        l.setRate("");
+
+        // BD - 附加法定节假日限额翻倍险
+        this.bd = new DaDiFuelKindInfo();
+        bd.setKindCode("C101371");
+        bd.setKindName("附加法定节假日限额翻倍险");
+        bd.setKindFlag("");
+        bd.setRiskIndex("");
+        bd.setSelected(true);
+        bd.setAmount("2000000");
+        bd.setUnitAmount("");
+        bd.setQuantity("");
+        bd.setPremium("");
+        bd.setStandardPremium("");
+        bd.setNonDeductiblePremium("");
+        bd.setNonDeductiblePremiumRate("");
+        bd.setNonDeductibleStandardPremium("");
+        bd.setDeductibleRate("");
+        bd.setDeductibleValue("");
+        bd.setBrokenCode("");
+        bd.setRate("");
+
+        // SY_FJ_YBW1 - 医保外用药险(三者)
+        this.syFjYbw1 = new DaDiFuelKindInfo();
+        syFjYbw1.setKindCode("C101361");
+        syFjYbw1.setKindName("医保外用药险(三者)");
+        syFjYbw1.setKindFlag("");
+        syFjYbw1.setRiskIndex("");
+        syFjYbw1.setSelected(false);
+        syFjYbw1.setAmount("100000");
+        syFjYbw1.setUnitAmount("");
+        syFjYbw1.setQuantity("");
+        syFjYbw1.setPremium("");
+        syFjYbw1.setStandardPremium("");
+        syFjYbw1.setNonDeductiblePremium("");
+        syFjYbw1.setNonDeductiblePremiumRate("");
+        syFjYbw1.setNonDeductibleStandardPremium("");
+        syFjYbw1.setDeductibleRate("");
+        syFjYbw1.setDeductibleValue("");
+        syFjYbw1.setBrokenCode("");
+        syFjYbw1.setRate("");
+
+        // SY_FJ_YBW3 - 医保外用药险(司机)
+        this.syFjYbw3 = new DaDiFuelKindInfo();
+        syFjYbw3.setKindCode("C101382");
+        syFjYbw3.setKindName("医保外用药险(司机)");
+        syFjYbw3.setKindFlag("");
+        syFjYbw3.setRiskIndex("");
+        syFjYbw3.setSelected(false);
+        syFjYbw3.setAmount("10000");
+        syFjYbw3.setUnitAmount("");
+        syFjYbw3.setQuantity("");
+        syFjYbw3.setPremium("");
+        syFjYbw3.setStandardPremium("");
+        syFjYbw3.setNonDeductiblePremium("");
+        syFjYbw3.setNonDeductiblePremiumRate("");
+        syFjYbw3.setNonDeductibleStandardPremium("");
+        syFjYbw3.setDeductibleRate("");
+        syFjYbw3.setDeductibleValue("");
+        syFjYbw3.setBrokenCode("");
+        syFjYbw3.setRate("");
+
+        // SY_FJ_YBW2 - 医保外用药险(乘客)
+        this.syFjYbw2 = new DaDiFuelKindInfo();
+        syFjYbw2.setKindCode("C101383");
+        syFjYbw2.setKindName("医保外用药险(乘客)");
+        syFjYbw2.setKindFlag("");
+        syFjYbw2.setRiskIndex("");
+        syFjYbw2.setSelected(true);
+        syFjYbw2.setAmount("40000");
+        syFjYbw2.setUnitAmount("10000");
+        syFjYbw2.setQuantity("4");
+        syFjYbw2.setPremium("");
+        syFjYbw2.setStandardPremium("");
+        syFjYbw2.setNonDeductiblePremium("");
+        syFjYbw2.setNonDeductiblePremiumRate("");
+        syFjYbw2.setNonDeductibleStandardPremium("");
+        syFjYbw2.setDeductibleRate("");
+        syFjYbw2.setDeductibleValue("");
+        syFjYbw2.setBrokenCode("");
+        syFjYbw2.setRate("");
+
+        // TY1 - 附加道路救援服务特约条款(新能源)
+        this.ty1 = new DaDiFuelKindInfo();
+        ty1.setKindCode("C101579");
+        ty1.setKindName("附加道路救援服务特约条款(新能源)");
+        ty1.setKindFlag("");
+        ty1.setRiskIndex("");
+        ty1.setSelected(false);
+        ty1.setAmount("");
+        ty1.setUnitAmount("");
+        ty1.setQuantity("2");
+        ty1.setPremium("");
+        ty1.setStandardPremium("");
+        ty1.setNonDeductiblePremium("");
+        ty1.setNonDeductiblePremiumRate("");
+        ty1.setNonDeductibleStandardPremium("");
+        ty1.setDeductibleRate("");
+        ty1.setDeductibleValue("");
+        ty1.setBrokenCode("");
+        ty1.setRate("");
+
+        // TY2 - 附加车辆安全检测特约条款(新能源)
+        this.ty2 = new DaDiFuelKindInfo();
+        ty2.setKindCode("C101580");
+        ty2.setKindName("附加车辆安全检测特约条款(新能源)");
+        ty2.setKindFlag("");
+        ty2.setRiskIndex("");
+        ty2.setSelected(false);
+        ty2.setAmount("");
+        ty2.setUnitAmount("");
+        ty2.setQuantity("1");
+        ty2.setPremium("");
+        ty2.setStandardPremium("");
+        ty2.setNonDeductiblePremium("");
+        ty2.setNonDeductiblePremiumRate("");
+        ty2.setNonDeductibleStandardPremium("");
+        ty2.setDeductibleRate("");
+        ty2.setDeductibleValue("");
+        ty2.setBrokenCode("");
+        ty2.setRate("");
+
+        // TY3 - 附加代为驾驶服务特约条款(新能源)
+        this.ty3 = new DaDiFuelKindInfo();
+        ty3.setKindCode("C101581");
+        ty3.setKindName("附加代为驾驶服务特约条款(新能源)");
+        ty3.setKindFlag("");
+        ty3.setRiskIndex("");
+        ty3.setSelected(true);
+        ty3.setAmount("");
+        ty3.setUnitAmount("");
+        ty3.setQuantity("1");
+        ty3.setPremium("");
+        ty3.setStandardPremium("");
+        ty3.setNonDeductiblePremium("");
+        ty3.setNonDeductiblePremiumRate("");
+        ty3.setNonDeductibleStandardPremium("");
+        ty3.setDeductibleRate("");
+        ty3.setDeductibleValue("");
+        ty3.setBrokenCode("");
+        ty3.setRate("");
+
+        // TY4 - 附加代为送检服务特约条款(新能源)
+        this.ty4 = new DaDiFuelKindInfo();
+        ty4.setKindCode("C101582");
+        ty4.setKindName("附加代为送检服务特约条款(新能源)");
+        ty4.setKindFlag("");
+        ty4.setRiskIndex("");
+        ty4.setSelected(false);
+        ty4.setAmount("");
+        ty4.setUnitAmount("");
+        ty4.setQuantity("1");
+        ty4.setPremium("");
+        ty4.setStandardPremium("");
+        ty4.setNonDeductiblePremium("");
+        ty4.setNonDeductiblePremiumRate("");
+        ty4.setNonDeductibleStandardPremium("");
+        ty4.setDeductibleRate("");
+        ty4.setDeductibleValue("");
+        ty4.setBrokenCode("");
+        ty4.setRate("");
+
+        // MJ1 - 免赔率(车损)
+        this.mj1 = new DaDiFuelKindInfo();
+        mj1.setKindCode("C101362");
+        mj1.setKindName("免赔率(车损)");
+        mj1.setKindFlag("");
+        mj1.setRiskIndex("");
+        mj1.setSelected(true);
+        mj1.setAmount("");
+        mj1.setUnitAmount("");
+        mj1.setQuantity("");
+        mj1.setPremium("");
+        mj1.setStandardPremium("");
+        mj1.setNonDeductiblePremium("");
+        mj1.setNonDeductiblePremiumRate("");
+        mj1.setNonDeductibleStandardPremium("");
+        mj1.setDeductibleRate("0.05");
+        mj1.setDeductibleValue("0");
+        mj1.setBrokenCode("");
+        mj1.setRate("");
+
+        // MJ2 - 免赔率(三者)
+        this.mj2 = new DaDiFuelKindInfo();
+        mj2.setKindCode("C101363");
+        mj2.setKindName("免赔率(三者)");
+        mj2.setKindFlag("");
+        mj2.setRiskIndex("");
+        mj2.setSelected(true);
+        mj2.setAmount("");
+        mj2.setUnitAmount("");
+        mj2.setQuantity("");
+        mj2.setPremium("");
+        mj2.setStandardPremium("");
+        mj2.setNonDeductiblePremium("");
+        mj2.setNonDeductiblePremiumRate("");
+        mj2.setNonDeductibleStandardPremium("");
+        mj2.setDeductibleRate("0.05");
+        mj2.setDeductibleValue("");
+        mj2.setBrokenCode("");
+        mj2.setRate("");
+
+        // MJ3 - 免赔率(司机)
+        this.mj3 = new DaDiFuelKindInfo();
+        mj3.setKindCode("C101364");
+        mj3.setKindName("免赔率(司机)");
+        mj3.setKindFlag("");
+        mj3.setRiskIndex("");
+        mj3.setSelected(true);
+        mj3.setAmount("");
+        mj3.setUnitAmount("");
+        mj3.setQuantity("");
+        mj3.setPremium("");
+        mj3.setStandardPremium("");
+        mj3.setNonDeductiblePremium("");
+        mj3.setNonDeductiblePremiumRate("");
+        mj3.setNonDeductibleStandardPremium("");
+        mj3.setDeductibleRate("0.05");
+        mj3.setDeductibleValue("");
+        mj3.setBrokenCode("");
+        mj3.setRate("");
+
+        // MJ4 - 免赔率(乘客)
+        this.mj4 = new DaDiFuelKindInfo();
+        mj4.setKindCode("C101365");
+        mj4.setKindName("免赔率(乘客)");
+        mj4.setKindFlag("");
+        mj4.setRiskIndex("");
+        mj4.setSelected(true);
+        mj4.setAmount("");
+        mj4.setUnitAmount("");
+        mj4.setQuantity("");
+        mj4.setPremium("");
+        mj4.setStandardPremium("");
+        mj4.setNonDeductiblePremium("");
+        mj4.setNonDeductiblePremiumRate("");
+        mj4.setNonDeductibleStandardPremium("");
+        mj4.setDeductibleRate("0.05");
+        mj4.setDeductibleValue("");
+        mj4.setBrokenCode("");
+        mj4.setRate("");
+
+        // SY_WBDWGZ - 附加外部电网故障损失险
+        this.syWbdwgz = new DaDiFuelKindInfo();
+        syWbdwgz.setKindCode("C101574");
+        syWbdwgz.setKindName("附加外部电网故障损失险");
+        syWbdwgz.setKindFlag("");
+        syWbdwgz.setRiskIndex("");
+        syWbdwgz.setSelected(true);
+        syWbdwgz.setAmount("0");
+        syWbdwgz.setUnitAmount("");
+        syWbdwgz.setQuantity("");
+        syWbdwgz.setPremium("");
+        syWbdwgz.setStandardPremium("");
+        syWbdwgz.setNonDeductiblePremium("");
+        syWbdwgz.setNonDeductiblePremiumRate("");
+        syWbdwgz.setNonDeductibleStandardPremium("");
+        syWbdwgz.setDeductibleRate("");
+        syWbdwgz.setDeductibleValue("");
+        syWbdwgz.setBrokenCode("");
+        syWbdwgz.setRate("");
+
+        // SY_FJ_YBW4 - 精神损害抚慰金险(三者)
+        this.syFjYbw4 = new DaDiFuelKindInfo();
+        syFjYbw4.setKindCode("C101360");
+        syFjYbw4.setKindName("精神损害抚慰金险(三者)");
+        syFjYbw4.setKindFlag("");
+        syFjYbw4.setRiskIndex("");
+        syFjYbw4.setSelected(true);
+        syFjYbw4.setAmount("10000");
+        syFjYbw4.setUnitAmount("");
+        syFjYbw4.setQuantity("");
+        syFjYbw4.setPremium("");
+        syFjYbw4.setStandardPremium("");
+        syFjYbw4.setNonDeductiblePremium("");
+        syFjYbw4.setNonDeductiblePremiumRate("");
+        syFjYbw4.setNonDeductibleStandardPremium("");
+        syFjYbw4.setDeductibleRate("");
+        syFjYbw4.setDeductibleValue("");
+        syFjYbw4.setBrokenCode("");
+        syFjYbw4.setRate("");
+
+        // SY_FJ_YBW5 - 精神损害抚慰金险(乘客)
+        this.syFjYbw5 = new DaDiFuelKindInfo();
+        syFjYbw5.setKindCode("C101381");
+        syFjYbw5.setKindName("精神损害抚慰金险(乘客)");
+        syFjYbw5.setKindFlag("");
+        syFjYbw5.setRiskIndex("");
+        syFjYbw5.setSelected(true);
+        syFjYbw5.setAmount("40000");
+        syFjYbw5.setUnitAmount("10000");
+        syFjYbw5.setQuantity("4");
+        syFjYbw5.setPremium("");
+        syFjYbw5.setStandardPremium("");
+        syFjYbw5.setNonDeductiblePremium("");
+        syFjYbw5.setNonDeductiblePremiumRate("");
+        syFjYbw5.setNonDeductibleStandardPremium("");
+        syFjYbw5.setDeductibleRate("");
+        syFjYbw5.setDeductibleValue("");
+        syFjYbw5.setBrokenCode("");
+        syFjYbw5.setRate("");
+
+        // SY_FJ_YBW6 - 精神损害抚慰金险(司机)
+        this.syFjYbw6 = new DaDiFuelKindInfo();
+        syFjYbw6.setKindCode("C101380");
+        syFjYbw6.setKindName("精神损害抚慰金险(司机)");
+        syFjYbw6.setKindFlag("");
+        syFjYbw6.setRiskIndex("");
+        syFjYbw6.setSelected(true);
+        syFjYbw6.setAmount("10000");
+        syFjYbw6.setUnitAmount("");
+        syFjYbw6.setQuantity("");
+        syFjYbw6.setPremium("");
+        syFjYbw6.setStandardPremium("");
+        syFjYbw6.setNonDeductiblePremium("");
+        syFjYbw6.setNonDeductiblePremiumRate("");
+        syFjYbw6.setNonDeductibleStandardPremium("");
+        syFjYbw6.setDeductibleRate("");
+        syFjYbw6.setDeductibleValue("");
+        syFjYbw6.setBrokenCode("");
+        syFjYbw6.setRate("");
+    }
+
+    /**
+     * 将实体类转换为Map,key为险种标识,value为险种信息
+     */
+    public Map<String, DaDiFuelKindInfo> toMap() {
+        Map<String, DaDiFuelKindInfo> map = new LinkedHashMap<>();
+        map.put("A", this.a);
+        map.put("B", this.b);
+        map.put("D3", this.d3);
+        map.put("D4", this.d4);
+        map.put("L", this.l);
+        map.put("BD", this.bd);
+        map.put("SY_FJ_YBW1", this.syFjYbw1);
+        map.put("SY_FJ_YBW3", this.syFjYbw3);
+        map.put("SY_FJ_YBW2", this.syFjYbw2);
+        map.put("TY1", this.ty1);
+        map.put("TY2", this.ty2);
+        map.put("TY3", this.ty3);
+        map.put("TY4", this.ty4);
+        map.put("MJ1", this.mj1);
+        map.put("MJ2", this.mj2);
+        map.put("MJ3", this.mj3);
+        map.put("MJ4", this.mj4);
+        map.put("SY_FJ_YBW4", this.syFjYbw4);
+        map.put("SY_FJ_YBW5", this.syFjYbw5);
+        map.put("SY_FJ_YBW6", this.syFjYbw6);
+        return map;
+    }
+}

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

@@ -0,0 +1,72 @@
+package com.jzg.quotation.dadi.crawler.constant.enums;
+
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author wks
+ * @version 1.0
+ * @description: 请求链接
+ * @date 2025/11/11 15:09
+ */
+@Getter
+@AllArgsConstructor
+public enum RequestUrl implements CrawlerRequestUrlStandard {
+
+    IDENTIFY_CODE("/csu/user/captcha", "获取验证码"),
+    LOGIN("/csu/user/login", "登录"),
+
+    GET_LOGIN_COM_INFO("/csv/commonAgent/searchAgentList", "获取代理人列表"),
+    GET_AGENCY_AGREEMENT_INFO("/csv/channel/agentQuery", "获取代理协议信息"),
+    QUERY_CAR_MODEL("/csv/vehicleModel/getCarModel", "车型查询"),
+    CHECK_CAR_MODEL("/csv/vehicleModel/checkCarModel", "验证车型"),
+    GET_CAR_PRICE("/csv/vehicle/calculateActualValue", "车价查询"),
+
+    GET_TEMPORARY_ORDER("/csv/vehicle/saveTemporaryOrder", "获取订单号"),
+    GET_JOINT_SALES("/csv/insurance/getJointSales", "获取尊享保障方案"),
+    GET_TAX_CONFIG("/csv/quote/getTaxConfig", "获取税务信息"),
+    GET_SPECIAL_INFORMATION("/csv/engage/getChannelEngages", "获取特约信息"),
+
+    CALCULATION_PREMIUM("/csv/quote/preciseQuotation", "保费计算"),
+    SAVE_INFO("/csv/quote/saveInfo", "保存信息"),
+    CUR_TASK_PROGRESS("/csv/order/getCurTaskProgress", "获取月任务"),
+    INSURED_INFO("/csv/proposal/insuredInfo", "保存人员信息"),
+    SUBMIT_ORDER("/csv/proposal/submitOrder", "提交订单"),
+    SUBMIT_UNDERWRITE("/csv/proposal/submitUnderwrite", "提交核保"),
+    ORDER_INFO("/csv/order/getOrderInfo", "获取订单所有投保单号"),
+
+    QUERY_ORDER_INFO("/csv/order/orderDetailsInquery", "获取订单详情"),
+    QUERY_ORDER_STATUS("/csv/proposal/getStatus", "获取核保退回原因"),
+
+    GET_PAY_NO("/csv/payment/getPayNo", "获取支付号"),
+    GET_ELE_PROPOSAL_QR_CORE("/csv/payment/getPaymentUrl", "获取支付二维码"),
+
+    UPLOAD_IMAGE("/cst/image/imageUpload", "上传影像"),
+    OSS_INIT_PARAM("http://ifimage.ccic-net.com.cn:5211/h5img/app/ImgManager/initParam.cmd", "获取oss图片上传初始化参数"),
+    SAVE_FILE_IDX("http://ifimage.ccic-net.com.cn:5211/h5img/app/ImgManager/saveFileIdx.cmd", "保存上传图片"),
+
+    WRITE_BACK_ADDRESS("/api/grecar/areas/writeBackAddress", "回写地址"),
+    CHECK_NOTICE("/api/grepolicycenter/epolicy/checkNotice", "查询电子投保单"),
+
+
+    TRANS_CODE_ELE_POLICY_NO("/api/grecar/print/transCodeElePolicyNo", "查询下载电子保单的编码"),
+    GET_ELE_POLICY_FOR_GRECAR("/api/grsavecarcore/savecarcore/getElePolicyForGrecar?certiNo=%s&activityplan=jsb&operatorCode=%s&comCode=%s&token=%s", "下载保单"),
+    GET_ELE_POLICY_FLAG_FOR_GRECAR("/api/grsavecarcore/savecarcore/getElePolicyFlagForGrecar?certiNo=%s&activityplan=jsb&operatorCode=%s&comCode=%s&token=%s", "下载电子标志");
+
+
+    private final String uri;
+
+    private final String description;
+
+
+    @Override
+    public String getRequestDescription() {
+        return this.description;
+    }
+
+    @Override
+    public String uri() {
+        return this.uri;
+    }
+}

+ 36 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/po/DaDiCrawlerOrder.java

@@ -0,0 +1,36 @@
+package com.jzg.quotation.dadi.crawler.constant.po;
+
+import lombok.Data;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @description: 大地财险 mongodb中操作数据
+ * @author: Liub
+ * @date:   2026/05/26 17:28
+ **/
+@Data
+@Document("dadi.crawler.order")
+public class DaDiCrawlerOrder {
+    @Id
+    private String id;
+    /**
+     * 交互唯一订单 OrderBase类的ordersNo
+     */
+    private String ordersNo;
+
+    /**
+     * 大地订单号
+     */
+    private String plyappno;
+
+    /**
+     * 大地交强投保单号
+     */
+    private String ciProposalNo;
+
+    /**
+     * 大地商业投保单号
+     */
+    private String biProposalNo;
+}

+ 39 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/DaDiCrawlerConfigureParameters.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.dadi.crawler.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 直连 配置信息
+ * @date 2026/5/21 14:50
+ */
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DaDiCrawlerConfigureParameters implements ConfigureParameters {
+
+    @Serial
+    private static final long serialVersionUID = -7015043171384687216L;
+
+    /**
+     * 协议名称
+     */
+    private String agreementName;
+
+    /**
+     * 代理人名称
+     */
+    private String agentName;
+
+    /**
+     * 代理/经纪/渠道代码
+     */
+    private String shadowAgent;
+
+}

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

@@ -0,0 +1,56 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/22 16:59
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DaDiAgencyAgreementInfoRequest extends DaDiBaseRequest {
+
+    /**
+     * 请求类型,默认01
+     */
+    private String requestType;
+
+    /**
+     * 险种代码
+     */
+    private String riskCode;
+
+    /**
+     * 业务来源
+     */
+    private String businessSource;
+
+    /**
+     * 代理人代码
+     */
+    private String agentCode;
+
+    /**
+     * 协议号,默认空
+     */
+    private String agreementNo;
+
+    /**
+     * 协议名称,默认空
+     */
+    private String agreementName;
+
+    public DaDiAgencyAgreementInfoRequest(String comCode,  String riskCode, String businessSource, String agentCode, String userCode) {
+        this.comCode = comCode;
+        this.requestType = "01";
+        this.riskCode = riskCode;
+        this.businessSource = businessSource;
+        this.agentCode = agentCode;
+        this.agreementNo = "";
+        this.agreementName = "";
+        this.userCode = userCode;
+    }
+}

+ 20 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiAgentListRequest.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/22 15:46
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DaDiAgentListRequest extends DaDiBaseRequest {
+
+    public DaDiAgentListRequest(String comCode, String userCode) {
+        this.comCode = comCode;
+        this.userCode = userCode;
+    }
+}

+ 569 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiApplicantInfoRequest.java

@@ -0,0 +1,569 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 投保人信息请求
+ * @date 2026/5/23 15:50
+ */
+@Data
+@NoArgsConstructor
+public class DaDiApplicantInfoRequest {
+
+    // ==================== 基本信息 ====================
+
+    /**
+     * 客户类型
+     */
+    private String custType;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 性别(1-男 2-女)
+     */
+    private String gender;
+
+    /**
+     * 性别(sex字段,1-男 2-女)
+     */
+    private String sex;
+
+    /**
+     * 出生日期
+     */
+    private String birthday;
+
+    /**
+     * 出生日期(birthDate字段)
+     */
+    private String birthDate;
+
+    /**
+     * 投保人与车辆关系标识(1-所有 2-使用 3-管理)
+     */
+    private String relationFlag;
+
+    /**
+     * 车辆关系
+     */
+    private String vehicleRelation;
+
+    /**
+     * 投保人与被保险人关系
+     */
+    private String applicantInsuredRelation;
+
+    /**
+     * 国籍
+     */
+    private String nationality;
+
+    /**
+     * 民族
+     */
+    private String nation;
+
+    /**
+     * 职业
+     */
+    private String occupation;
+
+    /**
+     * 专业
+     */
+    private String profession;
+
+    /**
+     * 单位职业名称
+     */
+    private String unitOccupationName;
+
+    /**
+     * 被保人性质
+     */
+    private String insuredNature;
+
+    /**
+     * 性质
+     */
+    private String nature;
+
+    /**
+     * 是否手机号持有人
+     */
+    private String isPhoneHolder;
+
+    /**
+     * ID
+     */
+    private String id;
+
+    /**
+     * 车辆ID
+     */
+    private String vehicleId;
+
+    /**
+     * 订单号
+     */
+    private String orderId;
+
+    // ==================== 地址与联系信息 ====================
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 地区编码
+     */
+    private String areaCode;
+
+    /**
+     * 地区详情
+     */
+    private String areaDetail;
+
+    /**
+     * 地区名称
+     */
+    private String regionName;
+
+    /**
+     * 地区编码(regionCode字段)
+     */
+    private String regionCode;
+
+    /**
+     * 省份编码
+     */
+    private String provinceCode;
+
+    /**
+     * 地市编码
+     */
+    private String prefectureCode;
+
+    /**
+     * 区县编码
+     */
+    private String countyCode;
+
+    /**
+     * 邮编
+     */
+    private String postCode;
+
+    /**
+     * 手机号(phone字段)
+     */
+    private String phone;
+
+    /**
+     * 手机号(phoneNo字段)
+     */
+    private String phoneNo;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号持有人身份证
+     */
+    private String phoneHolderIdNo;
+
+    /**
+     * 手机号持有人姓名
+     */
+    private String phoneHolderName;
+
+    // ==================== 证件信息 ====================
+
+    /**
+     * 证件号码
+     */
+    private String identityNo;
+
+    /**
+     * 证件类型
+     */
+    private String identityType;
+
+    /**
+     * 证件有效期起始日
+     */
+    private String identifyStartDate;
+
+    /**
+     * 证件有效期截至日
+     */
+    private String identifyEndDate;
+
+    /**
+     * 证件长期有效标识(1-长期有效 0-非长期)
+     */
+    private String identifyLongTerm;
+
+    /**
+     * 证件比对标识
+     */
+    private String identifyCom;
+
+    /**
+     * 个人身份信息采集验证码
+     */
+    private String indiIdGatherCaptcha;
+
+    // ==================== 代理人信息 ====================
+
+    /**
+     * 代理人类型
+     */
+    private String agentType;
+
+    /**
+     * 代理人姓名
+     */
+    private String agentName;
+
+    /**
+     * 代理人证件类型
+     */
+    private String agentIdentityType;
+
+    /**
+     * 代理人证件号码
+     */
+    private String agentIdentityNo;
+
+    /**
+     * 代理人证件有效期截至日
+     */
+    private String agentIdentifyEndDate;
+
+    /**
+     * 代理人证件长期有效标识
+     */
+    private String agentIdentifyLongTerm;
+
+    /**
+     * 代理人证件核验
+     */
+    private String agentIdentityCheck;
+
+    /**
+     * 代理人手机号
+     */
+    private String agentPhone;
+
+    /**
+     * 代理人流程核验
+     */
+    private String agentProcessCheck;
+
+    /**
+     * 客户代理人证件类型
+     */
+    private String customerAgentCertificateType;
+
+    /**
+     * 客户代理人证件号码
+     */
+    private String customerAgentCertificateNum;
+
+    /**
+     * 客户代理人姓名
+     */
+    private String customerAgentName;
+
+    // ==================== 付款人信息 ====================
+
+    /**
+     * 付款人账户名
+     */
+    private String payerAccountName;
+
+    /**
+     * 付款人与投保人关系
+     */
+    private String payerApplicantRelation;
+
+    /**
+     * 付款人与投保人关系备注
+     */
+    private String payerApplicantRelRemark;
+
+    // ==================== 关联人信息 ====================
+
+    /**
+     * 关联人编码
+     */
+    private String relationPeopleCode;
+
+    /**
+     * 关联人类型
+     */
+    private String relationPeopleType;
+
+    // ==================== 法人信息 ====================
+
+    /**
+     * 法人代表
+     */
+    private String legalReprese;
+
+    /**
+     * 法人代表证件类型
+     */
+    private String legalRepreseType;
+
+    /**
+     * 法人代表证件号码
+     */
+    private String legalRepreseNo;
+
+    /**
+     * 法人代表证件有效期截至日
+     */
+    private String legalRepreseED;
+
+    /**
+     * 法人代表证件长期有效标识
+     */
+    private String legalIdentifyLongTerm;
+
+    // ==================== 控股人信息 ====================
+
+    /**
+     * 控股人
+     */
+    private String controlHolder;
+
+    /**
+     * 控股人证件类型
+     */
+    private String controlHolderType;
+
+    /**
+     * 控股人证件号码
+     */
+    private String controlHolderNo;
+
+    /**
+     * 控股人证件有效期截至日
+     */
+    private String controlHolderED;
+
+    /**
+     * 控股人证件长期有效标识
+     */
+    private String controlIdentifyLongTerm;
+
+    // ==================== 授权人信息 ====================
+
+    /**
+     * 授权人
+     */
+    private String authorization;
+
+    /**
+     * 授权人证件类型
+     */
+    private String authorizationType;
+
+    /**
+     * 授权人证件号码
+     */
+    private String authorizationNo;
+
+    /**
+     * 授权人证件有效期截至日
+     */
+    private String authorizationED;
+
+    /**
+     * 授权人证件长期有效标识
+     */
+    private String authorIdentifyLongTerm;
+
+    // ==================== 单位信息 ====================
+
+    /**
+     * 单位类型
+     */
+    private String unitType;
+
+    /**
+     * 单位性质
+     */
+    private String unitNature;
+
+    /**
+     * 组织机构类型编码
+     */
+    private String orgCompanyTypeCode;
+
+    /**
+     * 纳税登记号
+     */
+    private String taxRegistryNo;
+
+    /**
+     * 经营范围
+     */
+    private String businessRange;
+
+    /**
+     * 股东类型
+     */
+    private String shareholderType;
+
+    // ==================== 国民经济分类 ====================
+
+    /**
+     * 国民经济一级分类
+     */
+    private String nationalEconomyL1Cate;
+
+    /**
+     * 国民经济二级分类
+     */
+    private String nationalEconomyL2Cate;
+
+    /**
+     * 国民经济三级分类
+     */
+    private String nationalEconomyL3Cate;
+
+    /**
+     * 国民经济分类名称
+     */
+    private String nationalEconomyCateName;
+
+    public DaDiApplicantInfoRequest(CustomerInfoVo info) {
+
+        // === 基本信息 ===
+        this.custType = "01";
+        this.name = info.getName();
+        this.age = info.getAge();
+        this.gender = "女".equals(info.getGender()) ? "2" : "1";
+        this.sex = this.gender;
+        this.birthday = info.getBirthday() != null ? info.getBirthday() + " 00:00:00" : "";
+        this.birthDate = info.getBirthday();
+        this.relationFlag = "";
+        this.vehicleRelation = "";
+        this.applicantInsuredRelation = "";
+        this.nationality = "CHN";
+        this.nation = "";
+        this.occupation = "";
+        this.profession = "";
+        this.unitOccupationName = "";
+        this.insuredNature = "";
+        this.nature = "";
+        this.isPhoneHolder = "";
+        this.id = "";
+        this.vehicleId = "";
+        this.orderId = "";
+
+        // === 地址与联系信息 ===
+        this.address = info.getAddr();
+        this.areaCode = info.getCityCode();
+        this.areaDetail = info.getCity();
+        this.regionName = "";
+        this.regionCode = "";
+        this.provinceCode = info.getProvinceCode();
+        this.prefectureCode = info.getCountyCode();
+        this.countyCode = info.getCountyCode();
+        this.postCode = info.getPostCode();
+        this.phone = info.getMobile();
+        this.phoneNo = info.getMobile();
+        this.email = info.getEmail() != null ? info.getEmail() : "";
+        this.phoneHolderIdNo = "";
+        this.phoneHolderName = "";
+
+        // === 证件信息 ===
+        this.identityNo = info.getIdentifyNumber();
+        this.identityType = "111";
+        this.identifyStartDate = info.getIdentifyValidDate();
+        this.identifyEndDate = info.getIdentifyValidEndDate();
+        this.identifyLongTerm = StringUtils.hasLength(info.getIdentifyValidEndDate())
+                && info.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+        this.identifyCom = "";
+        this.indiIdGatherCaptcha = "";
+
+        // === 代理人信息 ===
+        this.agentType = "";
+        this.agentName = "";
+        this.agentIdentityType = "";
+        this.agentIdentityNo = "";
+        this.agentIdentifyEndDate = "";
+        this.agentIdentifyLongTerm = "";
+        this.agentIdentityCheck = "";
+        this.agentPhone = "";
+        this.agentProcessCheck = "";
+        this.customerAgentCertificateType = "";
+        this.customerAgentCertificateNum = "";
+        this.customerAgentName = "";
+
+        // === 付款人信息 ===
+        this.payerAccountName = "";
+        this.payerApplicantRelation = "";
+        this.payerApplicantRelRemark = "";
+
+        // === 关联人信息 ===
+        this.relationPeopleCode = "";
+        this.relationPeopleType = "";
+
+        // === 法人信息 ===
+        this.legalReprese = "";
+        this.legalRepreseType = "";
+        this.legalRepreseNo = "";
+        this.legalRepreseED = "";
+        this.legalIdentifyLongTerm = "";
+
+        // === 控股人信息 ===
+        this.controlHolder = "";
+        this.controlHolderType = "";
+        this.controlHolderNo = "";
+        this.controlHolderED = "";
+        this.controlIdentifyLongTerm = "";
+
+        // === 授权人信息 ===
+        this.authorization = "";
+        this.authorizationType = "111";
+        this.authorizationNo = "";
+        this.authorizationED = "";
+        this.authorIdentifyLongTerm = "0";
+
+        // === 单位信息 ===
+        this.unitType = "";
+        this.unitNature = "";
+        this.orgCompanyTypeCode = "";
+        this.taxRegistryNo = "";
+        this.businessRange = "";
+        this.shareholderType = "";
+
+        // === 国民经济分类 ===
+        this.nationalEconomyL1Cate = "";
+        this.nationalEconomyL2Cate = "";
+        this.nationalEconomyL3Cate = "";
+        this.nationalEconomyCateName = "";
+    }
+}

+ 33 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiBaseRequest.java

@@ -0,0 +1,33 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/22 09:49
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DaDiBaseRequest implements Serializable {
+    /**
+     * 公司代码
+     */
+    public String comCode;
+
+    /**
+     * 用户代码
+     */
+    public String userCode;
+
+    /**
+     * 代理人代码
+     */
+    public String agentCode;
+}

+ 75 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiCrawlerAuthenticateRequest.java

@@ -0,0 +1,75 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】登录认证请求体
+ * @date 2026/5/22 09:49
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DaDiCrawlerAuthenticateRequest extends DaDiBaseRequest {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 登录标识
+     */
+    private String loginFlag;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 系统类型
+     */
+    private String system;
+
+    /**
+     * 终端类型
+     */
+    private String terminalType;
+
+    /**
+     * 版本号
+     */
+    private String version;
+
+    /**
+     * 身份证号
+     */
+    private String sinNo;
+
+    /**
+     * 验证码
+     */
+    private String captcha;
+
+    /**
+     * 随机数
+     */
+    private String randomNum;
+
+    public DaDiCrawlerAuthenticateRequest(String password,  String userCode, String captcha, String randomNum) {
+        this.loginFlag = "2";
+        this.mobile = "";
+        this.password = password;
+        this.system =  "0";
+        this.terminalType = "ios_h5";
+        this.userCode = userCode;
+        this.version = "";
+        this.sinNo = "";
+        this.captcha = captcha;
+        this.randomNum = randomNum;
+    }
+}

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

@@ -0,0 +1,21 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 11:01
+ */
+@Data
+@NoArgsConstructor
+public class DaDiEleProposalQRCoreDataRequest extends DaDiOrderInfoRequest {
+
+    public DaDiEleProposalQRCoreDataRequest(String orderId, String comCode, String userCode) {
+        this.orderId = orderId;
+        this.comCode = comCode;
+        this.userCode = userCode;
+    }
+}

+ 662 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java

@@ -0,0 +1,662 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
+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.quotation.dadi.crawler.constant.entity.DaDiFuelKindInfo;
+import com.jzg.quotation.dadi.crawler.constant.entity.DaDiFuelVehicleInsurance;
+import com.jzg.quotation.dadi.crawler.constant.entity.DaDiNewEnergyVehicleInsurance;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiJointSalesResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiSpecialInformationResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiTaxConfigResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 保单信息构造
+ * @date 2026/5/25 16:52
+ */
+@Data
+@NoArgsConstructor
+public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
+
+    /**
+     * 报价标识
+     */
+    private String quoteFlag;
+
+    /**
+     * 是否投商业险
+     */
+    private String businessChecked;
+
+    /**
+     * 商业险税前保费
+     */
+    private String businessBeforeVatPremium;
+
+    /**
+     * 商业险实缴保费
+     */
+    private String businessDuePremium;
+
+    /**
+     * 商业险保费
+     */
+    private String businessPremium;
+
+    /**
+     * 商业险标准保费
+     */
+    private String businessStdPremium;
+
+    /**
+     * 商业险总保额
+     */
+    private String businessSumInsured;
+
+    /**
+     * 商业险生效结束日期
+     */
+    private String businessEffectiveEndDate;
+
+    /**
+     * 商业险生效开始日期
+     */
+    private String businessEffectiveStartDate;
+
+    /**
+     * 商业险是否即时生效
+     */
+    private String businessIsEffective;
+
+    /**
+     * 商业险期望折扣
+     */
+    private String businessExpectDiscount;
+
+    /**
+     * 商业险期望保费
+     */
+    private String businessExpectPremium;
+
+    /**
+     * 联动金额
+     */
+    private String linkageAmount;
+
+    /**
+     * 联动保费余额
+     */
+    private String linkagePremiumBalance;
+
+    /**
+     * 最小分摊比例
+     */
+    private String minSharedRate;
+
+    /**
+     * 最大分摊比例
+     */
+    private String maxSharedRate;
+
+    /**
+     * 最小分摊保费
+     */
+    private String minSharedPremium;
+
+    /**
+     * 最大分摊保费
+     */
+    private String maxSharedPremium;
+
+    /**
+     * 商业险险种列表
+     */
+    private List<DaDiFuelKindInfo> businessRisks;
+
+    /**
+     * 非浮动原因编码
+     */
+    private String nonFloatReasonCode;
+
+    /**
+     * 商业险违章系数
+     */
+    private String businessViolationRate;
+
+    /**
+     * 保险年限
+     */
+    private String insureYears;
+
+    /**
+     * 出险次数
+     */
+    private String claimTimes;
+
+    /**
+     * 商业险NCD系数
+     */
+    private String businessNcdRate;
+
+    /**
+     * 商业险NCD等级
+     */
+    private String businessNcdLevel;
+
+    /**
+     * 商业险总浮动系数
+     */
+    private String businessTotalFloat;
+
+    /**
+     * 新增设备列表
+     */
+    private List<Object> newDevices;
+
+    /**
+     * 是否投交强险
+     */
+    private String trafficChecked;
+
+    /**
+     * 交强险生效结束日期
+     */
+    private String trafficEffectiveEndDate;
+
+    /**
+     * 交强险生效开始日期
+     */
+    private String trafficEffectiveStartDate;
+
+    /**
+     * 交强险是否即时生效
+     */
+    private String trafficIsEffective;
+
+    /**
+     * 交强险税前保费
+     */
+    private String trafficBeforeVatPremium;
+
+    /**
+     * 交强险实缴保费
+     */
+    private String trafficDuePremium;
+
+    /**
+     * 交强险标准保费
+     */
+    private String trafficStdPremium;
+
+    /**
+     * 交强险总保额
+     */
+    private Integer trafficSumInsured;
+
+    /**
+     * 交强险保费
+     */
+    private String trafficPremium;
+
+    /**
+     * 交强险事故情况
+     */
+    private String trafficAccidentSituation;
+
+    /**
+     * 交强险违章系数
+     */
+    private String trafficViolationRate;
+
+    /**
+     * 交强险NCD系数
+     */
+    private String trafficNcdRate;
+
+    /**
+     * 交强险总浮动系数
+     */
+    private String trafficTotalFloat;
+
+    /**
+     * 车船税信息
+     */
+    private Tax tax;
+
+    /**
+     * 交强险退车船税信息
+     */
+    private String trafficReturnCarTaxMessage;
+
+    /**
+     * 计划编码
+     */
+    private String planCode;
+
+    /**
+     * 计划名称
+     */
+    private String planName;
+
+    /**
+     * 是否投尊享保障方案
+     */
+    private String wealthAccChecked;
+
+    /**
+     * 尊享保障座位数
+     */
+    private String wealthAccSeatCount;
+
+    /**
+     * 意外险投保信息(可为空)
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsure;
+
+    /**
+     * 健康险投保信息(可为空)
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsure;
+
+    /**
+     * 财产险投保信息(可为空)
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsure;
+
+    /**
+     * 总保费
+     */
+    private String totalPremium;
+
+    /**
+     * 意外险方案
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsurance;
+
+    /**
+     * 健康险方案
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsurance;
+
+    /**
+     * 财产险方案
+     */
+    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsurance;
+
+    /**
+     * 再保险项
+     */
+    private List<Object> reInsureItem;
+
+    /*
+     * 特约
+     */
+    private List<DaDiSpecialInformationResponse.EngagesDTO> engageList;
+
+    /**
+     * 车船税信息
+     */
+    @Data
+    @NoArgsConstructor
+    public static class Tax {
+        /**
+         * 调整比率
+         */
+        private String adjustRate;
+
+        /**
+         * 调整税额
+         */
+        private String adjustTaxValue;
+
+        /**
+         * 减免原因代码
+         */
+        private String deductiondueCode;
+
+        /**
+         * 减免原因类型
+         */
+        private String deductiondueType;
+
+        /**
+         * 扩展信息
+         */
+        private Object ext;
+
+        /**
+         * 合计实缴
+         */
+        private String sumPayment;
+
+        /**
+         * 完税凭证号
+         */
+        private String taxCertificateNo;
+
+        /**
+         * 税务机关
+         */
+        private String taxDepartment;
+
+        /**
+         * 完税凭证日期
+         */
+        private String taxDocumentDate;
+
+        /**
+         * 纳税标志
+         */
+        private String taxFlag;
+
+        /**
+         * 纳税地区代码
+         */
+        private String taxPaidareaCode;
+
+        /**
+         * 纳税人名称
+         */
+        private String taxpayerName;
+
+        /**
+         * 纳税人证件号
+         */
+        private String taxpayerNo;
+    }
+
+    public DaDiInsurancePlanRequest(QuoteVo quoteVo, DaDiTaxConfigResponse taxConfig,
+                                    DaDiVehicleModelRequest carModelRequest,
+                                    DaDiFuelVehicleInsurance daDiFuelVehicleInsurance,
+                                    DaDiNewEnergyVehicleInsurance daDiNewEnergyVehicleInsurance,
+                                    DaDiSpecialInformationResponse specialInformation,
+                                    DaDiJointSalesResponse jointSales) {
+        // 基础字段
+        this.quoteFlag = "1";
+        this.planCode = "s";
+        this.insureYears = "1";
+        this.claimTimes = "0";
+
+        // 商业险信息
+        RiskInfoVo biRisk = quoteVo.getBiRiskInfoVo();
+        if (biRisk != null) {
+            this.businessChecked = "1";
+            this.businessEffectiveStartDate = biRisk.getStartDate();
+            this.businessEffectiveEndDate = biRisk.getEndDate();
+            this.businessIsEffective = biRisk.isInstantFlag() ? "1" : "0";
+        } else {
+            this.businessChecked = "0";
+            this.businessIsEffective = "0";
+        }
+
+        // 商业险险种列表
+        if (quoteVo.getKindInfoVo() != null && !quoteVo.getKindInfoVo().isEmpty()) {
+            List<DaDiFuelKindInfo> daDiFuelKindInfo = new ArrayList<>();
+            String actualValue = carModelRequest.getActualValue();
+            String priceCoefficient = "1.0";
+            int seatCount = Integer.parseInt(carModelRequest.getSeatCount());
+
+            boolean isNewEnergy = "DEN".equals(carModelRequest.getSyriskCode());
+            Map<String, DaDiFuelKindInfo> insuranceMap = isNewEnergy
+                    ? daDiNewEnergyVehicleInsurance.toMap()
+                    : daDiFuelVehicleInsurance.toMap();
+
+            for (KindInfoVo kindInfoVo : quoteVo.getKindInfoVo()) {
+                String mKindCode = kindInfoVo.getKindCode();
+                DaDiFuelKindInfo target = insuranceMap.get(mKindCode);
+                if (target != null) {
+                    applyNewEnergySpecialProcessing(target, kindInfoVo, actualValue, priceCoefficient, seatCount);
+                    daDiFuelKindInfo.add(target);
+                }
+            }
+            this.businessRisks = daDiFuelKindInfo;
+        }
+
+        // 交强险信息
+        RiskInfoVo ciRisk = quoteVo.getCiRiskInfoVo();
+        if (ciRisk != null) {
+            this.trafficChecked = "1";
+            this.trafficEffectiveStartDate = ciRisk.getStartDate();
+            this.trafficEffectiveEndDate = ciRisk.getEndDate();
+            this.trafficIsEffective = ciRisk.isInstantFlag() ? "1" : "0";
+            this.trafficSumInsured = 200000;
+            if (ciRisk.getRiskCode().contains("B") || ciRisk.getRiskCode().contains("D3")) {
+                for (DaDiSpecialInformationResponse.EngagesDTO item : specialInformation.getBizEngages()) {
+                    if (item.getSpecialAgreementCode().equals("A00184")) {
+                        item.setSelected("1");
+                        item.setServiceItems(new ArrayList<>());
+                        item.setSpecialAgreementContent(item.getSpecialContent());
+                        this.engageList = Collections.singletonList(item);
+                    }
+                }
+            }
+        } else {
+            this.trafficChecked = "0";
+            this.trafficIsEffective = "0";
+        }
+
+        final Tax tax = getTax(quoteVo, taxConfig);
+        this.tax = tax;
+
+        // 尊享保障方案(非车险/驾意险)
+        List<AccidentalDrivingVo> accidentalDrivings = quoteVo.getAccidentalDrivings();
+        if (accidentalDrivings != null && !accidentalDrivings.isEmpty()) {
+            this.wealthAccChecked = "1";
+            if (quoteVo.getCarInfoVo() != null) {
+                this.wealthAccSeatCount = quoteVo.getCarInfoVo().getSeatCount();
+            }
+
+            DaDiJointSalesResponse.InsuranceDTO insuranceListDTO;
+            // 按产品分类拆分到意外险/健康险/财产险
+            List<DaDiJointSalesResponse.InsuranceDTO> accidentList = new ArrayList<>();
+            List<DaDiJointSalesResponse.InsuranceDTO> healthList = new ArrayList<>();
+            List<DaDiJointSalesResponse.InsuranceDTO> propertyList = new ArrayList<>();
+
+
+            for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
+                for (Map.Entry<String, List<DaDiJointSalesResponse.InsuranceDTO>> stringListEntry : jointSales.toMap().entrySet()) {
+                    for (DaDiJointSalesResponse.InsuranceDTO insuranceDTO : stringListEntry.getValue()) {
+                        if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
+                            if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
+                                insuranceListDTO = insuranceDTO;
+                                insuranceListDTO.setFormulaGroupCode(insuranceDTO.getFormulaGroupCode());
+                                insuranceListDTO.setFormulaGroupName(insuranceDTO.getFormulaGroupName());
+                                insuranceListDTO.setIsNingdeEraVehicleBatteryCheck(insuranceDTO.getIsNingdeEraVehicleBatteryCheck());
+                                if (stringListEntry.getKey().equals("accidentInsurance")) {
+                                    accidentList.add(insuranceListDTO);
+                                } else if (stringListEntry.getKey().equals("healthInsurance")) {
+                                    healthList.add(insuranceListDTO);
+                                } else if (stringListEntry.getKey().equals("propertyInsurance")) {
+                                    propertyList.add(insuranceListDTO);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            this.accidentInsurance = accidentList;
+            this.healthInsurance = healthList;
+            this.propertyInsurance = propertyList;
+            this.accidentInsure = accidentList.isEmpty() ? null : accidentList;
+            this.healthInsure = healthList.isEmpty() ? null : healthList;
+            this.propertyInsure = propertyList.isEmpty() ? null : propertyList;
+        } else {
+            this.wealthAccChecked = "0";
+            this.accidentInsurance = new ArrayList<>();
+            this.healthInsurance = new ArrayList<>();
+            this.propertyInsurance = new ArrayList<>();
+        }
+    }
+
+    /**
+     * 新能源车险特殊处理:根据平台险种编码,将源KindInfoVo的字段映射到目标DaDiFuelKindInfo
+     */
+    private void applyNewEnergySpecialProcessing(DaDiFuelKindInfo target, KindInfoVo source,
+                                                 String actualValue, String priceCoefficient, int seatCount) {
+        String platformKindCode = source.getKindCode();
+
+        switch (platformKindCode) {
+            case "A":
+                // 车损险:保额 = 车辆真实价值 × 价格系数
+                double value = Double.parseDouble(actualValue) * Double.parseDouble(priceCoefficient);
+                target.setAmount(String.format("%.2f", value));
+                break;
+
+            case "B":
+                // 第三者责任保险:直接取保额
+                target.setAmount(source.getAmount());
+                break;
+
+            case "D3":
+                // 车上人员责任保险(司机):保额转整数
+                target.setAmount(String.valueOf(Integer.parseInt(source.getAmount())));
+                break;
+
+            case "D4":
+                // 车上人员责任保险(乘客):单人金额 × (座位数-1)
+                int d4UnitAmount = Integer.parseInt(source.getAmount());
+                int d4Quantity = seatCount - 1;
+                target.setUnitAmount(String.valueOf(d4UnitAmount));
+                target.setQuantity(String.valueOf(d4Quantity));
+                target.setAmount(String.valueOf(d4UnitAmount * d4Quantity));
+                break;
+
+            case "L":
+                // 附加车身划痕损失险:直接取保额
+                target.setAmount(source.getAmount());
+                break;
+
+            case "BD":
+                // 附加法定节假日限额翻倍险:无需额外处理
+                break;
+
+            case "SY_FJ_YBW1":
+                // 附加医保外医疗费用责任险(三者)
+                target.setAmount(source.getAmount());
+                break;
+
+            case "SY_FJ_YBW3":
+                // 附加医保外医疗费用责任险(司机)
+                target.setAmount(source.getAmount());
+                break;
+
+            case "SY_FJ_YBW2":
+                // 附加医保外医疗费用责任险(乘客):单人金额 × (座位数-1)
+                int ybw2UnitAmount = Integer.parseInt(source.getAmount());
+                int ybw2Quantity = seatCount - 1;
+                target.setUnitAmount(source.getAmount());
+                target.setQuantity(String.valueOf(ybw2Quantity));
+                target.setAmount(String.valueOf(ybw2UnitAmount * ybw2Quantity));
+                break;
+
+            case "TY1":
+                // 附加道路救援服务特约条款
+                target.setQuantity(String.valueOf(Integer.parseInt(source.getServiceTimes())));
+                break;
+
+            case "TY2":
+                // 附加车辆安全检测特约条款
+                target.setQuantity(String.valueOf(Integer.parseInt(source.getServiceTimes())));
+                break;
+
+            case "TY3":
+                // 附加代为驾驶服务特约条款
+                target.setQuantity(String.valueOf(Integer.parseInt(source.getServiceTimes())));
+                break;
+
+            case "TY4":
+                // 附加代为送检服务特约条款
+                target.setQuantity(String.valueOf(Integer.parseInt(source.getServiceTimes())));
+                break;
+
+            case "MJ1":
+                // 附加绝对免赔率特约条款(车损险)
+                setDeductibleRateFromSource(target, source);
+                break;
+
+            case "MJ2":
+                // 附加绝对免赔率特约条款(三者)
+                setDeductibleRateFromSource(target, source);
+                break;
+
+            case "MJ3":
+                // 附加绝对免赔率特约条款(司机)
+                setDeductibleRateFromSource(target, source);
+                break;
+
+            case "MJ4":
+                // 附加绝对免赔率特约条款(乘客)
+                setDeductibleRateFromSource(target, source);
+                break;
+
+            case "SY_WBDWGZ":
+                // 附加外部电网故障损失险
+                target.setAmount(source.getAmount());
+                break;
+
+            case "SY_FJ_YBW4":
+                // 精神损害抚慰金险(三者)
+                target.setAmount(source.getAmount());
+                break;
+
+            case "SY_FJ_YBW5":
+                // 精神损害抚慰金险(乘客):单人金额 × (座位数-1)
+                int ybw5UnitAmount = Integer.parseInt(source.getAmount());
+                int ybw5Quantity = seatCount - 1;
+                target.setUnitAmount(source.getAmount());
+                target.setQuantity(String.valueOf(ybw5Quantity));
+                target.setAmount(String.valueOf(ybw5UnitAmount * ybw5Quantity));
+                break;
+
+            case "SY_FJ_YBW6":
+                // 精神损害抚慰金险(司机)
+                target.setAmount(source.getAmount());
+                break;
+
+            default:
+                break;
+        }
+    }
+
+    /**
+     * 从源KindInfoVo中提取免赔率(百分比格式如"5%"),转为小数(如0.05)设置到目标
+     */
+    private void setDeductibleRateFromSource(DaDiFuelKindInfo target, KindInfoVo source) {
+        String deductibleRate = source.getDeductibleRate();
+        if (deductibleRate != null && !deductibleRate.isEmpty()) {
+            String digits = deductibleRate.replaceAll("\\D+", "");
+            if (!digits.isEmpty()) {
+                double rate = Double.parseDouble(digits) / 100.0;
+                target.setDeductibleRate(String.valueOf(rate));
+            }
+        }
+    }
+
+    @NotNull
+    private static Tax getTax(QuoteVo quoteVo, DaDiTaxConfigResponse taxConfig) {
+        Tax tax = new Tax();
+        // taxFlag: "T"=正常交税, "E"=免税
+        String taxFlag = "E".equals(taxConfig.getTaxFlag()) ? "E" : "T";
+        tax.setTaxFlag(taxFlag);
+        tax.setDeductiondueCode("E".equals(taxFlag) ? "E" : "");
+        tax.setDeductiondueType("E".equals(taxFlag) ? "E" : "");
+        tax.setTaxCertificateNo(taxConfig.getTaxCertificateNo());
+        tax.setTaxDepartment(taxConfig.getTaxDepartment());
+        // 纳税人信息:优先使用车船税VO,fallback到车主信息
+        if (quoteVo.getOwnersInfo() != null) {
+            tax.setTaxpayerName(quoteVo.getOwnersInfo().getName());
+            tax.setTaxpayerNo(quoteVo.getOwnersInfo().getIdentifyNumber());
+        }
+        tax.setExt(new Object());
+        return tax;
+    }
+}

+ 65 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiJointSalesRequest.java

@@ -0,0 +1,65 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地财险】 获取尊享保障方案请求
+ * @date 2026/5/25 15:42
+ */
+@Data
+@NoArgsConstructor
+public class DaDiJointSalesRequest extends DaDiBaseRequest {
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 车队等级
+     */
+    private String motorcadeLevel;
+
+    /**
+     * 驾驶行为评分
+     */
+    private String drivingBehaviorScore;
+
+    /**
+     * 来源
+     */
+    private String source = "1";
+
+    /**
+     * 最大座位数
+     */
+    private String maxSeatCount;
+
+    /**
+     * 选中的代码(交强+商业险)
+     */
+    private String selectedCode;
+
+    /**
+     * 选中类型
+     */
+    private String selectedType = "3";
+
+    /**
+     * 征信机构标识
+     */
+    private String creditOrgFlag = "0";
+
+    public DaDiJointSalesRequest(DaDiVehicleChannelRequest daDiVehicleChannelRequest, String orderId, CarInfoVo carInfo) {
+        this.comCode = daDiVehicleChannelRequest.getComCode();
+        this.userCode = daDiVehicleChannelRequest.getUserCode();
+        this.orderId = orderId;
+        this.maxSeatCount = carInfo.getSeatCount();
+        this.selectedCode = "DFA," + DaDiVehicleUtils.getCarSyriskCode(carInfo)[2];
+    }
+}

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

@@ -0,0 +1,26 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 10:07
+ */
+@Data
+@NoArgsConstructor
+public class DaDiOrderInfoRequest extends DaDiBaseRequest {
+
+    /**
+     * 订单号
+     */
+    public String orderId;
+
+    public DaDiOrderInfoRequest(String userCode, String orderId) {
+        this.userCode = userCode;
+        this.orderId = orderId;
+    }
+
+}

+ 23 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiPayNoDataRequest.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 11:01
+ */
+@Data
+@NoArgsConstructor
+public class DaDiPayNoDataRequest extends DaDiOrderInfoRequest {
+
+    private String payType = "10";
+
+    public DaDiPayNoDataRequest(String orderId, String comCode, String userCode) {
+        this.orderId = orderId;
+        this.comCode = comCode;
+        this.userCode = userCode;
+    }
+}

+ 15 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQueryOrderInfoRequest.java

@@ -0,0 +1,15 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 14:54
+ */
+public class DaDiQueryOrderInfoRequest extends DaDiOrderInfoRequest{
+
+    public DaDiQueryOrderInfoRequest(String orderId,String userCode ) {
+        this.orderId = orderId;
+        this.userCode = userCode;
+    }
+}

+ 386 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java

@@ -0,0 +1,386 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiQuoteResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 报价请求参数
+ * @date 2026/5/25 16:26
+ */
+@Data
+@NoArgsConstructor
+public class DaDiQuoteRequest extends DaDiBaseRequest {
+
+    /**
+     * 中银车评分
+     */
+    private String ccicVehicleScore;
+
+    /**
+     * 智能评分
+     */
+    private String smartscore;
+
+    /**
+     * 商业险折扣率
+     */
+    private String cdiscountrate;
+
+    /**
+     * 智能评分详情
+     */
+    private String smartscoredetails;
+
+    /**
+     * 车信评分
+     */
+    private String xcarscore;
+
+    /**
+     * 商业险历年出险记录
+     */
+    private List<Object> businessLastClaims;
+
+    /**
+     * 佣金信息
+     */
+    private Commission commission;
+
+    /**
+     * 累计佣金信息
+     */
+    private AccCommission accCommission;
+
+    /**
+     * 浮动系数
+     */
+    private Floating floating;
+
+    /**
+     * 计划编码
+     */
+    private String planCode;
+
+    /**
+     * 报价次数统计
+     */
+    private QuoteCount quoteCount;
+
+    /**
+     * 交强险历年出险记录
+     */
+    private List<Object> trafficLastClaims;
+
+    /**
+     * 来源
+     */
+    private String source;
+
+    /**
+     * 车辆计费信息
+     */
+    private List<Object> vehicleChargings;
+
+    /**
+     * 是否重置
+     */
+    private Boolean reset;
+
+    /**
+     * 是否计算实际价值
+     */
+    private Boolean calculateActualValue;
+
+    /**
+     * 更新实际价值
+     */
+    private String updateActualValue;
+
+    /**
+     * 是否推荐车损险保额
+     */
+    private String isRecommendVehLossInsured;
+
+    /**
+     * 渠道信息
+     */
+    private DaDiVehicleChannelRequest channel;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 是否标准
+     */
+    private String isStandard;
+
+    /**
+     * 投保方案
+     */
+    private Object insurancePlan;
+
+    /**
+     * 车主信息
+     */
+    private DaDivehicleOwnerInfoRequest owner;
+
+    /**
+     * 车辆验车信息
+     */
+    private DaDiVehicleModelRequest vehicleCheck;
+
+    /**
+     * 核验信息
+     */
+    private List<DaDiQuoteResponse.ChecksDTO> checks;
+
+    /**
+     * 交强险产品编码
+     */
+    private String jqProductCode;
+
+    /**
+     * 商业险产品编码
+     */
+    private String syProductCode;
+
+    /**
+     * 第三方来源编码
+     */
+    private String thirdComeCode;
+
+    /**
+     * 佣金信息
+     */
+    @Data
+    @NoArgsConstructor
+    public static class Commission {
+        /**
+         * 投保奖励
+         */
+        private List<Object> insureAwards;
+
+        /**
+         * 商业险费C1上限
+         */
+        private String commercialFeec1Limit;
+
+        /**
+         * 商业险费C1比率
+         */
+        private String commercialFeec1Rate;
+
+        /**
+         * 商业险费上限
+         */
+        private String commercialFeecLimit;
+
+        /**
+         * 商业险费比率
+         */
+        private String commercialFeecRate;
+
+        /**
+         * 交强险费C1上限
+         */
+        private String compulsoryFeec1Limit;
+
+        /**
+         * 交强险费C1比率
+         */
+        private String compulsoryFeec1Rate;
+
+        /**
+         * 交强险费上限
+         */
+        private String compulsoryFeecLimit;
+
+        /**
+         * 交强险费比率
+         */
+        private String compulsoryFeecRate;
+
+        /**
+         * 总C1费上限
+         */
+        private String totalC1feeLimit;
+
+        /**
+         * 总C1费比率
+         */
+        private String totalC1feeRate;
+
+        /**
+         * 总费上限
+         */
+        private String totalCfeeLimit;
+
+        /**
+         * 总费比率
+         */
+        private String totalCfeeRate;
+    }
+
+    /**
+     * 累计佣金信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class AccCommission {
+        /**
+         * 税前总保费
+         */
+        private Integer totalBeforeVatPremium;
+
+        /**
+         * 总费
+         */
+        private Integer totalCfee;
+
+        /**
+         * 总C1费
+         */
+        private Integer totalC1fee;
+    }
+
+    /**
+     * 浮动系数
+     */
+    @Data
+    @NoArgsConstructor
+    public static class Floating {
+        /**
+         * 折扣系数
+         */
+        private String discountCoefficient;
+
+        /**
+         * 浮动项列表
+         */
+        private List<Object> floatingItems;
+
+        /**
+         * 车信编号
+         */
+        private String xcarNum;
+    }
+
+    /**
+     * 报价次数统计
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class QuoteCount {
+        /**
+         * 商业险最大报价次数
+         */
+        private String businessQuoteMaxNum;
+
+        /**
+         * 商业险报价次数
+         */
+        private String businessQuoteNum;
+
+        /**
+         * 交强险最大报价次数
+         */
+        private String compulsoryQuoteMaxNum;
+
+        /**
+         * 交强险报价次数
+         */
+        private String compulsoryQuoteNum;
+
+        /**
+         * 总报价次数
+         */
+        private String sumQuoteCount;
+    }
+
+    public DaDiQuoteRequest(QuoteVo quoteVo, String orderId, List<DaDiQuoteResponse.ChecksDTO> checks, String thirdComeCode, DaDiInsurancePlanRequest daDiInsurancePlanRequest, DaDiVehicleModelRequest carModelRequest, DaDiVehicleChannelRequest daDiVehicleChannelRequest) {
+        InsOrdersOtherInfoVo otherInfo = quoteVo.getOtherInfo();
+
+        // === 继承字段 ===
+        this.comCode = daDiVehicleChannelRequest.getComCode();
+        this.agentCode = daDiVehicleChannelRequest.getAgentCode();
+        this.userCode = daDiVehicleChannelRequest.getUserCode();
+
+        // === 评分信息 ===
+        this.ccicVehicleScore = otherInfo != null ? otherInfo.getScore() : "";
+        this.smartscore = "Y";
+        this.cdiscountrate = "Y";
+        this.smartscoredetails = "N";
+        this.xcarscore = "Y";
+
+        // === 出险记录 ===
+        this.businessLastClaims = new ArrayList<>();
+        this.trafficLastClaims = new ArrayList<>();
+
+        // === 佣金 ===
+        this.commission = new Commission();
+        this.accCommission = new AccCommission(0, 0, 0);
+
+        // === 浮动系数 ===
+        this.floating = new Floating();
+
+        // === 报价次数 ===
+        this.quoteCount = new QuoteCount("", "", "", "", "1");
+
+        // === 计划编码 ===
+        this.planCode = "S";
+
+        // === 来源 ===
+        this.source = "";
+
+        // === 车辆计费 ===
+        this.vehicleChargings = new ArrayList<>();
+
+        // === 标志位 ===
+        this.reset = true;
+        this.calculateActualValue = false;
+        this.updateActualValue = carModelRequest != null ? carModelRequest.getActualValue() : "";
+        this.isRecommendVehLossInsured = "0";
+
+        // === 渠道信息 ===
+        this.channel = daDiVehicleChannelRequest;
+
+        // === 订单ID ===
+        this.orderId = orderId;
+
+        // === 是否标准 ===
+        this.isStandard = "1";
+
+        // === 投保方案 ===
+        this.insurancePlan = daDiInsurancePlanRequest;
+
+        // === 车主信息 ===
+        this.owner = new DaDivehicleOwnerInfoRequest(quoteVo);
+
+        // === 车辆验车信息 ===
+        this.vehicleCheck = carModelRequest;
+
+        // === 核验信息 ===
+        this.checks = checks;
+
+        // === 产品编码 ===
+        this.jqProductCode = "DFA";
+        this.syProductCode = DaDiVehicleUtils.getCarSyriskCode(quoteVo.getCarInfoVo())[2];
+
+        // === 第三方来源编码 ===
+        this.thirdComeCode = thirdComeCode;
+    }
+}

+ 482 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSaveFileIdxRequest.java

@@ -0,0 +1,482 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.commons.util.DateTimeUtils;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiOssInitParamResponse;
+import com.jzg.quotation.dadi.utils.DaDiImageUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 保存文件索引请求
+ * @date 2026/5/29 08:26
+ */
+@Data
+@NoArgsConstructor
+public class DaDiSaveFileIdxRequest extends DaDiBaseRequest {
+
+    /**
+     * 文件索引信息
+     */
+    private FileIdxVo fileIdxVo;
+
+    /**
+     * OSS Token
+     */
+    private String token;
+
+    /**
+     * 文件体(上传时为空)
+     */
+    private Object file;
+
+    // ==================== 文件索引VO ====================
+
+    @Data
+    @NoArgsConstructor
+    public static class FileIdxVo {
+
+        /**
+         * 旋转角度
+         */
+        private int rotate;
+        /**
+         * 旋转起始角度
+         */
+        private int rotateStart;
+        /**
+         * 操作标志
+         */
+        private int optionFlag;
+        /**
+         * 图片ID
+         */
+        private long imgId;
+        /**
+         * 创建时间
+         */
+        private long createTime;
+        /**
+         * 创建用户
+         */
+        private String createUser;
+        /**
+         * 创建用户名
+         */
+        private String createUserName;
+        /**
+         * 应用来源
+         */
+        private String appSource;
+        /**
+         * 文档ID
+         */
+        private int docId;
+        /**
+         * 业务号
+         */
+        private String bussNo;
+        /**
+         * 业务类型
+         */
+        private String bussType;
+        /**
+         * 业务类型名称
+         */
+        private String bussTypeName;
+        /**
+         * 险种代码
+         */
+        private String riskCode;
+        /**
+         * 险种代码名称
+         */
+        private String riskCodeName;
+        /**
+         * 公司代码
+         */
+        private String comCode;
+        /**
+         * 公司名称
+         */
+        private String comName;
+        /**
+         * 业务日期
+         */
+        private String bussDate;
+        /**
+         * 有效标志
+         */
+        private int validFlag;
+        /**
+         * 上传节点
+         */
+        private String uploadNode;
+        /**
+         * 附加路径(目录)
+         */
+        private String appendPath;
+        /**
+         * 是否可编辑
+         */
+        private boolean editable;
+        /**
+         * 是否可删除
+         */
+        private boolean deletable;
+        /**
+         * VO类型
+         */
+        private String voType;
+        /**
+         * 图片文件标志
+         */
+        private int picFileFlag;
+        /**
+         * 文件大小(字节)
+         */
+        private long fileSize;
+        /**
+         * 文件原始名称
+         */
+        private String fileOrgName;
+        /**
+         * 文件标题
+         */
+        private String fileTitle;
+        /**
+         * 文件指纹信息
+         */
+        private FileInfo file;
+        /**
+         * OSS存储文件名
+         */
+        private String fileName;
+        /**
+         * 类型路径
+         */
+        private String typePath;
+        /**
+         * 显示索引
+         */
+        private int showIdx;
+        /**
+         * 类型名称
+         */
+        private String typeName;
+        /**
+         * MD5校验标志
+         */
+        private String md5VerifyFlag;
+        /**
+         * 拍摄设备型号
+         */
+        private String shootModel;
+        /**
+         * 拍摄时间
+         */
+        private String shootTime;
+        /**
+         * GPS标签
+         */
+        private String gpsTag;
+        /**
+         * 图片方向
+         */
+        private int orientation;
+        /**
+         * 公司端MD5
+         */
+        private String comMD5;
+        /**
+         * 当前MD5
+         */
+        private String curMD5;
+    }
+
+    // ==================== 文件指纹信息 ====================
+
+    @Data
+    @NoArgsConstructor
+    public static class FileInfo {
+
+        /**
+         * EXIF数据
+         */
+        private ExifData exifdata;
+        /**
+         * IPTC数据
+         */
+        private Map<String, Object> iptcdata;
+    }
+
+    // ==================== EXIF数据 ====================
+
+    @Data
+    @NoArgsConstructor
+    public static class ExifData {
+
+        private int imageWidth;
+        private int imageHeight;
+        private String make;
+        private String model;
+        private int orientation;
+        private int xResolution;
+        private int yResolution;
+        private int resolutionUnit;
+        private String software;
+        private String dateTime;
+        private int yCbCrPositioning;
+        private int exifIFDPointer;
+        private int gPSInfoIFDPointer;
+        private double exposureTime;
+        private double fNumber;
+        private String exposureProgram;
+        private int iSOSpeedRatings;
+        private String exifVersion;
+        private String dateTimeOriginal;
+        private String dateTimeDigitized;
+        /**
+         * 时区偏移
+         */
+        private String undefined;
+        private String componentsConfiguration;
+        private double shutterSpeedValue;
+        private double apertureValue;
+        private double brightnessValue;
+        private int exposureBias;
+        private double maxApertureValue;
+        private double subjectDistance;
+        private String meteringMode;
+        private String flash;
+        private double focalLength;
+        private String subsecTime;
+        private String subsecTimeOriginal;
+        private String subsecTimeDigitized;
+        private String flashpixVersion;
+        private int colorSpace;
+        private int pixelXDimension;
+        private int pixelYDimension;
+        private int interoperabilityIFDPointer;
+        private String sensingMethod;
+        private String sceneType;
+        private String customRendered;
+        private int exposureMode;
+        private String whiteBalance;
+        private int digitalZoomRation;
+        private int focalLengthIn35mmFilm;
+        private String sceneCaptureType;
+        private String contrast;
+        private String saturation;
+        private String sharpness;
+        private String subjectDistanceRange;
+        private String gPSImgDirectionRef;
+        private int gPSImgDirection;
+    }
+
+    // ==================== 图片类型映射 ====================
+
+    @Data
+    public static class ImageTypeMapping {
+        /** 类型名称 */
+        private String typeName;
+        /** 类型路径 */
+        private String typePath;
+        /** 匹配的图片类型编码列表 */
+        private List<String> typeList;
+
+        public ImageTypeMapping(String typeName, String typePath, List<String> typeList) {
+            this.typeName = typeName;
+            this.typePath = typePath;
+            this.typeList = typeList;
+        }
+    }
+
+    /**
+     * 图片类型映射列表
+     */
+    private static final List<ImageTypeMapping> IMG_TYPE_LIST = new ArrayList<>(Arrays.asList(
+            new ImageTypeMapping("风险查勘材料",   "|D006|",     new ArrayList<>()),
+            new ImageTypeMapping("营业执照",       "|UWD460|",   Arrays.asList("Y02", "Y03", "Y04")),
+            new ImageTypeMapping("授权委托书",     "|UWD403|",   Arrays.asList("SQ00")),
+            new ImageTypeMapping("电子行驶证",     "|UWD616|",   new ArrayList<>()),
+            new ImageTypeMapping("身份证",         "|0001|",     Arrays.asList("SFZ_01", "SFZ_02", "C02", "D02", "C03", "D03", "C04", "D04")),
+            new ImageTypeMapping("行驶证",         "|D003|",     Arrays.asList("C01", "D01")),
+            new ImageTypeMapping("电子投保单",     "|UWD602|",   new ArrayList<>()),
+            new ImageTypeMapping("电子保单",       "|UWD605|",   new ArrayList<>()),
+            new ImageTypeMapping("验车照片",       "|D004|",     Arrays.asList("C0500", "C0501", "C0502", "C0503", "C0504", "C0505", "C0506", "C0507", "C0508", "C0509", "C0510")),
+            new ImageTypeMapping("购车发票",       "|D001|",     Arrays.asList("GC00")),
+            new ImageTypeMapping("合格证",         "|D002|",     new ArrayList<>()),
+            new ImageTypeMapping("车船税完税或减免税凭证", "|UWD612|", Arrays.asList("XC00")),
+            new ImageTypeMapping("一般纳税人资质证明", "|UWD601|", Arrays.asList("ZGZ_00")),
+            new ImageTypeMapping("投保单",         "|0002|",     new ArrayList<>()),
+            new ImageTypeMapping("关联交易合规审核文件", "|UWD603|", new ArrayList<>()),
+            new ImageTypeMapping("双录单证",       "|UWD604|",   new ArrayList<>()),
+            new ImageTypeMapping("上年保单",       "|LASTYEAR|", Arrays.asList("LAST_INSURANCE_POLICY")),
+            new ImageTypeMapping("保单正本",       "|UWD501|",   new ArrayList<>()),
+            new ImageTypeMapping("录音文件",       "|UWD504|",   new ArrayList<>()),
+            new ImageTypeMapping("其他",           "|OTHER|",    Arrays.asList("TAR05", "YHK_01", "LD_00", "YP_00", "DX_00", "GX00", "LZ_01")),
+            new ImageTypeMapping("投保人照片",     "|UWD101|",   new ArrayList<>()),
+            new ImageTypeMapping("质检补传",       "|UWD201|",   new ArrayList<>()),
+            new ImageTypeMapping("出险证明",       "|UWD301|",   new ArrayList<>()),
+            new ImageTypeMapping("批单正本",       "|UWD502|",   new ArrayList<>()),
+            new ImageTypeMapping("发票正本",       "|UWD503|",   new ArrayList<>())
+    ));
+
+    /**
+     * 根据图片类型编码查找匹配的图片类型映射
+     *
+     * @param imgTypeCode 图片类型编码(如 "C01"、"Y02" 等)
+     * @return 匹配的 ImageTypeMapping,未匹配则返回空映射(typeName/typePath 为空串)
+     */
+    public static ImageTypeMapping findImageType(String imgTypeCode) {
+        if (imgTypeCode == null || imgTypeCode.isEmpty()) {
+            return new ImageTypeMapping("", "", new ArrayList<>());
+        }
+        for (ImageTypeMapping item : IMG_TYPE_LIST) {
+            if (item.getTypeList().contains(imgTypeCode)) {
+                return item;
+            }
+        }
+        return new ImageTypeMapping("", "", new ArrayList<>());
+    }
+
+    // ==================== 构造函数 ====================
+
+    public DaDiSaveFileIdxRequest(DaDiOssInitParamResponse ossInitParam, String bussNo, InsuranceImageVo.ImageDTO image, String imageName, String imgType) {
+        // 1. 获取 Base64 图片信息(size、width、height、md5)
+        DaDiImageUtils.ImageBase64Info imageInfo = DaDiImageUtils.getBase64ImageInfo(image.getImageBase64Str());
+
+        // 2. 当前时间戳
+        long createTime13 = System.currentTimeMillis();
+
+        // 3. 格式化时间
+        String formattedTime = DateTimeUtils.getFormatTime("yyyy/MM/dd HH:mm:ss");
+
+        // 4. 上层目录路径(去掉最后一个"/"之后的文件名部分)
+        String appendPath = imageName.lastIndexOf("/") > 0 ? imageName.substring(0, imageName.lastIndexOf("/") + 1) : "";
+        String fileOrgName = imageName.substring(imageName.lastIndexOf("/") + 1);
+
+        // 5. 文件标题(取文件名去掉扩展名)
+        String fileTitle = fileOrgName.contains(".") ? fileOrgName.substring(0, fileOrgName.lastIndexOf(".")) : fileOrgName;
+
+        // 6. 匹配图片类型得到 typePath 和 typeName
+        ImageTypeMapping imagetype = findImageType(imgType);
+
+        // 7. 构建 EXIF 数据(硬编码的 EXIF 信息 + 动态宽高)
+        ExifData exifData = new ExifData();
+        exifData.setImageWidth(imageInfo.getWidth());
+        exifData.setImageHeight(imageInfo.getHeight());
+        exifData.setMake("Google");
+        exifData.setModel("Pixel 6");
+        exifData.setOrientation(1);
+        exifData.setXResolution(72);
+        exifData.setYResolution(72);
+        exifData.setResolutionUnit(2);
+        exifData.setSoftware("HDR+ 1.0.391156438zd");
+        exifData.setDateTime(formattedTime);
+        exifData.setYCbCrPositioning(1);
+        exifData.setExifIFDPointer(242);
+        exifData.setGPSInfoIFDPointer(899);
+        exifData.setExposureTime(0.016952);
+        exifData.setFNumber(1.85);
+        exifData.setExposureProgram("Normal program");
+        exifData.setISOSpeedRatings(148);
+        exifData.setExifVersion("0231");
+        exifData.setDateTimeOriginal(formattedTime);
+        exifData.setDateTimeDigitized(formattedTime);
+        exifData.setUndefined("+08:00");
+        exifData.setComponentsConfiguration("YCbCr");
+        exifData.setShutterSpeedValue(5.88);
+        exifData.setApertureValue(1.78);
+        exifData.setBrightnessValue(2.09);
+        exifData.setExposureBias(0);
+        exifData.setMaxApertureValue(1.78);
+        exifData.setSubjectDistance(0.162);
+        exifData.setMeteringMode("CenterWeightedAverage");
+        exifData.setFlash("Flash did not fire, compulsory flash mode");
+        exifData.setFocalLength(6.81);
+        exifData.setSubsecTime("229");
+        exifData.setSubsecTimeOriginal("229");
+        exifData.setSubsecTimeDigitized("229");
+        exifData.setFlashpixVersion("0100");
+        exifData.setColorSpace(1);
+        exifData.setPixelXDimension(imageInfo.getWidth());
+        exifData.setPixelYDimension(imageInfo.getHeight());
+        exifData.setInteroperabilityIFDPointer(869);
+        exifData.setSensingMethod("One-chip color area sensor");
+        exifData.setSceneType("Directly photographed");
+        exifData.setCustomRendered("Custom process");
+        exifData.setExposureMode(0);
+        exifData.setWhiteBalance("Auto white balance");
+        exifData.setDigitalZoomRation(0);
+        exifData.setFocalLengthIn35mmFilm(24);
+        exifData.setSceneCaptureType("Standard");
+        exifData.setContrast("Normal");
+        exifData.setSaturation("Normal");
+        exifData.setSharpness("Normal");
+        exifData.setSubjectDistanceRange("Macro");
+        exifData.setGPSImgDirectionRef("M");
+        exifData.setGPSImgDirection(243);
+
+        // 8. 构建文件指纹信息
+        FileInfo fileInfo = new FileInfo();
+        fileInfo.setExifdata(exifData);
+        fileInfo.setIptcdata(new HashMap<>());
+
+        // 9. 构建文件索引 VO
+        FileIdxVo fileIdxVo = new FileIdxVo();
+        fileIdxVo.setRotate(0);
+        fileIdxVo.setRotateStart(0);
+        fileIdxVo.setOptionFlag(0);
+        fileIdxVo.setImgId(createTime13);
+        fileIdxVo.setCreateTime(createTime13);
+        fileIdxVo.setCreateUser(ossInitParam.getOptUserId());
+        fileIdxVo.setCreateUserName(ossInitParam.getOptUserName());
+        fileIdxVo.setAppSource("UW");
+        fileIdxVo.setDocId(ossInitParam.getDocId());
+        fileIdxVo.setBussNo(bussNo);
+        fileIdxVo.setBussType("UW");
+        fileIdxVo.setBussTypeName("承保");
+        fileIdxVo.setRiskCode("UW_D");
+        fileIdxVo.setRiskCodeName("机动车辆险");
+        fileIdxVo.setComCode(ossInitParam.getComCode());
+        fileIdxVo.setComName(ossInitParam.getComName() != null ? ossInitParam.getComName() : "");
+        fileIdxVo.setBussDate(ossInitParam.getBussDate());
+        fileIdxVo.setValidFlag(1);
+        fileIdxVo.setUploadNode(ossInitParam.getUploadNode() != null ? ossInitParam.getUploadNode() : "");
+        fileIdxVo.setAppendPath(appendPath);
+        fileIdxVo.setEditable(true);
+        fileIdxVo.setDeletable(true);
+        fileIdxVo.setVoType("C");
+        fileIdxVo.setPicFileFlag(1);
+        fileIdxVo.setFileSize(imageInfo.getSizeBytes());
+        fileIdxVo.setFileOrgName(fileOrgName);
+        fileIdxVo.setFileTitle(fileTitle);
+        fileIdxVo.setFile(fileInfo);
+        fileIdxVo.setFileName(fileOrgName);
+        fileIdxVo.setTypePath(imagetype.getTypePath());
+        fileIdxVo.setShowIdx(0);
+        fileIdxVo.setTypeName(imagetype.getTypeName());
+        fileIdxVo.setMd5VerifyFlag("null");
+        fileIdxVo.setShootModel("Pixel 6");
+        fileIdxVo.setShootTime(formattedTime);
+        fileIdxVo.setGpsTag(",");
+        fileIdxVo.setOrientation(1);
+        fileIdxVo.setComMD5(null);
+        fileIdxVo.setCurMD5(imageInfo.getMd5());
+
+        // 10. 设置顶层字段
+        this.fileIdxVo = fileIdxVo;
+        this.token = ossInitParam.getToken();
+        this.file = null;
+    }
+}

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

@@ -0,0 +1,26 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 特约信息查询参数
+ * @date 2026/5/25 14:45
+ */
+@Data
+@NoArgsConstructor
+public class DaDiSpecialInformationRequest extends DaDiBaseRequest{
+
+    /**
+     * 订单编号
+     */
+    private String orderId;
+
+    public DaDiSpecialInformationRequest(String comCode, String userCode, String orderId) {
+        this.comCode = comCode;
+        this.userCode = userCode;
+        this.orderId = orderId;
+    }
+}

+ 69 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSubmitOrderRequest.java

@@ -0,0 +1,69 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiSpecialInformationResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 提交订单请求参数
+ * @date 2026/5/27 11:45
+ */
+@Data
+@NoArgsConstructor
+public class DaDiSubmitOrderRequest extends DaDiBaseRequest {
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 特约列表
+     */
+    private AntiInfoDTO antiInfo = new AntiInfoDTO();
+
+    /**
+     * 特约列表
+     */
+    private List<DaDiSpecialInformationResponse.EngagesDTO> engageList;
+
+    /**
+     * 验证码
+     */
+    private String verifyCode = "";
+
+    /**
+     * 是否需要特批 N-否 Y-是
+     */
+    private String isNeedSpecialApprove = "N";
+
+    /**
+     * 备注
+     */
+    private String remarkValue = "";
+
+    /**
+     * 扩展参数
+     */
+    private Map<String, Object> extensionMap;
+
+    @Data
+    @NoArgsConstructor
+    private static class AntiInfoDTO {
+        private List<Object> vehicleAntiBeneficiaries = new ArrayList<>();
+    }
+
+    public DaDiSubmitOrderRequest(String orderId, String comCode, String userCode,
+                                  List<DaDiSpecialInformationResponse.EngagesDTO> engageList) {
+        this.orderId = orderId;
+        this.comCode = comCode;
+        this.userCode = userCode;
+        this.engageList = engageList;
+    }
+}

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

@@ -0,0 +1,26 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/25 16:01
+ */
+@Data
+@NoArgsConstructor
+public class DaDiTaxConfigRequest extends DaDiBaseRequest{
+
+    /**
+     * 订单编号
+     */
+    private String orderId;
+
+    public DaDiTaxConfigRequest(String comCode, String userCode, String orderId) {
+        this.comCode = comCode;
+        this.userCode = userCode;
+        this.orderId = orderId;
+    }
+}

+ 101 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiTemporaryOrderRequest.java

@@ -0,0 +1,101 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiAgentInfoResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 暂存单请求
+ * @date 2026/5/23 15:57
+ */
+@Data
+@NoArgsConstructor
+public class DaDiTemporaryOrderRequest extends DaDiBaseRequest {
+
+    /**
+     * 系统来源
+     */
+    private String systemSource;
+
+    /**
+     * 订单号
+     */
+    private String orderId;
+
+    /**
+     * 渠道信息
+     */
+    private DaDiVehicleChannelRequest vehicleChannelVO;
+
+    /**
+     * 车型信息
+     */
+    private DaDiVehicleModelRequest vehicleModelVO;
+
+    /**
+     * 车主信息
+     */
+    private DaDivehicleOwnerInfoRequest vehicleOwnerVO;
+
+    /**
+     * 续保标识
+     */
+    private String renewalFlag;
+
+    /**
+     * 最大座位数
+     */
+    private String maxSeatCount;
+
+    /**
+     * 选中险种编码(逗号分隔)
+     */
+    private String selectedCode;
+
+    /**
+     * 选中类型
+     */
+    private String selectedType;
+
+    /**
+     * 来源
+     */
+    private String source;
+
+    /**
+     * 车队等级
+     */
+    private String motorcadeLevel;
+
+    /**
+     * 驾驶行为评分
+     */
+    private String drivingBehaviorScore;
+
+    /**
+     * 信用机构标识
+     */
+    private String creditOrgFlag;
+
+    public DaDiTemporaryOrderRequest(QuoteVo quoteVo, DaDiAgentInfoResponse agentInfoVo,  DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleModelRequest vehicleModelVO, DaDivehicleOwnerInfoRequest daDivehicleOwnerInfoRequest) {
+        this.systemSource = "1";
+        this.orderId = "";
+        this.vehicleChannelVO = daDiVehicleChannelRequest;
+        this.vehicleModelVO = vehicleModelVO;
+        this.vehicleOwnerVO = daDivehicleOwnerInfoRequest;
+        this.renewalFlag = "0";
+        this.maxSeatCount = quoteVo.getCarInfoVo().getSeatCount();
+        this.selectedCode = "";
+        this.selectedType = "";
+        this.source = "";
+        this.motorcadeLevel = "";
+        this.drivingBehaviorScore = "";
+        this.creditOrgFlag = "";
+        this.comCode = agentInfoVo.getAgentCode();
+        this.userCode = agentInfoVo.getUserCode();
+        this.agentCode = agentInfoVo.getAgentCode();
+    }
+}

+ 23 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUnderwritingRequest.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 10:17
+ */
+@Data
+@NoArgsConstructor
+public class DaDiUnderwritingRequest extends DaDiOrderInfoRequest{
+
+
+    public DaDiUnderwritingRequest(String orderId, String comCode,String userCode) {
+        this.orderId = orderId;
+        this.comCode = comCode;
+        this.userCode = userCode;
+    }
+
+}

+ 48 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUploadImageRequest.java

@@ -0,0 +1,48 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 16:45
+ */
+
+import com.jzg.quotation.commons.utils.DateUtil;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class DaDiUploadImageRequest extends DaDiBaseRequest {
+
+    /**
+     * 业务号
+     */
+    private String bussNo;
+
+    /**
+     * 影像类型
+     */
+    private String imgType = "UW_D";
+
+    /**
+     * 业务日期
+     */
+    private String busiDate = DateUtil.getTheCurrentYear(new Date()) + "0000";
+
+    /**
+     * 标志
+     */
+    private String flag = "1";
+
+    public DaDiUploadImageRequest(String bussNo, String userCode, String comCode) {
+        this.userCode = userCode;
+        this.comCode = comCode;
+        this.bussNo = bussNo;
+    }
+
+}

+ 355 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleChannelRequest.java

@@ -0,0 +1,355 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiAgencyAgreementInfoResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiAgentInfoResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 渠道信息
+ * @date 2026/5/22 17:20
+ */
+@Data
+@NoArgsConstructor
+public class DaDiVehicleChannelRequest extends DaDiBaseRequest {
+
+    // ==================== 代理基本信息 ====================
+
+    /**
+     * 代理协议代码
+     */
+    private String agentAgreementCode;
+
+    /**
+     * 代理协议名称
+     */
+    private String agentAgreementName;
+
+    /**
+     * 代理人名称
+     */
+    private String agentName;
+
+    /**
+     * 业务编码
+     */
+    private String businessCode;
+
+    /**
+     * 业务名称
+     */
+    private String businessName;
+
+    /**
+     * 业务类型
+     */
+    private String businessType;
+
+    /**
+     * 业务性质(业务来源)
+     */
+    private String businessNature;
+
+    /**
+     * 渠道名称
+     */
+    private String channelName;
+
+    /**
+     * ID
+     */
+    private String id;
+
+    /**
+     * 是否代理,默认1
+     */
+    private String isProxy;
+
+    /**
+     * 是否默认
+     */
+    private String isDefault;
+
+    /**
+     * 手机号
+     */
+    private String mobile;
+
+    /**
+     * 操作员/用户代码
+     */
+    private String operator;
+
+    /**
+     * 操作员手机号
+     */
+    private String operatorPhone;
+
+    /**
+     * 机构代码
+     */
+    private String orgCode;
+
+    /**
+     * 代理机构代码
+     */
+    private String agencyOrgCode;
+
+    /**
+     * 许可证号
+     */
+    private String permitNo;
+
+    /**
+     * 展业编号
+     */
+    private String exhibitionNo;
+
+    // ==================== 项目信息 ====================
+
+    /**
+     * 项目代码
+     */
+    private String projectCode;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 销售代码名称
+     */
+    private String salesCodeName;
+
+    /**
+     * 销售渠道代码
+     */
+    private String salesChannelCode;
+
+    /**
+     * 销售人员身份证号
+     */
+    private String salesIdNo;
+
+    /**
+     * 销售人员姓名
+     */
+    private String salesName;
+
+    /**
+     * 第三方业务信息
+     */
+    private String thirdBusinessInfo;
+
+    /**
+     * 第三方经办人姓名
+     */
+    private String thirdPartyHandlerName;
+
+    /**
+     * 第三方经办人号码
+     */
+    private String thirdPartyHandlerNo;
+
+    /**
+     * 报价方案编码
+     */
+    private String quotePlanCode;
+
+    /**
+     * 模式
+     */
+    private String mode;
+
+    // ==================== 代理协议 ====================
+
+    /**
+     * 协议号
+     */
+    private String agreementNo;
+
+    /**
+     * 协议名称
+     */
+    private String agreementName;
+
+    // ==================== 业务风险分类相关 ====================
+
+    /**
+     * 业务性质代码
+     */
+    private String businessNatureCode;
+
+    /**
+     * 业务性质名称
+     */
+    private String businessNatureName;
+
+    /**
+     * 业务风险分类2
+     */
+    private String businessNature2;
+
+    /**
+     * 业务风险分类2名称
+     */
+    private String businessNature2Name;
+
+    /**
+     * 业务风险分类2代码
+     */
+    private String businessNature2Code;
+
+    /**
+     * 经办人2代码
+     */
+    private String handler2Code;
+
+    /**
+     * 经办人2名称
+     */
+    private String handler2Name;
+
+    // ==================== 合作方信息 ====================
+
+    /**
+     * 合作方分公司名称
+     */
+    private String partnerBranchName;
+
+    /**
+     * 合作方分公司代码
+     */
+    private String partnerBranchCode;
+
+    /**
+     * 合作方公司代码
+     */
+    private String partnerCompanyCode;
+
+    /**
+     * 合作方公司名称
+     */
+    private String partnerCompanyName;
+
+    /**
+     * 录入日期
+     */
+    private String inputDate;
+
+    /**
+     * 地址名称
+     */
+    private String addressName;
+
+    /**
+     * 公司名称
+     */
+    private String comName;
+
+    /**
+     * 电话号码
+     */
+    private String phoneNumber;
+
+    /**
+     * 险种代码
+     */
+    private String riskCode;
+
+    /**
+     * 业务来源
+     */
+    private String businessSource;
+
+    /**
+     * 业务来源代码
+     */
+    private String businessSourceCode;
+
+    /**
+     * 业务来源名称
+     */
+    private String businessSourceName;
+
+    /**
+     * 是否默认选中
+     */
+    private String isDefaultChecked;
+
+
+    public DaDiVehicleChannelRequest(QuoteVo quoteVo, DaDiAgentInfoResponse agentInfoVo,
+                                     DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO.SalesAgreementMsgListDTO salesAgreementMsgDto,
+                                     DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO.SalesAgentMsgDtoDTO salesAgentMsgDto) {
+        AttributionInformationVo attrInfo = quoteVo.getOrder().getAttributionInformationVo();
+
+        // === 代理基本信息 ===
+        this.agentAgreementCode = salesAgreementMsgDto.getAgreementNo();
+        this.agentAgreementName = salesAgreementMsgDto.getAgreementName();
+        this.agentCode = salesAgentMsgDto.getAgentCode();
+        this.agentName = salesAgentMsgDto.getAgentName();
+        this.businessCode = "";
+        this.businessName = "";
+        this.businessType = "";
+        this.businessNature = salesAgentMsgDto.getBusinessNature();
+        this.channelName = "";
+        this.id = agentInfoVo.getId();
+        this.isProxy = "1";
+        this.isDefault = "1";
+        this.mobile = "";
+        this.operator = attrInfo.getUsername();
+        this.operatorPhone = "";
+        this.orgCode = salesAgentMsgDto.getOrgCode();
+        this.agencyOrgCode = salesAgentMsgDto.getOrgCode();
+        this.permitNo = salesAgentMsgDto.getPermitNo();
+        this.exhibitionNo = salesAgentMsgDto.getExhibitionNo();
+
+        // === 项目信息 ===
+        this.projectCode = "";
+        this.projectName = "";
+        this.salesCodeName = "";
+        this.salesChannelCode = "";
+        this.salesIdNo = "";
+        this.salesName = "";
+        this.thirdBusinessInfo = "";
+        this.thirdPartyHandlerName = "";
+        this.thirdPartyHandlerNo = "";
+        this.quotePlanCode = "";
+        this.mode = "";
+
+        // === 代理协议 ===
+        this.agreementNo = salesAgreementMsgDto.getAgreementNo();
+        this.agreementName = salesAgreementMsgDto.getAgreementName();
+
+        // === 业务风险分类相关 ===
+        this.businessNatureCode = salesAgentMsgDto.getBusinessNature();
+        this.businessNatureName = "专业代理(非汽销公司类)";
+        this.businessNature2 = salesAgentMsgDto.getBusinessNature();
+        this.businessNature2Name = agentInfoVo.getAgentName();
+        this.businessNature2Code = salesAgentMsgDto.getBusinessNature();
+        this.handler2Code = agentInfoVo.getUserCode();
+        this.handler2Name = agentInfoVo.getAgentName();
+
+        // === 合作方信息 ===
+        this.partnerBranchName = "";
+        this.partnerBranchCode = "";
+        this.partnerCompanyCode = "";
+        this.partnerCompanyName = "";
+        this.inputDate = salesAgentMsgDto.getInputDate();
+        this.addressName = salesAgentMsgDto.getAddressName();
+        this.comCode = salesAgentMsgDto.getComCode();
+        this.comName = salesAgentMsgDto.getComName();
+        this.phoneNumber = salesAgentMsgDto.getPhoneNumber();
+        this.riskCode = salesAgentMsgDto.getRiskCode();
+        this.userCode = attrInfo.getUsername();
+        this.businessSource = agentInfoVo.getBusinessSource();
+        this.businessSourceCode = salesAgentMsgDto.getBusinessNature();
+        this.businessSourceName = "";
+        this.isDefaultChecked = "";
+    }
+}

+ 612 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleModelRequest.java

@@ -0,0 +1,612 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiAgentInfoResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiVehicleChannelInfoResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiVehiclePricResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【车型查询请求】
+ * @date 2026/5/22 17:49
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DaDiVehicleModelRequest extends DaDiBaseRequest {
+
+    /**
+     * 简易报价标识,默认K01
+     */
+    private boolean simpleQuoteFlag = false;
+
+    /**
+     * 车辆类型标识(通过浏览器URL正则匹配)
+     */
+    private String vehicleTypeFlag;
+
+    /**
+     * 实际价值,默认0
+     */
+    private String actualValue = "0";
+
+    /**
+     * 争议解决方式代码
+     */
+    private String argueSolution;
+
+    /**
+     * 仲裁委员会代码
+     */
+    private String arbitBoardcode;
+
+    /**
+     * 仲裁委员会名称
+     */
+    private String arbitBoardname;
+
+    /**
+     * 验车状态
+     */
+    private String carCheckStatus;
+
+    /**
+     * 验车时间
+     */
+    private String carCheckTime;
+
+    /**
+     * 验车人
+     */
+    private String carChecker;
+
+    /**
+     * 补录时间
+     */
+    private String complementTime;
+
+    /**
+     * 购车发票日期
+     */
+    private String carInvoiceDate;
+
+    /**
+     * 车辆注册标识
+     */
+    private String carRegiste;
+
+    /**
+     * 证件日期
+     */
+    private String certificateDate;
+
+    /**
+     * 证件号码
+     */
+    private String certificateNo;
+
+    /**
+     * 证件类型
+     */
+    private String certificateType;
+
+    /**
+     * 颜色代码
+     */
+    private String colorCode;
+
+    /**
+     * 异地车辆标识
+     */
+    private String ecdemicVehicle;
+
+    /**
+     * 能源类型
+     */
+    private String energyType;
+
+    /**
+     * 燃料类型
+     */
+    private String fuelType;
+
+    /**
+     * 其他燃气类型描述
+     */
+    private String otherGasTypeDesc;
+
+    /**
+     * 纯电续航里程
+     */
+    private String pureElectricRange;
+
+    /**
+     * 发动机号
+     */
+    private String engineNo;
+
+    /**
+     * 初登日期(格式:yyyy-MM-dd HH:mm:ss)
+     */
+    private String enrollDate;
+
+    /**
+     * 排量
+     */
+    private String exhaustScale;
+
+    /**
+     * 首年日期
+     */
+    private String firstyearDate;
+
+    /**
+     * 车架号
+     */
+    private String frameNo;
+
+    /**
+     * 车架号
+     */
+    private String vinNo;
+
+    /**
+     * 是否涉农标识
+     */
+    private String isAboutAgri;
+
+    /**
+     * 车牌颜色代码
+     */
+    private String licenseColorCode;
+
+    /**
+     * 车辆能源类型
+     */
+    private String syriskCode = "DEJ";
+
+    /**
+     * 车牌号
+     */
+    private String licenseNo;
+
+    /**
+     * 车牌类型
+     */
+    private String licenseType;
+
+    /**
+     * 打印使用性质代码
+     */
+    private String printUseNatureCode;
+
+    /**
+     * 贷款购车标识
+     */
+    private String loanVehicleFlag;
+
+    /**
+     * 制造厂
+     */
+    private String madeFactory;
+
+    /**
+     * 车型代码
+     */
+    private String modelCode;
+
+    /**
+     * 车型名称
+     */
+    private String modelName;
+
+    /**
+     * 网约车标识
+     */
+    private String net;
+
+    /**
+     * 新车标识
+     */
+    private String newVehicle;
+
+    /**
+     * 无牌标识
+     */
+    private String noLicenseFlag;
+
+    /**
+     * 告知类型
+     */
+    private String noticeType;
+
+    /**
+     * 功率
+     */
+    private String powerScale;
+
+    /**
+     * 最高车速
+     */
+    private String maxSpeed;
+
+    /**
+     * 拖挂车保单号
+     */
+    private String tractorTrailerPolicyNo;
+
+    /**
+     * 地区系数
+     */
+    private String areaFactor;
+
+    /**
+     * 购买价格
+     */
+    private String purchasePrice;
+
+    /**
+     * 行驶区域代码
+     */
+    private String runAreaCode;
+
+    /**
+     * 行驶里程
+     */
+    private String runMiles;
+
+    /**
+     * 销售渠道
+     */
+    private String salesChannel;
+
+    /**
+     * 核定座位数
+     */
+    private String seatCount;
+
+    /**
+     * 限行标识
+     */
+    private String restricFlag;
+
+    /**
+     * 特殊车辆标识
+     */
+    private String specialCarFlag;
+
+    /**
+     * 吨位
+     */
+    private String tonCount;
+
+    /**
+     * 载质量/牵引质量
+     */
+    private String haulage;
+
+    /**
+     * 费率分级
+     */
+    private String rateClassification;
+
+    /**
+     * 过户标识
+     */
+    private String chgOwnerFlag;
+
+    /**
+     * 过户车辆类型
+     */
+    private String transferVehicleType;
+
+    /**
+     * 过户日期
+     */
+    private String transferDate;
+
+    /**
+     * 行驶证发证日期
+     */
+    private String travelIssueDate;
+
+    /**
+     * 行驶证车型号
+     */
+    private String travelVehicleModel;
+
+    /**
+     * 车辆类型别名
+     */
+    private String carTypeAlias;
+
+    /**
+     * 使用性质代码(如:家庭自用)
+     */
+    private String useNatureCode;
+
+    /**
+     * 使用年数
+     */
+    private int userYear;
+
+    /**
+     * 使用月数
+     */
+    private int useMonth;
+
+    /**
+     * 车辆品牌
+     */
+    private String vehicleBrand;
+
+    /**
+     * 车辆类别
+     */
+    private String vehicleCategory;
+
+    /**
+     * 续保标识,默认0
+     */
+    private String renewalFlag = "0";
+
+    /**
+     * 车辆种类代码(如:11 客车)
+     */
+    private String carKindCode;
+
+    /**
+     * 车辆混合动力代码
+     */
+    private String vehicleHyCode;
+
+    /**
+     * 进口标识
+     */
+    private String importFlag;
+
+    /**
+     * 品牌代码
+     */
+    private String brandCode;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 销售公司
+     */
+    private String saleCompany;
+
+    /**
+     * 销售区域代码
+     */
+    private String saleAreaCode;
+
+    /**
+     * 4S店标识
+     */
+    private String sale4SFlag;
+
+    /**
+     * 防盗标志
+     */
+    private String alarmFlag;
+
+    /**
+     * 气囊数量
+     */
+    private int airbagNum;
+
+    /**
+     * 变速器类型
+     */
+    private String derailleurType;
+
+    /**
+     * 上市年份
+     */
+    private String marketYear;
+
+    /**
+     * 风险标志
+     */
+    private String riskFlag;
+
+    /**
+     * 车辆精油信息
+     */
+    private DaDiVehicleChannelInfoResponse.VehicleJingyou vehicleJingyou;
+
+    /**
+     * 行业车型代码
+     */
+    private String industryModelCode;
+
+    /**
+     * 行业车辆代码
+     */
+    private String industryVehicleCode;
+
+    /**
+     * 行业车辆名称
+     */
+    private String industryVehicleName;
+
+    /**
+     * 车辆类别代码
+     */
+    private String vehicleClassCode;
+
+    /**
+     * 车辆类别名称
+     */
+    private String vehicleClassName;
+
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+
+    /**
+     * 车辆名称
+     */
+    private String vehicleName;
+
+    /**
+     * 保单类别
+     */
+    private String poCategory;
+
+    /**
+     * 新车分类
+     */
+    private String newVehicleClass;
+
+    /**
+     * 家族名称
+     */
+    private String familyName;
+
+    /**
+     * 特殊车辆标识
+     */
+    private String specialVehicleFlag;
+
+    /**
+     * 海外车辆标识
+     */
+    private String overseasVehicleFlag;
+
+    /**
+     * 生效日期
+     */
+    private String effectiveDate;
+
+    /**
+     * 代理人代码
+     */
+    private String producerCode;
+
+    /**
+     * 机构代码
+     */
+    private String orgCode;
+
+    /**
+     * 车辆种类代码
+     */
+    private String vehicleKindCode;
+
+    /**
+     * 地区代码
+     */
+    private String regionCode;
+
+
+    public DaDiVehicleModelRequest(CarInfoVo carInfo, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO, DaDiAgentInfoResponse agentInfo, DaDiVehiclePricResponse vehiclePricVo) {
+        // === 车辆基础信息 ===
+        this.frameNo = carInfo.getVinNo();
+        this.vinNo = carInfo.getVinNo();
+        this.engineNo = carInfo.getEngineNo();
+        this.licenseNo = carInfo.getLicenseNo();
+        this.licenseColorCode = DaDiVehicleUtils.getCarSyriskCode(carInfo)[0];
+        this.licenseType = carInfo.getLicenseKindCode();
+        this.syriskCode = DaDiVehicleUtils.getCarSyriskCode(carInfo)[2];
+        this.enrollDate = carInfo.getRegisterDate();
+        this.effectiveDate = DateUtil.getCurrentDate(1);
+        // === 使用信息 ===
+        this.userYear = DaDiVehicleUtils.getCalcUseYears(carInfo)[0];
+        this.useMonth = DaDiVehicleUtils.getCalcUseYears(carInfo)[1];
+        this.useNatureCode = DaDiVehicleUtils.getCarNatureCode(carInfo);
+        // === 车辆类别 ===
+        this.vehicleCategory = carInfo.getCarTypeCode();
+        this.carKindCode = DaDiVehicleUtils.getCarKindCode(carInfo);
+        // === 过户信息 ===
+        String[] transferInfo = DaDiVehicleUtils.getTransferInfo(carInfo);
+        this.chgOwnerFlag = transferInfo[0];
+        this.transferVehicleType = transferInfo[2];
+        this.transferDate = transferInfo[1];
+        // === 车辆配置(来自carInfo) ===
+        this.haulage = carInfo.getLimitLoad();
+        this.powerScale = carInfo.getPowerScale();
+        this.energyType = carInfo.getModelEnergyType();
+        this.colorCode = "11";
+        // === 车辆配置(来自vehicleModelVO) ===
+        if (vehicleModelVO != null) {
+            this.vehicleTypeFlag = "1";
+            this.specialCarFlag = transferInfo[3];
+            this.vehicleBrand = vehicleModelVO.getVehicleBrand();
+            this.brandName = vehicleModelVO.getVehicleBrand();
+            this.modelCode = vehicleModelVO.getModelCode();
+            this.modelName = vehicleModelVO.getModelName();
+            this.travelVehicleModel = vehicleModelVO.getModelName();
+            this.carTypeAlias = vehicleModelVO.getModelName();
+            this.seatCount = String.valueOf(vehicleModelVO.getSeatCount());
+            this.tonCount = String.valueOf(vehicleModelVO.getTonCount());
+            this.exhaustScale = String.valueOf(vehicleModelVO.getExhaustScale());
+            this.purchasePrice = String.valueOf(vehicleModelVO.getPurchasePrice());
+            this.net = String.valueOf(vehicleModelVO.getNet());
+            this.importFlag = DaDiVehicleUtils.getImportFlag(vehicleModelVO.getImportFlag());
+            this.newVehicleClass = vehicleModelVO.getNewVehicleClass();
+            this.familyName = vehicleModelVO.getFamilyName();
+            // === 车辆附加属性(来自vehicleModelVO) ===
+            this.alarmFlag = vehicleModelVO.getAlarmFlag();
+            this.airbagNum = vehicleModelVO.getAirbagNum();
+            this.derailleurType = vehicleModelVO.getDerailleurType();
+            this.marketYear = vehicleModelVO.getMarketYear();
+            this.riskFlag = vehicleModelVO.getRiskFlag();
+            this.vehicleJingyou = vehicleModelVO.getVehicleJingyou();
+            this.vehicleName = vehicleModelVO.getModelName();
+            // === 车辆精油信息(来自vehicleModelVO.vehicleJingyou) ===
+            DaDiVehicleChannelInfoResponse.VehicleJingyou jingyou = vehicleModelVO.getVehicleJingyou();
+            if (jingyou != null) {
+                this.brandCode = jingyou.getBrandCode();
+                this.brandName = jingyou.getBrandName();
+                this.familyName = jingyou.getFamilyName();
+                this.industryModelCode = jingyou.getIndustryModelCode();
+                this.industryVehicleCode = jingyou.getIndustryVehicleCode();
+                this.industryVehicleName = jingyou.getIndustryVehicleName();
+                this.vehicleClassCode = jingyou.getVehicleClassCode();
+                this.vehicleClassName = jingyou.getVehicleClassName();
+                this.vehicleType = jingyou.getVehicleType();
+                this.vehicleName = jingyou.getVehicleName();
+                this.fuelType = jingyou.getPowerTypeCode();
+            }
+        } else {
+            this.vehicleBrand = carInfo.getBrandName();
+            this.brandName = carInfo.getBrandName();
+            this.modelCode = carInfo.getCarModelNo();
+            this.seatCount = carInfo.getSeatCount();
+            this.tonCount = carInfo.getTonCount();
+            this.exhaustScale = carInfo.getDisplacement();
+            this.purchasePrice = carInfo.getPurchasePrice();
+        }
+        this.vehicleKindCode = vehiclePricVo.getVehicleKindCode();
+        // === 证件信息 ===
+        this.travelIssueDate = carInfo.getIssueDate();
+        // === 业务标志 ===
+        this.loanVehicleFlag = carInfo.isLoanStatus() ? "1" : "0";
+        this.noLicenseFlag = "0";
+        this.renewalFlag = "0";
+        this.actualValue = vehiclePricVo.getActualValue();
+        this.regionCode = vehiclePricVo.getRegionCode();
+        this.poCategory = "K01";
+        // === 默认值(与大地接口对齐) ===
+        this.argueSolution = "01";
+        this.carCheckStatus = "0";
+        this.carRegiste = "0";
+        this.ecdemicVehicle = "0";
+        this.isAboutAgri = "0";
+        // === 代理信息 ===
+        this.comCode = agentInfo.getAgentCode();
+        this.userCode = agentInfo.getUserCode();
+        this.orgCode = vehiclePricVo.getOrgCode();
+    }
+}

+ 136 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehiclePricRequest.java

@@ -0,0 +1,136 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiVehicleChannelInfoResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 车辆定价请求
+ * @date 2026/5/22 17:20
+ */
+@Data
+@NoArgsConstructor
+public class DaDiVehiclePricRequest extends DaDiBaseRequest {
+
+    /**
+     * 生效日期
+     */
+    private String effectiveDate;
+
+    /**
+     * 注册日期
+     */
+    private String enrollDate;
+
+    /**
+     * 初登日期
+     */
+    private String firstyearDate;
+
+    /**
+     * 新车购置价
+     */
+    private double purchasePrice;
+
+    /**
+     * 座位数
+     */
+    private String seatCount;
+
+    /**
+     * 吨位
+     */
+    private String tonCount;
+
+    /**
+     * 使用性质编码
+     */
+    private String useNatureCode;
+
+    /**
+     * 车辆种类编码
+     */
+    private String carKindCode;
+
+    /**
+     * 车辆附件
+     */
+    private String vehicleAccessorys;
+
+    /**
+     * 是否过户
+     */
+    private String chgOwnerFlag;
+
+    /**
+     * 品牌名称
+     */
+    private String brandName;
+
+    /**
+     * 进口标志
+     */
+    private String importFlag;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 地区编码
+     */
+    private String regionCode;
+
+    /**
+     * 燃料种类
+     */
+    private String gasType;
+
+
+    public DaDiVehiclePricRequest(CarInfoVo carInfo, DaDiVehicleChannelRequest daDiVehicleChannelRequest, DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO) {
+
+        // === 日期信息 ===
+        // 生效日期(次日)
+        setEffectiveDate(LocalDate.now().plusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+        // 注册日期
+        setEnrollDate(carInfo.getRegisterDate());
+        // 初登日期
+        setFirstyearDate("");
+
+        // === 车辆配置 ===
+        DaDiVehicleChannelInfoResponse.VehicleJingyou vehicleJingyou = vehicleModelVO.getVehicleJingyou();
+        setPurchasePrice(Double.parseDouble(vehicleJingyou.getPurchasePrice()));
+        setSeatCount(vehicleJingyou.getSeat());
+        setTonCount(vehicleJingyou.getTonnage());
+
+        // === 使用与分类 ===
+        setUseNatureCode(DaDiVehicleUtils.getCarNatureCode(carInfo));
+        setCarKindCode(DaDiVehicleUtils.getCarKindCode(carInfo));
+
+        // === 过户标识 ===
+        setChgOwnerFlag(DaDiVehicleUtils.getTransferInfo(carInfo)[0]);
+
+        // === 车辆品牌与进/国产 ===
+        setBrandName(vehicleJingyou.getBrandName());
+        setImportFlag(DaDiVehicleUtils.getImportFlag(vehicleModelVO.getImportFlag()));
+
+        // === 用户与公司代码(继承自DaDiBaseRequest) ===
+        setUserCode(daDiVehicleChannelRequest.getUserCode());
+        setComCode(daDiVehicleChannelRequest.getComCode());
+
+        if (DaDiVehicleUtils.getCarSyriskCode(carInfo)[2].equals("DEN")) {
+            setProductCode("DEN");
+            setRegionCode("140000");
+            setGasType(vehicleJingyou.getPowerTypeCode());
+        }
+
+    }
+}

+ 170 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDivehicleOwnerInfoRequest.java

@@ -0,0 +1,170 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 车主信息请求
+ * @date 2026/5/23 15:41
+ */
+@Data
+@NoArgsConstructor
+public class DaDivehicleOwnerInfoRequest {
+
+    /**
+     * 客户类型
+     */
+    private String custType;
+
+    /**
+     * 地址
+     */
+    private String address;
+
+    /**
+     * 年龄
+     */
+    private Integer age;
+
+    /**
+     * 地区编码
+     */
+    private String areaCode;
+
+    /**
+     * 地区详情
+     */
+    private String areaDetail;
+
+    /**
+     * 出生日期
+     */
+    private String birthday;
+
+    /**
+     * 性别(1-男 2-女)
+     */
+    private String gender;
+
+    /**
+     * ID
+     */
+    private String id;
+
+    /**
+     * 证件号码
+     */
+    private String identityNo;
+
+    /**
+     * 证件类型
+     */
+    private String identityType;
+
+    /**
+     * 证件长期有效标识(1-长期有效 0-非长期)
+     */
+    private String identifyLongTerm;
+
+    /**
+     * 证件有效期起始日
+     */
+    private String identifyStartDate;
+
+    /**
+     * 证件有效期截至日
+     */
+    private String identifyEndDate;
+
+    /**
+     * 姓名
+     */
+    private String name;
+
+    /**
+     * 国籍
+     */
+    private String nationality;
+
+    /**
+     * 性质
+     */
+    private String nature;
+
+    /**
+     * 职业
+     */
+    private String occupation;
+
+    /**
+     * 手机号
+     */
+    private String phoneNo;
+
+    /**
+     * 邮编
+     */
+    private String postCode;
+
+    /**
+     * 单位类型
+     */
+    private String unitType;
+
+    /**
+     * 车辆ID
+     */
+    private String vehicleId;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+
+    public DaDivehicleOwnerInfoRequest(QuoteVo quoteVo) {
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+
+        // === 客户类型 ===
+        this.custType = "01";
+
+        // === 车主信息 ===
+        this.name = ownersInfo.getName();
+        this.age = ownersInfo.getAge();
+        this.gender = "女".equals(ownersInfo.getGender()) ? "2" : "1";
+        this.birthday = ownersInfo.getBirthday() != null ? ownersInfo.getBirthday() : "";
+
+        // === 地址信息 ===
+        this.address = ownersInfo.getAddr();
+        this.areaCode = ownersInfo.getCountyCode();
+        this.areaDetail = ownersInfo.getProvince() + ownersInfo.getCity() + ownersInfo.getCounty();
+
+        // === 证件信息 ===
+        this.identityNo = ownersInfo.getIdentifyNumber();
+        this.identityType = "111";
+        this.identifyStartDate = ownersInfo.getIdentifyValidDate();
+        this.identifyEndDate = ownersInfo.getIdentifyValidEndDate();
+        this.identifyLongTerm = StringUtils.hasLength(ownersInfo.getIdentifyValidEndDate())
+                && ownersInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+
+        // === 国籍与身份 ===
+        this.nationality = "CHN";
+        this.nature = "";
+        this.occupation = "";
+        this.unitType = "";
+
+        // === 联系方式 ===
+        this.phoneNo = ownersInfo.getMobile();
+        this.postCode = "";
+        this.email = ownersInfo.getEmail() != null ? ownersInfo.getEmail() : "";
+
+        // === 其他 ===
+        this.id = "";
+        this.vehicleId = "";
+    }
+}

+ 19 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiCurTaskRequest.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/27 18:42
+ */
+@Data
+@NoArgsConstructor
+public class DadiCurTaskRequest extends DaDiBaseRequest {
+
+    public DadiCurTaskRequest(String comCode, String userCode, String agentCode) {
+        super(comCode, userCode, agentCode);
+    }
+}

+ 446 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInsuredInfoRequest.java

@@ -0,0 +1,446 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiCurTaskResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiQuoteResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 被保险人信息请求
+ * @date 2026/5/23 15:52
+ */
+@Data
+@NoArgsConstructor
+public class DadiInsuredInfoRequest {
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 投保人信息
+     */
+    private DaDiApplicantInfoRequest applicant;
+
+    /**
+     * 被保人信息
+     */
+    private DaDiApplicantInfoRequest insured;
+
+    /**
+     * 其余选项
+     */
+    private RestOptions restOptions;
+
+    /**
+     * 续保标志 1-续保 0-非续保
+     */
+    private String renewalFlag;
+
+    /**
+     * 报价请求
+     */
+    private QuoteRequest quoteRequest;
+
+    /**
+     * 是否车辆X
+     */
+    private String isVehicleX;
+
+    /**
+     * 公司代码
+     */
+    private String comCode;
+
+    /**
+     * 用户代码
+     */
+    private String userCode;
+
+    /**
+     * 开票信息
+     */
+    private DadiInvoiceRequest invoice;
+
+
+    /**
+     * 其余选项
+     */
+    @Data
+    @NoArgsConstructor
+    public static class RestOptions {
+
+        /**
+         * 是否电子投保 1-是
+         */
+        private String needElectronicProposal;
+
+        /**
+         * CLS等级
+         */
+        private String clsLevel;
+
+        public RestOptions(String needElectronicProposal, String clsLevel) {
+            this.needElectronicProposal = needElectronicProposal;
+            this.clsLevel = clsLevel;
+        }
+    }
+
+
+    public DadiInsuredInfoRequest(QuoteVo quoteVo, String orderId,
+                                  QuoteRequest quoteRequest,
+                                  String comCode, String userCode) {
+        DaDiApplicantInfoRequest applicant = new DaDiApplicantInfoRequest(quoteVo.getPolicyHolderInfo());
+        DaDiApplicantInfoRequest insured = new DaDiApplicantInfoRequest(quoteVo.getInsuredPersonInfo());
+        DadiInvoiceRequest invoice = new DadiInvoiceRequest(quoteVo);
+        this.orderId = orderId;
+        this.applicant = applicant;
+        this.insured = insured;
+        this.restOptions = new RestOptions("1", "");
+        this.renewalFlag = "0";
+        this.quoteRequest = quoteRequest;
+        this.isVehicleX = "0";
+        this.comCode = comCode;
+        this.userCode = userCode;
+        this.invoice = invoice;
+    }
+
+    /**
+     * 报价请求
+     */
+    @Data
+    @NoArgsConstructor
+    public static class QuoteRequest {
+
+        /**
+         * 开关(如商业险产品编码、交强险产品编码)
+         */
+        private Map<String, Integer> switchs;
+
+        /**
+         * 当前任务进度
+         */
+        private DaDiCurTaskResponse curTaskProgress;
+
+        /**
+         * 中银车评分
+         */
+        private String ccicVehicleScore;
+
+        /**
+         * 智能评分
+         */
+        private String smartscore;
+
+        /**
+         * 商业险折扣率
+         */
+        private String cdiscountrate;
+
+        /**
+         * 智能评分详情
+         */
+        private String smartscoredetails;
+
+        /**
+         * 车信评分
+         */
+        private String xcarscore;
+
+        /**
+         * 商业险历年出险记录
+         */
+        private List<Object> businessLastClaims;
+
+        /**
+         * 佣金信息
+         */
+        private Object commission;
+
+        /**
+         * 累计佣金信息
+         */
+        private Object accCommission;
+
+        /**
+         * 浮动系数
+         */
+        private Object floating;
+
+        /**
+         * 计划编码
+         */
+        private String planCode;
+
+        /**
+         * 报价次数统计
+         */
+        private Object quoteCount;
+
+        /**
+         * 交强险历年出险记录
+         */
+        private List<Object> trafficLastClaims;
+
+        /**
+         * 用户代码
+         */
+        private String userCode;
+
+        /**
+         * 来源
+         */
+        private String source;
+
+        /**
+         * 充电桩/车辆计费信息
+         */
+        private List<Object> vehicleChargings;
+
+        /**
+         * 是否重置
+         */
+        private Boolean reset;
+
+        /**
+         * 是否计算实际价值
+         */
+        private Boolean calculateActualValue;
+
+        /**
+         * 更新实际价值
+         */
+        private String updateActualValue;
+
+        /**
+         * 是否推荐车损险保额
+         */
+        private String isRecommendVehLossInsured;
+
+        /**
+         * 渠道信息
+         */
+        private DaDiVehicleChannelRequest channel;
+
+        /**
+         * 订单ID
+         */
+        private String orderId;
+
+        /**
+         * 是否标准
+         */
+        private String isStandard;
+
+        /**
+         * 车慧达评分等级
+         */
+        private String cheHuiDaGrade;
+
+        /**
+         * 小货车评分
+         */
+        private String buggyTrancheNew;
+
+        /**
+         * 跟货车有关参数
+         */
+        private String kgIndex;
+
+        /**
+         * cbit评分
+         */
+        private String cbitScore;
+
+        /**
+         * 上年保费
+         */
+        private String lastPremium;
+
+        /**
+         * 评分
+         */
+        private String score;
+
+        /**
+         * 货车评分档次
+         */
+        private String carloadTranche;
+
+        /**
+         * 货车评分
+         */
+        private String carloadScore;
+
+        /**
+         * 全国评分
+         */
+        private String fTNationalScore;
+
+        /**
+         * 投保查询消息
+         */
+        private DaDiQuoteResponse.InsureQueryMessageDTO insureQueryMessage;
+
+        /**
+         * 是否推广
+         */
+        private Object isPromotion;
+
+        /**
+         * 权益列表
+         */
+        private List<Object> equityList;
+
+        /**
+         * 投保方案
+         */
+        private DaDiQuoteResponse.InsurancePlanDTO insurancePlan;
+
+        /**
+         * 车主信息
+         */
+        private DaDivehicleOwnerInfoRequest owner;
+
+        /**
+         * 车辆验车信息
+         */
+        private DaDiVehicleModelRequest vehicleCheck;
+
+        /**
+         * 核验信息
+         */
+        private List<DaDiQuoteResponse.ChecksDTO> checks;
+
+        /**
+         * 公司代码
+         */
+        private String comCode;
+
+        /**
+         * 交强险产品编码
+         */
+        private String jqProductCode;
+
+        /**
+         * 商业险产品编码
+         */
+        private String syProductCode;
+
+        public QuoteRequest(QuoteVo quoteVo, DaDiCurTaskResponse daDiCurTaskResponse,
+                            DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleChannelRequest channel, DaDiVehicleModelRequest carModelRequest,
+                            String orderId) {
+
+            CarInfoVo carInfo = quoteVo.getCarInfoVo();
+
+            DaDivehicleOwnerInfoRequest owner = new DaDivehicleOwnerInfoRequest(quoteVo);
+
+            // === 开关 ===
+            this.switchs = new HashMap<>();
+            this.switchs.put(DaDiVehicleUtils.getCarSyriskCode(carInfo)[2], 1);
+            this.switchs.put("DFA", 1);
+
+            // === 当前任务进度 ===
+            this.curTaskProgress = daDiCurTaskResponse;
+
+            // === 评分信息(来自报价响应) ===
+            this.ccicVehicleScore = daDiQuoteResponse.getCcicVehicleScore();
+            this.smartscore = daDiQuoteResponse.getSmartscore();
+            this.cdiscountrate = daDiQuoteResponse.getCdiscountrate();
+            this.smartscoredetails = daDiQuoteResponse.getSmartscoredetails();
+            this.xcarscore = daDiQuoteResponse.getXcarscore();
+
+            // === 出险记录 ===
+            this.businessLastClaims = nullToEmptyList(daDiQuoteResponse.getBusinessLastClaims());
+            this.trafficLastClaims = nullToEmptyList(daDiQuoteResponse.getTrafficLastClaims());
+
+            // === 佣金与浮动 ===
+            this.commission = daDiQuoteResponse.getCommission();
+            this.accCommission = nullToEmptyMap(daDiQuoteResponse.getAccCommission());
+            this.floating = nullToEmptyMap(daDiQuoteResponse.getFloating());
+
+            // === 计划编码 ===
+            this.planCode = "s";
+
+            // === 报价次数 ===
+            this.quoteCount = nullToEmptyMap(daDiQuoteResponse.getQuoteCount());
+
+            // === 用户代码与来源 ===
+            this.userCode = "";
+            this.source = "";
+
+            // === 车辆计费 ===
+            this.vehicleChargings = new ArrayList<>();
+
+            // === 标志位 ===
+            this.reset = true;
+            this.calculateActualValue = false;
+            this.updateActualValue = carModelRequest.getActualValue();
+            this.isRecommendVehLossInsured = "";
+
+            // === 渠道信息 ===
+            this.channel = channel;
+
+            // === 订单ID ===
+            this.orderId = orderId;
+
+            // === 是否标准 ===
+            this.isStandard = "1";
+
+            // === 评分相关 ===
+            this.cheHuiDaGrade = "";
+            this.buggyTrancheNew = "";
+            this.kgIndex = "";
+            this.cbitScore = daDiQuoteResponse.getCbitScore();
+            this.lastPremium = "";
+            this.score = "";
+            this.carloadTranche = "";
+            this.carloadScore = "";
+            this.fTNationalScore = "";
+
+            // === 投保消息 ===
+            this.insureQueryMessage = daDiQuoteResponse.getInsureQueryMessage();
+
+            // === 推广与权益 ===
+            this.isPromotion = daDiQuoteResponse.getIsPromotion();
+            this.equityList = new ArrayList<>();
+
+            // === 投保方案 ===
+            this.insurancePlan = daDiQuoteResponse.getInsurancePlan();
+
+            // === 人员与车辆信息 ===
+            this.owner = owner;
+            this.vehicleCheck = carModelRequest;
+
+            // === 核验信息 ===
+            this.checks = new ArrayList<>();
+
+            // === 公司代码 ===
+            this.comCode = channel != null ? channel.getComCode() : "";
+
+            // === 产品编码 ===
+            this.jqProductCode = "DFA";
+            this.syProductCode = DaDiVehicleUtils.getCarSyriskCode(carInfo)[2];
+        }
+
+        private static List<Object> nullToEmptyList(List<Object> list) {
+            return list != null ? list : new ArrayList<>();
+        }
+
+        private static Object nullToEmptyMap(Object obj) {
+            return obj != null ? obj : new HashMap<>();
+        }
+    }
+
+}

+ 146 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInvoiceRequest.java

@@ -0,0 +1,146 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 发票信息请求
+ * @date 2026/5/23 15:53
+ */
+@Data
+@NoArgsConstructor
+public class DadiInvoiceRequest {
+
+    // ==================== 发票基本信息 ====================
+
+    /**
+     * 是否需要电子发票(1-需要)
+     */
+    private String isNeedInvoice;
+
+    /**
+     * 发票类型(1:专票 2:普票 3:电子普票 4:其他 5:数电专票 6:数电普票)
+     */
+    private String invoiceType;
+
+    /**
+     * 发票抬头
+     */
+    private String invoiceTitle;
+
+    /**
+     * 发票关系(1-同投保人)
+     */
+    private String invoiceRelation;
+
+    /**
+     * 客户类型(1:境内个人/政府/事业单位 2:境内企业 3:境外个人或机构)
+     */
+    private String clientType;
+
+    /**
+     * 公司名称类型
+     */
+    private String companyNameType;
+
+    // ==================== 税务信息 ====================
+
+    /**
+     * 纳税类型(1:一般纳税人 2:小规模 3:非增值税 4:个人 5:单位)
+     */
+    private String taxPayerType;
+
+    /**
+     * 纳税人识别号
+     */
+    private String taxPayerIdentification;
+
+    /**
+     * 纳税公司名称
+     */
+    private String taxCompanyName;
+
+    /**
+     * 纳税注册地址
+     */
+    private String taxRegistryAddress;
+
+    /**
+     * 纳税注册电话
+     */
+    private String taxRegistryPhone;
+
+    // ==================== 银行信息 ====================
+
+    /**
+     * 银行账户
+     */
+    private String bankAccount;
+
+    /**
+     * 银行代理编码
+     */
+    private String bankAgentCode;
+
+    /**
+     * 银行代理名称
+     */
+    private String bankAgentName;
+
+    /**
+     * 银行支行编码
+     */
+    private String bankBranchesCode;
+
+    /**
+     * 银行支行名称
+     */
+    private String bankBranchesName;
+
+    // ==================== 联系方式 ====================
+
+    /**
+     * 手机号
+     */
+    private String phoneNo;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    public DadiInvoiceRequest(QuoteVo quoteVo) {
+        CustomerInfoVo info = quoteVo.getPolicyHolderInfo();
+
+        // === 发票基本信息 ===
+        this.isNeedInvoice = "1"; //是否需要电子发票(1-需要)
+        this.invoiceType = "6"; //发票类型  1: "增值税专用发票 "2: "增值税普通发票",3: "增值税电子普通发票",4: "其他发票",5: "数电专票",6: "数电普票"
+        this.invoiceTitle = info.getName();
+        this.invoiceRelation = "1";
+        this.clientType = "1";
+        this.companyNameType = "";
+
+        // === 税务信息 ===
+        this.taxPayerType = "4"; //纳税类型 taxPayerType: 1: "一般纳税人 ",2: "小规模纳税人",3: "非增值税纳税人",4: "个人",5: "单位"
+        this.taxPayerIdentification = info.getIdentifyNumber();
+        this.taxCompanyName = "";
+        this.taxRegistryAddress = "";
+        this.taxRegistryPhone = "";
+
+        // === 银行信息 ===
+        this.bankAccount = "";
+        this.bankAgentCode = "";
+        this.bankAgentName = "";
+        this.bankBranchesCode = "";
+        this.bankBranchesName = "";
+
+        // === 联系方式 ===
+        this.phoneNo = info.getMobile();
+        this.email = info.getEmail() != null ? info.getEmail() : "";
+    }
+
+}

+ 288 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiSaveInfoRequest.java

@@ -0,0 +1,288 @@
+package com.jzg.quotation.dadi.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiQuoteResponse;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 保存补充信息请求参数
+ * @date 2026/5/27 14:51
+ */
+@Data
+@NoArgsConstructor
+public class DadiSaveInfoRequest {
+
+    /**
+     * 大地车信评分
+     */
+    private String ccicVehicleScore;
+
+    /**
+     * 智能评分
+     */
+    private String smartscore;
+
+    /**
+     * 商业险折扣率
+     */
+    private String cdiscountrate;
+
+    /**
+     * 智能评分详情
+     */
+    private String smartscoredetails;
+
+    /**
+     * 车信评分
+     */
+    private String xcarscore;
+
+    /**
+     * 商业险历年出险记录
+     */
+    private List<Object> businessLastClaims = new ArrayList<>();
+
+    /**
+     * 佣金信息
+     */
+    private Object commission;
+
+    /**
+     * 累计佣金信息
+     */
+    private Object accCommission = new HashMap<>();
+
+    /**
+     * 浮动系数
+     */
+    private Object floating = new HashMap<>();
+
+    /**
+     * 方案编码
+     */
+    private String planCode;
+
+    /**
+     * 报价次数统计
+     */
+    private Object quoteCount = new HashMap<>();
+
+    /**
+     * 交强险历年出险记录
+     */
+    private List<Object> trafficLastClaims = new ArrayList<>();
+
+    /**
+     * 用户代码
+     */
+    private String userCode;
+
+    /**
+     * 来源
+     */
+    private String source = "";
+
+    /**
+     * 车辆计费信息
+     */
+    private List<Object> vehicleChargings = new ArrayList<>();
+
+    /**
+     * 是否重置
+     */
+    private Boolean reset = true;
+
+    /**
+     * 是否计算实际价值
+     */
+    private Boolean calculateActualValue = false;
+
+    /**
+     * 更新实际价值
+     */
+    private String updateActualValue;
+
+    /**
+     * 是否推荐车损险保额
+     */
+    private String isRecommendVehLossInsured = "";
+
+    /**
+     * 渠道信息
+     */
+    private DaDiVehicleChannelRequest channel;
+
+    /**
+     * 订单ID
+     */
+    private String orderId;
+
+    /**
+     * 是否标准 "1"-是
+     */
+    private String isStandard = "1";
+
+    /**
+     * 车慧达评分等级
+     */
+    private String cheHuiDaGrade = "";
+
+    /**
+     * 小货车评分
+     */
+    private String buggyTrancheNew = "";
+
+    /**
+     * 跟货车有关参数
+     */
+    private String kgIndex = "";
+
+    /**
+     * cbit评分
+     */
+    private String cbitScore;
+
+    /**
+     * 上年保费
+     */
+    private String lastPremium = "";
+
+    /**
+     * 评分
+     */
+    private String score = "";
+
+    /**
+     * 货车评分档次
+     */
+    private String carloadTranche = "";
+
+    /**
+     * 货车评分
+     */
+    private String carloadScore = "";
+
+    /**
+     * 全国评分
+     */
+    private String fTNationalScore = "";
+
+    /**
+     * 投保查询消息
+     */
+    private DaDiQuoteResponse.InsureQueryMessageDTO insureQueryMessage;
+
+    /**
+     * 是否推广
+     */
+    private Object isPromotion;
+
+    /**
+     * 权益列表
+     */
+    private List<Object> equityList = new ArrayList<>();
+
+    /**
+     * 投保方案列表
+     */
+    private List<DaDiQuoteResponse.InsurancePlanDTO> plans = new ArrayList<>();
+
+    /**
+     * 公司代码
+     */
+    private String comCode;
+
+    /**
+     * 用户名称
+     */
+    private String userName;
+
+    /**
+     * 实际使用年限
+     */
+    private String realUseYear;
+
+    /**
+     * 车辆投保统计
+     */
+    private List<DaDiQuoteResponse.VehicleInsdStatDTODTO> vehicleInsdStatDTO;
+
+    /**
+     * Token
+     */
+    private String token;
+
+    /**
+     * 信易保险计划
+     */
+    private Object xyInsurancePlan = new HashMap<>();
+
+    /**
+     * 组合保险计划
+     */
+    private Object combInsurancePlan = new HashMap<>();
+
+
+    public DadiSaveInfoRequest(QuoteVo quoteVo, DaDiQuoteResponse daDiQuoteResponse, DaDiVehicleChannelRequest daDiVehicleChannelRequest,
+                               DaDiVehicleModelRequest carModelRequest, String orderId, String token) {
+        this.ccicVehicleScore = daDiQuoteResponse.getCcicVehicleScore();
+        this.smartscore = daDiQuoteResponse.getSmartscore();
+        this.cdiscountrate = daDiQuoteResponse.getCdiscountrate();
+        this.smartscoredetails = daDiQuoteResponse.getSmartscoredetails();
+        this.xcarscore = daDiQuoteResponse.getXcarscore();
+        this.businessLastClaims = toListOrEmpty(daDiQuoteResponse.getBusinessLastClaims());
+        this.commission = daDiQuoteResponse.getCommission();
+        this.accCommission = nullToEmpty(daDiQuoteResponse.getAccCommission());
+        this.floating = nullToEmpty(daDiQuoteResponse.getFloating());
+        this.planCode = daDiQuoteResponse.getInsurancePlan() != null ? daDiQuoteResponse.getInsurancePlan().getPlanCode() : null;
+        this.quoteCount = nullToEmpty(daDiQuoteResponse.getQuoteCount());
+        this.trafficLastClaims = toListOrEmpty(daDiQuoteResponse.getTrafficLastClaims());
+        this.userCode = daDiVehicleChannelRequest.getUserCode();
+        this.channel = daDiVehicleChannelRequest;
+        this.updateActualValue = carModelRequest.getActualValue();
+        this.orderId = orderId;
+        this.comCode = daDiVehicleChannelRequest.getComCode();
+        this.userName = daDiVehicleChannelRequest.getBusinessNature2Name();
+        this.token = token;
+        this.cbitScore = daDiQuoteResponse.getCbitScore();
+        this.lastPremium = daDiQuoteResponse.getLastPremium();
+        this.insureQueryMessage = daDiQuoteResponse.getInsureQueryMessage();
+        this.isPromotion = daDiQuoteResponse.getIsPromotion();
+        this.realUseYear = daDiQuoteResponse.getRealUseYear();
+        this.vehicleInsdStatDTO = daDiQuoteResponse.getVehicleInsdStatDTO();
+        this.plans = Collections.singletonList(getInsurancePlan(quoteVo, daDiQuoteResponse));
+    }
+
+    private static <T> List<T> toListOrEmpty(List<T> list) {
+        return list != null ? list : new ArrayList<>();
+    }
+
+    private static Object nullToEmpty(Object obj) {
+        return obj != null ? obj : new HashMap<>();
+    }
+
+
+    @NotNull
+    private static DaDiQuoteResponse.InsurancePlanDTO getInsurancePlan(QuoteVo quoteVo, DaDiQuoteResponse daDiQuoteResponse) {
+        DaDiQuoteResponse.InsurancePlanDTO insurancePlan = daDiQuoteResponse.getInsurancePlan();
+        insurancePlan.setBusinessProductCode(DaDiVehicleUtils.getCarSyriskCode(quoteVo.getCarInfoVo())[2]);
+        insurancePlan.setTrafficProductCode("DFA");
+        DaDiQuoteResponse.InsurancePlanDTO.TaxDTO taxConfig = insurancePlan.getTax();
+        // taxFlag: "T"=正常交税, "E"=免税
+        String taxFlag = "E".equals(taxConfig.getTaxFlag()) ? "E" : "T";
+        taxConfig.setTaxFlag(taxFlag);
+        taxConfig.setDeductiondueCode("E".equals(taxFlag) ? "E" : "");
+        taxConfig.setDeductiondueType("E".equals(taxFlag) ? "E" : "");
+        return insurancePlan;
+    }
+}

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

@@ -0,0 +1,87 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 代理协议查询结果
+ * @date 2026/5/22 16:56
+ */
+@Data
+@NoArgsConstructor
+public class DaDiAgencyAgreementInfoResponse extends DaDiBaseResponse{
+
+    @SerializedName("salesMainMsgDto")
+    private SalesMainMsgDtoDTO salesMainMsgDto;
+    @SerializedName("lifeInsFlag")
+    private String lifeInsFlag;
+
+    @Data
+    @NoArgsConstructor
+    public static class SalesMainMsgDtoDTO {
+
+        @SerializedName("salesAgentMsgDto")
+        private SalesAgentMsgDtoDTO salesAgentMsgDto;
+        @SerializedName("salesAgreementMsgList")
+        private List<SalesAgreementMsgListDTO> salesAgreementMsgList;
+
+        @Data
+        @NoArgsConstructor
+        public static class SalesAgentMsgDtoDTO {
+            @SerializedName("inputDate")
+            private String inputDate;
+            @SerializedName("agentCode")
+            private String agentCode;
+            @SerializedName("agentName")
+            private String agentName;
+            @SerializedName("addressName")
+            private String addressName;
+            @SerializedName("businessNature")
+            private String businessNature;
+            @SerializedName("comCode")
+            private String comCode;
+            @SerializedName("exhibitionNo")
+            private String exhibitionNo;
+            @SerializedName("permitNo")
+            private String permitNo;
+            @SerializedName("phoneNumber")
+            private String phoneNumber;
+            @SerializedName("riskCode")
+            private String riskCode;
+            @SerializedName("orgCode")
+            private String orgCode;
+            @SerializedName("comName")
+            private String comName;
+        }
+
+        @Data
+        @NoArgsConstructor
+        public static class SalesAgreementMsgListDTO {
+            @SerializedName("TCIDefaultTopcommission")
+            private int tCIDefaultTopcommission;
+            @SerializedName("TCITopcommission")
+            private int tCITopcommission;
+            @SerializedName("agreementName")
+            private String agreementName;
+            @SerializedName("agreementNo")
+            private String agreementNo;
+            @SerializedName("comCode")
+            private String comCode;
+            @SerializedName("defaultTopcommission")
+            private int defaultTopcommission;
+            @SerializedName("endDate")
+            private String endDate;
+            @SerializedName("startDate")
+            private String startDate;
+            @SerializedName("topcommission")
+            private int topcommission;
+            @SerializedName("riskCode")
+            private String riskCode;
+        }
+    }
+}

+ 36 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiAgentInfoResponse.java

@@ -0,0 +1,36 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 代理人查询结果
+ * @date 2026/5/22 16:05
+ */
+@Data
+@NoArgsConstructor
+public class DaDiAgentInfoResponse extends DaDiBaseResponse{
+
+    @SerializedName("id")
+    private String id;
+    @SerializedName("userCode")
+    private String userCode;
+    @SerializedName("businessSource")
+    private String businessSource;
+    @SerializedName("agentCode")
+    private String agentCode;
+    @SerializedName("agentName")
+    private String agentName;
+    @SerializedName("permitNo")
+    private String permitNo;
+    @SerializedName("exhibitionNo")
+    private String exhibitionNo;
+    @SerializedName("agencyOrgCode")
+    private String agencyOrgCode;
+    @SerializedName("isDefault")
+    private String isDefault;
+
+}

+ 37 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiBaseResponse.java

@@ -0,0 +1,37 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/4/7 15:45
+ **/
+@Data
+public class DaDiBaseResponse implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8468085174218499877L;
+
+    /**
+     * 响应码
+     */
+    private String code;
+
+    /**
+     * 加密数据
+     */
+    private String data;
+
+    /**
+     * 响应消息
+     */
+    private String msg;
+
+
+    public boolean isSuccess(){
+        return "SUCCESS".equals(msg);
+    }
+}

+ 105 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerAuthenticateResponse.java

@@ -0,0 +1,105 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 登录认证结果
+ * @date 2026/5/22 11:41
+ */
+@Data
+@NoArgsConstructor
+public class DaDiCrawlerAuthenticateResponse extends DaDiBaseResponse {
+
+    @SerializedName("userCode")
+    private String userCode;
+    @SerializedName("userName")
+    private String userName;
+    @SerializedName("company")
+    private String company;
+    @SerializedName("comCName")
+    private String comCName;
+    @SerializedName("makeCompany")
+    private String makeCompany;
+    @SerializedName("makeCompanyCName")
+    private String makeCompanyCName;
+    @SerializedName("mobile")
+    private String mobile;
+    @SerializedName("address")
+    private String address;
+    @SerializedName("email")
+    private String email;
+    @SerializedName("valid")
+    private String valid;
+    @SerializedName("password")
+    private String password;
+    @SerializedName("comRole")
+    private String comRole;
+    @SerializedName("loginFlag")
+    private String loginFlag;
+    @SerializedName("token")
+    private String token;
+    @SerializedName("storeCode")
+    private String storeCode;
+    @SerializedName("handlerCode")
+    private String handlerCode;
+    @SerializedName("handlerName")
+    private String handlerName;
+    @SerializedName("comCode")
+    private String comCode;
+    @SerializedName("comName")
+    private String comName;
+    @SerializedName("channelCode")
+    private String channelCode;
+    @SerializedName("isSaleMan")
+    private String isSaleMan;
+    @SerializedName("recommendCode")
+    private String recommendCode;
+    @SerializedName("rankname")
+    private String rankname;
+    @SerializedName("homePermissionInfo")
+    private String homePermissionInfo;
+    @SerializedName("teamcode")
+    private String teamcode;
+    @SerializedName("comLevel")
+    private String comLevel;
+    @SerializedName("branchCode")
+    private String branchCode;
+    @SerializedName("branchName")
+    private String branchName;
+    @SerializedName("userPhone")
+    private String userPhone;
+    @SerializedName("isTeamLeader")
+    private String isTeamLeader;
+    @SerializedName("openid")
+    private String openid;
+    @SerializedName("unionid")
+    private String unionid;
+    @SerializedName("isTeamAccQuotOpen")
+    private String isTeamAccQuotOpen;
+    @SerializedName("isGroupAccQuotOpen")
+    private String isGroupAccQuotOpen;
+    @SerializedName("isBuildAccQuotOpen")
+    private String isBuildAccQuotOpen;
+    @SerializedName("isEmployerLiabilityQuotOpen")
+    private String isEmployerLiabilityQuotOpen;
+    @SerializedName("thirdComeCode")
+    private String thirdComeCode;
+    @SerializedName("thirdComeName")
+    private String thirdComeName;
+    @SerializedName("areaCode")
+    private String areaCode;
+    @SerializedName("userType")
+    private String userType;
+    @SerializedName("asmtStatus")
+    private String asmtStatus;
+    @SerializedName("idCard")
+    private String idCard;
+    @SerializedName("creditOrgFlag")
+    private String creditOrgFlag;
+    @SerializedName("headPortraitFileName")
+    private String headPortraitFileName;
+}

+ 33 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerCaptchaResponse.java

@@ -0,0 +1,33 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 获取登录验证码 返回参数
+ * @date 2026/5/21 15:58
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DaDiCrawlerCaptchaResponse extends DaDiBaseResponse{
+
+    /**
+     * 验证码图片
+     */
+    private String src;
+
+    /**
+     * 验证码编号
+     */
+    private String randomNum;
+
+    /**
+     * 验证码解析结果
+     */
+    private String solve;
+
+}

+ 26 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCurTaskResponse.java

@@ -0,0 +1,26 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/27 18:47
+ */
+@Data
+@NoArgsConstructor
+public class DaDiCurTaskResponse extends DaDiBaseResponse{
+
+    @SerializedName("targetRatio")
+    private double targetRatio;
+    @SerializedName("realRatioM")
+    private double realRatioM;
+    @SerializedName("targetGap")
+    private int targetGap;
+    @SerializedName("isStandard")
+    private String isStandard;
+
+}

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

@@ -0,0 +1,18 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 11:01
+ */
+@NoArgsConstructor
+@Data
+public class DaDiEleProposalQRCoreDataResponse extends DaDiBaseResponse {
+
+
+
+}

+ 34 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiGetUnderwritingResponse.java

@@ -0,0 +1,34 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地财险】 核保结果
+ * @date 2026/5/27 21:08
+ */
+@NoArgsConstructor
+@Data
+public class DaDiGetUnderwritingResponse extends DaDiBaseResponse {
+
+    @SerializedName("uwResult")
+    private List<DaDiQuoteResponse.UwResultDTO> uwResult;
+    @SerializedName("uwUser")
+    private UwUserDTO uwUser;
+    @SerializedName("uwType")
+    private String uwType;
+    @SerializedName("uwLevel")
+    private String uwLevel;
+    @SerializedName("proposalNos")
+    private List<String> proposalNos;
+
+    @NoArgsConstructor
+    @Data
+    public static class UwUserDTO {
+    }
+}

+ 202 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java

@@ -0,0 +1,202 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:    【大地财险】 获取尊享保障方案结果
+ * @date 2026/5/25 15:52
+ */
+@NoArgsConstructor
+@Data
+public class DaDiJointSalesResponse extends DaDiBaseResponse{
+
+    @SerializedName("accidentInsurance")
+    private List<InsuranceDTO> accidentInsurance;
+    @SerializedName("healthInsurance")
+    private List<InsuranceDTO> healthInsurance;
+    @SerializedName("propertyInsurance")
+    private List<InsuranceDTO> propertyInsurance;
+
+
+    @NoArgsConstructor
+    @Data
+    public static class InsuranceDTO {
+        @SerializedName("formulaGroupCode")
+        private String formulaGroupCode;
+        @SerializedName("formulaGroupName")
+        private String formulaGroupName;
+        @SerializedName("scene")
+        private String scene;
+        @SerializedName("productCode")
+        private String productCode;
+        @SerializedName("secondLine")
+        private String secondLine;
+        @SerializedName("isNingdeEraVehicleBatteryCheck")
+        private String isNingdeEraVehicleBatteryCheck;
+        @SerializedName("jointSalesSolutionVOS")
+        private List<JointSalesSolutionVOSDTO> jointSalesSolutionVOS;
+        @SerializedName("key")
+        private String key;
+
+        @NoArgsConstructor
+        @Data
+        public static class JointSalesSolutionVOSDTO {
+            @SerializedName("planId")
+            private int planId;
+            @SerializedName("strategyId")
+            private int strategyId;
+            @SerializedName("formulaCode")
+            private String formulaCode;
+            @SerializedName("scene")
+            private String scene;
+            @SerializedName("customElement")
+            private String customElement;
+            @SerializedName("formulaName")
+            private String formulaName;
+            @SerializedName("formulaGroupName")
+            private String formulaGroupName;
+            @SerializedName("productCode")
+            private String productCode;
+            @SerializedName("policyNature")
+            private String policyNature;
+            @SerializedName("maxCount")
+            private int maxCount;
+            @SerializedName("minCount")
+            private int minCount;
+            @SerializedName("maxSeatCount")
+            private int maxSeatCount;
+            @SerializedName("minSeatCount")
+            private int minSeatCount;
+            @SerializedName("insuredAgeLower")
+            private int insuredAgeLower;
+            @SerializedName("insuredAgeLowerType")
+            private String insuredAgeLowerType;
+            @SerializedName("insuredAgeUpper")
+            private int insuredAgeUpper;
+            @SerializedName("insurantUpperlimit")
+            private int insurantUpperlimit;
+            @SerializedName("insurantLowerlimit")
+            private int insurantLowerlimit;
+            @SerializedName("insuredAgeUpperType")
+            private String insuredAgeUpperType;
+            @SerializedName("premium")
+            private int premium;
+            @SerializedName("amount")
+            private int amount;
+            @SerializedName("carNature")
+            private String carNature;
+            @SerializedName("familyInsuredCountLimit")
+            private String familyInsuredCountLimit;
+            @SerializedName("brandRange")
+            private String brandRange;
+            @SerializedName("isRenew")
+            private String isRenew;
+            @SerializedName("masterInsuredPersonFlag")
+            private String masterInsuredPersonFlag;
+            @SerializedName("modelCateCode")
+            private String modelCateCode;
+            @SerializedName("buizProductCode")
+            private String buizProductCode;
+            @SerializedName("customerLevel")
+            private String customerLevel;
+            @SerializedName("channelCode")
+            private String channelCode;
+            @SerializedName("prdPlanDefId")
+            private String prdPlanDefId;
+            @SerializedName("jointSalesSolutionItems")
+            private List<JointSalesSolutionItemsDTO> jointSalesSolutionItems;
+            @SerializedName("elements")
+            private List<ElementsDTO> elements;
+            @SerializedName("attachedElements")
+            private List<?> attachedElements;
+            @SerializedName("forms")
+            private List<FormsDTO> forms;
+            @SerializedName("isShowInsured")
+            private String isShowInsured;
+
+            @NoArgsConstructor
+            @Data
+            public static class JointSalesSolutionItemsDTO {
+                @SerializedName("kindCode")
+                private String kindCode;
+                @SerializedName("kindName")
+                private String kindName;
+                @SerializedName("linkSeats")
+                private int linkSeats;
+                @SerializedName("insureUnit")
+                private String insureUnit;
+                @SerializedName("subsidyAmount")
+                private String subsidyAmount;
+                @SerializedName("subsidyDay")
+                private String subsidyDay;
+                @SerializedName("defaultValue")
+                private int defaultValue;
+                @SerializedName("defaultAmount")
+                private int defaultAmount;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class ElementsDTO {
+                @SerializedName("id")
+                private int id;
+                @SerializedName("code")
+                private String codeX;
+                @SerializedName("name")
+                private String name;
+                @SerializedName("requireInput")
+                private String requireInput;
+                @SerializedName("defaultValue")
+                private String defaultValue;
+                @SerializedName("options")
+                private List<?> options;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class FormsDTO {
+                @SerializedName("id")
+                private int id;
+                @SerializedName("planformid")
+                private String planformid;
+                @SerializedName("plandefid")
+                private long plandefid;
+                @SerializedName("customformtitle")
+                private String customformtitle;
+                @SerializedName("customformcontent")
+                private String customformcontent;
+                @SerializedName("formcategory")
+                private String formcategory;
+                @SerializedName("productelementid")
+                private String productelementid;
+                @SerializedName("productelementcode")
+                private String productelementcode;
+            }
+        }
+    }
+
+    /**
+     * 将险种列表转换为Map,key为险种类型标识,value为对应的险种列表
+     */
+    public Map<String, List<InsuranceDTO>> toMap() {
+        Map<String, List<InsuranceDTO>> map = new LinkedHashMap<>();
+        if (accidentInsurance != null) {
+            map.put("accidentInsurance", accidentInsurance);
+        }
+        if (healthInsurance != null) {
+            map.put("healthInsurance", healthInsurance);
+        }
+        if (propertyInsurance != null) {
+            map.put("propertyInsurance", propertyInsurance);
+        }
+        return map;
+    }
+}

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

@@ -0,0 +1,45 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/27 21:13
+ */
+@NoArgsConstructor
+@Data
+public class DaDiOrderInfoResponse extends DaDiBaseResponse{
+
+    @SerializedName("orderId")
+    private String orderId;
+    @SerializedName("reformSwitch")
+    private String reformSwitch;
+    @SerializedName("businessApplicationNo")
+    private String businessApplicationNo;
+    @SerializedName("trafficApplicationNo")
+    private String trafficApplicationNo;
+    @SerializedName("businessPolicyNo")
+    private String businessPolicyNo;
+    @SerializedName("custNo")
+    private long custNo;
+    @SerializedName("custType")
+    private String custType;
+    @SerializedName("custSourceType")
+    private String custSourceType;
+    @SerializedName("applicantEmail")
+    private String applicantEmail;
+    @SerializedName("applicantPhone")
+    private String applicantPhone;
+    @SerializedName("jianKangPoNo")
+    private String jianKangPoNo;
+    @SerializedName("caiChanPoNo")
+    private String caiChanPoNo;
+    @SerializedName("yiWaiPoNo")
+    private String yiWaiPoNo;
+    @SerializedName("noLicenseFlag")
+    private String noLicenseFlag;
+}

+ 343 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiOssInitParamResponse.java

@@ -0,0 +1,343 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 17:38
+ */
+@NoArgsConstructor
+@Data
+public class DaDiOssInitParamResponse extends DaDiBaseResponse{
+
+    @SerializedName("accessKeyVo")
+    private AccessKeyVoDTO accessKeyVo;
+    @SerializedName("appSource")
+    private String appSource;
+    @SerializedName("arriveNotify")
+    private int arriveNotify;
+    @SerializedName("autoClassify")
+    private Object autoClassify;
+    @SerializedName("bucket")
+    private String bucket;
+    @SerializedName("bussComeCode")
+    private String bussComeCode;
+    @SerializedName("bussDate")
+    private String bussDate;
+    @SerializedName("bussNo")
+    private String bussNo;
+    @SerializedName("bussType")
+    private String bussType;
+    @SerializedName("bussTypeName")
+    private String bussTypeName;
+    @SerializedName("comCode")
+    private String comCode;
+    @SerializedName("comName")
+    private String comName;
+    @SerializedName("docId")
+    private int docId;
+    @SerializedName("documentFile")
+    private String documentFile;
+    @SerializedName("dstKey")
+    private String dstKey;
+    @SerializedName("etlFlag")
+    private String etlFlag;
+    @SerializedName("extendInfo")
+    private Object extendInfo;
+    @SerializedName("imgClassifyVo")
+    private ImgClassifyVoDTO imgClassifyVo;
+    @SerializedName("imgVersion")
+    private String imgVersion;
+    @SerializedName("initTime")
+    private long initTime;
+    @SerializedName("itemLabels")
+    private List<?> itemLabels;
+    @SerializedName("maxFileSize")
+    private int maxFileSize;
+    @SerializedName("maxShowIdx")
+    private int maxShowIdx;
+    @SerializedName("maxSumCount")
+    private int maxSumCount;
+    @SerializedName("maxUnUploadNum")
+    private int maxUnUploadNum;
+    @SerializedName("md5VerifyFlag")
+    private int md5VerifyFlag;
+    @SerializedName("mediaFile")
+    private String mediaFile;
+    @SerializedName("netType")
+    private String netType;
+    @SerializedName("officeFile")
+    private String officeFile;
+    @SerializedName("openFileFrontendRendering")
+    private boolean openFileFrontendRendering;
+    @SerializedName("openFullSearch")
+    private Object openFullSearch;
+    @SerializedName("optUserId")
+    private String optUserId;
+    @SerializedName("optUserName")
+    private String optUserName;
+    @SerializedName("pictureFile")
+    private String pictureFile;
+    @SerializedName("reUpload")
+    private String reUpload;
+    @SerializedName("reUpload_time")
+    private Object reuploadTime;
+    @SerializedName("riskCode")
+    private String riskCode;
+    @SerializedName("riskCodeName")
+    private String riskCodeName;
+    @SerializedName("showDelete")
+    private int showDelete;
+    @SerializedName("showImgType")
+    private Object showImgType;
+    @SerializedName("showQRCode")
+    private String showQRCode;
+    @SerializedName("storageType")
+    private String storageType;
+    @SerializedName("supplement")
+    private Object supplement;
+    @SerializedName("supportFileTypes")
+    private String supportFileTypes;
+    @SerializedName("token")
+    private String token;
+    @SerializedName("typeSelectVos")
+    private List<TypeSelectVosDTO> typeSelectVos;
+    @SerializedName("typeTreeNodeVo")
+    private TypeTreeNodeVoDTO typeTreeNodeVo;
+    @SerializedName("uploadedFileList")
+    private Object uploadedFileList;
+    @SerializedName("uploadNode")
+    private String uploadNode;
+    @SerializedName("viewType")
+    private String viewType;
+
+    @NoArgsConstructor
+    @Data
+    public static class AccessKeyVoDTO {
+        @SerializedName("accessKeyId")
+        private String accessKeyId;
+        @SerializedName("accessKeySecret")
+        private String accessKeySecret;
+        @SerializedName("endpoint")
+        private String endpoint;
+        @SerializedName("ossRegion")
+        private String ossRegion;
+        @SerializedName("token")
+        private String token;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ImgClassifyVoDTO {
+        @SerializedName("classifyMap")
+        private ClassifyMapDTO classifyMap;
+        @SerializedName("otherTypePath")
+        private String otherTypePath;
+
+        @NoArgsConstructor
+        @Data
+        public static class ClassifyMapDTO {
+            @SerializedName("10")
+            private _$10DTO $10;
+            @SerializedName("11")
+            private _$11DTO $11;
+            @SerializedName("12")
+            private _$12DTO $12;
+            @SerializedName("7")
+            private _$7DTO $7;
+            @SerializedName("8")
+            private _$8DTO $8;
+            @SerializedName("9")
+            private _$9DTO $9;
+
+            @NoArgsConstructor
+            @Data
+            public static class _$10DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class _$11DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class _$12DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class _$7DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class _$8DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class _$9DTO {
+                @SerializedName("classifyNotify")
+                private boolean classifyNotify;
+                @SerializedName("typePath")
+                private String typePath;
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TypeTreeNodeVoDTO {
+        @SerializedName("acceptDragDrop")
+        private int acceptDragDrop;
+        @SerializedName("children")
+        private List<ChildrenDTO> children;
+        @SerializedName("classifyType")
+        private Object classifyType;
+        @SerializedName("count")
+        private int count;
+        @SerializedName("docMaxSize")
+        private int docMaxSize;
+        @SerializedName("label")
+        private String label;
+        @SerializedName("limitSumCount")
+        private int limitSumCount;
+        @SerializedName("lockFlag")
+        private int lockFlag;
+        @SerializedName("md5VerifyFlag")
+        private Object md5VerifyFlag;
+        @SerializedName("medMaxSize")
+        private int medMaxSize;
+        @SerializedName("nodeType")
+        private String nodeType;
+        @SerializedName("parentTypeCode")
+        private Object parentTypeCode;
+        @SerializedName("picMaxSize")
+        private int picMaxSize;
+        @SerializedName("picQuality")
+        private int picQuality;
+        @SerializedName("readable")
+        private int readable;
+        @SerializedName("supportFileTypes")
+        private String supportFileTypes;
+        @SerializedName("typeCode")
+        private String typeCode;
+        @SerializedName("typePath")
+        private Object typePath;
+        @SerializedName("writable")
+        private int writable;
+
+        @NoArgsConstructor
+        @Data
+        public static class ChildrenDTO {
+            @SerializedName("acceptDragDrop")
+            private int acceptDragDrop;
+            @SerializedName("children")
+            private Object children;
+            @SerializedName("classifyType")
+            private Object classifyType;
+            @SerializedName("count")
+            private int count;
+            @SerializedName("docMaxSize")
+            private int docMaxSize;
+            @SerializedName("label")
+            private String label;
+            @SerializedName("limitSumCount")
+            private int limitSumCount;
+            @SerializedName("lockFlag")
+            private int lockFlag;
+            @SerializedName("md5VerifyFlag")
+            private Object md5VerifyFlag;
+            @SerializedName("medMaxSize")
+            private int medMaxSize;
+            @SerializedName("nodeType")
+            private String nodeType;
+            @SerializedName("parentTypeCode")
+            private String parentTypeCode;
+            @SerializedName("picMaxSize")
+            private int picMaxSize;
+            @SerializedName("picQuality")
+            private int picQuality;
+            @SerializedName("readable")
+            private int readable;
+            @SerializedName("supportFileTypes")
+            private Object supportFileTypes;
+            @SerializedName("typeCode")
+            private String typeCode;
+            @SerializedName("typePath")
+            private Object typePath;
+            @SerializedName("writable")
+            private int writable;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TypeSelectVosDTO {
+        @SerializedName("acceptDragDrop")
+        private int acceptDragDrop;
+        @SerializedName("children")
+        private Object children;
+        @SerializedName("classifyType")
+        private Object classifyType;
+        @SerializedName("count")
+        private int count;
+        @SerializedName("docMaxSize")
+        private int docMaxSize;
+        @SerializedName("label")
+        private String label;
+        @SerializedName("limitSumCount")
+        private int limitSumCount;
+        @SerializedName("lockFlag")
+        private int lockFlag;
+        @SerializedName("md5VerifyFlag")
+        private Object md5VerifyFlag;
+        @SerializedName("medMaxSize")
+        private int medMaxSize;
+        @SerializedName("nodeType")
+        private String nodeType;
+        @SerializedName("parentTypeCode")
+        private String parentTypeCode;
+        @SerializedName("picMaxSize")
+        private int picMaxSize;
+        @SerializedName("picQuality")
+        private int picQuality;
+        @SerializedName("readable")
+        private int readable;
+        @SerializedName("supportFileTypes")
+        private String supportFileTypes;
+        @SerializedName("typeCode")
+        private String typeCode;
+        @SerializedName("typePath")
+        private String typePath;
+        @SerializedName("writable")
+        private int writable;
+    }
+}

+ 27 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiPayNoDataResponse.java

@@ -0,0 +1,27 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 获取支付号
+ * @date 2026/6/3 10:56
+ */
+@NoArgsConstructor
+@Data
+public class DaDiPayNoDataResponse extends DaDiBaseResponse {
+
+    @SerializedName("payApplyNo")
+    private String payApplyNo;
+    @SerializedName("payVerificationCode")
+    private String payVerificationCode;
+    @SerializedName("paymentStartTime")
+    private String paymentStartTime;
+    @SerializedName("paymentEndTime")
+    private String paymentEndTime;
+    @SerializedName("payAmount")
+    private String payAmount;
+}

+ 721 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderInfoResponse.java

@@ -0,0 +1,721 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地财险】订单详情
+ * @date 2026/5/28 14:55
+ */
+@NoArgsConstructor
+@Data
+public class DaDiQueryOrderInfoResponse extends DaDiOrderInfoResponse {
+
+    @SerializedName("id")
+    private String id;
+    @SerializedName("orderStatus")
+    private String orderStatus;
+    @SerializedName("payTypeNo")
+    private String payTypeNo;
+    @SerializedName("systemSource")
+    private String systemSource;
+    @SerializedName("electronicInsurance")
+    private String electronicInsurance;
+    @SerializedName("riskFlag")
+    private String riskFlag;
+    @SerializedName("applicationId")
+    private int applicationId;
+    @SerializedName("premium")
+    private int premium;
+    @SerializedName("amount")
+    private int amount;
+    @SerializedName("applicationNo")
+    private String applicationNo;
+    @SerializedName("effictiveDate")
+    private String effictiveDate;
+    @SerializedName("expireDate")
+    private String expireDate;
+    @SerializedName("immediatelyEffective")
+    private String immediatelyEffective;
+    @SerializedName("electronicInsuranceFlag")
+    private String electronicInsuranceFlag;
+    @SerializedName("compulsoryApplicationId")
+    private int compulsoryApplicationId;
+    @SerializedName("compulsoryPremium")
+    private int compulsoryPremium;
+    @SerializedName("compulsoryAmount")
+    private int compulsoryAmount;
+    @SerializedName("vehicleOrder")
+    private VehicleOrderDTO vehicleOrder;
+    @SerializedName("insuranceApplicationList")
+    private List<InsuranceApplicationListDTO> insuranceApplicationList;
+    @SerializedName("vehicleModelVO")
+    private VehicleModelVODTO vehicleModelVO;
+    @SerializedName("vehicleOwnerVO")
+    private VehicleOwnerVODTO vehicleOwnerVO;
+    @SerializedName("vehicleChannelVO")
+    private VehicleChannelVODTO vehicleChannelVO;
+    @SerializedName("relationPeopleList")
+    private List<RelationPeopleListDTO> relationPeopleList;
+    @SerializedName("vehicleInvoice")
+    private VehicleInvoiceDTO vehicleInvoice;
+    @SerializedName("nonCarVOList")
+    private List<?> nonCarVOList;
+    @SerializedName("vehicleTaxVo")
+    private VehicleTaxVoDTO vehicleTaxVo;
+    @SerializedName("trafficInfoPlatform")
+    private TrafficInfoPlatformDTO trafficInfoPlatform;
+    @SerializedName("vehiclePolicyVoList")
+    private List<?> vehiclePolicyVoList;
+    @SerializedName("rightsInterestsList")
+    private List<?> rightsInterestsList;
+    @SerializedName("businessSpecialAgreement")
+    private BusinessSpecialAgreementDTO businessSpecialAgreement;
+    @SerializedName("trafficSpecialAgreement")
+    private TrafficSpecialAgreementDTO trafficSpecialAgreement;
+    @SerializedName("operatorInfo")
+    private OperatorInfoDTO operatorInfo;
+    @SerializedName("payAmount")
+    private int payAmount;
+    @SerializedName("ccicVehicleScore")
+    private String ccicVehicleScore;
+    @SerializedName("cDiscountRate")
+    private String cDiscountRate;
+    @SerializedName("vehicleChargings")
+    private List<?> vehicleChargings;
+    @SerializedName("commissionVo")
+    private CommissionVoDTO commissionVo;
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleOrderDTO {
+        @SerializedName("id")
+        private int id;
+        @SerializedName("planCode")
+        private String planCode;
+        @SerializedName("comCode")
+        private String comCode;
+        @SerializedName("branchCode")
+        private String branchCode;
+        @SerializedName("branchName")
+        private String branchName;
+        @SerializedName("orderStatus")
+        private String orderStatus;
+        @SerializedName("payTypeNo")
+        private String payTypeNo;
+        @SerializedName("orderAmount")
+        private int orderAmount;
+        @SerializedName("payAmount")
+        private int payAmount;
+        @SerializedName("licenseNo")
+        private String licenseNo;
+        @SerializedName("carOwner")
+        private String carOwner;
+        @SerializedName("insurantName")
+        private String insurantName;
+        @SerializedName("applicantName")
+        private String applicantName;
+        @SerializedName("saleType")
+        private String saleType;
+        @SerializedName("agentAgreementCode")
+        private String agentAgreementCode;
+        @SerializedName("agentAgreementName")
+        private String agentAgreementName;
+        @SerializedName("permitNo")
+        private String permitNo;
+        @SerializedName("exhibitionNo")
+        private String exhibitionNo;
+        @SerializedName("agencyOrgCode")
+        private String agencyOrgCode;
+        @SerializedName("agentCode")
+        private String agentCode;
+        @SerializedName("agentName")
+        private String agentName;
+        @SerializedName("lastQuoteDate")
+        private String lastQuoteDate;
+        @SerializedName("loanVehicleFlag")
+        private String loanVehicleFlag;
+        @SerializedName("argueSolution")
+        private String argueSolution;
+        @SerializedName("carCheckStatus")
+        private String carCheckStatus;
+        @SerializedName("specialCarFlag")
+        private String specialCarFlag;
+        @SerializedName("electronicInsurance")
+        private String electronicInsurance;
+        @SerializedName("isNeedInvoice")
+        private String isNeedInvoice;
+        @SerializedName("systemSource")
+        private String systemSource;
+        @SerializedName("vehicleTypeFlag")
+        private String vehicleTypeFlag;
+        @SerializedName("isProxy")
+        private String isProxy;
+        @SerializedName("handlerCode")
+        private String handlerCode;
+        @SerializedName("handlerName")
+        private String handlerName;
+        @SerializedName("createUser")
+        private String createUser;
+        @SerializedName("updateUser")
+        private String updateUser;
+        @SerializedName("createTime")
+        private String createTime;
+        @SerializedName("updateTime")
+        private String updateTime;
+        @SerializedName("totalCfeeRate")
+        private String totalCfeeRate;
+        @SerializedName("totalC1feeRate")
+        private String totalC1feeRate;
+        @SerializedName("totalCfeeLimit")
+        private double totalCfeeLimit;
+        @SerializedName("totalC1feeLimit")
+        private double totalC1feeLimit;
+        @SerializedName("source")
+        private String source;
+        @SerializedName("ccicVehicleScore")
+        private String ccicVehicleScore;
+        @SerializedName("quoteFlag")
+        private String quoteFlag;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleModelVODTO {
+        @SerializedName("Id")
+        private String id;
+        @SerializedName("licenseNo")
+        private String licenseNo;
+        @SerializedName("enrollDate")
+        private String enrollDate;
+        @SerializedName("frameNo")
+        private String frameNo;
+        @SerializedName("engineNo")
+        private String engineNo;
+        @SerializedName("vehicleBrand")
+        private String vehicleBrand;
+        @SerializedName("seatCount")
+        private int seatCount;
+        @SerializedName("ecdemicVehicle")
+        private String ecdemicVehicle;
+        @SerializedName("chgOwnerFlag")
+        private String chgOwnerFlag;
+        @SerializedName("poCategory")
+        private String poCategory;
+        @SerializedName("carRegiste")
+        private String carRegiste;
+        @SerializedName("travelIssueDate")
+        private String travelIssueDate;
+        @SerializedName("tonCount")
+        private int tonCount;
+        @SerializedName("fuelType")
+        private String fuelType;
+        @SerializedName("net")
+        private int net;
+        @SerializedName("exhaustScale")
+        private int exhaustScale;
+        @SerializedName("haulage")
+        private int haulage;
+        @SerializedName("powerScale")
+        private int powerScale;
+        @SerializedName("userYear")
+        private int userYear;
+        @SerializedName("colorCode")
+        private String colorCode;
+        @SerializedName("useNatureCode")
+        private String useNatureCode;
+        @SerializedName("purchasePrice")
+        private int purchasePrice;
+        @SerializedName("actualValue")
+        private double actualValue;
+        @SerializedName("newVehicle")
+        private String newVehicle;
+        @SerializedName("noLicenseFlag")
+        private String noLicenseFlagX;
+        @SerializedName("vehicleCategory")
+        private String vehicleCategory;
+        @SerializedName("vehicleCategoryName")
+        private String vehicleCategoryName;
+        @SerializedName("carKindCode")
+        private String carKindCode;
+        @SerializedName("licenseColorCode")
+        private String licenseColorCode;
+        @SerializedName("licenseType")
+        private String licenseType;
+        @SerializedName("travelVehicleModel")
+        private String travelVehicleModel;
+        @SerializedName("industryModelCode")
+        private String industryModelCode;
+        @SerializedName("modelCode")
+        private String modelCode;
+        @SerializedName("modelName")
+        private String modelName;
+        @SerializedName("brandCode")
+        private String brandCode;
+        @SerializedName("brandName")
+        private String brandName;
+        @SerializedName("industryVehicleCode")
+        private String industryVehicleCode;
+        @SerializedName("loanVehicleFlag")
+        private String loanVehicleFlag;
+        @SerializedName("argueSolution")
+        private String argueSolution;
+        @SerializedName("carCheckStatus")
+        private String carCheckStatus;
+        @SerializedName("specialCarFlag")
+        private String specialCarFlag;
+        @SerializedName("hfCode")
+        private String hfCode;
+        @SerializedName("hfName")
+        private String hfName;
+        @SerializedName("vehicleClassCode")
+        private String vehicleClassCode;
+        @SerializedName("vehicleClassName")
+        private String vehicleClassName;
+        @SerializedName("importFlag")
+        private String importFlag;
+        @SerializedName("newVehicleClass")
+        private String newVehicleClass;
+        @SerializedName("familyName")
+        private String familyName;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleOwnerVODTO {
+        @SerializedName("id")
+        private String id;
+        @SerializedName("vehicleId")
+        private String vehicleId;
+        @SerializedName("custType")
+        private String custTypeX;
+        @SerializedName("custNo")
+        private long custNoX;
+        @SerializedName("name")
+        private String name;
+        @SerializedName("gender")
+        private String gender;
+        @SerializedName("identityNo")
+        private String identityNo;
+        @SerializedName("identityType")
+        private String identityType;
+        @SerializedName("identifyStartDate")
+        private String identifyStartDate;
+        @SerializedName("identifyEndDate")
+        private String identifyEndDate;
+        @SerializedName("identifyLongTerm")
+        private String identifyLongTerm;
+        @SerializedName("address")
+        private String address;
+        @SerializedName("phoneNo")
+        private String phoneNo;
+        @SerializedName("postCode")
+        private String postCode;
+        @SerializedName("age")
+        private int age;
+        @SerializedName("birthday")
+        private String birthday;
+        @SerializedName("unitType")
+        private String unitType;
+        @SerializedName("nature")
+        private String nature;
+        @SerializedName("areaCode")
+        private String areaCode;
+        @SerializedName("areaDetail")
+        private String areaDetail;
+        @SerializedName("nationality")
+        private String nationality;
+        @SerializedName("occupation")
+        private String occupation;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleChannelVODTO {
+        @SerializedName("id")
+        private String id;
+        @SerializedName("orderId")
+        private String orderIdX;
+        @SerializedName("isProxy")
+        private String isProxy;
+        @SerializedName("operator")
+        private String operator;
+        @SerializedName("businessNatureCode")
+        private String businessNatureCode;
+        @SerializedName("businessNatureName")
+        private String businessNatureName;
+        @SerializedName("businessNature2Code")
+        private String businessNature2Code;
+        @SerializedName("businessNature2Name")
+        private String businessNature2Name;
+        @SerializedName("handler2Code")
+        private String handler2Code;
+        @SerializedName("handler2Name")
+        private String handler2Name;
+        @SerializedName("businessCode")
+        private String businessCode;
+        @SerializedName("businessName")
+        private String businessName;
+        @SerializedName("projectCode")
+        private String projectCode;
+        @SerializedName("projectName")
+        private String projectName;
+        @SerializedName("salesName")
+        private String salesName;
+        @SerializedName("thirdPartyHandlerNo")
+        private String thirdPartyHandlerNo;
+        @SerializedName("thirdPartyHandlerName")
+        private String thirdPartyHandlerName;
+        @SerializedName("salesIdNo")
+        private String salesIdNo;
+        @SerializedName("salesChannelCode")
+        private String salesChannelCode;
+        @SerializedName("partnerCompanyCode")
+        private String partnerCompanyCode;
+        @SerializedName("partnerCompanyName")
+        private String partnerCompanyName;
+        @SerializedName("partnerBranchCode")
+        private String partnerBranchCode;
+        @SerializedName("partnerBranchName")
+        private String partnerBranchName;
+        @SerializedName("mode")
+        private String mode;
+        @SerializedName("quotePlanCode")
+        private String quotePlanCode;
+        @SerializedName("salesCodeName")
+        private String salesCodeName;
+        @SerializedName("mobile")
+        private String mobile;
+        @SerializedName("operatorPhone")
+        private String operatorPhone;
+        @SerializedName("agentName")
+        private String agentName;
+        @SerializedName("agentCode")
+        private String agentCode;
+        @SerializedName("agentAgreementCode")
+        private String agentAgreementCode;
+        @SerializedName("agentAgreementName")
+        private String agentAgreementName;
+        @SerializedName("orgCode")
+        private String orgCode;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleInvoiceDTO {
+        @SerializedName("id")
+        private int id;
+        @SerializedName("orderId")
+        private int orderIdX;
+        @SerializedName("clientType")
+        private String clientType;
+        @SerializedName("taxPayerType")
+        private String taxPayerType;
+        @SerializedName("invoiceType")
+        private String invoiceType;
+        @SerializedName("invoiceTitle")
+        private String invoiceTitle;
+        @SerializedName("invoiceRelation")
+        private String invoiceRelation;
+        @SerializedName("bankAccount")
+        private String bankAccount;
+        @SerializedName("taxCompanyName")
+        private String taxCompanyName;
+        @SerializedName("taxPayerIdentification")
+        private String taxPayerIdentification;
+        @SerializedName("taxRegistryAddress")
+        private String taxRegistryAddress;
+        @SerializedName("bankAgentCode")
+        private String bankAgentCode;
+        @SerializedName("bankBranchesCode")
+        private String bankBranchesCode;
+        @SerializedName("bankBranchesName")
+        private String bankBranchesName;
+        @SerializedName("bankAgentName")
+        private String bankAgentName;
+        @SerializedName("companyNameType")
+        private String companyNameType;
+        @SerializedName("phoneNo")
+        private String phoneNo;
+        @SerializedName("email")
+        private String email;
+        @SerializedName("taxRegistryPhone")
+        private String taxRegistryPhone;
+        @SerializedName("createTime")
+        private String createTime;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleTaxVoDTO {
+        @SerializedName("id")
+        private int id;
+        @SerializedName("orderId")
+        private int orderIdX;
+        @SerializedName("taxFlag")
+        private String taxFlag;
+        @SerializedName("sumPayment")
+        private int sumPayment;
+        @SerializedName("benchmarkTax")
+        private int benchmarkTax;
+        @SerializedName("tax")
+        private int tax;
+        @SerializedName("taxOverdue")
+        private int taxOverdue;
+        @SerializedName("surCharge")
+        private int surCharge;
+        @SerializedName("startTaxDate")
+        private String startTaxDate;
+        @SerializedName("endTaxDate")
+        private String endTaxDate;
+        @SerializedName("deductiondueCode")
+        private String deductiondueCode;
+        @SerializedName("deductiondueType")
+        private String deductiondueType;
+        @SerializedName("taxpayerName")
+        private String taxpayerName;
+        @SerializedName("taxpayerNo")
+        private String taxpayerNo;
+        @SerializedName("createTime")
+        private String createTime;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TrafficInfoPlatformDTO {
+        @SerializedName("querySequenceNo")
+        private String querySequenceNo;
+        @SerializedName("renewalFlag")
+        private String renewalFlag;
+        @SerializedName("trafficViolationRate")
+        private int trafficViolationRate;
+        @SerializedName("trafficViolationRateFloatCauseCode")
+        private String trafficViolationRateFloatCauseCode;
+        @SerializedName("trafficViolationRateFloatCauseDesc")
+        private String trafficViolationRateFloatCauseDesc;
+        @SerializedName("claimRate")
+        private int claimRate;
+        @SerializedName("claimRateFloatCode")
+        private String claimRateFloatCode;
+        @SerializedName("claimRateFloatDesc")
+        private String claimRateFloatDesc;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class BusinessSpecialAgreementDTO {
+        @SerializedName("specialAgreementList")
+        private List<?> specialAgreementList;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TrafficSpecialAgreementDTO {
+        @SerializedName("specialAgreementList")
+        private List<SpecialAgreementListDTO> specialAgreementList;
+
+        @NoArgsConstructor
+        @Data
+        public static class SpecialAgreementListDTO {
+            @SerializedName("id")
+            private int id;
+            @SerializedName("applicationId")
+            private int applicationId;
+            @SerializedName("riskCode")
+            private int riskCode;
+            @SerializedName("specialAgreementCode")
+            private String specialAgreementCode;
+            @SerializedName("specialAgreementName")
+            private String specialAgreementName;
+            @SerializedName("specialAgreementContent")
+            private String specialAgreementContent;
+            @SerializedName("createTime")
+            private String createTime;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class OperatorInfoDTO {
+        @SerializedName("optName")
+        private String optName;
+        @SerializedName("makeCompanyCName")
+        private String makeCompanyCName;
+        @SerializedName("rankName")
+        private String rankName;
+        @SerializedName("phone")
+        private String phone;
+        @SerializedName("email")
+        private String email;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CommissionVoDTO {
+        @SerializedName("traBeforeVatPremium")
+        private double traBeforeVatPremium;
+        @SerializedName("traFeecRate")
+        private int traFeecRate;
+        @SerializedName("traFeecLimit")
+        private double traFeecLimit;
+        @SerializedName("traFeec1Rate")
+        private double traFeec1Rate;
+        @SerializedName("traFeec1Limit")
+        private double traFeec1Limit;
+        @SerializedName("totalCfeeLimit")
+        private double totalCfeeLimit;
+        @SerializedName("totalC1feeLimit")
+        private double totalC1feeLimit;
+        @SerializedName("feeShowSwitch")
+        private String feeShowSwitch;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class InsuranceApplicationListDTO {
+        @SerializedName("id")
+        private int id;
+        @SerializedName("orderId")
+        private int orderIdX;
+        @SerializedName("applicationNo")
+        private String applicationNo;
+        @SerializedName("quotationNo")
+        private String quotationNo;
+        @SerializedName("vehicleId")
+        private int vehicleId;
+        @SerializedName("licenseNo")
+        private String licenseNo;
+        @SerializedName("engineNo")
+        private String engineNo;
+        @SerializedName("frameNo")
+        private String frameNo;
+        @SerializedName("comCode")
+        private String comCode;
+        @SerializedName("operatorName")
+        private String operatorName;
+        @SerializedName("operatorNo")
+        private String operatorNo;
+        @SerializedName("handlerName")
+        private String handlerName;
+        @SerializedName("handlerCode")
+        private String handlerCode;
+        @SerializedName("operatorTeamCode")
+        private String operatorTeamCode;
+        @SerializedName("operatorChannel")
+        private String operatorChannel;
+        @SerializedName("querySequenceNo")
+        private String querySequenceNo;
+        @SerializedName("queryPastDate")
+        private String queryPastDate;
+        @SerializedName("status")
+        private String status;
+        @SerializedName("underwriteSubmitDate")
+        private String underwriteSubmitDate;
+        @SerializedName("underwritePassDate")
+        private String underwritePassDate;
+        @SerializedName("effictiveDate")
+        private String effictiveDate;
+        @SerializedName("expireDate")
+        private String expireDate;
+        @SerializedName("riskCode")
+        private String riskCode;
+        @SerializedName("riskName")
+        private String riskName;
+        @SerializedName("sumInsured")
+        private int sumInsured;
+        @SerializedName("premium")
+        private int premium;
+        @SerializedName("premiumExcludingTax")
+        private double premiumExcludingTax;
+        @SerializedName("stdPremium")
+        private int stdPremium;
+        @SerializedName("businessType")
+        private String businessType;
+        @SerializedName("renewalFlag")
+        private String renewalFlag;
+        @SerializedName("immediatelyEffective")
+        private String immediatelyEffective;
+        @SerializedName("createUser")
+        private String createUser;
+        @SerializedName("createTime")
+        private String createTime;
+        @SerializedName("updateTime")
+        private String updateTime;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class RelationPeopleListDTO {
+        @SerializedName("id")
+        private String id;
+        @SerializedName("name")
+        private String name;
+        @SerializedName("identityType")
+        private String identityType;
+        @SerializedName("identityNo")
+        private String identityNo;
+        @SerializedName("identifyStartDate")
+        private String identifyStartDate;
+        @SerializedName("identifyEndDate")
+        private String identifyEndDate;
+        @SerializedName("identifyLongTerm")
+        private String identifyLongTerm;
+        @SerializedName("phone")
+        private String phone;
+        @SerializedName("email")
+        private String email;
+        @SerializedName("address")
+        private String address;
+        @SerializedName("relationPeopleType")
+        private String relationPeopleType;
+        @SerializedName("vehicleRelation")
+        private String vehicleRelation;
+        @SerializedName("age")
+        private int age;
+        @SerializedName("birthDate")
+        private String birthDate;
+        @SerializedName("sex")
+        private String sex;
+        @SerializedName("unitType")
+        private String unitType;
+        @SerializedName("insuredNature")
+        private String insuredNature;
+        @SerializedName("prefectureCode")
+        private String prefectureCode;
+        @SerializedName("occupation")
+        private String occupation;
+        @SerializedName("nationality")
+        private String nationality;
+        @SerializedName("customerAgentName")
+        private String customerAgentName;
+        @SerializedName("customerAgentCertificateType")
+        private String customerAgentCertificateType;
+        @SerializedName("customerAgentCertificateNum")
+        private String customerAgentCertificateNum;
+        @SerializedName("isPhoneHolder")
+        private String isPhoneHolder;
+        @SerializedName("phoneHolderName")
+        private String phoneHolderName;
+        @SerializedName("phoneHolderIdNo")
+        private String phoneHolderIdNo;
+        @SerializedName("nation")
+        private String nation;
+        @SerializedName("identifyCom")
+        private String identifyCom;
+        @SerializedName("idCardMachineCode")
+        private String idCardMachineCode;
+        @SerializedName("payerAccountName")
+        private String payerAccountName;
+        @SerializedName("payerApplicantRelation")
+        private String payerApplicantRelation;
+        @SerializedName("payerApplicantRelRemark")
+        private String payerApplicantRelRemark;
+        @SerializedName("relationPeopleCode")
+        private long relationPeopleCode;
+    }
+}

+ 42 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderStatusResponse.java

@@ -0,0 +1,42 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 15:38
+ */
+@NoArgsConstructor
+@Data
+public class DaDiQueryOrderStatusResponse extends DaDiBaseResponse {
+
+    @SerializedName("certiType")
+    private String certiType;
+    @SerializedName("certiStatusList")
+    private List<CertiStatusListDTO> certiStatusList;
+
+    @NoArgsConstructor
+    @Data
+    public static class CertiStatusListDTO {
+        @SerializedName("certiNo")
+        private String certiNo;
+        @SerializedName("certiStatus")
+        private String certiStatus;
+        @SerializedName("undwrtName")
+        private String undwrtName;
+        @SerializedName("undwrtDate")
+        private String undwrtDate;
+        @SerializedName("undwrtStatus")
+        private String undwrtStatus;
+        @SerializedName("undwrtText")
+        private String undwrtText;
+        @SerializedName("uwLevel")
+        private String uwLevel;
+    }
+}

+ 463 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java

@@ -0,0 +1,463 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/25 16:37
+ */
+@NoArgsConstructor
+@Data
+public class DaDiQuoteResponse extends DaDiBaseResponse {
+
+    @SerializedName("smartscore")
+    private String smartscore;
+    @SerializedName("cdiscountrate")
+    private String cdiscountrate;
+    @SerializedName("smartscoredetails")
+    private String smartscoredetails;
+    @SerializedName("xcarscore")
+    private String xcarscore;
+    @SerializedName("insurancePlan")
+    private InsurancePlanDTO insurancePlan;
+    @SerializedName("trafficReinsureInfo")
+    private TrafficReinsureInfoDTO trafficReinsureInfo;
+    @SerializedName("trafficErrorMessage")
+    private String trafficErrorMessage;
+    @SerializedName("insureQueryCheckFlag")
+    private String insureQueryCheckFlag;
+    @SerializedName("checks")
+    private List<ChecksDTO> checks;
+    @SerializedName("insureQueryMessage")
+    private InsureQueryMessageDTO insureQueryMessage;
+    @SerializedName("accCommission")
+    private AccCommissionDTO accCommission;
+    @SerializedName("ccicVehicleScore")
+    private String ccicVehicleScore;
+    @SerializedName("commission")
+    private CommissionDTO commission;
+    @SerializedName("floating")
+    private FloatingDTO floating;
+    @SerializedName("forwardType")
+    private String forwardType;
+    @SerializedName("fraudAnalyzeInfo")
+    private FraudAnalyzeInfoDTO fraudAnalyzeInfo;
+    @SerializedName("insurancePlanX")
+    private InsurancePlanDTO insurancePlanX;
+    @SerializedName("isPromotion")
+    private String isPromotion;
+    @SerializedName("quoteCount")
+    private QuoteCountDTO quoteCount;
+    @SerializedName("trafficLastClaims")
+    private List<Object> trafficLastClaims;
+    @SerializedName("businessLastClaims")
+    private List<Object> businessLastClaims;
+    @SerializedName("uwResult")
+    private UwResultDTO uwResult;
+    @SerializedName("uwUser")
+    private UwUserDTO uwUser;
+    @SerializedName("vehicleInsdStatDTO")
+    private List<VehicleInsdStatDTODTO> vehicleInsdStatDTO;
+    @SerializedName("vehicleTaxationDto")
+    private VehicleTaxationDtoDTO vehicleTaxationDto;
+    @SerializedName("cbitScore")
+    private String cbitScore;
+    @SerializedName("realUseYear")
+    private String realUseYear;
+    @SerializedName("lastPremium")
+    private String lastPremium;
+
+    @NoArgsConstructor
+    @Data
+    public static class InsurancePlanDTO {
+        @SerializedName("insureYears")
+        private String insureYears;
+        @SerializedName("claimTimes")
+        private String claimTimes;
+        @SerializedName("planCode")
+        private String planCode;
+        @SerializedName("trafficChecked")
+        private String trafficChecked;
+        @SerializedName("businessChecked")
+        private String businessChecked;
+        @SerializedName("tax")
+        private TaxDTO tax;
+        @SerializedName("trafficEffectiveStartDate")
+        private String trafficEffectiveStartDate;
+        @SerializedName("trafficEffectiveEndDate")
+        private String trafficEffectiveEndDate;
+        @SerializedName("businessEffectiveStartDate")
+        private String businessEffectiveStartDate;
+        @SerializedName("businessEffectiveEndDate")
+        private String businessEffectiveEndDate;
+        @SerializedName("trafficIsEffective")
+        private String trafficIsEffective;
+        @SerializedName("trafficSumInsured")
+        private int trafficSumInsured;
+        @SerializedName("businessIsEffective")
+        private String businessIsEffective;
+        @SerializedName("wealthAccChecked")
+        private String wealthAccChecked;
+        @SerializedName("quoteFlag")
+        private String quoteFlag;
+        @SerializedName("cDiscountRate")
+        private String cDiscountRate;
+        @SerializedName("mainCStandardRate")
+        private String mainCStandardRate;
+        @SerializedName("policyCostRate")
+        private String policyCostRate;
+        @SerializedName("trafficBeforeVatPremium")
+        private double trafficBeforeVatPremium;
+        @SerializedName("trafficDuePremium")
+        private int trafficDuePremium;
+        @SerializedName("businessDuePremium")
+        private int businessDuePremium;
+        @SerializedName("trafficNcdRate")
+        private double trafficNcdRate;
+        @SerializedName("trafficQueryPastDate")
+        private String trafficQueryPastDate;
+        @SerializedName("trafficQuerySequenceNo")
+        private String trafficQuerySequenceNo;
+        @SerializedName("trafficQuotationNo")
+        private String trafficQuotationNo;
+        @SerializedName("trafficRenewalFlag")
+        private String trafficRenewalFlag;
+        @SerializedName("trafficRenewalType")
+        private String trafficRenewalType;
+        @SerializedName("trafficStdPremium")
+        private int trafficStdPremium;
+        @SerializedName("violationLevel")
+        private String violationLevel;
+        @SerializedName("businessProductCode")
+        private String businessProductCode;
+        @SerializedName("trafficProductCode")
+        private String trafficProductCode;
+        @SerializedName("accidentInsurance")
+        private String accidentInsurance;
+        @SerializedName("healthInsurance")
+        private String healthInsurance;
+
+        @NoArgsConstructor
+        @Data
+        public static class TaxDTO {
+            @SerializedName("benchmarkTax")
+            private int benchmarkTax;
+            @SerializedName("endTaxDate")
+            private String endTaxDate;
+            @SerializedName("startTaxDate")
+            private String startTaxDate;
+            @SerializedName("sumPayment")
+            private int sumPayment;
+            @SerializedName("surCharge")
+            private int surCharge;
+            @SerializedName("tax")
+            private int tax;
+            @SerializedName("taxFlag")
+            private String taxFlag;
+            @SerializedName("taxOverdue")
+            private int taxOverdue;
+            @SerializedName("taxpayerName")
+            private String taxpayerName;
+            @SerializedName("taxpayerNo")
+            private String taxpayerNo;
+            @SerializedName("deductiondueCode")
+            private String deductiondueCode;
+            @SerializedName("deductiondueType")
+            private String deductiondueType;
+            @SerializedName("taxDepartment")
+            private String taxDepartment;
+            @SerializedName("adjustRate")
+            private String adjustRate;
+            @SerializedName("ext")
+            private ExtDTO ext;
+
+            @NoArgsConstructor
+            @Data
+            public static class ExtDTO {
+            }
+
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TrafficReinsureInfoDTO {
+        @SerializedName("insureConfirmCode")
+        private String insureConfirmCode;
+        @SerializedName("policyNo")
+        private String policyNo;
+        @SerializedName("effectiveStartDate")
+        private String effectiveStartDate;
+        @SerializedName("effectiveEndDate")
+        private String effectiveEndDate;
+        @SerializedName("licenseType")
+        private String licenseType;
+        @SerializedName("frameNo")
+        private String frameNo;
+        @SerializedName("engineNo")
+        private String engineNo;
+        @SerializedName("area")
+        private String area;
+    }
+
+
+    @NoArgsConstructor
+    @Data
+    public static class InsureQueryMessageDTO {
+
+        @SerializedName("repeadtedInsuranceMessage")
+        private String repeadtedInsuranceMessage;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ChecksDTO {
+        @SerializedName("renewalFlag")
+        private String renewalFlag;
+        @SerializedName("checkFlag")
+        private String checkFlag;
+        @SerializedName("querySequenceNo")
+        private String querySequenceNo;
+        @SerializedName("checkCode")
+        private String checkCode;
+        @SerializedName("question")
+        private String question;
+    }
+
+
+    @NoArgsConstructor
+    @Data
+    public static class AccCommissionDTO {
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CommissionDTO {
+        @SerializedName("commercialFeesc2Limit")
+        private double commercialFeesc2Limit;
+        @SerializedName("compulsoryFeec1Limit")
+        private double compulsoryFeec1Limit;
+        @SerializedName("compulsoryFeec1Rate")
+        private String compulsoryFeec1Rate;
+        @SerializedName("compulsoryFeecLimit")
+        private double compulsoryFeecLimit;
+        @SerializedName("compulsoryFeecRate")
+        private String compulsoryFeecRate;
+        @SerializedName("compulsoryFeesc2Limit")
+        private double compulsoryFeesc2Limit;
+        @SerializedName("extraPerfRateBT")
+        private String extraPerfRateBT;
+        @SerializedName("extraPerfRateCT")
+        private String extraPerfRateCT;
+        @SerializedName("feeShowSwitch")
+        private String feeShowSwitch;
+        @SerializedName("totalC1feeLimit")
+        private double totalC1feeLimit;
+        @SerializedName("totalC1feeRate")
+        private String totalC1feeRate;
+        @SerializedName("totalCfeeLimit")
+        private double totalCfeeLimit;
+        @SerializedName("totalCfeeRate")
+        private String totalCfeeRate;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class FloatingDTO {
+        @SerializedName("businessFloatingItems")
+        private List<BusinessFloatingItemsDTO> businessFloatingItems;
+        @SerializedName("discountCoefficient")
+        private double discountCoefficient;
+        @SerializedName("trafficFloatingItems")
+        private List<TrafficFloatingItemsDTO> trafficFloatingItems;
+        @SerializedName("xcarNum")
+        private int xcarNum;
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessFloatingItemsDTO {
+            @SerializedName("discountCode")
+            private String discountCode;
+            @SerializedName("floatCoefficient")
+            private int floatCoefficient=0;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TrafficFloatingItemsDTO {
+            @SerializedName("discountCode")
+            private String discountCode;
+            @SerializedName("floatCoefficient")
+            private int floatCoefficient;
+            @SerializedName("floatReasonCode")
+            private String floatReasonCode;
+            @SerializedName("floatReasonDesc")
+            private String floatReasonDesc;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class FraudAnalyzeInfoDTO {
+        @SerializedName("driverSumInsured")
+        private String driverSumInsured;
+        @SerializedName("newVehiclePurchasePrice")
+        private String newVehiclePurchasePrice;
+        @SerializedName("regionCode")
+        private String regionCode;
+        @SerializedName("ruleType")
+        private String ruleType;
+        @SerializedName("thirdSumInsured")
+        private String thirdSumInsured;
+        @SerializedName("vehicleInitialRegDate")
+        private String vehicleInitialRegDate;
+        @SerializedName("vehicleUseNatureCode")
+        private String vehicleUseNatureCode;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class QuoteCountDTO {
+        @SerializedName("compulsoryQuoteMaxNum")
+        private int compulsoryQuoteMaxNum;
+        @SerializedName("compulsoryQuoteNum")
+        private int compulsoryQuoteNum;
+        @SerializedName("sumQuoteCount")
+        private int sumQuoteCount;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class UwResultDTO {
+        @SerializedName("businessNo")
+        private String businessNo;
+        @SerializedName("isNeedCheck")
+        private String isNeedCheck;
+        @SerializedName("underwriteRuleInfos")
+        private List<UnderwriteRuleInfosDTO> underwriteRuleInfos;
+        @SerializedName("uwLevel")
+        private int uwLevel;
+        @SerializedName("uwType")
+        private String uwType;
+
+        @NoArgsConstructor
+        @Data
+        public static class UnderwriteRuleInfosDTO {
+            @SerializedName("ruleDescription")
+            private String ruleDescription;
+            @SerializedName("ruleName")
+            private String ruleName;
+            @SerializedName("ruleType")
+            private String ruleType;
+            @SerializedName("uwLevel")
+            private int uwLevel;
+            @SerializedName("uwType")
+            private String uwType;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class UwUserDTO {
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleTaxationDtoDTO {
+        @SerializedName("calcTaxFlag")
+        private String calcTaxFlag;
+        @SerializedName("currentTaxDue")
+        private CurrentTaxDueDTO currentTaxDue;
+        @SerializedName("declareStatusIa")
+        private String declareStatusIa;
+        @SerializedName("taxAmount")
+        private TaxAmountDTO taxAmount;
+        @SerializedName("taxConditionCode")
+        private String taxConditionCode;
+        @SerializedName("taxPayerIdentificationCode")
+        private String taxPayerIdentificationCode;
+        @SerializedName("taxPayerName")
+        private String taxPayerName;
+        @SerializedName("taxRegistryNumber")
+        private String taxRegistryNumber;
+        @SerializedName("taxTermTypeCode")
+        private String taxTermTypeCode;
+
+        @NoArgsConstructor
+        @Data
+        public static class CurrentTaxDueDTO {
+            @SerializedName("annualTaxAmount")
+            private int annualTaxAmount;
+            @SerializedName("exceedDaysCount")
+            private int exceedDaysCount;
+            @SerializedName("overDue")
+            private int overDue;
+            @SerializedName("paid")
+            private PaidDTO paid;
+            @SerializedName("taxDue")
+            private int taxDue;
+            @SerializedName("taxEndDate")
+            private String taxEndDate;
+            @SerializedName("taxLocationCode")
+            private String taxLocationCode;
+            @SerializedName("taxStartDate")
+            private String taxStartDate;
+            @SerializedName("taxUnitTypeCode")
+            private String taxUnitTypeCode;
+            @SerializedName("totalAmount")
+            private int totalAmount;
+            @SerializedName("unitRate")
+            private int unitRate;
+
+            @NoArgsConstructor
+            @Data
+            public static class PaidDTO {
+                @SerializedName("taxDepartment")
+                private String taxDepartment;
+                @SerializedName("taxDepartmentCode")
+                private String taxDepartmentCode;
+                @SerializedName("taxDocumentNumber")
+                private String taxDocumentNumber;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TaxAmountDTO {
+            @SerializedName("annualTaxDue")
+            private int annualTaxDue;
+            @SerializedName("sumOverdue")
+            private int sumOverdue;
+            @SerializedName("sumTax")
+            private int sumTax;
+            @SerializedName("sumTaxDefault")
+            private int sumTaxDefault;
+            @SerializedName("taxAmountFlag")
+            private String taxAmountFlag;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleInsdStatDTODTO {
+        @SerializedName("extensionMap")
+        private ExtensionMapDTO extensionMap;
+        @SerializedName("key")
+        private String key;
+        @SerializedName("value")
+        private String value;
+
+        @NoArgsConstructor
+        @Data
+        public static class ExtensionMapDTO {
+            @SerializedName("statisticSource")
+            private String statisticSource;
+        }
+    }
+}

+ 142 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSaveFileIdxResponse.java

@@ -0,0 +1,142 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/28 18:59
+ */
+@NoArgsConstructor
+@Data
+public class DaDiSaveFileIdxResponse extends DaDiBaseResponse{
+
+    @SerializedName("appendPath")
+    private String appendPath;
+    @SerializedName("auditFlag")
+    private Object auditFlag;
+    @SerializedName("auditText")
+    private Object auditText;
+    @SerializedName("bucket")
+    private String bucket;
+    @SerializedName("checkRestorePdfURL")
+    private Object checkRestorePdfURL;
+    @SerializedName("checkRestoreURL")
+    private Object checkRestoreURL;
+    @SerializedName("comCode")
+    private String comCode;
+    @SerializedName("comMD5")
+    private Object comMD5;
+    @SerializedName("createTime")
+    private long createTime;
+    @SerializedName("createUser")
+    private String createUser;
+    @SerializedName("createUserName")
+    private String createUserName;
+    @SerializedName("curMD5")
+    private String curMD5;
+    @SerializedName("deletable")
+    private boolean deletable;
+    @SerializedName("docId")
+    private int docId;
+    @SerializedName("dstKey")
+    private String dstKey;
+    @SerializedName("editable")
+    private boolean editable;
+    @SerializedName("extendInfo")
+    private String extendInfo;
+    @SerializedName("fileName")
+    private String fileName;
+    @SerializedName("fileOrgName")
+    private String fileOrgName;
+    @SerializedName("fileRealURL")
+    private Object fileRealURL;
+    @SerializedName("fileSize")
+    private int fileSize;
+    @SerializedName("fileSizeFormat")
+    private String fileSizeFormat;
+    @SerializedName("fileTitle")
+    private String fileTitle;
+    @SerializedName("fileViewURL")
+    private String fileViewURL;
+    @SerializedName("flag")
+    private Object flag;
+    @SerializedName("gpsTag")
+    private String gpsTag;
+    @SerializedName("imgId")
+    private long imgId;
+    @SerializedName("itemCode")
+    private Object itemCode;
+    @SerializedName("itemName")
+    private Object itemName;
+    @SerializedName("md5VerifyFlag")
+    private Object md5VerifyFlag;
+    @SerializedName("oldFileViewURL")
+    private Object oldFileViewURL;
+    @SerializedName("oldImgId")
+    private Object oldImgId;
+    @SerializedName("operationType")
+    private OperationTypeDTO operationType;
+    @SerializedName("orgPicFlag")
+    private Object orgPicFlag;
+    @SerializedName("picFileFlag")
+    private int picFileFlag;
+    @SerializedName("remark")
+    private Object remark;
+    @SerializedName("restoreStatus")
+    private Object restoreStatus;
+    @SerializedName("restoreURL")
+    private Object restoreURL;
+    @SerializedName("rotate")
+    private int rotate;
+    @SerializedName("rotateStart")
+    private int rotateStart;
+    @SerializedName("saveType")
+    private Object saveType;
+    @SerializedName("scanType")
+    private Object scanType;
+    @SerializedName("serverId")
+    private Object serverId;
+    @SerializedName("shootModel")
+    private String shootModel;
+    @SerializedName("shootTime")
+    private String shootTime;
+    @SerializedName("showIdx")
+    private int showIdx;
+    @SerializedName("statDay")
+    private long statDay;
+    @SerializedName("systemTag")
+    private String systemTag;
+    @SerializedName("thumbLargeURL")
+    private String thumbLargeURL;
+    @SerializedName("thumbMiddleURL")
+    private String thumbMiddleURL;
+    @SerializedName("thumbSmallURL")
+    private String thumbSmallURL;
+    @SerializedName("typeName")
+    private String typeName;
+    @SerializedName("typePath")
+    private String typePath;
+    @SerializedName("updateTime")
+    private long updateTime;
+    @SerializedName("updateUser")
+    private String updateUser;
+    @SerializedName("updateUserName")
+    private String updateUserName;
+    @SerializedName("uploadNode")
+    private String uploadNode;
+    @SerializedName("validFlag")
+    private int validFlag;
+    @SerializedName("voType")
+    private String voType;
+    @SerializedName("watermark")
+    private Object watermark;
+
+    @NoArgsConstructor
+    @Data
+    public static class OperationTypeDTO {
+    }
+}

+ 67 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSpecialInformationResponse.java

@@ -0,0 +1,67 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 特约信息查询结果
+ * @date 2026/5/25 14:50
+ */
+@Data
+@NoArgsConstructor
+public class DaDiSpecialInformationResponse extends DaDiBaseResponse{
+
+    @SerializedName("engages")
+    private List<EngagesDTO> engages;
+    @SerializedName("bizEngages")
+    private List<EngagesDTO> bizEngages;
+
+    @NoArgsConstructor
+    @Data
+    public static class EngagesDTO {
+        @SerializedName("id")
+        private int id;
+        @SerializedName("specialAgreementCode")
+        private String specialAgreementCode;
+        @SerializedName("specialAgreementName")
+        private String specialAgreementName;
+        @SerializedName("comCode")
+        private String comCode;
+        @SerializedName("validStatus")
+        private String validStatus;
+        @SerializedName("modifyFlag")
+        private String modifyFlag;
+        @SerializedName("productCode")
+        private String productCode;
+        @SerializedName("type")
+        private String type;
+        @SerializedName("createTime")
+        private String createTime;
+        @SerializedName("updateTime")
+        private String updateTime;
+        @SerializedName("serviceTypes")
+        private List<ServiceTypesDTO> serviceTypes;
+        @SerializedName("specialContent")
+        private String specialContent;
+        @SerializedName("selected")
+        private String selected;
+        @SerializedName("serviceItems")
+        private List<Object> serviceItems;
+        @SerializedName("specialAgreementContent")
+        private String specialAgreementContent;
+
+        @NoArgsConstructor
+        @Data
+        public static class ServiceTypesDTO {
+            @SerializedName("comCode")
+            private String comCode;
+            @SerializedName("serviceItems")
+            private List<Object> serviceItems;
+        }
+    }
+}

+ 36 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSubmitOrderResponse.java

@@ -0,0 +1,36 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/27 11:51
+ */
+@NoArgsConstructor
+@Data
+public class DaDiSubmitOrderResponse extends DaDiBaseResponse {
+
+    @SerializedName("checks")
+    private List<Object> checks;
+    @SerializedName("applicationNo")
+    private String applicationNo;
+    @SerializedName("proposalNoNew")
+    private String proposalNoNew;
+    @SerializedName("extensionMap")
+    private ExtensionMapDTO extensionMap;
+
+    @NoArgsConstructor
+    @Data
+    public static class ExtensionMapDTO {
+        @SerializedName("comProposalQueryNo")
+        private String comProposalQueryNo;
+        @SerializedName("comProposalQueryNoExpiryDate")
+        private String comProposalQueryNoExpiryDate;
+    }
+}

+ 28 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTaxConfigResponse.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 税务信息
+ * @date 2026/5/25 16:02
+ */
+@NoArgsConstructor
+@Data
+public class DaDiTaxConfigResponse extends DaDiBaseResponse{
+
+    @SerializedName("orderId")
+    private int orderId;
+    @SerializedName("comCode")
+    private String comCode;
+    @SerializedName("taxFlag")
+    private String taxFlag;
+    @SerializedName("taxDepartment")
+    private String taxDepartment;
+    @SerializedName("taxCertificateNo")
+    private String taxCertificateNo;
+
+}

+ 20 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTemporaryOrderResponse.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地财险】临时订单返回
+ * @date 2026/5/23 16:49
+ */
+@Data
+@NoArgsConstructor
+public class DaDiTemporaryOrderResponse extends DaDiBaseResponse{
+
+    @SerializedName("orderId")
+    private String orderId;
+
+}

+ 23 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiUploadImageResponse.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  【大地财险】上传图片返回
+ * @date 2026/5/28 16:57
+ */
+@NoArgsConstructor
+@Data
+public class DaDiUploadImageResponse extends DaDiBaseResponse{
+
+    @SerializedName("url")
+    private String url;
+    @SerializedName("token")
+    private String token;
+    @SerializedName("bussNo")
+    private String bussNo;
+}

+ 273 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleChannelInfoResponse.java

@@ -0,0 +1,273 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 汽车车型查询结果
+ * @date 2026/5/22 17:42
+ */
+@Data
+@NoArgsConstructor
+public class DaDiVehicleChannelInfoResponse extends DaDiBaseResponse {
+
+    @SerializedName("carModels")
+    private List<CarModel> carModels;
+
+    /**
+     * 车型信息
+     */
+    @Data
+    @NoArgsConstructor
+    public static class CarModel {
+
+        /** 车辆品牌 */
+        @SerializedName("vehicleBrand")
+        private String vehicleBrand;
+
+        /** 核定座位数 */
+        @SerializedName("seatCount")
+        private int seatCount;
+
+        /** 吨位 */
+        @SerializedName("tonCount")
+        private int tonCount;
+
+        /** 整备质量 */
+        @SerializedName("net")
+        private int net;
+
+        /** 排量 */
+        @SerializedName("exhaustScale")
+        private int exhaustScale;
+
+        /** 购买价格 */
+        @SerializedName("purchasePrice")
+        private double purchasePrice;
+
+        /** 车型代码 */
+        @SerializedName("modelCode")
+        private String modelCode;
+
+        /** 车型名称 */
+        @SerializedName("modelName")
+        private String modelName;
+
+        /** 车辆精油(精友)信息 */
+        @SerializedName("vehicleJingyou")
+        private VehicleJingyou vehicleJingyou;
+
+        /** 防盗标志 */
+        @SerializedName("alarmFlag")
+        private String alarmFlag;
+
+        /** 气囊数量 */
+        @SerializedName("airbagNum")
+        private int airbagNum;
+
+        /** 变速器类型 */
+        @SerializedName("derailleurType")
+        private String derailleurType;
+
+        /** 进口标识 */
+        @SerializedName("importFlag")
+        private String importFlag;
+
+        /** 上市年份 */
+        @SerializedName("marketYear")
+        private String marketYear;
+
+        /** 风险标志 */
+        @SerializedName("riskFlag")
+        private String riskFlag;
+
+        /** 新车分类 */
+        @SerializedName("newVehicleClass")
+        private String newVehicleClass;
+
+        /** 家族名称 */
+        @SerializedName("familyName")
+        private String familyName;
+    }
+
+    /**
+     * 车辆精油(精友)详细信息
+     */
+    @Data
+    @NoArgsConstructor
+    public static class VehicleJingyou {
+
+        /** 行业车型代码 */
+        @SerializedName("industryModelCode")
+        private String industryModelCode;
+
+        /** 行业车辆代码 */
+        @SerializedName("industryVehicleCode")
+        private String industryVehicleCode;
+
+        /** 行业车辆名称 */
+        @SerializedName("industryVehicleName")
+        private String industryVehicleName;
+
+        /** 车辆代码 */
+        @SerializedName("vehicleCode")
+        private String vehicleCode;
+
+        /** 车辆名称 */
+        @SerializedName("vehicleName")
+        private String vehicleName;
+
+        /** 厂商代码 */
+        @SerializedName("factoryCode")
+        private String factoryCode;
+
+        /** 厂商名称 */
+        @SerializedName("factoryName")
+        private String factoryName;
+
+        /** 品牌代码 */
+        @SerializedName("brandCode")
+        private String brandCode;
+
+        /** 品牌名称 */
+        @SerializedName("brandName")
+        private String brandName;
+
+        /** 家族代码 */
+        @SerializedName("familyCode")
+        private String familyCode;
+
+        /** 家族名称 */
+        @SerializedName("familyName")
+        private String familyName;
+
+        /** 车辆类别代码 */
+        @SerializedName("vehicleClassCode")
+        private String vehicleClassCode;
+
+        /** 车辆类别名称 */
+        @SerializedName("vehicleClassName")
+        private String vehicleClassName;
+
+        /** 车辆类型 */
+        @SerializedName("vehicleType")
+        private String vehicleType;
+
+        /** 排量 */
+        @SerializedName("displacement")
+        private String displacement;
+
+        /** 座位数 */
+        @SerializedName("seat")
+        private String seat;
+
+        /** 吨位 */
+        @SerializedName("tonnage")
+        private String tonnage;
+
+        /** 变速器类型 */
+        @SerializedName("gearboxType")
+        private String gearboxType;
+
+        /** 价格 */
+        @SerializedName("price")
+        private String price;
+
+        /** 购置价(含税) */
+        @SerializedName("purchasePriceTax")
+        private String purchasePriceTax;
+
+        /** 购买价格 */
+        @SerializedName("purchasePrice")
+        private String purchasePrice;
+
+        /** 核保系数代码 */
+        @SerializedName("hfCode")
+        private String hfCode;
+
+        /** 核保系数名称 */
+        @SerializedName("hfName")
+        private String hfName;
+
+        /** 价格类型 */
+        @SerializedName("pricetype")
+        private String pricetype;
+
+        /** 防盗装置 */
+        @SerializedName("antiTheft")
+        private String antiTheft;
+
+        /** 气囊数量 */
+        @SerializedName("airbagNum")
+        private String airbagNum;
+
+        /** 上市日期 */
+        @SerializedName("marketDate")
+        private String marketDate;
+
+        /** 风险标识 */
+        @SerializedName("riskFlags")
+        private String riskFlags;
+
+        /** 停售标识 */
+        @SerializedName("stopFlag")
+        private String stopFlag;
+
+        /** 总质量 */
+        @SerializedName("fullWeight")
+        private String fullWeight;
+
+        /** 费率 */
+        @SerializedName("rate")
+        private String rate;
+
+        /** 搜索代码 */
+        @SerializedName("searchCode")
+        private String searchCode;
+
+        /** 功率 */
+        @SerializedName("power")
+        private String power;
+
+        /** 适用风险费率 */
+        @SerializedName("fitsRiskRate")
+        private String fitsRiskRate;
+
+        /** 集团适用费率 */
+        @SerializedName("groupFitsRate")
+        private String groupFitsRate;
+
+        /** 集团维修费率 */
+        @SerializedName("groupRepairRate")
+        private String groupRepairRate;
+
+        /** 车辆备注 */
+        @SerializedName("carRemark")
+        private String carRemark;
+
+        /** 集团名称 */
+        @SerializedName("groupName")
+        private String groupName;
+
+        /** 新车分类 */
+        @SerializedName("newVehicleClass")
+        private String newVehicleClass;
+
+        /** 排放标准 */
+        @SerializedName("effluentStandard")
+        private String effluentStandard;
+
+        /** 动力类型 */
+        @SerializedName("powerType")
+        private String powerType;
+
+        /** 动力类型代码 */
+        @SerializedName("powerTypeCode")
+        private String powerTypeCode;
+    }
+}

+ 57 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleCheckInfoResponse.java

@@ -0,0 +1,57 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/30 11:07
+ */
+@NoArgsConstructor
+@Data
+public class DaDiVehicleCheckInfoResponse extends DaDiBaseResponse{
+
+
+    @SerializedName("sameFlag")
+    private String sameFlag;
+    @SerializedName("carModelBaseVO")
+    private CarModelBaseVODTO carModelBaseVO;
+    @SerializedName("carModelList")
+    private List<CarModelListDTO> carModelList;
+
+    @NoArgsConstructor
+    @Data
+    public static class CarModelBaseVODTO {
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CarModelListDTO {
+        @SerializedName("vehicleBrand")
+        private String vehicleBrand;
+        @SerializedName("modelCode")
+        private String modelCode;
+        @SerializedName("modelName")
+        private String modelName;
+        @SerializedName("brandCode")
+        private String brandCode;
+        @SerializedName("brandName")
+        private String brandName;
+        @SerializedName("industryVehicleCode")
+        private String industryVehicleCode;
+        @SerializedName("derailleurType")
+        private String derailleurType;
+        @SerializedName("familyName")
+        private String familyName;
+
+        /** 车辆精油(精友)信息 */
+        @SerializedName("vehicleJingyou")
+        private DaDiVehicleChannelInfoResponse.VehicleJingyou vehicleJingyou;
+
+    }
+}

+ 39 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehiclePricResponse.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.dadi.crawler.entity.response;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 车辆定价结果
+ * @date 2026/5/23 14:52
+ */
+@Data
+@NoArgsConstructor
+public class DaDiVehiclePricResponse extends DaDiBaseResponse {
+
+    @SerializedName("orgCode")
+    private String orgCode;
+    @SerializedName("seatCount")
+    private String seatCount;
+    @SerializedName("vehicleKindCode")
+    private String vehicleKindCode;
+    @SerializedName("useNatureCode")
+    private String useNatureCode;
+    @SerializedName("regionCode")
+    private String regionCode;
+    @SerializedName("enrollDate")
+    private String enrollDate;
+    @SerializedName("effectiveDate")
+    private String effectiveDate;
+    @SerializedName("purchasePrice")
+    private String purchasePrice;
+    @SerializedName("tonCount")
+    private String tonCount;
+    @SerializedName("userYear")
+    private String userYear;
+    @SerializedName("actualValue")
+    private String actualValue;
+}

+ 542 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/network/NetworkRequest.java

@@ -0,0 +1,542 @@
+package com.jzg.quotation.dadi.crawler.network;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.Method;
+import cn.hutool.json.JSONUtil;
+import com.jzg.quotation.dadi.utils.DaDiAESUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+import java.net.HttpCookie;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】网络请求基类 - 基于Hutool工具类封装
+ * @date 2026/5/22 08:30
+ */
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class NetworkRequest {
+
+    /**
+     * 默认超时时间(毫秒)
+     */
+    private static final int DEFAULT_TIMEOUT = 120000;
+
+    /**
+     * 公共请求头(所有请求自动携带)
+     */
+    private static final Map<String, String> COMMON_HEADERS = new LinkedHashMap<>();
+
+    static {
+        COMMON_HEADERS.put(HttpHeaders.CONNECTION, "Keep-Alive");
+        COMMON_HEADERS.put(HttpHeaders.USER_AGENT, "okhttp/3.12.0");
+    }
+
+    /**
+     * 当前登录Token(登录后通过setToken()设置)
+     */
+    private String token;
+
+    /**
+     * 当前Cookies(设置后所有请求自动携带)
+     */
+    private final Map<String, String> cookies = new LinkedHashMap<>();
+
+    // ==================== 公共请求头 ====================
+
+    /**
+     * 设置登录Token
+     *
+     * @param token 登录返回的X-Access-Token
+     */
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    /**
+     * 获取当前Token
+     *
+     * @return 当前Token
+     */
+    public String getToken() {
+        return token;
+    }
+
+    /**
+     * 设置单个Cookie
+     *
+     * @param name  Cookie名称
+     * @param value Cookie值
+     */
+    public void setCookie(String name, String value) {
+        this.cookies.put(name, value);
+    }
+
+    /**
+     * 批量设置Cookies
+     *
+     * @param cookies Cookie键值对
+     */
+    public void setCookies(Map<String, String> cookies) {
+        this.cookies.putAll(cookies);
+    }
+
+    /**
+     * 获取当前所有Cookies
+     *
+     * @return Cookie键值对
+     */
+    public Map<String, String> getCookies() {
+        return cookies;
+    }
+
+    /**
+     * 清除所有Cookies
+     */
+    public void clearCookies() {
+        this.cookies.clear();
+    }
+
+    /**
+     * 获取包含公共请求头和Token的HttpHeaders
+     *
+     * @return HttpHeaders(可变,调用方可追加自定义header)
+     */
+    public HttpHeaders getDefaultHeaders() {
+        HttpHeaders headers = new HttpHeaders();
+        COMMON_HEADERS.forEach(headers::set);
+        headers.set(HttpHeaders.CONTENT_TYPE, "application/json; charset=utf-8");
+        if (getToken() != null && !getToken().isEmpty()) {
+            headers.set("X-Access-Token", getToken());
+        }
+        return headers;
+    }
+
+    // ==================== GET 请求 ====================
+
+    /**
+     * GET请求(无参)
+     */
+    public String doGet(String url) {
+        return doGet(url, null);
+    }
+
+    /**
+     * GET请求(带参数)
+     */
+    public String doGet(String url, Map<String, Object> params) {
+        return doGet(url, params, null);
+    }
+
+    /**
+     * GET请求(带参数和请求头)
+     */
+    public String doGet(String url, Map<String, Object> params, HttpHeaders headers) {
+        return execute(Method.GET, url, params, null, headers);
+    }
+
+    // ==================== POST 请求 ====================
+
+    /**
+     * POST请求(无参)
+     */
+    public String doPost(String url) {
+        return doPost(url, (String) null);
+    }
+
+    /**
+     * POST请求(JSON字符串体)
+     */
+    public String doPost(String url, String body) {
+        return doPost(url, body, null);
+    }
+
+    /**
+     * POST请求(JSON字符串体 + 请求头)
+     */
+    public String doPost(String url, String body, HttpHeaders headers) {
+        return execute(Method.POST, url, null, body, headers);
+    }
+
+    /**
+     * POST请求(对象自动转JSON)
+     */
+    public String doPost(String url, Object bodyObj) {
+        return doPost(url, bodyObj, null);
+    }
+
+    /**
+     * POST请求(对象自动转JSON + 请求头)
+     */
+    public String doPost(String url, Object bodyObj, HttpHeaders headers) {
+        String body = bodyObj instanceof String ? (String) bodyObj : JSONUtil.toJsonStr(bodyObj);
+        return doPost(url, body, headers);
+    }
+
+    // ==================== POST Form 请求 ====================
+
+    /**
+     * POST表单请求(表单参数)
+     */
+    public String doPostForm(String url, Map<String, Object> formParams) {
+        return doPostForm(url, formParams, null);
+    }
+
+    /**
+     * POST表单请求(表单参数 + 请求头)
+     */
+    public String doPostForm(String url, Map<String, Object> formParams, HttpHeaders headers) {
+        return executeForm(Method.POST, url, formParams, headers);
+    }
+
+    // ==================== PUT 请求 ====================
+
+    /**
+     * PUT请求(无参)
+     */
+    public String doPut(String url) {
+        return doPut(url, (String) null);
+    }
+
+    /**
+     * PUT请求(JSON字符串体)
+     */
+    public String doPut(String url, String body) {
+        return doPut(url, body, null);
+    }
+
+    /**
+     * PUT请求(JSON字符串体 + 请求头)
+     */
+    public String doPut(String url, String body, HttpHeaders headers) {
+        return execute(Method.PUT, url, null, body, headers);
+    }
+
+    /**
+     * PUT请求(对象自动转JSON)
+     */
+    public String doPut(String url, Object bodyObj) {
+        return doPut(url, bodyObj, null);
+    }
+
+    /**
+     * PUT请求(对象自动转JSON + 请求头)
+     */
+    public String doPut(String url, Object bodyObj, HttpHeaders headers) {
+        String body = bodyObj instanceof String ? (String) bodyObj : JSONUtil.toJsonStr(bodyObj);
+        return doPut(url, body, headers);
+    }
+
+    // ==================== DELETE 请求 ====================
+
+    /**
+     * DELETE请求(无参)
+     */
+    public String doDelete(String url) {
+        return doDelete(url, null);
+    }
+
+    /**
+     * DELETE请求(带参数)
+     */
+    public String doDelete(String url, Map<String, Object> params) {
+        return doDelete(url, params, null);
+    }
+
+    /**
+     * DELETE请求(带参数和请求头)
+     */
+    public String doDelete(String url, Map<String, Object> params, HttpHeaders headers) {
+        return execute(Method.DELETE, url, params, null, headers);
+    }
+
+    // ==================== PATCH 请求 ====================
+
+    /**
+     * PATCH请求
+     */
+    public String doPatch(String url, String body) {
+        return doPatch(url, body, null);
+    }
+
+    /**
+     * PATCH请求(带请求头)
+     */
+    public String doPatch(String url, String body, HttpHeaders headers) {
+        return execute(Method.PATCH, url, null, body, headers);
+    }
+
+    // ==================== HEAD 请求 ====================
+
+    /**
+     * HEAD请求
+     */
+    public String doHead(String url) {
+        return doHead(url, null);
+    }
+
+    /**
+     * HEAD请求(带请求头)
+     */
+    public String doHead(String url, HttpHeaders headers) {
+        return execute(Method.HEAD, url, null, null, headers);
+    }
+
+    // ==================== OPTIONS 请求 ====================
+
+    /**
+     * OPTIONS请求
+     */
+    public String doOptions(String url) {
+        return doOptions(url, null);
+    }
+
+    /**
+     * OPTIONS请求(带请求头)
+     */
+    public String doOptions(String url, HttpHeaders headers) {
+        return execute(Method.OPTIONS, url, null, null, headers);
+    }
+
+    // ==================== 通用请求方法 ====================
+
+    /**
+     * 通用请求方法(完整参数)
+     *
+     * @param method  请求方式
+     * @param url     请求地址
+     * @param params  URL查询参数
+     * @param body    请求体(JSON)
+     * @param headers 请求头
+     * @return 响应体字符串
+     */
+    public String doRequest(Method method, String url, Map<String, Object> params,
+                            String body, HttpHeaders headers) {
+        return execute(method, url, params, body, headers);
+    }
+
+    // ==================== 响应对象方法 ====================
+
+    /**
+     * GET请求(返回HttpResponse对象,可获取状态码、响应头等)
+     */
+    public HttpResponse doGetForResponse(String url, Map<String, Object> params, HttpHeaders headers) {
+        return executeForResponse(Method.GET, url, params, null, headers);
+    }
+
+    /**
+     * POST请求(返回HttpResponse对象,可获取状态码、响应头等)
+     */
+    public HttpResponse doPostForResponse(String url, String body, HttpHeaders headers) {
+        return executeForResponse(Method.POST, url, null, body, headers);
+    }
+
+    /**
+     * POST表单请求(返回HttpResponse对象)
+     */
+    public HttpResponse doPostFormForResponse(String url, Map<String, Object> formParams, HttpHeaders headers) {
+        return executeFormForResponse(Method.POST, url, formParams, headers);
+    }
+
+    // ==================== 内部执行方法 ====================
+
+    /**
+     * 执行HTTP请求(JSON体)
+     */
+    private String execute(Method method, String url, Map<String, Object> params,
+                           String body, HttpHeaders headers) {
+        long startTime = System.currentTimeMillis();
+        try {
+            HttpRequest request = buildRequest(method, url, params, body, headers);
+            HttpResponse response = request.timeout(DEFAULT_TIMEOUT).execute();
+            // 使用bodyBytes()避免Hutool根据Content-Type自动解析响应体
+            byte[] bodyBytes = response.bodyBytes();
+            String result = bodyBytes != null ? new String(bodyBytes, StandardCharsets.UTF_8) : null;
+            log.info("\n----------------------> HTTP请求成功: \n----------------------> method:{}, \n----------------------> url:{}, \n----------------------> body:{},\n----------------------> body:{},\n----------------------> 耗时:{}ms, \n----------------------> 状态码:{}, \n----------------------> 响应长度:{}",
+                    method, url, body, TextUtils.isEmpty(body) ? null : DaDiAESUtils.isJson(body) ? body : DaDiAESUtils.decryptStr(body), System.currentTimeMillis() - startTime, response.getStatus(),
+                    result != null ? result.length() : 0);
+            return result;
+        } catch (Exception e) {
+            log.error("\n----------------------> HTTP请求失败, \n----------------------> method:{}, \n----------------------> url:{},\n---------------------->  耗时:{}ms",
+                    method, url, System.currentTimeMillis() - startTime, e);
+            throw new RuntimeException(StrUtil.format("\n----------------------> HTTP请求失败: {}, {}", method, url), e);
+        }
+    }
+
+    /**
+     * 执行HTTP请求(表单体)
+     */
+    private String executeForm(Method method, String url, Map<String, Object> formParams,
+                               HttpHeaders headers) {
+        long startTime = System.currentTimeMillis();
+        try {
+            HttpRequest request = createRequest(method, url);
+            setCommonFormHeaders(request);
+            setHeaders(request, headers);
+            if (formParams != null && !formParams.isEmpty()) {
+                request.form(formParams);
+            }
+            HttpResponse response = request.timeout(DEFAULT_TIMEOUT).execute();
+            // 使用bodyBytes()避免Hutool根据Content-Type自动解析响应体
+            byte[] bodyBytes = response.bodyBytes();
+            String result = bodyBytes != null ? new String(bodyBytes, StandardCharsets.UTF_8) : null;
+            log.info("\n----------------------> HTTP表单请求成功, \n----------------------> method:{},\n----------------------> url:{},\n----------------------> 耗时:{}ms, \n----------------------> 状态码:{}, \n----------------------> 响应长度:{}",
+                    method, url, System.currentTimeMillis() - startTime, response.getStatus(),
+                    result != null ? result.length() : 0);
+            return result;
+        } catch (Exception e) {
+            log.error("HTTP表单请求失败, \n----------------------> method:{}, \n----------------------> url:{}, \n---------------------->  耗时:{}ms",
+                    method, url, System.currentTimeMillis() - startTime, e);
+            throw new RuntimeException(StrUtil.format("HTTP表单请求失败: {}, {}", method, url), e);
+        }
+    }
+
+    /**
+     * 执行HTTP请求(返回完整响应对象)
+     */
+    private HttpResponse executeForResponse(Method method, String url, Map<String, Object> params,
+                                            String body, HttpHeaders headers) {
+        long startTime = System.currentTimeMillis();
+        try {
+            HttpRequest request = buildRequest(method, url, params, body, headers);
+            HttpResponse response = request.timeout(DEFAULT_TIMEOUT).execute();
+            log.info("\n----------------------> HTTP请求成功, \n----------------------> method:{}, \n----------------------> url:{}, \n----------------------> body:{},\n---------------------->  耗时:{}ms, \n----------------------> 状态码:{}",
+                    method, url, TextUtils.isEmpty(body) ? null :  DaDiAESUtils.isJson(body) ? body : DaDiAESUtils.decryptStr(body), System.currentTimeMillis() - startTime, response.getStatus());
+            return response;
+        } catch (Exception e) {
+            log.error("\n----------------------> HTTP请求失败, \n----------------------> method:{}, \n----------------------> url:{}, \n---------------------->  耗时:{}ms",
+                    method, url, System.currentTimeMillis() - startTime, e);
+            throw new RuntimeException(StrUtil.format("\n----------------------> HTTP请求失败: {}, {}", method, url), e);
+        }
+    }
+
+    /**
+     * 执行HTTP表单请求(返回完整响应对象)
+     */
+    private HttpResponse executeFormForResponse(Method method, String url, Map<String, Object> formParams,
+                                                HttpHeaders headers) {
+        long startTime = System.currentTimeMillis();
+        try {
+            HttpRequest request = createRequest(method, url);
+            setCommonFormHeaders(request);
+            setHeaders(request, headers);
+            if (formParams != null && !formParams.isEmpty()) {
+                request.form(formParams);
+            }
+            HttpResponse response = request.timeout(DEFAULT_TIMEOUT).execute();
+            log.info("HTTP表单请求成功, \n----------------------> method:{}, \n----------------------> url:{}, \n---------------------->  耗时:{}ms, \n----------------------> 状态码:{}",
+                    method, url, System.currentTimeMillis() - startTime, response.getStatus());
+            return response;
+        } catch (Exception e) {
+            log.error("HTTP表单请求失败, \n----------------------> method:{}, \n----------------------> url:{}, \n---------------------->  耗时:{}ms",
+                    method, url, System.currentTimeMillis() - startTime, e);
+            throw new RuntimeException(StrUtil.format("HTTP表单请求失败: {}, {}", method, url), e);
+        }
+    }
+
+    /**
+     * 构建HttpRequest对象(JSON体)
+     */
+    private HttpRequest buildRequest(Method method, String url, Map<String, Object> params,
+                                     String body, HttpHeaders headers) {
+        HttpRequest request = createRequest(method, url);
+        setCommonHeaders(request);
+        setHeaders(request, headers);
+        setParams(request, params);
+        setBody(request, body);
+        return request;
+    }
+
+    /**
+     * 设置公共请求头(Token + 固定头 + Cookies)
+     */
+    private void setCommonHeaders(HttpRequest request) {
+        COMMON_HEADERS.forEach(request::header);
+        request.header("Content-Type", "application/json; charset=utf-8");
+        if (getToken() != null && !getToken().isEmpty()) {
+            request.header("X-Access-Token", getToken());
+        }
+        applyCookies(request);
+    }
+
+    /**
+     * 设置Form请求的公共请求头(不含Content-Type,由request.form()自动设置)
+     */
+    private void setCommonFormHeaders(HttpRequest request) {
+        COMMON_HEADERS.forEach(request::header);
+        if (getToken() != null && !getToken().isEmpty()) {
+            request.header("X-Access-Token", getToken());
+        }
+        applyCookies(request);
+    }
+
+    /**
+     * 将存储的Cookie应用到请求中
+     */
+    private void applyCookies(HttpRequest request) {
+        if (cookies != null && !cookies.isEmpty()) {
+            for (Map.Entry<String, String> entry : cookies.entrySet()) {
+                request.cookie(new HttpCookie(entry.getKey(), entry.getValue()));
+            }
+        }
+    }
+
+    /**
+     * 创建基础请求对象
+     */
+    private HttpRequest createRequest(Method method, String url) {
+        return switch (method) {
+            case GET -> HttpRequest.get(url);
+            case POST -> HttpRequest.post(url);
+            case PUT -> HttpRequest.put(url);
+            case DELETE -> HttpRequest.delete(url);
+            case PATCH -> HttpRequest.patch(url);
+            case HEAD -> HttpRequest.head(url);
+            case OPTIONS -> HttpRequest.options(url);
+            case TRACE -> HttpRequest.trace(url);
+            default -> throw new IllegalStateException("Unexpected value: " + method);
+        };
+    }
+
+    /**
+     * 设置参数
+     */
+    private void setParams(HttpRequest request, Map<String, Object> params) {
+        if (params != null && !params.isEmpty()) {
+            request.form(params);
+        }
+    }
+
+    /**
+     * 设置请求体
+     */
+    private void setBody(HttpRequest request, String body) {
+        if (StrUtil.isNotBlank(body)) {
+            request.body(body);
+        }
+    }
+
+    /**
+     * 设置请求头(HttpHeaders → 取每个header的第一个值)
+     */
+    private void setHeaders(HttpRequest request, HttpHeaders headers) {
+        if (headers != null && !headers.isEmpty()) {
+            headers.forEach((key, values) -> {
+                if (values != null && !values.isEmpty()) {
+                    request.header(key, values.get(0));
+                }
+            });
+        }
+    }
+}

+ 21 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/properties/DaDiCrawlerProperties.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.dadi.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 恒邦财险
+ * @author: shenwd
+ * @date: 2025/4/7 11:34
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "dadi.crawler")
+public class DaDiCrawlerProperties {
+    /**
+     * 恒邦财险车险系统url
+     * https://car.hbins.com.cn
+     */
+    private String baseUrl;
+}

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

@@ -0,0 +1,19 @@
+package com.jzg.quotation.dadi.crawler.repository;
+
+import com.jzg.quotation.dadi.crawler.constant.po.DaDiCrawlerOrder;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
+
+/**
+ * @description: 恒邦财险 mongodb中操作数据
+ * @author: shenwd
+ * @date: 2025/4/10 18:06
+ **/
+public interface DaDiCrawlerOrderReposiroty extends MongoRepository<DaDiCrawlerOrder, String> {
+
+    @Query("{'ordersNo' : ?0}")
+    DaDiCrawlerOrder findByOrdersNo(String ordersNo);
+
+    @Query(value = "{'ordersNo': ?0 }", delete = true)
+    void deleteByOrdersNo(String ordersNo);
+}

+ 15 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/DaDiCrawlerOrderService.java

@@ -0,0 +1,15 @@
+package com.jzg.quotation.dadi.crawler.service;
+
+
+import com.jzg.quotation.dadi.crawler.constant.po.DaDiCrawlerOrder;
+
+public interface DaDiCrawlerOrderService {
+
+    DaDiCrawlerOrder findByOrdersNo(String ordersNo);
+
+    void deleteByOrdersNo(String ordersNo);
+
+    DaDiCrawlerOrder save(DaDiCrawlerOrder ZmCrawlerOrder);
+
+    DaDiCrawlerOrder update(DaDiCrawlerOrder ZmCrawlerOrder);
+}

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff