Procházet zdrojové kódy

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260622' into dev_jzg_lipf_v20260622

jiakai před 2 měsíci
rodič
revize
d42b6d91a9
51 změnil soubory, kde provedl 5663 přidání a 1034 odebrání
  1. 3 1
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/build/ChengTaiAPIQuoteResultsVoBuild.java
  2. 20 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java
  3. 59 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  4. 8 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerRecordResponse.java
  5. 13 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  6. 6 0
      tenant/insurance/quotation-summary/pom.xml
  7. 4 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  8. 10 9
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  9. 90 26
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/build/TaiPingCrawlerQuoteResultsVoBuild.java
  10. 90 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/component/TaiPingCrawlerCacheComponent.java
  11. 219 37
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/component/TaiPingCrawlerRequestComponent.java
  12. 39 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/constant/KindCodeEnum.java
  13. 9 5
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/constant/RequestUrl.java
  14. 54 7
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/TaipingCrawlerConfigureParameters.java
  15. 6 2
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/po/TaiPingCrawlerOrder.java
  16. 33 10
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerBrandNameQueryRequest.java
  17. 20 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerCreateOrderRequest.java
  18. 79 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindApplyNoRequest.java
  19. 34 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindByProductCodeRequest.java
  20. 9 28
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindSolutionCodeRequest.java
  21. 65 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerGetCarDepreRateRequest.java
  22. 10 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerImageIntoOneFileRequest.java
  23. 12 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerOCRResultConfirmRequest.java
  24. 743 498
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerPremiumCalculateRequest.java
  25. 8 2
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerQueryListRequest.java
  26. 116 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerSubmitValidateRequest.java
  27. 2209 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerVehicleForPRPQueryRequest.java
  28. 5 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlersSubmitToAuditRequest.java
  29. 29 7
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerBrandNameQueryData.java
  30. 167 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindApplyNoResponse.java
  31. 123 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindByProductCodeResponse.java
  32. 22 35
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindSolutionCodeData.java
  33. 212 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerImageIntoOneFileResponse.java
  34. 327 295
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerPremiumCalculateData.java
  35. 1 1
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerQueryListData.java
  36. 42 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerSubmitValidateData.java
  37. 22 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerVehicleForPRPQueryResponse.java
  38. 19 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingHzResponse.java
  39. 21 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaipingCkResponse.java
  40. 3 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/repository/TaiPingCrawlerOrderRepository.java
  41. 5 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/TaiPingCrawlerOrderService.java
  42. 1 2
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/TaiPingCrawlerQuoteProcessService.java
  43. 15 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaiPingCrawlerOrderServiceImpl.java
  44. 11 14
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaiPingCrawlerQuoteProcessServiceImpl.java
  45. 471 44
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java
  46. 151 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/DateUtil.java
  47. 23 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/LoginResult.java
  48. 19 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/VerifyCodeCreate.java
  49. 0 4
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  50. 2 5
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java
  51. 4 2
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

+ 3 - 1
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/build/ChengTaiAPIQuoteResultsVoBuild.java

@@ -151,7 +151,9 @@ public final class ChengTaiAPIQuoteResultsVoBuild {
                 kind.setAmount(itemKindListDTO.getAmount().toString());
             }
             // 设置保费
-            kind.setPremium(itemKindListDTO.getGrossPremium().toString());
+            if (itemKindListDTO != null) {
+                kind.setPremium(itemKindListDTO.getGrossPremium().toString());
+            }
         });
         return kindInfoVo;
     }

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

@@ -798,6 +798,26 @@ public class PremiumCalculationRequest {
                     kind.quantity = Integer.parseInt(vehicle.getSeat());
                 }
                 kindList.add(kind);
+                List<Kind> removeList = new ArrayList<>();
+                // 当有不投保的险种进来险种数组时 移除该险种
+                for (Kind kindInfo : kindList) {
+                    if ("041".equals(kindInfo.getKindCode()) && kindInfo.getUnitInsured().compareTo(BigDecimal.ZERO) == 0) {
+                        removeList.add(kindInfo);
+                    }
+                    if ("044".equals(kindInfo.getKindCode()) && kindInfo.getUnitInsured().compareTo(BigDecimal.ZERO) == 0) {
+                        removeList.add(kindInfo);
+                    }
+                    if ("YB".equals(kindInfo.getKindCode()) && kindInfo.getSumInsured().compareTo(BigDecimal.ZERO) == 0) {
+                        removeList.add(kindInfo);
+                    }
+                    if ("YD11".equals(kindInfo.getKindCode()) && kindInfo.getUnitInsured().compareTo(BigDecimal.ZERO) == 0) {
+                        removeList.add(kindInfo);
+                    }
+                    if ("YD12".equals(kindInfo.getKindCode()) && kindInfo.getUnitInsured().compareTo(BigDecimal.ZERO) == 0) {
+                        removeList.add(kindInfo);
+                    }
+                }
+                kindList.removeAll(removeList);
             }
             return kindList;
         }

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

@@ -597,6 +597,65 @@ public class RequestComponent {
     }
 
 
+    public <Response> ResponseEntity<Response> postTaiping(String url, String body, HttpHeaders headers) {
+        body = Optional.ofNullable(body).orElse("");
+        log.info("URL的值:{},body的值:{}", url, body);
+        WebClient webClient = selectNoSSLWebClient();
+        try {
+            HttpHeaders requestHeaders = new HttpHeaders();
+            if (headers != null) {
+                requestHeaders.addAll(headers);
+            }
+            requestHeaders.remove("Accept-Encoding");
+
+            ResponseEntity<String> rawResponse = webClient.post()
+                    .uri(url)
+                    .headers(setHeaders(requestHeaders))
+                    .body(BodyInserters.fromValue(body))
+                    .retrieve()
+                    .toEntity(String.class)
+                    .block();
+
+            if (rawResponse == null) {
+                throw new WebClientResponseException(
+                        500,
+                        "No response received",
+                        HttpHeaders.EMPTY,
+                        "No response received".getBytes(StandardCharsets.UTF_8),
+                        null
+                );
+            }
+            String responseBody = rawResponse.getBody();
+            if (responseBody == null) {
+                responseBody = "";
+            }
+            String filteredResponse = filterIllegalCharacters(responseBody);
+
+            // 加密字符串直接强转,跳过JSON解析
+            Response result = (Response) filteredResponse;
+
+            HttpHeaders responseHeaders = new HttpHeaders();
+            responseHeaders.setContentType(MediaType.TEXT_PLAIN);
+            return ResponseEntity.status(rawResponse.getStatusCode())
+                    .headers(responseHeaders)
+                    .body(result);
+
+        } catch (WebClientResponseException e) {
+            log.error("WebClient请求失败,状态码: {}, 响应头: {}",
+                    e.getStatusCode(), e.getHeaders(), e);
+            throw e;
+        } catch (Exception e) {
+            log.error("请求失败", e);
+            throw new WebClientResponseException(
+                    500,
+                    "Request failed: " + e.getMessage(),
+                    HttpHeaders.EMPTY,
+                    e.getMessage().getBytes(StandardCharsets.UTF_8),
+                    null
+            );
+        }
+    }
+
     /**
      * 构造post请求
      *

+ 8 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/response/HbCrawlerRecordResponse.java

@@ -41,11 +41,19 @@ public class HbCrawlerRecordResponse extends HbBaseResponse {
      */
     private String checktypeSy;
 
+    /**
+     * 交强险验证码图片
+     */
+    private String checkcodeJqImg;
     /**
      * 交强险验证码
      */
     private String checkcodeJq;
 
+    /**
+     * 商业险验证码图片
+     */
+    private String checkcodeSyImg;
     /**
      * 商业险验证码
      */

+ 13 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -28,6 +28,7 @@ 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.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.DateUtil;
@@ -44,6 +45,7 @@ import com.jzg.quotation.hengbang.crawler.properties.HengBangCrawlerProperties;
 import com.jzg.quotation.hengbang.crawler.service.HbCrawlerOrderService;
 import com.jzg.quotation.hengbang.crawler.service.HengBangCrawlerRequest;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.StringUtils;
 
@@ -59,6 +61,7 @@ import java.util.Map;
  * @author: shenwd
  * @date: 2025/4/7 11:10
  **/
+@Slf4j
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_HBIC)
 @RequiredArgsConstructor
 public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
@@ -69,6 +72,8 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
 
     private final HengBangCrawlerProperties hbCrawlerProperties;
 
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
     private final PlatformClient platformClient;
 
     private final MinioUtils minioUtils;
@@ -189,6 +194,14 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         if (errorMsg.contains("该车是转保车,请输入对应的转保验证码")) {
             String responseBody = resJsonObj.getString("responseBody");
             HbCrawlerRecordResponse recordResponse = JSONObject.parseObject(responseBody, HbCrawlerRecordResponse.class);
+            // 识别验证码
+            String systemJqCode = exteriorUtilsRequest.captchaIdentify(recordResponse.getCheckcodeJqImg());
+            log.info( "系统识别的交强验证码为:" + systemJqCode);
+            recordResponse.setCheckcodeJq(systemJqCode);
+            // 识别验证码
+            String systemSyCode = exteriorUtilsRequest.captchaIdentify(recordResponse.getCheckcodeSyImg());
+            log.info( "系统识别的商业验证码为:" + systemSyCode);
+            recordResponse.setCheckcodeSy(systemSyCode);
             recordResponse.getCheckcodeJq().replace("0","o");
             recordResponse.getCheckcodeSy().replace("0","o");
             calculationRequest.setTransferVehicle(recordResponse);

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

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

+ 4 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -253,6 +253,10 @@ public class FactorMatch {
                 value = value.substring(0, 2);
             }
             result = selectEqual(ptlAgreementCostRule, value);
+            //车龄
+            if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("VehicleAge")) {
+                result = inputNumberEqual(ptlAgreementCostRule, value);
+            }
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
             result = radioEqual(ptlAgreementCostRule, value);
         } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("datetime")){ // 时间

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

@@ -242,9 +242,11 @@ zijin:
 #    downLoadDocument: http://open.zking.com/temp/api/v1/insurance/nonAutoMobile/queryPolicy/downLoadDocument
 #    # 对接三方渠道验车链接接口
 #    sendCheckCarLink: http://open.zking.com/api/v1/open/open-aggregate/auth/wanJiaYun/sendCheckCarLink
-zhongAn:
-  id: "1402039"
-  productId: "10676"
+
+taiping:
+  crawler:
+    url: https://autopp.tpi.cntaiping.com/api
+
 
 
 feign:
@@ -260,15 +262,14 @@ feign:
     jzg-partner:
       url: http://localhost:8087/
     jeecg-boot:
-#      url: https://life.baoxianzhanggui.com/locallive-pro-java/
-      url: https://test.baoxianzhanggui.com/wks-api/jeecg-boot/
+      url: https://test.baoxianzhanggui.com/locallive-java
 # 和生活服务平台约定的appkey、appSeCret,用于获取token
 live:
   service:
-    appKey: _N7dxVy3UJQUNwvacEHUFPzZ63kGwSx1OxXablRXJ9g
-    appSeCret: UByV_498NU1unnr3b0hvQtIKbRyIj0HGCkZXxxgzwAU
+   appKey: wKOpGiLUSVgDh85rvWGUjqhDrNSLPbrbun6zvGqLv7I
+   appSeCret: qIcx2vjt3e0I5QmW6m1WT8ZOpDaujkv2OEaMey4Ndg4
 
 localLive:
   base-url: http://192.168.1.108:8082/jeecg-boot
-  app-key: _N7dxVy3UJQUNwvacEHUFPzZ63kGwSx1OxXablRXJ9g
-  app-secret: UByV_498NU1unnr3b0hvQtIKbRyIj0HGCkZXxxgzwAU
+  app-key: wKOpGiLUSVgDh85rvWGUjqhDrNSLPbrbun6zvGqLv7I
+  app-secret: qIcx2vjt3e0I5QmW6m1WT8ZOpDaujkv2OEaMey4Ndg4

+ 90 - 26
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/build/TaiPingCrawlerQuoteResultsVoBuild.java

@@ -1,11 +1,13 @@
 package com.jzg.quotation.taiping.crawler.build;
 
 import com.google.common.collect.Lists;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.ExpenseFactor;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerBaseResponse;
 import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerPremiumCalculateData;
 
 import java.util.List;
@@ -14,51 +16,113 @@ import java.util.stream.Collectors;
 
 public class TaiPingCrawlerQuoteResultsVoBuild {
 
-    public static QuoteResultsVo buildQuoteResultsVo(TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData, QuoteVo quoteVo) {
+    public static QuoteResultsVo buildQuoteResultsVo(TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculateResponse, QuoteVo quoteVo,String orderNo) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
-        quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
-
-        quoteResultsVo.setCiRiskInfoVo(new RiskInfoVo());
-        quoteResultsVo.setBiRiskInfoVo(new RiskInfoVo());
+        // 报价失败 返回失败原因
+        if (!premiumCalculateResponse.isSucc()) {
+            quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+            quoteResultsVo.setErrorMessage(premiumCalculateResponse.getErrMsg());
+            return quoteResultsVo;
+        } else if (premiumCalculateResponse.getData().getMsgBS() != null && premiumCalculateResponse.getData().getMsgBS().contains("重复投保")
+                    || premiumCalculateResponse.getData().getMsgBZ() != null && premiumCalculateResponse.getData().getMsgBZ().contains("重复投保")) {
+            quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+            quoteResultsVo.setErrorMessage(premiumCalculateResponse.getData().getMsgBZ() + premiumCalculateResponse.getData().getMsgBS());
+            return quoteResultsVo;
+        }
 
-        List<TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> pfItemKindDto0802List = taiPingCrawlerPremiumCalculateData.getPfItemKindDto0802List();
+        TaiPingCrawlerPremiumCalculateData premiumCalculateData = premiumCalculateResponse.getData();
+        quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
+        quoteResultsVo.setCompanyOrderNo(orderNo);
+        // 投保单号
+        quoteResultsVo.setCiPolicyNumber(premiumCalculateData.getProposalNo0801());
+        quoteResultsVo.setBiPolicyNumber(premiumCalculateData.getProposalNo0802());
+        // 交强险
+        quoteResultsVo.setCiRiskInfoVo(buildCiInfo(premiumCalculateData));
+        // 商业险
+        quoteResultsVo.setBiRiskInfoVo(buildBiInfo(premiumCalculateData));
+        // 商业险险种
+        List<TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> pfItemKindDto0802List = premiumCalculateData.getPfItemKindDto0802List();
         List<KindInfoVo> kindInfoVos = buildKindInfoVo(pfItemKindDto0802List, quoteVo.getKindInfoVo());
         quoteResultsVo.setKindInfoVo(kindInfoVos);
-
+        // 评分
         List<ExpenseFactor> expenseFactors = buildExpenseFactors();
         quoteResultsVo.setExpenseFactors(expenseFactors);
+        quoteResultsVo.setScoreVo(buildScoreVo(premiumCalculateData));
 
-        List<TaiPingCrawlerPremiumCalculateData.PfRiskDtoListDTO> pfRiskDtoList = taiPingCrawlerPremiumCalculateData.getPfRiskDtoList();
-        TaiPingCrawlerPremiumCalculateData.PfCarShipTaxDTO pfCarShipTax = taiPingCrawlerPremiumCalculateData.getPfCarShipTax();
-        buildOtherInfo(pfRiskDtoList, pfCarShipTax, quoteResultsVo);
+        //设置保费,车船税
+        buildPremium(premiumCalculateData,quoteResultsVo);
         return quoteResultsVo;
     }
 
+    public static RiskInfoVo buildCiInfo(TaiPingCrawlerPremiumCalculateData premiumCalculateData) {
+        RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
+        TaiPingCrawlerPremiumCalculateData.PfPolicyInfoDtoDTO pfPolicyInfoDtoDTO = premiumCalculateData.getPfPolicyInfoDto();
+        ciRiskInfoVo.setRiskCode("0507");
+        ciRiskInfoVo.setStartDate(pfPolicyInfoDtoDTO.getStartDate0801());
+        ciRiskInfoVo.setEndDate(pfPolicyInfoDtoDTO.getEndDate0801());
+        ciRiskInfoVo.setInstantFlag(pfPolicyInfoDtoDTO.getEffectFlag0801() == null ? null : pfPolicyInfoDtoDTO.getEffectFlag0801());
+        return ciRiskInfoVo;
+    }
+    public static RiskInfoVo buildBiInfo(TaiPingCrawlerPremiumCalculateData premiumCalculateData) {
+        RiskInfoVo biRiskInfoVo = new RiskInfoVo();
+        TaiPingCrawlerPremiumCalculateData.PfPolicyInfoDtoDTO pfPolicyInfoDtoDTO = premiumCalculateData.getPfPolicyInfoDto();
+        biRiskInfoVo.setRiskCode("0510");
+        biRiskInfoVo.setStartDate(pfPolicyInfoDtoDTO.getStartDate0802());
+        biRiskInfoVo.setEndDate(pfPolicyInfoDtoDTO.getEndDate0802());
+        biRiskInfoVo.setInstantFlag(pfPolicyInfoDtoDTO.getEffectFlag0802() != null && pfPolicyInfoDtoDTO.getEffectFlag0802());
+        return biRiskInfoVo;
+    }
+
+
     private static List<ExpenseFactor> buildExpenseFactors() {
         return Lists.newArrayList();
     }
 
-    private static void buildOtherInfo(List<TaiPingCrawlerPremiumCalculateData.PfRiskDtoListDTO> pfRiskDtoList,
-                                       TaiPingCrawlerPremiumCalculateData.PfCarShipTaxDTO pfCarShipTax,
-                                       QuoteResultsVo quoteResultsVo
-    ) {
-        quoteResultsVo.getCosts().setCiPremium("");
-        quoteResultsVo.getCosts().setBiPremium("");
+    private static void buildPremium(TaiPingCrawlerPremiumCalculateData premiumCalculateData, QuoteResultsVo quoteResultsVo) {
+        double ciPremium = premiumCalculateData.getPfRiskDtoList()
+                .stream().filter(riskDto -> riskDto.getRiskCode().equals("0801"))
+                .mapToDouble(TaiPingCrawlerPremiumCalculateData.PfRiskDtoListDTO::getSumPriceTaxTotal)
+                .sum();
+        double biPremium = premiumCalculateData.getPfRiskDtoList()
+                .stream().filter(riskDto -> riskDto.getRiskCode().equals("0802"))
+                .mapToDouble(TaiPingCrawlerPremiumCalculateData.PfRiskDtoListDTO::getSumPriceTaxTotal)
+                .sum();
+//        double jyPremium = premiumCalculateData.getPfRiskDtoList()
+//                .stream().filter(riskDto -> riskDto.getRiskCode().equals("0803"))
+//                .mapToDouble(TaiPingCrawlerPremiumCalculateData.PfRiskDtoListDTO::getSumPriceTaxTotal)
+//                .sum();
+        double vvTax = premiumCalculateData.getPfCarShipTax().getSumPayTax();
+        quoteResultsVo.getCosts().setCiPremium(String.valueOf(ciPremium));
+        quoteResultsVo.getCosts().setBiPremium(String.valueOf(biPremium));
         quoteResultsVo.getCosts().setNiPremium("");
-
-        quoteResultsVo.setCiPolicyNumber("");
-        quoteResultsVo.setBiPolicyNumber("");
-
-        quoteResultsVo.getCosts().setVvTax("");
+        quoteResultsVo.getCosts().setVvTax(String.valueOf(premiumCalculateData.getPfCarShipTax().getSumPayTax()));
+        quoteResultsVo.getCosts().setSumPremium(String.valueOf(ciPremium+biPremium+vvTax));
     }
 
     private static List<KindInfoVo> buildKindInfoVo(List<TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> pfItemKindDto0802List, List<KindInfoVo> kindInfoVo) {
-        Map<String, TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> collect = pfItemKindDto0802List.stream()
-                .collect(Collectors.toMap(TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO::getKindCode, x -> x));
-        kindInfoVo.forEach(kind -> {
-            kind.setPremium(String.valueOf(collect.get(kind.getKindCode()).getPriceTaxTotal()));
-        });
+        if (pfItemKindDto0802List != null) {
+            Map<String, TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> collect = pfItemKindDto0802List.stream()
+                    .collect(Collectors.toMap(TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO::getKindCode, x -> x));
+            kindInfoVo.forEach(kind -> {
+                kind.setPremium(String.valueOf(collect.get(kind.getKindCode()).getPriceTaxTotal()));
+                kind.setAmount(String.valueOf(collect.get(kind.getKindCode()).getSumInsured()));
+                kind.setServiceTimes(String.valueOf(collect.get(kind.getKindCode()).getServiceTimes()));
+                kind.setDeductibleRate(String.valueOf(collect.get(kind.getKindCode()).getDeductibleRate()));
+            });
+        }
         return kindInfoVo;
     }
 
+    public static QuoteResultsVo.ScoreVo buildScoreVo(TaiPingCrawlerPremiumCalculateData premiumCalculateData ) {
+        QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+        premiumCalculateData.getPfRiskDtoList()
+                .stream().filter(riskDto -> riskDto.getRiskCode().equals("0801"))
+                .findFirst().ifPresent(jqRiskDto -> scoreVo.setJqAdjustRate(String.valueOf(jqRiskDto.getDiscount())));
+        premiumCalculateData.getPfRiskDtoList()
+                .stream().filter(riskDto -> riskDto.getRiskCode().equals("0802"))
+                .findFirst().ifPresent(syRiskDto -> scoreVo.setSyAdjustRate(String.valueOf(syRiskDto.getDiscount())));
+        return scoreVo;
+    }
+
 }

+ 90 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/component/TaiPingCrawlerCacheComponent.java

@@ -2,13 +2,24 @@ package com.jzg.quotation.taiping.crawler.component;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.jzg.quotation.taiping.crawler.entity.request.TaiPingCrawlerPremiumCalculateRequest;
 import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerPremiumCalculateData;
+import com.jzg.quotation.taiping.crawler.utils.LoginResult;
 import lombok.RequiredArgsConstructor;
 import org.redisson.api.RBucket;
+import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Component;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
 import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
 
 @Component
 @RequiredArgsConstructor
@@ -18,7 +29,12 @@ public class TaiPingCrawlerCacheComponent {
 
     private final static String PREMIUM_CALCULATE = "taiping:premiumCalculate:";
 
+    public static final String PREMIUM_CALCULATE_REQUEST = "taiping:premiumCalculateRequest:";
+
     public static final Duration PREMIUM_CALCULATE_TIME = Duration.ofHours(3L);
+    public static final String TAIPING_COOKIE = "taiping:cookie:";
+    private static final String XXUHOZTF0EZSO = "xxuhoztF0eZsO";
+    private static final String GW_TOKEN_TBATWGW_WAN_SC = "GW_TOKEN_TBATWGW_WAN_SC";
 
     /**
      * 保存订单财险
@@ -42,5 +58,79 @@ public class TaiPingCrawlerCacheComponent {
         return JSON.parseObject(bucket.get(), TaiPingCrawlerPremiumCalculateData.class);
     }
 
+    /**
+     * 保存太平财险订单请求数据
+     * @param taiPingCrawlerPremiumCalculateRequest
+     * @param ordersNo
+     */
+    public void cacheTaiPingCrawlerPremiumCalculateRequest(TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest, String ordersNo) {
+        String request = JSONObject.toJSONString(taiPingCrawlerPremiumCalculateRequest);
+        RBucket<String> bucket = redissonClient.getBucket(PREMIUM_CALCULATE_REQUEST + ordersNo);
+        bucket.set(request, PREMIUM_CALCULATE_TIME);
+    }
+
+    /**
+     * 获取太平财险订单请求数据
+     *
+     * @param ordersNo 订单号
+     */
+    public TaiPingCrawlerPremiumCalculateRequest getTaiPingCrawlerPremiumCalculateRequest(String ordersNo) {
+        RBucket<String> bucket = redissonClient.getBucket(PREMIUM_CALCULATE_REQUEST + ordersNo);
+        return JSON.parseObject(bucket.get(), TaiPingCrawlerPremiumCalculateRequest.class);
+    }
+
+
+        public void cacheCookie(String xxuhoztF0eZsO, String gw_token, String userName) {
+        Map<String, String> authorizationMap = new HashMap<>();
+        authorizationMap.put(XXUHOZTF0EZSO, xxuhoztF0eZsO);
+        authorizationMap.put(GW_TOKEN_TBATWGW_WAN_SC, gw_token);
+        RMap<Object, Object> map = redissonClient.getMap(TAIPING_COOKIE + userName);
+        map.putAll(authorizationMap);
+        map.expire(Duration.ofDays(15));
+    }
+
+    public LoginResult loginCookieCache(String cookie,String username) {
+        HttpURLConnection connection = null;
+        String cleaned = null;
+        try {
+            // 构造 URL
+            URL uri = new URL("http://192.168.5.250:8888/create");
+            connection = (HttpURLConnection) uri.openConnection();
+
+            // 设置请求方式和头信息
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setDoOutput(true);
+
+            // 构造 JSON 请求体
+            JSONObject json = new JSONObject();
+            json.put("username", username);
+            json.put("cookie", cookie);
+            String jsonInputString = json.toString();
+            // 发送请求体
+            try (OutputStream os = connection.getOutputStream()) {
+                byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
+                os.write(input, 0, input.length);
+            }
+            // 读取响应
+            StringBuilder sb = new StringBuilder();
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+            }
+            cleaned = sb.toString();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return JSONObject.parseObject(cleaned, LoginResult.class);
+    }
 
 }

+ 219 - 37
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/component/TaiPingCrawlerRequestComponent.java

@@ -2,10 +2,12 @@ package com.jzg.quotation.taiping.crawler.component;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.commons.entity.quote.vo.base.R;
-import com.jzg.quotation.taiping.crawler.constant.enums.RequestUrl;
+import com.jzg.quotation.taiping.crawler.constant.RequestUrl;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
 import com.jzg.quotation.taiping.crawler.entity.request.*;
 import com.jzg.quotation.taiping.crawler.entity.response.*;
 import com.jzg.quotation.taiping.crawler.properties.TaiPingCrawlerProperties;
@@ -24,11 +26,18 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.reactive.function.client.WebClient;
 import reactor.core.publisher.Mono;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.nio.channels.WritableByteChannel;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
+import java.util.List;
 import java.util.Map;
 
 @Component
@@ -47,15 +56,119 @@ public class TaiPingCrawlerRequestComponent {
         return requestComponent.post(url, bodyStr, requestUrl.getDescription(), bodyTypeReference, headers);
     }
 
-    public <Response> Response requestPostStrDecrypt(RequestUrl requestUrl, Object body, TypeReference<Response> tTypeReference, HttpHeaders headers) {
+
+    public <Response> Response requestPostStrDecrypt(RequestUrl requestUrl, Object body, TypeReference<Response> tTypeReference, HttpHeaders headers,TaipingCrawlerConfigureParameters parameters) {
+        String tpck = postTpck(parameters.getUsername(),parameters.getXxuhoztF0eZsO(),parameters.getTk());
         String bodyStr = JSON.toJSONString(body);
+        headers.set("Cookie", tpck);
         String encryptBody = AESEncryption.encrypt(bodyStr);
         String url = requestUrl.getRequestUrl(taiPingCrawlerProperties.getUrl());
-        ResponseEntity<String> post = requestComponent.post(url, encryptBody, String.class, headers);
+        TaiPingHzResponse tphz = postTphz(parameters.getUsername(),parameters.getXxuhoztF0eZsO(),parameters.getTk(),"POST",url,encryptBody);
+        String finallyUrl = url + "?fN4B1rBS=" + tphz.getFN4B1rBS();
+        if (tphz.getHiOoKhrU() != null) {
+            encryptBody = "hiOoKhrU=" + tphz.getHiOoKhrU();
+        }
+        ResponseEntity<String> post = requestComponent.postTaiping(finallyUrl, encryptBody, headers);
         String responseBody = post.getBody();
         return AESEncryption.decrypt(responseBody, tTypeReference);
     }
 
+    public String postTpck(String username, String ck, String token) {
+        HttpURLConnection connection = null;
+        String cleaned = null;
+        try {
+            // 构造 URL
+            URL url = new URL("http://192.168.5.250:8888/tpck");
+            connection = (HttpURLConnection) url.openConnection();
+
+            // 设置请求方式和头信息
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setDoOutput(true);
+
+            // 构造 JSON 请求体
+            String jsonInputString = String.format(
+                    "{\"username\":\"%s\", \"ck\":\"%s\", \"token\":\"%s\"}", username, ck, token
+            );
+            // 发送请求体
+            try (OutputStream os = connection.getOutputStream()) {
+                byte[] input = jsonInputString.getBytes("utf-8");
+                os.write(input, 0, input.length);
+            }
+
+            // 读取响应
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(connection.getInputStream(), "utf-8"))) {
+                StringBuilder sb = new StringBuilder();
+                String line;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+                cleaned = sb.toString();
+                if (cleaned.startsWith("\"") && cleaned.endsWith("\"")) {
+                    cleaned = cleaned.substring(1, cleaned.length() - 1);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return cleaned;
+    }
+
+    public TaiPingHzResponse postTphz(String username, String ck, String token,
+                                      String type, String url, String data) {
+        HttpURLConnection connection = null;
+        TaiPingHzResponse tphzResponse = null;
+
+        try {
+            // 构造 URL
+            URL uri = new URL("http://192.168.5.250:8888/tphz");
+            connection = (HttpURLConnection) uri.openConnection();
+
+            // 设置请求方式和头信息
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setDoOutput(true);
+
+            // 构造 JSON 请求体
+            String jsonInputString = String.format(
+                    "{\"username\":\"%s\", \"ck\":\"%s\", \"token\":\"%s\",\"type_\":\"%s\",\"url\":\"%s\",\"data\":\"%s\"}",
+                    username, ck, token, type, url, data
+            );
+            // 发送请求体
+            try (OutputStream os = connection.getOutputStream()) {
+                byte[] input = jsonInputString.getBytes(StandardCharsets.UTF_8);
+                os.write(input, 0, input.length);
+            }
+            // 读取响应
+            StringBuilder sb = new StringBuilder();
+            try (BufferedReader br = new BufferedReader(
+                    new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
+                String line;
+                while ((line = br.readLine()) != null) {
+                    sb.append(line);
+                }
+            }
+            // 解析 JSON
+            String response = sb.toString();
+            ObjectMapper objectMapper = new ObjectMapper();
+            tphzResponse = objectMapper.readValue(response, TaiPingHzResponse.class);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+        return tphzResponse;
+    }
+
+
     public <Response> Response requestCookie(RequestUrl requestUrl, ParameterizedTypeReference<Response> parameterizedTypeReference) {
         String url = requestUrl.getRequestUrl(taiPingCrawlerProperties.getCookieUrl());
         return requestComponent.get(url, Map.of(), requestUrl.getDescription(), new ParameterizedTypeReference<>() {
@@ -67,10 +180,13 @@ public class TaiPingCrawlerRequestComponent {
      *
      * @return 请求头信息
      */
-    public HttpHeaders getHeaders() {
-        String cookie = getCookie();
+    public HttpHeaders getHeaders(String gw_user_token) {
         HttpHeaders headers = new HttpHeaders();
-        headers.set(HttpHeaders.COOKIE, cookie);
+        headers.add("Accept","application/json, text/plain, */*");
+        headers.add("Content-Type","application/json;charset=UTF-8");
+        headers.add("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0");
+        headers.add("gw_user_token",gw_user_token);
+        headers.add("patchWord","UZI");
         return headers;
     }
 
@@ -121,10 +237,10 @@ public class TaiPingCrawlerRequestComponent {
      * @param taiPingCrawlerAuthRequest 鉴权信息
      * @return 鉴权实体
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerAuthData> auth(TaiPingCrawlerAuthRequest taiPingCrawlerAuthRequest) {
-        return requestPostStrDecrypt(RequestUrl.AUTH, taiPingCrawlerAuthRequest, new TypeReference<>() {
-        }, new HttpHeaders());
-    }
+//    public TaiPingCrawlerBaseResponse<TaiPingCrawlerAuthData> auth(TaiPingCrawlerAuthRequest taiPingCrawlerAuthRequest, TaipingCrawlerConfigureParameters parameters) {
+//        return requestPostStrDecrypt(RequestUrl.AUTH, taiPingCrawlerAuthRequest, new TypeReference<>() {
+//        }, new HttpHeaders(),parameters);
+//    }
 
     /**
      * 登录信息
@@ -159,21 +275,47 @@ public class TaiPingCrawlerRequestComponent {
      * 获取销售信息子代码
      *
      * @param request      获取销售信息子代码请求
-     * @param solutionCode 销售信息子代码
      * @param httpHeaders  请求头
      * @return 销售信息子代码列表
      */
-    public TaiPingCrawlerFindSolutionCodeData.RecordsDTO findSolutionCode(TaiPingCrawlerFindSolutionCodeRequest request, String solutionCode, HttpHeaders httpHeaders) {
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerFindSolutionCodeData> response = requestPostStrDecrypt(RequestUrl.FIND_SOLUTION_CODE, request, new TypeReference<>() {
-        }, httpHeaders);
+    public TaiPingCrawlerFindSolutionCodeData.RecordsDTO findSolutionCode(TaiPingCrawlerFindSolutionCodeRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        TaiPingCrawlerBaseResponse<List<TaiPingCrawlerFindSolutionCodeData.RecordsDTO>> response
+                = requestPostStrDecrypt(RequestUrl.FIND_SOLUTION_CODE, request, new TypeReference<>(){}, httpHeaders,parameters);
         return response.getData()
-                .getRecords()
                 .stream()
-                .filter(x -> x.getSolutionCode().equals(solutionCode))
+                .filter(x -> x.getSolutionCode().equals(parameters.getSolutionCode()))
                 .findFirst()
                 .orElseThrow(() -> new SystemException("销售信息子代码不存在"));
     }
 
+    /**
+     * 决策单元代码
+     * @param request      获取决策单元代码请求
+     * @param httpHeaders  请求头
+     * @return 决策单元代码列表
+     */
+    public TaiPingCrawlerFindApplyNoResponse.GsApplyInfoMainDto findApplyNo(TaiPingCrawlerFindApplyNoRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerFindApplyNoResponse> response
+                = requestPostStrDecrypt(RequestUrl.FIND_APPLY_NO, request, new TypeReference<>(){}, httpHeaders,parameters);
+        return response.getData()
+                .getGsApplyInfoMainDtos()
+                .stream().filter(x -> x.getApplyNo().equals(response.getData().getApplyNoDefault()))
+                .findFirst().orElseThrow(() -> new SystemException("决策单元代码不存在"));
+    }
+
+
+    /**
+     * 查询归属信息
+     *
+     * @param request     查询归属信息
+     * @param httpHeaders 请求头
+     * @return 查询归属信息
+     */
+    public TaiPingCrawlerFindByProductCodeResponse findProductCode(RequestUrl requestUrl,TaiPingCrawlerFindByProductCodeRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        return requestPostStrDecrypt(requestUrl, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
+    }
+
     /**
      * 创建订单号
      *
@@ -181,12 +323,25 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 订单号
      */
-    public String orderCreate(TaiPingCrawlerCreateOrderRequest request, HttpHeaders httpHeaders) {
+    public String orderCreate(TaiPingCrawlerCreateOrderRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         TaiPingCrawlerBaseResponse<String> response = requestPostStrDecrypt(RequestUrl.CREATE_ORDER, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
         return response.getData();
     }
 
+    /**
+     * 车型折旧率查询
+     *
+     * @param taiPingCrawlerGetCarDepreRateRequest     车型查询请求
+     * @param httpHeaders 请求头
+     */
+    public Double getCarDepreRate(TaiPingCrawlerGetCarDepreRateRequest taiPingCrawlerGetCarDepreRateRequest, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        TaiPingCrawlerBaseResponse<Double> response = requestPostStrDecrypt(RequestUrl.GET_CAR_DEPRE_RATE, taiPingCrawlerGetCarDepreRateRequest, new TypeReference<>() {
+        }, httpHeaders,parameters);
+        return response.getData();
+    }
+
+
     /**
      * 车型查询
      *
@@ -195,9 +350,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 车型查询响应体
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerBrandNameQueryData> queryBrand(RequestUrl requestUrl, TaiPingCrawlerBrandNameQueryRequest request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerBrandNameQueryData> queryBrand(RequestUrl requestUrl, TaiPingCrawlerBrandNameQueryRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(requestUrl, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
     }
 
     /**
@@ -207,9 +362,30 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 保费计算响应
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculate(TaiPingCrawlerPremiumCalculateRequest request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculate(TaiPingCrawlerPremiumCalculateRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        return requestPostStrDecrypt(RequestUrl.PREMIUM_CALCULATE, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
+    }
+    /**
+     * 带入保费的保费计算
+     *
+     * @param request     保费计算请求
+     * @param httpHeaders 请求头
+     * @return 保费计算响应
+     */
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculate(TaiPingCrawlerPremiumCalculateData request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(RequestUrl.PREMIUM_CALCULATE, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
+    }
+
+    /**
+     * @param request 查询精确车型请求
+     * @param httpHeaders 请求头
+     * @return 查询精确车型
+     */
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerVehicleForPRPQueryResponse> vehicleForPRPQuery(TaiPingCrawlerVehicleForPRPQueryRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        return requestPostStrDecrypt(RequestUrl.VEHICLE_FOR_PRP_QUERY, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
     }
 
     /**
@@ -219,9 +395,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 验证响应
      */
-    public TaiPingCrawlerBaseResponse<String> submitValidate(TaiPingCrawlerPremiumCalculateData request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> submitValidate(TaiPingCrawlerPremiumCalculateData request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(RequestUrl.SUBMIT_VALIDATE, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
     }
 
     /**
@@ -231,9 +407,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 上传影像响应
      */
-    public TaiPingCrawlerBaseResponse<String> imageIntoOneFile(TaiPingCrawlerImageIntoOneFileRequest request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerImageIntoOneFileResponse> imageIntoOneFile(TaiPingCrawlerImageIntoOneFileRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(RequestUrl.IMAGE_INTO_ONE_FILE, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
     }
 
     /**
@@ -243,9 +419,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return ocr 识别影像返回信息
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerOCRResultConfirmData> ocrResultConfirm(TaiPingCrawlerOCRResultConfirmRequest request, HttpHeaders httpHeaders) {
-        return requestPostStrDecrypt(RequestUrl.IMAGE_INTO_ONE_FILE, request, new TypeReference<>() {
-        }, httpHeaders);
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerOCRResultConfirmData> ocrResultConfirm(TaiPingCrawlerOCRResultConfirmRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        return requestPostStrDecrypt(RequestUrl.OCR_RESULT_CONFIRM, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
     }
 
 
@@ -256,9 +432,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 提交核保响应
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> submitToAudit(TaiPingCrawlersSubmitToAuditRequest request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAudit(TaiPingCrawlersSubmitToAuditRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(RequestUrl.SUBMIT_TO_AUDIT, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
     }
 
 
@@ -269,9 +445,9 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 支付二维码
      */
-    public TaiPingCrawlerBaseResponse<TaiPingCrawlerSendSMSData> sendSMS(TaiPingCrawlerSendSMSRequest request, HttpHeaders httpHeaders) {
+    public TaiPingCrawlerBaseResponse<TaiPingCrawlerSendSMSData> sendSMS(TaiPingCrawlerSendSMSRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
         return requestPostStrDecrypt(RequestUrl.SEND_SMS, request, new TypeReference<>() {
-        }, httpHeaders);
+        }, httpHeaders,parameters);
     }
 
     /**
@@ -281,10 +457,16 @@ public class TaiPingCrawlerRequestComponent {
      * @param httpHeaders 请求头
      * @return 订单信息
      */
-    public TaiPingCrawlerQueryListData.RecordsDTO queryList(TaiPingCrawlerQueryListRequest request, HttpHeaders httpHeaders) {
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerQueryListData> response = requestPostStrDecrypt(RequestUrl.QUERY_LIST, request, new TypeReference<>() {
-        }, httpHeaders);
-        return response.getData().getRecords().get(0);
+    public List<TaiPingCrawlerQueryListData.RecordsDTO> queryListNsp(TaiPingCrawlerQueryListRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerQueryListData> response = requestPostStrDecrypt(RequestUrl.QUERY_LIST_NSP, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
+        return response.getData().getRecords();
+    }
+
+    public List<TaiPingCrawlerQueryListData.RecordsDTO> queryListNqt(TaiPingCrawlerQueryListRequest request, HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters) {
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerQueryListData> response = requestPostStrDecrypt(RequestUrl.QUERY_LIST_NQT, request, new TypeReference<>() {
+        }, httpHeaders,parameters);
+        return response.getData().getRecords();
     }
 
     public void policyListQuery(String Str, HttpHeaders httpHeaders) {

+ 39 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/constant/KindCodeEnum.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.taiping.crawler.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum KindCodeEnum {
+    KCE_0301600("0301600", "0802","1", "第三者责任保险"),
+    KCE_0301200("0301200", "0802","1", "车辆损失保险"),
+    KCE_0301701("0301701","0802","1","车上人员责任险(司机)"),
+    KCE_0301702("0301702","0802","1","车上人员责任险(乘客)"),
+    KCE_0301007("0301007","","2","绝对免赔率(车损)"),
+    KCE_0301008("0301008","","2","绝对免赔率(三者)"),
+    KCE_0301009("0301009","","2","绝对免赔率(司机)"),
+    KCE_0301010("0301010","","2","绝对免赔率(乘客)"),
+    KCE_0301604("0301604", "","2","三者假日翻倍险"),
+    KCE_0301210("0301210", "","2","车身划痕损失险(附加险)"),
+    KCE_0301002("0301002","","2","医保外用药责任险(三者)"),
+    KCE_0301011("0301011","","2","医保外用药责任险(司机)"),
+    KCE_0301012("0301012","","2","医保外用药责任险(乘客)"),
+    KCE_0301003("0301003","","2","道路救援特约"),
+    KCE_0301004("0301004","","2","安全检测特约"),
+    KCE_0401600("0401600", "0802","1", "新能源汽车第三者责任保险"),
+    KCE_0401200("0401200", "0802","1", "车辆损失保险"),
+    KCE_0401701("0401701","0802","1","新能源汽车车上人员责任保险(司机)"),
+    KCE_0401702("0401702","0802","1","新能源汽车车上人员责任保险(乘客)"),
+    KCE_0401003("0401003","","2","道路救援特约"),
+    KCE_0401004("0401004","","2","安全检测特约");
+
+
+    private final String kindCode;
+
+    private final String riskCode;
+
+    private final String kindInd;
+
+    private final String desc;
+}

+ 9 - 5
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/constant/enums/RequestUrl.java → tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/constant/RequestUrl.java

@@ -1,4 +1,4 @@
-package com.jzg.quotation.taiping.crawler.constant.enums;
+package com.jzg.quotation.taiping.crawler.constant;
 
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
 import lombok.AllArgsConstructor;
@@ -15,12 +15,15 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     VERIFY_CODE("/system/jwt/verifyCode/", "验证码"),
     AUTH("/system/jwt/auth", "鉴权"),
     LOGIN("/system/jwt/login", "登陆"),
+    FIND_PRODUCECODE("/sales/agreement/findByProductCode","查询归属信息"),
     // 报价
-    FIND_SOLUTION_CODE("/sales/lbtsales/findSolutionCode", "查询销售信息子代码"),
+    FIND_SOLUTION_CODE("/sales/agreement/findSolution", "查询销售信息子代码"),
+    FIND_APPLY_NO("/sales/decision/findApplyNo","查询决策单元信息"),
     CREATE_ORDER("/proposalform/order/create", "创建订单"),
     BRAND_NAME_QUERY("/proposalform/intelligentRetrieval/process2/BrandNameQuery", "车型查询"),
-    QUERY_RENEWAL("/proposalform/intelligentRetrieval/process2/QueryRenewal", "车架号查询"),
-    VEHICLE_FOR_PRP_QUERY("api/proposalform/vehicleForPRPQuery", "精准查车查询"),
+    GET_CAR_DEPRE_RATE("/proposalform/proposalDefaultData/getCarDepreRate", "车辆折旧率查询"),
+    QUERY_RENEWAL("/proposalform/intelligentRetrieval/process2/QueryRenewal", "历史保单查询"),
+    VEHICLE_FOR_PRP_QUERY("/proposalform/vehicleForPRPQuery", "精准查车查询"),
     PREMIUM_CALCULATE("/proposalform/premiumCalculate/premiumCalculateEntrace", "保费计算"),
     //上传影像
     IMAGE_INTO_ONE_FILE("/image/imgServer/imageIntoOneFile", "上传影像"),
@@ -35,7 +38,8 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     GET_CAR_POLICY_FILE("TPEBizWeb/pages/B2C/show/getCarPolicyFile.do", "保单下载"),
     DOWNLOAD_FC("/api/proposalform/elecPolicy/downloadFC/", "非车保单下载"),
     //订单状态查询
-    QUERY_LIST("/proposalform/proposal/queryList/", "订单查询"),
+    QUERY_LIST_NSP("/proposalform/proposal/queryList/NSP", "订单查询-简易"),
+    QUERY_LIST_NQT("/proposalform/proposal/queryList/NQT", "订单查询-立保通")
     ;
 
     private final String uri;

+ 54 - 7
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/TaipingCrawlerConfigureParameters.java

@@ -1,20 +1,35 @@
 package com.jzg.quotation.taiping.crawler.entity;
 
 
+import com.jzg.quotation.commons.standard.ConfigureParameters;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.io.Serial;
-import java.io.Serializable;
 
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
-public class TaipingCrawlerConfigureParameters implements Serializable {
+public class TaipingCrawlerConfigureParameters implements ConfigureParameters {
+    /**
+     * TOKEN
+     */
+    private String xxuhoztF0eZsO;
+
+    /**
+     * tk
+     */
+    private String tk;
+
+    /**
+     * gw_user_token
+     */
+    private String gw_user_token;
+    /**
+     * cookie
+     */
+    private String cookie;
 
-    @Serial
-    private static final long serialVersionUID = 3662904284609407518L;
     /**
      * 系统编码
      */
@@ -22,13 +37,45 @@ public class TaipingCrawlerConfigureParameters implements Serializable {
     /**
      * 业务员
      */
-    private String salesManCode;
+    private String salesmanCode;
     /**
      * 业务归属机构
      */
     private String companyCode;
     /**
-     * 决策单元代码
+     * 销售信息代码
+     */
+    private String agreementNo;
+    /**
+     * 销售信息子代码
      */
     private String solutionCode;
+    /**
+     * 业务项目
+     */
+    private String cooperateSiteCode;
+    /**
+     * 业务员职业证号
+     */
+    private String salesmanRegisterNo;
+    /**
+     * 综拓业务员职业证号
+     */
+    private String interSalesmanRegisterNo;
+    /**
+     * 中介业务员
+     */
+    private String interSalesmanCode;
+
+    private String policySort;
+
+    private String loginSort;
+
+    private String personInd;
+
+    private String productType;
+
+    private String method;
+
+    private String username;
 }

+ 6 - 2
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/po/TaiPingCrawlerOrder.java

@@ -22,9 +22,13 @@ public class TaiPingCrawlerOrder {
     private String id;
 
     /**
-     * 保险公司订单号
+     * 订单号
      */
-    private String orderNo;
+    private String ordersNo;
+    /**
+     * 保司订单号
+     */
+    private String companyOrderNo;
 
 
 

+ 33 - 10
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerBrandNameQueryRequest.java

@@ -2,6 +2,8 @@ package com.jzg.quotation.taiping.crawler.entity.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindByProductCodeResponse;
 import com.jzg.quotation.taiping.crawler.utils.VerifyCodeCreate;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -66,26 +68,47 @@ public class TaiPingCrawlerBrandNameQueryRequest {
     @JsonProperty("licenseTypeCode")
     private String licenseTypeCode;
 
-    public TaiPingCrawlerBrandNameQueryRequest(CarInfoVo carInfoVo, String orderNo, String companyCode, String licenseTypeCode) {
+    @JsonProperty("channelDetailCode")
+    private String channelDetailCode;
+
+    @JsonProperty("lastPolicyNo")
+    private String lastPolicyNo;
+
+    @JsonProperty("salesmanCode")
+    private String salesmanCode;
+
+    @JsonProperty("telKetConfSwitch")
+    private String telKetConfSwitch;
+
+    @JsonProperty("salesmanFlag")
+    private boolean salesmanFlag;
+
+    @JsonProperty("renewalNo")
+    private String renewalNo;
+
+    public TaiPingCrawlerBrandNameQueryRequest(CarInfoVo carInfoVo, String orderNo, TaiPingCrawlerFindByProductCodeResponse.Record record, TaipingCrawlerConfigureParameters parameters ) {
         this.productType = "1";
-        if(StringUtils.hasText(carInfoVo.getLicenseNo())){
+        if(!StringUtils.hasText(carInfoVo.getLicenseNo())){
             this.firstYear = true;
             this.newCarFlag = true;
         }else {
             this.firstYear = false;
             this.newCarFlag = false;
-            this.brandName = carInfoVo.getBrandName();
             this.licenseNo = carInfoVo.getLicenseNo();
         }
-        this.companyCode = companyCode;
-        this.frameNo = carInfoVo.getVinNo();
+        this.brandName = carInfoVo.getBrandName();
+        this.companyCode = parameters.getCompanyCode();
+        this.frameNo = "";
         this.orderNo = orderNo;
-        this.irBatchNo = VerifyCodeCreate.getVerifyCode();
-        this.queryType = "1";
-        this.vehicleQueryType = "1";
+        this.irBatchNo = VerifyCodeCreate.getBatchNo();
+        this.queryType = "2";
+        this.vehicleQueryType = "2";
         this.subType = "";
-        this.intermediaryCode = "02";
-        this.licenseTypeCode = licenseTypeCode;
+        this.intermediaryCode = record.getIntermediaryCode();
+        this.licenseTypeCode = carInfoVo.getLicenseKindCode();
+        this.channelDetailCode = "0202";
+        this.renewalNo = "";
+        this.telKetConfSwitch = "0";
     }
 
 }

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

@@ -1,6 +1,8 @@
 package com.jzg.quotation.taiping.crawler.entity.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindByProductCodeResponse;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -52,4 +54,22 @@ public class TaiPingCrawlerCreateOrderRequest {
 
     @JsonProperty("productType")
     private String productType;
+
+    public TaiPingCrawlerCreateOrderRequest(TaipingCrawlerConfigureParameters parameters,TaiPingCrawlerFindByProductCodeResponse.Record record){
+        this.businessMode = "2";
+        this.companyCode = parameters.getCompanyCode();
+        this.agreementNo = parameters.getAgreementNo();
+        this.solutionCode = parameters.getSolutionCode();
+        this.salesmanCode = parameters.getSalesmanCode();
+        this.cooperateSiteCode = parameters.getCooperateSiteCode();
+        this.intermediaryCode = record.getIntermediaryCode();
+        this.salesmanRegisterNo = parameters.getSalesmanRegisterNo();
+        this.interSalesmanRegisterNo = parameters.getInterSalesmanRegisterNo();
+        this.interSalesmanCode = parameters.getInterSalesmanCode();
+        this.priInd = "3";
+        this.policySort = "NSP";
+        this.loginSort = "NPC";
+        this.personInd = "C";
+        this.productType = "1";
+    }
 }

+ 79 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindApplyNoRequest.java

@@ -0,0 +1,79 @@
+package com.jzg.quotation.taiping.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindByProductCodeResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/25 18:04
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerFindApplyNoRequest {
+    @JsonProperty("applyNo")
+    private String applyNo;
+
+    @JsonProperty("applyName")
+    private String applyName;
+
+    @JsonProperty("businessMode")
+    private String businessMode;
+
+    @JsonProperty("agreementNo")
+    private String agreementNo;
+
+    @JsonProperty("solutionCode")
+    private String solutionCode;
+
+    @JsonProperty("channelDetailCode")
+    private String channelDetailCode;
+
+    @JsonProperty("cooperateSiteCode")
+    private String cooperateSiteCode;
+
+    @JsonProperty("companyCode")
+    private String companyCode;
+
+    @JsonProperty("dsMakingTypeDetail")
+    private String dsMakingTypeDetail;
+
+    @JsonProperty("decisionMakingUnit")
+    private String decisionMakingUnit;
+
+    @JsonProperty("compLevel")
+    private String compLevel;
+
+    @JsonProperty("language")
+    private String language;
+
+    @JsonProperty("zlbWindowNo")
+    private String zlbWindowNo;
+
+    @JsonProperty("modelNo")
+    private String modelNo;
+
+    @JsonProperty("telKetConfSwitch")
+    private String telKetConfSwitch;
+
+    public TaiPingCrawlerFindApplyNoRequest(TaipingCrawlerConfigureParameters parameters, TaiPingCrawlerFindByProductCodeResponse.Record record) {
+        this.businessMode = "2";
+        this.agreementNo = parameters.getAgreementNo();
+        this.solutionCode = parameters.getSolutionCode();
+        this.channelDetailCode = record.getChannelSort();
+        this.cooperateSiteCode = parameters.getCooperateSiteCode();
+        this.companyCode = parameters.getCompanyCode();
+        this.dsMakingTypeDetail = "";
+        this.decisionMakingUnit = "";
+        this.compLevel = "0";
+        this.language = "C";
+        this.zlbWindowNo = "";
+        this.modelNo = "";
+        this.telKetConfSwitch = "0";
+        this.applyName= "";
+        this.applyNo = "";
+    }
+}

+ 34 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindByProductCodeRequest.java

@@ -0,0 +1,34 @@
+package com.jzg.quotation.taiping.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/22 11:31
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerFindByProductCodeRequest {
+    @JsonProperty("pageNo")
+    private String pageNo;
+
+    @JsonProperty("pageSize")
+    private String pageSize;
+
+    @JsonProperty("userCode")
+    private String userCode;
+
+    @JsonProperty("query")
+    private String query;
+
+    public TaiPingCrawlerFindByProductCodeRequest(TaipingCrawlerConfigureParameters parameters){
+        this.pageNo = "1";
+        this.pageSize = "10";
+        this.userCode = parameters.getSalesmanCode();
+        this.query = parameters.getAgreementNo();
+    }
+}

+ 9 - 28
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerFindSolutionCodeRequest.java

@@ -1,46 +1,27 @@
 package com.jzg.quotation.taiping.crawler.entity.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
 @NoArgsConstructor
 @Data
 public class TaiPingCrawlerFindSolutionCodeRequest {
+    @JsonProperty("agreementNo")
+    private String agreementNo;
 
-
-    @JsonProperty("businessType")
-    private String businessType;
-
-    @JsonProperty("companyCode")
-    private String companyCode;
-
-    @JsonProperty("riskCode")
-    private String riskCode;
-
-    @JsonProperty("salesManCode")
-    private String salesManCode;
+    @JsonProperty("productCode")
+    private String productCode;
 
     @JsonProperty("userCode")
     private String userCode;
 
-    @JsonProperty("pageNo")
-    private Integer pageNo;
-
-    @JsonProperty("pageSize")
-    private Integer pageSize;
 
-    @JsonProperty("personInd")
-    private String personInd;
+    public TaiPingCrawlerFindSolutionCodeRequest(TaipingCrawlerConfigureParameters parameters) {
+        this.agreementNo = parameters.getAgreementNo();
+        this.userCode = parameters.getSalesmanCode();
+        this.productCode = "0801";
 
-    public TaiPingCrawlerFindSolutionCodeRequest(String companyCode, String salesManCode, String userCode) {
-        this.businessType = "2";
-        this.companyCode = companyCode;
-        this.riskCode = "1359";
-        this.salesManCode = salesManCode;
-        this.userCode = userCode;
-        this.pageNo = 1;
-        this.pageSize = 20;
-        this.personInd = "C";
     }
 }

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

@@ -0,0 +1,65 @@
+package com.jzg.quotation.taiping.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerBrandNameQueryData;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/22 16:41
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerGetCarDepreRateRequest {
+    @JsonProperty("riskCode")
+    private String riskCode;
+
+    @JsonProperty("carKindCode")
+    private String carKindCode;
+
+    @JsonProperty("useNatureShow")
+    private String useNatureShow;
+
+    @JsonProperty("seatCount")
+    private Integer seatCount;
+
+    @JsonProperty("tonCount")
+    private Integer tonCount;
+
+    @JsonProperty("carUseType")
+    private String carUseType;
+
+    @JsonProperty("brandName")
+    private String brandName;
+
+    @JsonProperty("fgSwitch")
+    private String fgSwitch;
+
+    @JsonProperty("newEnergyClauseFlag")
+    private String newEnergyClauseFlag;
+
+    @JsonProperty("energyType")
+    private String energyType;
+
+    @JsonProperty("purchasePrice")
+    private Integer purchasePrice;
+
+    public TaiPingCrawlerGetCarDepreRateRequest(TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO itemMotorDtoListDTO, CarInfoVo carInfoVo) {
+        this.riskCode = "0802";
+        this.carKindCode = itemMotorDtoListDTO.getCarKindCode();
+        this.useNatureShow = carInfoVo.getCarNatureCode();
+        this.brandName = itemMotorDtoListDTO.getBrandName();
+        this.seatCount = Integer.parseInt(itemMotorDtoListDTO.getSeatCount());
+        this.tonCount = itemMotorDtoListDTO.getTonCount();
+        this.carUseType = carInfoVo.getVehicleUseCode();
+        this.purchasePrice = Integer.valueOf(itemMotorDtoListDTO.getPurchasePrice());
+        this.fgSwitch = "1";
+        this.newEnergyClauseFlag = carInfoVo.getEnergyTypeCode();
+        this.energyType = carInfoVo.getEnergyTypeCode();
+    }
+
+
+}

+ 10 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerImageIntoOneFileRequest.java

@@ -32,4 +32,14 @@ public class TaiPingCrawlerImageIntoOneFileRequest {
     @JsonProperty("imageBase64")
     private String imageBase64;
 
+    public TaiPingCrawlerImageIntoOneFileRequest(String certiType, String orderNo, String fileEcmType, String fileType, List<String> fileAllType, String imageSuffix, String imageBase64) {
+        this.certiType = certiType;
+        this.orderNo = orderNo;
+        this.fileEcmType = fileEcmType;
+        this.fileType = fileType;
+        this.fileAllType = fileAllType;
+        this.imageSuffix = imageSuffix;
+        this.imageBase64 = imageBase64;
+    }
+
 }

+ 12 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerOCRResultConfirmRequest.java

@@ -20,5 +20,17 @@ public class TaiPingCrawlerOCRResultConfirmRequest {
     @JsonProperty("userMarkState")
     private String userMarkState;
 
+    @JsonProperty("ocrConfirmType")
+    private String ocrConfirmType;
+
+    @JsonProperty("certiType")
+    private String certiType;
+
+    public TaiPingCrawlerOCRResultConfirmRequest(String infoMainId) {
+        this.infoMainId = infoMainId;
+        this.userMarkState = "1";
+        this.ocrConfirmType = "0";
+        this.certiType = "01";
+    }
 }
 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 743 - 498
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerPremiumCalculateRequest.java


+ 8 - 2
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerQueryListRequest.java

@@ -23,11 +23,11 @@ public class TaiPingCrawlerQueryListRequest {
     @JsonProperty("policySort")
     private String policySort;
 
-    public TaiPingCrawlerQueryListRequest(String orderNo, String policySort) {
+    public TaiPingCrawlerQueryListRequest(String orderNo) {
         this.data = new DataDTO(orderNo);
         this.pageNo = 1;
         this.pageSize = 10;
-        this.policySort = policySort;
+        this.policySort = "NSP";
     }
 
     @NoArgsConstructor
@@ -99,6 +99,10 @@ public class TaiPingCrawlerQueryListRequest {
         @JsonProperty("personInd")
         private String personInd;
 
+        @JsonProperty("sortType")
+        private String sortType;
+        @JsonProperty("sortCode")
+        private String sortCode;
         public DataDTO(String orderNo) {
             this.riskCodeAll = true;
             this.riskCode0801 = true;
@@ -131,6 +135,8 @@ public class TaiPingCrawlerQueryListRequest {
             this.inputDateForQueryEnd = "";
             this.riskCodes = List.of("0801", "0802", "0803", "0804", "0805", "0833");
             this.personInd = "C";
+            this.sortType = "DESC";
+            this.sortCode = "inputDate";
         }
     }
 }

+ 116 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerSubmitValidateRequest.java

@@ -0,0 +1,116 @@
+package com.jzg.quotation.taiping.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.jzg.quotation.taiping.crawler.entity.po.TaiPingCrawlerOrder;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerPremiumCalculateData;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/5/28 17:54
+ */
+
+@Data
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.ALWAYS)
+public class TaiPingCrawlerSubmitValidateRequest{
+    private String riskCodeType;
+
+    private List<?> pfItemMotorDeviceDtoList;
+
+    private List<TaiPingCrawlerPremiumCalculateData.PfItemKindDto0801DTO> pfItemKind0801DtoList;
+
+    private List<TaiPingCrawlerPremiumCalculateData.PfItemKindDto0802ListDTO> pfItemKind0802DtoList;
+
+    private List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO> clauseList0801;
+
+    private List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO> clauseList0802;
+
+    private String orderNo;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfMainDtoDTO pfMainDto;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfVehicleOwnerDTO pfVehicleOwner;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfRelatedPartyDtoDTO pfRelatedPartyDto;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfItemMotorDtoDTO pfItemMotorDto;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfRiskRelatedPartyDtoDTO pfRiskRelatedPartyDto;
+
+    private TaiPingCrawlerPremiumCalculateData.PfCarShipTaxDTO pfProposalCarShipTaxDto;
+
+    private TaiPingCrawlerPremiumCalculateRequest.PfPolicyInfoDtoDTO pfPolicyInfoDto;
+
+    private boolean incrementServiceMatchFlag;
+
+    private String demandNoForce;
+
+    private String demandNoBusi;
+
+    private List<?> fcProductList;
+
+    private String cjcSaleInfoDto;
+
+    private String fCsaleinfoDto;
+
+    private String businessType;
+
+    private String optType;
+
+    private String personInd;
+
+    private String productType;
+
+    private boolean isMatchClause;
+
+    public TaiPingCrawlerSubmitValidateRequest(TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData, TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest, TaiPingCrawlerOrder taiPingCrawlerOrder) {
+        this.riskCodeType = taiPingCrawlerPremiumCalculateRequest.getRiskCodeType();
+        this.pfItemMotorDeviceDtoList = taiPingCrawlerPremiumCalculateRequest.getPfItemMotorDeviceDtoList();
+        this.pfItemKind0801DtoList = Collections.singletonList(taiPingCrawlerPremiumCalculateData.getPfItemKindDto0801());
+        this.pfItemKind0802DtoList = taiPingCrawlerPremiumCalculateData.getPfItemKindDto0802List();
+        this.clauseList0801 = taiPingCrawlerPremiumCalculateRequest.getClauseList0801();
+        this.clauseList0802 = taiPingCrawlerPremiumCalculateRequest.getClauseList0802();
+        this.orderNo = taiPingCrawlerOrder.getCompanyOrderNo();
+        this.pfMainDto = taiPingCrawlerPremiumCalculateRequest.getPfMainDto();
+        this.pfVehicleOwner = taiPingCrawlerPremiumCalculateRequest.getPfVehicleOwner();
+        this.pfRelatedPartyDto = taiPingCrawlerPremiumCalculateRequest.getPfRelatedPartyDto();
+        this.pfItemMotorDto = taiPingCrawlerPremiumCalculateRequest.getPfItemMotorDto();
+        this.pfRiskRelatedPartyDto = taiPingCrawlerPremiumCalculateRequest.getPfRiskRelatedPartyDto();
+        this.pfProposalCarShipTaxDto = taiPingCrawlerPremiumCalculateData.getPfCarShipTax();
+        this.pfPolicyInfoDto = taiPingCrawlerPremiumCalculateRequest.getPfPolicyInfoDto();
+        if (taiPingCrawlerPremiumCalculateData.getProposalNo0801() != null) {
+            pfPolicyInfoDto.setProposalNo0801(taiPingCrawlerPremiumCalculateData.getProposalNo0801());
+        }
+        if (taiPingCrawlerPremiumCalculateData.getProposalNo0802() != null) {
+            pfPolicyInfoDto.setProposalNo0802(taiPingCrawlerPremiumCalculateData.getProposalNo0802());
+        }
+        this.incrementServiceMatchFlag = false;
+        if (taiPingCrawlerPremiumCalculateData.getDemandNoForce() != null) {
+            this.demandNoForce = taiPingCrawlerPremiumCalculateData.getDemandNoForce();
+            pfPolicyInfoDto.setDemandNoForce(taiPingCrawlerPremiumCalculateData.getDemandNoForce());
+        } else {
+            this.demandNoForce = "";
+            pfPolicyInfoDto.setDemandNoForce("");
+        }
+        if (taiPingCrawlerPremiumCalculateData.getDemandNoBusi() != null) {
+            this.demandNoBusi = taiPingCrawlerPremiumCalculateData.getDemandNoBusi();
+            pfPolicyInfoDto.setDemandNoBusi(taiPingCrawlerPremiumCalculateData.getDemandNoBusi());
+        } else {
+            this.demandNoBusi = "";
+            pfPolicyInfoDto.setDemandNoBusi("");
+        }
+        this.fcProductList = taiPingCrawlerPremiumCalculateData.getFcProductList();
+        this.cjcSaleInfoDto = null;
+        this.fCsaleinfoDto = null;
+        this.businessType = taiPingCrawlerPremiumCalculateRequest.getBusinessType();
+        this.optType = taiPingCrawlerPremiumCalculateRequest.getOptType();
+        this.personInd = taiPingCrawlerPremiumCalculateRequest.getPersonInd();
+        this.productType = taiPingCrawlerPremiumCalculateRequest.getProductType();
+        this.isMatchClause = true;
+    }
+}

+ 2209 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlerVehicleForPRPQueryRequest.java

@@ -0,0 +1,2209 @@
+package com.jzg.quotation.taiping.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.quotation.taiping.crawler.constant.KindCodeEnum;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerBrandNameQueryData;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindApplyNoResponse;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindByProductCodeResponse;
+import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerFindSolutionCodeData;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author quchen
+ * @date 2026/5/27 19:41
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerVehicleForPRPQueryRequest {
+    @JsonProperty("riskCodeType")
+    private String riskCodeType;
+
+    @JsonProperty("pfItemMotorDeviceDtoList")
+    private List<Object> pfItemMotorDeviceDtoList;
+
+    @JsonProperty("pfItemKind0801DtoList")
+    private List<PfItemKind0801DtoListDTO> pfItemKind0801DtoList;
+
+    @JsonProperty("pfItemKind0802DtoList")
+    private List<PfItemKind0802DtoListDTO> pfItemKind0802DtoList;
+
+    @JsonProperty("clauseList0801")
+    private List<ClauseList0801DTO> clauseList0801;
+
+    @JsonProperty("clauseList0802")
+    private List<ClauseList0802DTO> clauseList0802;
+
+    @JsonProperty("orderNo")
+    private String orderNo;
+
+    @JsonProperty("pfMainDto")
+    private PfMainDtoDTO pfMainDto;
+
+    @JsonProperty("pfVehicleOwner")
+    private PfVehicleOwnerDTO pfVehicleOwner;
+
+    @JsonProperty("pfRelatedPartyDto")
+    private PfRelatedPartyDtoDTO pfRelatedPartyDto;
+
+    @JsonProperty("pfItemMotorDto")
+    private PfItemMotorDtoDTO pfItemMotorDto;
+
+    @JsonProperty("pfRiskRelatedPartyDto")
+    private PfRiskRelatedPartyDtoDTO pfRiskRelatedPartyDto;
+
+    @JsonProperty("pfProposalCarShipTaxDto")
+    private PfProposalCarShipTaxDtoDTO pfProposalCarShipTaxDto;
+
+    @JsonProperty("pfPolicyInfoDto")
+    private PfPolicyInfoDtoDTO pfPolicyInfoDto;
+
+    @JsonProperty("incrementServiceMatchFlag")
+    private Boolean incrementServiceMatchFlag;
+
+    @JsonProperty("demandNoForce")
+    private String demandNoForce;
+
+    @JsonProperty("demandNoBusi")
+    private String demandNoBusi;
+
+    @JsonProperty("fcProductList")
+    private List<Object> fcProductList;
+
+    @JsonProperty("cjcSaleInfoDto")
+    private Object cjcSaleInfoDto;
+
+    @JsonProperty("fCsaleinfoDto")
+    private Object fCsaleinfoDto;
+
+    @JsonProperty("businessType")
+    private String businessType;
+
+    @JsonProperty("optType")
+    private String optType;
+
+    @JsonProperty("personInd")
+    private String personInd;
+
+    @JsonProperty("productType")
+    private String productType;
+
+    public TaiPingCrawlerVehicleForPRPQueryRequest(QuoteVo quoteVo, TaipingCrawlerConfigureParameters parameters, String orderNo,
+                                                 TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO motor, String carActualValue,
+                                                 TaiPingCrawlerFindByProductCodeResponse.Record record, TaiPingCrawlerFindSolutionCodeData.RecordsDTO taiPingCrawlerFindSolutionCodeData,
+                                                 TaiPingCrawlerFindApplyNoResponse.GsApplyInfoMainDto gsApplyInfoMainDto) {
+        boolean hasCi = quoteVo.getCiRiskInfoVo() != null;
+        boolean hasBi = quoteVo.getBiRiskInfoVo() != null;
+        if (hasCi && hasBi) {
+            this.riskCodeType = "3";
+        } else if (hasCi) {
+            this.riskCodeType = "1";
+        } else if (hasBi) {
+            this.riskCodeType = "2";
+        }
+        this.pfItemMotorDeviceDtoList = Collections.emptyList();
+        Optional.ofNullable(quoteVo.getCiRiskInfoVo()).ifPresent(ciRiskInfoVo -> {
+            this.pfItemKind0801DtoList = List.of(PfItemKind0801DtoListDTO.getCiKindInfo());
+        });
+        this.pfItemKind0802DtoList = PfItemKind0802DtoListDTO.buildKindList(quoteVo.getKindInfoVo(),carActualValue,Integer.parseInt(quoteVo.getCarInfoVo().getSeatCount()));
+        this.clauseList0801 = new ArrayList<>();
+        this.clauseList0802 = new ArrayList<>();
+        this.orderNo = orderNo;
+        // 归属信息
+        this.pfMainDto = new PfMainDtoDTO(record,parameters,taiPingCrawlerFindSolutionCodeData,gsApplyInfoMainDto,quoteVo);
+        // 车主
+        this.pfVehicleOwner = new PfVehicleOwnerDTO(quoteVo.getOwnersInfo(),quoteVo.getCarInfoVo());
+        // 投保人
+        this.pfRelatedPartyDto = new PfRelatedPartyDtoDTO(quoteVo.getPolicyHolderInfo());
+        // 车辆信息
+        this.pfItemMotorDto = new PfItemMotorDtoDTO(quoteVo.getCarInfoVo(), motor, orderNo, carActualValue);
+        // 被保险人
+        this.pfRiskRelatedPartyDto = new PfRiskRelatedPartyDtoDTO(quoteVo.getInsuredPersonInfo());
+        this.pfProposalCarShipTaxDto = new PfProposalCarShipTaxDtoDTO(quoteVo.getVehicleAndVesselTaxVo(),quoteVo.getCarInfoVo());
+        this.pfPolicyInfoDto = new PfPolicyInfoDtoDTO(quoteVo);
+        this.incrementServiceMatchFlag = Boolean.TRUE;
+        this.demandNoForce = "";
+        this.demandNoBusi = "";
+        // 驾意险
+        this.fcProductList = new ArrayList<>();
+        this.cjcSaleInfoDto = null;
+        this.fCsaleinfoDto = null;
+        this.businessType = "Proposal";
+        this.optType = "N";
+        this.personInd = "C";
+        this.productType = "1";
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfMainDtoDTO {
+        @JsonProperty("renewalNo")
+        private String renewalNo;
+        @JsonProperty("carIdRenewalFlag")
+        private String carIdRenewalFlag;
+        @JsonProperty("policySort")
+        private String policySort;
+        @JsonProperty("agreementNo")
+        private String agreementNo;
+        @JsonProperty("departmentCode")
+        private String departmentCode;
+        @JsonProperty("departmentName")
+        private String departmentName;
+        @JsonProperty("outerSubCompanyCode")
+        private String outerSubCompanyCode;
+        @JsonProperty("outerSubCompanyName")
+        private String outerSubCompanyName;
+        @JsonProperty("teamManager")
+        private String teamManager;
+        @JsonProperty("teamManagerName")
+        private String teamManagerName;
+        @JsonProperty("salesmanCode")
+        private String salesmanCode;
+        @JsonProperty("salesmanName")
+        private String salesmanName;
+        @JsonProperty("companyCode")
+        private String companyCode;
+        @JsonProperty("companyName")
+        private String companyName;
+        @JsonProperty("businessMode")
+        private String businessMode;
+        @JsonProperty("channelTip")
+        private String channelTip;
+        @JsonProperty("channelTipName")
+        private String channelTipName;
+        @JsonProperty("channelDetailCode")
+        private String channelDetailCode;
+        @JsonProperty("channelDetailName")
+        private String channelDetailName;
+        @JsonProperty("cooperateSiteCode")
+        private String cooperateSiteCode;
+        @JsonProperty("cooperateSiteName")
+        private String cooperateSiteName;
+        @JsonProperty("priInd")
+        private String priInd;
+        @JsonProperty("solutionCode")
+        private String solutionCode;
+        @JsonProperty("intermediaryCode")
+        private String intermediaryCode;
+        @JsonProperty("intermediaryCName")
+        private String intermediaryCName;
+        @JsonProperty("salesmanRegisterNo")
+        private String salesmanRegisterNo;
+        @JsonProperty("outerCompanyCode")
+        private String outerCompanyCode;
+        @JsonProperty("outerCompanyName")
+        private String outerCompanyName;
+        @JsonProperty("outerUserCode")
+        private String outerUserCode;
+        @JsonProperty("outerUserCName")
+        private String outerUserCName;
+        @JsonProperty("pioneerCode")
+        private String pioneerCode;
+        @JsonProperty("pioneerName")
+        private String pioneerName;
+        @JsonProperty("interSalesmanCode")
+        private String interSalesmanCode;
+        @JsonProperty("interSalesmanName")
+        private String interSalesmanName;
+        @JsonProperty("interSalesmanRegisterNo")
+        private String interSalesmanRegisterNo;
+        @JsonProperty("governmentType")
+        private String governmentType;
+        @JsonProperty("itemAddress")
+        private String itemAddress;
+        @JsonProperty("agreementTypeName")
+        private String agreementTypeName;
+        @JsonProperty("lables")
+        private String lables;
+        @JsonProperty("agreementCode")
+        private String agreementCode;
+        @JsonProperty("source")
+        private String source;
+        @JsonProperty("producerName")
+        private String producerName;
+        @JsonProperty("intermediaryCNName")
+        private String intermediaryCNName;
+        @JsonProperty("frontingCompany")
+        private String frontingCompany;
+        @JsonProperty("frontingCompanyName")
+        private String frontingCompanyName;
+        @JsonProperty("hengSangInd")
+        private String hengSangInd;
+        @JsonProperty("channelSortName")
+        private String channelSortName;
+        @JsonProperty("sourceId")
+        private String sourceId;
+        @JsonProperty("channelSort")
+        private String channelSort;
+        @JsonProperty("disabled")
+        private boolean disabled;
+        @JsonProperty("governmentServiceType")
+        private String governmentServiceType;
+        @JsonProperty("businessSource")
+        private String businessSource;
+        @JsonProperty("governmentProvince")
+        private String governmentProvince;
+        @JsonProperty("governmentCity")
+        private String governmentCity;
+        @JsonProperty("governmentCounty")
+        private String governmentCounty;
+        @JsonProperty("governmentProvinceName")
+        private String governmentProvinceName;
+        @JsonProperty("governmentCityName")
+        private String governmentCityName;
+        @JsonProperty("governmentCountyName")
+        private String governmentCountyName;
+        @JsonProperty("creditPeriod")
+        private String creditPeriod;
+        @JsonProperty("teamName")
+        private String teamName;
+        @JsonProperty("registerNo")
+        private String registerNo;
+        @JsonProperty("taxRegistryNumber")
+        private String taxRegistryNumber;
+        @JsonProperty("value")
+        private String value;
+        @JsonProperty("label")
+        private String label;
+        @JsonProperty("modelNo")
+        private String modelNo;
+        @JsonProperty("query")
+        private String query;
+        @JsonProperty("applySerialNo")
+        private Integer applySerialNo;
+        @JsonProperty("bankBranchName")
+        private String bankBranchName;
+        @JsonProperty("applyNo")
+        private String applyNo;
+        @JsonProperty("queryApplyNo")
+        private String queryApplyNo;
+        @JsonProperty("zlbWindowNo")
+        private String zlbWindowNo;
+        @JsonProperty("optBtn")
+        private String optBtn;
+        @JsonProperty("applyName")
+        private String applyName;
+        @JsonProperty("decisionMakingUnit")
+        private String decisionMakingUnit;
+        @JsonProperty("dsMakingTypeDetail")
+        private String dsMakingTypeDetail;
+        @JsonProperty("compLevel")
+        private String compLevel;
+        @JsonProperty("serialNo")
+        private String serialNo;
+        @JsonProperty("outOrderNo")
+        private String outOrderNo;
+        @JsonProperty("bankCustomerManagerCode")
+        private String bankCustomerManagerCode;
+        @JsonProperty("newCarFlag")
+        private String newCarFlag;
+        @JsonProperty("doubleProtectFlag")
+        private String doubleProtectFlag;
+        @JsonProperty("oano")
+        private String oano;
+        @JsonProperty("poaSerialNo")
+        private String poaSerialNo;
+        @JsonProperty("isDangerBz")
+        private Object isDangerBz;
+        @JsonProperty("tpFeeFlag")
+        private String tpFeeFlag;
+        @JsonProperty("feeServiceLinkage")
+        private String feeServiceLinkage;
+        @JsonProperty("argueSolution")
+        private String argueSolution;
+        @JsonProperty("arbitoryName")
+        private Object arbitoryName;
+        @JsonProperty("quotationPlanFlag")
+        private String quotationPlanFlag;
+        @JsonProperty("isSpecialCarFlag")
+        private String isSpecialCarFlag;
+        @JsonProperty("carIdSplitFlag")
+        private String carIdSplitFlag;
+        @JsonProperty("appId")
+        private String appId;
+        @JsonProperty("touchId")
+        private String touchId;
+        @JsonProperty("premiumTrialFlag")
+        private String premiumTrialFlag;
+        @JsonProperty("bankBranchCode")
+        private String bankBranchCode;
+        @JsonProperty("differentProtectFlag")
+        private String differentProtectFlag;
+        @JsonProperty("telKetConfSwitch")
+        private String telKetConfSwitch;
+
+        public PfMainDtoDTO(TaiPingCrawlerFindByProductCodeResponse.Record record, TaipingCrawlerConfigureParameters parameters,
+                            TaiPingCrawlerFindSolutionCodeData.RecordsDTO taiPingCrawlerFindSolutionCodeData,
+                            TaiPingCrawlerFindApplyNoResponse.GsApplyInfoMainDto gsApplyInfoMainDto, QuoteVo quoteVo) {
+            this.renewalNo = "";
+            this.carIdRenewalFlag = "";
+            this.intermediaryCode = record.getIntermediaryCode();
+            this.businessSource = record.getBusinessSource();
+            this.channelTip = record.getChannelTip();
+            this.solutionCode = parameters.getSolutionCode();
+            this.channelDetailCode = record.getChannelSort();
+            this.teamManager = parameters.getSalesmanCode();
+            this.teamManagerName = "";
+            this.businessMode = "2";
+            this.agreementNo = parameters.getAgreementNo();
+            this.companyCode = parameters.getCompanyCode();
+            this.companyName = record.getCompanyName();
+            this.salesmanCode = parameters.getSalesmanCode();
+            this.salesmanName = taiPingCrawlerFindSolutionCodeData.getSalesmanName();
+            this.outerUserCode = "";
+            this.outerUserCName = "";
+            this.interSalesmanCode = parameters.getInterSalesmanCode();
+            this.interSalesmanName = parameters.getInterSalesmanRegisterNo();
+            this.salesmanRegisterNo = parameters.getSalesmanRegisterNo();
+            this.interSalesmanRegisterNo = parameters.getInterSalesmanRegisterNo();
+            this.cooperateSiteCode = taiPingCrawlerFindSolutionCodeData.getCooperateSiteCode();
+            this.cooperateSiteName = taiPingCrawlerFindSolutionCodeData.getCooperateSiteName();
+            this.priInd = "3";
+            this.outerCompanyCode = null;
+            this.outerCompanyName = null;
+            this.pioneerCode = "";
+            this.pioneerName = "";
+            this.outerSubCompanyCode = "";
+            this.outerSubCompanyName = "";
+            this.departmentCode = "";
+            this.departmentName = "";
+            this.governmentType = "";
+            this.itemAddress = "";
+            this.governmentServiceType = "";
+            this.agreementTypeName = record.getAgreementTypeName();
+            this.lables = record.getLables();
+            this.agreementCode = record.getAgreementCode();
+            this.source = record.getSource();
+            this.producerName = record.getProducerName();
+            this.intermediaryCNName = record.getIntermediaryCNName();
+            this.frontingCompany = null;
+            this.frontingCompanyName = null;
+            this.hengSangInd = record.getHengSangInd();
+            this.channelSortName = record.getChannelSortName();
+            this.channelTipName = record.getChannelTipName();
+            this.sourceId = record.getSourceId();
+            this.channelSort = record.getChannelSort();
+            this.disabled = false;
+            this.governmentProvince = "";
+            this.governmentCity = "";
+            this.governmentCounty = "";
+            this.governmentProvinceName = "";
+            this.governmentCityName = "";
+            this.governmentCountyName = "";
+            this.creditPeriod = taiPingCrawlerFindSolutionCodeData.getCreditPeriod();
+            this.teamName = taiPingCrawlerFindSolutionCodeData.getTeamName();
+            this.registerNo = taiPingCrawlerFindSolutionCodeData.getRegisterNo();
+            this.taxRegistryNumber = taiPingCrawlerFindSolutionCodeData.getTaxRegistryNumber();
+            this.value = taiPingCrawlerFindSolutionCodeData.getSolutionCode();
+            this.label = taiPingCrawlerFindSolutionCodeData.getSolutionCode() +"-" +taiPingCrawlerFindSolutionCodeData.getSalesmanName() + "-" + taiPingCrawlerFindSolutionCodeData.getCooperateSiteName();
+            this.modelNo = gsApplyInfoMainDto.getModelNo();
+            this.query = "";
+            this.applySerialNo = gsApplyInfoMainDto.getSerialNo();
+            this.bankBranchName = "";
+            this.applyNo = gsApplyInfoMainDto.getApplyNo();
+            this.queryApplyNo = "";
+            this.zlbWindowNo =  "";
+            this.optBtn = "";
+            this.applyName = "";
+            this.decisionMakingUnit = "";
+            this.dsMakingTypeDetail = "";
+            this.compLevel = "0";
+            this.serialNo = "";
+            this.outOrderNo = "";
+            this.bankCustomerManagerCode = "";
+            this.bankBranchCode = "";
+            this.newCarFlag = "1";
+            if (quoteVo.getCiRiskInfoVo()!= null && quoteVo.getBiRiskInfoVo() != null) {
+                this.differentProtectFlag = "1";
+                this.doubleProtectFlag = "1";
+            } else {
+                this.doubleProtectFlag = "0";
+                this.differentProtectFlag = "0";
+            }
+            this.oano = "";
+            this.poaSerialNo = "";
+            this.isDangerBz = null;
+            this.tpFeeFlag = "0";
+            this.feeServiceLinkage = "0";
+            this.policySort = "NSP";
+            this.argueSolution = "1";
+            this.arbitoryName = null;
+            this.quotationPlanFlag = "0";
+            this.isSpecialCarFlag = "0";
+            this.carIdSplitFlag = "";
+            this.appId = "";
+            this.touchId = "";
+            this.telKetConfSwitch = "0";
+            this.premiumTrialFlag = "0";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfVehicleOwnerDTO {
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("ownerNature")
+        private String ownerNature;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("profession")
+        private String profession;
+        @JsonProperty("mobilePhone")
+        private String mobilePhone;
+        @JsonProperty("isApplicantOperator")
+        private String isApplicantOperator;
+        @JsonProperty("lifeInd")
+        private String lifeInd;
+        @JsonProperty("customerGradeLabel")
+        private String customerGradeLabel;
+        @JsonProperty("carDriveAddress")
+        private String carDriveAddress;
+        @JsonProperty("customerGroup")
+        private String customerGroup;
+        @JsonProperty("licenseNo")
+        private String licenseNo;
+        @JsonProperty("driveUseAttribute")
+        private String driveUseAttribute;
+        @JsonProperty("printBrandName")
+        private String printBrandName;
+        @JsonProperty("frameNo")
+        private String frameNo;
+        @JsonProperty("engineNo")
+        private String engineNo;
+        @JsonProperty("singeinDate")
+        private String singeinDate;
+        @JsonProperty("certificateDate")
+        private String certificateDate;
+        @JsonProperty("address")
+        private String address;
+        @JsonProperty("enrollDate")
+        private String enrollDate;
+        @JsonProperty("nationality")
+        private String nationality;
+        @JsonProperty("identifyStartDate")
+        private String identifyStartDate;
+        @JsonProperty("identifyEndDate")
+        private String identifyEndDate;
+
+
+        public PfVehicleOwnerDTO(CustomerInfoVo ownersInfo, CarInfoVo carInfoVo) {
+            this.name = ownersInfo.getName();
+            this.ownerNature = "01";
+            this.identifyType = "01";
+            this.identifyNumber = ownersInfo.getIdentifyNumber();
+            this.birthDate = ownersInfo.getBirthday();
+            this.sex = ownersInfo.getGender();
+            this.profession = "";
+            this.mobilePhone = "";
+            this.isApplicantOperator = "1";
+            this.lifeInd = "";
+            this.customerGradeLabel = "";
+            this.carDriveAddress = "";
+            this.customerGroup = "";
+            this.licenseNo = carInfoVo.getLicenseNo();
+            if (carInfoVo.getCarNatureCode().equals("02")) {
+                this.driveUseAttribute = "A";
+            } else {
+                this.driveUseAttribute = "F";
+            }
+            this.printBrandName = carInfoVo.getBrandName();
+            this.frameNo = carInfoVo.getVinNo();
+            this.engineNo = carInfoVo.getEngineNo();
+            this.singeinDate = carInfoVo.getRegisterDate();
+            this.certificateDate = carInfoVo.getIssueDate();
+            this.address = ownersInfo.getAddr();
+            this.enrollDate = carInfoVo.getRegisterDate();
+            this.nationality = "汉";
+            this.identifyStartDate = ownersInfo.getIdentifyValidDate();
+            this.identifyEndDate = ownersInfo.getIdentifyValidEndDate();
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfRelatedPartyDtoDTO {
+        @JsonProperty("appliName")
+        private String appliName;
+        @JsonProperty("insuredCode")
+        private String insuredCode;
+        @JsonProperty("insuredType")
+        private String insuredType;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("longTermIdentifyCard")
+        private String longTermIdentifyCard;
+        @JsonProperty("identifyStartDate")
+        private String identifyStartDate;
+        @JsonProperty("identifyEndDate")
+        private String identifyEndDate;
+        @JsonProperty("itemAddress")
+        private List<String> itemAddress;
+        @JsonProperty("itemProvinceCode")
+        private String itemProvinceCode;
+        @JsonProperty("itemProvinceCName")
+        private String itemProvinceCName;
+        @JsonProperty("itemCityCode")
+        private String itemCityCode;
+        @JsonProperty("itemCityCName")
+        private String itemCityCName;
+        @JsonProperty("countyCode")
+        private String countyCode;
+        @JsonProperty("countyCName")
+        private String countyCName;
+        @JsonProperty("appliAddress")
+        private String appliAddress;
+        @JsonProperty("mobilePhone")
+        private String mobilePhone;
+        @JsonProperty("email")
+        private String email;
+        @JsonProperty("industryCode")
+        private String industryCode;
+        @JsonProperty("contactName")
+        private String contactName;
+        @JsonProperty("contactMobile")
+        private String contactMobile;
+        @JsonProperty("contactType")
+        private String contactType;
+        @JsonProperty("occupationCode")
+        private String occupationCode;
+        @JsonProperty("countryCode")
+        private String countryCode;
+        @JsonProperty("contactIdentifyType")
+        private String contactIdentifyType;
+        @JsonProperty("contactIdentifyNumber")
+        private String contactIdentifyNumber;
+        @JsonProperty("contactSex")
+        private String contactSex;
+        @JsonProperty("contactDealType")
+        private String contactDealType;
+        @JsonProperty("appliPhoneHolderName")
+        private String appliPhoneHolderName;
+        @JsonProperty("appliPhoneHolderCertiType")
+        private String appliPhoneHolderCertiType;
+        @JsonProperty("appliPhoneHolderCertNumber")
+        private String appliPhoneHolderCertNumber;
+        @JsonProperty("leaderType")
+        private String leaderType;
+        @JsonProperty("leaderName")
+        private String leaderName;
+        @JsonProperty("leaderIdType")
+        private String leaderIdType;
+        @JsonProperty("leaderIdNo")
+        private String leaderIdNo;
+        @JsonProperty("leaderIdSDate")
+        private String leaderIdSDate;
+        @JsonProperty("leaderIdEDate")
+        private String leaderIdEDate;
+        @JsonProperty("leaderContact")
+        private String leaderContact;
+        @JsonProperty("leaderPCD")
+        private String leaderPCD;
+        @JsonProperty("leaderAddress")
+        private String leaderAddress;
+        @JsonProperty("businessScope")
+        private String businessScope;
+        @JsonProperty("businessDealerName")
+        private String businessDealerName;
+        @JsonProperty("businessDealerIdType")
+        private String businessDealerIdType;
+        @JsonProperty("businessDealerIdNumber")
+        private String businessDealerIdNumber;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("appliAge")
+        private Integer appliAge;
+        @JsonProperty("appliCompanyAddress")
+        private String appliCompanyAddress;
+        @JsonProperty("shareHolder")
+        private String shareHolder;
+        @JsonProperty("shareHolderIdType")
+        private String shareHolderIdType;
+        @JsonProperty("shareHolderIdNo")
+        private String shareHolderIdNo;
+        @JsonProperty("shareHolderIdSDate")
+        private String shareHolderIdSDate;
+        @JsonProperty("shareHolderIdEDate")
+        private String shareHolderIdEDate;
+        @JsonProperty("actControllerType")
+        private String actControllerType;
+        @JsonProperty("actController")
+        private String actController;
+        @JsonProperty("actControllerIdType")
+        private String actControllerIdType;
+        @JsonProperty("actControllerIdNo")
+        private String actControllerIdNo;
+        @JsonProperty("actControllerSDate")
+        private String actControllerSDate;
+        @JsonProperty("actControllerEDate")
+        private String actControllerEDate;
+        @JsonProperty("companyType")
+        private String companyType;
+        @JsonProperty("nation")
+        private String nation;
+        @JsonProperty("issuer")
+        private String issuer;
+        @JsonProperty("name")
+        private String name;
+        @JsonProperty("ownerNature")
+        private String ownerNature;
+        @JsonProperty("isApplicantOperator")
+        private String isApplicantOperator;
+        @JsonProperty("clientCode")
+        private String clientCode;
+        @JsonProperty("clientCName")
+        private String clientCName;
+        @JsonProperty("clientType")
+        private String clientType;
+        @JsonProperty("cifCode")
+        private String cifCode;
+        @JsonProperty("department")
+        private String department;
+        @JsonProperty("relationWithBrach")
+        private String relationWithBrach;
+        @JsonProperty("showClientAddress")
+        private String showClientAddress;
+        @JsonProperty("addressCName")
+        private String addressCName;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("companyCode")
+        private String companyCode;
+        @JsonProperty("departmentName")
+        private String departmentName;
+        @JsonProperty("relationWithBrachName")
+        private String relationWithBrachName;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("countryName")
+        private String countryName;
+        @JsonProperty("isIntercept")
+        private String isIntercept;
+        @JsonProperty("newCustomSystemOperatorType")
+        private String newCustomSystemOperatorType;
+        @JsonProperty("operatorType")
+        private String operatorType;
+        @JsonProperty("detailAddress")
+        private List<Object> detailAddress;
+
+        public PfRelatedPartyDtoDTO(CustomerInfoVo policyHolderInfo) {
+            this.appliName = policyHolderInfo.getName();
+            this.insuredCode = "";
+            this.insuredType = "1";
+            this.identifyType = "01";
+            this.identifyNumber = policyHolderInfo.getIdentifyNumber();
+            if (policyHolderInfo.getIdentifyValidEndDate().equals("9999-12-31")) {
+                this.longTermIdentifyCard = "1";
+            } else {
+                this.longTermIdentifyCard = "0";
+            }
+            this.identifyStartDate = policyHolderInfo.getIdentifyValidDate();
+            this.identifyEndDate = policyHolderInfo.getIdentifyValidEndDate();
+            this.itemAddress = List.of(
+                    policyHolderInfo.getProvince(),
+                    policyHolderInfo.getCity(),
+                    policyHolderInfo.getCounty()
+            );
+            this.itemProvinceCode = policyHolderInfo.getProvinceCode();
+            this.itemProvinceCName = policyHolderInfo.getProvince();
+            this.itemCityCode = policyHolderInfo.getCityCode();
+            this.itemCityCName = policyHolderInfo.getCity();
+            this.countyCode = policyHolderInfo.getCountyCode();
+            this.countyCName = policyHolderInfo.getCounty();
+            this.appliAddress = policyHolderInfo.getAddr();
+            this.mobilePhone = policyHolderInfo.getMobile();
+            this.email = policyHolderInfo.getEmail();
+            this.industryCode = "";
+            this.contactName = "";
+            this.contactMobile = "";
+            this.contactType = "1";
+            this.occupationCode = "";
+            this.countryCode = "CN";
+            this.contactIdentifyType = "01";
+            this.contactIdentifyNumber = "";
+            this.contactSex = "";
+            this.contactDealType = "1";
+            this.appliPhoneHolderName = "";
+            this.appliPhoneHolderCertiType = "";
+            this.appliPhoneHolderCertNumber = "";
+            this.leaderType = "1";
+            this.leaderName = "";
+            this.leaderIdType = "01";
+            this.leaderIdNo = "";
+            this.leaderIdSDate = "";
+            this.leaderIdEDate = "";
+            this.leaderContact = "";
+            this.leaderPCD = "";
+            this.leaderAddress = "";
+            this.businessScope = "";
+            this.businessDealerName = "";
+            this.businessDealerIdType = "";
+            this.businessDealerIdNumber = "";
+            this.sex = policyHolderInfo.getGender();
+            this.birthDate = policyHolderInfo.getBirthday();
+            this.appliAge = policyHolderInfo.getAge();
+            this.appliCompanyAddress = "";
+            this.shareHolder = "";
+            this.shareHolderIdType = "";
+            this.shareHolderIdNo = "";
+            this.shareHolderIdSDate = "";
+            this.shareHolderIdEDate = "";
+            this.actControllerType = "";
+            this.actController = "";
+            this.actControllerIdType = "";
+            this.actControllerIdNo = "";
+            this.actControllerSDate = "";
+            this.actControllerEDate = "";
+            this.companyType = "";
+            this.nation = "汉";
+            this.name = "";
+            this.ownerNature = "";
+            this.isApplicantOperator = "";
+            this.clientCode = "";
+            this.clientCName = "";
+            this.clientType = "";
+            this.cifCode = "";
+            this.department = "";
+            this.relationWithBrach = "";
+            this.showClientAddress = "";
+            this.addressCName = "";
+            this.mobile = "";
+            this.identifyTypeName = "";
+            this.companyCode = "";
+            this.departmentName = "";
+            this.relationWithBrachName = "";
+            this.riskCode = "";
+            this.countryName = "";
+            this.isIntercept = "";
+            this.issuer = "";
+            this.newCustomSystemOperatorType = "";
+            this.operatorType = "1";
+            this.detailAddress = Collections.emptyList();
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfItemMotorDtoDTO {
+        @JsonProperty("isJy")
+        private Boolean isJy;
+        @JsonProperty("val2")
+        private Boolean val2;
+        @JsonProperty("brandName")
+        private String brandName;
+        @JsonProperty("printBrandName")
+        private String printBrandName;
+        @JsonProperty("certificateDate")
+        private String certificateDate;
+        @JsonProperty("carKindCode")
+        private String carKindCode;
+        @JsonProperty("carKindCodeShow")
+        private String carKindCodeShow;
+        @JsonProperty("carKindCodeShowName")
+        private String carKindCodeShowName;
+        @JsonProperty("vehicleCategory")
+        private String vehicleCategory;
+        @JsonProperty("seatCount")
+        private Integer seatCount;
+        @JsonProperty("tonCount")
+        private Double tonCount;
+        @JsonProperty("negotiatedActualValue")
+        private String negotiatedActualValue;
+        @JsonProperty("useNatureShow")
+        private String useNatureShow;
+        @JsonProperty("attachNature")
+        private String attachNature;
+        @JsonProperty("carUseType")
+        private String carUseType;
+        @JsonProperty("carID")
+        private String carID;
+        @JsonProperty("familyName")
+        private String familyName;
+        @JsonProperty("colorCode")
+        private String colorCode;
+        @JsonProperty("ciModelCode")
+        private String ciModelCode;
+        @JsonProperty("licenseColorCode")
+        private String licenseColorCode;
+        @JsonProperty("purchasePrice")
+        private String purchasePrice;
+        @JsonProperty("carBrand")
+        private String carBrand;
+        @JsonProperty("actualValue")
+        private String actualValue;
+        @JsonProperty("localVehicleInd")
+        private String localVehicleInd;
+        @JsonProperty("completeKerbMass")
+        private Double completeKerbMass;
+        @JsonProperty("fuelType")
+        private String fuelType;
+        @JsonProperty("factory")
+        private String factory;
+        @JsonProperty("engineModel")
+        private String engineModel;
+        @JsonProperty("factoryId")
+        private String factoryId;
+        @JsonProperty("clauseType")
+        private String clauseType;
+        @JsonProperty("vehicleModelKind")
+        private String vehicleModelKind;
+        @JsonProperty("hazardType")
+        private String hazardType;
+        @JsonProperty("glassType")
+        private String glassType;
+        @JsonProperty("carName")
+        private String carName;
+        @JsonProperty("runAreaCode")
+        private String runAreaCode;
+        @JsonProperty("noticeType")
+        private String noticeType;
+        @JsonProperty("carCheckValidTime")
+        private String carCheckValidTime;
+        @JsonProperty("configModel")
+        private String configModel;
+        @JsonProperty("shVehicleCode")
+        private String shVehicleCode;
+        @JsonProperty("licenseTypeCode")
+        private String licenseTypeCode;
+        @JsonProperty("powerTypeCode")
+        private String powerTypeCode;
+        @JsonProperty("powerType")
+        private String powerType;
+        @JsonProperty("doubleProtectFlag")
+        private String doubleProtectFlag;
+        @JsonProperty("taxVehicleCategory")
+        private String taxVehicleCategory;
+        @JsonProperty("countryNature")
+        private String countryNature;
+        @JsonProperty("makeDate")
+        private String makeDate;
+        @JsonProperty("jgVehicleCheckCode")
+        private String jgVehicleCheckCode;
+        @JsonProperty("carId")
+        private String carId;
+        @JsonProperty("noLicenseNo")
+        private Boolean noLicenseNo;
+        @JsonProperty("vehicleQueryType")
+        private String vehicleQueryType;
+        @JsonProperty("runAreaName")
+        private String runAreaName;
+        @JsonProperty("sale4SFlag")
+        private Object sale4SFlag;
+        @JsonProperty("saleCompany")
+        private String saleCompany;
+        @JsonProperty("saleAreaCode")
+        private String saleAreaCode;
+        @JsonProperty("provinceEcdemicVehicleFlag")
+        private String provinceEcdemicVehicleFlag;
+        @JsonProperty("vehicleFatteryFlag")
+        private String vehicleFatteryFlag;
+        @JsonProperty("nerveCentre")
+        private String nerveCentre;
+        @JsonProperty("thirdRunRoute")
+        private String thirdRunRoute;
+        @JsonProperty("licenseNo")
+        private String licenseNo;
+        @JsonProperty("frameNo")
+        private String frameNo;
+        @JsonProperty("engineNo")
+        private String engineNo;
+        @JsonProperty("modelCode")
+        private String modelCode;
+        @JsonProperty("singeinDate")
+        private String singeinDate;
+        @JsonProperty("carNewOldFlag")
+        private String carNewOldFlag;
+        @JsonProperty("enrollDate")
+        private String enrollDate;
+        @JsonProperty("useYears")
+        private Integer useYears;
+        @JsonProperty("driveUseAttribute")
+        private String driveUseAttribute;
+        @JsonProperty("exhaustScale")
+        private Integer exhaustScale;
+        @JsonProperty("power")
+        private Integer power;
+        @JsonProperty("negotiatedActualValueType")
+        private String negotiatedActualValueType;
+        @JsonProperty("principalLicenseNo")
+        private String principalLicenseNo;
+        @JsonProperty("principalValidPolicyCount")
+        private String principalValidPolicyCount;
+        @JsonProperty("chgOwnerFlag")
+        private String chgOwnerFlag;
+        @JsonProperty("transferDate")
+        private String transferDate;
+        @JsonProperty("specialCarFlag")
+        private String specialCarFlag;
+        @JsonProperty("loanVehicleFlag")
+        private String loanVehicleFlag;
+        @JsonProperty("familyCode")
+        private String familyCode;
+        @JsonProperty("hkFlag")
+        private String hkFlag;
+        @JsonProperty("fuelTypeName")
+        private String fuelTypeName;
+        @JsonProperty("whiteListFlag")
+        private String whiteListFlag;
+        @JsonProperty("whiteListElecContactNo")
+        private String whiteListElecContactNo;
+        @JsonProperty("groupCode")
+        private String groupCode;
+        @JsonProperty("commercialCarGradeSource")
+        private String commercialCarGradeSource;
+        @JsonProperty("commercialCarGrade")
+        private String commercialCarGrade;
+        @JsonProperty("saleAreaName")
+        private String saleAreaName;
+        @JsonProperty("totalTractionMass")
+        private String totalTractionMass;
+        @JsonProperty("quoteName")
+        private String quoteName;
+        @JsonProperty("classificationOfCDW")
+        private String classificationOfCDW;
+        @JsonProperty("isSpecialCarFlag")
+        private String isSpecialCarFlag;
+        @JsonProperty("cvFlag")
+        private String cvFlag;
+        @JsonProperty("frameNoHeteroType")
+        private String frameNoHeteroType;
+        @JsonProperty("principalCHDVehicleGrade")
+        private String principalCHDVehicleGrade;
+        @JsonProperty("principalCHDTeamGrade")
+        private String principalCHDTeamGrade;
+        @JsonProperty("principalQuotationDiscount")
+        private String principalQuotationDiscount;
+        @JsonProperty("chdVehicleGrade")
+        private String chdVehicleGrade;
+        @JsonProperty("chdTeamGrade")
+        private String chdTeamGrade;
+        @JsonProperty("zjxlGrade")
+        private String zjxlGrade;
+        @JsonProperty("newEnergyFlag")
+        private String newEnergyFlag;
+        @JsonProperty("energyType")
+        private String energyType;
+        @JsonProperty("energyTypeDescribe")
+        private String energyTypeDescribe;
+        @JsonProperty("range")
+        private String range;
+        @JsonProperty("vehicleStyleUniqueId")
+        private String vehicleStyleUniqueId;
+        @JsonProperty("certificateType")
+        private String certificateType;
+        @JsonProperty("certificateNo")
+        private String certificateNo;
+        @JsonProperty("certificateReportDate")
+        private String certificateReportDate;
+        @JsonProperty("longLoadPermit")
+        private String longLoadPermit;
+        @JsonProperty("brandId")
+        private String brandId;
+        @JsonProperty("colorName")
+        private String colorName;
+        @JsonProperty("newVehicleClassCode")
+        private String newVehicleClassCode;
+        @JsonProperty("newVehicleClassName")
+        private String newVehicleClassName;
+        @JsonProperty("hfCode")
+        private String hfCode;
+        @JsonProperty("hfName")
+        private String hfName;
+        @JsonProperty("carGroupName")
+        private String carGroupName;
+        @JsonProperty("vehicleCategoryName")
+        private String vehicleCategoryName;
+        @JsonProperty("glassTypeName")
+        private String glassTypeName;
+        @JsonProperty("orderNo")
+        private String orderNo;
+        @JsonProperty("licenseColorName")
+        private String licenseColorName;
+        @JsonProperty("licenseTypeName")
+        private String licenseTypeName;
+        @JsonProperty("motorTypeName")
+        private String motorTypeName;
+        @JsonProperty("newEnergyClauseFlag")
+        private String newEnergyClauseFlag;
+        @JsonProperty("carIdRenewalFlag")
+        private String carIdRenewalFlag;
+
+        public PfItemMotorDtoDTO(CarInfoVo carInfoVo, TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO motor, String orderNo, String actualValue) {
+            this.isJy = false;
+            this.val2 = false;
+            this.brandName = motor.getBrandName();
+            this.printBrandName = motor.getPrintBrandName();
+            this.certificateDate = carInfoVo.getIssueDate();
+            this.carKindCode = motor.getCarKindCode();
+            if (Integer.parseInt(carInfoVo.getSeatCount()) < 6) {
+                this.carKindCodeShow = "11";
+            } else {
+                this.carKindCodeShow = "12";
+            }
+            this.carKindCodeShowName = motor.getCiModelClass();
+            this.vehicleCategory = carInfoVo.getCarTypeCode();
+            this.seatCount = Integer.valueOf(carInfoVo.getSeatCount());
+            this.tonCount = Double.valueOf(carInfoVo.getTonCount());
+            this.negotiatedActualValue = actualValue;
+            this.useNatureShow = carInfoVo.getCarNatureCode();
+            this.attachNature = "01";
+            if (carInfoVo.getCarNatureCode().equals("02")) {
+                this.driveUseAttribute = "A";
+            } else {
+                this.driveUseAttribute = "F";
+            }
+            this.carUseType = carInfoVo.getPropertyCode();
+            this.carID = motor.getCarID();
+            this.familyName = motor.getFamilyName();
+            this.colorCode = motor.getColorCode();
+            this.ciModelCode = motor.getCiModelCode();
+            this.licenseColorCode = motor.getLicenseColorCode();
+            this.purchasePrice = motor.getPurchasePrice();
+            this.carBrand = motor.getCarBrand();
+            this.actualValue = actualValue;
+            this.localVehicleInd = motor.getLocalVehicleInd();
+            this.completeKerbMass = motor.getCompleteKerbMass();
+            this.fuelType = motor.getFuelType();
+            this.factory = motor.getFactory();
+            this.engineModel = motor.getEngineModel();
+            this.factoryId = motor.getFactoryId();
+            this.clauseType = motor.getClauseType();
+            this.vehicleModelKind = motor.getVehicleModelKind();
+            this.hazardType = motor.getHazardType();
+            this.glassType = motor.getGlassType();
+            this.carName = motor.getCarName();
+            this.runAreaCode = motor.getRunAreaCode();
+            this.noticeType = motor.getNoticeType();
+            this.carCheckValidTime = "";
+            this.configModel = "";
+            this.shVehicleCode = "";
+            this.licenseTypeCode = motor.getLicenseTypeCode();
+            this.powerTypeCode = "";
+            this.powerType = "";
+            this.doubleProtectFlag = "";
+            this.taxVehicleCategory = motor.getTaxVehicleCategory();
+            this.countryNature = motor.getCountryNature();
+            this.makeDate = motor.getMakeDate();
+            this.jgVehicleCheckCode = motor.getJgVehicleCheckCode();
+            this.carId = motor.getCarID();
+            this.noLicenseNo = Boolean.FALSE;
+            this.vehicleQueryType = motor.getVehicleQueryType();
+            this.runAreaName = motor.getRunAreaName();
+            this.sale4SFlag = motor.getSale4SFlag();
+            this.saleCompany = motor.getSaleCompany();
+            this.saleAreaCode = motor.getSaleAreaCode();
+            this.provinceEcdemicVehicleFlag = motor.getProvinceEcdemicVehicleFlag();
+            this.vehicleFatteryFlag = motor.getVehicleFatteryFlag();
+            this.nerveCentre = motor.getNerveCentre();
+            this.thirdRunRoute = motor.getThirdRunRoute();
+            this.licenseNo = carInfoVo.getLicenseNo();
+            this.frameNo = carInfoVo.getVinNo();
+            this.engineNo = carInfoVo.getEngineNo();
+            this.modelCode = motor.getModelCode();
+            this.singeinDate = carInfoVo.getRegisterDate();
+            if (StringUtils.hasLength(carInfoVo.getLicenseNo())) {
+                this.carNewOldFlag = "1";
+            } else {
+                this.carNewOldFlag = "0";
+            }
+            this.enrollDate = carInfoVo.getRegisterDate() ;
+            this.useYears = getUseYears(carInfoVo.getRegisterDate());
+            this.exhaustScale = motor.getExhaustScale();
+            this.power = motor.getPower();
+            this.negotiatedActualValueType = motor.getNegotiatedActualValueType();
+            this.principalLicenseNo = motor.getPrincipalLicenseNo();
+            this.principalValidPolicyCount = motor.getPrincipalValidPolicyCount();
+            this.chgOwnerFlag = motor.getChgOwnerFlag();
+            this.transferDate = carInfoVo.getTransferDate();
+            this.specialCarFlag = motor.getSpecialCarFlag();
+            this.loanVehicleFlag = motor.getLoanVehicleFlag();
+            this.familyCode = motor.getFamilyCode();
+            this.hkFlag = motor.getHkFlag();
+            this.fuelTypeName = motor.getFuelTypeName();
+            this.whiteListFlag = motor.getWhiteListFlag();
+            this.whiteListElecContactNo = motor.getWhiteListElecContactNo();
+            this.groupCode = motor.getGroupCode();
+            this.commercialCarGradeSource = motor.getCommercialCarGradeSource();
+            this.commercialCarGrade = motor.getCommercialCarGrade();
+            this.saleAreaName = motor.getSaleAreaName();
+            this.totalTractionMass = motor.getTotalTractionMass();
+            this.quoteName = "";
+            this.classificationOfCDW = motor.getClassificationOfCDW();
+            this.isSpecialCarFlag = motor.getIsSpecialCarFlag();
+            this.cvFlag = motor.getCvFlag();
+            this.frameNoHeteroType = motor.getFrameNoHeteroType();
+            this.principalCHDVehicleGrade = motor.getPrincipalCHDVehicleGrade();
+            this.principalCHDTeamGrade = motor.getPrincipalCHDTeamGrade();
+            this.principalQuotationDiscount = motor.getPrincipalQuotationDiscount();
+            this.chdVehicleGrade = motor.getChdVehicleGrade();
+            this.chdTeamGrade = motor.getChdTeamGrade();
+            this.zjxlGrade = motor.getZjxlGrade();
+            if (carInfoVo.getEnergyTypeCode().equals("0")) {
+                this.newEnergyFlag = "0";
+                this.energyType = "0";
+            } else {
+                this.newEnergyFlag = "1";
+                this.energyType = "1";
+            }
+            this.energyTypeDescribe = motor.getEnergyTypeDescribe();
+            this.range = motor.getRange();
+            this.vehicleStyleUniqueId = motor.getVehicleStyleUniqueId();
+            this.certificateType = motor.getCertificateType();
+            this.certificateNo = motor.getCertificateNo();
+            this.certificateReportDate = motor.getCertificateReportDate();
+            this.longLoadPermit = motor.getLongLoadPermit();
+            this.brandId = motor.getBrandId();
+            this.colorName = motor.getColorName();
+            this.newVehicleClassCode = motor.getNewVehicleClassCode();
+            this.newVehicleClassName = motor.getNewVehicleClassName();
+            this.hfCode = motor.getHfCode();
+            this.hfName = motor.getHfName();
+            this.carGroupName = motor.getCarGroupName();
+            this.vehicleCategoryName = motor.getVehicleCategoryName();
+            this.glassTypeName = motor.getGlassTypeName();
+            this.orderNo = orderNo;
+            this.licenseColorName = motor.getLicenseColorName();
+            this.licenseTypeName = motor.getLicenseTypeName();
+            this.motorTypeName = motor.getMotorTypeName();
+            this.newEnergyClauseFlag = motor.getNewEnergyClauseFlag();
+            this.carIdRenewalFlag = "";
+        }
+
+        public int getUseYears(String registerDate) {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate startDate = LocalDate.parse(registerDate, formatter);
+            LocalDate endDate = LocalDate.now().plusDays(1);
+            // 总天数
+            long days = java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate);
+            // 除以365 取整
+            return (int) (days / 365);
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfRiskRelatedPartyDtoDTO {
+        @JsonProperty("insuredName")
+        private String insuredName;
+        @JsonProperty("insuredCode")
+        private String insuredCode;
+        @JsonProperty("insuredType")
+        private String insuredType;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("longTermIdentifyCard")
+        private String longTermIdentifyCard;
+        @JsonProperty("identifyStartDate")
+        private String identifyStartDate;
+        @JsonProperty("identifyEndDate")
+        private String identifyEndDate;
+        @JsonProperty("itemAddress")
+        private List<String> itemAddress;
+        @JsonProperty("itemProvinceCode")
+        private String itemProvinceCode;
+        @JsonProperty("itemProvinceCName")
+        private String itemProvinceCName;
+        @JsonProperty("itemCityCode")
+        private String itemCityCode;
+        @JsonProperty("itemCityCName")
+        private String itemCityCName;
+        @JsonProperty("countyCode")
+        private String countyCode;
+        @JsonProperty("countyCName")
+        private String countyCName;
+        @JsonProperty("insuredAddress")
+        private String insuredAddress;
+        @JsonProperty("insuredMobilePhone")
+        private String insuredMobilePhone;
+        @JsonProperty("email")
+        private String email;
+        @JsonProperty("contactName")
+        private String contactName;
+        @JsonProperty("contactMobile")
+        private String contactMobile;
+        @JsonProperty("contactType")
+        private String contactType;
+        @JsonProperty("occupationCode")
+        private String occupationCode;
+        @JsonProperty("contactIdentifyType")
+        private String contactIdentifyType;
+        @JsonProperty("contactIdentifyNumber")
+        private String contactIdentifyNumber;
+        @JsonProperty("insuredPhoneHolderName")
+        private String insuredPhoneHolderName;
+        @JsonProperty("insuredPhoneHolderCertiType")
+        private String insuredPhoneHolderCertiType;
+        @JsonProperty("insuredPhoneHolderCertNumber")
+        private String insuredPhoneHolderCertNumber;
+        @JsonProperty("leaderType")
+        private String leaderType;
+        @JsonProperty("subLeaderName")
+        private String subLeaderName;
+        @JsonProperty("leaderIdType")
+        private String leaderIdType;
+        @JsonProperty("leaderIdNo")
+        private String leaderIdNo;
+        @JsonProperty("leaderIdSDate")
+        private String leaderIdSDate;
+        @JsonProperty("leaderIdEDate")
+        private String leaderIdEDate;
+        @JsonProperty("subLeaderConactMobile")
+        private String subLeaderConactMobile;
+        @JsonProperty("businessScope")
+        private String businessScope;
+        @JsonProperty("leaderPCD")
+        private String leaderPCD;
+        @JsonProperty("subLeaderAddress")
+        private String subLeaderAddress;
+        @JsonProperty("insuredSex")
+        private String insuredSex;
+        @JsonProperty("insuredBirthDate")
+        private String insuredBirthDate;
+        @JsonProperty("insuredAge")
+        private Integer insuredAge;
+        @JsonProperty("insuredCompanyAddress")
+        private String insuredCompanyAddress;
+        @JsonProperty("countryCode")
+        private String countryCode;
+        @JsonProperty("companyType")
+        private String companyType;
+        @JsonProperty("companyEstablishDate")
+        private String companyEstablishDate;
+        @JsonProperty("nation")
+        private String nation;
+        @JsonProperty("issuer")
+        private String issuer;
+        @JsonProperty("businessDealerName")
+        private String businessDealerName;
+        @JsonProperty("businessDealerIdType")
+        private String businessDealerIdType;
+        @JsonProperty("businessDealerIdNumber")
+        private String businessDealerIdNumber;
+        @JsonProperty("shareHolder")
+        private String shareHolder;
+        @JsonProperty("shareHolderIdType")
+        private String shareHolderIdType;
+        @JsonProperty("shareHolderIdNo")
+        private String shareHolderIdNo;
+        @JsonProperty("shareHolderIdSDate")
+        private String shareHolderIdSDate;
+        @JsonProperty("shareHolderIdEDate")
+        private String shareHolderIdEDate;
+        @JsonProperty("actControllerType")
+        private String actControllerType;
+        @JsonProperty("actController")
+        private String actController;
+        @JsonProperty("actControllerIdType")
+        private String actControllerIdType;
+        @JsonProperty("actControllerIdNo")
+        private String actControllerIdNo;
+        @JsonProperty("actControllerSDate")
+        private String actControllerSDate;
+        @JsonProperty("actControllerEDate")
+        private String actControllerEDate;
+        @JsonProperty("appliName")
+        private String appliName;
+        @JsonProperty("appliAddress")
+        private String appliAddress;
+        @JsonProperty("mobilePhone")
+        private String mobilePhone;
+        @JsonProperty("industryCode")
+        private String industryCode;
+        @JsonProperty("contactSex")
+        private String contactSex;
+        @JsonProperty("contactDealType")
+        private String contactDealType;
+        @JsonProperty("appliPhoneHolderName")
+        private String appliPhoneHolderName;
+        @JsonProperty("appliPhoneHolderCertiType")
+        private String appliPhoneHolderCertiType;
+        @JsonProperty("appliPhoneHolderCertNumber")
+        private String appliPhoneHolderCertNumber;
+        @JsonProperty("leaderName")
+        private String leaderName;
+        @JsonProperty("leaderContact")
+        private String leaderContact;
+        @JsonProperty("leaderAddress")
+        private String leaderAddress;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("appliAge")
+        private Integer appliAge;
+        @JsonProperty("appliCompanyAddress")
+        private String appliCompanyAddress;
+        @JsonProperty("ownerNature")
+        private String ownerNature;
+        @JsonProperty("isApplicantOperator")
+        private String isApplicantOperator;
+        @JsonProperty("clientCode")
+        private String clientCode;
+        @JsonProperty("clientCName")
+        private String clientCName;
+        @JsonProperty("clientType")
+        private String clientType;
+        @JsonProperty("cifCode")
+        private String cifCode;
+        @JsonProperty("department")
+        private String department;
+        @JsonProperty("relationWithBrach")
+        private String relationWithBrach;
+        @JsonProperty("showClientAddress")
+        private String showClientAddress;
+        @JsonProperty("addressCName")
+        private String addressCName;
+        @JsonProperty("mobile")
+        private String mobile;
+        @JsonProperty("identifyTypeName")
+        private String identifyTypeName;
+        @JsonProperty("companyCode")
+        private String companyCode;
+        @JsonProperty("departmentName")
+        private String departmentName;
+        @JsonProperty("relationWithBrachName")
+        private String relationWithBrachName;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("countryName")
+        private String countryName;
+        @JsonProperty("isIntercept")
+        private String isIntercept;
+        @JsonProperty("newCustomSystemOperatorType")
+        private String newCustomSystemOperatorType;
+        @JsonProperty("detailAddress")
+        private List<Object> detailAddress;
+
+        public PfRiskRelatedPartyDtoDTO(CustomerInfoVo insuredPersonInfo) {
+            this.insuredName = insuredPersonInfo.getName();
+            this.insuredCode = "";
+            this.insuredType = "1";
+            this.identifyType = "01";
+            this.identifyNumber = insuredPersonInfo.getIdentifyNumber();
+            if (insuredPersonInfo.getIdentifyValidEndDate().equals("9999-12-31")) {
+                this.longTermIdentifyCard = "1";
+            } else {
+                this.longTermIdentifyCard = "0";
+            }
+            this.identifyStartDate = insuredPersonInfo.getIdentifyValidDate();
+            this.identifyEndDate = insuredPersonInfo.getIdentifyValidEndDate();
+            this.itemAddress = List.of(
+                    insuredPersonInfo.getProvince(),
+                    insuredPersonInfo.getCity(),
+                    insuredPersonInfo.getCounty()
+            );
+            this.itemProvinceCode = insuredPersonInfo.getProvinceCode();
+            this.itemProvinceCName = insuredPersonInfo.getProvince();
+            this.itemCityCode = insuredPersonInfo.getCityCode();
+            this.itemCityCName = insuredPersonInfo.getCity();
+            this.countyCode = insuredPersonInfo.getCountyCode();
+            this.countyCName = insuredPersonInfo.getCounty();
+            this.insuredAddress = insuredPersonInfo.getAddr();
+            this.insuredMobilePhone = insuredPersonInfo.getMobile();
+            this.email = insuredPersonInfo.getEmail();
+            this.contactName = "";
+            this.contactMobile = "";
+            this.contactType = "1";
+            this.occupationCode = "";
+            this.contactIdentifyType = "01";
+            this.contactIdentifyNumber = "";
+            this.insuredPhoneHolderName = "";
+            this.insuredPhoneHolderCertiType = "";
+            this.insuredPhoneHolderCertNumber = "";
+            this.leaderType = "1";
+            this.subLeaderName = "";
+            this.leaderIdType = "01";
+            this.leaderIdNo = "";
+            this.leaderIdSDate = "";
+            this.leaderIdEDate = "";
+            this.subLeaderConactMobile = "";
+            this.businessScope = "";
+            this.leaderPCD = "";
+            this.subLeaderAddress = "";
+            this.insuredSex = "";
+            this.insuredBirthDate = insuredPersonInfo.getBirthday();
+            this.insuredAge = insuredPersonInfo.getAge();
+            this.insuredCompanyAddress = "";
+            this.countryCode = "CN";
+            this.companyType = "";
+            this.companyEstablishDate = "";
+            this.nation = "汉";
+            this.issuer = "";
+            this.businessDealerName = "";
+            this.businessDealerIdType = "";
+            this.businessDealerIdNumber = "";
+            this.shareHolder = "";
+            this.shareHolderIdType = "";
+            this.shareHolderIdNo = "";
+            this.shareHolderIdSDate = "";
+            this.shareHolderIdEDate = "";
+            this.actControllerType = "1";
+            this.actController = "";
+            this.actControllerIdType = "";
+            this.actControllerIdNo = "";
+            this.actControllerSDate = "";
+            this.actControllerEDate = "";
+            this.appliName = insuredPersonInfo.getName();
+            this.appliAddress = insuredPersonInfo.getAddr();
+            this.mobilePhone = insuredPersonInfo.getMobile();
+            this.industryCode = "";
+            this.contactSex = "";
+            this.contactDealType = "1";
+            this.appliPhoneHolderName = "";
+            this.appliPhoneHolderCertiType = "";
+            this.appliPhoneHolderCertNumber = "";
+            this.leaderName = "";
+            this.leaderContact = "";
+            this.leaderAddress = "";
+            this.sex = insuredPersonInfo.getGender();
+            this.birthDate = insuredPersonInfo.getBirthday();
+            this.appliAge = insuredPersonInfo.getAge();
+            this.appliCompanyAddress = "";
+            this.ownerNature = "";
+            this.isApplicantOperator = "";
+            this.clientCode = "";
+            this.clientCName = "";
+            this.clientType = "";
+            this.cifCode = "";
+            this.department = "";
+            this.relationWithBrach = "";
+            this.showClientAddress = "";
+            this.addressCName = addressCName;
+            this.mobile = insuredPersonInfo.getMobile();
+            this.identifyTypeName = "";
+            this.companyCode = "";
+            this.departmentName = "";
+            this.relationWithBrachName = "";
+            this.riskCode = "";
+            this.countryName = "";
+            this.isIntercept = "";
+            this.newCustomSystemOperatorType = "";
+            this.detailAddress = Collections.emptyList();
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfProposalCarShipTaxDtoDTO {
+
+        @JsonProperty("taxpayerIdentifier")
+        private String taxpayerIdentifier;
+        @JsonProperty("taxRelifFlag")
+        private String taxRelifFlag;
+        @JsonProperty("fuelType")
+        private String fuelType;
+        @JsonProperty("taxItemDetailCode")
+        private String taxItemDetailCode;
+        @JsonProperty("taxItemDetailName")
+        private String taxItemDetailName;
+        @JsonProperty("calculateMode")
+        private String calculateMode;
+        @JsonProperty("taxDueActual")
+        private Integer taxDueActual;
+        @JsonProperty("refundTaxDue")
+        private String refundTaxDue;
+        @JsonProperty("sumRefundTax")
+        private String sumRefundTax;
+        @JsonProperty("calcTaxFlag")
+        private String calcTaxFlag;
+        @JsonProperty("taxPaymentMark")
+        private String taxPaymentMark;
+        @JsonProperty("previousPay")
+        private Integer previousPay;
+        @JsonProperty("lateFee")
+        private Integer lateFee;
+        @JsonProperty("taxPayerName")
+        private String taxPayerName;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("paidFreeCertificate")
+        private String paidFreeCertificate;
+        @JsonProperty("taxDocumentDate")
+        private String taxDocumentDate;
+        @JsonProperty("taxPaidAreaCode")
+        private String taxPaidAreaCode;
+        @JsonProperty("relifReason")
+        private String relifReason;
+        @JsonProperty("freeRate")
+        private Integer freeRate;
+        @JsonProperty("deductionDueType")
+        private String deductionDueType;
+        @JsonProperty("taxRegistryNumber")
+        private String taxRegistryNumber;
+        @JsonProperty("taxCompancyCode")
+        private String taxCompancyCode;
+        @JsonProperty("taxCompancyName")
+        private String taxCompancyName;
+        @JsonProperty("carFindDate")
+        private String carFindDate;
+        @JsonProperty("previousPayYears")
+        private String previousPayYears;
+        @JsonProperty("itemAddress")
+        private String itemAddress;
+        @JsonProperty("provinceCode")
+        private String provinceCode;
+        @JsonProperty("provinceName")
+        private String provinceName;
+        @JsonProperty("cityCode")
+        private String cityCode;
+        @JsonProperty("cityName")
+        private String cityName;
+        @JsonProperty("countyCode")
+        private String countyCode;
+        @JsonProperty("countyName")
+        private String countyName;
+        @JsonProperty("detailedAddress")
+        private String detailedAddress;
+        @JsonProperty("fuelTypeCST")
+        private String fuelTypeCST;
+        @JsonProperty("useNatureCode")
+        private String useNatureCode;
+        @JsonProperty("taxPayerPhoneNumber")
+        private String taxPayerPhoneNumber;
+        @JsonProperty("taxStartDate")
+        private String taxStartDate;
+        @JsonProperty("taxEndDate")
+        private String taxEndDate;
+        @JsonProperty("newLicenseFlag")
+        private String newLicenseFlag;
+        @JsonProperty("payLastYear")
+        private String payLastYear;
+        @JsonProperty("payLastEndDate")
+        private String payLastEndDate;
+        @JsonProperty("sumPayTax")
+        private Integer sumPayTax;
+        @JsonProperty("taxRelief")
+        private Integer taxRelief;
+        @JsonProperty("vehicleCategory")
+        private String vehicleCategory;
+        @JsonProperty("certiType")
+        private String certiType;
+
+        public PfProposalCarShipTaxDtoDTO(VehicleAndVesselTaxVo vehicleAndVesselTax, CarInfoVo carInfoVo) {
+            this.taxpayerIdentifier = vehicleAndVesselTax.getIdentifyNumber();
+            this.taxRelifFlag = "02";
+            this.fuelType = carInfoVo.getEnergyTypeCode();
+            if (!carInfoVo.getEnergyTypeCode().equals("0")) {
+                this.taxItemDetailCode = "";
+                this.taxItemDetailName = "";
+                this.calculateMode = "1";
+            } else {
+                this.taxItemDetailCode = "02";
+                this.taxItemDetailName = "1.6至2.0升(含)客车";
+                this.calculateMode = "3";
+            }
+            this.taxDueActual = 0;
+            this.refundTaxDue = "";
+            this.sumRefundTax = "";
+            this.calcTaxFlag = "";
+            this.taxPaymentMark = "";
+            this.previousPay = 0;
+            this.lateFee = 0;
+            this.taxPayerName = vehicleAndVesselTax.getTaxpayerName();
+            this.identifyType = "01";
+            this.identifyNumber = vehicleAndVesselTax.getIdentifyNumber();
+            this.paidFreeCertificate = "";
+            this.taxDocumentDate = "";
+            this.taxPaidAreaCode = "";
+            this.relifReason = vehicleAndVesselTax.getRelifReason();
+            this.freeRate = 50;
+            this.deductionDueType = "";
+            this.taxRegistryNumber = "";
+            this.taxCompancyCode = vehicleAndVesselTax.getTaxComCode();
+            this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+            this.carFindDate = "";
+            this.previousPayYears = "";
+            this.itemAddress = "";
+            this.provinceCode = "";
+            this.provinceName = "";
+            this.cityCode = "";
+            this.cityName = "";
+            this.countyCode = "";
+            this.countyName = "";
+            this.detailedAddress = "";
+            this.fuelTypeCST = "A";
+            this.useNatureCode = "200";
+            this.taxPayerPhoneNumber = "";
+            this.taxStartDate = "";
+            this.taxEndDate = "";
+            this.newLicenseFlag = "1";
+            this.payLastYear = "";
+            this.payLastEndDate = "";
+            this.sumPayTax = 0;
+            this.taxRelief = 0;
+            this.vehicleCategory = "K33";
+            this.certiType = "01";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfPolicyInfoDtoDTO {
+        @JsonProperty("startDate0801")
+        private String startDate0801;
+        @JsonProperty("startDate0802")
+        private String startDate0802;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("renewalNo0801")
+        private String renewalNo0801;
+        @JsonProperty("renewalNo0802")
+        private String renewalNo0802;
+        @JsonProperty("proposalNo0801")
+        private String proposalNo0801;
+        @JsonProperty("demandNoForce")
+        private String demandNoForce;
+        @JsonProperty("immEffectStartDate0801")
+        private String immEffectStartDate0801;
+        @JsonProperty("startTime0801")
+        private String startTime0801;
+        @JsonProperty("endDate0801")
+        private String endDate0801;
+        @JsonProperty("endTime0801")
+        private String endTime0801;
+        @JsonProperty("demandNoBusi")
+        private String demandNoBusi;
+        @JsonProperty("poaSerialNo")
+        private String poaSerialNo;
+        @JsonProperty("effectFlag0801")
+        private Boolean effectFlag0801;
+        @JsonProperty("immEffectType0801")
+        private Object immEffectType0801;
+        @JsonProperty("effectFlag0802")
+        private Boolean effectFlag0802;
+        @JsonProperty("immEffectType0802")
+        private Object immEffectType0802;
+        @JsonProperty("proposalNo0802")
+        private String proposalNo0802;
+        @JsonProperty("immEffectStartDate0802")
+        private String immEffectStartDate0802;
+        @JsonProperty("startTime0802")
+        private String startTime0802;
+        @JsonProperty("endDate0802")
+        private String endDate0802;
+        @JsonProperty("endTime0802")
+        private String endTime0802;
+        @JsonProperty("specialCarFlag")
+        private String specialCarFlag;
+        @JsonProperty("chgOwnerFlag")
+        private String chgOwnerFlag;
+        @JsonProperty("transferDate")
+        private String transferDate;
+        @JsonProperty("loanVehicleFlag")
+        private Boolean loanVehicleFlag;
+        @JsonProperty("noDamageYears")
+        private Integer noDamageYears;
+        @JsonProperty("operateDate")
+        private String operateDate;
+        @JsonProperty("tradingRelevanceNo")
+        private Boolean tradingRelevanceNo;
+        @JsonProperty("argueSolution")
+        private String argueSolution;
+        @JsonProperty("forwardAgentUserCode")
+        private String forwardAgentUserCode;
+        @JsonProperty("arbitoryName")
+        private Object arbitoryName;
+        @JsonProperty("isElectronicPolicyBZ")
+        private String isElectronicPolicyBZ;
+        @JsonProperty("isElectronicProposalBZ")
+        private String isElectronicProposalBZ;
+        @JsonProperty("isElectronicPolicyBS")
+        private String isElectronicPolicyBS;
+        @JsonProperty("isElectronicProposalBS")
+        private String isElectronicProposalBS;
+        @JsonProperty("policyNo0801")
+        private String policyNo0801;
+        @JsonProperty("policyNo0802")
+        private String policyNo0802;
+
+        public PfPolicyInfoDtoDTO(QuoteVo quoteVo) {
+            if (quoteVo.getCiRiskInfoVo() != null) {
+                String startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+                String endDate = quoteVo.getCiRiskInfoVo().getEndDate();
+                this.startDate0801 = startDate.substring(0, 10);
+                this.startTime0801 = startDate.substring(11);
+                this.endDate0801 = endDate.substring(0, 10);
+                this.endTime0801 = endDate.substring(11);
+            }
+            if (quoteVo.getBiRiskInfoVo() != null) {
+                String startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+                String endDate = quoteVo.getBiRiskInfoVo().getEndDate();
+                this.startDate0802 = startDate.substring(0, 10);
+                this.startTime0802 = startDate.substring(11);
+                this.endDate0802 = endDate.substring(0, 10);
+                this.endTime0802 = endDate.substring(11);
+            }
+            this.proposalNo = "";
+            this.renewalNo0801 = "";
+            this.renewalNo0802 = "";
+            this.proposalNo0801 = "";
+            this.demandNoForce = "";
+            this.immEffectStartDate0801 = null;
+            this.immEffectStartDate0802 = null;
+            this.demandNoBusi = "";
+            this.poaSerialNo = "";
+            this.effectFlag0801 = false;
+            this.effectFlag0802 = false;
+            this.immEffectType0801 = null;
+            this.immEffectType0802 = null;
+            this.proposalNo0802 = "";
+            this.specialCarFlag = "";
+            CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+            if (carInfoVo.isTransfer()) {
+                this.chgOwnerFlag = "1";
+                this.transferDate = carInfoVo.getTransferDate();
+            } else {
+                this.chgOwnerFlag = "0";
+                this.transferDate = "";
+            }
+            if (carInfoVo.isLoanStatus()) {
+                this.loanVehicleFlag = true;
+            } else {
+                this.loanVehicleFlag = false;
+            }
+            this.noDamageYears = 0;
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            this.operateDate = LocalDate.now().format(formatter);
+            this.tradingRelevanceNo = false;
+            this.argueSolution = "1";
+            this.forwardAgentUserCode = "";
+            this.arbitoryName = null;
+            this.isElectronicPolicyBZ = "0";
+            this.isElectronicProposalBZ = "0";
+            this.isElectronicPolicyBS = "0";
+            this.isElectronicProposalBS = "0";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfItemKind0801DtoListDTO {
+        @JsonProperty("kindCode_kindName")
+        private String kindcodeKindname;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("shortRate")
+        private String shortRate;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("grossPremium")
+        private String grossPremium;
+        @JsonProperty("priceTaxTotal")
+        private String priceTaxTotal;
+        @JsonProperty("relieveFund")
+        private String relieveFund;
+
+        public static TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0801DtoListDTO getCiKindInfo() {
+            TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0801DtoListDTO pfItemKind0801DtoListDTO = new TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0801DtoListDTO();
+            pfItemKind0801DtoListDTO.kindcodeKindname = "BZ-机动车交通事故责任强制险";
+            pfItemKind0801DtoListDTO.basePremium = "";
+            pfItemKind0801DtoListDTO.shortRate = "100.00";
+            pfItemKind0801DtoListDTO.discount = "100.00";
+            pfItemKind0801DtoListDTO.grossPremium = "";
+            pfItemKind0801DtoListDTO.priceTaxTotal = "";
+            pfItemKind0801DtoListDTO.relieveFund = "0.00";
+            return pfItemKind0801DtoListDTO;
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PfItemKind0802DtoListDTO {
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("kindInd")
+        private String kindInd;
+        @JsonProperty("sumInsured")
+        private String sumInsured;
+        @JsonProperty("valueType")
+        private String valueType;
+        @JsonProperty("clauseType")
+        private Boolean clauseType;
+        @JsonProperty("deductible")
+        private String deductible;
+        @JsonProperty("deductibleRate")
+        private String deductibleRate;
+        @JsonProperty("relatedFlagFG2020Type")
+        private Boolean relatedFlagFG2020Type;
+        @JsonProperty("kindCode")
+        private String kindCode;
+        @JsonProperty("relatedInd")
+        private String relatedInd;
+        @JsonProperty("relatedFlagFG2020")
+        private String relatedFlagFG2020;
+        @JsonProperty("displayNo")
+        private Integer displayNo;
+        @JsonProperty("srcIndex")
+        private Integer srcIndex;
+        @JsonProperty("kindName")
+        private String kindName;
+        @JsonProperty("shortRate")
+        private Integer shortRate;
+        @JsonProperty("discount")
+        private Integer discount;
+        @JsonProperty("adjustRate")
+        private Integer adjustRate;
+        @JsonProperty("noChange")
+        private Boolean noChange;
+        @JsonProperty("max")
+        private String max;
+        @JsonProperty("quantity")
+        private Integer quantity;
+        @JsonProperty("unitInsured")
+        private String unitInsured;
+        @JsonProperty("shareModel")
+        private String shareModel;
+        @JsonProperty("serviceTimes")
+        private String serviceTimes;
+
+        public static List<TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0802DtoListDTO> buildKindList(List<KindInfoVo> kindInfoVoList, String actualValue, Integer seatCount) {
+            List<TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0802DtoListDTO> kindList = new ArrayList<>();
+            for (KindInfoVo kindInfoVo : kindInfoVoList) {
+                TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0802DtoListDTO kind = new TaiPingCrawlerVehicleForPRPQueryRequest.PfItemKind0802DtoListDTO();
+                String kindCode = kindInfoVo.getKindCode();
+                KindCodeEnum kindCodeEnum = KindCodeEnum.valueOf("KCE_" + kindCode);
+                if (kindCodeEnum.getKindInd().equals("1")) {
+                    kind.setRiskCode("0802");
+                }
+                kind.setKindInd(kindCodeEnum.getKindInd());
+                kind.setKindCode(kindCode);
+                kind.setShortRate(100);
+                kind.setDiscount(100);
+                kind.setAdjustRate(100);
+                kind.setRelatedInd("0");
+                kind.setRelatedFlagFG2020("0");
+                kind.setRelatedFlagFG2020Type(false);
+                kind.setValueType("");
+                kind.setClauseType(false);
+                kind.setNoChange(true);
+                // 车损险
+                if (kindCodeEnum.getKindCode().equals("0301200") || kindCodeEnum.getKindCode().equals("0401200")) {
+                    kind.setSumInsured(actualValue);
+                    kind.setMax(actualValue);
+                    kind.setDisplayNo(0);
+                    kind.setSrcIndex(0);
+                    kind.setDeductible("0");
+                    kind.setDeductibleRate("");
+                    kind.setRelatedFlagFG2020("1");
+                    kind.setRelatedFlagFG2020Type(true);
+                }
+                // 三者险
+                if (kindCodeEnum.getKindCode().equals("0301600") || kindCodeEnum.getKindCode().equals("0401600")) {
+                    kind.setSumInsured(kindInfoVo.getAmount());
+                    kind.setDisplayNo(2);
+                    kind.setSrcIndex(2);
+                }
+                // 司机
+                if (kindCodeEnum.getKindCode().equals("0301701") || kindCodeEnum.getKindCode().equals("0401701") || kindCodeEnum.getKindCode().equals("0301011")) {
+                    kind.setQuantity(1);
+                    kind.setUnitInsured(kindInfoVo.getUnitAmount());
+                    kind.setSumInsured(kindInfoVo.getAmount());
+                    kind.setDisplayNo(4);
+                    kind.setSrcIndex(4);
+                }
+                // 乘客
+                if (kindCodeEnum.getKindCode().equals("0301702") || kindCodeEnum.getKindCode().equals("0401702") || kindCodeEnum.getKindCode().equals("0301012")) {
+                    kind.setQuantity(seatCount - 1);
+                    kind.setUnitInsured(kindInfoVo.getUnitAmount());
+                    kind.setSumInsured(String.valueOf(new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(seatCount - 1))));
+                    kind.setDisplayNo(6);
+                    kind.setSrcIndex(6);
+                }
+                // 绝对免赔率
+                if (kindCodeEnum.getKindCode().equals("0301008") || kindCodeEnum.getKindCode().equals("0301009") || kindCodeEnum.getKindCode().equals("0301010")) {
+                    kind.setDeductible(kindInfoVo.getDeductibleRate());
+                    kind.setDisplayNo(1);
+                    kind.setSrcIndex(1);
+                }
+                // 特约
+                if (kindCodeEnum.getKindCode().equals("0301003") || kindCodeEnum.getKindCode().equals("0301004")
+                        || kindCodeEnum.getKindCode().equals("0401003") || kindCodeEnum.getKindCode().equals("0401004")) {
+                    kind.setServiceTimes(kindInfoVo.getServiceTimes());
+                }
+                kindList.add(kind);
+            }
+            return kindList;
+        }
+    }
+    @NoArgsConstructor
+    @Data
+    public static class ClauseList0801DTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+
+        @JsonProperty("clauseCode")
+        private String clauseCode;
+
+        @JsonProperty("clauseCName")
+        private String clauseCName;
+
+        @JsonProperty("clauseTName")
+        private String clauseTName;
+
+        @JsonProperty("clauseEName")
+        private String clauseEName;
+
+        @JsonProperty("language")
+        private String language;
+
+        @JsonProperty("validDate")
+        private String validDate;
+
+        @JsonProperty("inValidDate")
+        private String inValidDate;
+
+        @JsonProperty("validInd")
+        private String validInd;
+
+        @JsonProperty("remark")
+        private String remark;
+
+        @JsonProperty("readOnlyInd")
+        private String readOnlyInd;
+
+        @JsonProperty("clauseContent")
+        private String clauseContent;
+
+        @JsonProperty("clauseCompanyCode")
+        private String clauseCompanyCode;
+
+        @JsonProperty("clauseType")
+        private String clauseType;
+
+        @JsonProperty("addedValueServiceType")
+        private String addedValueServiceType;
+
+        @JsonProperty("clauseUseType")
+        private String clauseUseType;
+
+        @JsonProperty("clausePrintType")
+        private String clausePrintType;
+
+        @JsonProperty("createTime")
+        private String createTime;
+
+        @JsonProperty("creatorCode")
+        private String creatorCode;
+
+        @JsonProperty("updaterCode")
+        private String updaterCode;
+
+        @JsonProperty("updateTime")
+        private String updateTime;
+
+        @JsonProperty("version")
+        private String version;
+
+        @JsonProperty("riskClass")
+        private String riskClass;
+
+        @JsonProperty("conflictRuleCodes")
+        private List<String> conflictRuleCodes;
+
+        @JsonProperty("relyRuleDto")
+        private String relyRuleDto;
+
+        @JsonProperty("productType")
+        private String productType;
+
+        @JsonProperty("matchRuleId")
+        private String matchRuleId;
+
+        @JsonProperty("editFlag")
+        private String editFlag;
+
+        @JsonProperty("associateClauseCodes")
+        private String associateClauseCodes;
+
+        @JsonProperty("isEndor")
+        private String isEndor;
+
+        @JsonProperty("ggClauseParameterVos")
+        private String ggClauseParameterVos;
+
+        @JsonProperty("clauseVariableArr")
+        private String clauseVariableArr;
+
+        @JsonProperty("showDelete")
+        private Boolean showDelete;
+
+        @JsonProperty("showEdit")
+        private Boolean showEdit;
+
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+
+        @JsonProperty("disabled")
+        private TaiPingCrawlerVehicleForPRPQueryRequest.ClauseList0801DTO.DisabledVo disabled;
+
+        @Data
+        public static class DisabledVo {
+            @JsonProperty("serialNo")
+            private Boolean serialNo;
+
+            @JsonProperty("clauseCode")
+            private Boolean clauseCode;
+
+            @JsonProperty("clauseContent")
+            private Boolean clauseContent;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ClauseList0802DTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+
+        @JsonProperty("clauseCode")
+        private String clauseCode;
+
+        @JsonProperty("clauseCName")
+        private String clauseCName;
+
+        @JsonProperty("clauseTName")
+        private String clauseTName;
+
+        @JsonProperty("clauseEName")
+        private String clauseEName;
+
+        @JsonProperty("language")
+        private String language;
+
+        @JsonProperty("validDate")
+        private String validDate;
+
+        @JsonProperty("inValidDate")
+        private String inValidDate;
+
+        @JsonProperty("validInd")
+        private String validInd;
+
+        @JsonProperty("remark")
+        private String remark;
+
+        @JsonProperty("readOnlyInd")
+        private String readOnlyInd;
+
+        @JsonProperty("clauseContent")
+        private String clauseContent;
+
+        @JsonProperty("clauseCompanyCode")
+        private String clauseCompanyCode;
+
+        @JsonProperty("clauseType")
+        private String clauseType;
+
+        @JsonProperty("addedValueServiceType")
+        private String addedValueServiceType;
+
+        @JsonProperty("clauseUseType")
+        private String clauseUseType;
+
+        @JsonProperty("clausePrintType")
+        private String clausePrintType;
+
+        @JsonProperty("createTime")
+        private String createTime;
+
+        @JsonProperty("creatorCode")
+        private String creatorCode;
+
+        @JsonProperty("updaterCode")
+        private String updaterCode;
+
+        @JsonProperty("updateTime")
+        private String updateTime;
+
+        @JsonProperty("version")
+        private String version;
+
+        @JsonProperty("riskClass")
+        private String riskClass;
+
+        @JsonProperty("conflictRuleCodes")
+        private List<String> conflictRuleCodes;
+
+        @JsonProperty("relyRuleDto")
+        private String relyRuleDto;
+
+        @JsonProperty("productType")
+        private String productType;
+
+        @JsonProperty("matchRuleId")
+        private String matchRuleId;
+
+        @JsonProperty("editFlag")
+        private String editFlag;
+
+        @JsonProperty("associateClauseCodes")
+        private String associateClauseCodes;
+
+        @JsonProperty("isEndor")
+        private String isEndor;
+
+        @JsonProperty("ggClauseParameterVos")
+        private String ggClauseParameterVos;
+
+        @JsonProperty("clauseVariableArr")
+        private String clauseVariableArr;
+
+        @JsonProperty("showDelete")
+        private Boolean showDelete;
+
+        @JsonProperty("showEdit")
+        private Boolean showEdit;
+
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+
+        @JsonProperty("disabled")
+        private TaiPingCrawlerVehicleForPRPQueryRequest.ClauseList0802DTO.DisabledVo disabled;
+
+        @Data
+        public static class DisabledVo {
+            @JsonProperty("serialNo")
+            private Boolean serialNo;
+
+            @JsonProperty("clauseCode")
+            private Boolean clauseCode;
+
+            @JsonProperty("clauseContent")
+            private Boolean clauseContent;
+        }
+    }
+
+}

+ 5 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/request/TaiPingCrawlersSubmitToAuditRequest.java

@@ -14,4 +14,9 @@ public class TaiPingCrawlersSubmitToAuditRequest {
     @JsonProperty("personInd")
     private String personInd;
 
+    public TaiPingCrawlersSubmitToAuditRequest(String orderNo) {
+        this.orderNo = orderNo;
+        this.personInd = "C";
+    }
+
 }

+ 29 - 7
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerBrandNameQueryData.java

@@ -32,7 +32,7 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
     private String jgErrorMsg;
 
     @JsonProperty("addParamList")
-    private List<String> addParamList;
+    private List<AddParamItem> addParamList;
 
     @JsonProperty("buttonMap")
     private ButtonMapDTO buttonMap;
@@ -55,6 +55,26 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
     @JsonProperty("manualOperation")
     private Boolean manualOperation;
 
+    @NoArgsConstructor
+    @Data
+    public static class AddParamItem {
+        @JsonProperty("inputType")
+        private String inputType;
+
+        @JsonProperty("inputCode")
+        private String inputCode;
+
+        @JsonProperty("inputName")
+        private String inputName;
+
+        @JsonProperty("inputValue")
+        private String inputValue;
+
+        @JsonProperty("codeType")
+        private String codeType;
+
+    }
+
     @NoArgsConstructor
     @Data
     public static class ButtonMapDTO implements Serializable {
@@ -78,8 +98,6 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
     @NoArgsConstructor
     @Data
     public static class ItemMotorDtoListDTO implements Serializable, CarModelsFilter {
-
-
         @Serial
         private static final long serialVersionUID = 7223203626043524051L;
 
@@ -174,11 +192,11 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
         @JsonProperty("addSeatCount")
         private Object addSeatCount;
         @JsonProperty("tonCount")
-        private Double tonCount;
+        private Integer tonCount;
         @JsonProperty("exhaustScale")
-        private Double exhaustScale;
+        private Integer exhaustScale;
         @JsonProperty("power")
-        private Double power;
+        private Integer power;
         @JsonProperty("maxDesignSpeed")
         private Object maxDesignSpeed;
         @JsonProperty("doorCount")
@@ -214,7 +232,7 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
         @JsonProperty("estimateValue")
         private Object estimateValue;
         @JsonProperty("purchasePrice")
-        private String purchasePrice;
+        private Double purchasePrice;
         @JsonProperty("actualValue")
         private Object actualValue;
         @JsonProperty("invoiceNo")
@@ -636,6 +654,10 @@ public class TaiPingCrawlerBrandNameQueryData implements Serializable {
         public String getSeatCount(){
             return String.valueOf(seatCount);
         }
+        @Override
+        public String getPurchasePrice(){
+            return String.valueOf(purchasePrice.intValue());
+        }
 
     }
 }

+ 167 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindApplyNoResponse.java

@@ -0,0 +1,167 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/5/26 9:27
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerFindApplyNoResponse{
+    @JsonProperty("gsApplyInfoMainDtos")
+    private List<GsApplyInfoMainDto> gsApplyInfoMainDtos;
+
+    @JsonProperty("applyNoDefault")
+    private String applyNoDefault;
+
+    @Data
+    public static class GsApplyInfoMainDto {
+
+        @JsonProperty("object_OrderBy")
+        private Object objectOrderBy;
+
+        @JsonProperty("object_Condition")
+        private Object objectCondition;
+
+        @JsonProperty("applyNo")
+        private String applyNo;
+
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+
+        @JsonProperty("modelNo")
+        private String modelNo;
+
+        @JsonProperty("applyType")
+        private String applyType;
+
+        @JsonProperty("companyCode")
+        private String companyCode;
+
+        @JsonProperty("channelCode")
+        private String channelCode;
+
+        @JsonProperty("riskCode")
+        private String riskCode;
+
+        @JsonProperty("status")
+        private String status;
+
+        @JsonProperty("validInd")
+        private String validInd;
+
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        @JsonProperty("operatorDate")
+        private String operatorDate;
+
+        @JsonProperty("remark")
+        private String remark;
+
+        @JsonProperty("permitChannelCode")
+        private String permitChannelCode;
+
+        @JsonProperty("policyHolderCode")
+        private String policyHolderCode;
+
+        @JsonProperty("insurantCode")
+        private String insurantCode;
+
+        @JsonProperty("agreementCode")
+        private String agreementCode;
+
+        @JsonProperty("startDate")
+        private String startDate;
+
+        @JsonProperty("endDate")
+        private String endDate;
+
+        @JsonProperty("riskClass")
+        private String riskClass;
+
+        @JsonProperty("applyName")
+        private String applyName;
+
+        @JsonProperty("oldSerialNo")
+        private Integer oldSerialNo;
+
+        @JsonProperty("applyModfiyInd")
+        private String applyModfiyInd;
+
+        @JsonProperty("useInd")
+        private String useInd;
+
+        @JsonProperty("serialNumberOa")
+        private String serialNumberOa;
+
+        @JsonProperty("carryonPercent")
+        private String carryonPercent;
+
+        @JsonProperty("inputType")
+        private String inputType;
+
+        @JsonProperty("businessFlagF")
+        private String businessFlagF;
+
+        @JsonProperty("assessCompany")
+        private String assessCompany;
+
+        @JsonProperty("decisionMakingUnit")
+        private String decisionMakingUnit;
+
+        @JsonProperty("dsMakingTypeDetail")
+        private String dsMakingTypeDetail;
+
+        @JsonProperty("solutionCode")
+        private String solutionCode;
+
+        @JsonProperty("cooperateSiteCode")
+        private String cooperateSiteCode;
+
+        @JsonProperty("applyInd")
+        private String applyInd;
+
+        @JsonProperty("thirdFlag")
+        private String thirdFlag;
+
+        @JsonProperty("updateDate")
+        private String updateDate;
+
+        @JsonProperty("riskClassName")
+        private String riskClassName;
+
+        @JsonProperty("companyName")
+        private String companyName;
+
+        @JsonProperty("assessCompanyName")
+        private String assessCompanyName;
+
+        @JsonProperty("channelName")
+        private String channelName;
+
+        @JsonProperty("applyTypeName")
+        private String applyTypeName;
+
+        @JsonProperty("planCode")
+        private String planCode;
+
+        @JsonProperty("planName")
+        private String planName;
+
+        @JsonProperty("intermediaryCode")
+        private String intermediaryCode;
+
+        @JsonProperty("intermediaryCodeName")
+        private String intermediaryCodeName;
+
+        @JsonProperty("gsApplyInfoFieldValueDtoList")
+        private Object gsApplyInfoFieldValueDtoList;
+    }
+}

+ 123 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindByProductCodeResponse.java

@@ -0,0 +1,123 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/5/22 11:42
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerFindByProductCodeResponse {
+    @JsonProperty("succ")
+    private boolean succ;
+
+    @JsonProperty("excId")
+    private String excId;
+
+    @JsonProperty("errCode")
+    private int errCode;
+
+    @JsonProperty("errType")
+    private String errType;
+
+    @JsonProperty("errMsg")
+    private String errMsg;
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @JsonProperty("exception")
+    private String exception;
+
+    @Data
+    public static class DataDTO {
+
+        @JsonProperty("total")
+        private int total;
+
+        @JsonProperty("code")
+        private String code;
+
+        @JsonProperty("msg")
+        private String msg;
+
+        @JsonProperty("records")
+        private List<Record> records;
+    }
+
+    @Data
+    public static class Record {
+
+        @JsonProperty("agreementTypeName")
+        private String agreementTypeName;
+
+        @JsonProperty("lables")
+        private String lables;
+
+        @JsonProperty("agreementCode")
+        private String agreementCode;
+
+        @JsonProperty("agreementNo")
+        private String agreementNo;
+
+        @JsonProperty("source")
+        private String source;
+
+        @JsonProperty("businessSource")
+        private String businessSource;
+
+        @JsonProperty("producerName")
+        private String producerName;
+
+        @JsonProperty("intermediaryCode")
+        private String intermediaryCode;
+
+        @JsonProperty("interSalesmanRegisterNo")
+        private String interSalesmanRegisterNo;
+
+        @JsonProperty("intermediaryCNName")
+        private String intermediaryCNName;
+
+        @JsonProperty("frontingCompany")
+        private String frontingCompany;
+
+        @JsonProperty("frontingCompanyName")
+        private String frontingCompanyName;
+
+        @JsonProperty("hengSangInd")
+        private String hengSangInd;
+
+        @JsonProperty("channelSortName")
+        private String channelSortName;
+
+        @JsonProperty("channelTip")
+        private String channelTip;
+
+        @JsonProperty("channelTipName")
+        private String channelTipName;
+
+        @JsonProperty("companyCode")
+        private String companyCode;
+
+        @JsonProperty("companyName")
+        private String companyName;
+
+        @JsonProperty("outerCompanyCode")
+        private String outerCompanyCode;
+
+        @JsonProperty("outerCompanyName")
+        private String outerCompanyName;
+
+        @JsonProperty("sourceId")
+        private String sourceId;
+
+        @JsonProperty("channelSort")
+        private String channelSort;
+    }
+}

+ 22 - 35
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerFindSolutionCodeData.java

@@ -4,18 +4,11 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.util.List;
 
 @NoArgsConstructor
 @Data
 public class TaiPingCrawlerFindSolutionCodeData {
 
-    @JsonProperty("records")
-    private List<RecordsDTO> records;
-
-    @JsonProperty("total")
-    private Integer total;
-
     @NoArgsConstructor
     @Data
     public static class RecordsDTO {
@@ -23,44 +16,38 @@ public class TaiPingCrawlerFindSolutionCodeData {
         @JsonProperty("solutionCode")
         private String solutionCode;
 
-        @JsonProperty("riskCode")
-        private String riskCode;
-
-        @JsonProperty("cooperateSiteCode")
-        private String cooperateSiteCode;
-
-        @JsonProperty("cooperateSiteCName")
-        private String cooperateSiteCName;
+        @JsonProperty("creditPeriod")
+        private String creditPeriod;
 
-        @JsonProperty("intermediaryCode")
-        private String intermediaryCode;
+        @JsonProperty("companyCode")
+        private String companyCode;
 
-        @JsonProperty("intermediaryCName")
-        private String intermediaryCName;
+        @JsonProperty("companyName")
+        private String companyName;
 
-        @JsonProperty("channelDetailCode")
-        private String channelDetailCode;
+        @JsonProperty("salesmanCode")
+        private String salesmanCode;
 
-        @JsonProperty("channelDetailName")
-        private String channelDetailName;
+        @JsonProperty("salesmanName")
+        private String salesmanName;
 
-        @JsonProperty("channelTip")
-        private String channelTip;
+        @JsonProperty("teamManager")
+        private String teamManager;
 
-        @JsonProperty("channelTipName")
-        private String channelTipName;
+        @JsonProperty("teamName")
+        private String teamName;
 
-        @JsonProperty("businessSource")
-        private String businessSource;
+        @JsonProperty("registerNo")
+        private String registerNo;
 
-        @JsonProperty("outerCompanyCode")
-        private Object outerCompanyCode;
+        @JsonProperty("taxRegistryNumber")
+        private String taxRegistryNumber;
 
-        @JsonProperty("agreementNo")
-        private String agreementNo;
+        @JsonProperty("cooperateSiteCode")
+        private String cooperateSiteCode;
 
-        @JsonProperty("rn")
-        private Integer rn;
+        @JsonProperty("cooperateSiteName")
+        private String cooperateSiteName;
     }
 
 }

+ 212 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerImageIntoOneFileResponse.java

@@ -0,0 +1,212 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/27 18:07
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerImageIntoOneFileResponse {
+    @JsonProperty("baseMsg")
+    private BaseMsg baseMsg;
+
+    @JsonProperty("exifMsg")
+    private ExifMsg exifMsg;
+
+    @JsonProperty("ocrMsg")
+    private OcrMsg ocrMsg;
+
+    @JsonProperty("imgUrls")
+    private ImgUrls imgUrls;
+
+    @JsonProperty("wordsReadOnly")
+    private String wordsReadOnly;
+
+    @JsonProperty("hiddenOperateBtn")
+    private String hiddenOperateBtn;
+
+    @JsonProperty("checkTrueResult")
+    private String checkTrueResult;
+
+    // ===================== 内部子实体 =====================
+    /** 基础文件信息 */
+    @Data
+    public static class BaseMsg {
+        @JsonProperty("fileName")
+        private String fileName;
+
+        @JsonProperty("fileTypeCName")
+        private String fileTypeCName;
+
+        @JsonProperty("fileRemark")
+        private String fileRemark;
+
+        @JsonProperty("uploadUserId")
+        private String uploadUserId;
+
+        @JsonProperty("uploadUserName")
+        private String uploadUserName;
+
+        @JsonProperty("uploadTime")
+        private String uploadTime;
+
+        @JsonProperty("uploadComCName")
+        private String uploadComCName;
+
+        @JsonProperty("dataSource")
+        private String dataSource;
+    }
+
+    /** 图片EXIF信息 */
+    @Data
+    public static class ExifMsg {
+        @JsonProperty("takeTime")
+        private String takeTime;
+
+        @JsonProperty("fileSpecs")
+        private String fileSpecs;
+    }
+
+    /** OCR识别信息 */
+    @Data
+    public static class OcrMsg {
+        @JsonProperty("licenseNo")
+        private OcrItem licenseNo;
+
+        @JsonProperty("vehicleCategory")
+        private OcrItem vehicleCategory;
+
+        @JsonProperty("name")
+        private OcrItem name;
+
+        @JsonProperty("useNatureShow")
+        private OcrItem useNatureShow;
+
+        @JsonProperty("printBrandName")
+        private OcrItem printBrandName;
+
+        @JsonProperty("frameNo")
+        private OcrItem frameNo;
+
+        @JsonProperty("engineNo")
+        private OcrItem engineNo;
+
+        @JsonProperty("registerDate")
+        private OcrItem registerDate;
+
+        @JsonProperty("certificateDate")
+        private OcrItem certificateDate;
+
+        @JsonProperty("address")
+        private OcrItem address;
+
+        @JsonProperty("scoreSholdValue")
+        private String scoreSholdValue;
+    }
+
+    /** OCR单项通用实体 */
+    @Data
+    public static class OcrItem {
+        @JsonProperty("chinaName")
+        private String chinaName;
+
+        @JsonProperty("words")
+        private String words;
+
+        @JsonProperty("seqNo")
+        private String seqNo;
+
+        @JsonProperty("score")
+        private String score;
+
+        @JsonProperty("position")
+        private String position;
+
+        @JsonProperty("itemProvinceCode")
+        private String itemProvinceCode;
+
+        @JsonProperty("itemCityCode")
+        private String itemCityCode;
+
+        @JsonProperty("itemProvinceCName")
+        private String itemProvinceCName;
+
+        @JsonProperty("itemCityCName")
+        private String itemCityCName;
+
+        @JsonProperty("countyCode")
+        private String countyCode;
+
+        @JsonProperty("countyCName")
+        private String countyCName;
+    }
+
+    /** 图片地址&上传信息 */
+    @Data
+    public static class ImgUrls {
+        @JsonProperty("infoMainId")
+        private String infoMainId;
+
+        @JsonProperty("fileName")
+        private String fileName;
+
+        @JsonProperty("isDiscern")
+        private String isDiscern;
+
+        @JsonProperty("discernStatus")
+        private String discernStatus;
+
+        @JsonProperty("isUploadImg")
+        private String isUploadImg;
+
+        @JsonProperty("fileType")
+        private String fileType;
+
+        @JsonProperty("fileAllType")
+        private String[] fileAllType;
+
+        @JsonProperty("pdfName")
+        private String pdfName;
+
+        @JsonProperty("pdfUrl")
+        private String pdfUrl;
+
+        @JsonProperty("isCoreData")
+        private String isCoreData;
+
+        @JsonProperty("imageName")
+        private String imageName;
+
+        @JsonProperty("fileEcmType")
+        private String fileEcmType;
+
+        @JsonProperty("docFileName")
+        private String docFileName;
+
+        @JsonProperty("docFilePath")
+        private String docFilePath;
+
+        @JsonProperty("docFileType")
+        private String docFileType;
+
+        @JsonProperty("ecmPageUrl")
+        private String ecmPageUrl;
+
+        @JsonProperty("uploadTime")
+        private String uploadTime;
+
+        @JsonProperty("imgExtraPos")
+        private String imgExtraPos;
+
+        @JsonProperty("userMarkState")
+        private String userMarkState;
+
+        @JsonProperty("md5No")
+        private String md5No;
+    }
+}

+ 327 - 295
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerPremiumCalculateData.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.taiping.crawler.entity.response;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.taiping.crawler.entity.request.TaiPingCrawlerPremiumCalculateRequest;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -238,263 +239,215 @@ public class TaiPingCrawlerPremiumCalculateData {
     @NoArgsConstructor
     @Data
     public static class PfItemKindDto0801DTO {
-        @JsonProperty("nodeBtGrossPremium")
-        private Object nodeBtGrossPremium;
-        @JsonProperty("proposalNo")
-        private String proposalNo;
-        @JsonProperty("riskCode")
-        private String riskCode;
-        @JsonProperty("itemKindNo")
-        private Integer itemKindNo;
-        @JsonProperty("itemCode")
-        private Object itemCode;
-        @JsonProperty("itemDetailCode")
-        private Object itemDetailCode;
-        @JsonProperty("itemDetailList")
-        private Object itemDetailList;
-        @JsonProperty("liabCode")
-        private String liabCode;
-        @JsonProperty("kindName")
-        private String kindName;
-        @JsonProperty("modeCode")
-        private Object modeCode;
-        @JsonProperty("modeName")
-        private Object modeName;
-        @JsonProperty("startDate")
-        private Object startDate;
-        @JsonProperty("endDate")
-        private Object endDate;
-        @JsonProperty("calculateInd")
-        private String calculateInd;
-        @JsonProperty("currency")
-        private String currency;
-        @JsonProperty("unitValue")
-        private Object unitValue;
-        @JsonProperty("unitInsured")
-        private Object unitInsured;
-        @JsonProperty("unitPremium")
-        private Object unitPremium;
-        @JsonProperty("quantity")
-        private Object quantity;
-        @JsonProperty("unit")
-        private Object unit;
-        @JsonProperty("sumValue")
-        private Object sumValue;
-        @JsonProperty("sumInsured")
-        private Double sumInsured;
-        @JsonProperty("ratePeriod")
-        private Object ratePeriod;
-        @JsonProperty("rate")
-        private Object rate;
-        @JsonProperty("shortRateFlag")
-        private String shortRateFlag;
-        @JsonProperty("shortRateNumerator")
-        private Double shortRateNumerator;
-        @JsonProperty("shortRateDenominator")
-        private Integer shortRateDenominator;
-        @JsonProperty("shortRate")
-        private Double shortRate;
+        @JsonProperty("addTax")
+        private Double addTax;
+        @JsonProperty("addTaxRate")
+        private Double addTaxRate;
+        @JsonProperty("additionalRate")
+        private Object additionalRate;
+        @JsonProperty("adjustRate")
+        private Double adjustRate;
+        @JsonProperty("allBrokenRate")
+        private Object allBrokenRate;
+        @JsonProperty("assistKindFlag")
+        private Object assistKindFlag;
         @JsonProperty("basePremium")
         private Double basePremium;
-        @JsonProperty("pureBenchPremium")
-        private Object pureBenchPremium;
         @JsonProperty("basePureBenchPremium")
         private Object basePureBenchPremium;
         @JsonProperty("benchmarkPremium")
         private Double benchmarkPremium;
-        @JsonProperty("noDebtPremium")
-        private Object noDebtPremium;
-        @JsonProperty("loading")
-        private Object loading;
-        @JsonProperty("grossPremium")
-        private Double grossPremium;
-        @JsonProperty("discount")
-        private Double discount;
-        @JsonProperty("adjustRate")
-        private Double adjustRate;
-        @JsonProperty("netPremium")
-        private Double netPremium;
-        @JsonProperty("deductibleRate")
-        private Object deductibleRate;
+        @JsonProperty("calcMedicalModel")
+        private String calcMedicalModel;
+        @JsonProperty("calculateInd")
+        private String calculateInd;
+        @JsonProperty("currency")
+        private String currency;
         @JsonProperty("deductible")
         private Object deductible;
-        @JsonProperty("premiumFormula")
-        private Object premiumFormula;
-        @JsonProperty("yearPremium")
-        private Object yearPremium;
-        @JsonProperty("surrenderInd")
-        private String surrenderInd;
+        @JsonProperty("deductibleList")
+        private Object deductibleList;
+        @JsonProperty("deductibleRate")
+        private Object deductibleRate;
+        @JsonProperty("discount")
+        private Double discount;
+        @JsonProperty("easyKindName")
+        private Object easyKindName;
+        @JsonProperty("endDate")
+        private Object endDate;
+        @JsonProperty("endorAdjustRate")
+        private Double endorAdjustRate;
+        @JsonProperty("endorPolicyNo")
+        private String endorPolicyNo;
         @JsonProperty("firstLossRate")
         private Object firstLossRate;
-        @JsonProperty("kindInd")
-        private String kindInd;
-        @JsonProperty("suitProduct")
-        private Object suitProduct;
-        @JsonProperty("assistKindFlag")
-        private Object assistKindFlag;
-        @JsonProperty("remark")
-        private Object remark;
         @JsonProperty("flag")
         private Object flag;
-        @JsonProperty("uwCount")
-        private Object uwCount;
-        @JsonProperty("uwPremium")
-        private Double uwPremium;
-        @JsonProperty("originUWPremium")
-        private Double originUWPremium;
-        @JsonProperty("originGrossPremium")
-        private Double originGrossPremium;
-        @JsonProperty("relatedInd")
-        private Object relatedInd;
-        @JsonProperty("endorAdjustRate")
-        private Double endorAdjustRate;
-        @JsonProperty("pubInsuredInd")
-        private Object pubInsuredInd;
-        @JsonProperty("specialInd")
-        private Object specialInd;
-        @JsonProperty("subProposalNo")
-        private String subProposalNo;
-        @JsonProperty("projectCode")
-        private Object projectCode;
+        @JsonProperty("franchise")
+        private Double franchise;
+        @JsonProperty("grossPremium")
+        private Double grossPremium;
+        @JsonProperty("isExist")
+        private String isExist;
+        @JsonProperty("itemCode")
+        private Object itemCode;
+        @JsonProperty("itemDetailCode")
+        private Object itemDetailCode;
+        @JsonProperty("itemDetailList")
+        private Object itemDetailList;
         @JsonProperty("itemDetailNo")
         private Integer itemDetailNo;
+        @JsonProperty("itemKindNo")
+        private Integer itemKindNo;
         @JsonProperty("kindCode")
         private String kindCode;
+        @JsonProperty("kindCode_kindName")
+        private String kindCode_kindName;
+        @JsonProperty("kindInd")
+        private String kindInd;
+        @JsonProperty("kindName")
+        private String kindName;
+        @JsonProperty("liabCode")
+        private String liabCode;
+        @JsonProperty("loading")
+        private Object loading;
+        @JsonProperty("modeCode")
+        private Object modeCode;
+        @JsonProperty("modeName")
+        private Object modeName;
         @JsonProperty("mustInsureInd")
         private Object mustInsureInd;
+        @JsonProperty("netPremium")
+        private Double netPremium;
+        @JsonProperty("noDebtPremium")
+        private Object noDebtPremium;
+        @JsonProperty("nodeBtGrossPremium")
+        private Object nodeBtGrossPremium;
+        @JsonProperty("orgPriceTaxTotal")
+        private Double orgPriceTaxTotal;
+        @JsonProperty("originGrossPremium")
+        private Double originGrossPremium;
+        @JsonProperty("originUWPremium")
+        private Double originUWPremium;
+        @JsonProperty("premiumFormula")
+        private Object premiumFormula;
         @JsonProperty("premiumType")
         private Object premiumType;
-        @JsonProperty("valueType")
-        private Object valueType;
-        @JsonProperty("franchise")
-        private Double franchise;
-        @JsonProperty("reSpecialInd")
-        private String reSpecialInd;
-        @JsonProperty("additionalRate")
-        private Object additionalRate;
-        @JsonProperty("allBrokenRate")
-        private Object allBrokenRate;
-        @JsonProperty("addTax")
-        private Double addTax;
-        @JsonProperty("addTaxRate")
-        private Double addTaxRate;
         @JsonProperty("priceTaxTotal")
         private Double priceTaxTotal;
-        @JsonProperty("orgPriceTaxTotal")
-        private Double orgPriceTaxTotal;
-        @JsonProperty("serviceTimes")
-        private Object serviceTimes;
+        @JsonProperty("projectCode")
+        private Object projectCode;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("pubInsuredInd")
+        private Object pubInsuredInd;
+        @JsonProperty("pureBenchPremium")
+        private Object pureBenchPremium;
+        @JsonProperty("quantity")
+        private Object quantity;
+        @JsonProperty("rate")
+        private Object rate;
+        @JsonProperty("ratePeriod")
+        private Object ratePeriod;
+        @JsonProperty("reSpecialInd")
+        private Object reSpecialInd;
         @JsonProperty("relatedFlagFG2020")
         private Object relatedFlagFG2020;
+        @JsonProperty("relatedInd")
+        private Object relatedInd;
+        @JsonProperty("relieveFund")
+        private Double relieveFund;
+        @JsonProperty("remark")
+        private Object remark;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("riskShareModelSwitch")
+        private Object riskShareModelSwitch;
         @JsonProperty("scUpdateTime")
         private String scUpdateTime;
-        @JsonProperty("useFormula")
-        private Object useFormula;
-        @JsonProperty("easyKindName")
-        private Object easyKindName;
+        @JsonProperty("serviceTimes")
+        private Object serviceTimes;
+        @JsonProperty("shareList")
+        private Object shareList;
         @JsonProperty("shareModel")
         private Object shareModel;
-        @JsonProperty("riskShareModelSwitch")
-        private Object riskShareModelSwitch;
-        @JsonProperty("deductibleList")
-        private Object deductibleList;
+        @JsonProperty("shortRate")
+        private Double shortRate;
+        @JsonProperty("shortRateDenominator")
+        private Integer shortRateDenominator;
+        @JsonProperty("shortRateFlag")
+        private String shortRateFlag;
+        @JsonProperty("shortRateNumerator")
+        private Double shortRateNumerator;
+        @JsonProperty("specialInd")
+        private Object specialInd;
+        @JsonProperty("startDate")
+        private Object startDate;
+        @JsonProperty("subProposalNo")
+        private String subProposalNo;
+        @JsonProperty("suitProduct")
+        private Object suitProduct;
+        @JsonProperty("sumInsured")
+        private Double sumInsured;
+        @JsonProperty("sumValue")
+        private Object sumValue;
+        @JsonProperty("surrenderInd")
+        private String surrenderInd;
+        @JsonProperty("unit")
+        private Object unit;
+        @JsonProperty("unitInsured")
+        private Object unitInsured;
+        @JsonProperty("unitPremium")
+        private Object unitPremium;
+        @JsonProperty("unitValue")
+        private Object unitValue;
+        @JsonProperty("useFormula")
+        private Object useFormula;
+        @JsonProperty("uwCount")
+        private Object uwCount;
+        @JsonProperty("uwPremium")
+        private Double uwPremium;
+        @JsonProperty("valueType")
+        private Object valueType;
+        @JsonProperty("yearPremium")
+        private Object yearPremium;
     }
 
     @NoArgsConstructor
     @Data
     public static class PfCarShipTaxDTO {
-        @JsonProperty("proposalNo")
-        private String proposalNo;
-        @JsonProperty("itemNo")
-        private Integer itemNo;
-        @JsonProperty("taxItemCode")
-        private Object taxItemCode;
-        @JsonProperty("taxItemName")
-        private Object taxItemName;
-        @JsonProperty("taxItemDetailCode")
-        private String taxItemDetailCode;
-        @JsonProperty("taxItemDetailName")
-        private String taxItemDetailName;
-        @JsonProperty("baseTaxation")
-        private Object baseTaxation;
-        @JsonProperty("taxPayerCode")
-        private Object taxPayerCode;
-        @JsonProperty("taxPayerName")
-        private String taxPayerName;
-        @JsonProperty("identifyNumber")
-        private String identifyNumber;
-        @JsonProperty("taxpayerIdentifier")
-        private String taxpayerIdentifier;
-        @JsonProperty("taxPayFlag")
-        private Object taxPayFlag;
-        @JsonProperty("taxRelifFlag")
-        private String taxRelifFlag;
-        @JsonProperty("taxRelifFlagLogo")
-        private String taxRelifFlagLogo;
-        @JsonProperty("relifReason")
-        private String relifReason;
-        @JsonProperty("freeRate")
-        private Double freeRate;
-        @JsonProperty("taxDocumentDate")
-        private Object taxDocumentDate;
-        @JsonProperty("taxPaidAreaCode")
-        private String taxPaidAreaCode;
-        @JsonProperty("freeRateText")
-        private Object freeRateText;
-        @JsonProperty("taxCompancyCode")
-        private String taxCompancyCode;
-        @JsonProperty("taxCompancyName")
-        private String taxCompancyName;
-        @JsonProperty("paidFreeCertificate")
-        private String paidFreeCertificate;
-        @JsonProperty("taxUnit")
-        private Object taxUnit;
-        @JsonProperty("taxUnitText")
-        private Object taxUnitText;
-        @JsonProperty("calculateMode")
-        private String calculateMode;
+        @JsonProperty("billNo")
+        private Object billNo;
+        @JsonProperty("billType")
+        private Object billType;
+        @JsonProperty("baseTaxation")
+        private Object baseTaxation;
+        @JsonProperty("calcTaxFlag")
+        private String calcTaxFlag;
         @JsonProperty("calculateFlag")
         private String calculateFlag;
-        @JsonProperty("finalFlag")
-        private Object finalFlag;
+        @JsonProperty("calculateMode")
+        private String calculateMode;
+        @JsonProperty("carFindDate")
+        private Object carFindDate;
+        @JsonProperty("certiType")
+        private String certiType;
+        @JsonProperty("cityCode")
+        private String cityCode;
+        @JsonProperty("cityName")
+        private String cityName;
         @JsonProperty("completeKerbMass")
         private Double completeKerbMass;
-        @JsonProperty("seatCount")
-        private Object seatCount;
-        @JsonProperty("tonCount")
-        private Object tonCount;
+        @JsonProperty("countyCode")
+        private String countyCode;
+        @JsonProperty("countyName")
+        private String countyName;
+        @JsonProperty("deductionDueType")
+        private String deductionDueType;
+        @JsonProperty("detailedAddress")
+        private String detailedAddress;
         @JsonProperty("exhaustScale")
         private Object exhaustScale;
-        @JsonProperty("payLastYear")
-        private String payLastYear;
-        @JsonProperty("payLastEndDate")
-        private String payLastEndDate;
-        @JsonProperty("taxDue")
-        private Double taxDue;
-        @JsonProperty("taxDueActual")
-        private Double taxDueActual;
-        @JsonProperty("taxRelief")
-        private Double taxRelief;
-        @JsonProperty("previousPay")
-        private Double previousPay;
-        @JsonProperty("payStartDate")
-        private Object payStartDate;
-        @JsonProperty("payEndDate")
-        private Object payEndDate;
-        @JsonProperty("lateFee")
-        private Double lateFee;
-        @JsonProperty("lateFeeStartDate")
-        private Object lateFeeStartDate;
-        @JsonProperty("lateFeeEndDate")
-        private Object lateFeeEndDate;
-        @JsonProperty("sumPayTax")
-        private Double sumPayTax;
-        @JsonProperty("currency")
-        private Object currency;
-        @JsonProperty("leviedDate")
-        private Object leviedDate;
-        @JsonProperty("payTaxTimes")
-        private Object payTaxTimes;
         @JsonProperty("extendChar1")
         private Object extendChar1;
         @JsonProperty("extendChar2")
@@ -503,102 +456,165 @@ public class TaiPingCrawlerPremiumCalculateData {
         private Object extendNum1;
         @JsonProperty("extendNum2")
         private Object extendNum2;
+        @JsonProperty("fine")
+        private Object fine;
         @JsonProperty("flag")
         private Object flag;
-        @JsonProperty("certiType")
-        private String certiType;
-        @JsonProperty("vehicleCategory")
-        private String vehicleCategory;
-        @JsonProperty("taxPayerAddress")
-        private Object taxPayerAddress;
-        @JsonProperty("taxPayerPhoneNumber")
-        private String taxPayerPhoneNumber;
-        @JsonProperty("totalTonCount")
-        private Object totalTonCount;
-        @JsonProperty("tractionTonCount")
-        private Object tractionTonCount;
+        @JsonProperty("finalFlag")
+        private Object finalFlag;
+        @JsonProperty("freeRate")
+        private Double freeRate;
+        @JsonProperty("freeRateText")
+        private Object freeRateText;
+        @JsonProperty("fuelType")
+        private String fuelType;
+        @JsonProperty("fuelTypeCST")
+        private String fuelTypeCST;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("itemAddress")
+        private String itemAddress;
+        @JsonProperty("itemNo")
+        private Integer itemNo;
+        @JsonProperty("lateFee")
+        private Double lateFee;
+        @JsonProperty("lateFeeStartDate")
+        private Object lateFeeStartDate;
+        @JsonProperty("lateFeeEndDate")
+        private Object lateFeeEndDate;
+        @JsonProperty("leviedDate")
+        private Object leviedDate;
+        @JsonProperty("microcomputerCode")
+        private Object microcomputerCode;
         @JsonProperty("newLicenseFlag")
         private String newLicenseFlag;
         @JsonProperty("newLicenseCheckMon")
         private Object newLicenseCheckMon;
-        @JsonProperty("fine")
-        private Object fine;
         @JsonProperty("offerFlag")
         private String offerFlag;
+        @JsonProperty("offerSerialNo")
+        private Object offerSerialNo;
+        @JsonProperty("paidFreeCertificate")
+        private String paidFreeCertificate;
         @JsonProperty("paidFeeCertiRefNo")
         private Object paidFeeCertiRefNo;
-        @JsonProperty("billType")
-        private Object billType;
+        @JsonProperty("payStartDate")
+        private Object payStartDate;
+        @JsonProperty("payEndDate")
+        private Object payEndDate;
+        @JsonProperty("payLastEndDate")
+        private String payLastEndDate;
+        @JsonProperty("payLastYear")
+        private String payLastYear;
+        @JsonProperty("payTaxChange")
+        private Object payTaxChange;
+        @JsonProperty("payTaxTimes")
+        private Object payTaxTimes;
+        @JsonProperty("previousPay")
+        private Double previousPay;
+        @JsonProperty("previousPayYears")
+        private Object previousPayYears;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("provinceCode")
+        private String provinceCode;
+        @JsonProperty("provinceName")
+        private String provinceName;
+        @JsonProperty("refundTaxDue")
+        private Object refundTaxDue;
         @JsonProperty("regionCode")
         private Object regionCode;
-        @JsonProperty("taxBusinessNo")
-        private Object taxBusinessNo;
-        @JsonProperty("sourceTaxBusinessNo")
-        private Object sourceTaxBusinessNo;
-        @JsonProperty("billNo")
-        private Object billNo;
+        @JsonProperty("relifReason")
+        private String relifReason;
         @JsonProperty("responseMessageNo")
         private Object responseMessageNo;
         @JsonProperty("responseCode")
         private Object responseCode;
+        @JsonProperty("reMoreFillMsg")
+        private Object reMoreFillMsg;
+        @JsonProperty("seatCount")
+        private Object seatCount;
+        @JsonProperty("sourceTaxBusinessNo")
+        private Object sourceTaxBusinessNo;
         @JsonProperty("subProposalNo")
         private String subProposalNo;
-        @JsonProperty("taxTermTypeCode")
-        private String taxTermTypeCode;
-        @JsonProperty("taxRegistryNumber")
-        private String taxRegistryNumber;
+        @JsonProperty("sumPayTax")
+        private Double sumPayTax;
+        @JsonProperty("sumRefundTax")
+        private Object sumRefundTax;
+        @JsonProperty("taxBusinessNo")
+        private Object taxBusinessNo;
+        @JsonProperty("taxCompancyCode")
+        private String taxCompancyCode;
+        @JsonProperty("taxCompancyName")
+        private String taxCompancyName;
         @JsonProperty("taxDescription")
         private Object taxDescription;
-        @JsonProperty("payTaxChange")
-        private Object payTaxChange;
-        @JsonProperty("deductionDueType")
-        private String deductionDueType;
-        @JsonProperty("taxStartDate")
-        private String taxStartDate;
+        @JsonProperty("taxDocumentDate")
+        private Object taxDocumentDate;
+        @JsonProperty("taxDue")
+        private Double taxDue;
+        @JsonProperty("taxDueActual")
+        private Double taxDueActual;
         @JsonProperty("taxEndDate")
         private String taxEndDate;
-        @JsonProperty("offerSerialNo")
-        private Object offerSerialNo;
-        @JsonProperty("microcomputerCode")
-        private Object microcomputerCode;
-        @JsonProperty("fuelType")
-        private String fuelType;
-        @JsonProperty("carFindDate")
-        private Object carFindDate;
-        @JsonProperty("fuelTypeCST")
-        private String fuelTypeCST;
-        @JsonProperty("useNatureCode")
-        private String useNatureCode;
-        @JsonProperty("provinceCode")
-        private String provinceCode;
-        @JsonProperty("provinceName")
-        private String provinceName;
-        @JsonProperty("cityCode")
-        private String cityCode;
-        @JsonProperty("cityName")
-        private String cityName;
-        @JsonProperty("countyCode")
-        private String countyCode;
-        @JsonProperty("countyName")
-        private String countyName;
-        @JsonProperty("detailedAddress")
-        private String detailedAddress;
-        @JsonProperty("sumRefundTax")
-        private Object sumRefundTax;
-        @JsonProperty("reMoreFillMsg")
-        private Object reMoreFillMsg;
-        @JsonProperty("refundTaxDue")
-        private Object refundTaxDue;
-        @JsonProperty("calcTaxFlag")
-        private String calcTaxFlag;
+        @JsonProperty("taxItemCode")
+        private Object taxItemCode;
+        @JsonProperty("taxItemName")
+        private Object taxItemName;
+        @JsonProperty("taxItemDetailCode")
+        private String taxItemDetailCode;
+        @JsonProperty("taxItemDetailName")
+        private String taxItemDetailName;
+        @JsonProperty("taxPaidAreaCode")
+        private String taxPaidAreaCode;
+        @JsonProperty("taxPayerCode")
+        private Object taxPayerCode;
+        @JsonProperty("taxPayerName")
+        private String taxPayerName;
+        @JsonProperty("taxPayerPhoneNumber")
+        private String taxPayerPhoneNumber;
+        @JsonProperty("taxPayerAddress")
+        private Object taxPayerAddress;
+        @JsonProperty("taxPayFlag")
+        private Object taxPayFlag;
         @JsonProperty("taxPaymentMark")
         private String taxPaymentMark;
+        @JsonProperty("taxRegistryNumber")
+        private String taxRegistryNumber;
+        @JsonProperty("taxRelief")
+        private Double taxRelief;
+        @JsonProperty("taxRelifFlag")
+        private String taxRelifFlag;
+        @JsonProperty("taxRelifFlagLogo")
+        private String taxRelifFlagLogo;
+        @JsonProperty("taxStartDate")
+        private String taxStartDate;
         @JsonProperty("taxStandardType")
         private Object taxStandardType;
+        @JsonProperty("taxTermTypeCode")
+        private String taxTermTypeCode;
+        @JsonProperty("taxpayerIdentifier")
+        private String taxpayerIdentifier;
         @JsonProperty("taxPaidAreaName")
         private Object taxPaidAreaName;
-        @JsonProperty("previousPayYears")
-        private Object previousPayYears;
+        @JsonProperty("taxUnit")
+        private Object taxUnit;
+        @JsonProperty("taxUnitText")
+        private Object taxUnitText;
+        @JsonProperty("tonCount")
+        private Object tonCount;
+        @JsonProperty("totalTonCount")
+        private Object totalTonCount;
+        @JsonProperty("tractionTonCount")
+        private Object tractionTonCount;
+
+        @JsonProperty("useNatureCode")
+        private String useNatureCode;
+        @JsonProperty("vehicleCategory")
+        private String vehicleCategory;
     }
 
     @NoArgsConstructor
@@ -1236,9 +1252,9 @@ public class TaiPingCrawlerPremiumCalculateData {
         @JsonProperty("riskClass")
         private String riskClass;
         @JsonProperty("conflictRuleCodes")
-        private Object conflictRuleCodes;
+        private List<String> conflictRuleCodes;
         @JsonProperty("relyRuleDto")
-        private Object relyRuleDto;
+        private String relyRuleDto;
         @JsonProperty("productType")
         private String productType;
         @JsonProperty("matchRuleId")
@@ -1246,13 +1262,21 @@ public class TaiPingCrawlerPremiumCalculateData {
         @JsonProperty("editFlag")
         private String editFlag;
         @JsonProperty("associateClauseCodes")
-        private Object associateClauseCodes;
+        private String associateClauseCodes;
         @JsonProperty("isEndor")
         private String isEndor;
         @JsonProperty("ggClauseParameterVos")
-        private Object ggClauseParameterVos;
+        private String ggClauseParameterVos;
         @JsonProperty("clauseVariableArr")
-        private Object clauseVariableArr;
+        private String clauseVariableArr;
+        @JsonProperty("showDelete")
+        private boolean showDelete;
+        @JsonProperty("showEdit")
+        private boolean showEdit;
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+        @JsonProperty("disabled")
+        private TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO.DisabledVo Disabled;
     }
 
     @NoArgsConstructor
@@ -1307,7 +1331,7 @@ public class TaiPingCrawlerPremiumCalculateData {
         @JsonProperty("conflictRuleCodes")
         private List<String> conflictRuleCodes;
         @JsonProperty("relyRuleDto")
-        private Object relyRuleDto;
+        private String relyRuleDto;
         @JsonProperty("productType")
         private String productType;
         @JsonProperty("matchRuleId")
@@ -1315,13 +1339,21 @@ public class TaiPingCrawlerPremiumCalculateData {
         @JsonProperty("editFlag")
         private String editFlag;
         @JsonProperty("associateClauseCodes")
-        private Object associateClauseCodes;
+        private String associateClauseCodes;
         @JsonProperty("isEndor")
         private String isEndor;
         @JsonProperty("ggClauseParameterVos")
-        private List<String> ggClauseParameterVos;
+        private String ggClauseParameterVos;
         @JsonProperty("clauseVariableArr")
-        private Object clauseVariableArr;
+        private String clauseVariableArr;
+        @JsonProperty("showDelete")
+        private boolean showDelete;
+        @JsonProperty("showEdit")
+        private boolean showEdit;
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+        @JsonProperty("disabled")
+        private TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO.DisabledVo Disabled;
     }
 
     @NoArgsConstructor

+ 1 - 1
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerQueryListData.java

@@ -87,7 +87,7 @@ public class TaiPingCrawlerQueryListData {
         @JsonProperty("validatemsgFlag")
         private String validatemsgFlag;
         @JsonProperty("policyNo")
-        private Object policyNo;
+        private String policyNo;
         @JsonProperty("poaSerialNo")
         private Object poaSerialNo;
         @JsonProperty("policySort")

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

@@ -1,9 +1,51 @@
 package com.jzg.quotation.taiping.crawler.entity.response;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
 public class TaiPingCrawlerSubmitValidateData {
 
+    @JsonProperty("responseType")
+    private String responseType;
+
+    @JsonProperty("submitValidateResultDto")
+    private SubmitValidateResultDto submitValidateResultDto;
+
+    @JsonProperty("submitAuditResultDto")
+    private Object submitAuditResultDto;
+
+    @JsonProperty("discernFailedIds")
+    private Object discernFailedIds;
+
+    @JsonProperty("underWriteInd")
+    private Object underWriteInd;
+
+    @JsonProperty("unMarkedImgList")
+    private Object unMarkedImgList;
+
+    @JsonProperty("scPfMatchResDto0801List")
+    private Object scPfMatchResDto0801List;
+
+    @JsonProperty("scPfMatchResDto0802List")
+    private Object scPfMatchResDto0802List;
 
+    @JsonProperty("originScList0801")
+    private Object originScList0801;
 
+    @JsonProperty("originScList0802")
+    private Object originScList0802List;
 
+    @Data
+    public static class SubmitValidateResultDto{
+        @JsonProperty("resultType")
+        private String resultType;
 
+        @JsonProperty("pfModuleValidateResultDtoList")
+        private List<?> pfModuleValidateResultDtoList;
+    }
 }

+ 22 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingCrawlerVehicleForPRPQueryResponse.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/5/27 21:23
+ */
+
+@Data
+@NoArgsConstructor
+public class TaiPingCrawlerVehicleForPRPQueryResponse {
+    @JsonProperty("isCIModeCodeQueryLocalVehicle")
+    private String isCIModeCodeQueryLocalVehicle;
+
+    @JsonProperty("itemMotorDtoList")
+    private List<TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO> itemMotorDtoList;
+}

+ 19 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaiPingHzResponse.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/21 17:36
+ */
+@NoArgsConstructor
+@Data
+public class TaiPingHzResponse {
+    @JsonProperty("res_fN4B1rBS")
+    private String fN4B1rBS;
+
+    @JsonProperty("res_hiOoKhrU")
+    private String hiOoKhrU;
+}

+ 21 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/entity/response/TaipingCkResponse.java

@@ -0,0 +1,21 @@
+package com.jzg.quotation.taiping.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/5/21 16:57
+ */
+
+@NoArgsConstructor
+@Data
+public class TaipingCkResponse {
+    @JsonProperty("xxuhoztF0eZsO")
+    private String xxuhoztF0eZsO;
+    @JsonProperty("GW_TOKEN_tbatwgw-wan-sc")
+    private String gwTokenTbatwgwwansc;
+    @JsonProperty("xxuhoztF0eZsP")
+    private String xxuhoztF0eZsP;
+}

+ 3 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/repository/TaiPingCrawlerOrderRepository.java

@@ -2,7 +2,10 @@ package com.jzg.quotation.taiping.crawler.repository;
 
 import com.jzg.quotation.commons.repository.BaseRepository;
 import com.jzg.quotation.taiping.crawler.entity.po.TaiPingCrawlerOrder;
+import org.springframework.data.mongodb.repository.Query;
 
 public interface TaiPingCrawlerOrderRepository extends BaseRepository<TaiPingCrawlerOrder> {
+    @Query("{'ordersNo' : ?0}")
+    TaiPingCrawlerOrder findByOrdersNo(String ordersNo);
 
 }

+ 5 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/TaiPingCrawlerOrderService.java

@@ -1,4 +1,9 @@
 package com.jzg.quotation.taiping.crawler.service;
 
+import com.jzg.quotation.taiping.crawler.entity.po.TaiPingCrawlerOrder;
+
 public interface TaiPingCrawlerOrderService{
+    TaiPingCrawlerOrder save(TaiPingCrawlerOrder taiPingCrawlerOrder);
+
+    TaiPingCrawlerOrder findByOrdersNo(String ordersNo);
 }

+ 1 - 2
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/TaiPingCrawlerQuoteProcessService.java

@@ -6,8 +6,7 @@ public interface TaiPingCrawlerQuoteProcessService {
      * 登录
      *
      * @param username 用户名
-     * @param password 密码
      */
-    void login(String username, String password);
+//    void login(String username, String cookie);
 
 }

+ 15 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaiPingCrawlerOrderServiceImpl.java

@@ -1,10 +1,25 @@
 package com.jzg.quotation.taiping.crawler.service.impl;
 
+import com.jzg.quotation.taiping.crawler.entity.po.TaiPingCrawlerOrder;
+import com.jzg.quotation.taiping.crawler.repository.TaiPingCrawlerOrderRepository;
 import com.jzg.quotation.taiping.crawler.service.TaiPingCrawlerOrderService;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
+@RequiredArgsConstructor
+@Transactional
 public class TaiPingCrawlerOrderServiceImpl implements TaiPingCrawlerOrderService {
+    private final TaiPingCrawlerOrderRepository taiPingCrawlerOrderRepository;
 
+    @Override
+    public TaiPingCrawlerOrder save(TaiPingCrawlerOrder taiPingCrawlerOrder) {
+        return taiPingCrawlerOrderRepository.save(taiPingCrawlerOrder);
+    }
 
+    @Override
+    public TaiPingCrawlerOrder findByOrdersNo(String ordersNo) {
+        return taiPingCrawlerOrderRepository.findByOrdersNo(ordersNo);
+    }
 }

+ 11 - 14
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaiPingCrawlerQuoteProcessServiceImpl.java

@@ -1,9 +1,6 @@
 package com.jzg.quotation.taiping.crawler.service.impl;
 
 import com.jzg.quotation.taiping.crawler.component.TaiPingCrawlerRequestComponent;
-import com.jzg.quotation.taiping.crawler.entity.request.TaiPingCrawlerAuthRequest;
-import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerAuthData;
-import com.jzg.quotation.taiping.crawler.entity.response.TaiPingCrawlerBaseResponse;
 import com.jzg.quotation.taiping.crawler.service.TaiPingCrawlerQuoteProcessService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -14,17 +11,17 @@ public class TaiPingCrawlerQuoteProcessServiceImpl implements TaiPingCrawlerQuot
 
     private final TaiPingCrawlerRequestComponent taiPingCrawlerRequestComponent;
 
-    @Override
-    public void login(String username, String password) {
-        // 验证码
-        TaiPingCrawlerBaseResponse<String> verifyCode = taiPingCrawlerRequestComponent.verifyCode();
-        // 验证
-        TaiPingCrawlerAuthRequest taiPingCrawlerAuthRequest = new TaiPingCrawlerAuthRequest(verifyCode, username, password);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerAuthData> auth = taiPingCrawlerRequestComponent.auth(taiPingCrawlerAuthRequest);
-        // 登录
-        TaiPingCrawlerAuthData data = auth.getData();
-        taiPingCrawlerRequestComponent.login(data.getTicket());
-    }
+//    @Override
+//    public void login(String username, String password) {
+//        // 验证码
+//        TaiPingCrawlerBaseResponse<String> verifyCode = taiPingCrawlerRequestComponent.verifyCode();
+//        // 验证
+//        TaiPingCrawlerAuthRequest taiPingCrawlerAuthRequest = new TaiPingCrawlerAuthRequest(verifyCode, username, password);
+//        TaiPingCrawlerBaseResponse<TaiPingCrawlerAuthData> auth = taiPingCrawlerRequestComponent.auth(taiPingCrawlerAuthRequest,);
+//        // 登录
+//        TaiPingCrawlerAuthData data = auth.getData();
+//        taiPingCrawlerRequestComponent.login(data.getTicket());
+//    }
 
 
 }

+ 471 - 44
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java

@@ -1,7 +1,14 @@
 package com.jzg.quotation.taiping.crawler.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
+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.OrderBase;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
@@ -10,26 +17,36 @@ 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.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.taiping.crawler.build.TaiPingCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.taiping.crawler.component.TaiPingCrawlerCacheComponent;
 import com.jzg.quotation.taiping.crawler.component.TaiPingCrawlerRequestComponent;
-import com.jzg.quotation.taiping.crawler.constant.enums.RequestUrl;
+import com.jzg.quotation.taiping.crawler.constant.RequestUrl;
+import com.jzg.quotation.taiping.crawler.entity.TaipingCrawlerConfigureParameters;
 import com.jzg.quotation.taiping.crawler.entity.po.TaiPingCrawlerOrder;
 import com.jzg.quotation.taiping.crawler.entity.request.*;
 import com.jzg.quotation.taiping.crawler.entity.response.*;
 import com.jzg.quotation.taiping.crawler.repository.TaiPingCrawlerOrderRepository;
-import com.jzg.quotation.taiping.crawler.service.TaiPingCrawlerQuoteProcessService;
+import com.jzg.quotation.taiping.crawler.service.TaiPingCrawlerOrderService;
 import com.jzg.quotation.taiping.crawler.service.TaipingCrawlerRequest;
+import com.jzg.quotation.taiping.crawler.utils.DateUtil;
+import com.jzg.quotation.taiping.crawler.utils.LoginResult;
+import lombok.Data;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 
-import java.util.List;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_TPIC)
 @RequiredArgsConstructor
+@Slf4j
 public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
 
-    private final TaiPingCrawlerQuoteProcessService taiPingCrawlerQuoteProcessService;
 
     private final TaiPingCrawlerRequestComponent taiPingCrawlerRequestComponent;
 
@@ -37,82 +54,422 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
 
     private final TaiPingCrawlerOrderRepository taiPingCrawlerOrderRepository;
 
-    @Override
-    public void login(LoginBase loginBase) {
-        taiPingCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
+    private final TaiPingCrawlerOrderService taiPingCrawlerOrderService;
+
+    private static final String TAIPING_TOKEN = "taiping:cookie:";
+
+    private static final String XXUHOZTF0EZSO = "xxuhoztF0eZsO";
+    private static final String GW_TOKEN_TBATWGW_WAN_SC = "GW_TOKEN_TBATWGW_WAN_SC";
+
+
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+    public LoginResult login(TaipingCrawlerConfigureParameters parameters) {
+        Map<Object, Object> cacheMap = redissonClient.getMap(TAIPING_TOKEN + parameters.getUsername());
+        if (cacheMap != null && !cacheMap.isEmpty()) {
+            String xxuhoztF0eZsO = (String) cacheMap.get(XXUHOZTF0EZSO);
+            String gw_token = (String) cacheMap.get(GW_TOKEN_TBATWGW_WAN_SC);
+            System.out.println("[" + parameters.getUsername() + "] 从 Redisson 缓存读取登录信息");
+            return new LoginResult("200", "缓存登录成功", xxuhoztF0eZsO, gw_token);
+        }
+        // 缓存没有 执行生成js加密文件
+        LoginResult result = taiPingCrawlerCacheComponent.loginCookieCache(parameters.getCookie(),parameters.getUsername());
+        // 登录成功 存缓存
+        if (result.getCode().equals("200")) {
+            taiPingCrawlerCacheComponent.cacheCookie(parameters.getXxuhoztF0eZsO(), parameters.getGw_user_token(), parameters.getUsername());
+            return result;
+        } else {
+            throw new SystemException(result.getMessage());
+        }
     }
 
+
     @Override
     public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
         return null;
     }
 
     @Override
-    public QuoteResultsVo quote(QuoteVo quoteVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws ParseException {
+        OrderBase order = quoteVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        // 检查cookie
+        login(parameters);
+        // 归属查询
+        TaiPingCrawlerFindByProductCodeRequest taiPingCrawlerFindByProductCodeRequest = new TaiPingCrawlerFindByProductCodeRequest(parameters);
+        TaiPingCrawlerFindByProductCodeResponse taiPingCrawlerFindByProductCodeResponse = taiPingCrawlerRequestComponent.findProductCode(RequestUrl.FIND_PRODUCECODE,taiPingCrawlerFindByProductCodeRequest,httpHeaders,parameters);
+        if (!taiPingCrawlerFindByProductCodeResponse.isSucc()) {
+            throw new SystemException(taiPingCrawlerFindByProductCodeResponse.getErrMsg());
+        }
+        TaiPingCrawlerFindByProductCodeResponse.Record record = taiPingCrawlerFindByProductCodeResponse.getData().getRecords().get(0);
+        // 获取销售信息子代码
+        TaiPingCrawlerFindSolutionCodeRequest taiPingCrawlerFindSolutionCodeRequest = new TaiPingCrawlerFindSolutionCodeRequest(parameters);
+        TaiPingCrawlerFindSolutionCodeData.RecordsDTO taiPingCrawlerFindSolutionCodeData = taiPingCrawlerRequestComponent.findSolutionCode(taiPingCrawlerFindSolutionCodeRequest,httpHeaders,parameters);
+        // 查询决策单元信息
+        TaiPingCrawlerFindApplyNoRequest taiPingCrawlerFindApplyNoRequest = new TaiPingCrawlerFindApplyNoRequest(parameters,record);
+        TaiPingCrawlerFindApplyNoResponse.GsApplyInfoMainDto gsApplyInfoMainDto = taiPingCrawlerRequestComponent.findApplyNo(taiPingCrawlerFindApplyNoRequest,httpHeaders,parameters);
+
         // 创建订单
-        TaiPingCrawlerCreateOrderRequest taiPingCrawlerCreateOrderRequest = new TaiPingCrawlerCreateOrderRequest();
-        taiPingCrawlerRequestComponent.orderCreate(taiPingCrawlerCreateOrderRequest, httpHeaders);
+        TaiPingCrawlerCreateOrderRequest taiPingCrawlerCreateOrderRequest = new TaiPingCrawlerCreateOrderRequest(parameters,record);
+        String orderNo = taiPingCrawlerRequestComponent.orderCreate(taiPingCrawlerCreateOrderRequest, httpHeaders,parameters);
         // 车型查询
-        TaiPingCrawlerBrandNameQueryRequest brandNameQueryRequest = new TaiPingCrawlerBrandNameQueryRequest();
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerBrandNameQueryData> brandNameQuery = taiPingCrawlerRequestComponent.queryBrand(RequestUrl.BRAND_NAME_QUERY, brandNameQueryRequest, httpHeaders);
+        TaiPingCrawlerBrandNameQueryRequest brandNameQueryRequest = new TaiPingCrawlerBrandNameQueryRequest(quoteVo.getCarInfoVo(),orderNo,record,parameters);
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerBrandNameQueryData> brandNameQuery = taiPingCrawlerRequestComponent.queryBrand(RequestUrl.BRAND_NAME_QUERY, brandNameQueryRequest, httpHeaders,parameters);
         List<TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO> itemMotorDtoList = brandNameQuery.getData()
                 .getItemMotorDtoList();
         TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO itemMotorDtoListDTO = CarModelsFilterUtils.to(itemMotorDtoList, quoteVo.getCarInfoVo());
-        // 计算折旧价
 
+        // 计算折旧价 需要新车购置价 商业险起保日期 车辆注册日期 折旧率
+        TaiPingCrawlerGetCarDepreRateRequest taiPingCrawlerGetCarDepreRateRequest = new TaiPingCrawlerGetCarDepreRateRequest(itemMotorDtoListDTO,quoteVo.getCarInfoVo());
+        double rate = taiPingCrawlerRequestComponent.getCarDepreRate(taiPingCrawlerGetCarDepreRateRequest, httpHeaders,parameters);
+        String startDate;
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            startDate = quoteVo.getBiRiskInfoVo().getStartDate();
+        } else {
+            startDate = quoteVo.getCiRiskInfoVo().getStartDate();
+        }
+        double purchasePrice = Double.parseDouble(itemMotorDtoListDTO.getPurchasePrice());
+        String registerDate = quoteVo.getCarInfoVo().getRegisterDate();
+        String carActualValue = calculateCarActualValue(purchasePrice,startDate,registerDate,rate);
         // 报价
-        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = new TaiPingCrawlerPremiumCalculateRequest(quoteVo, "", itemMotorDtoListDTO);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculateResponse = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders);
+        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = new TaiPingCrawlerPremiumCalculateRequest(quoteVo,parameters, orderNo, itemMotorDtoListDTO,carActualValue, record, taiPingCrawlerFindSolutionCodeData,gsApplyInfoMainDto);
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculateResponse = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders,parameters);
+        // 处理车型错误 带入新车型重新报价
+        if (!premiumCalculateResponse.isSucc() && premiumCalculateResponse.getErrMsg().contains("录入的车型信息不一致")) {
+            TaiPingCrawlerVehicleForPRPQueryRequest taiPingCrawlerVehicleForPRPQueryRequest = new TaiPingCrawlerVehicleForPRPQueryRequest(quoteVo,parameters, orderNo, itemMotorDtoListDTO,carActualValue, record, taiPingCrawlerFindSolutionCodeData,gsApplyInfoMainDto);
+            TaiPingCrawlerBaseResponse<TaiPingCrawlerVehicleForPRPQueryResponse> taiPingCrawlerVehicleForPRPQueryResponse = taiPingCrawlerRequestComponent.vehicleForPRPQuery(taiPingCrawlerVehicleForPRPQueryRequest, httpHeaders, parameters);
+            if (taiPingCrawlerVehicleForPRPQueryResponse.isSucc()) {
+                TaiPingCrawlerBrandNameQueryData.ItemMotorDtoListDTO itemMotorDtoListDTONew = taiPingCrawlerVehicleForPRPQueryResponse.getData().getItemMotorDtoList().get(0);
+                TaiPingCrawlerPremiumCalculateRequest.PfItemMotorDtoDTO pfItemMotorDtoDTO = new TaiPingCrawlerPremiumCalculateRequest.PfItemMotorDtoDTO(quoteVo.getCarInfoVo(), itemMotorDtoListDTONew, orderNo, carActualValue);
+                taiPingCrawlerPremiumCalculateRequest.setPfItemMotorDto(pfItemMotorDtoDTO);
+                premiumCalculateResponse = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+            }
+        }
+        // 处理重复投保
+        if (premiumCalculateResponse != null) {
+            boolean isSucc = premiumCalculateResponse.isSucc();
+            var responseData = premiumCalculateResponse.getData();
+
+            String msgBZ = null;
+            String msgBS = null;
+            if (responseData != null) {
+                msgBZ = responseData.getMsgBZ();
+                msgBS = responseData.getMsgBS();
+            }
+
+            boolean hasRepeatTip = (StringUtils.hasText(msgBZ) && msgBZ.contains("重复投保"))
+                    || (StringUtils.hasText(msgBS) && msgBS.contains("重复投保"));
+            boolean hasMsg = StringUtils.hasText(msgBZ) || StringUtils.hasText(msgBS);
+
+            if (isSucc && hasMsg && hasRepeatTip) {
+                // 交强险日期处理
+                String finalStartDateBZ = DateUtil.getFinalInsureDate(msgBZ);
+                if (StringUtils.hasText(finalStartDateBZ)) {
+                    String finalEndDateBZ = DateUtil.getNextYearEndDateForCompulsory(finalStartDateBZ);
+                    var policyInfo = taiPingCrawlerPremiumCalculateRequest.getPfPolicyInfoDto();
+                    policyInfo.setStartDate0801(finalStartDateBZ.substring(0, 10));
+                    policyInfo.setStartTime0801(finalStartDateBZ.substring(11));
+                    policyInfo.setEndDate0801(finalEndDateBZ.substring(0, 10));
+                    policyInfo.setEndTime0801(finalEndDateBZ.substring(11));
+                    policyInfo.setEffectFlag0801(!finalStartDateBZ.endsWith("00:00:00"));
+                }
+
+                // 商业险日期处理
+                String finalStartDateBS = DateUtil.getFinalInsureDate(msgBS);
+                if (StringUtils.hasText(finalStartDateBS)) {
+                    String finalEndDateBS = DateUtil.getNextYearEndDateForCommercial(finalStartDateBS);
+                    var policyInfo = taiPingCrawlerPremiumCalculateRequest.getPfPolicyInfoDto();
+                    policyInfo.setStartDate0802(finalStartDateBS.substring(0, 10));
+                    policyInfo.setStartTime0802(finalStartDateBS.substring(11));
+                    policyInfo.setEndDate0802(finalEndDateBS.substring(0, 10));
+                    policyInfo.setEndTime0802(finalEndDateBS.substring(11));
+                    policyInfo.setEffectFlag0802(!finalStartDateBS.endsWith("00:00:00"));
+                }
+
+                // 重新发起保费计算
+                premiumCalculateResponse = taiPingCrawlerRequestComponent.premiumCalculate(
+                        taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+            }
+        }
+        // 添加特约重新报价
+        if (premiumCalculateResponse != null && premiumCalculateResponse.isSucc()) {
+            taiPingCrawlerPremiumCalculateRequest.setClauseList0801(addClauseList0801(premiumCalculateResponse));
+            taiPingCrawlerPremiumCalculateRequest.setClauseList0802(addClauseList0802(premiumCalculateResponse));
+            if (premiumCalculateResponse.getData().getDemandNoForce() != null) {
+                taiPingCrawlerPremiumCalculateRequest.setDemandNoForce(premiumCalculateResponse.getData().getDemandNoForce());
+            }
+            if (premiumCalculateResponse.getData().getDemandNoBusi() != null) {
+                taiPingCrawlerPremiumCalculateRequest.setDemandNoBusi(premiumCalculateResponse.getData().getDemandNoBusi());
+            }
+            premiumCalculateResponse = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+        }
+
         // 缓存数据
+        taiPingCrawlerCacheComponent.cacheTaiPingCrawlerPremiumCalculateRequest(taiPingCrawlerPremiumCalculateRequest,quoteVo.getOrder()
+                .getOrdersNo());
         taiPingCrawlerCacheComponent.cacheTaiPingCrawlerPremiumCalculateData(premiumCalculateResponse.getData(), quoteVo.getOrder()
                 .getOrdersNo());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = new TaiPingCrawlerOrder();
+        taiPingCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        taiPingCrawlerOrder.setCompanyOrderNo(orderNo);
+        taiPingCrawlerOrderService.save(taiPingCrawlerOrder);
+        return TaiPingCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(premiumCalculateResponse, quoteVo,orderNo);
+
+    }
+    // 添加特约
+    private static List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO> addClauseList0801(TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculateResponse) {
+        String proposalNo0801 = premiumCalculateResponse.getData().getProposalNo0801();
+        List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO> clauseList0801DTOList = new ArrayList<>();
+        for (TaiPingCrawlerPremiumCalculateData.ClauseList0801DTO clauseList0801DTO : premiumCalculateResponse.getData().getClauseList0801()) {
+            if (clauseList0801DTO.getClauseCode().equals("1004")) {
+                TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO clauseList0801 = new TaiPingCrawlerPremiumCalculateRequest.ClauseList0801DTO();
+                clauseList0801.setProposalNo(proposalNo0801);
+                clauseList0801.setClauseCode(clauseList0801DTO.getClauseCode());
+                clauseList0801.setClauseCName(clauseList0801DTO.getClauseCName());
+                clauseList0801.setClauseTName(clauseList0801DTO.getClauseTName());
+                clauseList0801.setClauseEName(clauseList0801DTO.getClauseEName());
+                clauseList0801.setLanguage(clauseList0801DTO.getLanguage());
+                clauseList0801.setValidDate(clauseList0801DTO.getValidDate());
+                clauseList0801.setInValidDate(clauseList0801DTO.getInValidDate());
+                clauseList0801.setValidInd(clauseList0801DTO.getValidInd());
+                clauseList0801.setRemark(clauseList0801DTO.getRemark());
+                clauseList0801.setReadOnlyInd(clauseList0801DTO.getReadOnlyInd());
+                clauseList0801.setClauseContent(clauseList0801DTO.getClauseContent());
+                clauseList0801.setClauseCompanyCode(clauseList0801DTO.getClauseCompanyCode());
+                clauseList0801.setClauseType(clauseList0801DTO.getClauseType());
+                clauseList0801.setAddedValueServiceType(clauseList0801DTO.getAddedValueServiceType());
+                clauseList0801.setClauseUseType(clauseList0801DTO.getClauseUseType());
+                clauseList0801.setClausePrintType(clauseList0801DTO.getClausePrintType());
+                clauseList0801.setCreateTime(clauseList0801DTO.getCreateTime());
+                clauseList0801.setCreatorCode(clauseList0801DTO.getCreatorCode());
+                clauseList0801.setUpdaterCode(clauseList0801DTO.getUpdaterCode());
+                clauseList0801.setUpdateTime(clauseList0801DTO.getUpdateTime());
+                clauseList0801.setVersion(clauseList0801DTO.getVersion());
+                clauseList0801.setRiskClass(clauseList0801DTO.getRiskClass());
+                clauseList0801.setConflictRuleCodes(clauseList0801DTO.getConflictRuleCodes());
+                clauseList0801.setRelyRuleDto(clauseList0801DTO.getRelyRuleDto());
+                clauseList0801.setProductType(clauseList0801DTO.getProductType());
+                clauseList0801.setMatchRuleId(clauseList0801DTO.getMatchRuleId());
+                clauseList0801.setEditFlag(clauseList0801DTO.getEditFlag());
+                clauseList0801.setAssociateClauseCodes(clauseList0801DTO.getAssociateClauseCodes());
+                clauseList0801.setIsEndor(clauseList0801DTO.getIsEndor());
+                clauseList0801.setGgClauseParameterVos(clauseList0801DTO.getGgClauseParameterVos());
+                clauseList0801.setClauseVariableArr(clauseList0801DTO.getClauseVariableArr());
+                clauseList0801.setShowDelete(clauseList0801DTO.isShowDelete());
+                clauseList0801.setShowEdit(clauseList0801DTO.isShowEdit());
+                clauseList0801.setSerialNo(clauseList0801DTO.getSerialNo());
+                clauseList0801.setDisabled(clauseList0801DTO.getDisabled());
+                clauseList0801DTOList.add(clauseList0801);
+            }
+        }
+        return clauseList0801DTOList;
+    }
+
+    private static List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO> addClauseList0802(TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> premiumCalculateResponse) {
+        String proposalNo0802 = premiumCalculateResponse.getData().getProposalNo0802();
+        List<TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO> clauseList0802DTOList = new ArrayList<>();
+        for (TaiPingCrawlerPremiumCalculateData.ClauseList0802DTO clauseList0802DTO : premiumCalculateResponse.getData().getClauseList0802()) {
+            if (clauseList0802DTO.getClauseCode().equals("7120240460") || clauseList0802DTO.getClauseCode().equals("0020200003") || clauseList0802DTO.getClauseCode().equals("0020200004")) {
+                TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO clauseList0802 = new TaiPingCrawlerPremiumCalculateRequest.ClauseList0802DTO();
+                clauseList0802.setProposalNo(proposalNo0802);
+                clauseList0802.setClauseCode(clauseList0802DTO.getClauseCode());
+                clauseList0802.setClauseCName(clauseList0802DTO.getClauseCName());
+                clauseList0802.setClauseTName(clauseList0802DTO.getClauseTName());
+                clauseList0802.setClauseEName(clauseList0802DTO.getClauseEName());
+                clauseList0802.setLanguage(clauseList0802DTO.getLanguage());
+                clauseList0802.setValidDate(clauseList0802DTO.getValidDate());
+                clauseList0802.setInValidDate(clauseList0802DTO.getInValidDate());
+                clauseList0802.setValidInd(clauseList0802DTO.getValidInd());
+                clauseList0802.setRemark(clauseList0802DTO.getRemark());
+                clauseList0802.setReadOnlyInd(clauseList0802DTO.getReadOnlyInd());
+                clauseList0802.setClauseContent(clauseList0802DTO.getClauseContent());
+                clauseList0802.setClauseCompanyCode(clauseList0802DTO.getClauseCompanyCode());
+                clauseList0802.setClauseType(clauseList0802DTO.getClauseType());
+                clauseList0802.setAddedValueServiceType(clauseList0802DTO.getAddedValueServiceType());
+                clauseList0802.setClauseUseType(clauseList0802DTO.getClauseUseType());
+                clauseList0802.setClausePrintType(clauseList0802DTO.getClausePrintType());
+                clauseList0802.setCreateTime(clauseList0802DTO.getCreateTime());
+                clauseList0802.setCreatorCode(clauseList0802DTO.getCreatorCode());
+                clauseList0802.setUpdaterCode(clauseList0802DTO.getUpdaterCode());
+                clauseList0802.setUpdateTime(clauseList0802DTO.getUpdateTime());
+                clauseList0802.setVersion(clauseList0802DTO.getVersion());
+                clauseList0802.setRiskClass(clauseList0802DTO.getRiskClass());
+                clauseList0802.setConflictRuleCodes(clauseList0802DTO.getConflictRuleCodes());
+                clauseList0802.setRelyRuleDto(clauseList0802DTO.getRelyRuleDto());
+                clauseList0802.setProductType(clauseList0802DTO.getProductType());
+                clauseList0802.setMatchRuleId(clauseList0802DTO.getMatchRuleId());
+                clauseList0802.setEditFlag(clauseList0802DTO.getEditFlag());
+                clauseList0802.setAssociateClauseCodes(clauseList0802DTO.getAssociateClauseCodes());
+                clauseList0802.setIsEndor(clauseList0802DTO.getIsEndor());
+                clauseList0802.setGgClauseParameterVos(clauseList0802DTO.getGgClauseParameterVos());
+                clauseList0802.setClauseVariableArr(clauseList0802DTO.getClauseVariableArr());
+                clauseList0802.setShowDelete(clauseList0802DTO.isShowDelete());
+                clauseList0802.setShowEdit(clauseList0802DTO.isShowEdit());
+                clauseList0802.setSerialNo(clauseList0802DTO.getSerialNo());
+                clauseList0802.setDisabled(clauseList0802DTO.getDisabled());
+                clauseList0802DTOList.add(clauseList0802);
+            }
+        }
+        return clauseList0802DTOList;
+    }
+    // 计算折旧价
+    public static String calculateCarActualValue(double purchasePrice, String startDateStr, String registerDateStr, double rate) throws ParseException {
+        double actualValue = 0.00;
+        Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse(startDateStr); // 起保日期 有商业用商业 没有用交强
+        Date registerDate = new SimpleDateFormat("yyyy-MM-dd").parse(registerDateStr); // 注册日期
+
+        int year = startDate.getYear() + 1900;
+        int month = startDate.getMonth() + 1;
+        int date = startDate.getDate();
 
-        return TaiPingCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(premiumCalculateResponse.getData(), quoteVo);
+        // 计算月份差
+        long monthDiff = 12L * (year - (registerDate.getYear() + 1900)) + (month - (registerDate.getMonth() + 1));
+        if (registerDate.getDate() > date) {
+            monthDiff -= 1;
+        }
 
+        // 计算折扣系数
+        double discount  = 1.0;
+        if (monthDiff > 0) {
+            discount  = 1 - monthDiff * rate;
+            if (discount  < 0.2) {
+                discount  = 0.2;
+            }
+        }
+        // 计算最终价格
+        if (purchasePrice > 0) {
+            actualValue = Math.round(purchasePrice * discount * 100.0) / 100.0; // 保留两位小数
+        }
+        return String.valueOf(actualValue);
     }
 
+
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
-        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.getById(underwritingVo.getOrder().getOrdersNo());
-
+        OrderBase order = underwritingVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
         // 验证信息
         TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateData(underwritingVo.getOrder()
                 .getOrdersNo());
-        taiPingCrawlerRequestComponent.submitValidate(taiPingCrawlerPremiumCalculateData, httpHeaders);
+        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateRequest(underwritingVo.getOrder()
+                .getOrdersNo());
+        taiPingCrawlerPremiumCalculateRequest.getPfMainDto().setForceLinkCIFlag(true);
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> taiPingCrawlerPremiumCalculate = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+        TaiPingCrawlerSubmitValidateRequest taiPingCrawlerSubmitValidateRequest = new TaiPingCrawlerSubmitValidateRequest(taiPingCrawlerPremiumCalculate.getData(), taiPingCrawlerPremiumCalculateRequest,taiPingCrawlerOrder);
+        String request = JSON.toJSONString(taiPingCrawlerSubmitValidateRequest);
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> taiPingCrawlerSubmitValidateData = taiPingCrawlerRequestComponent.submitValidate(taiPingCrawlerPremiumCalculate.getData(), httpHeaders,parameters);
         // 核保
-        TaiPingCrawlersSubmitToAuditRequest submitToAuditRequest = new TaiPingCrawlersSubmitToAuditRequest();
-        taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders);
+        TaiPingCrawlersSubmitToAuditRequest submitToAuditRequest = new TaiPingCrawlersSubmitToAuditRequest(taiPingCrawlerOrder.getCompanyOrderNo());
+        TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAuditData = taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders,parameters);
+
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         return underwritingResultsVo;
     }
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
-        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.getById(paymentLinkVo.getOrder().getOrdersNo());
-
-        TaiPingCrawlerSendSMSRequest taiPingCrawlerSendSMSRequest = new TaiPingCrawlerSendSMSRequest();
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerSendSMSData> sendSMS = taiPingCrawlerRequestComponent.sendSMS(taiPingCrawlerSendSMSRequest, httpHeaders);
-        TaiPingCrawlerSendSMSData data = sendSMS.getData();
+        OrderBase order = paymentLinkVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
+        TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateData(paymentLinkVo.getOrder()
+                .getOrdersNo());
+        String proposalNo0801 = taiPingCrawlerPremiumCalculateData.getProposalNo0801() != null ? taiPingCrawlerPremiumCalculateData.getProposalNo0801() : "";
+        String proposalNo0802 = taiPingCrawlerPremiumCalculateData.getProposalNo0802() != null ? taiPingCrawlerPremiumCalculateData.getProposalNo0802() : "";
+        TaiPingCrawlerSendSMSRequest taiPingCrawlerSendSMSRequest = new TaiPingCrawlerSendSMSRequest(taiPingCrawlerOrder.getCompanyOrderNo(),proposalNo0801+","+proposalNo0802,parameters.getSalesmanCode());
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerSendSMSData> sendSMS = taiPingCrawlerRequestComponent.sendSMS(taiPingCrawlerSendSMSRequest, httpHeaders,parameters);
         PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
-        paymentLinkResultsVo.setPaymentLink("");
+        if (sendSMS.isSucc()) {
+            TaiPingCrawlerSendSMSData data = sendSMS.getData();
+            paymentLinkResultsVo.setPaymentLink(data.getMpInsuredQrCode());
+        }
         return paymentLinkResultsVo;
     }
 
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
-        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.getById(insuranceUploadImageVo.getOrder().getOrdersNo());
-
+        // 获取配置
+        OrderBase order = insuranceUploadImageVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
+        String certiType = "01";
+        String imageSuffix = ".png";
         List<InsuranceImageVo> imageVoList = insuranceUploadImageVo.getImageVoList();
-        imageVoList.forEach(imageVo -> {
-            TaiPingCrawlerImageIntoOneFileRequest oneFileRequest = new TaiPingCrawlerImageIntoOneFileRequest();
-            taiPingCrawlerRequestComponent.imageIntoOneFile(oneFileRequest, httpHeaders);
-            TaiPingCrawlerOCRResultConfirmRequest confirmRequest = new TaiPingCrawlerOCRResultConfirmRequest();
-            taiPingCrawlerRequestComponent.ocrResultConfirm(confirmRequest, httpHeaders);
-        });
+        String orderNo = taiPingCrawlerOrder.getCompanyOrderNo();
+        for (InsuranceImageVo insuranceImageVo : imageVoList) {
+            String imageCode = insuranceImageVo.getImageCode();
+            ImageConfig imageConfig = IMAGE_CONFIG_MAP.get(imageCode);
+            String base64 = insuranceImageVo.getImageBase64List().get(0).getImageBase64Str();
+            if (imageConfig == null) {
+                return;
+            }
+            uploadAndOcrConfirm(certiType, orderNo, imageConfig.fileEcmType, imageConfig.fileType,
+                    imageConfig.fileAllType, imageSuffix, base64, imageCode,httpHeaders,parameters);
+        }
+    }
+
+    private static final Map<String, ImageConfig> IMAGE_CONFIG_MAP;
+
+    static {
+        IMAGE_CONFIG_MAP = new HashMap<>(8);
+        IMAGE_CONFIG_MAP.put("C01", new ImageConfig("P03", "I020101", Arrays.asList("I02", "I0201", "I020101")));
+        IMAGE_CONFIG_MAP.put("D01", new ImageConfig("P03", "I020102", Arrays.asList("I02", "I0201", "I020102")));
+        IMAGE_CONFIG_MAP.put("C02", new ImageConfig("P43", "I030101", Arrays.asList("I03", "I0301", "I030101")));
+        IMAGE_CONFIG_MAP.put("D02", new ImageConfig("P43", "I030102", Arrays.asList("I03", "I0301", "I030102")));
+        IMAGE_CONFIG_MAP.put("C03", new ImageConfig("P41", "I030201", Arrays.asList("I03", "I0302", "I030201")));
+        IMAGE_CONFIG_MAP.put("D03", new ImageConfig("P41", "I030202", Arrays.asList("I03", "I0302", "I030202")));
+        IMAGE_CONFIG_MAP.put("C04", new ImageConfig("P42", "I030301", Arrays.asList("I03", "I0303", "I030301")));
+        IMAGE_CONFIG_MAP.put("D04", new ImageConfig("P42", "I030302", Arrays.asList("I03", "I0303", "I030302")));
+    }
+
+    @Data
+    private static class ImageConfig {
+        private final String fileEcmType;
+        private final String fileType;
+        private final List<String> fileAllType;
+
+        public ImageConfig(String fileEcmType, String fileType, List<String> fileAllType) {
+            this.fileEcmType = fileEcmType;
+            this.fileType = fileType;
+            this.fileAllType = fileAllType;
+        }
+    }
+
+    private void uploadAndOcrConfirm(String certiType, String orderNo, String fileEcmType, String fileType,
+                                     List<String> fileAllType, String imageSuffix, String base64, String imageCode,HttpHeaders httpHeaders,TaipingCrawlerConfigureParameters parameters ) {
+        // 构建上传请求
+        TaiPingCrawlerImageIntoOneFileRequest oneFileRequest =
+                new TaiPingCrawlerImageIntoOneFileRequest(certiType, orderNo, fileEcmType,
+                        fileType, fileAllType, imageSuffix, base64);
+        // 上传影像
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerImageIntoOneFileResponse> imageResp =
+                taiPingCrawlerRequestComponent.imageIntoOneFile(oneFileRequest, httpHeaders, parameters);
+        String infoMainId = imageResp.getData().getImgUrls().getInfoMainId();
+
+        // OCR确认
+        TaiPingCrawlerOCRResultConfirmRequest confirmRequest = new TaiPingCrawlerOCRResultConfirmRequest(infoMainId);
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerOCRResultConfirmData> ocrResp =
+                taiPingCrawlerRequestComponent.ocrResultConfirm(confirmRequest, httpHeaders, parameters);
+        // 结果校验
+        if (!ocrResp.isSucc()) {
+            throw new SystemException(ocrResp.getErrMsg());
+        }
+        // 日志输出
+        log.info(InsuranceImageEnum.valueOf(imageCode).getDesc() + "上传影像成功");
     }
 
     @Override
@@ -122,17 +479,83 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
 
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
-        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.getById(downloadPolicyVo.getOrder().getOrdersNo());
+        OrderBase order = downloadPolicyVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
         return null;
 
     }
 
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
-        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();
-        TaiPingCrawlerQueryListData.RecordsDTO recordsDTO = taiPingCrawlerRequestComponent.queryList(new TaiPingCrawlerQueryListRequest(), httpHeaders);
-        return null;
+        OrderBase order = orderStatusVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
+                attributionInformationVo.getConfigInfo());
+        HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+        TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(orderStatusVo.getOrder().getOrdersNo());
+        TaiPingCrawlerQueryListRequest taiPingCrawlerQueryListRequest = new TaiPingCrawlerQueryListRequest(taiPingCrawlerOrder.getCompanyOrderNo());
+        List<TaiPingCrawlerQueryListData.RecordsDTO> recordsDTO = null;
+        if (parameters.getMethod().equals("简易")) {
+            recordsDTO = taiPingCrawlerRequestComponent.queryListNsp(taiPingCrawlerQueryListRequest, httpHeaders,parameters);
+        } else if (parameters.getMethod().equals("立保通")){
+            recordsDTO = taiPingCrawlerRequestComponent.queryListNqt(taiPingCrawlerQueryListRequest, httpHeaders,parameters);
+        }
+
+        OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
+        if (recordsDTO != null  && recordsDTO.size() > 0) {
+            String jqStatus = recordsDTO.stream()
+                    .filter(record -> "0801".equals(record.getProductCode()))
+                    .findFirst()
+                    .map(TaiPingCrawlerQueryListData.RecordsDTO::getUnderWriteInd)
+                    .orElse("");
+            String syStatus = recordsDTO.stream()
+                    .filter(record -> "0802".equals(record.getProductCode()))
+                    .findFirst()
+                    .map(TaiPingCrawlerQueryListData.RecordsDTO::getUnderWriteInd)
+                    .orElse("");
+            // 人工核保
+            if (jqStatus.equals("8") || syStatus.equals("8") || jqStatus.equals("9") || syStatus.equals("9")) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            }
+            // 核保失败
+            else if (jqStatus.equals("2") || syStatus.equals("2")) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            }
+            // 核保通过
+            else if (containsPass(jqStatus) || containsPass(syStatus)) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                // 获取缴费地址
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(orderStatusVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                orderStatusResultVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            }
+            // 已承保
+            else if (jqStatus.equals("6") || syStatus.equals("6")) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
+                String jqPolicyNo = recordsDTO.stream()
+                        .filter(record -> "0801".equals(record.getProductCode()))
+                        .findFirst()
+                        .map(TaiPingCrawlerQueryListData.RecordsDTO::getPolicyNo)
+                        .orElse("");
+                String syPolicyNo = recordsDTO.stream()
+                        .filter(record -> "0802".equals(record.getProductCode()))
+                        .findFirst()
+                        .map(TaiPingCrawlerQueryListData.RecordsDTO::getPolicyNo)
+                        .orElse("");
+                orderStatusResultVo.setJqPolicyno(jqPolicyNo);
+                orderStatusResultVo.setSyPolicyno(syPolicyNo);
+            }
+        }
+        return orderStatusResultVo;
+    }
+
+    private boolean containsPass(String status){
+        return "1".equals(status) || "3".equals(status) || "5".equals(status);
     }
 
     @Override
@@ -140,4 +563,8 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
         return true;
     }
 
+    @Override
+    public void login(LoginBase loginBase) {
+
+    }
 }

+ 151 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/DateUtil.java

@@ -0,0 +1,151 @@
+package com.jzg.quotation.taiping.crawler.utils;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+
+/**
+ * @author quchen
+ * @date 2026/5/28 10:02
+ */
+
+public class DateUtil {
+    private static final DateTimeFormatter STANDARD_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    /**
+     * 根据前缀截取目标文本内容
+     */
+    public static String extractDateStr(String content, String prefix) {
+        if (content == null || content.isEmpty() || prefix == null) {
+            return "";
+        }
+        int idx = content.indexOf(prefix);
+        if (idx == -1) {
+            return "";
+        }
+        String sub = content.substring(idx + prefix.length()).trim();
+        int lineBreak = sub.indexOf("\n");
+        if (lineBreak > 0) {
+            sub = sub.substring(0, lineBreak).trim();
+        }
+        return sub;
+    }
+
+    /**
+     * 统一解析各类不规则日期为标准格式 yyyy-MM-dd HH:mm:ss
+     * 支持:2026-05-31 00:00 / 202605310 000 / 202506011 850
+     */
+    public static String formatInsuranceDate(String sourceDate) {
+        if (sourceDate == null || sourceDate.isEmpty()) {
+            return "";
+        }
+        // 标准横杠格式
+        if (sourceDate.contains("-")) {
+            return sourceDate + ":00";
+        }
+        // 纯数字格式
+        String raw = sourceDate.replaceAll("\\s+", "");
+        if (raw.length() < 8) {
+            return "";
+        }
+        String ymd = raw.substring(0, 8);
+        String year = ymd.substring(0, 4);
+        String month = ymd.substring(4, 6);
+        String day = ymd.substring(6, 8);
+
+        String hhmmStr = raw.substring(8);
+        String hour = hhmmStr.length() >= 2 ? hhmmStr.substring(0, 2) : "00";
+        String minute = hhmmStr.length() > 2 ? hhmmStr.substring(2) : "00";
+
+        return String.format("%s-%s-%s %s:%s:00", year, month, day, hour, minute);
+    }
+
+    /**
+     * 判断标准时间是否为 00:00:00 零点
+     */
+    public static boolean isZeroTime(String standardDateTime) {
+        if (standardDateTime == null || standardDateTime.isEmpty()) {
+            return true;
+        }
+        return standardDateTime.endsWith("00:00:00");
+    }
+
+    /**
+     * 标准日期时间 年份 +1
+     */
+    public static String plusOneYear(String standardDateTime) {
+        if (standardDateTime == null || standardDateTime.isEmpty()) {
+            return "";
+        }
+        LocalDateTime dateTime = LocalDateTime.parse(standardDateTime, STANDARD_FORMAT);
+        dateTime = dateTime.plus(1, ChronoUnit.YEARS);
+        return dateTime.format(STANDARD_FORMAT);
+    }
+
+    /**
+     * 核心业务方法:按规则获取最终日期
+     * @param content 原始报文(msgBZ/msgBS)
+     * @return 最终合规日期 yyyy-MM-dd HH:mm:ss
+     */
+    public static String getFinalInsureDate(String content) {
+        // 1. 提取并解析起保日期
+        String startRaw = extractDateStr(content, "起保日期:");
+        String startStd = formatInsuranceDate(startRaw);
+        if (startStd.isEmpty()) {
+            return "";
+        }
+        // 2. 判断是否零点
+        if (!isZeroTime(startStd)) {
+            // 非零点:起保日期 +1年
+            return plusOneYear(startStd);
+        } else {
+            // 零点:取终保日期
+            String endRaw = extractDateStr(content, "终保日期:");
+            return formatInsuranceDate(endRaw);
+        }
+    }
+
+    /**
+     * 交强险 - 生成下一年终保日期
+     * @param stdDateTime 标准时间 yyyy-MM-dd HH:mm:ss
+     * @return 转换后终保日期
+     */
+    public static String getNextYearEndDateForCompulsory(String stdDateTime) {
+        if (stdDateTime == null || stdDateTime.isEmpty()) {
+            return "";
+        }
+        LocalDateTime dateTime = LocalDateTime.parse(stdDateTime, STANDARD_FORMAT);
+        LocalDateTime nextYear = dateTime.plusYears(1);
+
+        if (isZeroTime(stdDateTime)) {
+            // 零点:年份+1 → 日期-1天,时间设为 23:59:59
+            nextYear = nextYear.minusDays(1)
+                    .withHour(23)
+                    .withMinute(59)
+                    .withSecond(59);
+        } else {
+            // 非零点:年份+1 → 整体减1秒
+            nextYear = nextYear.minusSeconds(1);
+        }
+        return nextYear.format(STANDARD_FORMAT);
+    }
+
+    /**
+     * 商业险 - 生成下一年终保日期
+     * @param stdDateTime 标准时间 yyyy-MM-dd HH:mm:ss
+     * @return 转换后终保日期
+     */
+    public static String getNextYearEndDateForCommercial(String stdDateTime) {
+        if (stdDateTime == null || stdDateTime.isEmpty()) {
+            return "";
+        }
+        LocalDateTime dateTime = LocalDateTime.parse(stdDateTime, STANDARD_FORMAT);
+        // 年份+1,日期-1天,固定 23:59:59
+        LocalDateTime nextYear = dateTime.plusYears(1)
+                .minusDays(1)
+                .withHour(23)
+                .withMinute(59)
+                .withSecond(59);
+        return nextYear.format(STANDARD_FORMAT);
+    }
+}

+ 23 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/LoginResult.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.taiping.crawler.utils;
+
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/5/22 10:25
+ */
+
+@Data
+public class LoginResult {
+    private String code;
+    private String message;
+    private String xxuhoztF0eZsO;
+    private String gw_token;
+
+    public LoginResult(String code, String message, String xxuhoztF0eZsO, String gw_token) {
+        this.code = code;
+        this.message = message;
+        this.xxuhoztF0eZsO = xxuhoztF0eZsO;
+        this.gw_token = gw_token;
+    }
+}

+ 19 - 0
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/utils/VerifyCodeCreate.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.taiping.crawler.utils;
 
+import java.security.SecureRandom;
 import java.util.concurrent.ThreadLocalRandom;
 
 /**
@@ -19,6 +20,9 @@ public final class VerifyCodeCreate {
 
     private final static char Y = 'y';
 
+    private static final SecureRandom RANDOM = new SecureRandom();
+    private static final String HEX_STR = "0123456789abcdef";
+
     public static String getVerifyCode() {
         StringBuilder sb = new StringBuilder(STRING);
         for (int i = 0; i < sb.length(); i++) {
@@ -34,4 +38,19 @@ public final class VerifyCodeCreate {
         return sb.toString();
     }
 
+    public static String getBatchNo() {
+        char[] arr = new char[36];
+        for (int i = 0; i < 36; i++) {
+            int idx = RANDOM.nextInt(16);
+            arr[i] = HEX_STR.charAt(idx);
+        }
+        arr[14] = '4';
+        int val = (3 & arr[19]) | 8;
+        arr[19] = HEX_STR.charAt(val);
+        arr[8] = '-';
+        arr[13] = '-';
+        arr[18] = '-';
+        arr[23] = '-';
+        return new String(arr);
+    }
 }

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

@@ -25,13 +25,9 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
-import java.util.stream.Collectors;
 
-import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.util.UriComponentsBuilder;
 
 @Slf4j
 public class TaiShanCrawlerQuoteRequestVoBuild {

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

@@ -289,14 +289,11 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
      */
     @Override
     public HttpHeaders getHeaders(String username, String comCode) {
-        //String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTUsImV4cCI6MTc4MTY4NzIzMn0.ldWz9TMY4AJ75VE0Bk1mkzAXPC9jJNMIWL82n0kGHrBwASgGvBxO3fe7orHbCIowt0athoRn1zA9m5ZNnO7olg";
-
-        //String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6MTIsImV4cCI6MTc4MTk0MDMyMX0.rsR8yMmSsB5iOstJSToswargqTCFB5He37UydrlK_lKFsHVqtBL-EOAgls4YL4nKWvRtbSxxY6HZRczHFG0iRw";
-        String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6NTQsImV4cCI6MTc4NTQ4MjUwOX0.AbA_jALziOnj6VuKgbsTArbEM3EhmJN1zso7SF8fmqUSuR4VtSj-GNJuOq3P-xFumSyV-BKFAxCxC08Ryjtzxw";
+        // String authorization = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI1ODI0MjEiLCJhdXRoIjoiUk9MRV9CVVNJTkVTUyIsInBhc3N3b3JkX2V4cGlyZSI6NTAsImV4cCI6MTc4NTgwODY1N30.lo0QHzeACiCUwpSuHkQRqnbpGa5KSb51GbNnj37dGW8VWC8cB1t_vwBGaud-odHMVE8W3flJ2alcIRmrNdLSPA";
 
         // 修复后:从缓存获取
         String token = taiShanCrawlerCacheComponent.getAuthorization(username);
-//        String authorization = "Bearer " + token;
+        String authorization = "Bearer " + token;
         log.info("TaiShan-token:{}", token);
         log.info("TaiShan-authorization:{}", authorization);
 

+ 4 - 2
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -189,13 +189,15 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                 }
                 if (kindInfoVo.getKindCode().equals("041")) {
                     coverageDTO.setQuantity(1);
+                    coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getAmount()));
                 }
                 if (kindInfoVo.getKindCode().equals("044")) {
                     coverageDTO.setQuantity(seatCount - 1);
-                    coverageDTO.setAmount(String.valueOf(new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(coverageDTO.getQuantity()))));
+                    coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getAmount()));
+                    coverageDTO.setAmount(String.valueOf(new BigDecimal(kindInfoVo.getAmount()).multiply(new BigDecimal(coverageDTO.getQuantity()))));
                 }
                 if (kindInfoVo.getKindCode().equals("54") || kindInfoVo.getKindCode().equals("55") || kindInfoVo.getKindCode().equals("56") || kindInfoVo.getKindCode().equals("57")) {
-                    coverageDTO.setQuantity(Integer.parseInt(kindInfoVo.getServiceTimes()));
+                    coverageDTO.setQuantity(Integer.parseInt(kindInfoVo.getAmount()));
                 }
                 coverageDTO.setValidDate(biRiskInfoVo.getStartDate());
                 coverageDTO.setExpiryDate(biRiskInfoVo.getEndDate());

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů