Bläddra i källkod

Merge remote-tracking branch 'origin/master'

jiakai 3 månader sedan
förälder
incheckning
cd114514cb
100 ändrade filer med 12434 tillägg och 2402 borttagningar
  1. 6 6
      authentication/src/main/resources/application-dev.yml
  2. 5 1
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java
  3. 8 0
      commons/src/main/java/com/jzg/commons/util/DateTimeUtils.java
  4. 2 4
      consoleStatistics/src/main/resources/application-dev.yml
  5. 2 2
      gateway/src/main/resources/application-dev.yml
  6. 4 4
      partner/src/main/resources/application-dev.yml
  7. 2 2
      platform/src/main/resources/application-dev.yml
  8. 4 4
      tenant/costsorrule/src/main/resources/application-dev.yml
  9. 1 0
      tenant/insurance/pom.xml
  10. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  11. 10 5
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  12. 8 9
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  13. 3 3
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java
  14. 13 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  15. 59 0
      tenant/insurance/quotation-dadi/pom.xml
  16. 115 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java
  17. 77 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerCacheComponent.java
  18. 828 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java
  19. 4 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/InsuranceMap.java
  20. 101 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelKindInfo.java
  21. 532 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiFuelVehicleInsurance.java
  22. 596 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/entity/DaDiNewEnergyVehicleInsurance.java
  23. 72 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/enums/RequestUrl.java
  24. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/constant/po/DaDiCrawlerOrder.java
  25. 39 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/DaDiCrawlerConfigureParameters.java
  26. 56 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiAgencyAgreementInfoRequest.java
  27. 20 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiAgentListRequest.java
  28. 569 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiApplicantInfoRequest.java
  29. 33 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiBaseRequest.java
  30. 75 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiCrawlerAuthenticateRequest.java
  31. 21 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiEleProposalQRCoreDataRequest.java
  32. 662 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java
  33. 65 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiJointSalesRequest.java
  34. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiOrderInfoRequest.java
  35. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiPayNoDataRequest.java
  36. 15 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQueryOrderInfoRequest.java
  37. 386 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java
  38. 482 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSaveFileIdxRequest.java
  39. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSpecialInformationRequest.java
  40. 69 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiSubmitOrderRequest.java
  41. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiTaxConfigRequest.java
  42. 101 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiTemporaryOrderRequest.java
  43. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUnderwritingRequest.java
  44. 48 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiUploadImageRequest.java
  45. 355 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleChannelRequest.java
  46. 612 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehicleModelRequest.java
  47. 136 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiVehiclePricRequest.java
  48. 170 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDivehicleOwnerInfoRequest.java
  49. 19 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiCurTaskRequest.java
  50. 446 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInsuredInfoRequest.java
  51. 146 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiInvoiceRequest.java
  52. 288 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DadiSaveInfoRequest.java
  53. 87 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiAgencyAgreementInfoResponse.java
  54. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiAgentInfoResponse.java
  55. 37 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiBaseResponse.java
  56. 105 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerAuthenticateResponse.java
  57. 33 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCrawlerCaptchaResponse.java
  58. 26 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiCurTaskResponse.java
  59. 18 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiEleProposalQRCoreDataResponse.java
  60. 34 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiGetUnderwritingResponse.java
  61. 202 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java
  62. 45 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiOrderInfoResponse.java
  63. 343 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiOssInitParamResponse.java
  64. 27 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiPayNoDataResponse.java
  65. 721 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderInfoResponse.java
  66. 42 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQueryOrderStatusResponse.java
  67. 463 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java
  68. 142 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSaveFileIdxResponse.java
  69. 67 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSpecialInformationResponse.java
  70. 36 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiSubmitOrderResponse.java
  71. 28 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTaxConfigResponse.java
  72. 20 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiTemporaryOrderResponse.java
  73. 23 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiUploadImageResponse.java
  74. 273 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleChannelInfoResponse.java
  75. 57 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehicleCheckInfoResponse.java
  76. 39 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiVehiclePricResponse.java
  77. 542 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/network/NetworkRequest.java
  78. 21 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/properties/DaDiCrawlerProperties.java
  79. 19 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/repository/DaDiCrawlerOrderReposiroty.java
  80. 15 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/DaDiCrawlerOrderService.java
  81. 42 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/DaDiCrawlerQuoteProcessService.java
  82. 8 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/DaDiCrawlerRequest.java
  83. 43 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerOrderServiceImpl.java
  84. 55 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerQuoteProcessServiceImpl.java
  85. 257 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerRequestImpl.java
  86. 303 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/CaptchaUtils.java
  87. 87 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiAESUtils.java
  88. 240 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiAliOssUtils.java
  89. 91 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiImageUtils.java
  90. 199 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiVehicleUtils.java
  91. 129 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/GsonUtils.java
  92. 0 2352
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/utils/JsonCompareUtil.java
  93. 6 0
      tenant/insurance/quotation-summary/pom.xml
  94. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  95. 9 3
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  96. 1 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCar.java
  97. 20 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCarInfoVo.java
  98. 1 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKOther.java
  99. 5 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKPremium.java
  100. 1 3
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java

+ 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:

+ 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
      */

+ 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));
+    }
 }

+ 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) {
             // 缓存报价信息

+ 3 - 3
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java

@@ -774,14 +774,14 @@ public class PremiumCalculationRequest {
                 // 司机
                 if (kindCode.equals("041") || kindCode.equals("YD11")) {
                     kind.sumInsured = new BigDecimal(kindInfoVo.getAmount());
-                    kind.unitInsured = new BigDecimal(kindInfoVo.getUnitAmount());
+                    kind.unitInsured = new BigDecimal(kindInfoVo.getAmount());
                     kind.quantity = 1;
                 }
                 // 乘客
                 else if (kindCode.equals("044") || kindCode.equals("YD12")) {
-                    kind.unitInsured = new BigDecimal(kindInfoVo.getUnitAmount());
+                    kind.unitInsured = new BigDecimal(kindInfoVo.getAmount());
                     kind.sumInsured =
-                            new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(Integer.parseInt(vehicle.getSeat()) - 1));;
+                            new BigDecimal(kindInfoVo.getAmount()).multiply(new BigDecimal(Integer.parseInt(vehicle.getSeat()) - 1));;
                     kind.quantity = Integer.parseInt(vehicle.getSeat()) - 1;
                 }
                 // 绝对免赔

+ 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);
+}

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

@@ -0,0 +1,42 @@
+package com.jzg.quotation.dadi.crawler.service;
+
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
+import org.springframework.http.HttpHeaders;
+
+public interface DaDiCrawlerQuoteProcessService {
+
+    /**
+     * 获取验证码
+     *
+     * @param sendCaptchaRequest 获取验证码请求
+     * @return 验证码响应
+     */
+    GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest);
+    /**
+     * 登录
+     *
+     * @param loginBase 登录信息
+     */
+    void login(LoginBase loginBase);
+
+    /**
+     * 检测登录
+     *
+     * @param detectLoginRequest 检测登录请求
+     * @return 检测结果
+     */
+    boolean detectLogin(DetectLoginRequest detectLoginRequest);
+
+    /**
+     * 获取请求头信息
+     *
+     * @param username 用户名
+     * @param password 密码
+     * @return 请求头
+     */
+    HttpHeaders getHeaders(String username, String password);
+
+}

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

@@ -0,0 +1,8 @@
+package com.jzg.quotation.dadi.crawler.service;
+
+import com.jzg.quotation.commons.service.GetCaptchaBaseService;
+import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
+
+public interface DaDiCrawlerRequest extends QuotationCrawlerBaseService, GetCaptchaBaseService {
+
+}

+ 43 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerOrderServiceImpl.java

@@ -0,0 +1,43 @@
+package com.jzg.quotation.dadi.crawler.service.impl;
+
+import com.jzg.quotation.dadi.crawler.constant.po.DaDiCrawlerOrder;
+import com.jzg.quotation.dadi.crawler.repository.DaDiCrawlerOrderReposiroty;
+import com.jzg.quotation.dadi.crawler.service.DaDiCrawlerOrderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【】
+ * @date 2026/5/26 17:26
+ */
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class DaDiCrawlerOrderServiceImpl implements DaDiCrawlerOrderService {
+
+    private final DaDiCrawlerOrderReposiroty daDiCrawlerOrderReposiroty;
+
+    @Override
+    public DaDiCrawlerOrder findByOrdersNo(String ordersNo) {
+        return daDiCrawlerOrderReposiroty.findByOrdersNo(ordersNo);
+    }
+
+    @Override
+    public void deleteByOrdersNo(String ordersNo) {
+        daDiCrawlerOrderReposiroty.deleteByOrdersNo(ordersNo);
+    }
+
+    @Override
+    public DaDiCrawlerOrder save(DaDiCrawlerOrder ZmCrawlerOrder) {
+        return daDiCrawlerOrderReposiroty.save(ZmCrawlerOrder);
+    }
+
+    @Override
+    public DaDiCrawlerOrder update(DaDiCrawlerOrder ZmCrawlerOrder) {
+        daDiCrawlerOrderReposiroty.deleteByOrdersNo(ZmCrawlerOrder.getOrdersNo());
+        return daDiCrawlerOrderReposiroty.save(ZmCrawlerOrder);
+    }
+}

+ 55 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerQuoteProcessServiceImpl.java

@@ -0,0 +1,55 @@
+package com.jzg.quotation.dadi.crawler.service.impl;
+
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
+import com.jzg.quotation.dadi.crawler.component.DaDiCrawlerCacheComponent;
+import com.jzg.quotation.dadi.crawler.component.DaDiCrawlerRequestComponent;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiCrawlerAuthenticateResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiCrawlerCaptchaResponse;
+import com.jzg.quotation.dadi.crawler.service.DaDiCrawlerQuoteProcessService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+@Service
+@RequiredArgsConstructor
+public class DaDiCrawlerQuoteProcessServiceImpl implements DaDiCrawlerQuoteProcessService {
+
+    private final DaDiCrawlerCacheComponent daDiCrawlerCacheComponent;
+
+    private final DaDiCrawlerRequestComponent daDiCrawlerRequestComponent;
+
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        DaDiCrawlerCaptchaResponse captchaResponse = daDiCrawlerRequestComponent.captcha();
+        GetCaptchaResponse getCaptchaResponse = new GetCaptchaResponse();
+        getCaptchaResponse.setCaptchaImage(captchaResponse.getSolve());
+        getCaptchaResponse.setIdentifyId(captchaResponse.getRandomNum());
+        return getCaptchaResponse;
+    }
+
+    @Override
+    public void login(LoginBase loginBase) {
+        DaDiCrawlerCaptchaResponse captchaResponse = daDiCrawlerRequestComponent.captcha();
+        DaDiCrawlerAuthenticateResponse daDiCrawlerAuthenticateResponse = daDiCrawlerRequestComponent.daDiLogin(loginBase.getUsername(), loginBase.getPassword(), captchaResponse.getSrc(), captchaResponse.getRandomNum());
+        daDiCrawlerCacheComponent.cacheToken(loginBase.getUsername(), daDiCrawlerAuthenticateResponse.getToken());
+        daDiCrawlerCacheComponent.cacheThirdComeCode(loginBase.getUsername(), daDiCrawlerAuthenticateResponse.getThirdComeCode());
+    }
+
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        String token = daDiCrawlerRequestComponent.getToken(detectLoginRequest.getUsername(), detectLoginRequest.getPassword());
+        return StringUtils.hasLength(token);
+    }
+
+    @Override
+    public HttpHeaders getHeaders(String username, String password) {
+        String token = daDiCrawlerRequestComponent.getToken(username, password);
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("X-Access-Token",  token);
+        return headers;
+    }
+}

+ 257 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerRequestImpl.java

@@ -0,0 +1,257 @@
+package com.jzg.quotation.dadi.crawler.service.impl;
+
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
+import com.jzg.commons.exception.ValidateException;
+import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
+import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.DetectLoginRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaRequest;
+import com.jzg.quotation.commons.entity.GetCaptchaResponse;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.dadi.crawler.build.DaDiCrawlerQuoteResultVoBuild;
+import com.jzg.quotation.dadi.crawler.component.DaDiCrawlerRequestComponent;
+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.DaDiVehicleChannelRequest;
+import com.jzg.quotation.dadi.crawler.entity.request.DaDivehicleOwnerInfoRequest;
+import com.jzg.quotation.dadi.crawler.entity.response.*;
+import com.jzg.quotation.dadi.crawler.service.DaDiCrawlerQuoteProcessService;
+import com.jzg.quotation.dadi.crawler.service.DaDiCrawlerRequest;
+import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@QuoteCrawlerService(value = InsuranceCode.INSURANCE_CCIC)
+@Service
+@RequiredArgsConstructor
+public class DaDiCrawlerRequestImpl implements DaDiCrawlerRequest {
+
+    private final DaDiCrawlerOrderServiceImpl daDiCrawlerOrderService;
+
+    private final DaDiCrawlerRequestComponent daDiCrawlerRequestComponent;
+
+    private final DaDiCrawlerQuoteProcessService daDiCrawlerQuoteProcessService;
+
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return daDiCrawlerQuoteProcessService.getCaptcha(sendCaptchaRequest);
+    }
+
+    @Override
+    public void login(LoginBase loginBase) {
+        daDiCrawlerQuoteProcessService.login(loginBase);
+    }
+
+
+    @Override
+    public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
+        return daDiCrawlerQuoteProcessService.detectLogin(detectLoginRequest);
+    }
+
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
+        // 1.0 获取token的请求头
+        AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
+        HttpHeaders headers = daDiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        // 1.1获取配置信息
+        DaDiCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaDiCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        //1.2获取代理人信息
+        DaDiAgentInfoResponse agentInfoVo = daDiCrawlerRequestComponent.getAgentInfo(headers, parameters, attributionInformationVo.getUsername());
+        // 1.3 获取代理协议信息
+        DaDiAgencyAgreementInfoResponse agencyAgreementInfo = daDiCrawlerRequestComponent.getAgencyAgreementInfo(headers, agentInfoVo);
+        DaDiVehicleChannelRequest daDiVehicleChannelRequest = getDaDiVehicleChannelRequest(quoteVo, agencyAgreementInfo, agentInfoVo);
+        // 1.4 获取车辆信息
+        DaDiVehicleChannelInfoResponse.CarModel vehicleModelVO = daDiCrawlerRequestComponent.getDaDiVehicleChannelInfo(headers, quoteVo.getCarInfoVo(), agentInfoVo, new DaDiVehiclePricResponse());
+        // 1.5 车价查询
+        DaDiVehiclePricResponse vehiclePricVo = daDiCrawlerRequestComponent.getDaDiVehiclePric(headers, quoteVo.getCarInfoVo(), daDiVehicleChannelRequest, vehicleModelVO);
+        //2.0 获取车主信息
+        DaDivehicleOwnerInfoRequest daDivehicleOwnerInfoRequest = new DaDivehicleOwnerInfoRequest(quoteVo);
+        //2.0.1 获取订单号
+        String orderId = daDiCrawlerRequestComponent.getOrderNo(headers, quoteVo, vehicleModelVO, agentInfoVo, daDiVehicleChannelRequest, daDivehicleOwnerInfoRequest, vehiclePricVo);
+        //3.0 计算报价
+        DaDiQuoteResponse daDiQuoteResponse = daDiCrawlerRequestComponent.getDaDiQuote(headers, orderId, new ArrayList<>(), quoteVo, daDiVehicleChannelRequest, vehicleModelVO, agentInfoVo, vehiclePricVo);
+
+        if (daDiQuoteResponse != null) {
+            //3.1 保存订单信息
+            DaDiSubmitOrderResponse daDiSubmitOrderResponse = daDiCrawlerRequestComponent.submitOrder(headers, quoteVo, orderId, daDiQuoteResponse, daDiVehicleChannelRequest);
+            //大地交强投保单号
+            String ciProposalNo = daDiSubmitOrderResponse.getProposalNoNew();
+            // 大地商业投保单号
+            String biProposalNo = "";
+            if (!TextUtils.isEmpty(ciProposalNo)) {
+                ciProposalNo = daDiSubmitOrderResponse.getProposalNoNew();
+                biProposalNo = daDiSubmitOrderResponse.getApplicationNo();
+            } else {
+                ciProposalNo = daDiSubmitOrderResponse.getApplicationNo();
+            }
+
+            DaDiCrawlerOrder daDiCrawlerOrder = new DaDiCrawlerOrder();
+            daDiCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+            daDiCrawlerOrder.setPlyappno(orderId);
+            daDiCrawlerOrder.setCiProposalNo(ciProposalNo);
+            daDiCrawlerOrder.setBiProposalNo(biProposalNo);
+            daDiCrawlerOrderService.save(daDiCrawlerOrder);
+        }
+
+        return DaDiCrawlerQuoteResultVoBuild.build(quoteVo, daDiQuoteResponse);
+    }
+
+    /**
+     * 构建大地车辆渠道请求对象
+     *
+     * @param agencyAgreementInfo 渠道协议信息响应
+     * @param agentInfoVo         代理人信息响应
+     * @return 组装好的大地车辆渠道请求对象
+     */
+    @NotNull
+    private static DaDiVehicleChannelRequest getDaDiVehicleChannelRequest(QuoteVo quoteVo, DaDiAgencyAgreementInfoResponse agencyAgreementInfo, DaDiAgentInfoResponse agentInfoVo) {
+        DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO salesMainMsgDto = agencyAgreementInfo.getSalesMainMsgDto();
+        DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO.SalesAgentMsgDtoDTO salesAgentMsgDto = salesMainMsgDto.getSalesAgentMsgDto();
+        List<DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO.SalesAgreementMsgListDTO> salesAgreementMsgList = salesMainMsgDto.getSalesAgreementMsgList();
+        DaDiAgencyAgreementInfoResponse.SalesMainMsgDtoDTO.SalesAgreementMsgListDTO salesAgreementMsgDto = salesAgreementMsgList.get(0);
+        DaDiVehicleChannelRequest daDiVehicleChannelRequest = new DaDiVehicleChannelRequest(quoteVo, agentInfoVo, salesAgreementMsgDto, salesAgentMsgDto);
+        return daDiVehicleChannelRequest;
+    }
+
+    @Override
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws Exception {
+        AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
+        HttpHeaders headers = daDiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        DaDiCrawlerOrder daDiCrawlerOrder = daDiCrawlerOrderService.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
+        DaDiGetUnderwritingResponse underwriting = daDiCrawlerRequestComponent.getUnderwriting(headers, underwritingVo, daDiCrawlerOrder);
+        UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        String msg = underwriting.getMsg();
+        if (underwriting.getUwType().equals("1") || underwriting.getUwType().equals("2")) {
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            underwritingResultsVo.setUnderwritingResult(msg + DaDiVehicleUtils.UW_TYPE_MAP.get(underwriting.getUwType()));
+        } else {
+            String jqApplyNo = "";
+            String syApplyNo = "";
+            if (underwriting.getProposalNos() != null && underwriting.getProposalNos().size() > 0) {
+                for (String item : underwriting.getProposalNos()) {
+                    if (item.contains("TDEJ") || item.contains("TDEN")) {
+                        syApplyNo = item;
+                    } else if (item.contains("TDFA")) {
+                        jqApplyNo = item;
+                    }
+                }
+            }
+
+            if (underwriting.getUwType().equals("3")) {
+                DaDiPayNoDataResponse payNoDataResponse = daDiCrawlerRequestComponent.getPayNo(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                DaDiEleProposalQRCoreDataResponse eleProposalQRCoreData = daDiCrawlerRequestComponent.getEleProposalQRCoreData(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            } else {
+                underwritingResultsVo.setUnderwritingResult(msg + DaDiVehicleUtils.UW_TYPE_MAP.get(underwriting.getUwType()));
+                underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            }
+
+            daDiCrawlerOrder.setCiProposalNo(jqApplyNo);
+            daDiCrawlerOrder.setBiProposalNo(syApplyNo);
+            daDiCrawlerOrderService.update(daDiCrawlerOrder);
+
+            underwritingResultsVo.setJyApplyNo(jqApplyNo);
+            underwritingResultsVo.setSyApplyNo(syApplyNo);
+            // 公司订单号
+            underwritingResultsVo.setCompanyOrderNo(daDiCrawlerOrder.getPlyappno());
+        }
+        return underwritingResultsVo;
+    }
+
+    @Override
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws Exception {
+        return null;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        try {
+            AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
+            DaDiCrawlerOrder daDiCrawlerOrder = daDiCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
+            HttpHeaders headers = daDiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+            DaDiUploadImageResponse daDiUploadImageResponse = daDiCrawlerRequestComponent.uploadImage(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+            // OSS初始化参数
+            DaDiOssInitParamResponse ossInitParam = daDiCrawlerRequestComponent.getOssInitParam(daDiUploadImageResponse.getToken());
+            daDiCrawlerRequestComponent.uploadAliOssImage(insuranceUploadImageVo.getImageVoList(), daDiUploadImageResponse.getBussNo(), ossInitParam);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void queryClauseData(ClauseDataVo clauseDataVo) {
+
+    }
+
+    @Override
+    public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
+        return null;
+    }
+
+    @Override
+    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
+        AttributionInformationVo attributionInformationVo = orderStatusVo.getOrder().getAttributionInformationVo();
+        DaDiCrawlerOrder daDiCrawlerOrder = daDiCrawlerOrderService.findByOrdersNo(orderStatusVo.getOrder().getOrdersNo());
+        HttpHeaders headers = daDiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        DaDiQueryOrderInfoResponse daDiQueryOrderInfoResponse = daDiCrawlerRequestComponent.queryOrderInfo(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+        OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
+        String orderStatus = daDiQueryOrderInfoResponse.getOrderStatus();
+        if (TextUtils.isEmpty(orderStatus)) {
+            throw new ValidateException("订单状态获取异常,请联系管理员");
+        }
+        switch (orderStatus) {
+            case "21":
+                orderStatusResultVo.setJqPolicyno(daDiCrawlerOrder.getCiProposalNo());
+                orderStatusResultVo.setSyApplyNo(daDiCrawlerOrder.getBiProposalNo());
+                orderStatusResultVo.setErrorMsg(DaDiVehicleUtils.ORDER_STATUS_DICT.get(orderStatus));
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                break;
+            case "23":
+            case "40":
+            case "41":
+                DaDiPayNoDataResponse payNo = daDiCrawlerRequestComponent.getPayNo(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                DaDiEleProposalQRCoreDataResponse eleProposalQRCoreData = daDiCrawlerRequestComponent.getEleProposalQRCoreData(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                orderStatusResultVo.setErrorMsg(DaDiVehicleUtils.ORDER_STATUS_DICT.get(orderStatus));
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                break;
+            case "24":
+                DaDiQueryOrderStatusResponse daDiQueryOrderStatusResponse = daDiCrawlerRequestComponent.queryOrderStatus(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                // 核保 状态
+                String certiStatus, undwrtName, undwrtText;
+                String certiStatustext = "";
+                int i = 0;
+                if (daDiQueryOrderStatusResponse.getCertiStatusList() != null && daDiQueryOrderStatusResponse.getCertiStatusList().size() > 0) {
+                    for (DaDiQueryOrderStatusResponse.CertiStatusListDTO item : daDiQueryOrderStatusResponse.getCertiStatusList()) {
+                        certiStatus = TextUtils.isEmpty(item.getCertiStatus()) ? "" : item.getCertiStatus();
+                        undwrtName = TextUtils.isEmpty(item.getUndwrtName()) ? "" : item.getUndwrtName();
+                        undwrtText = TextUtils.isEmpty(item.getUndwrtText()) ? "" : item.getUndwrtText();
+                        i++;
+                        certiStatustext += i + "、核保状态:" + certiStatus + " 核保人:" + undwrtName + " 核保意见:" + undwrtText + " ";
+                    }
+                }
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
+                orderStatusResultVo.setErrorMsg(certiStatustext);
+                break;
+            case "30":
+                orderStatusResultVo.setErrorMsg(DaDiVehicleUtils.ORDER_STATUS_DICT.get(orderStatus));
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.QUOTE_FAIL);
+                break;
+            default:
+                throw new ValidateException("订单状态" + DaDiVehicleUtils.ORDER_STATUS_DICT.get(orderStatus));
+        }
+
+        return orderStatusResultVo;
+    }
+}

+ 303 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/CaptchaUtils.java

@@ -0,0 +1,303 @@
+package com.jzg.quotation.dadi.utils;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】验证码识别工具类 - 中文数字等式计算
+ * @date 2026/5/22 08:49
+ */
+public class CaptchaUtils {
+
+    /**
+     * 中文个位数字映射(0-9 + 特殊数字)
+     */
+    private static final Map<Character, Integer> DIGIT_MAP = new LinkedHashMap<>();
+
+    /**
+     * 中文位值单位映射
+     */
+    private static final Map<Character, Integer> UNIT_MAP = new LinkedHashMap<>();
+
+    /**
+     * 中文运算符映射表
+     */
+    private static final Map<String, String> OPERATOR_MAP = new LinkedHashMap<>();
+
+    static {
+        // 中文个位数字(大小写兼容)
+        DIGIT_MAP.put('零', 0);
+        DIGIT_MAP.put('〇', 0);
+        DIGIT_MAP.put('○', 0);
+        DIGIT_MAP.put('一', 1);
+        DIGIT_MAP.put('壹', 1);
+        DIGIT_MAP.put('二', 2);
+        DIGIT_MAP.put('贰', 2);
+        DIGIT_MAP.put('两', 2);
+        DIGIT_MAP.put('三', 3);
+        DIGIT_MAP.put('叁', 3);
+        DIGIT_MAP.put('四', 4);
+        DIGIT_MAP.put('肆', 4);
+        DIGIT_MAP.put('五', 5);
+        DIGIT_MAP.put('伍', 5);
+        DIGIT_MAP.put('六', 6);
+        DIGIT_MAP.put('陆', 6);
+        DIGIT_MAP.put('七', 7);
+        DIGIT_MAP.put('柒', 7);
+        DIGIT_MAP.put('八', 8);
+        DIGIT_MAP.put('捌', 8);
+        DIGIT_MAP.put('九', 9);
+        DIGIT_MAP.put('玖', 9);
+
+        // 传统特殊数字(完整数值,无需单位即可表示)
+        DIGIT_MAP.put('廿', 20);
+        DIGIT_MAP.put('卅', 30);
+        DIGIT_MAP.put('卌', 40);
+
+        // 中文位值单位
+        UNIT_MAP.put('十', 10);
+        UNIT_MAP.put('拾', 10);
+        UNIT_MAP.put('百', 100);
+        UNIT_MAP.put('佰', 100);
+        UNIT_MAP.put('千', 1000);
+        UNIT_MAP.put('仟', 1000);
+        UNIT_MAP.put('萬', 10000);
+        UNIT_MAP.put('万', 10000);
+        UNIT_MAP.put('億', 100000000);
+        UNIT_MAP.put('亿', 100000000);
+
+        // 运算符(长的放前面保证优先匹配)
+        OPERATOR_MAP.put("加", "+");
+        OPERATOR_MAP.put("减", "-");
+        OPERATOR_MAP.put("减去", "-");
+        OPERATOR_MAP.put("乘", "*");
+        OPERATOR_MAP.put("乘以", "*");
+        OPERATOR_MAP.put("除", "/");
+        OPERATOR_MAP.put("除以", "/");
+    }
+
+    /**
+     * 中文数字转阿拉伯数字(支持单字符和多字符组合)
+     * <p>
+     * 支持格式:
+     * <ul>
+     *   <li>单字符:捌(8)、陆(6)、廿(20)、卅(30)、卌(40)</li>
+     *   <li>十位:十五(15)、叁拾(30)</li>
+     *   <li>百位:一百二十三(123)、贰佰叁拾肆(234)</li>
+     *   <li>千位:二千零二十(2020)</li>
+     *   <li>万位:一万二千三百四十五(12345)</li>
+     *   <li>亿位:一亿二千三百万(123000000)</li>
+     * </ul>
+     *
+     * @param chineseNum 中文数字字符串
+     * @return 阿拉伯数字
+     */
+    public static int toArabicNumber(String chineseNum) {
+        if (chineseNum == null || chineseNum.isEmpty()) {
+            throw new IllegalArgumentException("中文数字不能为空");
+        }
+
+        // 单字符快速路径
+        if (chineseNum.length() == 1) {
+            char ch = chineseNum.charAt(0);
+            Integer digitVal = DIGIT_MAP.get(ch);
+            if (digitVal != null) {
+                return digitVal;
+            }
+            throw new IllegalArgumentException("无法识别的中文数字: " + chineseNum);
+        }
+
+        long total = 0;      // 亿级以上累计
+        long section = 0;    // 当前万段累计值
+        long current = 0;    // 当前数字(尚未与单位结合)
+
+        for (int i = 0; i < chineseNum.length(); i++) {
+            char ch = chineseNum.charAt(i);
+
+            // 个位数字(0-9 或 特殊数字 廿/卅/卌)
+            Integer digitVal = DIGIT_MAP.get(ch);
+            if (digitVal != null) {
+                if (digitVal >= 20) {
+                    // 廿(20)/卅(30)/卌(40) → 完整数字,直接累加到当前段
+                    section += digitVal;
+                    current = 0;
+                } else {
+                    current = digitVal;
+                }
+                continue;
+            }
+
+            // 位值单位(十/百/千/万/亿)
+            Integer unitVal = UNIT_MAP.get(ch);
+            if (unitVal != null) {
+                if (current == 0) {
+                    current = 1; // "十" → 10, "百" → 100, "万" → 10000
+                }
+
+                if (unitVal >= 10000) {
+                    // 万/亿 → 将当前段结算并乘量级
+                    section = (section + current) * unitVal;
+                    if (unitVal >= 100000000) {
+                        // 亿 → 转移到 total
+                        total += section;
+                        section = 0;
+                    }
+                } else {
+                    // 十/百/千 → 乘以单位后加入当前段
+                    section += current * unitVal;
+                }
+                current = 0;
+                continue;
+            }
+
+            throw new IllegalArgumentException("无法识别的中文字符: " + ch);
+        }
+
+        return (int) (total + section + current);
+    }
+
+    /**
+     * 解析中文等式并计算结果(如 "捌加陆等于?" → 14)
+     *
+     * @param equation 中文等式,格式:{中文数字}{运算符}{中文数字}等于?
+     * @return 计算结果
+     */
+    public static int solve(String equation) {
+        if (equation == null || equation.isEmpty()) {
+            throw new IllegalArgumentException("等式不能为空");
+        }
+
+        // 构建所有中文数字字符集
+        StringBuilder numChars = new StringBuilder();
+        DIGIT_MAP.keySet().forEach(numChars::append);
+        UNIT_MAP.keySet().forEach(numChars::append);
+        String numPattern = "[" + Pattern.quote(numChars.toString()) + "]+";
+
+        // 运算符(长的放前面保证优先匹配)
+        String opPattern = "减去|乘以|除以|加|减|乘|除";
+
+        // 等?于?[??]? → 兼容"等于?"/"等于"/"等?"/"?"/无后缀等格式
+        Pattern pattern = Pattern.compile("(" + numPattern + ")(" + opPattern + ")(" + numPattern + ")等?于?[??]?");
+        Matcher matcher = pattern.matcher(equation);
+
+        if (!matcher.find()) {
+            throw new IllegalArgumentException("验证码有误,请重试" + equation);
+        }
+
+        String leftStr = matcher.group(1);
+        String operatorStr = matcher.group(2);
+        String rightStr = matcher.group(3);
+
+        int left = toArabicNumber(leftStr);
+        int right = toArabicNumber(rightStr);
+
+        return calculate(left, operatorStr, right);
+    }
+
+    /**
+     * 执行运算
+     *
+     * @param a        左操作数
+     * @param operator 运算符
+     * @param b        右操作数
+     * @return 计算结果
+     */
+    private static int calculate(int a, String operator, int b) {
+        switch (OPERATOR_MAP.getOrDefault(operator, operator)) {
+            case "+":
+                return a + b;
+            case "-":
+                return a - b;
+            case "*":
+                return a * b;
+            case "/":
+                if (b == 0) {
+                    throw new ArithmeticException("除数不能为零");
+                }
+                return a / b;
+            default:
+                throw new IllegalArgumentException("不支持的运算符: " + operator);
+        }
+    }
+
+    /**
+     * 解析中文等式并以字符串形式返回结果
+     *
+     * @param equation 中文等式
+     * @return 结果字符串
+     */
+    public static String solveToString(String equation) {
+        return String.valueOf(solve(equation));
+    }
+
+    /**
+     * 测试示例
+     */
+    public static void main(String[] args) {
+        // 基础单字符:捌加陆等于? → 8 + 6 = 14
+        System.out.println("捌加陆等于? → " + solve("捌加陆等于?"));
+
+        // 基础:玖减叁等于? → 9 - 3 = 6
+        System.out.println("玖减叁等于? → " + solve("玖减叁等于?"));
+
+        // 基础:柒乘伍等于? → 7 * 5 = 35
+        System.out.println("柒乘伍等于? → " + solve("柒乘伍等于?"));
+
+        // 十位:壹拾除以贰等于? → 10 / 2 = 5
+        System.out.println("壹拾除以贰等于? → " + solve("壹拾除以贰等于?"));
+
+        // 大写小写混用
+        System.out.println("五加九等于? → " + solve("五加九等于?"));
+
+        // 百位:贰佰加叁拾等于? → 200 + 30 = 230
+        System.out.println("贰佰加叁拾等于? → " + solve("贰佰加叁拾等于?"));
+
+        // 多字符:一百二十三乘二等于? → 123 * 2 = 246
+        System.out.println("一百二十三乘二等于? → " + solve("一百二十三乘二等于?"));
+
+        // 万位:一万贰仟叁佰肆拾伍加壹万等于? → 12345 + 10000 = 22345
+        System.out.println("一万贰仟叁佰肆拾伍加壹万等于? → " + solve("一万贰仟叁佰肆拾伍加壹万等于?"));
+
+        // 亿位:壹亿贰仟万加伍佰万等于? → 120000000 + 5000000 = 125000000
+        System.out.println("壹亿贰仟万加伍佰万等于? → " + solve("壹亿贰仟万加伍佰万等于?"));
+
+        // 特殊数字廿(20):廿加卅等于? → 20 + 30 = 50
+        System.out.println("廿加卅等于? → " + solve("廿加卅等于?"));
+
+        // 特殊数字卌(40):卌加六等于? → 40 + 6 = 46
+        System.out.println("卌加六等于? → " + solve("卌加六等于?"));
+
+        // 大写百位:贰佰叁拾肆加壹佰陆拾陆等于? → 234 + 166 = 400
+        System.out.println("贰佰叁拾肆加壹佰陆拾陆等于? → " + solve("贰佰叁拾肆加壹佰陆拾陆等于?"));
+
+        // 小写百位:二百三十四加一百六十六等于? → 234 + 166 = 400
+        System.out.println("二百三十四加一百六十六等于? → " + solve("二百三十四加一百六十六等于?"));
+
+        // 亿级:叁亿伍仟陆佰万减去捌佰万等于? → 356000000 - 8000000 = 348000000
+        System.out.println("叁亿伍仟陆佰万减去捌佰万等于? → " + solve("叁亿伍仟陆佰万减去捌佰万等于?"));
+
+        // solveToString 方法
+        System.out.println("五加捌等于? → " + solveToString("五加捌等于?"));
+
+        // ====== 兼容格式测试 ======
+        System.out.println("\n======== 兼容格式(等?/等于/?等变体) ========");
+        // "贰加六等?" → 2 + 6 = 8 (OCR可能漏识别"于")
+        System.out.println("贰加六等? → " + solve("贰加六等?"));
+
+        // "贰加六等于" → 2 + 6 = 8 (无问号)
+        System.out.println("贰加六等于 → " + solve("贰加六等于"));
+
+        // "贰加六?" → 2 + 6 = 8 (无"等于")
+        System.out.println("贰加六? → " + solve("贰加六?"));
+
+        // "贰加六" → 2 + 6 = 8 (纯等式)
+        System.out.println("贰加六 → " + solve("贰加六"));
+
+        // 半角问号
+        System.out.println("叁减壹等于? → " + solve("叁减壹等于?"));
+    }
+}

+ 87 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiAESUtils.java

@@ -0,0 +1,87 @@
+package com.jzg.quotation.dadi.utils;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParser;
+import com.google.gson.JsonSyntaxException;
+import com.jzg.commons.text.CharsetKit;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * @description: 恒邦财险 处理加密
+ * @author: Liub
+ * @date: 2026/05/21 15:00
+ **/
+public class DaDiAESUtils {
+    private static final String key = "9CF181E2CD72F8E6";
+
+    // 加密
+    public static byte[] encrypt(byte[] plaintext, byte[] key) throws Exception {
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+        return cipher.doFinal(plaintext);
+    }
+
+    // 解密
+    public static byte[] decrypt(byte[] ciphertext, byte[] key) throws Exception {
+        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
+        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+        cipher.init(Cipher.DECRYPT_MODE, keySpec);
+        return cipher.doFinal(ciphertext);
+    }
+
+
+    /**
+     * 对字符串进行AES加密并返回Base64编码结果
+     *
+     * @param input 待加密的原始字符串
+     * @return Base64编码后的加密字符串
+     * @throws Exception 加密过程中出现的异常
+     */
+    public static String encryptStr(String input) throws Exception {
+        byte[] encode = encrypt(input.getBytes(CharsetKit.UTF_8), key.getBytes());
+        return Base64.getEncoder().encodeToString(encode);
+    }
+
+    /**
+     * 对Base64编码的加密字符串进行AES解密
+     *
+     * @param input Base64编码的加密字符串
+     * @return 解密后的原始字符串
+     * @throws Exception 解密过程中出现的异常
+     */
+    public static String decryptStr(String input) throws Exception {
+        byte[] decode = Base64.getDecoder().decode(input);
+        byte[] decryptedBytes = decrypt(decode, key.getBytes());
+        String json = new String(decryptedBytes, CharsetKit.UTF_8);
+        return GsonUtils.formatJson(json);
+    }
+
+    /**
+     * 判断字符串是否为JSON格式
+     *
+     * @param jsonString 待判断的字符串
+     * @return true表示字符串为JSON格式,false表示字符串不是JSON格式
+     */
+    public static boolean isJson(String jsonString) {
+        try {
+            JsonParser parser = new JsonParser();
+            parser.parse(jsonString);
+            return true;
+        } catch (JsonSyntaxException e) {
+            return false;
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        String input = "F3firNE4FeoaanB+0NeJh64i7PSq3e5mAk3DGT0F4Wf6Y9715KczBFzJPNRhZQsW";
+        System.out.println(decryptStr(input));
+
+        String json = "AdhaVLL4V0XeovgWHTQyrw==";
+        System.out.println(decryptStr(json));
+    }
+}

+ 240 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiAliOssUtils.java

@@ -0,0 +1,240 @@
+package com.jzg.quotation.dadi.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.model.OSSObject;
+import com.aliyun.oss.model.ObjectMetadata;
+import com.aliyun.oss.model.PutObjectRequest;
+import com.aliyun.oss.model.PutObjectResult;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiOssInitParamResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【阿里云OSS】工具类 - 基于STS临时凭证上传文件
+ * @date 2026/5/28 18:06
+ */
+@Slf4j
+@Component
+public class DaDiAliOssUtils {
+
+    /**
+     * 根据OSS初始化参数构建OSS客户端(STS临时凭证)
+     */
+    private OSS buildOssClient(DaDiOssInitParamResponse ossParam) {
+        DaDiOssInitParamResponse.AccessKeyVoDTO accessKey = ossParam.getAccessKeyVo();
+        return new OSSClientBuilder().build(
+                accessKey.getEndpoint(),
+                accessKey.getAccessKeyId(),
+                accessKey.getAccessKeySecret(),
+                accessKey.getToken()
+        );
+    }
+
+    /**
+     * 构建对象Key(前缀 + 文件名)
+     */
+    private String buildObjectKey(DaDiOssInitParamResponse ossParam, String fileName) {
+        String dstKey = ossParam.getDstKey();
+        if (dstKey != null && !dstKey.isEmpty()) {
+            return dstKey.endsWith("/") ? dstKey + fileName : dstKey + "/" + fileName;
+        }
+        return fileName;
+    }
+
+    // ==================== 字节数组上传 ====================
+
+    /**
+     * 上传字节数组到OSS
+     *
+     * @param ossParam OSS初始化参数
+     * @param data     文件字节数组
+     * @param fileName 文件名(含扩展名)
+     * @return 上传成功后的文件URL
+     */
+    public String upload(DaDiOssInitParamResponse ossParam, byte[] data, String fileName) {
+        return upload(ossParam, new ByteArrayInputStream(data), fileName, data.length);
+    }
+
+    // ==================== InputStream上传 ====================
+
+    /**
+     * 上传InputStream到OSS
+     *
+     * @param ossParam      OSS初始化参数
+     * @param inputStream   输入流
+     * @param fileName      文件名(含扩展名)
+     * @param contentLength 内容长度
+     * @return 上传成功后的文件URL
+     */
+    public String upload(DaDiOssInitParamResponse ossParam, InputStream inputStream, String fileName, long contentLength) {
+        OSS ossClient = null;
+        try {
+            ossClient = buildOssClient(ossParam);
+
+            String bucketName = ossParam.getBucket();
+            String objectKey = buildObjectKey(ossParam, fileName);
+
+            // 设置元数据
+            ObjectMetadata metadata = new ObjectMetadata();
+            metadata.setContentLength(contentLength);
+            metadata.setContentType(getContentType(fileName));
+
+            // 上传
+            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, inputStream, metadata);
+            PutObjectResult result = ossClient.putObject(putObjectRequest);
+
+            log.info("\n----------------------> OSS上传成功, \n----------------------> bucket:{}, \n----------------------> objectKey:{}, \n----------------------> eTag:{}",
+                    bucketName, objectKey, result.getETag());
+
+            return buildFileUrl(ossParam, objectKey);
+        } catch (Exception e) {
+            log.error("\n----------------------> OSS上传失败, \n----------------------> fileName:{}", fileName, e);
+            throw new RuntimeException("OSS上传失败: " + fileName, e);
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+    // ==================== 本地文件上传 ====================
+
+    /**
+     * 上传本地文件到OSS
+     *
+     * @param ossParam OSS初始化参数
+     * @param file     本地文件
+     * @return 上传成功后的文件URL
+     */
+    public String uploadFile(DaDiOssInitParamResponse ossParam, File file) {
+        try (FileInputStream fis = new FileInputStream(file)) {
+            return upload(ossParam, fis, file.getName(), file.length());
+        } catch (Exception e) {
+            log.error("\n----------------------> OSS上传本地文件失败, \n----------------------> file:{}", file.getAbsolutePath(), e);
+            throw new RuntimeException("OSS上传本地文件失败: " + file.getAbsolutePath(), e);
+        }
+    }
+
+    /**
+     * 上传本地文件到OSS(指定文件名)
+     *
+     * @param ossParam OSS初始化参数
+     * @param filePath 本地文件路径
+     * @param fileName OSS中的文件名
+     * @return 上传成功后的文件URL
+     */
+    public String uploadFile(DaDiOssInitParamResponse ossParam, String filePath, String fileName) {
+        File file = new File(filePath);
+        try (FileInputStream fis = new FileInputStream(file)) {
+            return upload(ossParam, fis, fileName != null ? fileName : file.getName(), file.length());
+        } catch (Exception e) {
+            log.error("\n----------------------> OSS上传本地文件失败, \n----------------------> filePath:{}", filePath, e);
+            throw new RuntimeException("OSS上传本地文件失败: " + filePath, e);
+        }
+    }
+
+    // ==================== 文件下载 ====================
+
+    /**
+     * 从OSS下载文件
+     *
+     * @param ossParam  OSS初始化参数
+     * @param objectKey 对象Key
+     * @return OSSObject(包含文件流和元数据)
+     */
+    public OSSObject download(DaDiOssInitParamResponse ossParam, String objectKey) {
+        OSS ossClient = null;
+        try {
+            ossClient = buildOssClient(ossParam);
+            OSSObject ossObject = ossClient.getObject(ossParam.getBucket(), objectKey);
+            log.info("\n----------------------> OSS下载成功, \n----------------------> bucket:{}, \n----------------------> objectKey:{}",
+                    ossParam.getBucket(), objectKey);
+            return ossObject;
+        } catch (Exception e) {
+            log.error("\n----------------------> OSS下载失败, \n----------------------> objectKey:{}", objectKey, e);
+            throw new RuntimeException("OSS下载失败: " + objectKey, e);
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+    // ==================== 文件删除 ====================
+
+    /**
+     * 删除OSS中的文件
+     *
+     * @param ossParam  OSS初始化参数
+     * @param objectKey 对象Key
+     */
+    public void delete(DaDiOssInitParamResponse ossParam, String objectKey) {
+        OSS ossClient = null;
+        try {
+            ossClient = buildOssClient(ossParam);
+            ossClient.deleteObject(ossParam.getBucket(), objectKey);
+            log.info("\n----------------------> OSS删除成功, \n----------------------> bucket:{}, \n----------------------> objectKey:{}",
+                    ossParam.getBucket(), objectKey);
+        } catch (Exception e) {
+            log.error("\n----------------------> OSS删除失败, \n----------------------> objectKey:{}", objectKey, e);
+            throw new RuntimeException("OSS删除失败: " + objectKey, e);
+        } finally {
+            if (ossClient != null) {
+                ossClient.shutdown();
+            }
+        }
+    }
+
+    // ==================== 工具方法 ====================
+
+    /**
+     * 构建文件访问URL
+     */
+    private String buildFileUrl(DaDiOssInitParamResponse ossParam, String objectKey) {
+        String endpoint = ossParam.getAccessKeyVo().getEndpoint();
+        String bucket = ossParam.getBucket();
+        // 格式: https://bucket.endpoint/objectKey
+        if (endpoint.startsWith("http://") || endpoint.startsWith("https://")) {
+            String protocol = endpoint.startsWith("https://") ? "https://" : "http://";
+            String host = endpoint.substring(protocol.length());
+            return protocol + bucket + "." + host + "/" + objectKey;
+        }
+        return "https://" + bucket + "." + endpoint + "/" + objectKey;
+    }
+
+    /**
+     * 根据文件名获取Content-Type
+     */
+    private String getContentType(String fileName) {
+        if (fileName == null) {
+            return "application/octet-stream";
+        }
+        String lowerName = fileName.toLowerCase();
+        if (lowerName.endsWith(".jpg") || lowerName.endsWith(".jpeg")) {
+            return "image/jpeg";
+        } else if (lowerName.endsWith(".png")) {
+            return "image/png";
+        } else if (lowerName.endsWith(".gif")) {
+            return "image/gif";
+        } else if (lowerName.endsWith(".bmp")) {
+            return "image/bmp";
+        } else if (lowerName.endsWith(".pdf")) {
+            return "application/pdf";
+        } else if (lowerName.endsWith(".txt")) {
+            return "text/plain";
+        } else if (lowerName.endsWith(".html") || lowerName.endsWith(".htm")) {
+            return "text/html";
+        } else if (lowerName.endsWith(".mp4")) {
+            return "video/mp4";
+        }
+        return "application/octet-stream";
+    }
+}

+ 91 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiImageUtils.java

@@ -0,0 +1,91 @@
+package com.jzg.quotation.dadi.utils;
+
+import lombok.Data;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Base64;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 图片工具类
+ * @date 2026/05/29
+ */
+public class DaDiImageUtils {
+
+    /**
+     * 获取 Base64 编码图片的信息(大小、宽高、MD5)
+     *
+     * @param base64Str Base64 编码的图片字符串(可带 data:image/png;base64, 前缀)
+     * @return 图片信息对象,包含 sizeBytes(字节大小)、width(宽度)、height(高度)、md5(MD5值)
+     */
+    public static ImageBase64Info getBase64ImageInfo(String base64Str) {
+        // 1. 去除可能的 Base64 前缀(如 "data:image/png;base64,")
+        if (base64Str.contains(",")) {
+            base64Str = base64Str.substring(base64Str.indexOf(",") + 1);
+        }
+
+        // 2. Base64 解码为字节数组
+        byte[] imageData = Base64.getDecoder().decode(base64Str);
+
+        // 3. 计算 MD5
+        String md5Hash = md5Hex(imageData);
+
+        // 4. 读取图片宽高
+        int width = 0;
+        int height = 0;
+        try (ByteArrayInputStream bais = new ByteArrayInputStream(imageData)) {
+            BufferedImage img = ImageIO.read(bais);
+            if (img != null) {
+                width = img.getWidth();
+                height = img.getHeight();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException("读取图片信息失败", e);
+        }
+
+        // 5. 构建返回结果
+        ImageBase64Info info = new ImageBase64Info();
+        info.setSizeBytes(imageData.length);
+        info.setWidth(width);
+        info.setHeight(height);
+        info.setMd5(md5Hash);
+        return info;
+    }
+
+    /**
+     * 计算字节数组的 MD5 值(32位十六进制小写)
+     */
+    private static String md5Hex(byte[] data) {
+        try {
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] digest = md.digest(data);
+            StringBuilder sb = new StringBuilder();
+            for (byte b : digest) {
+                sb.append(String.format("%02x", b));
+            }
+            return sb.toString();
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5算法不可用", e);
+        }
+    }
+
+    // ==================== 图片信息结果类 ====================
+
+    @Data
+    public static class ImageBase64Info {
+        /** 图片二进制大小(字节) */
+        private long sizeBytes;
+        /** 图片宽度(像素) */
+        private int width;
+        /** 图片高度(像素) */
+        private int height;
+        /** 图片 MD5 值 */
+        private String md5;
+    }
+}

+ 199 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/DaDiVehicleUtils.java

@@ -0,0 +1,199 @@
+package com.jzg.quotation.dadi.utils;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import org.apache.http.util.TextUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description: 【大地财险】 车辆工具类
+ * @date 2026/5/23 16:05
+ */
+public class DaDiVehicleUtils {
+
+    /**
+     * 报价拒保原因字典
+     */
+    public static Map<String, String> UW_TYPE_DICT = new HashMap<>() {{
+        put("1", "👉该订单被拒保,请修改信息后重新出单。");
+        put("2", "👉该订单自核不通过,需返回修改,如仍需提交,可申请特批。");
+        put("3", "👉该订单需人工核保,提交订单后请密切关注核保结果。");
+    }};
+
+    /**
+     * 提核类型字典
+     */
+    public static Map<String, String> UW_TYPE_MAP = new HashMap<>() {{
+        put("1", "拒保");
+        put("2", "返回录单员修改");
+        put("4", "人工核保");
+        put("5", "人工核保");
+        put("6", "人工核保");
+        put("7", "人工核保");
+    }};
+
+    /**
+     * 订单状态字典
+     */
+    public static Map<String, String> ORDER_STATUS_DICT = new HashMap<>() {{
+        put("10", "暂存");
+        put("20", "待提核");
+        put("21", "核保中");
+        put("22", "核保失败");
+        put("23", "核保通过");
+        put("24", "核保退回");
+        put("30", "已生效");
+        put("31", "已作废");
+        put("32", "满期");
+        put("33", "退保");
+        put("40", "待支付");
+        put("41", "支付中");
+        put("42", "已支付");
+        put("50", "已过期");
+        put("51", "待续保");
+    }};
+
+
+    /**
+     * 获取过户信息
+     *
+     * @param carInfo 车辆信息
+     * @return [0]chgOwnerFlag 过户标识, [1]transferDate 过户日期, [2]transferVehicleType 过户车辆类型
+     */
+    public static String[] getTransferInfo(CarInfoVo carInfo) {
+        String chgOwnerFlag = "0";
+        String transferDate = "";
+        String transferVehicleType = "";
+        String specialCarFlag = "0";
+        boolean transferFlagBi = Boolean.TRUE.equals(carInfo.isTransferBi());
+        boolean transferFlag = Boolean.TRUE.equals(carInfo.isTransfer());
+
+        if (transferFlagBi || transferFlag) {
+            chgOwnerFlag = "1";
+            transferDate = carInfo.getIssueDate();
+            specialCarFlag = "1";
+            if (transferFlagBi && transferFlag) {
+                transferVehicleType = "TBI";
+            } else if (transferFlagBi) {
+                transferVehicleType = "BI";
+            } else {
+                transferVehicleType = "TI";
+            }
+        }
+        return new String[]{chgOwnerFlag, transferDate, transferVehicleType, specialCarFlag};
+    }
+
+    /**
+     * 计算车辆使用年限和月份
+     * 对应 Python calc_use_years()
+     */
+    public static int[] getCalcUseYears(CarInfoVo carInfo) {
+        // 使用年限
+        Map<String, Object> car = new HashMap<>();
+        car.put("firstyearDate", carInfo.getRegisterDate());
+        car.put("enrollDate", carInfo.getIssueDate());
+        LocalDate firstDate;
+        Object firstyearDate = car.get("firstyearDate");
+        Object enrollDate = car.get("enrollDate");
+
+        if (firstyearDate != null) {
+            firstDate = LocalDate.parse(firstyearDate.toString().replace("-", "/"), DateTimeFormatter.ofPattern("yyyy/M/d"));
+        } else if (enrollDate != null) {
+            firstDate = LocalDate.parse(enrollDate.toString().replace("-", "/"), DateTimeFormatter.ofPattern("yyyy/M/d"));
+        } else {
+            firstDate = LocalDate.now();
+        }
+
+        LocalDate effectDate = LocalDate.now().plusDays(1);
+
+        long yearsBetween = ChronoUnit.YEARS.between(firstDate, effectDate);
+        long monthsBetween = ChronoUnit.MONTHS.between(firstDate, effectDate);
+        long daysBetween = ChronoUnit.DAYS.between(firstDate.withDayOfYear(effectDate.getDayOfYear()), effectDate);
+
+        int useYears = (int) Math.max(yearsBetween, 0);
+        int useMonths = (int) monthsBetween;
+
+        return new int[]{useYears, useMonths};
+    }
+
+    /**
+     * 获取车辆种类代码
+     * 对应 Python get_car_kind_code()
+     */
+    public static String getCarKindCode(CarInfoVo carInfo) {
+        if (carInfo.getCarKindCode().equals("A0")) {
+            return "11";
+        } else {
+            return "21";
+        }
+    }
+
+    /**
+     * 营业车辆性质映射(vehicleUseCode → useNatureCode)
+     */
+    private static final Map<String, String> YY_CAR_NATURE_MAP = Map.of("01", "101",  // 营业出租租赁
+            "02", "102",  // 营业城市公交
+            "03", "103",  // 营业公路客运
+            "04", "104"   // 营业货运
+    );
+
+    /**
+     * 非营业车辆性质映射(vehicleUseCode → useNatureCode)
+     */
+    private static final Map<String, String> FYY_CAR_NATURE_MAP = Map.of("05", "85",   // 家庭自用
+            "06", "230",  // 非营业机关
+            "07", "220",  // 非营业企业
+            "08", "240"   // 非营业货运
+    );
+
+    /**
+     * 获取车辆性质代码(大地useNatureCode)
+     * 对应 Python get_car_nature_code()
+     */
+    public static String getCarNatureCode(CarInfoVo carInfo) {
+        String carNatureCode = carInfo.getCarNatureCode();
+        String vehicleUseCode = carInfo.getVehicleUseCode();
+
+        if ("01".equals(carNatureCode)) {
+            return YY_CAR_NATURE_MAP.getOrDefault(vehicleUseCode, carNatureCode);
+        } else if ("02".equals(carNatureCode)) {
+            return FYY_CAR_NATURE_MAP.getOrDefault(vehicleUseCode, carNatureCode);
+        }
+        return carNatureCode;
+    }
+
+    /**
+     * 获取车辆商业险代码
+     * 对应 Python get_car_syrisk_code()
+     */
+    public static String[] getCarSyriskCode(CarInfoVo carInfo) {
+        String licenseColorCode = "1";
+        String licenseType = "02";
+        String syriskCode = "DEJ";
+        if (carInfo.isNewEnergyMark()) {
+            licenseColorCode = "52";
+            licenseType = "06";
+            syriskCode = "DEN";
+        }
+        return new String[]{licenseColorCode, licenseType, syriskCode};
+    }
+
+    /**
+     * 获取车辆进口标识
+     * 对应 Python get_import_flag()
+     */
+    public static String getImportFlag(String importFlag) {
+        if (!TextUtils.isEmpty(importFlag) && importFlag.equals("进口")) {
+            return "2";
+        } else {
+            return "1";
+        }
+    }
+
+}

+ 129 - 0
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/utils/GsonUtils.java

@@ -0,0 +1,129 @@
+package com.jzg.quotation.dadi.utils;
+
+import com.alibaba.excel.support.cglib.beans.BeanMap;
+import com.alibaba.excel.util.StringUtils;
+import com.alibaba.fastjson.JSONArray;
+import com.google.common.collect.Maps;
+import com.google.gson.*;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * @author Liub
+ * @version 1.0
+ * @description:  Gson工具类
+ * @date 2026/5/29 17:50
+ */
+public class GsonUtils {
+    /**
+     * 单位缩进字符串。
+     */
+    private static final String SPACE = "   ";
+
+    private static final Gson gson = new GsonBuilder().create();
+
+    public static String toJson(Object value) {
+        return gson.toJson(value);
+    }
+
+    /**
+     * 转成bean
+     */
+    public static <T> T stringToBean (String gsonString, Class<T> cls) {
+        T t = null;
+        if (gson != null) {
+            t = gson.fromJson(gsonString, cls);
+        }
+        return t;
+    }
+
+
+    @SuppressWarnings("unchecked")
+    public static <T> T fromJson(String json, Type typeOfT) throws JsonParseException {
+        return gson.fromJson(json, typeOfT);
+    }
+
+    /**
+     * 转成list
+     */
+    public static <T> ArrayList<T> fromJsonList(String gsonString, Class<T> cls) {
+        ArrayList<T> list = new ArrayList<>();
+        if (gson != null) {
+            JsonArray array = new JsonParser().parse(gsonString).getAsJsonArray();
+            for (final JsonElement elem : array) {
+                list.add(gson.fromJson(elem, cls));
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 转成list, 有可能造成类型擦除
+     */
+    public static <T> ArrayList<T> fromJsonList(String gsonString) {
+        ArrayList<T> list = null;
+        if (gson != null) {
+            list = gson.fromJson(gsonString, new TypeToken<ArrayList<T>>() {
+            }.getType());
+        }
+        return list;
+    }
+
+    /**
+     * 返回格式化JSON字符串。
+     *
+     * @param json 未格式化的JSON字符串。
+     * @return 格式化的JSON字符串。
+     */
+    public static String formatJson(String json) {
+        Gson gson = new GsonBuilder().setPrettyPrinting().create();
+        return "\n" + gson.toJson(JsonParser.parseString(json)) + "\n";
+    }
+
+    /**
+     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。
+     *
+     * @param number 缩进次数。
+     * @return 指定缩进次数的字符串。
+     */
+    private static String indent(int number) {
+        StringBuffer result = new StringBuffer();
+        for (int i = 0; i < number; i++) {
+            result.append(SPACE);
+        }
+        return result.toString();
+    }
+
+    public static String toJSONString2(Object obj) {
+        JSONArray jsonObj = (JSONArray) JSONArray.toJSON(obj);
+        return jsonObj.toJSONString();
+    }
+
+    /**
+     * javaBean转map(空字段给默认值:空字符串)
+     *
+     * @param bean 待转换的bean对象
+     * @return Map<String, String> 转换后的Map,无null值
+     */
+    public static <T> Map<String, Object> objToStringMapWithDefault(T bean) {
+        Map<String, Object> map = Maps.newHashMap();
+        if (Objects.nonNull(bean)) {
+            BeanMap beanMap = BeanMap.create(bean);
+            for (Object key : beanMap.keySet()) {
+                Object tmp = beanMap.get(key);
+                if (Objects.nonNull(tmp)) {
+                    map.put(key.toString(), tmp);
+                } else {
+                    // null值字段填充为空字符串
+                    map.put(key.toString(), new Object());
+                }
+            }
+        }
+        return map;
+    }
+
+}

+ 0 - 2352
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/utils/JsonCompareUtil.java

@@ -1,2352 +0,0 @@
-package com.jzg.quotation.guoren.crawler.utils;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-import java.util.*;
-
-/**
- * JSON 深度对比工具(专门适配你两段保险保单JSON)
- * 输出:字段路径 + 原值 + 新值
- */
-public class JsonCompareUtil {
-    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
-
-    // 存储差异结果
-    public static class JsonDiff {
-        private final String path;
-        private final Object oldValue;
-        private final Object newValue;
-
-        public JsonDiff(String path, Object oldValue, Object newValue) {
-            this.path = path;
-            this.oldValue = oldValue;
-            this.newValue = newValue;
-        }
-
-        @Override
-        public String toString() {
-            return "【路径】" + path +
-                    "\n【第一段值】" + oldValue +
-                    "\n【第二段值】" + newValue +
-                    "\n----------------------------------------";
-        }
-    }
-
-    public static List<JsonDiff> compareJson(JsonNode oldJson, JsonNode newJson) {
-        List<JsonDiff> diffs = new ArrayList<>();
-        compareNode("", oldJson, newJson, diffs);
-        return diffs;
-    }
-
-    private static void compareNode(String path, JsonNode oldNode, JsonNode newNode, List<JsonDiff> diffs) {
-        if (oldNode == null && newNode == null) return;
-        if (oldNode == null) {
-            diffs.add(new JsonDiff(path, "null", newNode));
-            return;
-        }
-        if (newNode == null) {
-            diffs.add(new JsonDiff(path, oldNode, "null"));
-            return;
-        }
-
-        // 类型不同
-        if (!oldNode.getNodeType().equals(newNode.getNodeType())) {
-            diffs.add(new JsonDiff(path, oldNode, newNode));
-            return;
-        }
-
-        // 对象类型
-        if (oldNode.isObject()) {
-            Set<String> allFields = new HashSet<>();
-            oldNode.fieldNames().forEachRemaining(allFields::add);
-            newNode.fieldNames().forEachRemaining(allFields::add);
-
-            for (String field : allFields) {
-                String currentPath = path.isBlank() ? field : path + "." + field;
-                compareNode(currentPath, oldNode.get(field), newNode.get(field), diffs);
-            }
-        }
-        // 数组类型(按索引对比)
-        else if (oldNode.isArray()) {
-            int maxLen = Math.max(oldNode.size(), newNode.size());
-            for (int i = 0; i < maxLen; i++) {
-                JsonNode o = i < oldNode.size() ? oldNode.get(i) : null;
-                JsonNode n = i < newNode.size() ? newNode.get(i) : null;
-                compareNode(path + "[" + i + "]", o, n, diffs);
-            }
-        }
-        // 普通值
-        else {
-            String oldVal = oldNode.asText();
-            String newVal = newNode.asText();
-            if (!Objects.equals(oldVal, newVal)) {
-                diffs.add(new JsonDiff(path, oldVal, newVal));
-            }
-        }
-    }
-
-    // ====================== 测试:直接对比你的两段JSON ======================
-    public static void main(String[] args) throws Exception {
-        // 把你的两段JSON粘贴在这里
-        String json1 = "{\n" +
-                "    \"bc\": {\n" +
-                "        \"baseInfoInit\": 1,\n" +
-                "        \"riskCode\": \"0500\",\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"agreementNo\": \"\",\n" +
-                "            \"cooprOutlets\": \"\",\n" +
-                "            \"commissionerNo\": \"\",\n" +
-                "            \"comName\": \"太原营业大区科政保营业部经代业务部\",\n" +
-                "            \"handler1Name\": \"陶娇\",\n" +
-                "            \"agentName\": \"\",\n" +
-                "            \"project\": \"\",\n" +
-                "            \"unitMaintenanceName\": \"科政保天勤代理\",\n" +
-                "            \"unitMaintenanceType1Name\": \"代理\",\n" +
-                "            \"unitMaintenanceType2Name\": \"专业代理\",\n" +
-                "            \"channeltypeoneName\": \"个客发展\",\n" +
-                "            \"channeltypetwoName\": \"经代\",\n" +
-                "            \"argueSolution\": \"1\",\n" +
-                "            \"arbitboardName\": \"\",\n" +
-                "            \"isExpressProtectionFlag\": \"JSB00\",\n" +
-                "            \"eProposalFlag\": \"1\",\n" +
-                "            \"businessNature\": \"0\",\n" +
-                "            \"lifeAgentName\": \"\",\n" +
-                "            \"lifeAgentCode\": \"\",\n" +
-                "            \"saleProfessionalNum\": \"\",\n" +
-                "            \"saleGentType\": \"\",\n" +
-                "            \"agentCanalCode\": \" \",\n" +
-                "            \"amlCode\": \"\",\n" +
-                "            \"comCode\": \"305002A0\",\n" +
-                "            \"noCarFlag\": 0,\n" +
-                "            \"agentCode\": \"\",\n" +
-                "            \"saleName\": \"\",\n" +
-                "            \"cooprOutletsName\": \"\",\n" +
-                "            \"templateNo\": \"\",\n" +
-                "            \"handler1Code\": \"S3000222\",\n" +
-                "            \"channeltypeone\": \"60\",\n" +
-                "            \"channeltypetwo\": \"0101\",\n" +
-                "            \"unitMaintenanceCode\": \"3050D022512317323\",\n" +
-                "            \"unitmainTenanceType1\": \"D\",\n" +
-                "            \"unitmainTenanceType2\": \"02\",\n" +
-                "            \"classIdentifier\": \"00\",\n" +
-                "            \"isStandard\": \"0\",\n" +
-                "            \"uwELRrel1\": \"0\",\n" +
-                "            \"uwELRrel2\": \"0\",\n" +
-                "            \"templateName\": \"\",\n" +
-                "            \"deGentType\": \"\",\n" +
-                "            \"serviceLabelName\": \"\",\n" +
-                "            \"uniteBusinessFlag\": 0,\n" +
-                "            \"carsonlyid\": \"17118\",\n" +
-                "            \"goodCodes\": [],\n" +
-                "            \"noCarPremium\": 0,\n" +
-                "            \"operateDate\": \"2026-05-13\",\n" +
-                "            \"business\": null,\n" +
-                "            \"operatorCode\": \"W3000399\",\n" +
-                "            \"signDate\": \"2026-05-13\",\n" +
-                "            \"loginComCode\": \"305002A0\"\n" +
-                "        },\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"vinNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"engineNo\": \"1237456\",\n" +
-                "            \"carIdentifyType\": \"01\",\n" +
-                "            \"rateCode\": \"20\",\n" +
-                "            \"loanVehicleFlag\": \"0\",\n" +
-                "            \"chgOwnerFlag\": \"0\",\n" +
-                "            \"ciChgOwnerFlag\": \"0\",\n" +
-                "            \"biChgOwnerFlag\": \"0\",\n" +
-                "            \"newDeviceFlag\": \"0\",\n" +
-                "            \"chargingpostFlag\": \"0\",\n" +
-                "            \"productType\": \"0101\",\n" +
-                "            \"ownerAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"relationShip\": \"1\",\n" +
-                "            \"carCertificateDate\": \"\",\n" +
-                "            \"newCaRegistration\": \"1\",\n" +
-                "            \"ocr_invoice_flag\": \"0\",\n" +
-                "            \"idvalidStartDate\": \"2014-02-17\",\n" +
-                "            \"carOwnerNature\": \"0\",\n" +
-                "            \"birthday\": \"1962-07-08\",\n" +
-                "            \"idValidDate\": \"9999-12-31\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"carOwnerIdentifyType\": \"01\",\n" +
-                "            \"carOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"sex\": \"1\",\n" +
-                "            \"carOwnerAgeW\": \"63\",\n" +
-                "            \"ownerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"newEnergyFlag\": \"0\",\n" +
-                "            \"enrollDateValueStatus\": 1,\n" +
-                "            \"enrollDate\": \"2014-09-03\",\n" +
-                "            \"chgOwnerDate\": \"2014-09-03\",\n" +
-                "            \"useYears\": 11,\n" +
-                "            \"brandName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carInsuredRelation\": \"1\",\n" +
-                "            \"useNatureCode\": \"8A\",\n" +
-                "            \"maincarKindCode\": \"A\",\n" +
-                "            \"carKindCode\": \"A0\",\n" +
-                "            \"licenseCategory\": \"K33\",\n" +
-                "            \"carTypeCode\": \"1\",\n" +
-                "            \"licenseKindCode\": \"02\",\n" +
-                "            \"countryNature\": \"B\",\n" +
-                "            \"compromisePrice\": \"29960.00\",\n" +
-                "            \"fuelType\": \"0\",\n" +
-                "            \"seatCount\": \"5\",\n" +
-                "            \"tonCount\": \"0.0\",\n" +
-                "            \"exhaustScale\": \"1.997\",\n" +
-                "            \"power\": \"114\",\n" +
-                "            \"completeKerbMass\": \"1495\",\n" +
-                "            \"colorCode\": \"03\",\n" +
-                "            \"pureElectricBatteryType\": \"11\",\n" +
-                "            \"speed\": null,\n" +
-                "            \"powertypecode\": \"D1\",\n" +
-                "            \"carCertificateType\": \"\",\n" +
-                "            \"restricFlag\": \"\",\n" +
-                "            \"carAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"ownerProvinceName\": \"山西省\",\n" +
-                "            \"ownerCityName\": \"太原市\",\n" +
-                "            \"ownerPostName\": \"清徐县\",\n" +
-                "            \"postCode\": \"140100\",\n" +
-                "            \"identiFication\": 0,\n" +
-                "            \"carKindCodeDesc\": \"\",\n" +
-                "            \"licenseColorCode\": \"01\",\n" +
-                "            \"carOwnerRecogNition\": \"韩云福\",\n" +
-                "            \"vinNoRecogNition\": \"LHGCR1640E8037440\",\n" +
-                "            \"engineNoRecogNition\": \"1237456\",\n" +
-                "            \"licenseNoRecogNition\": \"晋A345G0\",\n" +
-                "            \"modelName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"modelNameRecogNition\": \"雅阁牌HG7205AAC4\",\n" +
-                "            \"enrollDateoRecogNition\": \"2014-09-03T00:00:00.000Z\",\n" +
-                "            \"chgOwnerDateRecogNition\": \"2014-09-03T00:00:00.000Z\",\n" +
-                "            \"useNatureCodeNitionNew\": \"非营运\",\n" +
-                "            \"useNatureCodeNition\": \"8A\",\n" +
-                "            \"maincarKindCodeNition\": \"A\",\n" +
-                "            \"carKindCodeNition\": \"A0\",\n" +
-                "            \"licenseKindCodeNition\": \"02\",\n" +
-                "            \"clauseType\": \"F54\",\n" +
-                "            \"natureOfUse\": 0,\n" +
-                "            \"addressRevise\": \"0\",\n" +
-                "            \"carOwnerIdentifyTypeSides\": \"back\",\n" +
-                "            \"carOwnerIdentifyNumberRecogNition\": \"140121196207080534\",\n" +
-                "            \"carAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"birthdayRecogNition\": \"1962-07-08\",\n" +
-                "            \"sexRecogNition\": \"1\",\n" +
-                "            \"ownersAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"carProvinceName\": \"山西省\",\n" +
-                "            \"carCityName\": \"太原市\",\n" +
-                "            \"carPostCode\": \"140100\",\n" +
-                "            \"carOwnerLongFlag\": \"1\",\n" +
-                "            \"vinClick\": \"1\",\n" +
-                "            \"tonCountlb\": 0,\n" +
-                "            \"seatCountlb\": 5,\n" +
-                "            \"exhaustScalelb\": 1.997,\n" +
-                "            \"powerLB\": 1.997,\n" +
-                "            \"newFuelModel\": \"正常缴税\",\n" +
-                "            \"mvSpeed\": null,\n" +
-                "            \"gearBoxtyPecodeName\": \"BS03-CVT\",\n" +
-                "            \"gearBoxtyPecode\": \"BS03\",\n" +
-                "            \"transmissionttype\": \"CVT\",\n" +
-                "            \"stopFlagCodeName\": \"1-停产\",\n" +
-                "            \"stopFlagCode\": \"1\",\n" +
-                "            \"riskTypeCodeName\": \"0-正常车型\",\n" +
-                "            \"riskTypeCode\": \"0\",\n" +
-                "            \"riskTypeName\": \"正常车型\",\n" +
-                "            \"vehicleClassNewCodeName\": \"JC04-中型轿车(B)\",\n" +
-                "            \"vehicleClassNewCode\": \"JC04\",\n" +
-                "            \"vehicleClassNewName\": \"中型轿车(B)\",\n" +
-                "            \"absFlag\": \"有\",\n" +
-                "            \"vehicleSize\": \"4930*1845*1470\",\n" +
-                "            \"newFuelModelName\": \"正常缴税\",\n" +
-                "            \"purchasePrice\": \"149800\",\n" +
-                "            \"brandCode\": \"BTAALD0103\",\n" +
-                "            \"carbrand\": \"雅阁(ACCORD)牌\",\n" +
-                "            \"modelCodeOld\": \"BTAALD0103\",\n" +
-                "            \"vinModel\": \"BTAALD0103\",\n" +
-                "            \"madeFactory\": \"广汽本田汽车有限公司\",\n" +
-                "            \"carUsage\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"vehicleBrand\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"modelCode\": \"BGQEYHUC0008\",\n" +
-                "            \"vehicleCode\": \"BGQEYHUC000871A1\",\n" +
-                "            \"actualValue\": \"29960.0\",\n" +
-                "            \"carName\": \"雅阁HG7205AAC4 舒适版\",\n" +
-                "            \"pureRiskPremium\": \"1\",\n" +
-                "            \"noticeType\": \"HG7205AAC4\",\n" +
-                "            \"ymModelSegmentation\": \"\",\n" +
-                "            \"basePureRiskPremium\": \"1290.596000\",\n" +
-                "            \"certifiCateDate\": null,\n" +
-                "            \"makeDate\": null,\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"clauseTypeSystem\": \"04\",\n" +
-                "            \"identify\": \"1\"\n" +
-                "        },\n" +
-                "        \"prpTinsured\": {\n" +
-                "            \"appliNationality\": \"中国\",\n" +
-                "            \"insuredNationality\": \"中国\",\n" +
-                "            \"appliNationalityCode\": \"156\",\n" +
-                "            \"insuredNationalityCode\": \"156\",\n" +
-                "            \"appliModifyFlag\": \"\",\n" +
-                "            \"insuredModifyFlag\": \"\",\n" +
-                "            \"appliUnitType\": \"12\",\n" +
-                "            \"insuredUnitType\": \"12\",\n" +
-                "            \"appliInsuredNature\": \"3\",\n" +
-                "            \"appliIDValidDate\": \"9999-12-31\",\n" +
-                "            \"appliIDValidStartDate\": \"2014-02-17\",\n" +
-                "            \"appliLowerViewFlag\": \"0\",\n" +
-                "            \"appliUnitcodeTimes\": null,\n" +
-                "            \"appliLinkmanIDTimes\": null,\n" +
-                "            \"appliShareholdersIDTimes\": null,\n" +
-                "            \"appliLegalRepresentativeIDTimes\": null,\n" +
-                "            \"appliValidDateLongFlag\": \"0\",\n" +
-                "            \"appliUnitcodeTimesLongFlag\": \"0\",\n" +
-                "            \"insuredInsuredNature\": \"3\",\n" +
-                "            \"insuredIDValidDate\": \"9999-12-31\",\n" +
-                "            \"insuredIDValidStartDate\": \"2014-02-17\",\n" +
-                "            \"insuredLowerViewFlag\": \"0\",\n" +
-                "            \"insuredUnitcodeTimes\": null,\n" +
-                "            \"insuredLinkmanIDTimes\": null,\n" +
-                "            \"insuredBeneficialOwnerIDTimes\": null,\n" +
-                "            \"insuredShareholdersIDTimes\": null,\n" +
-                "            \"insuredLegalRepresentativeIDTimes\": null,\n" +
-                "            \"insuredValidDateLongFlag\": \"0\",\n" +
-                "            \"insuredUnitcodeTimesLongFlag\": \"0\",\n" +
-                "            \"contactNumber\": null,\n" +
-                "            \"contactPostAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"contactBank\": null,\n" +
-                "            \"contactAccount\": null,\n" +
-                "            \"appliName\": \"韩云福\",\n" +
-                "            \"appliIdentifyType\": \"01\",\n" +
-                "            \"appliIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"appliBusinessRegistrationNo\": null,\n" +
-                "            \"appliOrgCode\": null,\n" +
-                "            \"appliLinkerIdentifiNumber\": \"\",\n" +
-                "            \"appliSex\": \"1\",\n" +
-                "            \"appliAgeW\": \"63\",\n" +
-                "            \"appliBirthday\": \"1962-07-08\",\n" +
-                "            \"agentidcardtype\": \"01\",\n" +
-                "            \"appliOtherIdentifyType\": \"\",\n" +
-                "            \"appliOtherIdentifyNumber\": \"\",\n" +
-                "            \"appliMobile\": \"17535521256\",\n" +
-                "            \"appliAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"appliAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"appliPostCode\": \"140100\",\n" +
-                "            \"appliclientNatureCode\": \" \",\n" +
-                "            \"appliclientNatureName\": \" \",\n" +
-                "            \"insuredclientNatureCode\": \" \",\n" +
-                "            \"insuredclientNatureName\": \" \",\n" +
-                "            \"appliLinkerName\": \"韩云福\",\n" +
-                "            \"insuredPostCode\": \"140100\",\n" +
-                "            \"appliProvinceName\": \"山西省\",\n" +
-                "            \"appliCityName\": \"太原市\",\n" +
-                "            \"insuredProvinceName\": \"\",\n" +
-                "            \"insuredCityName\": \"\",\n" +
-                "            \"insuredAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"appliLegalBeneficiary\": \"法定\",\n" +
-                "            \"insuredLegalBeneficiary\": \"法定\",\n" +
-                "            \"appliVIPType\": \"00\",\n" +
-                "            \"appliVIPFlag\": \"00\",\n" +
-                "            \"appliBusinesssource\": \"\",\n" +
-                "            \"appliOccupationCode\": \"10201\",\n" +
-                "            \"appliOccupation\": \"国家权力机关负责人\",\n" +
-                "            \"is_Agency_Handling\": \"\",\n" +
-                "            \"userIdentityTypePipe\": \"身份证\",\n" +
-                "            \"insuredIdentifyType\": \"01\",\n" +
-                "            \"insuredName\": \"韩云福\",\n" +
-                "            \"insuredLinkerName\": \"韩云福\",\n" +
-                "            \"insuredIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"insuredSex\": \"1\",\n" +
-                "            \"insuredAddress\": \"\",\n" +
-                "            \"insuredAgeW\": \"63\",\n" +
-                "            \"insuredBirthday\": \"1962-07-08\",\n" +
-                "            \"appliIdentifyTypeSides\": \"face\",\n" +
-                "            \"insuredBusinesssource\": \"\",\n" +
-                "            \"insuredOrgCode\": null,\n" +
-                "            \"insuredBusinessRegistrationNo\": null,\n" +
-                "            \"insuredLinkerIdentifiNumber\": \"\",\n" +
-                "            \"insuredMobile\": \"17535521256\",\n" +
-                "            \"insuredVIPType\": \"00\",\n" +
-                "            \"insuredVIPFlag\": \"00\",\n" +
-                "            \"insuredOccupation\": \"国家权力机关负责人\",\n" +
-                "            \"insuredOccupationCode\": \"10201\",\n" +
-                "            \"agentidcard\": \"140121196207080534\",\n" +
-                "            \"appliPostName\": \"清徐县\",\n" +
-                "            \"appliLegalRepresentative\": \"\",\n" +
-                "            \"appliShareholders\": \"\",\n" +
-                "            \"appliBsinessScope\": \"\",\n" +
-                "            \"appliShareholdersIDType\": \"\",\n" +
-                "            \"appliShareholdersIDNum\": \"\",\n" +
-                "            \"appliLegalRepresentativeIDType\": \"\",\n" +
-                "            \"appliLegalRepresentativeIDNum\": \"\",\n" +
-                "            \"appliLinkmanIDType\": \"\",\n" +
-                "            \"appliLinkmanIDNum\": \"\",\n" +
-                "            \"appliLinkmanNationality\": \"\",\n" +
-                "            \"appliRegisteredCapital\": null,\n" +
-                "            \"appliUnitNature\": \"\",\n" +
-                "            \"insuredLegalRepresentative\": \"\",\n" +
-                "            \"insuredShareholders\": \"\",\n" +
-                "            \"insuredBsinessScope\": \"\",\n" +
-                "            \"insuredShareholdersIDType\": \"\",\n" +
-                "            \"insuredShareholdersIDNum\": \"\",\n" +
-                "            \"insuredLegalRepresentativeIDType\": \"\",\n" +
-                "            \"insuredLegalRepresentativeIDNum\": \"\",\n" +
-                "            \"insuredLinkmanIDType\": \"\",\n" +
-                "            \"insuredLinkmanIDNum\": \"\",\n" +
-                "            \"insuredLinkmanNationality\": \"\",\n" +
-                "            \"insuredBeneficialOwnerName\": \"\",\n" +
-                "            \"insuredBeneficialOwnerNationality\": \"\",\n" +
-                "            \"insuredBeneficialOwnerIDType\": \"\",\n" +
-                "            \"insuredBeneficialOwnerIDNum\": \"\",\n" +
-                "            \"insuredBeneficialOwnerAddress\": \"\",\n" +
-                "            \"insuredRegisteredCapital\": null,\n" +
-                "            \"insuredUnitNature\": \"\"\n" +
-                "        },\n" +
-                "        \"prpDcarModel\": {\n" +
-                "            \"isQueryByVinNo\": true\n" +
-                "        },\n" +
-                "        \"prpTengiNeerList\": [\n" +
-                "            {\n" +
-                "                \"projectname\": \"\",\n" +
-                "                \"projectcode\": \"\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"ocrOrder\": {\n" +
-                "            \"ocrCarOwner\": \"韩云福\",\n" +
-                "            \"ocrCarOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrCarAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrIdvalidStartDate\": \"2014-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrIdValidDate\": \"2024-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrAppliName\": \"韩云福\",\n" +
-                "            \"ocrAppliIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrAppliAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrAppliIDValidStartDate\": \"2014-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrAppliIDValidDate\": \"2024-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrInsuredName\": \"韩云福\",\n" +
-                "            \"ocrInsuredIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrInsuredAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrInsuredIDValidStartDate\": \"2014-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrInsuredIDValidDate\": \"2024-02-17T00:00:00.000Z\",\n" +
-                "            \"ocrOwnerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrVinNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"ocrEngineNo\": \"1237456\",\n" +
-                "            \"ocrEnrolLDate\": \"2014-09-03T00:00:00.000Z\",\n" +
-                "            \"ocrChgOwnerDate\": \"2014-09-03T00:00:00.000Z\",\n" +
-                "            \"ocrModelName\": \"雅阁牌HG7205AAC4\",\n" +
-                "            \"ocrUseYears\": 11,\n" +
-                "            \"ocrUseNatureCode\": \"8A\",\n" +
-                "            \"ocrMaincarKindCode\": \"A\",\n" +
-                "            \"ocrCarKindCode\": \"A0\",\n" +
-                "            \"ocrLicenseCategory\": \"K33\",\n" +
-                "            \"ocrLicenseKindCode\": \"02\"\n" +
-                "        },\n" +
-                "        \"agriFlagBC\": \"0\",\n" +
-                "        \"insuredTypeTmp\": \"1\",\n" +
-                "        \"proposalNO\": \"30\",\n" +
-                "        \"prpTChannel\": {\n" +
-                "            \"agentCode\": \"\",\n" +
-                "            \"saleGentType\": \"\",\n" +
-                "            \"agentIdNo\": \"\"\n" +
-                "        },\n" +
-                "        \"prptBeneficialOwnerVos\": [],\n" +
-                "        \"prptShareholderVos\": [],\n" +
-                "        \"derailleurType\": \"雅阁\",\n" +
-                "        \"carAppliTypeTmp\": 1,\n" +
-                "        \"loginComCode\": \"305002A0\",\n" +
-                "        \"feeandDiscountFlag\": \"0\"\n" +
-                "    },\n" +
-                "    \"basePartVo\": {\n" +
-                "        \"editType\": \"EditType_ProposalInput\",\n" +
-                "        \"inputType\": \"34\",\n" +
-                "        \"inputSource\": \"\",\n" +
-                "        \"includeFilePathType\": \"\",\n" +
-                "        \"loginComCode\": \"305002A0\",\n" +
-                "        \"loginComCodeSub\": \"30\",\n" +
-                "        \"loginRiskCode\": \"0500\",\n" +
-                "        \"userCode\": \"W3000399\"\n" +
-                "    },\n" +
-                "    \"bi\": {\n" +
-                "        \"prpDclauseRule\": [],\n" +
-                "        \"inintFlag\": 1,\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"startDate\": \"2026-05-14\",\n" +
-                "            \"endDate\": \"2027-05-13\",\n" +
-                "            \"startHour\": 0,\n" +
-                "            \"endHour\": 24,\n" +
-                "            \"startMinute\": 0,\n" +
-                "            \"endMinute\": 0,\n" +
-                "            \"period0530\": 30,\n" +
-                "            \"immeValidStartDate\": \"\",\n" +
-                "            \"immeValidEndDate\": \"\",\n" +
-                "            \"feeandDiscountFlag\": \"0\",\n" +
-                "            \"saleChange\": \"0\",\n" +
-                "            \"immeValiFlag0518\": 0,\n" +
-                "            \"startDate0518\": \"2026-05-14T00:28:06.679Z\",\n" +
-                "            \"endDate0518\": \"2027-05-13T00:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0518\": \"2026-05-13T00:28:06.679Z\",\n" +
-                "            \"immeValidEndDate0518\": \"2027-05-13T00:28:06.679Z\",\n" +
-                "            \"startHour0518\": 0,\n" +
-                "            \"endHour0518\": 24,\n" +
-                "            \"startMinute0518\": 0,\n" +
-                "            \"endMinute0518\": 0,\n" +
-                "            \"startDateFlag0518\": 0,\n" +
-                "            \"immeValiFlag0521\": 0,\n" +
-                "            \"startDate0521\": \"2026-05-14T00:28:06.679Z\",\n" +
-                "            \"endDate0521\": \"2027-05-13T00:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0521\": \"2026-05-13T00:28:06.679Z\",\n" +
-                "            \"immeValidEndDate0521\": \"2027-05-13T00:28:06.679Z\",\n" +
-                "            \"startHour0521\": 0,\n" +
-                "            \"endHour0521\": 24,\n" +
-                "            \"startMinute0521\": 0,\n" +
-                "            \"endMinute0521\": 0,\n" +
-                "            \"startDateFlag0521\": 0,\n" +
-                "            \"immeValiFlag0530\": 0,\n" +
-                "            \"startDate0530\": \"2026-05-14T00:28:06.679Z\",\n" +
-                "            \"endDate0530\": \"2027-05-13T00:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0530\": \"2026-05-13T00:28:06.679Z\",\n" +
-                "            \"immeValidEndDate0530\": \"2027-05-13T00:28:06.679Z\",\n" +
-                "            \"startHour0530\": 0,\n" +
-                "            \"endHour0530\": 24,\n" +
-                "            \"startMinute0530\": 0,\n" +
-                "            \"endMinute0530\": 0,\n" +
-                "            \"startDateFlag0530\": 0,\n" +
-                "            \"answer\": \"\",\n" +
-                "            \"expectDiscount\": \"\",\n" +
-                "            \"signDiscount\": \"\",\n" +
-                "            \"sumLowerRate\": \"\",\n" +
-                "            \"firstProposalDate\": \"2026-05-13 08:29:05\",\n" +
-                "            \"renewalFlag\": \"\",\n" +
-                "            \"sumPremium\": \"\",\n" +
-                "            \"inputDate\": \"2026-05-13\",\n" +
-                "            \"signDate\": \"2026-05-13\",\n" +
-                "            \"immeValiFlag\": \"\"\n" +
-                "        },\n" +
-                "        \"prpTmainRate\": {},\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"termsSystem\": \"01\",\n" +
-                "            \"clauseTypeSystem\": \"04\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemand\": {\n" +
-                "            \"demandNo\": \"\",\n" +
-                "            \"checkCode\": \"\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemandPay\": [],\n" +
-                "        \"ciInsureDemandWarningClaim\": [],\n" +
-                "        \"prpTenGearAllocationFeeList\": [],\n" +
-                "        \"prpTchargingPostData\": [],\n" +
-                "        \"prptitemkindList\": [\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20B\",\n" +
-                "                \"kindName\": \"机动车第三者责任保险\",\n" +
-                "                \"itemKindNo\": \"33\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"2000000\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"\",\n" +
-                "                \"quantity\": \"\",\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 1  1 \",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"isMedical\": true,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20D3\",\n" +
-                "                \"kindName\": \"机动车车上人员责任保险(驾驶员)\",\n" +
-                "                \"itemKindNo\": \"35\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": 10000,\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"10000\",\n" +
-                "                \"quantity\": 1,\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 1  1 \",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"isMedical\": 0,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20D4\",\n" +
-                "                \"kindName\": \"机动车车上人员责任保险(乘客)\",\n" +
-                "                \"itemKindNo\": \"37\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": 40000,\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"10000\",\n" +
-                "                \"quantity\": 4,\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 1  1 \",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"isMedical\": 0,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20Z1\",\n" +
-                "                \"kindName\": \"道路救援服务特约条款\",\n" +
-                "                \"itemKindNo\": \"57\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"0\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"\",\n" +
-                "                \"quantity\": 22,\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 2  1 \",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20Z2\",\n" +
-                "                \"kindName\": \"车辆安全检测特约条款\",\n" +
-                "                \"itemKindNo\": \"58\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"0\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"\",\n" +
-                "                \"quantity\": 1,\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 2  1 \",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20Z4\",\n" +
-                "                \"kindName\": \"代为送检服务特约条款\",\n" +
-                "                \"itemKindNo\": \"38\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"0\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"\",\n" +
-                "                \"quantity\": 1,\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 2  1 \",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"checked\": true,\n" +
-                "                \"kindCode\": \"20Y\",\n" +
-                "                \"kindName\": \"附加医保外医疗费用责任险-三者险\",\n" +
-                "                \"itemKindNo\": \"54\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-14\",\n" +
-                "                \"endDate\": \"2027-05-13\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"0\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"value\": \"\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"unitAmount\": \"\",\n" +
-                "                \"quantity\": \"\",\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"flag\": \" 2  0 \",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"shareSumLimitSign\": 1,\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"prptengageList\": [],\n" +
-                "        \"prpDclause\": [],\n" +
-                "        \"prpTcarDeviceCount\": {},\n" +
-                "        \"prpTrenewal\": [],\n" +
-                "        \"queryExpensePowerOutputVo\": {},\n" +
-                "        \"ciInsureValid\": {},\n" +
-                "        \"prpDagentVo\": {},\n" +
-                "        \"commercialInsurances\": [],\n" +
-                "        \"blPrpTRealNameVerification\": [],\n" +
-                "        \"prpTLastCarShipTax\": {},\n" +
-                "        \"duplicateInsuranceItemsSchema\": {},\n" +
-                "        \"termsSystem\": \"04\",\n" +
-                "        \"inputRisk\": 1,\n" +
-                "        \"inputRisk0518\": 1,\n" +
-                "        \"inputRisk0521\": 0,\n" +
-                "        \"inputRisk0530\": 0,\n" +
-                "        \"shortRate\": 100,\n" +
-                "        \"prpTChannel\": {\n" +
-                "            \"agentCode\": \"\",\n" +
-                "            \"saleGentType\": \"\",\n" +
-                "            \"agentIdNo\": \"\"\n" +
-                "        },\n" +
-                "        \"calculateFlagBI\": \"1\"\n" +
-                "    },\n" +
-                "    \"ci\": {\n" +
-                "        \"prpDclauseRule\": [],\n" +
-                "        \"showCarShip\": true,\n" +
-                "        \"carShipTaxInfoInit\": 1,\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"startDate\": \"2026-05-31\",\n" +
-                "            \"endDate\": \"2027-05-30\",\n" +
-                "            \"startMinute\": 0,\n" +
-                "            \"endMinute\": 0,\n" +
-                "            \"immeValidStartDate\": \"\",\n" +
-                "            \"immeValidEndDate\": \"\",\n" +
-                "            \"immeValiFlag0507\": \"\",\n" +
-                "            \"startDate0507\": \"2026-05-30T16:00:00.000Z\",\n" +
-                "            \"endDate0507\": \"2027-05-29T16:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0507\": \"2026-05-30T16:00:00.000Z\",\n" +
-                "            \"immeValidEndDate0507\": \"2027-05-29T16:00:00.000Z\",\n" +
-                "            \"startHour0507\": 0,\n" +
-                "            \"endHour0507\": 24,\n" +
-                "            \"startMinute0507\": 0,\n" +
-                "            \"endMinute0507\": 0,\n" +
-                "            \"startDateFlag0507\": 0,\n" +
-                "            \"immeValiFlag0507t1\": 0,\n" +
-                "            \"startDate0507t1\": \"2026-05-14T00:28:06.679Z\",\n" +
-                "            \"endDate0507t1\": \"2027-05-13T00:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0507t1\": \"2026-05-13T00:28:06.679Z\",\n" +
-                "            \"immeValidEndDate0507t1\": \"2027-05-13T00:28:06.679Z\",\n" +
-                "            \"startMinute0507t1\": 0,\n" +
-                "            \"endMinute0507t1\": 0,\n" +
-                "            \"startDateFlag0507t1\": 0,\n" +
-                "            \"answer\": \"\",\n" +
-                "            \"saleChange\": \"0\",\n" +
-                "            \"firstProposalDate\": \"2026-05-13 08:29:05\",\n" +
-                "            \"renewalFlag\": \"\",\n" +
-                "            \"sumPremium\": \"\",\n" +
-                "            \"biAnswer\": \"\",\n" +
-                "            \"startHour\": 0,\n" +
-                "            \"endHour\": 24,\n" +
-                "            \"immeValiFlag\": \"\",\n" +
-                "            \"inputDate\": \"2026-05-13\",\n" +
-                "            \"signDate\": \"2026-05-13\"\n" +
-                "        },\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"clauseTypeSystem\": \"04\"\n" +
-                "        },\n" +
-                "        \"prpTmainRate\": {},\n" +
-                "        \"prptitemkindList\": [\n" +
-                "            {\n" +
-                "                \"kindCode\": \"BZ\",\n" +
-                "                \"kindName\": \"机动车交通事故责任强制保险\",\n" +
-                "                \"itemKindNo\": \"0\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"calculateFlag\": \"N\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"isDeductible\": true,\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"amount\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"0\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"flag\": \" 2  03\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"endHour\": 0,\n" +
-                "                \"endMinute\": 0\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"prptengageList\": [],\n" +
-                "        \"prpDclause\": [],\n" +
-                "        \"prpTitemCarExt\": {},\n" +
-                "        \"ciInsureDemand\": {\n" +
-                "            \"demandNo\": \"\",\n" +
-                "            \"checkCode\": \"\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemandPay\": [],\n" +
-                "        \"ciInsureDemandLoss\": [],\n" +
-                "        \"ciInsureDemandWarningClaim\": [],\n" +
-                "        \"ciCarShipTaxQGDemandSchema\": {},\n" +
-                "        \"cICarshipTaxDemandSchema\": {},\n" +
-                "        \"prpTcarshipTax\": {\n" +
-                "            \"calLateFeeFlag\": \"\",\n" +
-                "            \"calPayBalanceFeeFlag\": \"\",\n" +
-                "            \"extendChar2\": \"K33\",\n" +
-                "            \"lateFeeStartDate\": null,\n" +
-                "            \"hisPolicyEndDate\": null,\n" +
-                "            \"payStartDate\": null,\n" +
-                "            \"payEndDate\": null,\n" +
-                "            \"taxDocumentDate\": null,\n" +
-                "            \"taxpayerName\": \"韩云福\",\n" +
-                "            \"taxpayerIdentifier\": \"140121196207080534\",\n" +
-                "            \"taxRelifFlag\": \"1\",\n" +
-                "            \"calculateMode\": \"1\",\n" +
-                "            \"completeKerbMass\": \"1495\",\n" +
-                "            \"taxItemCode\": \"A\",\n" +
-                "            \"taxItemName\": \"载客汽车\",\n" +
-                "            \"taxItemDetailCode\": \"A1\",\n" +
-                "            \"taxItemDetailName\": \"小型客车\",\n" +
-                "            \"taxUnit\": \"1\",\n" +
-                "            \"sumPayTax\": \"\",\n" +
-                "            \"certificateDate\": null\n" +
-                "        },\n" +
-                "        \"prpTrenewal\": [],\n" +
-                "        \"queryExpensePowerOutputVo\": {},\n" +
-                "        \"ciInsureValid\": {},\n" +
-                "        \"trafficInsurance\": {},\n" +
-                "        \"blPrpTRealNameVerification\": [],\n" +
-                "        \"prpTLastCarShipTax\": {},\n" +
-                "        \"duplicateInsuranceItemsSchema\": {},\n" +
-                "        \"image\": {\n" +
-                "            \"changingThisBreaksApplicationSecurity\": \"data:image/png;base64,\"\n" +
-                "        },\n" +
-                "        \"inputRisk\": 1,\n" +
-                "        \"inputRisk0507\": 1,\n" +
-                "        \"inputRisk0507t1\": 0,\n" +
-                "        \"shortRate\": 100,\n" +
-                "        \"prpTChannel\": {\n" +
-                "            \"agentCode\": \"\",\n" +
-                "            \"saleGentType\": \"\",\n" +
-                "            \"agentIdNo\": \"\"\n" +
-                "        },\n" +
-                "        \"calculateFlagCI\": \"1\"\n" +
-                "    }\n" +
-                "}";
-
-        String json2 = "{\n" +
-                "    \"basePartVo\": {\n" +
-                "        \"editType\": \"EditType_ProposalInput\",\n" +
-                "        \"includeFilePathType\": \"\",\n" +
-                "        \"inputSource\": \"\",\n" +
-                "        \"inputType\": \"34\",\n" +
-                "        \"loginComCode\": \"305002A0\",\n" +
-                "        \"loginComCodeSub\": \"30\",\n" +
-                "        \"loginRiskCode\": \"0500\",\n" +
-                "        \"userCode\": \"W3000399\"\n" +
-                "    },\n" +
-                "    \"bc\": {\n" +
-                "        \"agriFlagBC\": \"0\",\n" +
-                "        \"baseInfoInit\": 2,\n" +
-                "        \"derailleurType\": \"雅阁\",\n" +
-                "        \"feeandDiscountFlag\": \"0\",\n" +
-                "        \"insuredTypeTmp\": 1,\n" +
-                "        \"loginComCode\": \"305002A0\",\n" +
-                "        \"ocrOrder\": {\n" +
-                "            \"ocrAppliAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrAppliIDValidDate\": \"2044-02-17\",\n" +
-                "            \"ocrAppliIDValidStartDate\": \"2024-02-17\",\n" +
-                "            \"ocrAppliIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrAppliName\": \"韩云福\",\n" +
-                "            \"ocrCarAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrCarKindCode\": \"A0\",\n" +
-                "            \"ocrCarOwner\": \"韩云福\",\n" +
-                "            \"ocrCarOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrChgOwnerDate\": \"2014-09-03\",\n" +
-                "            \"ocrEngineNo\": \"1237456\",\n" +
-                "            \"ocrEnrolLDate\": \"2014-09-03\",\n" +
-                "            \"ocrIdValidDate\": \"2044-02-17\",\n" +
-                "            \"ocrIdvalidStartDate\": \"2024-02-17\",\n" +
-                "            \"ocrInsuredAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrInsuredIDValidDate\": \"2044-02-17\",\n" +
-                "            \"ocrInsuredIDValidStartDate\": \"2024-02-17\",\n" +
-                "            \"ocrInsuredIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"ocrInsuredName\": \"韩云福\",\n" +
-                "            \"ocrLicenseCategory\": \"K33\",\n" +
-                "            \"ocrLicenseKindCode\": \"01\",\n" +
-                "            \"ocrMaincarKindCode\": \"A\",\n" +
-                "            \"ocrModelName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"ocrOwnerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ocrUseNatureCode\": \"8A\",\n" +
-                "            \"ocrUseYears\": 11,\n" +
-                "            \"ocrVinNo\": \"LHGCR1640E8037440\"\n" +
-                "        },\n" +
-                "        \"proposalNO\": \"30\",\n" +
-                "        \"prpDcarModel\": {\n" +
-                "            \"isQueryByVinNo\": true\n" +
-                "        },\n" +
-                "        \"prpTChannel\": {},\n" +
-                "        \"prpTengiNeerList\": [\n" +
-                "            {\n" +
-                "                \"projectcode\": \"\",\n" +
-                "                \"projectname\": \"\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"prpTinsured\": {\n" +
-                "            \"agentidcardtype\": \"01\",\n" +
-                "            \"appliAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"appliAgeW\": \"63\",\n" +
-                "            \"appliAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"appliBirthday\": \"1962-07-08\",\n" +
-                "            \"appliBsinessScope\": \"\",\n" +
-                "            \"appliBusinesssource\": \"\",\n" +
-                "            \"appliCityName\": \"太原市\",\n" +
-                "            \"appliIDValidDate\": \"2044-02-17\",\n" +
-                "            \"appliIDValidStartDate\": \"2024-02-17\",\n" +
-                "            \"appliIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"appliIdentifyType\": \"01\",\n" +
-                "            \"appliIdentifyTypeSides\": \"back\",\n" +
-                "            \"appliInsuredNature\": \"3\",\n" +
-                "            \"appliLegalBeneficiary\": \"法定\",\n" +
-                "            \"appliLegalRepresentative\": \"\",\n" +
-                "            \"appliLegalRepresentativeIDNum\": \"\",\n" +
-                "            \"appliLegalRepresentativeIDType\": \"\",\n" +
-                "            \"appliLinkerIdentifiNumber\": \"\",\n" +
-                "            \"appliLinkerName\": \"韩云福\",\n" +
-                "            \"appliLinkmanIDNum\": \"\",\n" +
-                "            \"appliLinkmanIDType\": \"\",\n" +
-                "            \"appliLinkmanNationality\": \"\",\n" +
-                "            \"appliLowerViewFlag\": \"0\",\n" +
-                "            \"appliMobile\": \"17536985212\",\n" +
-                "            \"appliModifyFlag\": \"\",\n" +
-                "            \"appliName\": \"韩云福\",\n" +
-                "            \"appliNationality\": \"中国\",\n" +
-                "            \"appliNationalityCode\": \"156\",\n" +
-                "            \"appliOccupation\": \"中国共产党机关负责人\",\n" +
-                "            \"appliOccupationCode\": \"80000\",\n" +
-                "            \"appliOtherIdentifyNumber\": \"\",\n" +
-                "            \"appliOtherIdentifyType\": \"\",\n" +
-                "            \"appliPostCode\": \"140100\",\n" +
-                "            \"appliPostName\": \"清徐县\",\n" +
-                "            \"appliProvinceName\": \"山西省\",\n" +
-                "            \"appliSex\": \"1\",\n" +
-                "            \"appliShareholders\": \"\",\n" +
-                "            \"appliShareholdersIDNum\": \"\",\n" +
-                "            \"appliShareholdersIDType\": \"\",\n" +
-                "            \"appliUnitNature\": \"\",\n" +
-                "            \"appliUnitType\": \"12\",\n" +
-                "            \"appliUnitcodeTimesLongFlag\": \"0\",\n" +
-                "            \"appliVIPFlag\": \"00\",\n" +
-                "            \"appliVIPType\": \"00\",\n" +
-                "            \"appliclientNatureCode\": \" \",\n" +
-                "            \"appliclientNatureName\": \" \",\n" +
-                "            \"birthday\": \"1962-07-08\",\n" +
-                "            \"insuredAgeW\": \"63\",\n" +
-                "            \"insuredAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"insuredBeneficialOwnerAddress\": \"\",\n" +
-                "            \"insuredBeneficialOwnerIDNum\": \"\",\n" +
-                "            \"insuredBeneficialOwnerIDType\": \"\",\n" +
-                "            \"insuredBeneficialOwnerName\": \"\",\n" +
-                "            \"insuredBeneficialOwnerNationality\": \"\",\n" +
-                "            \"insuredBirthday\": \"1962-07-08\",\n" +
-                "            \"insuredBsinessScope\": \"\",\n" +
-                "            \"insuredCName\": \"韩云福\",\n" +
-                "            \"insuredCityName\": \"太原市\",\n" +
-                "            \"insuredIDValidDate\": \"2044-02-17\",\n" +
-                "            \"insuredIDValidStartDate\": \"2024-02-17\",\n" +
-                "            \"insuredIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"insuredIdentifyType\": \"01\",\n" +
-                "            \"insuredInsuredNature\": \"3\",\n" +
-                "            \"insuredLegalBeneficiary\": \"法定\",\n" +
-                "            \"insuredLegalRepresentative\": \"\",\n" +
-                "            \"insuredLegalRepresentativeIDNum\": \"\",\n" +
-                "            \"insuredLegalRepresentativeIDType\": \"\",\n" +
-                "            \"insuredLinkerIdentifiNumber\": \"\",\n" +
-                "            \"insuredLinkerName\": \"韩云福\",\n" +
-                "            \"insuredLinkmanIDNum\": \"\",\n" +
-                "            \"insuredLinkmanIDType\": \"\",\n" +
-                "            \"insuredLinkmanNationality\": \"\",\n" +
-                "            \"insuredLowerViewFlag\": \"0\",\n" +
-                "            \"insuredMobile\": \"17536985212\",\n" +
-                "            \"insuredModifyFlag\": \"\",\n" +
-                "            \"insuredName\": \"韩云福\",\n" +
-                "            \"insuredNationality\": \"中国\",\n" +
-                "            \"insuredNationalityCode\": \"156\",\n" +
-                "            \"insuredOccupation\": \"中国共产党机关负责人\",\n" +
-                "            \"insuredOccupationCode\": \"80000\",\n" +
-                "            \"insuredPostCode\": \"140100\",\n" +
-                "            \"insuredPostName\": \"清徐县\",\n" +
-                "            \"insuredProvinceName\": \"山西省\",\n" +
-                "            \"insuredSex\": \"1\",\n" +
-                "            \"insuredShareholders\": \"\",\n" +
-                "            \"insuredShareholdersIDNum\": \"\",\n" +
-                "            \"insuredShareholdersIDType\": \"\",\n" +
-                "            \"insuredUnitNature\": \"\",\n" +
-                "            \"insuredUnitPhone\": \"17536985212\",\n" +
-                "            \"insuredUnitType\": \"12\",\n" +
-                "            \"insuredUnitcodeTimesLongFlag\": \"0\",\n" +
-                "            \"insuredVIPFlag\": \"00\",\n" +
-                "            \"insuredVIPType\": \"00\",\n" +
-                "            \"insuredclientNatureCode\": \" \",\n" +
-                "            \"insuredclientNatureName\": \" \"\n" +
-                "        },\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"IDValidDate\": \"2044-02-17\",\n" +
-                "            \"absFlag\": \"有\",\n" +
-                "            \"actualValue\": \"29960.0\",\n" +
-                "            \"addressRevise\": \"0\",\n" +
-                "            \"basePureRiskPremium\": \"1290.596000\",\n" +
-                "            \"biChgOwnerFlag\": \"0\",\n" +
-                "            \"birthday\": \"1962-07-08\",\n" +
-                "            \"birthdayRecogNition\": \"1962-07-08\",\n" +
-                "            \"brandCode\": \"BTAALD0103\",\n" +
-                "            \"brandName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"carAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"carCertificateDate\": \"\",\n" +
-                "            \"carCertificateType\": \"\",\n" +
-                "            \"carCityName\": \"太原市\",\n" +
-                "            \"carIdentifyType\": \"01\",\n" +
-                "            \"carInsuredRelation\": \"1\",\n" +
-                "            \"carKindCode\": \"A0\",\n" +
-                "            \"carKindCodeDesc\": \"\",\n" +
-                "            \"carKindCodeNition\": \"A0\",\n" +
-                "            \"carName\": \"雅阁HG7205AAC4 舒适版\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"carOwnerAgeW\": \"63\",\n" +
-                "            \"carOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyNumberRecogNition\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyType\": \"01\",\n" +
-                "            \"carOwnerIdentifyTypeSides\": \"back\",\n" +
-                "            \"carOwnerNature\": \"0\",\n" +
-                "            \"carOwnerRecogNition\": \"韩云福\",\n" +
-                "            \"carPostCode\": \"140100\",\n" +
-                "            \"carProvinceName\": \"山西省\",\n" +
-                "            \"carTypeCode\": \"1\",\n" +
-                "            \"carUsage\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carbrand\": \"雅阁(ACCORD)牌\",\n" +
-                "            \"certifiCateDate\": \"\",\n" +
-                "            \"chargingpostFlag\": \"0\",\n" +
-                "            \"chgOwnerDate\": \"2014-09-03\",\n" +
-                "            \"chgOwnerDateRecogNition\": \"2014-09-03\",\n" +
-                "            \"chgOwnerFlag\": \"0\",\n" +
-                "            \"ciChgOwnerFlag\": \"0\",\n" +
-                "            \"clauseType\": \"F54\",\n" +
-                "            \"clauseTypeSystem\": \"04\",\n" +
-                "            \"colorCode\": \"03\",\n" +
-                "            \"comlossCondition\": \"太原市\",\n" +
-                "            \"completeKerbMass\": \"1495\",\n" +
-                "            \"compromisePrice\": \"29960.0\",\n" +
-                "            \"countryNature\": \"B\",\n" +
-                "            \"engineNo\": \"1237456\",\n" +
-                "            \"engineNoRecogNition\": \"1237456\",\n" +
-                "            \"enrollDate\": \"2014-09-03\",\n" +
-                "            \"enrollDateValueStatus\": 1,\n" +
-                "            \"enrollDateoRecogNition\": \"2014-09-03\",\n" +
-                "            \"exhaustScale\": \"1.997\",\n" +
-                "            \"exhaustScalelb\": 1.997,\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"fuelType\": \"0\",\n" +
-                "            \"gearBoxtyPecode\": \"BS03\",\n" +
-                "            \"gearBoxtyPecodeName\": \"BS03-CVT\",\n" +
-                "            \"idValidDate\": \"2044-02-17\",\n" +
-                "            \"identiFication\": 1,\n" +
-                "            \"identify\": \"1\",\n" +
-                "            \"idvalidStartDate\": \"2024-02-17\",\n" +
-                "            \"licenseCategory\": \"K33\",\n" +
-                "            \"licenseColorCode\": \"01\",\n" +
-                "            \"licenseKindCode\": \"01\",\n" +
-                "            \"licenseKindCodeNition\": \"01\",\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"licenseNoRecogNition\": \"晋A345G0\",\n" +
-                "            \"loanVehicleFlag\": \"0\",\n" +
-                "            \"lossCondition\": \"山西省\",\n" +
-                "            \"lossConditionCode\": \"Z278230500010001\",\n" +
-                "            \"madeFactory\": \"广汽本田汽车有限公司\",\n" +
-                "            \"maincarKindCode\": \"A\",\n" +
-                "            \"maincarKindCodeNition\": \"A\",\n" +
-                "            \"makeDate\": \"\",\n" +
-                "            \"modelCode\": \"BGQEYHUC0008\",\n" +
-                "            \"modelCodeOld\": \"BTAALD0103\",\n" +
-                "            \"modelName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"modelNameRecogNition\": \"\",\n" +
-                "            \"natureOfUse\": 1,\n" +
-                "            \"newCaRegistration\": \"1\",\n" +
-                "            \"newDeviceFlag\": \"0\",\n" +
-                "            \"newEnergyFlag\": \"0\",\n" +
-                "            \"newFuelModel\": \"0\",\n" +
-                "            \"newFuelModelName\": \"正常缴税\",\n" +
-                "            \"noticeType\": \"HG7205AAC4\",\n" +
-                "            \"ocr_invoice_flag\": \"0\",\n" +
-                "            \"ownerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ownerAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"ownerCityName\": \"太原市\",\n" +
-                "            \"ownerPostName\": \"清徐县\",\n" +
-                "            \"ownerProvinceName\": \"山西省\",\n" +
-                "            \"ownersAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"postCode\": \"140100\",\n" +
-                "            \"power\": \"114\",\n" +
-                "            \"powerLB\": 1.997,\n" +
-                "            \"powertypecode\": \"D1\",\n" +
-                "            \"productType\": \"0101\",\n" +
-                "            \"proposalNo\": \"\",\n" +
-                "            \"purchasePrice\": \"149800\",\n" +
-                "            \"pureElectricBatteryType\": \"11\",\n" +
-                "            \"pureRiskPremium\": \"1\",\n" +
-                "            \"rateCode\": \"20\",\n" +
-                "            \"relationShip\": \"1\",\n" +
-                "            \"restricFlag\": \"\",\n" +
-                "            \"riskTypeCode\": \"0\",\n" +
-                "            \"riskTypeCodeName\": \"0-正常车型\",\n" +
-                "            \"riskTypeName\": \"正常车型\",\n" +
-                "            \"seatCount\": \"5\",\n" +
-                "            \"seatCountlb\": 5,\n" +
-                "            \"sex\": \"1\",\n" +
-                "            \"sexRecogNition\": \"1\",\n" +
-                "            \"speed\": \"200\",\n" +
-                "            \"stopFlagCode\": \"1\",\n" +
-                "            \"stopFlagCodeName\": \"1-停产\",\n" +
-                "            \"termsSystem\": \"04\",\n" +
-                "            \"tonCount\": \"0\",\n" +
-                "            \"tonCountlb\": \"0\",\n" +
-                "            \"tractionTonCount\": \"\",\n" +
-                "            \"transmissionttype\": \"CVT\",\n" +
-                "            \"useNatureCode\": \"8A\",\n" +
-                "            \"useNatureCodeNition\": \"8A\",\n" +
-                "            \"useNatureCodeNitionNew\": \"\",\n" +
-                "            \"useYears\": 11,\n" +
-                "            \"vehicleBrand\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"vehicleClassNewCode\": \"JC04\",\n" +
-                "            \"vehicleClassNewCodeName\": \"JC04-中型轿车(B)\",\n" +
-                "            \"vehicleClassNewName\": \"中型轿车(B)\",\n" +
-                "            \"vehicleCode\": \"BGQEYHUC000871A1\",\n" +
-                "            \"vehicleSize\": \"4930*1845*1470\",\n" +
-                "            \"vinClick\": \"1\",\n" +
-                "            \"vinModel\": \"BTAALD0103\",\n" +
-                "            \"vinNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"vinNoRecogNition\": \"LHGCR1640E8037440\",\n" +
-                "            \"ymModelSegmentation\": \"\"\n" +
-                "        },\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"agentCanalCode\": \" \",\n" +
-                "            \"agentCode\": \"Z278230500010001\",\n" +
-                "            \"agentName\": \"太原天勤保险代理有限公司\",\n" +
-                "            \"agreementNo\": \"Z278230500010001-005\",\n" +
-                "            \"amlCode\": \"\",\n" +
-                "            \"appliFactorFlag\": \"\",\n" +
-                "            \"arbitboardName\": \"\",\n" +
-                "            \"argueSolution\": \"1\",\n" +
-                "            \"businessNature\": \"2\",\n" +
-                "            \"channeltypeone\": \"60\",\n" +
-                "            \"channeltypeoneName\": \"个客发展\",\n" +
-                "            \"channeltypetwo\": \"0101\",\n" +
-                "            \"channeltypetwoName\": \"经代\",\n" +
-                "            \"classIdentifier\": \"00\",\n" +
-                "            \"comCode\": \"305002A0\",\n" +
-                "            \"comName\": \"太原营业大区科政保营业部经代业务部\",\n" +
-                "            \"commissionerNo\": \"\",\n" +
-                "            \"cooprOutlets\": \"\",\n" +
-                "            \"cooprOutletsName\": \"\",\n" +
-                "            \"deGentType\": \"\",\n" +
-                "            \"eProposalFlag\": \"1\",\n" +
-                "            \"goodCodes\": [],\n" +
-                "            \"handler1Code\": \"S3000222\",\n" +
-                "            \"handler1Name\": \"陶娇\",\n" +
-                "            \"insuredFactorFlag\": \"\",\n" +
-                "            \"isExpressProtectionFlag\": \"JSB00\",\n" +
-                "            \"isStandard\": \"0\",\n" +
-                "            \"lifeAgentCode\": \"\",\n" +
-                "            \"lifeAgentName\": \"\",\n" +
-                "            \"loginComCode\": \"305002A0\",\n" +
-                "            \"noCarCodes\": \"02746400001\",\n" +
-                "            \"noCarFlag\": 1,\n" +
-                "            \"noCarPremium\": 100,\n" +
-                "            \"operateDate\": \"2026-05-13\",\n" +
-                "            \"operatorCode\": \"W3000399\",\n" +
-                "            \"project\": \"\",\n" +
-                "            \"saleName\": \"\",\n" +
-                "            \"saleProfessionalNum\": \"\",\n" +
-                "            \"serviceLabelName\": \"\",\n" +
-                "            \"signDate\": \"2026-05-13\",\n" +
-                "            \"templateName\": \"\",\n" +
-                "            \"templateNo\": \"\",\n" +
-                "            \"unitMaintenanceCode\": \"3050D022512317323\",\n" +
-                "            \"unitMaintenanceName\": \"科政保天勤代理\",\n" +
-                "            \"unitMaintenanceType1Name\": \"代理\",\n" +
-                "            \"unitMaintenanceType2Name\": \"专业代理\",\n" +
-                "            \"uniteBusinessFlag\": 0,\n" +
-                "            \"unitmainTenanceType1\": \"D\",\n" +
-                "            \"unitmainTenanceType2\": \"02\",\n" +
-                "            \"uwELRrel1\": \"0\",\n" +
-                "            \"uwELRrel2\": \"0\"\n" +
-                "        },\n" +
-                "        \"prptBeneficialOwnerVos\": [],\n" +
-                "        \"prptShareholderVos\": [],\n" +
-                "        \"riskCode\": \"0500\"\n" +
-                "    },\n" +
-                "    \"bi\": {\n" +
-                "        \"blPrpTRealNameVerification\": [],\n" +
-                "        \"calculateFlagBI\": \"1\",\n" +
-                "        \"ciInsureDemand\": {\n" +
-                "            \"amount\": \"200000\",\n" +
-                "            \"basePremium\": \"950.0\",\n" +
-                "            \"benchmarkPremium\": \"950.0\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"checkCode\": \"\",\n" +
-                "            \"claimAdjustReason\": \"C4\",\n" +
-                "            \"claimCoeff\": \"0.0\",\n" +
-                "            \"comCode\": \"305002A0\",\n" +
-                "            \"demandNo\": \"\",\n" +
-                "            \"demandTime\": \"2026-05-12\",\n" +
-                "            \"endDate\": \"2027-05-30\",\n" +
-                "            \"errorCode\": \"\",\n" +
-                "            \"errorMessageGo\": \"成功\",\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"lastBillDate\": \"20250530\",\n" +
-                "            \"lastYearEndDate\": \"2026-05-31\",\n" +
-                "            \"lastYearStartDate\": \"2025-05-31\",\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"operatorCode\": \"W3000399\",\n" +
-                "            \"peccancyCoeff\": \"0.0\",\n" +
-                "            \"premium\": \"950.0\",\n" +
-                "            \"reinsureFlag\": \"0\",\n" +
-                "            \"renewalFlag\": \"非重复投保\",\n" +
-                "            \"riskCode\": \"0507\",\n" +
-                "            \"startDate\": \"2026-05-31\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemandPay\": [],\n" +
-                "        \"ciInsureDemandWarningClaim\": [],\n" +
-                "        \"ciInsureValid\": {},\n" +
-                "        \"commercialInsurances\": [],\n" +
-                "        \"duplicateInsuranceItemsSchema\": {},\n" +
-                "        \"inintFlag\": 1,\n" +
-                "        \"inputRisk\": 0,\n" +
-                "        \"inputRisk0518\": 1,\n" +
-                "        \"inputRisk0521\": 0,\n" +
-                "        \"inputRisk0530\": 0,\n" +
-                "        \"prpDagentVo\": {},\n" +
-                "        \"prpDclause\": [],\n" +
-                "        \"prpDclauseRule\": [],\n" +
-                "        \"prpTLastCarShipTax\": {},\n" +
-                "        \"prpTcarDeviceCount\": {},\n" +
-                "        \"prpTchargingPostData\": [],\n" +
-                "        \"prpTenGearAllocationFeeList\": [],\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"IDValidDate\": \"2044-02-17\",\n" +
-                "            \"absFlag\": \"有\",\n" +
-                "            \"actualValue\": \"29960.0\",\n" +
-                "            \"addressRevise\": \"0\",\n" +
-                "            \"basePureRiskPremium\": \"1290.596000\",\n" +
-                "            \"biChgOwnerFlag\": \"0\",\n" +
-                "            \"birthday\": \"1962-07-08\",\n" +
-                "            \"birthdayRecogNition\": \"1962-07-08\",\n" +
-                "            \"brandCode\": \"BTAALD0103\",\n" +
-                "            \"brandName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"carAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"carCertificateDate\": \"\",\n" +
-                "            \"carCertificateType\": \"\",\n" +
-                "            \"carCityName\": \"太原市\",\n" +
-                "            \"carIdentifyType\": \"01\",\n" +
-                "            \"carInsuredRelation\": \"1\",\n" +
-                "            \"carKindCode\": \"A0\",\n" +
-                "            \"carKindCodeDesc\": \"\",\n" +
-                "            \"carKindCodeNition\": \"A0\",\n" +
-                "            \"carName\": \"雅阁HG7205AAC4 舒适版\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"carOwnerAgeW\": \"63\",\n" +
-                "            \"carOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyNumberRecogNition\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyType\": \"01\",\n" +
-                "            \"carOwnerIdentifyTypeSides\": \"back\",\n" +
-                "            \"carOwnerNature\": \"0\",\n" +
-                "            \"carOwnerRecogNition\": \"韩云福\",\n" +
-                "            \"carPostCode\": \"140100\",\n" +
-                "            \"carProvinceName\": \"山西省\",\n" +
-                "            \"carTypeCode\": \"1\",\n" +
-                "            \"carUsage\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carbrand\": \"雅阁(ACCORD)牌\",\n" +
-                "            \"certifiCateDate\": \"\",\n" +
-                "            \"chargingpostFlag\": \"0\",\n" +
-                "            \"chgOwnerDate\": \"2014-09-03\",\n" +
-                "            \"chgOwnerDateRecogNition\": \"2014-09-03\",\n" +
-                "            \"chgOwnerFlag\": \"0\",\n" +
-                "            \"ciChgOwnerFlag\": \"0\",\n" +
-                "            \"clauseType\": \"F54\",\n" +
-                "            \"clauseTypeSystem\": \"04\",\n" +
-                "            \"colorCode\": \"03\",\n" +
-                "            \"comlossCondition\": \"太原市\",\n" +
-                "            \"completeKerbMass\": \"1495\",\n" +
-                "            \"compromisePrice\": \"29960.0\",\n" +
-                "            \"countryNature\": \"B\",\n" +
-                "            \"engineNo\": \"1237456\",\n" +
-                "            \"engineNoRecogNition\": \"1237456\",\n" +
-                "            \"enrollDate\": \"2014-09-03\",\n" +
-                "            \"enrollDateValueStatus\": 1,\n" +
-                "            \"enrollDateoRecogNition\": \"2014-09-03\",\n" +
-                "            \"exhaustScale\": \"1.997\",\n" +
-                "            \"exhaustScalelb\": 1.997,\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"fuelType\": \"0\",\n" +
-                "            \"gearBoxtyPecode\": \"BS03\",\n" +
-                "            \"gearBoxtyPecodeName\": \"BS03-CVT\",\n" +
-                "            \"idValidDate\": \"2044-02-17\",\n" +
-                "            \"identiFication\": 1,\n" +
-                "            \"identify\": \"1\",\n" +
-                "            \"idvalidStartDate\": \"2024-02-17\",\n" +
-                "            \"licenseCategory\": \"K33\",\n" +
-                "            \"licenseColorCode\": \"01\",\n" +
-                "            \"licenseKindCode\": \"01\",\n" +
-                "            \"licenseKindCodeNition\": \"01\",\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"licenseNoRecogNition\": \"晋A345G0\",\n" +
-                "            \"loanVehicleFlag\": \"0\",\n" +
-                "            \"lossCondition\": \"山西省\",\n" +
-                "            \"lossConditionCode\": \"Z278230500010001\",\n" +
-                "            \"madeFactory\": \"广汽本田汽车有限公司\",\n" +
-                "            \"maincarKindCode\": \"A\",\n" +
-                "            \"maincarKindCodeNition\": \"A\",\n" +
-                "            \"makeDate\": \"\",\n" +
-                "            \"modelCode\": \"BGQEYHUC0008\",\n" +
-                "            \"modelCodeOld\": \"BTAALD0103\",\n" +
-                "            \"modelName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"modelNameRecogNition\": \"\",\n" +
-                "            \"natureOfUse\": 1,\n" +
-                "            \"newCaRegistration\": \"1\",\n" +
-                "            \"newDeviceFlag\": \"0\",\n" +
-                "            \"newEnergyFlag\": \"0\",\n" +
-                "            \"newFuelModel\": \"0\",\n" +
-                "            \"newFuelModelName\": \"正常缴税\",\n" +
-                "            \"noticeType\": \"HG7205AAC4\",\n" +
-                "            \"ocr_invoice_flag\": \"0\",\n" +
-                "            \"ownerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ownerAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"ownerCityName\": \"太原市\",\n" +
-                "            \"ownerPostName\": \"清徐县\",\n" +
-                "            \"ownerProvinceName\": \"山西省\",\n" +
-                "            \"ownersAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"postCode\": \"140100\",\n" +
-                "            \"power\": \"114\",\n" +
-                "            \"powerLB\": 1.997,\n" +
-                "            \"powertypecode\": \"D1\",\n" +
-                "            \"productType\": \"0101\",\n" +
-                "            \"proposalNo\": \"\",\n" +
-                "            \"purchasePrice\": \"149800\",\n" +
-                "            \"pureElectricBatteryType\": \"11\",\n" +
-                "            \"pureRiskPremium\": \"1\",\n" +
-                "            \"rateCode\": \"20\",\n" +
-                "            \"relationShip\": \"1\",\n" +
-                "            \"restricFlag\": \"\",\n" +
-                "            \"riskTypeCode\": \"0\",\n" +
-                "            \"riskTypeCodeName\": \"0-正常车型\",\n" +
-                "            \"riskTypeName\": \"正常车型\",\n" +
-                "            \"seatCount\": \"5\",\n" +
-                "            \"seatCountlb\": 5,\n" +
-                "            \"sex\": \"1\",\n" +
-                "            \"sexRecogNition\": \"1\",\n" +
-                "            \"speed\": \"200\",\n" +
-                "            \"stopFlagCode\": \"1\",\n" +
-                "            \"stopFlagCodeName\": \"1-停产\",\n" +
-                "            \"termsSystem\": \"04\",\n" +
-                "            \"tonCount\": \"0\",\n" +
-                "            \"tonCountlb\": \"0\",\n" +
-                "            \"tractionTonCount\": \"\",\n" +
-                "            \"transmissionttype\": \"CVT\",\n" +
-                "            \"useNatureCode\": \"8A\",\n" +
-                "            \"useNatureCodeNition\": \"8A\",\n" +
-                "            \"useNatureCodeNitionNew\": \"\",\n" +
-                "            \"useYears\": 11,\n" +
-                "            \"vehicleBrand\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"vehicleClassNewCode\": \"JC04\",\n" +
-                "            \"vehicleClassNewCodeName\": \"JC04-中型轿车(B)\",\n" +
-                "            \"vehicleClassNewName\": \"中型轿车(B)\",\n" +
-                "            \"vehicleCode\": \"BGQEYHUC000871A1\",\n" +
-                "            \"vehicleSize\": \"4930*1845*1470\",\n" +
-                "            \"vinClick\": \"1\",\n" +
-                "            \"vinModel\": \"BTAALD0103\",\n" +
-                "            \"vinNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"vinNoRecogNition\": \"LHGCR1640E8037440\",\n" +
-                "            \"ymModelSegmentation\": \"\"\n" +
-                "        },\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"answer\": \"\",\n" +
-                "            \"biAnswer\": \"\",\n" +
-                "            \"disCount\": 1.0,\n" +
-                "            \"endDate\": \"2027-05-30\",\n" +
-                "            \"endDate0507\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"endDate0507t1\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"endHour\": 24,\n" +
-                "            \"endHour0507\": 24,\n" +
-                "            \"endMinute\": 0,\n" +
-                "            \"endMinute0507\": 0,\n" +
-                "            \"endMinute0507t1\": 0,\n" +
-                "            \"expectDiscount\": \"\",\n" +
-                "            \"feeandDiscountFlag\": \"0\",\n" +
-                "            \"immeValiFlag\": \"\",\n" +
-                "            \"immeValiFlag0507\": 0,\n" +
-                "            \"immeValiFlag0507t1\": 0,\n" +
-                "            \"immeValidEndDate\": \"\",\n" +
-                "            \"immeValidEndDate0507\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"immeValidEndDate0507t1\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"immeValidStartDate\": \"\",\n" +
-                "            \"immeValidStartDate0507\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0507t1\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"inputDate\": \"2026-05-13\",\n" +
-                "            \"period0530\": 30,\n" +
-                "            \"renewalFlag\": \"\",\n" +
-                "            \"saleChange\": \"0\",\n" +
-                "            \"signDate\": \"2026-05-13\",\n" +
-                "            \"signDiscount\": 0.0,\n" +
-                "            \"startDate\": \"2026-05-31\",\n" +
-                "            \"startDate0507\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"startDate0507t1\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"startDateFlag\": 0,\n" +
-                "            \"startDateFlag0507\": 0,\n" +
-                "            \"startDateFlag0507t1\": 0,\n" +
-                "            \"startHour\": 0,\n" +
-                "            \"startHour0507\": 0,\n" +
-                "            \"startMinute\": 0,\n" +
-                "            \"startMinute0507\": 0,\n" +
-                "            \"startMinute0507t1\": 0,\n" +
-                "            \"sumLowerRate\": \"\",\n" +
-                "            \"sumPremium\": \"\",\n" +
-                "            \"sumnoTaxPremium\": 896.23\n" +
-                "        },\n" +
-                "        \"prpTmainRate\": {\n" +
-                "            \"accruedexpenses\": \"0\",\n" +
-                "            \"actuarialCoef\": \"交强险 1.2019;商业险 1.2019;\",\n" +
-                "            \"actuarialRuleCode\": \"交强险 I99A12511001,I03A12512007,I03A12504020,I03A12509002,I03A12512001;商业险 I99A12511001,I03A12512007,I03A12504020,I03A12509002,I03A12512001;\",\n" +
-                "            \"attribute1\": \"0.00\",\n" +
-                "            \"attribute2\": \"0.00\",\n" +
-                "            \"attribute3\": \"0.00\",\n" +
-                "            \"attribute4\": \"0.00\",\n" +
-                "            \"attribute5\": \"\",\n" +
-                "            \"billcomacquisitionfeerate\": 0,\n" +
-                "            \"billcomallowance\": 0,\n" +
-                "            \"billcomotherfeerate\": 0,\n" +
-                "            \"billcomtransfeerate\": 0,\n" +
-                "            \"chdConsistent\": \"-2\",\n" +
-                "            \"chdTranche\": \"-2\",\n" +
-                "            \"classcode\": \"05\",\n" +
-                "            \"coefficient1\": 0,\n" +
-                "            \"coefficient10\": 0,\n" +
-                "            \"coefficient11\": 0,\n" +
-                "            \"coefficient2\": 0,\n" +
-                "            \"coefficient3\": 0,\n" +
-                "            \"coefficient4\": 0,\n" +
-                "            \"coefficient5\": 0,\n" +
-                "            \"coefficient6\": 0,\n" +
-                "            \"coefficient7\": 0,\n" +
-                "            \"coefficient8\": 0,\n" +
-                "            \"coefficient9\": 0,\n" +
-                "            \"dispersion\": \"0\",\n" +
-                "            \"evScore\": \"-2\",\n" +
-                "            \"highRiskCar\": \"\",\n" +
-                "            \"isFromApps\": \"0\",\n" +
-                "            \"mileage12\": \"-2\",\n" +
-                "            \"mileage24\": \"-2\",\n" +
-                "            \"mileage6\": \"-2\",\n" +
-                "            \"mutualback\": \"0\",\n" +
-                "            \"natrnk\": \"-2\",\n" +
-                "            \"qjhScore\": \"-2\",\n" +
-                "            \"riskcode\": \"0500\",\n" +
-                "            \"score12sd\": \"-2\",\n" +
-                "            \"tempLateFlag\": \"1\",\n" +
-                "            \"totalAttribute\": 0.0,\n" +
-                "            \"totalcost\": 0,\n" +
-                "            \"vhlScore\": \"-2\"\n" +
-                "        },\n" +
-                "        \"prpTrenewal\": [],\n" +
-                "        \"prptengageList\": [],\n" +
-                "        \"prptitemkindList\": [\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"2000000\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"2000000\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 1  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"33\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20B\",\n" +
-                "                \"kindName\": \"机动车第三者责任保险\",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"2000000\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"10000\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"10000\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 1  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"35\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20D3\",\n" +
-                "                \"kindName\": \"机动车车上人员责任保险(驾驶员)\",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"10000\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"10000\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"10000\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 1  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"37\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20D4\",\n" +
-                "                \"kindName\": \"机动车车上人员责任保险(乘客)\",\n" +
-                "                \"mainKindFlag\": \"M\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"10000\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"100000\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"100000\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 2  0\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"54\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20Y\",\n" +
-                "                \"kindName\": \"附加医保外医疗费用责任险-三者险\",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"100000\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"2\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"2\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 2  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"57\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20Z1\",\n" +
-                "                \"kindName\": \"道路救援服务特约条款\",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"2\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"2\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"2\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 2  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"58\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20Z2\",\n" +
-                "                \"kindName\": \"车辆安全检测特约条款\",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"2\",\n" +
-                "                \"value\": \"\"\n" +
-                "            },\n" +
-                "            {\n" +
-                "                \"adjustRate\": \"\",\n" +
-                "                \"amount\": \"2\",\n" +
-                "                \"basePremium\": \"\",\n" +
-                "                \"benchMarkPremium\": \"\",\n" +
-                "                \"calculateFlag\": \"Y\",\n" +
-                "                \"channelrate\": \"\",\n" +
-                "                \"checked\": 1,\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"deductibleRate\": \"2\",\n" +
-                "                \"discount\": \"1\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"familyName\": \"\",\n" +
-                "                \"flag\": \" 2  1\",\n" +
-                "                \"insurePlan\": \"\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"isMedical\": 1,\n" +
-                "                \"isMental\": 0,\n" +
-                "                \"itemCode\": \"1\",\n" +
-                "                \"itemDetailName\": \"车辆\",\n" +
-                "                \"itemKindNo\": \"59\",\n" +
-                "                \"itemNo\": 1,\n" +
-                "                \"kindCode\": \"20Z3\",\n" +
-                "                \"kindName\": \"代为驾驶服务特约条款\",\n" +
-                "                \"mainKindFlag\": \"S\",\n" +
-                "                \"modeCode\": \"\",\n" +
-                "                \"modeName\": \"\",\n" +
-                "                \"model\": \"\",\n" +
-                "                \"noTaxPremium\": \"\",\n" +
-                "                \"premium\": \"\",\n" +
-                "                \"proposalNo\": \"\",\n" +
-                "                \"rate\": \"\",\n" +
-                "                \"ratePeriod\": 0,\n" +
-                "                \"rationType\": \"\",\n" +
-                "                \"riskCode\": \"0518\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"standardPremuim\": \"\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"\",\n" +
-                "                \"taxFlag\": \"\",\n" +
-                "                \"taxRate\": \"0.06\",\n" +
-                "                \"totalLossRate\": 9.0E-4,\n" +
-                "                \"unit\": \"\",\n" +
-                "                \"unitAmount\": \"2\",\n" +
-                "                \"value\": \"\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"queryExpensePowerOutputVo\": {},\n" +
-                "        \"shortRate\": \"100.00\"\n" +
-                "    },\n" +
-                "    \"ci\": {\n" +
-                "        \"blPrpTRealNameVerification\": [],\n" +
-                "        \"cICarshipTaxDemandSchema\": {},\n" +
-                "        \"calculateFlagCI\": \"1\",\n" +
-                "        \"carShipTaxInfoInit\": 1,\n" +
-                "        \"ciCarShipTaxQGDemandSchema\": {\n" +
-                "            \"annualTaxAmount\": \"360.0\",\n" +
-                "            \"annualTaxDue\": \"360.0\",\n" +
-                "            \"calcTaxFlag\": \"1\",\n" +
-                "            \"declareStatusIA\": \"0\",\n" +
-                "            \"deductionDueProportion\": \"0.0\",\n" +
-                "            \"demandNo\": \"01XDCX140026051888550279571118\",\n" +
-                "            \"exceedDaysCount\": \"0\",\n" +
-                "            \"overDue\": \"0.0\",\n" +
-                "            \"serialNo\": \"1\",\n" +
-                "            \"sumOverdue\": \"0.0\",\n" +
-                "            \"sumTax\": \"360.0\",\n" +
-                "            \"sumTaxDefault\": \"0.0\",\n" +
-                "            \"taxAmountFlag\": \"1\",\n" +
-                "            \"taxConditionCode\": \"1\",\n" +
-                "            \"taxDue\": \"360.0\",\n" +
-                "            \"taxEndDate\": \"2026-12-31\",\n" +
-                "            \"taxLocationCode\": \"140000\",\n" +
-                "            \"taxPayerIdentificationCode\": \"140121196207080534\",\n" +
-                "            \"taxPayerName\": \"韩云福\",\n" +
-                "            \"taxRegistryNumber\": \"91140100MA0KJ5L06P\",\n" +
-                "            \"taxStartDate\": \"2026-01-01\",\n" +
-                "            \"taxTermTypeCode\": \"08\",\n" +
-                "            \"taxType\": \"0\",\n" +
-                "            \"taxUnitTypeCode\": \"1\",\n" +
-                "            \"totalAmount\": \"360.0\",\n" +
-                "            \"unitRate\": \"360.0\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemand\": {\n" +
-                "            \"amount\": \"200000\",\n" +
-                "            \"basePremium\": \"950.0\",\n" +
-                "            \"benchmarkPremium\": \"950.0\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"checkCode\": \"\",\n" +
-                "            \"claimAdjustReason\": \"C4\",\n" +
-                "            \"claimCoeff\": \"0.0\",\n" +
-                "            \"comCode\": \"305002A0\",\n" +
-                "            \"demandNo\": \"\",\n" +
-                "            \"demandTime\": \"2026-05-12\",\n" +
-                "            \"endDate\": \"2027-05-30\",\n" +
-                "            \"errorCode\": \"\",\n" +
-                "            \"errorMessageGo\": \"成功\",\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"lastBillDate\": \"20250530\",\n" +
-                "            \"lastYearEndDate\": \"2026-05-31\",\n" +
-                "            \"lastYearStartDate\": \"2025-05-31\",\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"operatorCode\": \"W3000399\",\n" +
-                "            \"peccancyCoeff\": \"0.0\",\n" +
-                "            \"premium\": \"950.0\",\n" +
-                "            \"reinsureFlag\": \"0\",\n" +
-                "            \"renewalFlag\": \"非重复投保\",\n" +
-                "            \"riskCode\": \"0507\",\n" +
-                "            \"startDate\": \"2026-05-31\"\n" +
-                "        },\n" +
-                "        \"ciInsureDemandLoss\": [],\n" +
-                "        \"ciInsureDemandPay\": [\n" +
-                "            {\n" +
-                "                \"accidentDeathFlag\": \"0\",\n" +
-                "                \"caseID\": \"\",\n" +
-                "                \"claimNotificationNo\": \"\",\n" +
-                "                \"claimRegistrationNo\": \"880326202614002211\",\n" +
-                "                \"compensateNo\": \"50AICS140026032213046613845808\",\n" +
-                "                \"demandNo\": \"01XDCX140026051888550279571118\",\n" +
-                "                \"effectiveDate\": \"\",\n" +
-                "                \"endCaseTime\": \"2026-03-10 08:51\",\n" +
-                "                \"expireDate\": \"\",\n" +
-                "                \"flag\": \"\",\n" +
-                "                \"insurerArea\": \"\",\n" +
-                "                \"kindCode\": \"\",\n" +
-                "                \"lossFee\": \"2000.0\",\n" +
-                "                \"lossTime\": \"2026-03-09 16:53\",\n" +
-                "                \"optionType\": \"\",\n" +
-                "                \"payCompany\": \"AICS\",\n" +
-                "                \"payType\": \"\",\n" +
-                "                \"personPayType\": \"\",\n" +
-                "                \"policyNo\": \"114B7032620250026994\",\n" +
-                "                \"remark\": \"\",\n" +
-                "                \"serialNo\": \"1\",\n" +
-                "                \"totalAmount\": \"2000.0\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"ciInsureDemandWarningClaim\": [],\n" +
-                "        \"ciInsureValid\": {},\n" +
-                "        \"duplicateInsuranceItemsSchema\": {},\n" +
-                "        \"image\": {\n" +
-                "            \"changingThisBreaksApplicationSecurity\": \"data:image/png;base64,\"\n" +
-                "        },\n" +
-                "        \"inputRisk\": 1,\n" +
-                "        \"inputRisk0507\": 1,\n" +
-                "        \"inputRisk0507t1\": 0,\n" +
-                "        \"prpDclause\": [],\n" +
-                "        \"prpDclauseRule\": [],\n" +
-                "        \"prpTChannel\": {},\n" +
-                "        \"prpTLastCarShipTax\": {},\n" +
-                "        \"prpTcarshipTax\": {\n" +
-                "            \"calLateFeeFlag\": \"\",\n" +
-                "            \"calPayBalanceFeeFlag\": \"\",\n" +
-                "            \"calculateMode\": \"1\",\n" +
-                "            \"completeKerbMass\": 0,\n" +
-                "            \"extendChar2\": \"K33\",\n" +
-                "            \"sumPayTax\": \"\",\n" +
-                "            \"taxItemCode\": \"A\",\n" +
-                "            \"taxItemDetailCode\": \"A1\",\n" +
-                "            \"taxItemDetailName\": \"小型客车\",\n" +
-                "            \"taxItemName\": \"载客汽车\",\n" +
-                "            \"taxRelifFlag\": \"1\",\n" +
-                "            \"taxUnit\": \"1\",\n" +
-                "            \"taxpayerIdentifier\": \"140121196207080534\",\n" +
-                "            \"taxpayerName\": \"韩云福\"\n" +
-                "        },\n" +
-                "        \"prpTitemCar\": {\n" +
-                "            \"IDValidDate\": \"2044-02-17\",\n" +
-                "            \"absFlag\": \"有\",\n" +
-                "            \"actualValue\": \"29960.0\",\n" +
-                "            \"addressRevise\": \"0\",\n" +
-                "            \"basePureRiskPremium\": \"1290.596000\",\n" +
-                "            \"biChgOwnerFlag\": \"0\",\n" +
-                "            \"birthday\": \"1962-07-08\",\n" +
-                "            \"birthdayRecogNition\": \"1962-07-08\",\n" +
-                "            \"brandCode\": \"BTAALD0103\",\n" +
-                "            \"brandName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"carAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"carCertificateDate\": \"\",\n" +
-                "            \"carCertificateType\": \"\",\n" +
-                "            \"carCityName\": \"太原市\",\n" +
-                "            \"carIdentifyType\": \"01\",\n" +
-                "            \"carInsuredRelation\": \"1\",\n" +
-                "            \"carKindCode\": \"A0\",\n" +
-                "            \"carKindCodeDesc\": \"\",\n" +
-                "            \"carKindCodeNition\": \"A0\",\n" +
-                "            \"carName\": \"雅阁HG7205AAC4 舒适版\",\n" +
-                "            \"carOwner\": \"韩云福\",\n" +
-                "            \"carOwnerAgeW\": \"63\",\n" +
-                "            \"carOwnerIdentifyNumber\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyNumberRecogNition\": \"140121196207080534\",\n" +
-                "            \"carOwnerIdentifyType\": \"01\",\n" +
-                "            \"carOwnerIdentifyTypeSides\": \"back\",\n" +
-                "            \"carOwnerNature\": \"0\",\n" +
-                "            \"carOwnerRecogNition\": \"韩云福\",\n" +
-                "            \"carPostCode\": \"140100\",\n" +
-                "            \"carProvinceName\": \"山西省\",\n" +
-                "            \"carTypeCode\": \"1\",\n" +
-                "            \"carUsage\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"carbrand\": \"雅阁(ACCORD)牌\",\n" +
-                "            \"certifiCateDate\": \"\",\n" +
-                "            \"chargingpostFlag\": \"0\",\n" +
-                "            \"chgOwnerDate\": \"2014-09-03\",\n" +
-                "            \"chgOwnerDateRecogNition\": \"2014-09-03\",\n" +
-                "            \"chgOwnerFlag\": \"0\",\n" +
-                "            \"ciChgOwnerFlag\": \"0\",\n" +
-                "            \"clauseType\": \"F54\",\n" +
-                "            \"clauseTypeSystem\": \"04\",\n" +
-                "            \"colorCode\": \"03\",\n" +
-                "            \"comlossCondition\": \"太原市\",\n" +
-                "            \"completeKerbMass\": \"1495\",\n" +
-                "            \"compromisePrice\": \"29960.0\",\n" +
-                "            \"countryNature\": \"B\",\n" +
-                "            \"engineNo\": \"1237456\",\n" +
-                "            \"engineNoRecogNition\": \"1237456\",\n" +
-                "            \"enrollDate\": \"2014-09-03\",\n" +
-                "            \"enrollDateValueStatus\": 1,\n" +
-                "            \"enrollDateoRecogNition\": \"2014-09-03\",\n" +
-                "            \"exhaustScale\": \"1.997\",\n" +
-                "            \"exhaustScalelb\": 1.997,\n" +
-                "            \"frameNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"fuelType\": \"0\",\n" +
-                "            \"gearBoxtyPecode\": \"BS03\",\n" +
-                "            \"gearBoxtyPecodeName\": \"BS03-CVT\",\n" +
-                "            \"idValidDate\": \"2044-02-17\",\n" +
-                "            \"identiFication\": 1,\n" +
-                "            \"identify\": \"1\",\n" +
-                "            \"idvalidStartDate\": \"2024-02-17\",\n" +
-                "            \"licenseCategory\": \"K33\",\n" +
-                "            \"licenseColorCode\": \"01\",\n" +
-                "            \"licenseKindCode\": \"01\",\n" +
-                "            \"licenseKindCodeNition\": \"01\",\n" +
-                "            \"licenseNo\": \"晋A345G0\",\n" +
-                "            \"licenseNoRecogNition\": \"晋A345G0\",\n" +
-                "            \"loanVehicleFlag\": \"0\",\n" +
-                "            \"lossCondition\": \"山西省\",\n" +
-                "            \"lossConditionCode\": \"Z278230500010001\",\n" +
-                "            \"madeFactory\": \"广汽本田汽车有限公司\",\n" +
-                "            \"maincarKindCode\": \"A\",\n" +
-                "            \"maincarKindCodeNition\": \"A\",\n" +
-                "            \"makeDate\": \"\",\n" +
-                "            \"modelCode\": \"BGQEYHUC0008\",\n" +
-                "            \"modelCodeOld\": \"BTAALD0103\",\n" +
-                "            \"modelName\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"modelNameRecogNition\": \"\",\n" +
-                "            \"natureOfUse\": 1,\n" +
-                "            \"newCaRegistration\": \"1\",\n" +
-                "            \"newDeviceFlag\": \"0\",\n" +
-                "            \"newEnergyFlag\": \"0\",\n" +
-                "            \"newFuelModel\": \"0\",\n" +
-                "            \"newFuelModelName\": \"正常缴税\",\n" +
-                "            \"noticeType\": \"HG7205AAC4\",\n" +
-                "            \"ocr_invoice_flag\": \"0\",\n" +
-                "            \"ownerAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"ownerAreas\": \"山西省太原市清徐县\",\n" +
-                "            \"ownerCityName\": \"太原市\",\n" +
-                "            \"ownerPostName\": \"清徐县\",\n" +
-                "            \"ownerProvinceName\": \"山西省\",\n" +
-                "            \"ownersAddress\": \"山西省清徐县清源镇六合村北大街34号\",\n" +
-                "            \"postCode\": \"140100\",\n" +
-                "            \"power\": \"114\",\n" +
-                "            \"powerLB\": 1.997,\n" +
-                "            \"powertypecode\": \"D1\",\n" +
-                "            \"productType\": \"0101\",\n" +
-                "            \"proposalNo\": \"\",\n" +
-                "            \"purchasePrice\": \"149800\",\n" +
-                "            \"pureElectricBatteryType\": \"11\",\n" +
-                "            \"pureRiskPremium\": \"1\",\n" +
-                "            \"rateCode\": \"20\",\n" +
-                "            \"relationShip\": \"1\",\n" +
-                "            \"restricFlag\": \"\",\n" +
-                "            \"riskTypeCode\": \"0\",\n" +
-                "            \"riskTypeCodeName\": \"0-正常车型\",\n" +
-                "            \"riskTypeName\": \"正常车型\",\n" +
-                "            \"seatCount\": \"5\",\n" +
-                "            \"seatCountlb\": 5,\n" +
-                "            \"sex\": \"1\",\n" +
-                "            \"sexRecogNition\": \"1\",\n" +
-                "            \"speed\": \"200\",\n" +
-                "            \"stopFlagCode\": \"1\",\n" +
-                "            \"stopFlagCodeName\": \"1-停产\",\n" +
-                "            \"termsSystem\": \"04\",\n" +
-                "            \"tonCount\": \"0\",\n" +
-                "            \"tonCountlb\": \"0\",\n" +
-                "            \"tractionTonCount\": \"\",\n" +
-                "            \"transmissionttype\": \"CVT\",\n" +
-                "            \"useNatureCode\": \"8A\",\n" +
-                "            \"useNatureCodeNition\": \"8A\",\n" +
-                "            \"useNatureCodeNitionNew\": \"\",\n" +
-                "            \"useYears\": 11,\n" +
-                "            \"vehicleBrand\": \"雅阁HG7205AAC4轿车\",\n" +
-                "            \"vehicleClassNewCode\": \"JC04\",\n" +
-                "            \"vehicleClassNewCodeName\": \"JC04-中型轿车(B)\",\n" +
-                "            \"vehicleClassNewName\": \"中型轿车(B)\",\n" +
-                "            \"vehicleCode\": \"BGQEYHUC000871A1\",\n" +
-                "            \"vehicleSize\": \"4930*1845*1470\",\n" +
-                "            \"vinClick\": \"1\",\n" +
-                "            \"vinModel\": \"BTAALD0103\",\n" +
-                "            \"vinNo\": \"LHGCR1640E8037440\",\n" +
-                "            \"vinNoRecogNition\": \"LHGCR1640E8037440\",\n" +
-                "            \"ymModelSegmentation\": \"\"\n" +
-                "        },\n" +
-                "        \"prpTitemCarExt\": {},\n" +
-                "        \"prpTmain\": {\n" +
-                "            \"answer\": \"\",\n" +
-                "            \"biAnswer\": \"\",\n" +
-                "            \"disCount\": 1.0,\n" +
-                "            \"endDate\": \"2027-05-30\",\n" +
-                "            \"endDate0507\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"endDate0507t1\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"endHour\": 24,\n" +
-                "            \"endHour0507\": 24,\n" +
-                "            \"endMinute\": 0,\n" +
-                "            \"endMinute0507\": 0,\n" +
-                "            \"endMinute0507t1\": 0,\n" +
-                "            \"expectDiscount\": \"\",\n" +
-                "            \"feeandDiscountFlag\": \"0\",\n" +
-                "            \"immeValiFlag\": \"\",\n" +
-                "            \"immeValiFlag0507\": 0,\n" +
-                "            \"immeValiFlag0507t1\": 0,\n" +
-                "            \"immeValidEndDate\": \"\",\n" +
-                "            \"immeValidEndDate0507\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"immeValidEndDate0507t1\": \"2027-05-12T16:00:00.000Z\",\n" +
-                "            \"immeValidStartDate\": \"\",\n" +
-                "            \"immeValidStartDate0507\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"immeValidStartDate0507t1\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"inputDate\": \"2026-05-13\",\n" +
-                "            \"period0530\": 30,\n" +
-                "            \"renewalFlag\": \"\",\n" +
-                "            \"saleChange\": \"0\",\n" +
-                "            \"signDate\": \"2026-05-13\",\n" +
-                "            \"signDiscount\": 0.0,\n" +
-                "            \"startDate\": \"2026-05-31\",\n" +
-                "            \"startDate0507\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"startDate0507t1\": \"2026-05-13T16:00:00.000Z\",\n" +
-                "            \"startDateFlag\": 0,\n" +
-                "            \"startDateFlag0507\": 0,\n" +
-                "            \"startDateFlag0507t1\": 0,\n" +
-                "            \"startHour\": 0,\n" +
-                "            \"startHour0507\": 0,\n" +
-                "            \"startMinute\": 0,\n" +
-                "            \"startMinute0507\": 0,\n" +
-                "            \"startMinute0507t1\": 0,\n" +
-                "            \"sumLowerRate\": \"\",\n" +
-                "            \"sumPremium\": \"\",\n" +
-                "            \"sumnoTaxPremium\": 896.23\n" +
-                "        },\n" +
-                "        \"prpTmainRate\": {\n" +
-                "            \"accruedexpenses\": \"0\",\n" +
-                "            \"actuarialCoef\": \"交强险 1.2019;商业险 1.2019;\",\n" +
-                "            \"actuarialRuleCode\": \"交强险 I99A12511001,I03A12512007,I03A12504020,I03A12509002,I03A12512001;商业险 I99A12511001,I03A12512007,I03A12504020,I03A12509002,I03A12512001;\",\n" +
-                "            \"attribute1\": \"0.00\",\n" +
-                "            \"attribute2\": \"0.00\",\n" +
-                "            \"attribute3\": \"0.00\",\n" +
-                "            \"attribute4\": \"0.00\",\n" +
-                "            \"attribute5\": \"\",\n" +
-                "            \"billcomacquisitionfeerate\": 0,\n" +
-                "            \"billcomallowance\": 0,\n" +
-                "            \"billcomotherfeerate\": 0,\n" +
-                "            \"billcomtransfeerate\": 0,\n" +
-                "            \"chdConsistent\": \"-2\",\n" +
-                "            \"chdTranche\": \"-2\",\n" +
-                "            \"classcode\": \"05\",\n" +
-                "            \"coefficient1\": 0,\n" +
-                "            \"coefficient10\": 0,\n" +
-                "            \"coefficient11\": 0,\n" +
-                "            \"coefficient2\": 0,\n" +
-                "            \"coefficient3\": 0,\n" +
-                "            \"coefficient4\": 0,\n" +
-                "            \"coefficient5\": 0,\n" +
-                "            \"coefficient6\": 0,\n" +
-                "            \"coefficient7\": 0,\n" +
-                "            \"coefficient8\": 0,\n" +
-                "            \"coefficient9\": 0,\n" +
-                "            \"dispersion\": \"0\",\n" +
-                "            \"evScore\": \"-2\",\n" +
-                "            \"highRiskCar\": \"\",\n" +
-                "            \"isFromApps\": \"0\",\n" +
-                "            \"mileage12\": \"-2\",\n" +
-                "            \"mileage24\": \"-2\",\n" +
-                "            \"mileage6\": \"-2\",\n" +
-                "            \"mutualback\": \"0\",\n" +
-                "            \"natrnk\": \"-2\",\n" +
-                "            \"qjhScore\": \"-2\",\n" +
-                "            \"riskcode\": \"0507\",\n" +
-                "            \"score12sd\": \"-2\",\n" +
-                "            \"tempLateFlag\": \"1\",\n" +
-                "            \"totalAttribute\": 0.0,\n" +
-                "            \"totalcost\": 0,\n" +
-                "            \"vhlScore\": \"-2\"\n" +
-                "        },\n" +
-                "        \"prpTrenewal\": [],\n" +
-                "        \"prptengageList\": [],\n" +
-                "        \"prptitemkindList\": [\n" +
-                "            {\n" +
-                "                \"amount\": \"200000\",\n" +
-                "                \"basePremium\": \"0\",\n" +
-                "                \"calculateFlag\": \"N\",\n" +
-                "                \"currency\": \"CNY\",\n" +
-                "                \"deductible\": \"\",\n" +
-                "                \"discount\": \"0.0\",\n" +
-                "                \"endDate\": \"2027-05-30\",\n" +
-                "                \"endHour\": 24,\n" +
-                "                \"endMinute\": 0,\n" +
-                "                \"flag\": \" 2  03\",\n" +
-                "                \"isDeductible\": 0,\n" +
-                "                \"itemKindNo\": \"0\",\n" +
-                "                \"kindCode\": \"BZ\",\n" +
-                "                \"kindName\": \"机动车交通事故责任强制保险\",\n" +
-                "                \"noTaxPremium\": \"0.0\",\n" +
-                "                \"premium\": \"0.0\",\n" +
-                "                \"rate\": \"0\",\n" +
-                "                \"riskCode\": \"0507\",\n" +
-                "                \"shortRate\": \"100.0000\",\n" +
-                "                \"shortRateFlag\": \"2\",\n" +
-                "                \"startDate\": \"2026-05-31\",\n" +
-                "                \"startHour\": 0,\n" +
-                "                \"startMinute\": 0,\n" +
-                "                \"taxFee\": \"0.0\",\n" +
-                "                \"taxRate\": \"0.06\"\n" +
-                "            }\n" +
-                "        ],\n" +
-                "        \"queryExpensePowerOutputVo\": {\n" +
-                "            \"agentClerkFlagDisplay\": \"0\",\n" +
-                "            \"companyRatePower\": \"0\",\n" +
-                "            \"configPowerManageFeeRateBI\": \"0\",\n" +
-                "            \"configPowerManageFeeRateCI\": \"1\",\n" +
-                "            \"configPowerMiddleCostBI\": \"0\",\n" +
-                "            \"configPowerMiddleCostCI\": \"0\",\n" +
-                "            \"errorCode\": \"\",\n" +
-                "            \"errorMessage\": \"\",\n" +
-                "            \"manageFeeRateDisplay\": \"1\",\n" +
-                "            \"personPowerAllowanceRateNoModify\": \"1\",\n" +
-                "            \"personPowerAllowanceRateNoShow\": \"1\",\n" +
-                "            \"personPowerBusinessPromoteRateNoModify\": \"1\",\n" +
-                "            \"personPowerBusinessPromoteRateNoShow\": \"1\",\n" +
-                "            \"personPowerBusinessTotalCostBIShow\": \"1\",\n" +
-                "            \"personPowerBusinessTotalCostCIShow\": \"1\",\n" +
-                "            \"personPowerDisRateNoModify\": \"1\",\n" +
-                "            \"personPowerDisRateNoShow\": \"1\",\n" +
-                "            \"personPowerManageFeeRateBC\": \"0\",\n" +
-                "            \"personPowerMiddleCostBC\": \"0\",\n" +
-                "            \"salesSalaryRateDisplay\": \"0\"\n" +
-                "        },\n" +
-                "        \"shortRate\": 100,\n" +
-                "        \"showCarShip\": true,\n" +
-                "        \"trafficInsurance\": {\n" +
-                "            \"endDate\": \"2026-05-31\",\n" +
-                "            \"startDate\": \"2025-05-31\"\n" +
-                "        }\n" +
-                "    }\n" +
-                "}";
-
-        JsonNode oldNode = OBJECT_MAPPER.readTree(json1);
-        JsonNode newNode = OBJECT_MAPPER.readTree(json2);
-
-        List<JsonDiff> diffList = compareJson(oldNode, newNode);
-
-        System.out.println("==================== JSON 差异对比报告 ====================");
-        if (diffList.isEmpty()) {
-            System.out.println("两个JSON完全一致");
-        } else {
-            diffList.forEach(System.out::println);
-            System.out.println("共发现 " + diffList.size() + " 处差异");
-        }
-    }
-}

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

@@ -64,6 +64,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-dadi</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
         <dependency>
             <groupId>com.jzg</groupId>
             <artifactId>quotation-taikang</artifactId>

+ 9 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -558,6 +558,15 @@ public class UnifyOrderManager {
                 insOrdersService.orderStatusMessage(insOrders,
                         insOrdersCarInfo, insOrdersCosts,
                         baseController.getToken(), MessageCodeEnum.TEMPLATE_4);
+            }else  if (underwritingResultsVo.getUnderwritingStatus().equals(InsOrderStatusEnum.STAFF_PROCESS)) {
+                //核保之前更新订单为待核保
+                StateResult stateFailResult = orderStateListener.statusChange(InsOrderStatusEnum.STAFF_PROCESS, insOrders.getOrderStatus());
+                insOrders.setOrderStatus(String.valueOf(stateFailResult.getCurrentState()));
+                insOrdersService.updateById(insOrders);
+                // 发送订单状态变更消息
+                insOrdersService.orderStatusMessage(insOrders,
+                        insOrdersCarInfo, insOrdersCosts,
+                        baseController.getToken(), MessageCodeEnum.TEMPLATE_3);
             }
             throw new SystemException(underwritingResultsVo.getUnderwritingResult());
         }

+ 9 - 3
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -6,10 +6,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
@@ -18,6 +18,12 @@ spring:
       - nacos:mongodb
       - nacos:identify
       - nacos:crawler-config
+  data:
+    redis:
+      host: 192.168.5.250
+      port: 6379
+      password: 123456  # 如果没有密码,可删除此行
+      database: 0
 #百度图片识别API
 baidu:
   clientId: xG9M8tSjNvYPwSTNavM0ELlD
@@ -37,7 +43,7 @@ image:
 
 # 支付码相关配置
 qrcode:
-  genAddress: http://127.0.0.1:8001/order/qrCode/index
+  genAddress: https://tennat.baoxianzhanggui.com/api/order/qrCode/index
   imageSrc: http://127.0.0.1:8001/template/
 
 

+ 1 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCar.java

@@ -133,7 +133,7 @@ public class TKCar extends UnknownFieldEntity {
     /**
      * 座位标志
      */
-    private String seatFlag;
+    private Integer seatFlag;
 
     /**
      * 过户标示,是否过户车,车主变更标志

+ 20 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCarInfoVo.java

@@ -155,6 +155,26 @@ public class TKCarInfoVo extends UnknownFieldEntity {
      */
     private List<TKCarModel> carModel;
 
+    /**
+     * 颜色代码
+     */
+    private String colorCode;
+
+    /**
+     * 整备质量
+     */
+    private String curingQuality;
+
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+
+    /**
+     * 车辆类型中文名称
+     */
+    private String vehicleTypeCname;
+
     @Override
     protected void addChildUnknownFields() {
         addChildUnknownField("carCheckVo", carCheckVo);

+ 1 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKOther.java

@@ -80,7 +80,7 @@ public class TKOther extends UnknownFieldEntity {
     /**
      * 商业险消息
      */
-    private String messageCI;
+    private List<String> messageCI;
 
     /**
      * 来源ID

+ 5 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKPremium.java

@@ -65,6 +65,11 @@ public class TKPremium extends UnknownFieldEntity {
      */
     private BigDecimal syPremium;
 
+    /**
+     * 驾意险保费
+     */
+    private BigDecimal jyxPremium;
+
     /**
      * 税款
      */

+ 1 - 3
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java

@@ -499,7 +499,7 @@ public class TKHttpAPIService {
             CodeUtil.autoSetter(car::setExhaustScale, commonCarInfoVo::getDisplacement, tkCarModel::getDisplacement);  // 排量
             CodeUtil.autoSetter(car::setBrandName, commonCarInfoVo::getBrandName, tkCarModel::getModelName); // todo 与 tkCarModel.getModelName() 重复
 
-            car.setSeatFlag("1"); // todo
+            car.setSeatFlag(1); // todo
             car.setExhaustScale(tkCarModel.getDisplacement().substring(0, tkCarModel.getDisplacement().indexOf(".")));
             car.setPurchasePrice(tkCarModel.getPurchasePrice().substring(0, tkCarModel.getPurchasePrice().indexOf(".")));
 //            car.setVinNo(commonCarInfoVo.getVinNo());
@@ -657,8 +657,6 @@ public class TKHttpAPIService {
         StringResponse response = client.request(HttpURL.preciseInit, param, httpHeaders, StringResponse.class);
         checkResponseUnknownField(response);
         return decrypt(response, PreciseInitResult.class);
-
-
     }
 
     /**

Vissa filer visades inte eftersom för många filer har ändrats