Sfoglia il codice sorgente

诚泰报价重构

Qchen 5 mesi fa
parent
commit
9ec9fb64bc
42 ha cambiato i file con 6697 aggiunte e 859 eliminazioni
  1. 10 0
      pom.xml
  2. 4 0
      src/main/java/com/ydtech/config/properties/ChengTaiApiConfigurationProperties.java
  3. 3 0
      src/main/java/com/ydtech/modules/ins/model/vo/KindInfoVo.java
  4. 373 0
      src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponent.java
  5. 0 7
      src/main/java/com/ydtech/modules/order/components/yangguang/YangGuangRequestApiComponents.java
  6. 53 25
      src/main/java/com/ydtech/modules/order/controller/ChengTaiOrderApiController.java
  7. 9 8
      src/main/java/com/ydtech/modules/order/controller/QuoteController.java
  8. 42 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/Base64.java
  9. 48 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/SecurityUrl.java
  10. 75 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/XmlDateTimeFormatter.java
  11. 106 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/CarActualValueEnum.java
  12. 43 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/KindCodeEnum.java
  13. 26 12
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/RequestType.java
  14. 32 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/UploadEnum.java
  15. 25 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/UseNatureShowEnum.java
  16. 46 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/CarModelQueryRequest.java
  17. 33 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PaymentCallBackRequest.java
  18. 101 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PaymentRequest.java
  19. 76 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyElectronicRequest.java
  20. 75 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyRecallRequest.java
  21. 75 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyStatusRequest.java
  22. 1396 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PremiumCalculationRequest.java
  23. 54 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitCallBackRequest.java
  24. 1426 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitRequest.java
  25. 60 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UnderwriteCallBackRequest.java
  26. 91 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UpLoadRequest.java
  27. 169 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/CarModelQueryResponse.java
  28. 18 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PaymentResponse.java
  29. 121 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyElectronicResponse.java
  30. 36 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyRecallResponse.java
  31. 123 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyStatusResponse.java
  32. 464 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PremiumCalculationResponse.java
  33. 15 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/SubmitCallBackResponse.java
  34. 138 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/SubmitResponse.java
  35. 22 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/UpLoadResponse.java
  36. 11 2
      src/main/java/com/ydtech/modules/order/entity/config/ChengTaiConfigureParameters.java
  37. 57 10
      src/main/java/com/ydtech/modules/order/service/ChengTaiOrderApiService.java
  38. 1230 790
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  39. 5 3
      src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java
  40. 2 2
      src/main/java/com/ydtech/modules/order/service/impl/InsuranceCompanyPolymerizationServiceImpl.java
  41. 2 0
      src/main/resources/application-prod.yml
  42. 2 0
      src/main/resources/application-test.yml

+ 10 - 0
pom.xml

@@ -696,6 +696,16 @@
             <artifactId>tencentcloud-sdk-java-sms</artifactId>
             <version>3.1.1281</version>
         </dependency>
+        <dependency>
+            <groupId>javax.mail</groupId>
+            <artifactId>javax.mail-api</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.6.2</version>
+        </dependency>
 
     </dependencies>
 

+ 4 - 0
src/main/java/com/ydtech/config/properties/ChengTaiApiConfigurationProperties.java

@@ -19,6 +19,10 @@ public class ChengTaiApiConfigurationProperties {
     private String publicKey;
     //我司RSA私钥
     private String privateKey;
+
+    private String url;
+
+    private String codeKey;
 }
 
 

+ 3 - 0
src/main/java/com/ydtech/modules/ins/model/vo/KindInfoVo.java

@@ -37,6 +37,9 @@ public class KindInfoVo {
     @ApiModelProperty("别名")
     private String alias;
 
+    @ApiModelProperty("险种费用")
+    private double coveragePremium;
+
     //扩展属性
     //seat: 乘客数(机动车车上人员责任保险-乘客)
     //repairFactorRate: 指定修理厂费率(指定专修厂险,国产车:车损险基准纯风险保费的10%~30%之间,选择国产默认10%;进口车:车损险基准纯风险保费的15%~60%之间,选择进口默认20%。)

+ 373 - 0
src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponent.java

@@ -0,0 +1,373 @@
+package com.ydtech.modules.order.components.chengtai;
+
+import cn.hutool.core.net.URLDecoder;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.ydtech.config.properties.ChengTaiApiConfigurationProperties;
+import com.ydtech.constants.InsuranceEnum;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.order.entity.api.chengtai.constants.RequestType;
+import com.ydtech.modules.order.entity.api.chengtai.request.*;
+import com.ydtech.modules.order.entity.api.chengtai.response.*;
+import com.ydtech.modules.order.utils.InsuranceLog;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author quchen
+ * @date 2026/2/27 10:56
+ */
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class ChengTaiRequestApiComponent {
+    private final ChengTaiApiConfigurationProperties chengTaiApiConfigurationProperties;
+
+    private final RestTemplate restTemplate;
+
+    @Resource(name = "restTemplateIgnoreSSL")
+    private RestTemplate restTemplateIgnoreSSL;
+
+    private <Q , S> S post(Q q, Class<S> tClass, String requestType,String requestDesc) {
+        // 请求地址
+        String url = chengTaiApiConfigurationProperties.getUrl() + requestType;
+        //设置请求头类型
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        // 请求体
+        String requestJson = JSON.toJSONString(q, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+        // 封装请求体
+        HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                requestDesc, url, requestJson);
+        ResponseEntity<String> response = restTemplateIgnoreSSL.postForEntity(url, entity, String.class);
+        String rawResponseBody = response.getBody();
+        rawResponseBody = URLDecoder.decode(rawResponseBody, StandardCharsets.UTF_8);
+        String fixedResponseBody = fixJsonString(rawResponseBody);
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> 响应参数:{}", requestDesc, fixedResponseBody);
+        return JSON.parseObject(fixedResponseBody, tClass);
+    }
+
+    private String postForm(MultiValueMap<String, String> paramMap, String requestType,String requestDesc) {
+        // 请求地址
+        String url = chengTaiApiConfigurationProperties.getUrl() + requestType;
+        //设置请求头类型
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+        // 请求体
+        HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(paramMap, headers);
+        String formParamLog = paramMap.toString();
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                requestDesc, url, formParamLog);
+        ResponseEntity<String> response = restTemplateIgnoreSSL.postForEntity(url, entity, String.class);
+        String rawResponseBody = response.getBody();
+        String decodedResponseBody = "";
+        if (rawResponseBody != null && !rawResponseBody.isEmpty()) {
+
+            decodedResponseBody = URLDecoder.decode(rawResponseBody, StandardCharsets.UTF_8);
+        }
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> 响应参数:{}", requestDesc, decodedResponseBody);
+        return decodedResponseBody;
+    }
+
+    public static void main(String[] args) {
+        String keyword = "%7B%22responseBody%22%3A%7B%22eBCallbackData%22%3A%5B%7B%22insuredName%22%3A%22%E9%83%AD%E6%B7%91%E7%8F%8D%22%2C%22nodeStatus%22%3A%220%22%2C%22operateText%22%3A%22%E5%90%8C%E6%84%8F%3Cbr%2F%3E%22%2C%22operateTime%22%3A1773199010000%2C%22operateType%22%3A%221%22%2C%22operateUserCode%22%3A%2201000049%22%2C%22operateUserName%22%3A%22%E5%8F%B2++%E8%AF%97%22%2C%22paymentEndDate%22%3A%222026-03-12+00%3A00%3A00%22%2C%22proposalNo%22%3A%220059904080120260000254%22%2C%22resourceType%22%3A%22B2C-QD%22%2C%22riskCode%22%3A%220801%22%2C%22sumAmount%22%3A200000.0%2C%22totalPremium%22%3A950.0%2C%22underWriteInd%22%3A%221%22%2C%22uuid%22%3A%22OhPPz7MURZe9mwktaH8znA%22%7D%2C%7B%22insuredName%22%3A%22%E9%83%AD%E6%B7%91%E7%8F%8D%22%2C%22nodeStatus%22%3A%220%22%2C%22operateText%22%3A%22%E5%90%8C%E6%84%8F%3Cbr%2F%3E%22%2C%22operateTime%22%3A1773199010000%2C%22operateType%22%3A%221%22%2C%22operateUserCode%22%3A%2201000049%22%2C%22operateUserName%22%3A%22%E5%8F%B2++%E8%AF%97%22%2C%22paymentEndDate%22%3A%222026-03-12+00%3A00%3A00%22%2C%22proposalNo%22%3A%220059904082120260000197%22%2C%22resourceType%22%3A%22B2C-QD%22%2C%22riskCode%22%3A%220808%22%2C%22sumAmount%22%3A331312.0%2C%22totalPremium%22%3A3009.18%2C%22underWriteInd%22%3A%221%22%2C%22uuid%22%3A%22OhPPz7MURZe9mwktaH8znA%22%7D%5D%7D%2C%22responseHead%22%3A%7B%22errorMessage%22%3A%22%E5%A4%84%E7%90%86%E6%88%90%E5%8A%9F%22%2C%22responseCode%22%3A%220000%22%7D%7D";
+        URLDecoder.decode(keyword, StandardCharsets.UTF_8);
+        System.out.println(URLDecoder.decode(keyword, StandardCharsets.UTF_8));
+    }
+
+    private <Q , S> String get(Q q,Class<S> tClass,String requestType,String requestDesc) throws UnsupportedEncodingException {
+        // 请求地址
+        String url = chengTaiApiConfigurationProperties.getUrl() + requestType;
+        String urlWithParams = buildGetUrlWithParams(url, q);
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        HttpEntity<Void> entity = new HttpEntity<>(headers);
+        String requestParamLog = q != null ? JSON.toJSONString(q, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty) : "无参数";
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(),
+                "\n\t---------> {} \n\t---------> URL: {} \n\t---------> 请求参数:{}",
+                requestDesc, urlWithParams, requestParamLog);
+//        ResponseEntity<String> response = restTemplateIgnoreSSL.getForEntity(urlWithParams, String.class, entity);
+//
+//        String rawResponseBody = response.getBody();
+//        String fixedResponseBody = fixJsonString(rawResponseBody);
+//        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> 响应参数:{}",
+//                requestDesc, fixedResponseBody);
+        return urlWithParams;
+    }
+
+    /**
+     * 提取参数
+     * @param rawJson
+     * @return
+     */
+    private String fixJsonString(String rawJson) {
+        // 解析为JSONObject
+        try {
+            JSONObject jsonObject = JSON.parseObject(rawJson);
+            // 获取所有字段名
+            Set<String> keySet = jsonObject.keySet();
+
+            for (String key : keySet) {
+                Object value = jsonObject.get(key);
+                if (value instanceof String) {
+                    String strValue = (String) value;
+                    if (strValue.startsWith("[") && strValue.endsWith("]")) {
+                        try {
+                            // 转换为JSON数组并替换原字段
+                            JSONArray jsonArray = JSON.parseArray(strValue);
+                            jsonObject.put(key, jsonArray);
+                        } catch (Exception e) {
+                            System.out.println("字段[" + key + "]的值不是合法JSON数组,保留原字符串:" + strValue);
+                        }
+                    }
+                    else if (strValue.startsWith("{") && strValue.endsWith("}")) {
+                        try {
+                            JSONObject subJsonObject = JSON.parseObject(strValue);
+                            jsonObject.put(key, subJsonObject);
+                        } catch (Exception e) {
+                            System.out.println("字段[" + key + "]的值不是合法JSON对象,保留原字符串:" + strValue);
+                        }
+                    }
+
+                }
+            }
+            return jsonObject.toJSONString();
+        } catch (Exception e) {
+            String errorMsg = "JSON解析失败:" + rawJson;
+            throw new SystemException(errorMsg);
+        }
+    }
+
+    private String buildGetUrlWithParams(String baseUrl, Object paramObj) throws UnsupportedEncodingException {
+        if (paramObj == null) {
+            return baseUrl;
+        }
+
+        // 1. 将对象转为Map
+        Map<String, Object> paramMap;
+        if (paramObj instanceof Map) {
+            paramMap = (Map<String, Object>) paramObj;
+        } else {
+            // 实体类转为Map
+            paramMap = JSON.parseObject(JSON.toJSONString(paramObj), Map.class);
+        }
+
+        // 2. 拼接URL参数
+        StringBuilder urlBuilder = new StringBuilder(baseUrl);
+        boolean isFirstParam = true;
+        for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
+            String key = entry.getKey();
+            Object value = entry.getValue();
+
+            if (value == null || "".equals(value.toString().trim())) {
+                continue;
+            }
+
+            if (isFirstParam) {
+                urlBuilder.append("?");
+                isFirstParam = false;
+            } else {
+                urlBuilder.append("&");
+            }
+
+            // URL编码
+            String encodedKey = URLEncoder.encode(key, String.valueOf(StandardCharsets.UTF_8));
+            String encodedValue = URLEncoder.encode(value.toString(), String.valueOf(StandardCharsets.UTF_8));
+
+            // 拼接键值对
+            urlBuilder.append(encodedKey).append("=").append(encodedValue);
+        }
+
+        return urlBuilder.toString();
+    }
+    /**
+     * xml请求
+     * @param requestType
+     * @param nameSpace
+     * @return
+     */
+    private <Q , S> S postXml(Q q, Class<S> tClass, String requestUrl,String requestType,String requestDesc,String nameSpace) throws JsonProcessingException {
+        String url = chengTaiApiConfigurationProperties.getUrl() + requestUrl;
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        MediaType mediaType = MediaType.parseMediaType("text/xml;charset=UTF-8");
+        httpHeaders.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 " +
+                "Safari/537.36");
+        httpHeaders.setContentType(mediaType);
+        httpHeaders.add("SOAPAction", "");
+
+        XmlMapper xmlMapper = new XmlMapper();
+        xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
+        String requestXml = buildSoapEnvelope(xmlMapper.writeValueAsString(q), requestType,nameSpace);
+
+        HttpEntity<String> entity = new HttpEntity<>(requestXml, httpHeaders);
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                requestDesc, url, requestXml);
+
+        ResponseEntity<String> response = restTemplateIgnoreSSL.postForEntity(url, entity, String.class);
+        String responseBody = extractSoapBodyContent(response.getBody());
+        InsuranceLog.infoLog(InsuranceEnum.CHAC.getPinyin(), "\n\t---------> {} \n\t---------> 响应参数:{}",
+                requestDesc, responseBody);
+        return xmlMapper.readValue(responseBody, tClass);
+    }
+
+
+    /**
+     * 拼接soap请求体
+     * @param businessXml
+     * @param requestType
+     * @param nameSpace
+     * @return
+     */
+    private String buildSoapEnvelope(String businessXml,String requestType,String nameSpace) {
+        String dynamicNodeName = "pol:" + requestType.trim();
+        return  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+                + "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "
+                + "xmlns:pol=\"http://" + nameSpace + ".provider.app.vhlthirdparty.echannel.ebiz.isoftstone.com/\">"
+                + "<soapenv:Header/>"
+                + "<soapenv:Body>"
+                + "<" + dynamicNodeName + ">"
+                + businessXml
+                + "</" + dynamicNodeName + ">"
+                + "</soapenv:Body>"
+                + "</soapenv:Envelope>";
+    }
+
+    /**
+     * 提取SOAP响应中的正文内容
+     * @param soapResponse
+     * @return
+     */
+    private String extractSoapBodyContent(String soapResponse) {
+        int start = soapResponse.indexOf("<return>");
+        int returnTagEnd = soapResponse.indexOf(">", start) + 1;
+        int end = soapResponse.indexOf("</return>");
+        return soapResponse.substring(returnTagEnd, end).trim();
+    }
+
+    /**
+     * 将上传请求对象转换为表单参数
+     * @param
+     * @return
+     */
+    private <T> MultiValueMap<String, String> convertToFormParams(T t) {
+        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>();
+
+        if (t == null) {
+            return paramMap;
+        }
+        Map<String, Object> entityMap = JSON.parseObject(JSON.toJSONString(t), Map.class);
+        for (Map.Entry<String, Object> entry : entityMap.entrySet()) {
+            String key = entry.getKey();
+            Object valueObj = entry.getValue();
+
+            if (valueObj == null || "".equals(valueObj.toString().trim())) {
+                continue;
+            }
+            String value = valueObj.toString();
+            paramMap.add(key, value);
+        }
+        return paramMap;
+    }
+
+
+    /**
+     * 查询车型
+     */
+    public CarModelQueryResponse carModelQuery(CarModelQueryRequest carModelQueryRequest) {
+        String requestType = RequestType.Z00014.getCode();
+        String requestDesc = RequestType.Z00014.getDesc();
+        return post(carModelQueryRequest, CarModelQueryResponse.class, requestType,requestDesc);
+    }
+
+    /**
+     *  报价
+     */
+    public PremiumCalculationResponse premiumCalculation(PremiumCalculationRequest premiumCalculationRequest) throws JsonProcessingException {
+        String requestUrl = RequestType.Z00013.getCode();
+        String requestType = RequestType.Z00013.getType();
+        String requestDesc = RequestType.Z00013.getDesc();
+        String nameSpace = RequestType.Z00013.getNameSpace();
+        return postXml(premiumCalculationRequest, PremiumCalculationResponse.class, requestUrl,requestType,requestDesc,nameSpace);
+    }
+
+    /**
+     * 上传影像
+     */
+    public String upLoad(UpLoadRequest upLoadRequest) {
+        String requestType = RequestType.Z00015.getCode();
+        String requestDesc = RequestType.Z00015.getDesc();
+        MultiValueMap<String, String> paramMap = convertToFormParams(upLoadRequest);
+        return postForm(paramMap, requestType,requestDesc);
+    }
+
+    /**
+     * 核保
+     */
+    public SubmitResponse submit(SubmitRequest submitRequest) throws JsonProcessingException {
+        String requestUrl = RequestType.Z00016.getCode();
+        String requestType = RequestType.Z00016.getType();
+        String requestDesc = RequestType.Z00016.getDesc();
+        String nameSpace = RequestType.Z00016.getNameSpace();
+        return postXml(submitRequest, SubmitResponse.class, requestUrl, requestType, requestDesc,nameSpace);
+    }
+
+    /**
+     * 支付
+     */
+    public String payment(PaymentRequest paymentRequest) throws UnsupportedEncodingException {
+        String requestUrl = RequestType.Z00017.getCode();
+        String requestDesc = RequestType.Z00017.getDesc();
+        return get(paymentRequest, PaymentResponse.class,requestUrl,requestDesc);
+    }
+
+    /**
+     * 电子保单
+     */
+    public PolicyElectronicResponse policyElectronic(PolicyElectronicRequest policyElectronicRequest) {
+        String requestUrl = RequestType.Z00018.getCode();
+        String requestDesc = RequestType.Z00018.getDesc();
+        return post(policyElectronicRequest, PolicyElectronicResponse.class, requestUrl, requestDesc);
+    }
+
+    /**
+     * 保单状态查询
+     */
+    public PolicyStatusResponse policyStatus(PolicyStatusRequest policyStatusRequest) {
+        String requestUrl = RequestType.Z00019.getCode();
+        String requestDesc = RequestType.Z00019.getDesc();
+        return post(policyStatusRequest, PolicyStatusResponse.class, requestUrl, requestDesc);
+    }
+
+    /**
+     * 撤单
+     */
+    public PolicyRecallResponse policyRecall(PolicyRecallRequest policyRecallRequest) {
+        String requestUrl = RequestType.Z00020.getCode();
+        String requestDesc = RequestType.Z00020.getDesc();
+        return post(policyRecallRequest, PolicyRecallResponse.class, requestUrl, requestDesc);
+    }
+}
+

+ 0 - 7
src/main/java/com/ydtech/modules/order/components/yangguang/YangGuangRequestApiComponents.java

@@ -15,7 +15,6 @@ import com.ydtech.modules.order.utils.InsuranceLog;
 import lombok.extern.slf4j.Slf4j;
 
 import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.SimpleHttpConnectionManager;
 import org.apache.commons.httpclient.methods.PostMethod;
 import org.redisson.api.RedissonClient;
@@ -26,8 +25,6 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
-import java.time.LocalDateTime;
-import java.util.Date;
 import java.util.Map;
 
 @Slf4j
@@ -108,10 +105,6 @@ public class YangGuangRequestApiComponents {
 
                 result = new String(bodydata, "UTF-8");
             }
-        } catch (HttpException localHttpException) {
-            throw localHttpException;
-        } catch (Exception localException4) {
-            throw localException4;
         } finally {
             if (postMethod != null)
                 try {

+ 53 - 25
src/main/java/com/ydtech/modules/order/controller/ChengTaiOrderApiController.java

@@ -6,9 +6,13 @@ import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.aop.AuditVerification;
 import com.ydtech.modules.order.aop.QuoteVerification;
 import com.ydtech.modules.order.components.InsOrdersComponents;
-import com.ydtech.modules.order.entity.api.chengtai.response.CarInfoResponse;
+import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
+import com.ydtech.modules.order.entity.api.chengtai.request.PaymentCallBackRequest;
+import com.ydtech.modules.order.entity.api.chengtai.request.SubmitCallBackRequest;
+import com.ydtech.modules.order.entity.api.chengtai.request.UnderwriteCallBackRequest;
 import com.ydtech.modules.order.entity.vo.*;
 import com.ydtech.modules.order.service.ChengTaiOrderApiService;
+import com.ydtech.modules.order.service.InsOrdersService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
@@ -19,9 +23,6 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Collectors;
 
 @Api(tags = "诚泰财险 API")
 @RestController
@@ -33,25 +34,28 @@ public class ChengTaiOrderApiController {
 
     private final InsOrdersComponents insOrdersComponents;
 
+    private final InsOrdersService insOrdersService;
+
     @Resource(name = "restTemplateIgnoreSSL")
     private RestTemplate restTemplateIgnoreSSL;
 
     @QuoteVerification("报价授权")
     @PostMapping("/quote")
     @ApiOperation("报价")
-    public HttpResult<QuoteRespVo> quote(@RequestBody BaseQuoteVo<List<QuoteAccidentalDrivingVo>> quoteVo) throws Exception {
+    public HttpResult<QuoteRespVo> quote(@RequestBody BaseQuoteVo<QuoteAccidentalDrivingVo> quoteVo) throws Exception {
+        BaseQuoteVo<InsDrivingIntentionInsurance> baseQuoteVo = insOrdersService.convertDriving(quoteVo);
         BaseQuoteInfoVo quoteInfo = this.insOrdersComponents.getQuoteInfo(quoteVo.getOrderNo(), quoteVo.getAgreementId(),quoteVo.getKinds());
-        return this.chengTaiOrderApiService.quoteApi(quoteInfo, null);
+        return this.chengTaiOrderApiService.quote(quoteInfo, baseQuoteVo);
     }
 
-    @PostMapping(value = "/modelsQuery")
-    @ApiOperation(value = "车型查询接口")
-    public HttpResult<List<CarInfoResponse.CarModelListDTO>> modelsQuery(@RequestSingleParam(value = "modelName") String modelName) throws Exception {
-        CarInfoResponse response = this.chengTaiOrderApiService.modelsQuery(modelName);
-        List<CarInfoResponse.CarModelListDTO> carModelDTOS =
-                response.getCarModelList().stream().sorted(Comparator.comparing(CarInfoResponse.CarModelListDTO::getModelName)).collect(Collectors.toList());
-        return HttpResult.ok(carModelDTOS);
-    }
+//    @PostMapping(value = "/modelsQuery")
+//    @ApiOperation(value = "车型查询接口")
+//    public HttpResult<List<CarInfoResponse.CarModelListDTO>> modelsQuery(@RequestSingleParam(value = "modelName") String modelName) throws Exception {
+//        CarInfoResponse response = this.chengTaiOrderApiService.modelsQuery(modelName);
+//        List<CarInfoResponse.CarModelListDTO> carModelDTOS =
+//                response.getCarModelList().stream().sorted(Comparator.comparing(CarInfoResponse.CarModelListDTO::getModelName)).collect(Collectors.toList());
+//        return HttpResult.ok(carModelDTOS);
+//    }
 
     @PostMapping(value = "/submitImage")
     @ApiOperation(value = "提交影像信息")
@@ -63,36 +67,60 @@ public class ChengTaiOrderApiController {
     @PostMapping(value = "/audit")
     @ApiOperation(value = "提交核保")
     public HttpResult<Object> audit(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
-        return this.chengTaiOrderApiService.audit(companyId);
+        return this.chengTaiOrderApiService.submit(companyId);
+    }
+
+    @PostMapping(value = "/auditCallBack")
+    @ApiOperation(value = "核保回调")
+    public HttpResult<Object> auditCallBack(SubmitCallBackRequest submitCallBackRequest) throws Exception {
+        return this.chengTaiOrderApiService.submitCallBack(submitCallBackRequest);
+    }
+
+    @PostMapping(value = "/payment")
+    @ApiOperation(value = "支付")
+    public String payment(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
+        return this.chengTaiOrderApiService.payment(companyId);
+    }
+
+    @PostMapping(value = "/paymentCallBack")
+    @ApiOperation(value = "支付回调")
+    public HttpResult<Object> paymentCallBack(PaymentCallBackRequest paymentCallBackRequest) throws Exception {
+        return this.chengTaiOrderApiService.paymentCallBack(paymentCallBackRequest);
+    }
+
+    @PostMapping(value = "/underwriteCallBack")
+    @ApiOperation(value = "承保回调")
+    public HttpResult<Object> underwriteCallBack(UnderwriteCallBackRequest underwriteCallBackRequest) throws Exception {
+        return this.chengTaiOrderApiService.underwriteCallBack(underwriteCallBackRequest);
     }
 
     @PostMapping("/getOrderDetail")
     @ApiOperation(value = "订单状态查询")
     public HttpResult<Object> getOrderDetail(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
-        return this.chengTaiOrderApiService.getOrderDetail(companyId);
+        return this.chengTaiOrderApiService.policyStatus(companyId);
     }
 
     @PostMapping("/auditStatusQuery")
     @ApiOperation(value = "核保状态查询")
     public HttpResult<Object> auditStatusQuery(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
-        return this.chengTaiOrderApiService.auditStatusQuery(companyId);
+        return this.chengTaiOrderApiService.policyStatus(companyId);
     }
 
     @PostMapping("/getPolicyPrint")
     @ApiOperation(value = "电子保单")
-    public HttpResult<String> getPolicyPrint(@RequestBody PolicyPrintVo policyPrintVo) throws Exception {
-        return this.chengTaiOrderApiService.getPolicyPrint(policyPrintVo);
+    public HttpResult<Object> getPolicyPrint(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
+        return this.chengTaiOrderApiService.policyElectronic(companyId);
     }
 
-    @PostMapping("/getPayUrl")
-    @ApiOperation(value = "支付链接")
-    public HttpResult<String> getPayUrl(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
-        return this.chengTaiOrderApiService.getPayUrl(companyId);
-    }
+//    @PostMapping("/getPayUrl")
+//    @ApiOperation(value = "支付链接")
+//    public HttpResult<String> getPayUrl(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
+//        return this.chengTaiOrderApiService.getPayUrl(companyId);
+//    }
 
     @PostMapping(value = "/cancel")
     @ApiOperation(value = "未缴费保单撤单")
     public HttpResult<Object> cancel(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
-        return this.chengTaiOrderApiService.cancel(companyId);
+        return this.chengTaiOrderApiService.policyRecall(companyId);
     }
 }

+ 9 - 8
src/main/java/com/ydtech/modules/order/controller/QuoteController.java

@@ -257,17 +257,18 @@ public class QuoteController extends BaseController {
                             .eq(InsDrivingIntentionInsurance::getSeatNum, finalJavaObject.getSeatNum())
                     );
                     InsDrivingIntentionInsurance insDrivingIntentionInsurance = insDrivingIntentionInsuranceService.getOne(wrapper);
-                    if (StringUtils.isNotBlank(insDrivingIntentionInsurance.getRelateCode())){
-                        javaObject.setProjectCode(insDrivingIntentionInsurance.getRelateCode());
-                        quoteVo1.setAccidentalDrivingVo(javaObject);
-                    }else{
-                        throw new SystemException("驾意险失效,请检查方案配置");
-                    }
+                    quoteVo1.setAccidentalDrivingVo(insDrivingIntentionInsurance);
+//                    if (StringUtils.isNotBlank(insDrivingIntentionInsurance.getRelateCode())){
+//                        javaObject.setProjectCode(insDrivingIntentionInsurance.getRelateCode());
+//                        quoteVo1.setAccidentalDrivingVo(javaObject);
+//                    }else{
+//                        throw new SystemException("驾意险失效,请检查方案配置");
+//                    }
                 }else{
                     quoteVo1.setAccidentalDrivingVo(javaObject);
                 }
             }
-            respVo = chengTaiOrderApiService.quoteApi(quoteInfo, quoteVo1);
+            respVo = chengTaiOrderApiService.quote(quoteInfo, quoteVo1);
         }
         if ("YGBX1000000".equals(ptlAgreementAttribution.getInsCompanyId()) && Objects.isNull(respVo)) {
             BaseQuoteVo<List<YgQuoteAccidentVo>> quoteVo1 = new BaseQuoteVo<>();
@@ -407,7 +408,7 @@ public class QuoteController extends BaseController {
                 }catch (Exception e){}
             } else if (item.getCompanyId().equals("CHAC1000000")) {
                 try {
-                    chengTaiOrderApiService.getPayUrl(item.getId());
+                    chengTaiOrderApiService.payment(item.getId());
                 } catch (Exception e) {
                     throw new RuntimeException(e);
                 }

+ 42 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/Base64.java

@@ -0,0 +1,42 @@
+package com.ydtech.modules.order.entity.api.chengtai;
+
+import javax.mail.internet.MimeUtility;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+/**
+ * @author quchen
+ * @date 2026/3/12 17:08
+ */
+
+public class Base64 {
+    public static byte[] encode(byte[] b) throws Exception {
+        ByteArrayOutputStream baos = null;
+        OutputStream b64os = null;
+        try {
+            baos = new ByteArrayOutputStream();
+            b64os = MimeUtility.encode(baos, "base64");
+            b64os.write(b);
+            b64os.close();
+            return baos.toByteArray();
+        } catch (Exception e) {
+            throw new Exception(e);
+        } finally {
+            try {
+                if (baos != null) {
+                    baos.close();
+                    baos = null;
+                }
+            } catch (Exception e) {
+            }
+            try {
+                if (b64os != null) {
+                    b64os.close();
+                    b64os = null;
+                }
+            } catch (Exception e) {
+            }
+        }
+    }
+}

+ 48 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/SecurityUrl.java

@@ -0,0 +1,48 @@
+package com.ydtech.modules.order.entity.api.chengtai;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import javax.crypto.spec.PBEParameterSpec;
+import java.security.MessageDigest;
+
+/**
+ * @author quchen
+ * @date 2026/3/12 17:07
+ */
+
+public class SecurityUrl {
+    protected final static Log logger = LogFactory.getLog(SecurityUrl.class);
+    private final static int ITERATIONS = 20;
+    public static String encrypt(String key, String plainText) throws Exception {
+        try {
+            byte[] salt = new byte[8];
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.update(key.getBytes());
+            byte[] digest = md.digest();
+            for (int i = 0; i < 8; i++) {
+                salt[i] = digest[i];
+            }
+            PBEKeySpec pbeKeySpec = new PBEKeySpec(key.toCharArray());
+            SecretKeyFactory keyFactory = SecretKeyFactory
+                    .getInstance("PBEWithMD5AndDES");
+            SecretKey skey = keyFactory.generateSecret(pbeKeySpec);
+            PBEParameterSpec paramSpec = new PBEParameterSpec(salt, ITERATIONS);
+            Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
+            cipher.init(Cipher.ENCRYPT_MODE, skey, paramSpec);
+            byte[] cipherText = cipher.doFinal(plainText.getBytes());
+            String saltString = new String(com.ydtech.modules.order.entity.api.chengtai.Base64.encode(salt));
+            String ciphertextString = new String(Base64.encode(cipherText));
+            String re = saltString + ciphertextString;
+            re = new BASE64Encoder().encode(re.getBytes());
+            return re;
+        } catch (Exception e) {
+            throw new Exception("Encrypt Text Error:" + e.getMessage(), e);
+        }
+    }
+}

+ 75 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/XmlDateTimeFormatter.java

@@ -0,0 +1,75 @@
+package com.ydtech.modules.order.entity.api.chengtai;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.regex.Pattern;
+
+/**
+ * @author quchen
+ * @date 2026/3/6 9:44
+ */
+
+public class XmlDateTimeFormatter {
+    // 正则:匹配纯日期(yyyy-MM-dd)
+    private static final Pattern DATE_PATTERN = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");
+    // 正则:匹配带时间的日期(yyyy-MM-dd HH:mm:ss)
+    private static final Pattern DATETIME_PATTERN = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}$");
+    // 东八区时区
+    private static final String TIMEZONE_OFFSET = "+08:00";
+    // 纯日期默认补充的时间
+    private static final String DEFAULT_TIME = "00:00:00";
+    public static String format(String dateStr) {
+        return format(dateStr, DEFAULT_TIME);
+    }
+    public static String format(String dateStr, String defaultTime) {
+        // 1. 空值/非字符串直接返回空
+        if (dateStr == null || dateStr.trim().isEmpty()) {
+            return "";
+        }
+        String trimStr = dateStr.trim();
+
+        // 2. 匹配纯日期(yyyy-MM-dd)
+        if (DATE_PATTERN.matcher(trimStr).matches()) {
+            try {
+                // 拼接默认时间,转换为带时间的格式
+                String fullDatetime = trimStr + " " + (defaultTime == null ? DEFAULT_TIME : defaultTime);
+                return convertToXmlFormat(fullDatetime);
+            } catch (Exception e) {
+                // 异常时返回空,避免影响主流程
+                System.err.println("纯日期格式化失败:" + dateStr + ",错误:" + e.getMessage());
+                return "";
+            }
+        }
+
+        // 3. 匹配带时间的日期(yyyy-MM-dd HH:mm:ss)
+        if (DATETIME_PATTERN.matcher(trimStr).matches()) {
+            try {
+                return convertToXmlFormat(trimStr);
+            } catch (Exception e) {
+                System.err.println("带时间日期格式化失败:" + dateStr + ",错误:" + e.getMessage());
+                return "";
+            }
+        }
+
+        // 4. 不匹配任何格式,返回原始值(避免破坏原有逻辑)
+        System.err.println("日期格式不支持:" + dateStr + ",仅支持 yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss");
+        return dateStr;
+    }
+
+    private static String convertToXmlFormat(String datetimeStr) throws ParseException {
+        // 验证时间格式合法性(避免无效时间如 25:61:61)
+        SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        inputFormat.setLenient(false); // 严格校验时间格式
+        Date date = inputFormat.parse(datetimeStr);
+
+        // 格式化为带T分隔符的字符串(yyyy-MM-dd'T'HH:mm:ss)
+        SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+        outputFormat.setTimeZone(TimeZone.getTimeZone("GMT+8")); // 东八区
+        String tSeparated = outputFormat.format(date);
+
+        // 拼接时区偏移
+        return tSeparated + TIMEZONE_OFFSET;
+    }
+}

+ 106 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/CarActualValueEnum.java

@@ -0,0 +1,106 @@
+package com.ydtech.modules.order.entity.api.chengtai.constants;
+
+import com.ydtech.exception.SystemException;
+import lombok.Getter;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+
+/**
+ * @author quchen
+ * @date 2026/2/27 18:32
+ */
+@Getter
+public enum CarActualValueEnum {
+    // ============================非能源车==============================
+    NON_ENERGY_CAR(new String[]{"0"}, new String[]{"05"},"A0",null, new BigDecimal("0.006"),"9座(含9座)以下非营运载客汽车(包括轿车、含越野型)"),
+
+    NON_ENERGY_CAR_TAXI_CARGO(new String[]{"0"},new String[]{"01","04","08"},"A1",null,new BigDecimal("0.012"),"出租汽车与及大于6吨载货汽车、矿山作业专用车"),
+
+    NON_ENERGY_CAR_OTHER(new String[]{"0"},new String[]{"01","02","03","04","05","06","07","08"},null, null, new BigDecimal("0.009"),"其他类型车辆"),
+    // ===========================能源车================================
+    ENERGY_CAR_10W(new String[]{"1"}, new String[]{"01","02","03","04","05","06","07","08"}, "A0",new PriceRange(null,new BigDecimal("100000")), new BigDecimal("0.0082"),"9座(含9座)客车,纯电动,新车购置价<10万"),
+    ENERGY_CAR_10W_TO_20W(new String[]{"1"}, new String[]{"01","02","03","04","05","06","07","08"},"A0", new PriceRange(new BigDecimal("100000"),new BigDecimal("200000")), new BigDecimal("0.0077"),"9座(含9座)客车,纯电动,新车购置价>=10万<20万"),
+    ENERGY_CAR_20W_TO_30W(new String[]{"1"}, new String[]{"01","02","03","04","05","06","07","08"},"A0", new PriceRange(new BigDecimal("200000"),new BigDecimal("300000")), new BigDecimal("0.0072"),"9座(含9座)客车,纯电动,新车购置价>=20万<30万"),
+    ENERGY_CAR_30W(new String[]{"1"}, new String[]{"01","02","03","04","05","06","07","08"}, "A0",new PriceRange(new BigDecimal("300000"),null), new BigDecimal("0.0068"),"9座(含9座)客车,纯电动,新车购置价>=30万"),
+    ENERGY_CAR_FUEL_CELL_PHEV(new String[]{"2","3"}, new String[]{"01","02","03","04","05","06","07","08"}, "A0",null, new BigDecimal("0.0063"),"9座(含9座)客车,燃料电池、插电式混合动力"),
+    ENERGY_CAR_LOW_SPEED_TRUCK(new String[]{"1","2","3","4","9"}, new String[]{"01","02","03","04","05","06","07","08"}, "A1",null, new BigDecimal("0.011"),"低速货车、三轮汽车"),
+    ENERGY_CAR_OTHER(new String[]{"4","9"}, new String[]{"01","02","03","04","05","06","07","08"}, "A0",null, new BigDecimal("0.009"),"其他类型车辆");
+    private final String[] energyType; // 能源种类 0-燃油 1-纯电动 2-燃料电池 3-插电式混合动力 4-其他混合动力 9-其他
+    private final String[] vehicleUse; // 车辆用途 01-营业出租租赁 02-营业城市公交 03-营业公路客运 04-营业货运 05-家庭自用 06-非营业机关 07-非营业企业 08-非营业货运
+
+    private final String vehicleType; // 车辆种类 A0-客车 A1-货车
+    private final PriceRange priceRange; // 新车购置价价格区间(仅纯电动客车有值)
+    private final BigDecimal monthlyDepreciationRate; // 月折旧率
+    private final String desc;
+
+    @Getter
+    public static class PriceRange {
+        private final BigDecimal min;
+        private final BigDecimal max;
+        public PriceRange(BigDecimal min, BigDecimal max) {
+            this.min = min;
+            this.max = max;
+        }
+    }
+    CarActualValueEnum(String[] energyType, String[] vehicleUse, String vehicleType, PriceRange priceRange, BigDecimal monthlyDepreciationRate, String desc) {
+        this.energyType = energyType;
+        this.vehicleUse = vehicleUse;
+        this.vehicleType = vehicleType;
+        this.priceRange = priceRange;
+        this.monthlyDepreciationRate = monthlyDepreciationRate;
+        this.desc = desc;
+    }
+
+    /**
+     * 匹配车辆折旧率
+     */
+    public static BigDecimal matchDepreciationRate(String energyType, String vehicleUse, String vehicleType, BigDecimal purchasePrice){
+        for (CarActualValueEnum enumItem : CarActualValueEnum.values()) {
+            // 匹配能源种类
+            boolean energyMatch = Arrays.asList(enumItem.getEnergyType()).contains(energyType);
+            if (!energyMatch) {
+                continue;
+            }
+            // 匹配车辆用途
+            boolean useMatch = Arrays.asList(enumItem.getVehicleUse()).contains(vehicleUse);
+            if (!useMatch) {
+                continue;
+            }
+            // 匹配车辆种类
+            boolean typeMatch = enumItem.getVehicleType().equals(vehicleType);
+            if (!typeMatch) {
+                continue;
+            }
+            // 匹配车辆购置价
+            PriceRange range = enumItem.getPriceRange();
+            if (range != null) {
+                // 购置价为空
+                if (purchasePrice == null) {
+                    continue;
+                }
+                // 价格区间匹配
+                boolean minMatch = (range.getMin() == null) || (purchasePrice.compareTo(range.getMin()) >= 0);
+                boolean maxMatch = (range.getMax() == null) || (purchasePrice.compareTo(range.getMax()) < 0);
+                if (minMatch && maxMatch) {
+                    return enumItem.getMonthlyDepreciationRate();
+                }
+            } else {
+                // 无价格区间直接匹配
+                return enumItem.getMonthlyDepreciationRate();
+            }
+        }
+        throw new SystemException("车辆折旧率匹配失败");
+    }
+
+    public static void main(String[] args) {
+        String energyType = "0";
+        String vehicleUse = "05";
+        String vehicleType = "A0";
+        BigDecimal purchasePrice = new BigDecimal("170000");
+        BigDecimal monthlyDepreciationRate = matchDepreciationRate(energyType, vehicleUse, vehicleType, purchasePrice);
+        System.out.println(monthlyDepreciationRate);
+
+    }
+
+}

+ 43 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/KindCodeEnum.java

@@ -0,0 +1,43 @@
+package com.ydtech.modules.order.entity.api.chengtai.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author quchen
+ * @date 2026/3/2 18:06
+ */
+
+@Getter
+@AllArgsConstructor
+public enum KindCodeEnum {
+    BZ("BZ","0801", "BZ","1","机动车交通事故责任强制保险"),
+    B("02", "0808","02", "1","第三者责任保险"),
+    A("01", "0808","01", "1","车辆损失保险"),
+    D3("041","0808","041","1","车上人员责任险(司机)"),
+    D4("044","0808","044","1","车上人员责任险(乘客)"),
+    MJ1("FA","0808","01","2","绝对免赔率(车损)"),
+    MJ2("FB","0808","02","2","绝对免赔率(三者)"),
+    MJ3("FD11","0808","041","2","绝对免赔率(司机)"),
+    MJ4("FD12","0808","044","2","绝对免赔率(乘客)"),
+    BD("32", "0808","02","2","三者假日翻倍险"),
+    L("21", "0808","01","2","车身划痕损失险(附加险)"),
+    SY_FJ_YBW1("YB","0808","02","2","医保外用药责任险(三者)"),
+    SY_FJ_YBW3("YD11","0808","041","2","医保外用药责任险(司机)"),
+    SY_FJ_YBW2("YD12","0808","044","2","医保外用药责任险(乘客)"),
+    TY1("S1","0808","02","2","道路救援特约"),
+    TY2("S2","0808","02","2","安全检测特约"),
+    TY3("S3","0808","02","2","代驾特约"),
+    TY4("S4","0808","02","2","代送检特约");
+
+    private final String kindCode;
+
+    private final String riskCode;
+
+    private final String mainKindCode;
+
+    private final String kindInd;
+
+    private final String desc;
+
+}

+ 26 - 12
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/RequestType.java

@@ -12,19 +12,33 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum RequestType {
 
-    Z00001("SHUB-ChacInsureLoginShub", "获取Token信息"),
-    Z00002("SHUB-ChacCarInfoQueryShub", "车辆查询"),
-    Z00003("SHUB-ChaCarCalculActualValueCalCulShub", "车辆实际价值计算"),
-    Z00004("SHUB-ChacInsurePremiumCalculationShub", "保费试算"),
-    Z00005("SHUB-ChacInsureImageUploadShub", "影像上传"),
-    Z00006("SHUB-ChacInsureProposalInsureSaveEventShub", "投保保存"),
-    Z00007("SHUB-ChacInsureProposalUnderWriteEventShub", "核保"),
-    Z00008("SHUB-ChacInsureProposalUnderWriteRetShub", "核保结果查询"),
-    Z00009("SHUB-ChacInsureApplicateRetShub", "投保结果查询"),
-    Z00010("SHUB-ChacInsureSMSReissueShub", "获取支付链接"),
-    Z00011("SHUB-ChacInsureSearchDownPolicyAddressShub", "保单下载"),
-    Z00012("SHUB-ChacCancelOrderShub", "撤销订单");
+    Z00001("SHUB-ChacInsureLoginShub", "","","获取Token信息"),
+    Z00002("SHUB-ChacCarInfoQueryShub", "","","车辆查询"),
+    Z00003("SHUB-ChaCarCalculActualValueCalCulShub", "","","车辆实际价值计算"),
+    Z00004("SHUB-ChacInsurePremiumCalculationShub", "","","保费试算"),
+    Z00005("SHUB-ChacInsureImageUploadShub", "","","影像上传"),
+    Z00006("SHUB-ChacInsureProposalInsureSaveEventShub", "","","投保保存"),
+    Z00007("SHUB-ChacInsureProposalUnderWriteEventShub", "","","核保"),
+    Z00008("SHUB-ChacInsureProposalUnderWriteRetShub", "","","核保结果查询"),
+    Z00009("SHUB-ChacInsureApplicateRetShub", "","","投保结果查询"),
+    Z00010("SHUB-ChacInsureSMSReissueShub", "","","获取支付链接"),
+    Z00011("SHUB-ChacInsureSearchDownPolicyAddressShub","", "","保单下载"),
+    Z00012("SHUB-ChacCancelOrderShub", "","","撤销订单"),
+    Z00013("cxf/policyFeeCountSerivce?wsdl", "countFee","policyfeecount","保费计算"),
+    Z00014("new/vhl/carModelQuery","","","车辆查询"),
+    Z00015("new/wechat/uploadImage","","","上传影像"),
+    Z00016("cxf/policySaveSerivce?wsdl","savePolicy","policySave","核保提交"),
+    Z00017("chac/pay/payment","","","支付"),
+    Z00018("new/vhl/policyElectronic","","","保单下载"),
+    Z00019("new/vhl/policyStatus","","","保单状态查询"),
+    Z00020("new/vhl/policyRecall","","","保单查询"),;
+
+
     private final String code;
 
+    private final String type;
+
+    private final String nameSpace;
+
     private final String desc;
 }

+ 32 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/UploadEnum.java

@@ -0,0 +1,32 @@
+package com.ydtech.modules.order.entity.api.chengtai.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author quchen
+ * @date 2026/3/4 15:36
+ */
+
+@Getter
+@AllArgsConstructor
+public enum UploadEnum {
+    C01("01-06-02", "行驶证正面"),
+    D01("01-06-02", "行驶证反面"),
+
+    C02("01-06-03", "车主身份证正面"),
+    D02("01-06-03", "车主身份证反面"),
+    Y02("01-06-09", "车主营业执照"),
+
+    C03("01-06-03", "投保人身份证正面"),
+    D03("01-06-03", "投保人身份证反面"),
+    Y03("01-06-09", "投保人营业执照"),
+
+    C04("01-06-03", "被保人身份证正面"),
+    D04("01-06-03", "被保人身份证反面"),
+    Y04("01-06-09", "被保人营业执照");
+
+    private final String code;
+
+    private final String name;
+}

+ 25 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/UseNatureShowEnum.java

@@ -0,0 +1,25 @@
+package com.ydtech.modules.order.entity.api.chengtai.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author quchen
+ * @date 2026/3/2 16:26
+ */
+
+@Getter
+@AllArgsConstructor
+public enum UseNatureShowEnum {
+    U_05("01", "家庭自用"),
+    U_07("10", "非营业企业"),
+    U_06("11", "非营业党政机关,事业团体"),
+    U_01("04", "营业出租租赁"),
+    U_02("03", "营业城市公交"),
+    U_03("02", "营业公路客运"),
+    U_04("07", "营业货运"),
+    U_08("12", "非营业货运");
+    private final String code;
+
+    private final String desc;
+}

+ 46 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/CarModelQueryRequest.java

@@ -0,0 +1,46 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.ins.model.vo.CarInfoVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/2/25 10:50
+ */
+
+@NoArgsConstructor
+@Data
+public class CarModelQueryRequest {
+    /**
+     * 品牌型号
+     */
+    @JsonProperty("brandName")
+    private String brandName;
+
+    /**
+     * 当前页
+     */
+    @JsonProperty("nowPage")
+    private String nowPage;
+
+    /**
+     * 每页条数
+     */
+    @JsonProperty("pageSize")
+    private String pageSize;
+
+    /**
+     * 是否需要编码 前台页面直接请求,该字段不填;通过后台代码请求接口时该字段填:‘00000’
+     */
+    @JsonProperty("encode")
+    private String encode;
+
+    public CarModelQueryRequest(CarInfoVo carInfo) {
+        this.brandName = carInfo.getModelcname();
+        this.nowPage = "1";
+        this.pageSize = "20";
+        this.encode = "00000";
+    }
+}

+ 33 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PaymentCallBackRequest.java

@@ -0,0 +1,33 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/11 16:49
+ */
+
+@Data
+@AllArgsConstructor
+public class PaymentCallBackRequest {
+    /**
+     * 订单号
+     */
+    private String orderCode;
+
+    /**
+     * 支付时间
+     */
+    private String payDate;
+
+    /**
+     * 付款方式
+     */
+    private String payType;
+
+    /**
+     * 交易状态
+     */
+    private String payStatus;
+}

+ 101 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PaymentRequest.java

@@ -0,0 +1,101 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/10 14:54
+ */
+
+@Data
+@AllArgsConstructor
+public class PaymentRequest {
+    /**
+     * 订单号
+     */
+    private String orderCoder;
+
+    /**
+     * 支付金额
+     */
+    private String payAmt;
+
+    /**
+     * 保险类型
+     * 0:非车;1:车险
+     */
+    private String businessType;
+
+    /**
+     * 回调地址
+     */
+    private String foreEndURL;
+
+    /**
+     * 意外险投保单号
+     */
+    private String acciAppPolicyNo;
+
+    /**
+     * 阅读标志
+     * 是否需要阅读支付条款须知;0:否;1:是;默认0
+     */
+    private String readFlag;
+
+    /**
+     * 意外险code
+     * 车+意投保,意外险编码
+     */
+    private String nvhlSuitCode;
+
+    /**
+     * 意外险保费
+     * 车+意投保,意外险保费
+     */
+    private String payAmtnvhl;
+
+    /**
+     * 批单号
+     * 批改单号,批改支付必传
+     */
+    private String randomno;
+
+    /**
+     * 非车组合号
+     * businessType传0时,非车见费组合险,组合单号;组合险必传
+     */
+    private String combinationNo;
+
+    /**
+     * 短信
+     * 短信验证码,部分业务支付需校验验证码
+     */
+    private String smsCode;
+
+    /**
+     * 产品名称
+     */
+    private String productName;
+
+    /**
+     * 备用字段
+     */
+    private String type;
+
+    public PaymentRequest(InsAreaCompany insAreaCompany) {
+        this.orderCoder = insAreaCompany.getInsOrderNo();
+        this.payAmt = String.valueOf(insAreaCompany.getSumpremium());
+        this.businessType = "1";
+        this.foreEndURL = "";
+        if (insAreaCompany.getCrossInsurance() != null && insAreaCompany.getCrossInsurance().size() > 0) {
+            this.acciAppPolicyNo = insAreaCompany.getCrossInsurance().getJSONObject(0).getString("application");
+        }
+        if (insAreaCompany.getAccidentInfo() != null && insAreaCompany.getAccidentInfo().size() > 0) {
+            this.nvhlSuitCode = insAreaCompany.getAccidentInfo().getJSONObject(0).getString("projectCode");
+            this.payAmtnvhl = insAreaCompany.getAccidentInfo().getJSONObject(0).getString("actualPremium");
+        }
+    }
+
+}

+ 76 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyElectronicRequest.java

@@ -0,0 +1,76 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.utils.SnowFlakeUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/12 9:49
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyElectronicRequest {
+    private RequestHead requestHead;
+
+    private RequestBody requestBody;
+
+    @Data
+    @NoArgsConstructor
+    public static class RequestHead {
+        /**
+         * 请求类型
+         */
+        private String requestType;
+
+        /**
+         * 用户名
+         */
+        private String userName;
+
+        /**
+         * 密码
+         */
+        private String passWord;
+
+        /**
+         * 合作伙伴编码
+         */
+        private String partnerCode;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        private String queryId;
+
+        public RequestHead(ChengTaiConfigureParameters parameters) {
+            this.requestType = "00011";
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.partnerCode = parameters.getPartnerCode();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class RequestBody {
+        /**
+         * 订单号
+         */
+        private String orderNumber;
+
+        public RequestBody(InsAreaCompany insAreaCompany) {
+            this.orderNumber = insAreaCompany.getInsOrderNo();
+        }
+    }
+
+    public PolicyElectronicRequest(ChengTaiConfigureParameters parameters, InsAreaCompany insAreaCompany) {
+        this.requestHead = new RequestHead(parameters);
+        this.requestBody = new RequestBody(insAreaCompany);
+    }
+}

+ 75 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyRecallRequest.java

@@ -0,0 +1,75 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.utils.SnowFlakeUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/13 15:42
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyRecallRequest {
+    private RequestHead requestHead;
+
+    private RequestBody requestBody;
+
+    @Data
+    @NoArgsConstructor
+    public static class RequestHead {
+        /**
+         * 请求类型
+         */
+        private String requestType;
+
+        /**
+         * 用户名
+         */
+        private String userName;
+
+        /**
+         * 密码
+         */
+        private String passWord;
+
+        /**
+         * 合作伙伴编码
+         */
+        private String partnerCode;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        private String queryId;
+
+        public RequestHead(ChengTaiConfigureParameters parameters) {
+            this.requestType = "00011";
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.partnerCode = parameters.getPartnerCode();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+        }
+    }
+    @Data
+    @NoArgsConstructor
+    public static class RequestBody {
+        /**
+         * 订单号
+         */
+        private String orderNumber;
+
+        public RequestBody(InsAreaCompany insAreaCompany) {
+            this.orderNumber = insAreaCompany.getInsOrderNo();
+        }
+    }
+
+    public PolicyRecallRequest (ChengTaiConfigureParameters parameters, InsAreaCompany insAreaCompany) {
+        this.requestHead = new RequestHead(parameters);
+        this.requestBody = new RequestBody(insAreaCompany);
+    }
+}

+ 75 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PolicyStatusRequest.java

@@ -0,0 +1,75 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.utils.SnowFlakeUtil;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/13 9:09
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyStatusRequest {
+    private RequestHead requestHead;
+
+    private RequestBody requestBody;
+
+    @Data
+    @NoArgsConstructor
+    public static class RequestHead {
+        /**
+         * 请求类型
+         */
+        private String requestType;
+
+        /**
+         * 用户名
+         */
+        private String userName;
+
+        /**
+         * 密码
+         */
+        private String passWord;
+
+        /**
+         * 合作伙伴编码
+         */
+        private String partnerCode;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        private String queryId;
+
+        public RequestHead(ChengTaiConfigureParameters parameters) {
+            this.requestType = "00011";
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.partnerCode = parameters.getPartnerCode();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+        }
+    }
+    @Data
+    @NoArgsConstructor
+    public static class RequestBody {
+        /**
+         * 订单号
+         */
+        private String orderNumber;
+
+        public RequestBody(InsAreaCompany insAreaCompany) {
+            this.orderNumber = insAreaCompany.getInsOrderNo();
+        }
+    }
+
+    public PolicyStatusRequest (ChengTaiConfigureParameters parameters, InsAreaCompany insAreaCompany) {
+        this.requestHead = new RequestHead(parameters);
+        this.requestBody = new RequestBody(insAreaCompany);
+    }
+}

+ 1396 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PremiumCalculationRequest.java

@@ -0,0 +1,1396 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.ydtech.constants.enums.InsuranceRisk;
+import com.ydtech.modules.ins.model.vo.CarInfoVo;
+import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
+import com.ydtech.modules.ins.model.vo.KindInfoVo;
+import com.ydtech.modules.ins.model.vo.RiskInfoVo;
+import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
+import com.ydtech.modules.order.entity.api.chengtai.XmlDateTimeFormatter;
+import com.ydtech.modules.order.entity.api.chengtai.constants.CtKindCodeEnum;
+import com.ydtech.modules.order.entity.api.chengtai.constants.KindCodeEnum;
+import com.ydtech.modules.order.entity.api.chengtai.constants.UseNatureShowEnum;
+import com.ydtech.modules.order.entity.api.chengtai.response.CarModelQueryResponse;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
+import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
+import com.ydtech.modules.order.entity.vo.VehicleAndVesselTax;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import com.ydtech.utils.SnowFlakeUtil;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author quchen
+ * @date 2026/2/25 11:51
+ */
+
+@NoArgsConstructor
+@Data
+@JacksonXmlRootElement(localName = "arg0")
+public class PremiumCalculationRequest {
+    /**
+     * 报文头信息(Head)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "Head")
+    private head Head;
+
+    /**
+     * 基础信息(BasePart)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "BasePart")
+    private basePart BasePart;
+
+    /**
+     * 标的信息(ItemMotor)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "ItemMotor")
+    private itemMotor ItemMotor;
+
+    /**
+     * 险种信息数据列表(RiskList)数据集(Risk)
+     */
+    @JacksonXmlElementWrapper(useWrapping = false)
+    @JacksonXmlProperty(localName = "RiskList")
+    private RiskListWrapper riskListWrapper;
+
+    /**
+     * 险别信息数据列表(KindList)数据集(Kind)
+     */
+    @JacksonXmlElementWrapper(useWrapping = false)
+    @JacksonXmlProperty(localName = "KindList")
+    private KindListWrapper kindListWrapper;
+
+//    /**
+//     * 驾驶人列表列表(Driverlist)数据集(Driver)
+//     * 此节点单交强不用传  商业险时:驾驶人列表节点有就传 没有就不传
+//     */
+//    @JacksonXmlProperty(localName = "DriverList")
+//    private List<Driver> DriverList;
+
+    /**
+     * 车船税(CarShipTax)
+     * 此节点可选 ,不传默认代收税且上次缴费年度默认为投保的上一年
+     */
+    @JacksonXmlProperty(localName = "CarShipTax")
+    private carShipTax CarShipTax;
+
+    /**
+     * 投保人信息(RelatedParty)
+     */
+    @JacksonXmlProperty(localName = "RelatedParty")
+    private relatedParty RelatedParty;
+
+    /**
+     * 被保险人信息(RiskRelatedParty)
+     */
+    @JacksonXmlProperty(localName = "RiskRelatedParty")
+    private riskRelatedParty RiskRelatedParty;
+
+    public PremiumCalculationRequest(BaseQuoteInfoVo quoteInfoVo, BigDecimal actualValue,
+                                     ChengTaiConfigureParameters  parameters, CarModelQueryResponse.vehicle vehicle,
+                                     BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,List<RiskInfoVo> riskList) {
+        this.Head = new head(parameters);
+        this.BasePart = new basePart(quoteInfoVo,
+                quoteVo);
+        this.ItemMotor = new itemMotor(quoteInfoVo.getOwnerInfo(),quoteInfoVo.getCarInfo(),vehicle,actualValue);
+        this.riskListWrapper = new RiskListWrapper();
+        this.riskListWrapper.setRisks(Risk.buildRiskList(riskList));
+        this.kindListWrapper = new KindListWrapper();
+        this.kindListWrapper.setKinds(Kind.buildKindList(
+                quoteInfoVo.getKindList(),quoteInfoVo.getRiskList(),
+                Integer.parseInt(quoteInfoVo.getCarInfo().getSeatCount()),actualValue
+        ));
+        this.CarShipTax = new carShipTax(quoteInfoVo.getVehicleAndVesselTax(),riskList);
+        this.RelatedParty = new relatedParty(quoteInfoVo.getPolicyHolderInfo());
+        this.RiskRelatedParty = new riskRelatedParty(quoteInfoVo.getInsuredPersonInfo());
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class head {
+        /**
+         * 请求类型
+         */
+        @JacksonXmlProperty(localName = "requestType")
+        private String requestType;
+
+        /**
+         * 用户名
+         */
+        @JacksonXmlProperty(localName = "userName")
+        private String userName;
+
+        /**
+         * 密码
+         */
+        @JacksonXmlProperty(localName = "passWord")
+        private String passWord;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        @JacksonXmlProperty(localName = "queryId")
+        private String queryId;
+
+        /**
+         * 合作伙伴代码
+         */
+        @JacksonXmlProperty(localName = "partnerCode")
+        private String partnerCode;
+
+        @JacksonXmlProperty(localName = "operatorIp")
+        private String operatorIp;
+
+        public head(ChengTaiConfigureParameters parameters) {
+            this.requestType = "00001";
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+            this.partnerCode = parameters.getPartnerCode();
+            this.operatorIp = "0.0.0.1";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class basePart {
+        /**
+         * 计划代码 组合险时填组合险代码,单险种填险种代码 0801交强险 0808商业险 1363组合险
+         */
+        @JacksonXmlProperty(localName = "planCode")
+        private String planCode;
+
+        /**
+         * 城市代码
+         */
+        @JacksonXmlProperty(localName = "cityCode")
+        private String cityCode;
+
+        /**
+         * 续保标志
+         * 0	新保
+         * 1	续保(暂不支持续保功能)
+         */
+        @JacksonXmlProperty(localName = "renewInd")
+        private String renewInd;
+
+        /**
+         * 订单号 二次保费计算订单号必传
+         */
+        @JacksonXmlProperty(localName = "orderNumber")
+        private String orderNumber;
+
+        /**
+         * 交强险转保车答案
+         */
+        @JacksonXmlProperty(localName = "compRenewalAnswer")
+        private String compRenewalAnswer;
+
+        /**
+         * 商业险转保车答案
+         */
+        @JacksonXmlProperty(localName = "commRenewalAnswer")
+        private String commRenewalAnswer;
+
+        /**
+         * 非车产品code
+         */
+        @JacksonXmlProperty(localName = "nvhlSuitCode")
+        private String nvhlSuitCode;
+
+        /**
+         * 被保人身份类型 投保驾乘意外险时传;01:司机,02:乘客,03司机与乘客
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+
+        public basePart(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) {
+            String productId = quoteInfoVo.getProductId();
+            if ("0330".equals(productId)) {
+                this.planCode = "0801";
+            } else if ("034001".equals(productId) || "034002".equals(productId)) {
+                this.planCode = "0808";
+            } else {
+                this.planCode = "1363";
+            }
+            this.cityCode = "140100";
+            this.renewInd = "0";
+            //转保答案
+            //this.compRenewalAnswer = "";
+            //this.commRenewalAnswer = "";
+            if(!Objects.isNull(quoteVo.getAccidentalDrivingVo())) {
+                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(quoteVo.getAccidentalDrivingVo()));
+                this.insuredType = "03";
+                this.nvhlSuitCode = jsonObject.getString("projectCode");
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class itemMotor {
+        /**
+         * 车主名称
+         */
+        @JacksonXmlProperty(localName = "carOwner")
+        private String carOwner;
+
+        /**
+         * 车牌号码
+         */
+        @JacksonXmlProperty(localName = "licenseNo")
+        private String licenseNo;
+
+        /**
+         * 发动机号
+         */
+        private String engineNo;
+
+        /**
+         * 精友车型代码
+         */
+        @JacksonXmlProperty(localName = "modelCode")
+        private String modelCode;
+
+        /**
+         * 车架号/VIN码
+         */
+        @JacksonXmlProperty(localName = "frameNo")
+        private String frameNo;
+
+        /**
+         * 新旧车标识
+         * O	旧车
+         * N	新车
+         */
+        @JacksonXmlProperty(localName = "carnewoldFlag")
+        private String carnewoldFlag;
+
+        /**
+         * 车主证件类型
+         * 01	居民身份证
+         * 02	护照
+         * 03	军人身份证
+         * 08	港澳居民来往内地通行证
+         * 09	台湾居民来往大陆通行证
+         * 10	武警身份证
+         * 11	外国人永久居留身份证
+         * 44	港澳台居民居住证
+         * 1	组织机构代码证(团体)
+         * 4	统一社会信用代码(团体)
+         */
+        @JacksonXmlProperty(localName = "vehicleTypeOfOwner")
+        private String vehicleTypeOfOwner;
+
+        /**
+         * 车主证件号码
+         */
+        @JacksonXmlProperty(localName = "vehicleOwnerIDNumber")
+        private String vehicleOwnerIDNumber;
+
+        /**
+         * 车主年龄
+         */
+        @JacksonXmlProperty(localName = "ageOfOwner")
+        private Integer ageOfOwner;
+
+        /**
+         * 车主性别
+         * 1	男
+         * 2	女
+         * 9	未说明
+         */
+        @JacksonXmlProperty(localName = "ownerGender")
+        private String ownerGender;
+
+        /**
+         * 过户标志
+         * 0	空
+         * 01	投保过户
+         * 02	批改过户
+         */
+        @JacksonXmlProperty(localName = "chgOwnerFlag")
+        private String chgOwnerFlag;
+
+        /**
+         * 过户日期
+         */
+        @JacksonXmlProperty(localName = "transferDate")
+        private String transferDate;
+
+        /**
+         * 验车情况
+         * 1	未验车
+         * 2	免验车
+         * 3	已验车
+         * 4	待补资料
+         */
+        @JacksonXmlProperty(localName = "carCheckStatus")
+        private String carCheckStatus;
+
+        /**
+         * 验车人
+         */
+        @JacksonXmlProperty(localName = "carChecker")
+        private String carChecker;
+
+        /**
+         * 验车时间
+         */
+        @JacksonXmlProperty(localName = "carCheckTime")
+        private String carCheckTime;
+
+        /**
+         * 免验车原因 验车情况为2时必传
+         * 1	单保责任险
+         * 2	按期续保未增保损失险类
+         * 3	新车
+         * 4	团单
+         */
+        @JacksonXmlProperty(localName = "carCheckReason")
+        private String carCheckReason;
+
+        /**
+         * 新使用性质
+         * 01	家庭自用汽车	机动车
+         * 02	公路客运	机动车
+         * 03	城市公交	机动车
+         * 04	租赁客车	机动车
+         * 05	出租客车	机动车
+         * 06	旅游客运	机动车
+         * 07	营业货车	机动车
+         * 08	营业挂车	机动车
+         * 09	非营业挂车	机动车
+         * 10	非营业企业	机动车
+         * 11	非营业机关、事业团体	机动车
+         * 12	非营业货车	机动车
+         */
+        @JacksonXmlProperty(localName = "useNatureShowNew")
+        private String useNatureShowNew;
+
+        /**
+         * 车辆所属性质
+         * 01	个人
+         * 02	机关/团体
+         * 03	企业
+         */
+        @JacksonXmlProperty(localName = "attachNature")
+        private String attachNature;
+
+        /**
+         * 号牌种类
+         * 代码	描述
+         * 01	大型汽车
+         * 02	小型汽车
+         * 15	挂车
+         * 16	教练汽车
+         * 99	其他
+         */
+        @JacksonXmlProperty(localName = "licenseTypeCode")
+        private String licenseTypeCode;
+
+        /**
+         * 初登日期
+         */
+        @JacksonXmlProperty(localName = "singeinDate")
+        private String singeinDate;
+
+        /**
+         * 购置日期
+         */
+        @JacksonXmlProperty(localName = "enrollDate")
+        private String enrollDate;
+
+        /**
+         * 贷款车标志
+         */
+        @JacksonXmlProperty(localName = "loanVehicleFlag")
+        private String loanVehicleFlag;
+
+        /**
+         * 车辆实际价值
+         */
+        @JacksonXmlProperty(localName = "actualValue")
+        private BigDecimal actualValue;
+
+        /**
+         * 座位数
+         */
+        @JacksonXmlProperty(localName = "seatNum")
+        private Integer seatNum;
+
+        /**
+         * 整备质量
+         */
+        @JacksonXmlProperty(localName = "completeKerbMass")
+        private Integer completeKerbMass;
+
+        /**
+         * 期望折扣
+         * 云南	65<= expectDiscount<= 135
+         * 四川	65<= expectDiscount<= 135
+         * 河南	65<= expectDiscount<= 135
+         * 山西	65<= expectDiscount<= 135
+         * 湖南	65<= expectDiscount<= 135
+         */
+        @JacksonXmlProperty(localName = "expectDiscount")
+        private Integer expectDiscount;
+
+        /**
+         * 能源种类
+         * 0	燃油
+         * 1	纯电动
+         * 2	燃料电池
+         * 3	插电式混合动力
+         * 4	其它混合动力
+         */
+        @JacksonXmlProperty(localName = "fuelTypeCode")
+        private String fuelTypeCode;
+
+        /**
+         * 交管车辆类型
+         */
+        @JacksonXmlProperty(localName = "vehicleCategory")
+        private String vehicleCategory;
+
+        /**
+         * 网约车类型
+         */
+        @JacksonXmlProperty(localName = "rentalType")
+        private String rentalType;
+
+        /**
+         * 新能源标志
+         * 0 燃油
+         * 1 新能源
+         */
+        @JacksonXmlProperty(localName = "energyFlag")
+        private String energyFlag;
+
+        /**
+         * 其他能源类型描述
+         */
+        @JacksonXmlProperty(localName = "energyDescription")
+        private String energyDescription;
+
+        /**
+         * 发证日期
+         */
+        @JacksonXmlProperty(localName = "issueDate")
+        private String issueDate;
+
+        /**
+         * 核定载质量
+         */
+        @JacksonXmlProperty(localName = "tonCount")
+        private String tonCount;
+
+        /**
+         * 排量
+         */
+        @JacksonXmlProperty(localName = "displacement")
+        private String displacement;
+
+        /**
+         * 期望系数
+         */
+        @JacksonXmlProperty(localName = "hopeCoefficient")
+        private Integer hopeCoefficient;
+
+        /**
+         * 功率 摩托车拖拉机传
+         */
+        @JacksonXmlProperty(localName = "power")
+        private Integer power;
+
+        /**
+         * 设计最高时速 摩托车传
+         */
+        @JacksonXmlProperty(localName = "maxDesignSpeed")
+        private Integer maxDesignSpeed;
+
+        /**
+         * 车辆来历凭证种类
+         * 01	销售发票
+         * 02	法院调解书
+         * 03	法院裁定书
+         * 04	法院判决书
+         * 05	仲裁裁决书
+         * 06	相关文书(继承、赠予、协议抵债)
+         * 07	批准文件
+         * 08	调拨证明
+         * 09	修理发票
+         * 10	车辆合格证
+         * 11	货物进口证明书
+         */
+        @JacksonXmlProperty(localName = "certificateType")
+        private String certificateType;
+
+        /**
+         * 车辆来历凭证编号
+         */
+        @JacksonXmlProperty(localName = "certificateNo")
+        private String certificateNo;
+
+        /**
+         * 车辆来历凭证日期
+         */
+        @JacksonXmlProperty(localName = "certificateDate")
+        private String certificateDate;
+
+        /**
+         * 修理厂ID
+         */
+        @JacksonXmlProperty(localName = "repairShopId")
+        private String repairShopId;
+
+        /**
+         * 修理厂代码
+         */
+        @JacksonXmlProperty(localName = "repairShopCode")
+        private String repairShopCode;
+
+        /**
+         * 修理厂名称
+         */
+        @JacksonXmlProperty(localName = "repairShopName")
+        private String repairShopName;
+
+        /**
+         * 总行驶里程
+         */
+        @JacksonXmlProperty(localName = "runMiles")
+        private Integer runMiles;
+
+        public itemMotor(CustomerInfoVo customerInfoVo, CarInfoVo carInfoVo,CarModelQueryResponse.vehicle vehicle,BigDecimal actualValue) {
+            this.carOwner = customerInfoVo.getName();
+            this.licenseNo = carInfoVo.getLicenseNo();
+            this.engineNo = carInfoVo.getEngineNo();
+            this.modelCode = vehicle.getModelCode();
+            this.frameNo = carInfoVo.getFrameNo();
+            this.carnewoldFlag = "O";
+            if (customerInfoVo.getProperty().equals("1")) {
+                // 个人
+                this.vehicleTypeOfOwner = "01";
+                this.attachNature = "01";
+                this.vehicleOwnerIDNumber = customerInfoVo.getIdentifyNumber();
+            } else if (customerInfoVo.getProperty().equals("0")){
+                // 企业
+                this.attachNature = "03";
+                this.vehicleTypeOfOwner = "4";
+                this.vehicleOwnerIDNumber = customerInfoVo.getOrganizationCode();
+            }
+            this.ageOfOwner = Integer.valueOf(customerInfoVo.getAge());
+            // 性别
+            if (customerInfoVo.getGender().equals("男")) {
+                this.ownerGender = "1";
+            } else if (customerInfoVo.getGender().equals("女")){
+                this.ownerGender = "2";
+            } else {
+                this.ownerGender = "9";
+            }
+            // 是否过户
+            if (carInfoVo.isTransferFlag()) {
+                this.chgOwnerFlag = "01";
+                this.transferDate = XmlDateTimeFormatter.format(carInfoVo.getTransferDate());
+            } else {
+                this.chgOwnerFlag = "0";
+            }
+            // 默认免验车
+            this.carCheckStatus = "2";
+            this.carCheckReason = "2";
+            UseNatureShowEnum useNatureCodeEnum = UseNatureShowEnum.valueOf("U_"+carInfoVo.getVehicleUse());
+            AssertionUtils.isEmpty(useNatureCodeEnum, "使用性质输入错误");
+            this.useNatureShowNew = useNatureCodeEnum.getCode();
+            this.licenseTypeCode = carInfoVo.getLicenseTypeCode();
+            this.singeinDate  = XmlDateTimeFormatter.format(carInfoVo.getRegisterDate());
+            this.issueDate = XmlDateTimeFormatter.format(carInfoVo.getIssueDate());
+            this.enrollDate = XmlDateTimeFormatter.format(carInfoVo.getRegisterDate());
+            this.actualValue = actualValue;
+            this.loanVehicleFlag = "0";
+            this.seatNum = Integer.valueOf(vehicle.getSeat());
+            this.displacement = vehicle.getVehicleDisplacement();
+            this.power = Integer.valueOf(carInfoVo.getPowerScale());
+            if (carInfoVo.getEnergyType().equals("0")) {
+                this.energyFlag = "0";
+            } else {
+                this.energyFlag = "1";
+                this.fuelTypeCode = carInfoVo.getEnergyType();
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class RiskListWrapper {
+        /**
+         * 内层 Risk 节点列表(关闭默认包裹层,指定节点名为 Risk)
+         */
+        @JacksonXmlProperty(localName = "Risk")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        private List<Risk> risks;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class Risk {
+        /**
+         * 险种代码
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+        /**
+         * 即时生效 默认:0-否
+         */
+        @JacksonXmlProperty(localName = "effectFlag")
+        private String effectFlag;
+
+        /**
+         * 起保时间 yyyy-MM-dd hh:mm:ss
+         */
+        @JacksonXmlProperty(localName = "startDate")
+        private String startDate;
+
+        /**
+         * 终保时间 yyyy-MM-dd hh:mm:ss
+         */
+        @JacksonXmlProperty(localName = "endDate")
+        private String endDate;
+
+        public static List<Risk> buildRiskList(List<RiskInfoVo> riskInfoVoList) {
+            List<Risk> riskList = new ArrayList<>();
+            for (RiskInfoVo riskInfoVo : riskInfoVoList) {
+                Risk risk = new Risk();
+                if (riskInfoVo.getRiskCode().equals("0507")) {
+                    risk.setRiskCode("0801");
+                    risk.setStartDate(XmlDateTimeFormatter.format(riskInfoVo.getStartDate()));
+                    risk.setEndDate(XmlDateTimeFormatter.format(riskInfoVo.getEndDate()));
+                    risk.setEffectFlag(riskInfoVo.getInstantFlag());
+                } else if (riskInfoVo.getRiskCode().equals("0510")) {
+                    risk.setRiskCode("0808");
+                    risk.setStartDate(XmlDateTimeFormatter.format(riskInfoVo.getStartDate()));
+                    risk.setEndDate(XmlDateTimeFormatter.format(riskInfoVo.getEndDate()));
+                    risk.setEffectFlag(riskInfoVo.getInstantFlag());
+                }
+                riskList.add(risk);
+            }
+            return riskList;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class KindListWrapper {
+        @JacksonXmlProperty(localName = "Kind")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        private List<Kind> kinds;
+    }
+    @NoArgsConstructor
+    @Data
+    public static class Kind {
+        /**
+         * 险种代码
+         * 0801	交强险
+         * 0808	机动车商业险险(2014)
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+
+        /**
+         * 险别代码
+         */
+        @JacksonXmlProperty(localName = "kindCode")
+        private String kindCode;
+
+        /**
+         * 每座保险金额
+         */
+        @JacksonXmlProperty(localName = "unitInsured")
+        private BigDecimal unitInsured;
+
+        /**
+         * 座位数
+         */
+        @JacksonXmlProperty(localName = "quantity")
+        private Integer quantity;
+
+        /**
+         * 主险/附加险标志
+         */
+        @JacksonXmlProperty(localName = "kindInd")
+        private String kindInd;
+
+        /**
+         * 主险代码
+         */
+        @JacksonXmlProperty(localName = "mainKindCode")
+        private String mainKindCode;
+
+        /**
+         * 是否投保不计免赔
+         */
+        @JacksonXmlProperty(localName = "relatedInd")
+        private String relatedInd;
+
+        /**
+         * 保险金额/赔偿金额
+         */
+        @JacksonXmlProperty(localName = "sumInsured")
+        private BigDecimal sumInsured;
+
+        /**
+         * 玻璃类型
+         */
+        @JacksonXmlProperty(localName = "valueType")
+        private String valueType;
+
+        /**
+         * 指定修理厂险费率
+         */
+        @JacksonXmlProperty(localName = "clxFee")
+        private BigDecimal clxFee;
+
+        public static List<Kind> buildKindList(List<KindInfoVo> kindInfoVoList,List<RiskInfoVo> riskInfoVoList,Integer seatNum,BigDecimal actualValue){
+            List<Kind> kindList = new ArrayList<>();
+            // 是否投保交强险
+            Boolean isJq = InsuranceRisk.getFlagByTRAFFIC(riskInfoVoList);
+            if (isJq) {
+                Kind kind = new Kind();
+                kind.setRiskCode("0801");
+                kind.setKindCode("BZ");
+                kind.setSumInsured(new BigDecimal("200000"));
+                kind.setKindInd("1");
+                kind.setMainKindCode("BZ");
+                kind.setRelatedInd("0");
+                kindList.add(kind);
+            }
+            for (KindInfoVo kindInfoVo : kindInfoVoList) {
+                Kind kind = new Kind();
+                String kindCode = kindInfoVo.getKindCode();
+                KindCodeEnum kindCodeEnum = KindCodeEnum.valueOf(KindCodeEnum.class, kindCode);
+                kind.setKindCode(kindCodeEnum.getKindCode());
+                kind.setRiskCode(kindCodeEnum.getRiskCode());
+                kind.setMainKindCode(kindCodeEnum.getMainKindCode());
+                kind.setKindInd(kindCodeEnum.getKindInd());
+                kind.setRelatedInd("0");
+                // 司机
+                if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getDriver(), kindCode) >= 0) {
+                    kind.sumInsured = BigDecimal.valueOf(kindInfoVo.getAmount());
+                    kind.unitInsured = BigDecimal.valueOf(kindInfoVo.getUnitAmount());
+                    kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+                }
+                // 乘客
+                else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getPassenger(), kindCode) >= 0) {
+                    kind.unitInsured = BigDecimal.valueOf(kindInfoVo.getUnitAmount());
+                    kind.sumInsured =
+                            BigDecimal.valueOf(kindInfoVo.getUnitAmount()).multiply(BigDecimal.valueOf(seatNum));
+                    kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+
+                }
+                // 绝对免赔
+                else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getAbsoluteDeductible(), kindCode) >= 0) {
+                    kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+                } else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getSpecialContractClause(), kindCode) >= 0) {
+                    kind.quantity = kindInfoVo.getServiceTimes();
+                } else if (CtKindCodeEnum.A.getCode().equals(kindCode)) {
+                    kind.sumInsured = actualValue;
+                } else {
+                    kind.sumInsured = BigDecimal.valueOf(kindInfoVo.getAmount());
+                    kind.quantity = seatNum;
+                }
+                kindList.add(kind);
+            }
+            return kindList;
+        }
+    }
+
+    /**
+     * 车船税
+     * 此节点可选 ,不传默认代收税且上次缴费年度默认为投保的上一年
+     */
+    @NoArgsConstructor
+    @Data
+    public static class carShipTax {
+        /**
+         * 计税分类
+         * 02	代收税
+         * 03	已完税
+         * 04	减税
+         * 05	免税
+         * 07	不征
+         */
+        @JacksonXmlProperty(localName = "taxRelifFlag")
+        private String taxRelifFlag;
+
+        /**
+         * 减免税凭证号/完税凭证号
+         */
+        @JacksonXmlProperty(localName = "paidFreeCertificate")
+        private String paidFreeCertificate;
+
+        /**
+         * 开据税务机关名称
+         */
+        @JacksonXmlProperty(localName = "taxCompancyName")
+        private String taxCompancyName;
+
+        /**
+         * 减税说明(减税原因) 减免税必传
+         * 0	无
+         * 1	具备减免税证明
+         * 2	拖拉机
+         * 3	军队、武警专用车辆
+         * 4	警车
+         * 5	外国使领馆、国际组织及其人员车辆
+         * 6	其他
+         */
+        @JacksonXmlProperty(localName = "relifReason")
+        private String relifReason;
+
+        /**
+         * 减免税方案代码 减免税必传
+         * A	按金额进行减免
+         * P	按比例进行减免
+         */
+        @JacksonXmlProperty(localName = "deductionDueType")
+        private String deductionDueType;
+
+        /**
+         * 减税比例
+         */
+        @JacksonXmlProperty(localName = "freeRate")
+        private String freeRate;
+
+        /**
+         * 税务机关省份名称
+         */
+        @JacksonXmlProperty(localName = "taxProvinceCname")
+        private String taxProvinceCname;
+
+        /**
+         * 税务机关省份代码
+         */
+        @JacksonXmlProperty(localName = "taxProvinceCode")
+        private String taxProvinceCode;
+
+        /**
+         * 凭证填发日期
+         */
+        @JacksonXmlProperty(localName = "taxDocumentDate")
+        private String taxDocumentDate;
+
+        /**
+         * 税务机关城市代码
+         */
+        @JacksonXmlProperty(localName = "taxCityCode")
+        private String taxCityCode;
+
+        /**
+         * 税务机关城市名称
+         */
+        @JacksonXmlProperty(localName = "taxCityCname")
+        private String taxCityCname;
+
+        /**
+         * 上次缴税年度
+         */
+        @JacksonXmlProperty(localName = "lastPaidYear")
+        private String lastPaidYear;
+
+        //正常交税
+        private static final String TAX_NORMAL = "1";
+        // 免税
+        private static final String TAX_EXEMPTION = "2";
+        // 减税
+        private static final String TAX_REDUCTION = "3";
+        // 已完税
+        private static final String TAX_FINISH = "4";
+        //不征
+        private static final String TAX_NOT_CHARGE = "9";
+
+        public carShipTax(VehicleAndVesselTax vehicleAndVesselTax,List<RiskInfoVo> riskInfoVoList) {
+            Boolean isJq = InsuranceRisk.getFlagByTRAFFIC(riskInfoVoList);
+            if (isJq) {
+                String flag = vehicleAndVesselTax.getTaxRelifFlag();
+                switch (flag) {
+                    case TAX_NORMAL:
+                        this.taxRelifFlag = "02";
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.lastPaidYear = String.valueOf(LocalDate.now().getYear() - 1);
+                        break;
+                    case TAX_EXEMPTION:
+                        this.taxRelifFlag = "05";
+                        this.relifReason = vehicleAndVesselTax.getRelifReason();
+                        this.freeRate = vehicleAndVesselTax.getTaxRelief();
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getExtendChar2();
+                        break;
+                    case TAX_REDUCTION:
+                        this.taxRelifFlag = "04";
+                        this.relifReason = vehicleAndVesselTax.getRelifReason();
+                        this.freeRate = vehicleAndVesselTax.getTaxRelief();
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getExtendChar2();
+                        this.lastPaidYear = String.valueOf(LocalDate.now().getYear() - 1);
+                        break;
+                    case TAX_FINISH:
+                        this.taxRelifFlag = "03";
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.taxProvinceCname = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxProvinceCode = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxDocumentDate = vehicleAndVesselTax.getTaxDocumentDate();
+                        this.taxCityCode = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxCityCname = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getPaidFreeCertificate();
+                        break;
+                    case TAX_NOT_CHARGE:
+                        this.taxRelifFlag = "07";
+                        break;
+                }
+            }
+        }
+    }
+
+    /**
+     * 投保人信息(RelatedParty)
+     */
+    @NoArgsConstructor
+    @Data
+    public static class relatedParty {
+        /**
+         * 投保人类型
+         * 1	个人
+         * 2	团体
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+
+        /**
+         * 投保人名称
+         */
+        @JacksonXmlProperty(localName = "insuredName")
+        private String insuredName;
+
+        /**
+         * 证件类型
+         * 01	居民身份证
+         * 02	护照
+         * 03	军人身份证
+         * 08	港澳居民来往内地通行证
+         * 09	台湾居民来往大陆通行证
+         * 10	武警身份证
+         * 11	外国人永久居留身份证
+         * 44	港澳台居民居住证
+         * 1	组织机构代码证(团体)
+         * 4	统一社会信用代码(团体)
+         */
+        @JacksonXmlProperty(localName = "identifyType")
+        private String identifyType;
+
+        /**
+         * 证件号码
+         */
+        @JacksonXmlProperty(localName = "identifyNumber")
+        private String identifyNumber;
+
+        /**
+         * 省代码
+         */
+        @JacksonXmlProperty(localName = "appProvince")
+        private String appProvince;
+
+        /**
+         * 市代码
+         */
+        @JacksonXmlProperty(localName = "appCity")
+        private String appCity;
+
+        /**
+         * 区/县代码
+         */
+        @JacksonXmlProperty(localName = "appDistrict")
+        private String appDistrict;
+
+        /**
+         * 详细地址
+         */
+        @JacksonXmlProperty(localName = "appCompleteAddress")
+        private String appCompleteAddress;
+
+        /**
+         * 国家代码
+         * CN 中国
+         * US 美国
+         * JP 日本
+         * KR 韩国
+         * TW 中国台湾
+         * HK 中国香港
+         * MO 中国澳门
+         * SG 新加坡
+         */
+        @JacksonXmlProperty(localName = "terrorNationality")
+        private String terrorNationality;
+
+        /**
+         * 投保人证件有效期起期
+         */
+        @JacksonXmlProperty(localName = "identifyValidDate")
+        private String identifyValidDate;
+
+        /**
+         * 投保人证件有效期止期
+         */
+        @JacksonXmlProperty(localName = "identifyValidEndDate")
+        private String identifyValidEndDate;
+
+        /**
+         * 是否长期
+         * 0-否;1-是
+         */
+        @JacksonXmlProperty(localName = "longTerm")
+        private String longTerm;
+        /**
+         * 性别
+         * 1	男
+         * 2	女
+         * 9	未说明
+         */
+        @JacksonXmlProperty(localName = "sex")
+        private String sex;
+
+        /**
+         * 出生日期
+         */
+        @JacksonXmlProperty(localName = "birthDate")
+        private String birthDate;
+
+        /**
+         * 地址
+         */
+        @JacksonXmlProperty(localName = "insuredAddress")
+        private String insuredAddress;
+
+        /**
+         * 邮政编码
+         */
+        @JacksonXmlProperty(localName = "postCode")
+        private String postCode;
+
+        /**
+         * 联系电话
+         */
+        @JacksonXmlProperty(localName = "mobilePhone")
+        private String mobilePhone;
+
+        /**
+         * E - mail
+         */
+        @JacksonXmlProperty(localName = "email")
+        private String email;
+
+        /**
+         * 单位电话
+         */
+        @JacksonXmlProperty(localName = "officePhone")
+        private String officePhone;
+
+        /**
+         * 负责人姓名
+         */
+        @JacksonXmlProperty(localName = "insuredUnitLeader")
+        private String insuredUnitLeader;
+
+        /**
+         * 单位性质名称
+         */
+        @JacksonXmlProperty(localName = "unitTypeName")
+        private String unitTypeName;
+
+        /**
+         * 单位性质
+         */
+        @JacksonXmlProperty(localName = "unitTypeCode")
+        private String unitTypeCode;
+
+        /**
+         * 联系人名称
+         */
+        @JacksonXmlProperty(localName = "contactName")
+        private String contactName;
+
+        /**
+         * 联系人电话
+         */
+        @JacksonXmlProperty(localName = "contactMobile")
+        private String contactMobile;
+
+        /**
+         * 联系人证件类型
+         */
+        @JacksonXmlProperty(localName = "contactIdentifyType")
+        private String contactIdentifyType;
+
+        /**
+         * 联系人证件号码
+         */
+        @JacksonXmlProperty(localName = "contactIdentifyNumber")
+        private String contactIdentifyNumber;
+
+        public relatedParty(CustomerInfoVo policyHolderInfo) {
+            this.insuredName = policyHolderInfo.getName();
+            this.appProvince = policyHolderInfo.getProvince();
+            this.appCity = policyHolderInfo.getCity();
+            this.appDistrict = policyHolderInfo.getCounty();
+            this.appCompleteAddress = policyHolderInfo.getAddr();
+            this.terrorNationality = "CN";
+            this.identifyValidDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyValidDate());
+            this.identifyValidEndDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyValidEndDate());
+            this.longTerm = policyHolderInfo.getIdentifyValidEndDate() != null && policyHolderInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.insuredAddress = policyHolderInfo.getAddr();
+            this.mobilePhone = policyHolderInfo.getMobile();
+            //this.postCode = "";
+            if (policyHolderInfo.getProperty().equals("1")) {
+                this.insuredType = "1";
+                this.identifyType = "01";
+                this.identifyNumber = policyHolderInfo.getIdentifyNumber();
+                this.sex = policyHolderInfo.getGender().equals("男") ? "1" : "2";
+                this.birthDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyNumber().substring(6, 10) + "-" + policyHolderInfo.getIdentifyNumber().substring(10, 12) + "-" + policyHolderInfo.getIdentifyNumber().substring(12, 14));
+                this.email = policyHolderInfo.getEmail();
+            }
+            if (policyHolderInfo.getProperty().equals("0")) {
+                this.insuredType = "2";
+                this.identifyType = "4";
+                this.identifyNumber = policyHolderInfo.getOrganizationCode();
+                this.officePhone = policyHolderInfo.getMobile();
+                this.insuredUnitLeader = policyHolderInfo.getLegalPerson();
+                this.unitTypeCode = "";
+                this.unitTypeName = "";
+                this.contactName = policyHolderInfo.getLegalPerson();
+                this.contactMobile = policyHolderInfo.getMobile();
+                this.contactIdentifyType = "01";
+                this.contactIdentifyNumber = policyHolderInfo.getLeaderIdentifyNumber();
+            }
+        }
+    }
+
+    /**
+     *
+     * 被保险人信息(RiskRelatedParty)
+     */
+    @NoArgsConstructor
+    @Data
+    public static class riskRelatedParty {
+        /**
+         * 被保险人类型
+         * 1:个人 2:团体
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+        /**
+         * 被保险人名称
+         */
+        @JacksonXmlProperty(localName = "insuredName")
+        private String insuredName;
+        /**
+         * 证件类型
+         */
+        @JacksonXmlProperty(localName = "identifyType")
+        private String identifyType;
+        /**
+         * 证件号码
+         */
+        @JacksonXmlProperty(localName = "identifyNumber")
+        private String identifyNumber;
+
+        /**
+         * 省代码
+         */
+        @JacksonXmlProperty(localName = "insuredProvince")
+        private String insuredProvince;
+        /**
+         * 市代码
+         */
+        @JacksonXmlProperty(localName = "insuredCity")
+        private String insuredCity;
+        /**
+         * 区/县代码
+         */
+        @JacksonXmlProperty(localName = "insuredDistrict")
+        private String insuredDistrict;
+
+        /**
+         * 详细地址
+         */
+        @JacksonXmlProperty(localName = "insuredCompleteAddress")
+        private String insuredCompleteAddress;
+
+        /**
+         * 国家代码
+         * CN 中国
+         * US 美国
+         * JP 日本
+         * KR 韩国
+         * TW 中国台湾
+         * HK 中国香港
+         * MO 中国澳门
+         * SG 新加坡
+         */
+        @JacksonXmlProperty(localName = "terrorNationality")
+        private String terrorNationality;
+
+        /**
+         * 投保人证件有效期起期
+         */
+        @JacksonXmlProperty(localName = "identifyValidDate")
+        private String identifyValidDate;
+
+        /**
+         * 投保人证件有效期止期
+         */
+        @JacksonXmlProperty(localName = "identifyValidEndDate")
+        private String identifyValidEndDate;
+
+        /**
+         * 是否长期
+         * 0-否;1-是
+         */
+        @JacksonXmlProperty(localName = "longTerm")
+        private String longTerm;
+
+        /**
+         * 性别
+         */
+        @JacksonXmlProperty(localName = "insuredSex")
+        private String insuredSex;
+
+        /**
+         * 出生日期
+         */
+        @JacksonXmlProperty(localName = "insuredBirthDate")
+        private String insuredBirthDate;
+
+        /**
+         * 地址
+         */
+        @JacksonXmlProperty(localName = "insuredAddress")
+        private String insuredAddress;
+
+        /**
+         * 邮政编码
+         */
+        @JacksonXmlProperty(localName = "insuredPostCode")
+        private String insuredPostCode;
+
+        /**
+         * 联系电话
+         */
+        @JacksonXmlProperty(localName = "insuredMobilePhone")
+        private String insuredMobilePhone;
+
+        /**
+         * 被保人与投保人关系
+         * 0	未知
+         * 1	配偶
+         * 2	父母
+         * 3	子女
+         * 4	祖父母
+         * 5	孙子女
+         * 6	其他
+         */
+        @JacksonXmlProperty(localName = "relationWithHolder")
+        private String relationWithHolder;
+
+        /**
+         * 被保险人与车辆关系
+         * 1	拥有
+         * 2	使用
+         * 3	管理
+         */
+        @JacksonXmlProperty(localName = "carInsuredRelation")
+        private String carInsuredRelation;
+
+        /**
+         * 单位电话
+         */
+        @JacksonXmlProperty(localName = "insuredOfficePhone")
+        private String insuredOfficePhone;
+
+        /**
+         * 负责人姓名
+         */
+        @JacksonXmlProperty(localName = "insuredUnitLeader")
+        private String insuredUnitLeader;
+
+        /**
+         * 单位性质code
+         */
+        @JacksonXmlProperty(localName = "unitTypeCode")
+        private String unitTypeCode;
+        /**
+         * 单位性质名称
+         */
+        @JacksonXmlProperty(localName = "unitTypeName")
+        private String unitTypeName;
+        /**
+         * 联系人名称
+         */
+        @JacksonXmlProperty(localName = "contactName")
+        private String contactName;
+
+        /**
+         * 联系人电话
+         */
+        @JacksonXmlProperty(localName = "contactMobile")
+        private String contactMobile;
+
+        public riskRelatedParty(CustomerInfoVo insuredPersonInfo) {
+            this.insuredName = insuredPersonInfo.getName();
+            this.insuredProvince = insuredPersonInfo.getProvince();
+            this.insuredCity = insuredPersonInfo.getCity();
+            this.insuredDistrict = insuredPersonInfo.getCounty();
+            this.insuredCompleteAddress = insuredPersonInfo.getAddr();
+            this.terrorNationality = "CN";
+            this.identifyValidDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyValidDate());
+            this.identifyValidEndDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyValidEndDate());
+            this.longTerm = insuredPersonInfo.getIdentifyValidEndDate() != null && insuredPersonInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.insuredAddress = insuredPersonInfo.getAddr();
+            this.insuredMobilePhone = insuredPersonInfo.getMobile();
+            //this.postCode = "";
+            if (insuredPersonInfo.getProperty().equals("1")) {
+                this.insuredType = "1";
+                this.identifyType = "01";
+                this.identifyNumber = insuredPersonInfo.getIdentifyNumber();
+                this.insuredSex = insuredPersonInfo.getGender().equals("男") ? "1" : "2";
+                this.insuredBirthDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyNumber().substring(6, 10) + "-" + insuredPersonInfo.getIdentifyNumber().substring(10, 12) + "-" + insuredPersonInfo.getIdentifyNumber().substring(12, 14));
+                this.relationWithHolder = "0";
+                this.carInsuredRelation = "1";
+            }
+            if (insuredPersonInfo.getProperty().equals("0")) {
+                this.insuredType = "2";
+                this.identifyType = "4";
+                this.identifyNumber = insuredPersonInfo.getOrganizationCode();
+                this.insuredOfficePhone = insuredPersonInfo.getMobile();
+                this.insuredUnitLeader = insuredPersonInfo.getLegalPerson();
+                this.unitTypeCode = "";
+                this.unitTypeName = "";
+                this.contactName = insuredPersonInfo.getLegalPerson();
+                this.contactMobile = insuredPersonInfo.getMobile();
+                this.relationWithHolder = "0";
+                this.carInsuredRelation = "1";
+            }
+        }
+    }
+}

+ 54 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitCallBackRequest.java

@@ -0,0 +1,54 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/11 15:34
+ */
+
+@Data
+@AllArgsConstructor
+public class SubmitCallBackRequest {
+    /**
+     * 投保单号
+     */
+    private String orderCode;
+
+    /**
+     * 缴费有效期起
+     * 时间格式yyyy-MM-dd hh:mm:ss
+     */
+    private String paymentStartDate;
+
+    /**
+     * 缴费有效期止
+     * 时间格式yyyy-MM-dd hh:mm:ss
+     */
+    private String paymentEndDate;
+
+    /**
+     * 核保状态
+     */
+    private String status;
+
+    /**
+     * 操作内容
+     */
+    private String remark;
+
+    /**
+     * 核保日期
+     */
+    private String udrDate;
+
+    /**
+     * 是否签名
+     * 1	已签名
+     * 2	未签名
+     * 3	无需签名
+     */
+    private String signStatus;
+
+}

+ 1426 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitRequest.java

@@ -0,0 +1,1426 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import com.ydtech.constants.enums.InsuranceRisk;
+import com.ydtech.modules.admin.service.SysAreaService;
+import com.ydtech.modules.ins.model.vo.*;
+import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.api.chengtai.XmlDateTimeFormatter;
+import com.ydtech.modules.order.entity.api.chengtai.constants.CtKindCodeEnum;
+import com.ydtech.modules.order.entity.api.chengtai.constants.KindCodeEnum;
+import com.ydtech.modules.order.entity.api.chengtai.constants.UseNatureShowEnum;
+import com.ydtech.modules.order.entity.api.chengtai.response.CarModelQueryResponse;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.modules.order.entity.vo.VehicleAndVesselTax;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import com.ydtech.utils.SnowFlakeUtil;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author quchen
+ * @date 2026/3/3 18:02
+ */
+
+@JacksonXmlRootElement(localName = "arg0")
+@NoArgsConstructor
+@Data
+public class SubmitRequest {
+    private static SysAreaService sysAreaService;
+    /**
+     * 报文头信息(Head)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "Head")
+    private head Head;
+
+    /**
+     * 基础信息(BasePart)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "BasePart")
+    private basePart BasePart;
+
+    /**
+     * 标的信息(ItemMotor)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "ItemMotor")
+    private itemMotor ItemMotor;
+
+    /**
+     * 险种信息数据列表(RiskList)数据集(Risk)
+     */
+    @JacksonXmlElementWrapper(useWrapping = false)
+    @JacksonXmlProperty(localName = "RiskList")
+    private RiskListWrapper riskListWrapper;
+
+    /**
+     * 险别信息数据列表(KindList)数据集(Kind)
+     */
+    @JacksonXmlElementWrapper(useWrapping = false)
+    @JacksonXmlProperty(localName = "KindList")
+    private KindListWrapper kindListWrapper;
+
+    /**
+     * 投保人信息(RelatedParty)
+     */
+    @JacksonXmlProperty(localName = "RelatedParty")
+    private relatedParty RelatedParty;
+
+    /**
+     * 被保险人信息(RiskRelatedParty)
+     */
+    @JacksonXmlProperty(localName = "RiskRelatedParty")
+    private riskRelatedParty RiskRelatedParty;
+
+    /**
+     * 车船税(CarShipTax)
+     * 此节点可选 ,不传默认代收税且上次缴费年度默认为投保的上一年
+     */
+    @JacksonXmlProperty(localName = "CarShipTax")
+    private carShipTax CarShipTax;
+
+ //    /**
+//     * 特约节点
+//     */
+//    @JacksonXmlProperty(localName = "RiskSpecialClausesList")
+//    private List<RiskSpecialClauses> RiskSpecialClausesList;
+
+    public SubmitRequest(InsOrders insOrders, BigDecimal actualValue, CarModelQueryResponse.vehicle vehicle,
+                              ChengTaiConfigureParameters parameters, InsAreaCompany insAreaCompany,CustomerInfoVo policyHolderInfo,CustomerInfoVo insuredPersonInfo) {
+        this.Head = new head(parameters);
+        this.BasePart = new basePart(insOrders,insAreaCompany);
+        this.ItemMotor = new itemMotor(insOrders,actualValue,vehicle);
+        this.riskListWrapper = new RiskListWrapper();
+        this.riskListWrapper.setRisks(Risk.buildRiskList(insOrders,insAreaCompany));
+        this.kindListWrapper = new KindListWrapper();
+        this.kindListWrapper.setKinds(Kind.buildKindList(insOrders,vehicle,actualValue,insAreaCompany
+        ));
+        this.CarShipTax = new carShipTax(insOrders);
+        this.RelatedParty = new relatedParty(policyHolderInfo);
+        this.RiskRelatedParty = new riskRelatedParty(insuredPersonInfo);
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class head {
+        /**
+         * 请求类型
+         */
+        @JacksonXmlProperty(localName = "requestType")
+        private String requestType;
+
+        /**
+         * 用户名
+         */
+        @JacksonXmlProperty(localName = "userName")
+        private String userName;
+
+        /**
+         * 密码
+         */
+        @JacksonXmlProperty(localName = "passWord")
+        private String passWord;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        @JacksonXmlProperty(localName = "queryId")
+        private String queryId;
+
+        /**
+         * 合作伙伴代码
+         */
+        @JacksonXmlProperty(localName = "partnerCode")
+        private String partnerCode;
+
+        public head(ChengTaiConfigureParameters parameters) {
+            this.requestType = "00002";
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+            this.partnerCode = parameters.getPartnerCode();
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class basePart {
+        /**
+         * 订单流水号
+         */
+        @JacksonXmlProperty(localName = "orderNumber")
+        private String orderNumber;
+
+        /**
+         * 计划代码 组合险时填组合险代码,单险种填险种代码 0801交强险 0808商业险 1363组合险
+         */
+        @JacksonXmlProperty(localName = "planCode")
+        private String planCode;
+
+        /**
+         * 城市代码
+         */
+        @JacksonXmlProperty(localName = "cityCode")
+        private String cityCode;
+
+        /**
+         * 续保标志
+         * 0	新保
+         * 1	续保(暂不支持续保功能)
+         */
+        @JacksonXmlProperty(localName = "renewInd")
+        private String renewInd;
+
+        /**
+         * 非车产品code
+         */
+        @JacksonXmlProperty(localName = "nvhlSuitCode")
+        private String nvhlSuitCode;
+
+        /**
+         * 非车支付金额
+         */
+        @JacksonXmlProperty(localName = "payAmtnvhl")
+        private String payAmtnvhl;
+
+        /**
+         * 被保人身份类型 投保驾乘意外险时传;01:司机,02:乘客,03司机与乘客
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+
+        public basePart(InsOrders insOrders, InsAreaCompany insAreaCompany) {
+            this.orderNumber = insAreaCompany.getInsOrderNo();
+            String productId = insOrders.getProductid();
+            if ("0330".equals(productId)) {
+                this.planCode = "0801";
+            } else if ("034001".equals(productId) || "034002".equals(productId)) {
+                this.planCode = "0808";
+            } else {
+                this.planCode = "1363";
+            }
+            this.cityCode = "140100";
+            this.renewInd = "0";
+            if(insAreaCompany.getAccidentInfo().size() > 0) {
+                List<AccidentResponseVo> accidentResponseVos = insAreaCompany.getAccidentInfo().toJavaList(AccidentResponseVo.class);
+                this.insuredType = "03";
+                this.nvhlSuitCode = accidentResponseVos.get(0).getProjectCode();
+                this.payAmtnvhl = accidentResponseVos.get(0).getActualPremium();
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class itemMotor {
+        /**
+         * 车主名称
+         */
+        @JacksonXmlProperty(localName = "carOwner")
+        private String carOwner;
+
+        /**
+         * 车牌号码
+         */
+        @JacksonXmlProperty(localName = "licenseNo")
+        private String licenseNo;
+
+        /**
+         * 发动机号
+         */
+        @JacksonXmlProperty(localName = "engineNo")
+        private String engineNo;
+
+        /**
+         * 精友车型代码
+         */
+        @JacksonXmlProperty(localName = "modelCode")
+        private String modelCode;
+
+        /**
+         * 车架号/VIN码
+         */
+        @JacksonXmlProperty(localName = "frameNo")
+        private String frameNo;
+
+        /**
+         * 新旧车标识
+         * O	旧车
+         * N	新车
+         */
+        @JacksonXmlProperty(localName = "carnewoldFlag")
+        private String carnewoldFlag;
+
+        /**
+         * 车主证件类型
+         * 01	居民身份证
+         * 02	护照
+         * 03	军人身份证
+         * 08	港澳居民来往内地通行证
+         * 09	台湾居民来往大陆通行证
+         * 10	武警身份证
+         * 11	外国人永久居留身份证
+         * 44	港澳台居民居住证
+         * 1	组织机构代码证(团体)
+         * 4	统一社会信用代码(团体)
+         */
+        @JacksonXmlProperty(localName = "vehicleTypeOfOwner")
+        private String vehicleTypeOfOwner;
+
+        /**
+         * 车主证件号码
+         */
+        @JacksonXmlProperty(localName = "vehicleOwnerIDNumber")
+        private String vehicleOwnerIDNumber;
+
+        /**
+         * 车主年龄
+         */
+        @JacksonXmlProperty(localName = "ageOfOwner")
+        private Integer ageOfOwner;
+
+        /**
+         * 车主性别
+         * 1	男
+         * 2	女
+         * 9	未说明
+         */
+        @JacksonXmlProperty(localName = "ownerGender")
+        private String ownerGender;
+
+        /**
+         * 过户标志
+         * 0	空
+         * 01	投保过户
+         * 02	批改过户
+         */
+        @JacksonXmlProperty(localName = "chgOwnerFlag")
+        private String chgOwnerFlag;
+
+        /**
+         * 过户日期
+         */
+        @JacksonXmlProperty(localName = "transferDate")
+        private String transferDate;
+
+        /**
+         * 验车情况
+         * 1	未验车
+         * 2	免验车
+         * 3	已验车
+         * 4	待补资料
+         */
+        @JacksonXmlProperty(localName = "carCheckStatus")
+        private String carCheckStatus;
+
+        /**
+         * 验车人
+         */
+        @JacksonXmlProperty(localName = "carChecker")
+        private String carChecker;
+
+        /**
+         * 验车时间
+         */
+        @JacksonXmlProperty(localName = "carCheckTime")
+        private String carCheckTime;
+
+        /**
+         * 免验车原因 验车情况为2时必传
+         * 1	单保责任险
+         * 2	按期续保未增保损失险类
+         * 3	新车
+         * 4	团单
+         */
+        @JacksonXmlProperty(localName = "carCheckReason")
+        private String carCheckReason;
+
+        /**
+         * 新使用性质
+         * 01	家庭自用汽车	机动车
+         * 02	公路客运	机动车
+         * 03	城市公交	机动车
+         * 04	租赁客车	机动车
+         * 05	出租客车	机动车
+         * 06	旅游客运	机动车
+         * 07	营业货车	机动车
+         * 08	营业挂车	机动车
+         * 09	非营业挂车	机动车
+         * 10	非营业企业	机动车
+         * 11	非营业机关、事业团体	机动车
+         * 12	非营业货车	机动车
+         */
+        @JacksonXmlProperty(localName = "useNatureShowNew")
+        private String useNatureShowNew;
+
+        /**
+         * 车辆所属性质
+         * 01	个人
+         * 02	机关/团体
+         * 03	企业
+         */
+        @JacksonXmlProperty(localName = "attachNature")
+        private String attachNature;
+
+        /**
+         * 号牌种类
+         * 代码	描述
+         * 01	大型汽车
+         * 02	小型汽车
+         * 15	挂车
+         * 16	教练汽车
+         * 99	其他
+         */
+        @JacksonXmlProperty(localName = "licenseTypeCode")
+        private String licenseTypeCode;
+
+        /**
+         * 初登日期
+         */
+        @JacksonXmlProperty(localName = "singeinDate")
+        private String singeinDate;
+
+        /**
+         * 购置日期
+         */
+        @JacksonXmlProperty(localName = "enrollDate")
+        private String enrollDate;
+
+        /**
+         * 贷款车标志
+         */
+        @JacksonXmlProperty(localName = "loanVehicleFlag")
+        private String loanVehicleFlag;
+
+        /**
+         * 车辆实际价值
+         */
+        @JacksonXmlProperty(localName = "actualValue")
+        private BigDecimal actualValue;
+
+        /**
+         * 座位数
+         */
+        @JacksonXmlProperty(localName = "seatNum")
+        private Integer seatNum;
+
+        /**
+         * 整备质量
+         */
+        @JacksonXmlProperty(localName = "completeKerbMass")
+        private Integer completeKerbMass;
+
+        /**
+         * 期望折扣
+         * 云南	65<= expectDiscount<= 135
+         * 四川	65<= expectDiscount<= 135
+         * 河南	65<= expectDiscount<= 135
+         * 山西	65<= expectDiscount<= 135
+         * 湖南	65<= expectDiscount<= 135
+         */
+        @JacksonXmlProperty(localName = "expectDiscount")
+        private Integer expectDiscount;
+
+        /**
+         * 能源种类
+         * 0	燃油
+         * 1	纯电动
+         * 2	燃料电池
+         * 3	插电式混合动力
+         * 4	其它混合动力
+         */
+        @JacksonXmlProperty(localName = "fuelTypeCode")
+        private String fuelTypeCode;
+
+        /**
+         * 交管车辆类型
+         */
+        @JacksonXmlProperty(localName = "vehicleCategory")
+        private String vehicleCategory;
+
+        /**
+         * 网约车类型
+         */
+        @JacksonXmlProperty(localName = "rentalType")
+        private String rentalType;
+
+        /**
+         * 新能源标志
+         * 0 燃油
+         * 1 新能源
+         */
+        @JacksonXmlProperty(localName = "energyFlag")
+        private String energyFlag;
+
+        /**
+         * 其他能源类型描述
+         */
+        @JacksonXmlProperty(localName = "energyDescription")
+        private String energyDescription;
+
+        /**
+         * 发证日期
+         */
+        @JacksonXmlProperty(localName = "issueDate")
+        private String issueDate;
+
+        /**
+         * 核定载质量
+         */
+        @JacksonXmlProperty(localName = "tonCount")
+        private String tonCount;
+
+        /**
+         * 排量
+         */
+        @JacksonXmlProperty(localName = "displacement")
+        private String displacement;
+
+        /**
+         * 期望系数
+         */
+        @JacksonXmlProperty(localName = "hopeCoefficient")
+        private Integer hopeCoefficient;
+
+        /**
+         * 功率 摩托车拖拉机传
+         */
+        @JacksonXmlProperty(localName = "power")
+        private Integer power;
+
+        /**
+         * 设计最高时速 摩托车传
+         */
+        @JacksonXmlProperty(localName = "maxDesignSpeed")
+        private Integer maxDesignSpeed;
+
+        /**
+         * 车辆来历凭证种类
+         * 01	销售发票
+         * 02	法院调解书
+         * 03	法院裁定书
+         * 04	法院判决书
+         * 05	仲裁裁决书
+         * 06	相关文书(继承、赠予、协议抵债)
+         * 07	批准文件
+         * 08	调拨证明
+         * 09	修理发票
+         * 10	车辆合格证
+         * 11	货物进口证明书
+         */
+        @JacksonXmlProperty(localName = "certificateType")
+        private String certificateType;
+
+        /**
+         * 车辆来历凭证编号
+         */
+        @JacksonXmlProperty(localName = "certificateNo")
+        private String certificateNo;
+
+        /**
+         * 车辆来历凭证日期
+         */
+        @JacksonXmlProperty(localName = "certificateDate")
+        private String certificateDate;
+
+        /**
+         * 修理厂ID
+         */
+        @JacksonXmlProperty(localName = "repairShopId")
+        private String repairShopId;
+
+        /**
+         * 修理厂代码
+         */
+        @JacksonXmlProperty(localName = "repairShopCode")
+        private String repairShopCode;
+
+        /**
+         * 修理厂名称
+         */
+        @JacksonXmlProperty(localName = "repairShopName")
+        private String repairShopName;
+
+        /**
+         * 总行驶里程
+         */
+        @JacksonXmlProperty(localName = "runMiles")
+        private Integer runMiles;
+
+        public itemMotor(InsOrders insOrders, BigDecimal actualValue,CarModelQueryResponse.vehicle vehicle) {
+            CarInfoVo carInfoVo = insOrders.getCarinfo().toJavaObject(CarInfoVo.class);
+            CustomerInfoVo customerInfoVo = insOrders.getOwnerinfo().toJavaObject(CustomerInfoVo.class);
+            this.carOwner = customerInfoVo.getName();
+            this.licenseNo = carInfoVo.getLicenseNo();
+            this.engineNo = carInfoVo.getEngineNo();
+            this.modelCode = vehicle.getModelCode();
+            this.frameNo = carInfoVo.getFrameNo();
+            this.carnewoldFlag = "O";
+            if (customerInfoVo.getProperty().equals("1")) {
+                // 个人
+                this.vehicleTypeOfOwner = "01";
+                this.attachNature = "01";
+                this.vehicleOwnerIDNumber = customerInfoVo.getIdentifyNumber();
+            } else if (customerInfoVo.getProperty().equals("0")){
+                // 企业
+                this.attachNature = "03";
+                this.vehicleTypeOfOwner = "4";
+                this.vehicleOwnerIDNumber = customerInfoVo.getOrganizationCode();
+            }
+            this.ageOfOwner = Integer.valueOf(customerInfoVo.getAge());
+            // 性别
+            if (customerInfoVo.getGender().equals("男")) {
+                this.ownerGender = "1";
+            } else if (customerInfoVo.getGender().equals("女")){
+                this.ownerGender = "2";
+            } else {
+                this.ownerGender = "9";
+            }
+            // 是否过户
+            if (carInfoVo.isTransferFlag()) {
+                this.chgOwnerFlag = "01";
+                this.transferDate = XmlDateTimeFormatter.format(carInfoVo.getTransferDate());
+            } else {
+                this.chgOwnerFlag = "0";
+            }
+            // 默认免验车
+            this.carCheckStatus = "2";
+            this.carCheckReason = "2";
+            UseNatureShowEnum useNatureCodeEnum = UseNatureShowEnum.valueOf("U_"+carInfoVo.getVehicleUse());
+            AssertionUtils.isEmpty(useNatureCodeEnum, "使用性质输入错误");
+            this.useNatureShowNew = useNatureCodeEnum.getCode();
+            this.licenseTypeCode = carInfoVo.getLicenseTypeCode();
+            this.singeinDate  = XmlDateTimeFormatter.format(carInfoVo.getRegisterDate());
+            this.issueDate = XmlDateTimeFormatter.format(carInfoVo.getIssueDate());
+            this.enrollDate = XmlDateTimeFormatter.format(carInfoVo.getRegisterDate());
+            this.actualValue = actualValue;
+            this.seatNum = Integer.valueOf(carInfoVo.getSeatCount());
+            this.displacement = carInfoVo.getEnginedesc();
+            this.power = Integer.valueOf(carInfoVo.getPowerScale());
+            if (carInfoVo.getEnergyType().equals("0")) {
+                this.energyFlag = "0";
+            } else {
+                this.energyFlag = "1";
+                this.fuelTypeCode = carInfoVo.getEnergyType();
+            }
+        }
+    }
+
+    /**
+     * 投保人信息(RelatedParty)
+     */
+    @NoArgsConstructor
+    @Data
+    public static class relatedParty {
+        /**
+         * 投保人类型
+         * 1	个人
+         * 2	团体
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+
+        /**
+         * 投保人名称
+         */
+        @JacksonXmlProperty(localName = "insuredName")
+        private String insuredName;
+
+        /**
+         * 证件类型
+         * 01	居民身份证
+         * 02	护照
+         * 03	军人身份证
+         * 08	港澳居民来往内地通行证
+         * 09	台湾居民来往大陆通行证
+         * 10	武警身份证
+         * 11	外国人永久居留身份证
+         * 44	港澳台居民居住证
+         * 1	组织机构代码证(团体)
+         * 4	统一社会信用代码(团体)
+         */
+        @JacksonXmlProperty(localName = "identifyType")
+        private String identifyType;
+
+        /**
+         * 证件号码
+         */
+        @JacksonXmlProperty(localName = "identifyNumber")
+        private String identifyNumber;
+
+        /**
+         * 省代码
+         */
+        @JacksonXmlProperty(localName = "appProvince")
+        private String appProvince;
+
+        /**
+         * 市代码
+         */
+        @JacksonXmlProperty(localName = "appCity")
+        private String appCity;
+
+        /**
+         * 区/县代码
+         */
+        @JacksonXmlProperty(localName = "appDistrict")
+        private String appDistrict;
+
+        /**
+         * 详细地址
+         */
+        @JacksonXmlProperty(localName = "appCompleteAddress")
+        private String appCompleteAddress;
+
+        /**
+         * 国家代码
+         * CN 中国
+         * US 美国
+         * JP 日本
+         * KR 韩国
+         * TW 中国台湾
+         * HK 中国香港
+         * MO 中国澳门
+         * SG 新加坡
+         */
+        @JacksonXmlProperty(localName = "terrorNationality")
+        private String terrorNationality;
+
+        /**
+         * 投保人证件有效期起期
+         */
+        @JacksonXmlProperty(localName = "identifyValidDate")
+        private String identifyValidDate;
+
+        /**
+         * 投保人证件有效期止期
+         */
+        @JacksonXmlProperty(localName = "identifyValidEndDate")
+        private String identifyValidEndDate;
+
+        /**
+         * 是否长期
+         * 0-否;1-是
+         */
+        @JacksonXmlProperty(localName = "longTerm")
+        private String longTerm;
+        /**
+         * 性别
+         * 1	男
+         * 2	女
+         * 9	未说明
+         */
+        @JacksonXmlProperty(localName = "sex")
+        private String sex;
+
+        /**
+         * 出生日期
+         */
+        @JacksonXmlProperty(localName = "birthDate")
+        private String birthDate;
+
+        /**
+         * 地址
+         */
+        @JacksonXmlProperty(localName = "insuredAddress")
+        private String insuredAddress;
+
+        /**
+         * 邮政编码
+         */
+        @JacksonXmlProperty(localName = "postCode")
+        private String postCode;
+
+        /**
+         * 联系电话
+         */
+        @JacksonXmlProperty(localName = "mobilePhone")
+        private String mobilePhone;
+
+        /**
+         * E - mail
+         */
+        @JacksonXmlProperty(localName = "email")
+        private String email;
+
+        /**
+         * 单位电话
+         */
+        @JacksonXmlProperty(localName = "officePhone")
+        private String officePhone;
+
+        /**
+         * 负责人姓名
+         */
+        @JacksonXmlProperty(localName = "insuredUnitLeader")
+        private String insuredUnitLeader;
+
+        /**
+         * 单位性质名称
+         */
+        @JacksonXmlProperty(localName = "unitTypeName")
+        private String unitTypeName;
+
+        /**
+         * 单位性质
+         */
+        @JacksonXmlProperty(localName = "unitTypeCode")
+        private String unitTypeCode;
+
+        /**
+         * 联系人名称
+         */
+        @JacksonXmlProperty(localName = "contactName")
+        private String contactName;
+
+        /**
+         * 联系人电话
+         */
+        @JacksonXmlProperty(localName = "contactMobile")
+        private String contactMobile;
+
+        /**
+         * 联系人证件类型
+         */
+        @JacksonXmlProperty(localName = "contactIdentifyType")
+        private String contactIdentifyType;
+
+        /**
+         * 联系人证件号码
+         */
+        @JacksonXmlProperty(localName = "contactIdentifyNumber")
+        private String contactIdentifyNumber;
+
+        public relatedParty(CustomerInfoVo policyHolderInfo) {
+            this.insuredName = policyHolderInfo.getName();
+            this.appProvince = policyHolderInfo.getProvince();
+            this.appCity = policyHolderInfo.getCity();
+            this.appDistrict = policyHolderInfo.getCounty();
+            this.appCompleteAddress = policyHolderInfo.getAddr();
+            this.terrorNationality = "CN";
+            this.identifyValidDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyValidDate());
+            this.identifyValidEndDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyValidEndDate());
+            this.longTerm = policyHolderInfo.getIdentifyValidEndDate() != null && policyHolderInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.insuredAddress = policyHolderInfo.getAddr();
+            this.mobilePhone = policyHolderInfo.getMobile();
+            if (policyHolderInfo.getProperty().equals("1")) {
+                this.insuredType = "1";
+                this.identifyType = "01";
+                this.identifyNumber = policyHolderInfo.getIdentifyNumber();
+                this.sex = policyHolderInfo.getGender().equals("男") ? "1" : "2";
+                this.birthDate = XmlDateTimeFormatter.format(policyHolderInfo.getIdentifyNumber().substring(6, 10) + "-" + policyHolderInfo.getIdentifyNumber().substring(10, 12) + "-" + policyHolderInfo.getIdentifyNumber().substring(12, 14));
+                this.email = policyHolderInfo.getEmail();
+            }
+            if (policyHolderInfo.getProperty().equals("0")) {
+                this.insuredType = "2";
+                this.identifyType = "4";
+                this.identifyNumber = policyHolderInfo.getOrganizationCode();
+                this.officePhone = policyHolderInfo.getMobile();
+                this.insuredUnitLeader = policyHolderInfo.getLegalPerson();
+                this.unitTypeCode = "";
+                this.unitTypeName = "";
+                this.contactName = policyHolderInfo.getLegalPerson();
+                this.contactMobile = policyHolderInfo.getMobile();
+                this.contactIdentifyType = "01";
+                this.contactIdentifyNumber = policyHolderInfo.getLeaderIdentifyNumber();
+            }
+        }
+    }
+
+    /**
+     *
+     * 被保险人信息(RiskRelatedParty)
+     */
+    @NoArgsConstructor
+    @Data
+    public static class riskRelatedParty {
+        /**
+         * 被保险人类型
+         * 1:个人 2:团体
+         */
+        @JacksonXmlProperty(localName = "insuredType")
+        private String insuredType;
+        /**
+         * 被保险人名称
+         */
+        @JacksonXmlProperty(localName = "insuredName")
+        private String insuredName;
+        /**
+         * 证件类型
+         */
+        @JacksonXmlProperty(localName = "identifyType")
+        private String identifyType;
+        /**
+         * 证件号码
+         */
+        @JacksonXmlProperty(localName = "identifyNumber")
+        private String identifyNumber;
+
+        /**
+         * 省代码
+         */
+        @JacksonXmlProperty(localName = "insuredProvince")
+        private String insuredProvince;
+        /**
+         * 市代码
+         */
+        @JacksonXmlProperty(localName = "insuredCity")
+        private String insuredCity;
+        /**
+         * 区/县代码
+         */
+        @JacksonXmlProperty(localName = "insuredDistrict")
+        private String insuredDistrict;
+
+        /**
+         * 详细地址
+         */
+        @JacksonXmlProperty(localName = "insuredCompleteAddress")
+        private String insuredCompleteAddress;
+
+        /**
+         * 国家代码
+         * CN 中国
+         * US 美国
+         * JP 日本
+         * KR 韩国
+         * TW 中国台湾
+         * HK 中国香港
+         * MO 中国澳门
+         * SG 新加坡
+         */
+        @JacksonXmlProperty(localName = "terrorNationality")
+        private String terrorNationality;
+
+        /**
+         * 投保人证件有效期起期
+         */
+        @JacksonXmlProperty(localName = "identifyValidDate")
+        private String identifyValidDate;
+
+        /**
+         * 投保人证件有效期止期
+         */
+        @JacksonXmlProperty(localName = "identifyValidEndDate")
+        private String identifyValidEndDate;
+
+        /**
+         * 是否长期
+         * 0-否;1-是
+         */
+        @JacksonXmlProperty(localName = "longTerm")
+        private String longTerm;
+
+        /**
+         * 性别
+         */
+        @JacksonXmlProperty(localName = "insuredSex")
+        private String insuredSex;
+
+        /**
+         * 出生日期
+         */
+        @JacksonXmlProperty(localName = "insuredBirthDate")
+        private String insuredBirthDate;
+
+        /**
+         * 地址
+         */
+        @JacksonXmlProperty(localName = "insuredAddress")
+        private String insuredAddress;
+
+        /**
+         * 邮政编码
+         */
+        @JacksonXmlProperty(localName = "insuredPostCode")
+        private String insuredPostCode;
+
+        /**
+         * 联系电话
+         */
+        @JacksonXmlProperty(localName = "insuredMobilePhone")
+        private String insuredMobilePhone;
+
+        /**
+         * 被保人与投保人关系
+         * 0	未知
+         * 1	配偶
+         * 2	父母
+         * 3	子女
+         * 4	祖父母
+         * 5	孙子女
+         * 6	其他
+         */
+        @JacksonXmlProperty(localName = "relationWithHolder")
+        private String relationWithHolder;
+
+        /**
+         * 被保险人与车辆关系
+         * 1	拥有
+         * 2	使用
+         * 3	管理
+         */
+        @JacksonXmlProperty(localName = "carInsuredRelation")
+        private String carInsuredRelation;
+
+        /**
+         * 单位电话
+         */
+        @JacksonXmlProperty(localName = "insuredOfficePhone")
+        private String insuredOfficePhone;
+
+        /**
+         * 负责人姓名
+         */
+        @JacksonXmlProperty(localName = "insuredUnitLeader")
+        private String insuredUnitLeader;
+
+        /**
+         * 单位性质code
+         */
+        @JacksonXmlProperty(localName = "unitTypeCode")
+        private String unitTypeCode;
+        /**
+         * 单位性质名称
+         */
+        @JacksonXmlProperty(localName = "unitTypeName")
+        private String unitTypeName;
+        /**
+         * 联系人名称
+         */
+        @JacksonXmlProperty(localName = "contactName")
+        private String contactName;
+
+        /**
+         * 联系人电话
+         */
+        @JacksonXmlProperty(localName = "contactMobile")
+        private String contactMobile;
+
+        public riskRelatedParty(CustomerInfoVo insuredPersonInfo) {
+            this.insuredName = insuredPersonInfo.getName();
+            this.insuredProvince = insuredPersonInfo.getProvince();
+            this.insuredCity = insuredPersonInfo.getCity();
+            this.insuredDistrict = insuredPersonInfo.getCounty();
+            this.insuredCompleteAddress = insuredPersonInfo.getAddr();
+            this.terrorNationality = "CN";
+            this.identifyValidDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyValidDate());
+            this.identifyValidEndDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyValidEndDate());
+            this.longTerm = insuredPersonInfo.getIdentifyValidEndDate() != null && insuredPersonInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.insuredAddress = insuredPersonInfo.getAddr();
+            this.insuredMobilePhone = insuredPersonInfo.getMobile();
+            //this.postCode = "";
+            if (insuredPersonInfo.getProperty().equals("1")) {
+                this.insuredType = "1";
+                this.identifyType = "01";
+                this.identifyNumber = insuredPersonInfo.getIdentifyNumber();
+                this.insuredSex = insuredPersonInfo.getGender().equals("男") ? "1" : "2";
+                this.insuredBirthDate = XmlDateTimeFormatter.format(insuredPersonInfo.getIdentifyNumber().substring(6, 10) + "-" + insuredPersonInfo.getIdentifyNumber().substring(10, 12) + "-" + insuredPersonInfo.getIdentifyNumber().substring(12, 14));
+                this.relationWithHolder = "0";
+                this.carInsuredRelation = "1";
+            }
+            if (insuredPersonInfo.getProperty().equals("0")) {
+                this.insuredType = "2";
+                this.identifyType = "4";
+                this.identifyNumber = insuredPersonInfo.getOrganizationCode();
+                this.insuredOfficePhone = insuredPersonInfo.getMobile();
+                this.insuredUnitLeader = insuredPersonInfo.getLegalPerson();
+                this.unitTypeCode = "";
+                this.unitTypeName = "";
+                this.contactName = insuredPersonInfo.getLegalPerson();
+                this.contactMobile = insuredPersonInfo.getMobile();
+                this.relationWithHolder = "0";
+                this.carInsuredRelation = "1";
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class RiskListWrapper {
+        /**
+         * 内层 Risk 节点列表(关闭默认包裹层,指定节点名为 Risk)
+         */
+        @JacksonXmlProperty(localName = "Risk")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        private List<Risk> risks;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class Risk {
+        /**
+         * 险种代码
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+        /**
+         * 即时生效 默认:0-否
+         */
+        @JacksonXmlProperty(localName = "effectFlag")
+        private String effectFlag;
+
+        /**
+         * 起保时间 yyyy-MM-dd hh:mm:ss
+         */
+        @JacksonXmlProperty(localName = "startDate")
+        private String startDate;
+
+        /**
+         * 终保时间 yyyy-MM-dd hh:mm:ss
+         */
+        @JacksonXmlProperty(localName = "endDate")
+        private String endDate;
+
+        /**
+         * 总保费
+         */
+        @JacksonXmlProperty(localName = "sumGrossPremium")
+        private BigDecimal sumGrossPremium;
+
+        public static List<Risk> buildRiskList(InsOrders insOrders,InsAreaCompany insAreaCompany) {
+            List<RiskInfoVo> riskInfoVoList = insOrders.getRisk().toJavaList(RiskInfoVo.class);
+            List<Risk> riskList = new ArrayList<>();
+            for (RiskInfoVo riskInfoVo : riskInfoVoList) {
+                Risk risk = new Risk();
+                if (riskInfoVo.getRiskCode().equals("0507")) {
+                    risk.setRiskCode("0801");
+                    risk.setStartDate(XmlDateTimeFormatter.format(riskInfoVo.getStartDate()));
+                    risk.setEndDate(XmlDateTimeFormatter.format(riskInfoVo.getEndDate()));
+                    risk.setEffectFlag(riskInfoVo.getInstantFlag());
+                    risk.setSumGrossPremium(insAreaCompany.getJqpremium());
+                } else if (riskInfoVo.getRiskCode().equals("0510")) {
+                    risk.setRiskCode("0808");
+                    risk.setStartDate(XmlDateTimeFormatter.format(riskInfoVo.getStartDate()));
+                    risk.setEndDate(XmlDateTimeFormatter.format(riskInfoVo.getEndDate()));
+                    risk.setEffectFlag(riskInfoVo.getInstantFlag());
+                    risk.setSumGrossPremium(insAreaCompany.getSypremium());
+                }
+                riskList.add(risk);
+            }
+            return riskList;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class KindListWrapper {
+        @JacksonXmlProperty(localName = "Kind")
+        @JacksonXmlElementWrapper(useWrapping = false)
+        private List<Kind> kinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class Kind {
+        /**
+         * 险种代码
+         * 0801	交强险
+         * 0808	机动车商业险险(2014)
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+
+        /**
+         * 险别代码
+         */
+        @JacksonXmlProperty(localName = "kindCode")
+        private String kindCode;
+
+        /**
+         * 每座保险金额
+         */
+        @JacksonXmlProperty(localName = "unitInsured")
+        private BigDecimal unitInsured;
+
+        /**
+         * 座位数
+         */
+        @JacksonXmlProperty(localName = "quantity")
+        private Integer quantity;
+
+        /**
+         * 主险/附加险标志
+         */
+        @JacksonXmlProperty(localName = "kindInd")
+        private String kindInd;
+
+        /**
+         * 主险代码
+         */
+        @JacksonXmlProperty(localName = "mainKindCode")
+        private String mainKindCode;
+
+        /**
+         * 是否投保不计免赔
+         */
+        @JacksonXmlProperty(localName = "relatedInd")
+        private String relatedInd;
+
+        /**
+         * 保险金额/赔偿金额
+         */
+        @JacksonXmlProperty(localName = "sumInsured")
+        private BigDecimal sumInsured;
+
+        /**
+         * 玻璃类型
+         */
+        @JacksonXmlProperty(localName = "valueType")
+        private String valueType;
+
+        /**
+         * 实缴金额
+         */
+        @JacksonXmlProperty(localName = "grossPremium")
+        private BigDecimal grossPremium;
+
+
+        public static List<Kind> buildKindList(InsOrders insOrders,CarModelQueryResponse.vehicle vehicle,BigDecimal actualValue,InsAreaCompany insAreaCompany){
+            List<RiskInfoVo> riskInfoVoList = insAreaCompany.getRiskinfo().toJavaList(RiskInfoVo.class);
+            List<KindInfoVo> kindInfoVoList = insAreaCompany.getKindinfo().toJavaList(KindInfoVo.class);
+            List<Kind> kindList = new ArrayList<>();
+            // 是否投保交强险
+            Boolean isJq = InsuranceRisk.getFlagByTRAFFIC(riskInfoVoList);
+            if (isJq) {
+                Kind kind = new Kind();
+                kind.setRiskCode("0801");
+                kind.setKindCode("BZ");
+                kind.setSumInsured(new BigDecimal("200000"));
+                kind.setKindInd("1");
+                kind.setMainKindCode("BZ");
+                kind.setRelatedInd("0");
+                kindList.add(kind);
+                kind.setGrossPremium(new BigDecimal("200000"));
+            }
+            if (!kindInfoVoList.isEmpty()) {
+                for (KindInfoVo kindInfoVo : kindInfoVoList) {
+                    Kind kind = new Kind();
+                    String kindCode = kindInfoVo.getKindCode();
+                    KindCodeEnum kindCodeEnum = KindCodeEnum.valueOf(KindCodeEnum.class, kindCode);
+                    kind.setKindCode(kindCodeEnum.getKindCode());
+                    kind.setRiskCode(kindCodeEnum.getRiskCode());
+                    kind.setMainKindCode(kindCodeEnum.getMainKindCode());
+                    kind.setKindInd(kindCodeEnum.getKindInd());
+                    kind.setRelatedInd("0");
+                    kind.setGrossPremium(BigDecimal.valueOf(kindInfoVo.getCoveragePremium()));
+                    // 司机
+                    if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getDriver(), kindCode) >= 0) {
+                        kind.sumInsured = BigDecimal.valueOf(kindInfoVo.getAmount());
+                        kind.unitInsured = BigDecimal.valueOf(kindInfoVo.getUnitAmount());
+                        kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+                    }
+                    // 乘客
+                    else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getPassenger(), kindCode) >= 0) {
+                        kind.unitInsured = BigDecimal.valueOf(kindInfoVo.getUnitAmount());
+                        kind.sumInsured =
+                                BigDecimal.valueOf(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(vehicle.getSeat()));
+                        kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+
+                    }
+                    // 绝对免赔
+                    else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getAbsoluteDeductible(), kindCode) >= 0) {
+                        kind.quantity = Integer.valueOf(kindInfoVo.getDeductibleRate());
+                    } else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getSpecialContractClause(), kindCode) >= 0) {
+                        kind.quantity = kindInfoVo.getServiceTimes();
+                    } else if (CtKindCodeEnum.A.getCode().equals(kindCode)) {
+                        kind.sumInsured = actualValue;
+                    } else {
+                        kind.sumInsured = BigDecimal.valueOf(kindInfoVo.getAmount());
+                        kind.quantity = Integer.parseInt(vehicle.getSeat());
+                    }
+                    kindList.add(kind);
+                }
+            }
+            return kindList;
+        }
+    }
+
+    /**
+     * 车船税
+     * 此节点可选 ,不传默认代收税且上次缴费年度默认为投保的上一年
+     */
+    @NoArgsConstructor
+    @Data
+    public static class carShipTax {
+        /**
+         * 计税分类
+         * 02	代收税
+         * 03	已完税
+         * 04	减税
+         * 05	免税
+         * 07	不征
+         */
+        @JacksonXmlProperty(localName = "taxRelifFlag")
+        private String taxRelifFlag;
+
+        /**
+         * 减免税凭证号/完税凭证号
+         */
+        @JacksonXmlProperty(localName = "paidFreeCertificate")
+        private String paidFreeCertificate;
+
+        /**
+         * 开据税务机关名称
+         */
+        @JacksonXmlProperty(localName = "taxCompancyName")
+        private String taxCompancyName;
+
+        /**
+         * 减税说明(减税原因) 减免税必传
+         * 0	无
+         * 1	具备减免税证明
+         * 2	拖拉机
+         * 3	军队、武警专用车辆
+         * 4	警车
+         * 5	外国使领馆、国际组织及其人员车辆
+         * 6	其他
+         */
+        @JacksonXmlProperty(localName = "relifReason")
+        private String relifReason;
+
+        /**
+         * 减免税方案代码 减免税必传
+         * A	按金额进行减免
+         * P	按比例进行减免
+         */
+        @JacksonXmlProperty(localName = "deductionDueType")
+        private String deductionDueType;
+
+        /**
+         * 减税比例
+         */
+        @JacksonXmlProperty(localName = "freeRate")
+        private String freeRate;
+
+        /**
+         * 税务机关省份名称
+         */
+        @JacksonXmlProperty(localName = "taxProvinceCname")
+        private String taxProvinceCname;
+
+        /**
+         * 税务机关省份代码
+         */
+        @JacksonXmlProperty(localName = "taxProvinceCode")
+        private String taxProvinceCode;
+
+        /**
+         * 凭证填发日期
+         */
+        @JacksonXmlProperty(localName = "taxDocumentDate")
+        private String taxDocumentDate;
+
+        /**
+         * 税务机关城市代码
+         */
+        @JacksonXmlProperty(localName = "taxCityCode")
+        private String taxCityCode;
+
+        /**
+         * 税务机关城市名称
+         */
+        @JacksonXmlProperty(localName = "taxCityCname")
+        private String taxCityCname;
+
+        /**
+         * 上次缴税年度
+         */
+        @JacksonXmlProperty(localName = "lastPaidYear")
+        private String lastPaidYear;
+
+        //正常交税
+        private static final String TAX_NORMAL = "1";
+        // 免税
+        private static final String TAX_EXEMPTION = "2";
+        // 减税
+        private static final String TAX_REDUCTION = "3";
+        // 已完税
+        private static final String TAX_FINISH = "4";
+        //不征
+        private static final String TAX_NOT_CHARGE = "9";
+
+        public carShipTax(InsOrders insOrders) {
+            VehicleAndVesselTax vehicleAndVesselTax = insOrders.getVehicleAndVesselTax().toJavaObject(VehicleAndVesselTax.class);
+            List<RiskInfoVo> riskInfoVoList = insOrders.getRisk().toJavaList(RiskInfoVo.class);
+            Boolean isJq = InsuranceRisk.getFlagByTRAFFIC(riskInfoVoList);
+            if (isJq) {
+                String flag = vehicleAndVesselTax.getTaxRelifFlag();
+                switch (flag) {
+                    case TAX_NORMAL:
+                        this.taxRelifFlag = "02";
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        break;
+                    case TAX_EXEMPTION:
+                        this.taxRelifFlag = "05";
+                        this.relifReason = vehicleAndVesselTax.getRelifReason();
+                        this.freeRate = vehicleAndVesselTax.getTaxRelief();
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getExtendChar2();
+                        break;
+                    case TAX_REDUCTION:
+                        this.taxRelifFlag = "04";
+                        this.relifReason = vehicleAndVesselTax.getRelifReason();
+                        this.freeRate = vehicleAndVesselTax.getTaxRelief();
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getExtendChar2();
+                        break;
+                    case TAX_FINISH:
+                        this.taxRelifFlag = "03";
+                        this.taxCompancyName = vehicleAndVesselTax.getTaxComName();
+                        this.taxProvinceCname = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxProvinceCode = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxDocumentDate = vehicleAndVesselTax.getTaxDocumentDate();
+                        this.taxCityCode = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.taxCityCname = vehicleAndVesselTax.getTaxPaidAreaCode();
+                        this.paidFreeCertificate = vehicleAndVesselTax.getPaidFreeCertificate();
+                        break;
+                    case TAX_NOT_CHARGE:
+                        this.taxRelifFlag = "07";
+                        break;
+                }
+            }
+        }
+    }
+
+    /**
+     * 特约信息
+     */
+    @NoArgsConstructor
+    @Data
+    public static class RiskSpecialClauses {
+        /**
+         * 方案代码
+         */
+        @JacksonXmlProperty(localName = "planCode")
+        private String planCode;
+
+        /**
+         * 险种代码
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+
+        /**
+         * 特约代码
+         */
+        @JacksonXmlProperty(localName = "clauseCode")
+        private String clauseCode;
+
+        /**
+         * 特约内容
+         */
+        @JacksonXmlProperty(localName = "clauseContent")
+        private String clauseContent;
+    }
+
+}

+ 60 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UnderwriteCallBackRequest.java

@@ -0,0 +1,60 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/11 16:55
+ */
+
+@Data
+@AllArgsConstructor
+public class UnderwriteCallBackRequest {
+    /**
+     * 订单号
+     */
+    private String orderCode;
+
+    /**
+     * 保单号生成日期
+     */
+    private String policyNSDate;
+
+    /**
+     * 商业险保单号
+     */
+    private String ciPolicyNo;
+
+    /**
+     * 交强险保单号
+     */
+    private String sailPolicyNo;
+
+    /**
+     * 意外险保单号
+     */
+    private String nvhlPolicyNo;
+
+    /**
+     * 交强险起保日期
+     */
+    private String sailValidDate;
+
+    /**
+     * 交强险终保日期
+     */
+    private String sailExpiryDate;
+
+    /**
+     * 商业险起保日期
+     */
+    private String ciValidDate;
+
+    /**
+     * 商业险终保日期
+     */
+    private String ciExpiryDate;
+
+
+}

+ 91 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UpLoadRequest.java

@@ -0,0 +1,91 @@
+package com.ydtech.modules.order.entity.api.chengtai.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.order.entity.api.chengtai.constants.UploadEnum;
+import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/4 11:07
+ */
+
+@NoArgsConstructor
+@Data
+public class UpLoadRequest {
+    /**
+     * 合作伙伴代码
+     */
+    @JsonProperty("partnerCode")
+    private String partnerCode;
+
+    /**
+     * 用户名
+     */
+    @JsonProperty("user")
+    private String user;
+
+    /**
+     * 密码
+     */
+    @JsonProperty("passWord")
+    private String passWord;
+
+    /**
+     * 业务号
+     */
+    @JsonProperty("bussNo")
+    private String bussNo;
+
+    /**
+     * 业务类型
+     */
+    @JsonProperty("bussType")
+    private String bussType;
+
+    /**
+     * 类型完整路径
+     */
+    @JsonProperty("typePath")
+    private String typePath;
+
+    /**
+     * 类型完整名称
+     */
+    @JsonProperty("typeName")
+    private String typeName;
+
+    /**
+     * 原文件名称
+     */
+    @JsonProperty("fileOrgName")
+    private String fileOrgName;
+
+    /**
+     * 源文件
+     */
+    @JsonProperty("fileContent")
+    private String fileContent;
+
+    /**
+     * 备注
+     */
+    @JsonProperty("remark")
+    private String remark;
+
+    public UpLoadRequest(ChengTaiConfigureParameters parameters, String orderNumber, InsTaskImagesBase64 insTaskImagesBase64) {
+        this.partnerCode = parameters.getPartnerCode();
+        this.user = parameters.getUserName();
+        this.passWord = parameters.getPassWord();
+        this.bussNo = orderNumber;
+        this.bussType = "T";
+        UploadEnum uploadEnum = UploadEnum.valueOf(insTaskImagesBase64.getImageType());
+        this.typePath = uploadEnum.getCode();
+        this.typeName = uploadEnum.getName();
+        this.fileOrgName = insTaskImagesBase64.getFileName();
+        this.fileContent = insTaskImagesBase64.getBase64String();
+    }
+
+}

+ 169 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/CarModelQueryResponse.java

@@ -0,0 +1,169 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.order.entity.filter.CarModelsFilter;
+import com.ydtech.modules.order.entity.vo.CoreModelsVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/2/25 10:56
+ */
+@NoArgsConstructor
+@Data
+public class CarModelQueryResponse extends ChengTaiBaseResponse implements Serializable {
+    /**
+     * 总数
+     */
+    @JsonProperty("maxPageNum")
+    private String maxPageNum;
+
+    /**
+     * 当前页
+     */
+    @JsonProperty("nowPage")
+    private String nowPage;
+
+    /**
+     * 每页条数
+     */
+    @JsonProperty("pageSize")
+    private String pageSize;
+
+    /**
+     * 车型信息
+     */
+    @JsonProperty("vehicleList")
+    private List<vehicle> vehicleList;
+
+    @NoArgsConstructor
+    @Data
+    public static class vehicle implements CarModelsFilter {
+        /**
+         * 精有车型编码
+         */
+        @JsonProperty("modelCode")
+        private String modelCode;
+
+        /**
+         * 品牌
+         */
+        @JsonProperty("vehicleBrand")
+        private String vehicleBrand;
+
+        /**
+         * 车系
+         */
+        @JsonProperty("vehicleSeries")
+        private String vehicleSeries;
+
+        /**
+         * 排量 单位:ml
+         */
+        @JsonProperty("vehicleDisplacement")
+        private String vehicleDisplacement;
+
+        /**
+         * 手/自动档
+         */
+        @JsonProperty("transmissionType")
+        private String transmissionType;
+
+        /**
+         * 配置型号
+         */
+        @JsonProperty("configModel")
+        private String configModel;
+
+        /**
+         * 参考价
+         */
+        @JsonProperty("vehiclePrice")
+        private String vehiclePrice;
+
+        /**
+         * 含税价
+         */
+        @JsonProperty("taxVehiclePrice")
+        private String taxVehiclePrice;
+
+        /**
+         * 整备质量 单位:千克
+         */
+        @JsonProperty("tonnage")
+        private String tonnage;
+
+        /**
+         * 座位数
+         */
+        @JsonProperty("seat")
+        private String seat;
+
+        /**
+         * 车辆种类
+         */
+        @JsonProperty("className")
+        private String className;
+
+        /**
+         * 是否减免税车型 0-非减免税车型、04-减免税车型、05-减税(注:05-减税,也是减免税车型,保费计算接口中车船税节点信息”taxRelifFlag” 计税分类字段须传 04,代表的是减免税车型。)
+         */
+        @JsonProperty("taxCutFlag")
+        private String taxCutFlag;
+
+        /**
+         *  减免税比例 减免比例返回的是百分比,如返回50,代表的是 百分之50,没减免比例则返回空
+         */
+        @JsonProperty("taxCutProp")
+        private String taxCutProp;
+
+        /**
+         * 是否新能源车辆 1:是 0:否
+         */
+        @JsonProperty("energyFlag")
+        private String energyFlag;
+
+        /**
+         * 精有车型名称
+         */
+        @JsonProperty("modelName")
+        private String modelName;
+
+        /**
+         * 备注
+         */
+        @JsonProperty("remark")
+        private String remark;
+
+        /**
+         * 能源类型
+         */
+        @JsonProperty("energyType")
+        private String energyType;
+
+        @Override
+        public String getCarYear() {
+            return null;
+        }
+
+        @Override
+        public String getPurchasePrice() {
+            return vehiclePrice;
+        }
+        public CoreModelsVo toCoreModelsVo() {
+            CoreModelsVo coreModelsVo = new CoreModelsVo();
+            coreModelsVo.setModelCode(this.modelCode);
+            coreModelsVo.setModelName(this.modelName);
+            coreModelsVo.setCarYear(null);
+            coreModelsVo.setPower(null);
+            coreModelsVo.setEnginedesc(this.vehicleDisplacement);
+            coreModelsVo.setPurchasePrice(this.vehiclePrice);
+            coreModelsVo.setSeatCount(this.seat);
+            return coreModelsVo;
+        }
+    }
+}

+ 18 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PaymentResponse.java

@@ -0,0 +1,18 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/10 15:57
+ */
+
+@Data
+@AllArgsConstructor
+public class PaymentResponse {
+    /**
+     * 自定义接口地址
+     */
+    private String url;
+}

+ 121 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyElectronicResponse.java

@@ -0,0 +1,121 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/12 10:38
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyElectronicResponse {
+    /**
+     * 响应头
+     */
+    private ResponseHead responseHead;
+
+    /**
+     * 响应体
+     */
+    private ResponseBody responseBody;
+
+    @Data
+    @AllArgsConstructor
+    public static class ResponseHead {
+        /**
+         * 响应类型
+         */
+        private String responseType;
+
+        /**
+         * 响应码
+         */
+        private String responseCode;
+
+        /**
+         * 错误描述
+         */
+        private String errorMessage;
+    }
+
+    @Data
+    @AllArgsConstructor
+    public static class ResponseBody {
+        /**
+         * 下载/打印地址查询返参
+         */
+        private ElectronicPolicy electronicPolicy;
+
+        @Data
+        @AllArgsConstructor
+        public static class ElectronicPolicy {
+            /**
+             * 商业险平台交互结果
+             */
+            private String biDownloadResponseCode;
+
+            /**
+             * 商业险失败原因
+             */
+            private String biDownloadErrorMessage;
+
+            /**
+             * 商业险下载地址
+             */
+            private String biDownLoad;
+
+            /**
+             * 交强险平台交互结果
+             */
+            private String ciDownloadResponseCode;
+
+            /**
+             * 交强险失败原因
+             */
+            private String ciDownloadErrorMessage;
+
+            /**
+             * 交强险下载地址
+             */
+            private String ciDownLoad;
+
+            /**
+             * 交强险标志平台交互结果
+             */
+            private String bzDownloadResponseCode;
+
+            /**
+             * 交强险标志失败原因
+             */
+            private String bzDownloadErrorMessage;
+
+            /**
+             * 交强险标志下载地址
+             */
+            private String bzDownLoad;
+
+            /**
+             * 交强险业务号
+             */
+            private String contractNoCi;
+
+            /**
+             * 交强险标志业务号
+             */
+            private String contractNoBz;
+
+            /**
+             * 商业险业务号
+             */
+            private String contractNoBi;
+
+            /**
+             * 业务类型
+             */
+            private String businessType;
+        }
+    }
+
+}

+ 36 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyRecallResponse.java

@@ -0,0 +1,36 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/13 15:44
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyRecallResponse {
+
+    private ResponseHead responseHead;
+
+    @Data
+    @NoArgsConstructor
+    public static class ResponseHead {
+        /**
+         * 响应类型
+         */
+        private String responseType;
+
+        /**
+         * 返回类型代码
+         */
+        private String responseCode;
+
+        /**
+         * 错误信息
+         */
+        private String errorMessage;
+    }
+}

+ 123 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PolicyStatusResponse.java

@@ -0,0 +1,123 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/3/13 9:20
+ */
+
+@Data
+@AllArgsConstructor
+public class PolicyStatusResponse {
+    private ResponseHead responseHead;
+
+    private ResponseBody responseBody;
+
+    @Data
+    @NoArgsConstructor
+    public static class ResponseHead {
+        /**
+         * 响应类型
+         */
+        private String responseType;
+
+        /**
+         * 返回类型代码
+         */
+        private String responseCode;
+
+        /**
+         * 错误信息
+         */
+        private String errorMessage;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class ResponseBody {
+        /**
+         * 投保单状态查询对象
+         */
+        private List<EBCallbackData> eBCallbackData;
+
+        /**
+         * 车加意的意外险承保必返
+         */
+        private String nvhlPolicyNo;
+
+        @Data
+        @NoArgsConstructor
+        public static class EBCallbackData {
+            /**
+             * 投保单号
+             */
+            private String proposalNo;
+
+            /**
+             * 保单号
+             */
+            private String policyNo;
+
+            /**
+             * 状态
+             */
+            private String underWriteInd;
+
+            /**
+             * 审核时间
+             */
+            private String operateTime;
+
+            /**
+             * 审核意见
+             */
+            private String operateText;
+
+
+            /**
+             * 被保险人名称
+             */
+            private String insuredName;
+
+            /**
+             * 总保额
+             */
+            private String sumAmount;
+
+            /**
+             * 总签单保费
+             */
+            private String totalPremium;
+
+            /**
+             * 缴费有效止期
+             */
+            private String paymentEndDate;
+
+            /**
+             * 险种代码
+             */
+            private String riskCode;
+
+            /**
+             * 电子投保单签名状态
+             */
+            private String signStatus;
+
+            /**
+             * 起保日期
+             */
+            private String validDate;
+
+            /**
+             * 终保日期
+             */
+            private String expiryDate;
+        }
+    }
+}

+ 464 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/PremiumCalculationResponse.java

@@ -0,0 +1,464 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/2/26 17:45
+ */
+
+@NoArgsConstructor
+@Data
+@JacksonXmlRootElement(localName = "policyFeeCountResponseBody")
+public class PremiumCalculationResponse {
+    /**
+     * 报文头信息(Head)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "Head")
+    private head Head;
+
+    /**
+     * 商业险部分
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "CommRisk")
+    private commRisk CommRisk;
+
+    /**
+     * 交强险部分
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "CompRisk")
+    private compRisk CompRisk;
+
+    /**
+     * 驾意险部分
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "AcciRisk")
+    private AcciRisk AcciRisk;
+
+    /**
+     * 一账通定价信息
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "OcftInfo")
+    private OcftInfo OcftInfo;
+
+    /**
+     * 壹账通评分信息(YztScore)
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "YztScore")
+    private yztScore YztScore;
+
+    @NoArgsConstructor
+    @Data
+    public static class head {
+        /**
+         * 请求类型
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "requestType")
+        private String requestType;
+
+        /**
+         * 返回类型代码
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "responseCode")
+        private String responseCode;
+
+        /**
+         * 错误描述
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "errorMessage")
+        private String errorMessage;
+    }
+
+    /**
+     * 商业险部分
+     */
+    @NoArgsConstructor
+    @Data
+    public static class commRisk {
+        /**
+         * 公共部分
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "Ftrno")
+        private ftrno Ftrno;
+
+        /**
+         * 基础部分
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "BasePart")
+        private basePart BasePart;
+
+        /**
+         * 险别信息(KindList)包含多条(Kind)
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "KindList")
+        private List<Kind> KindList;
+
+        @NoArgsConstructor
+        @Data
+        public static class ftrno {
+            /**
+             * 订单号
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "orderNumber")
+            private String orderNumber;
+        }
+        @NoArgsConstructor
+        @Data
+        public static class basePart {
+            /**
+             * 总保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sumPremuim")
+            private String sumPremuim;
+
+            /**
+             * 总折扣
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "discount")
+            private BigDecimal discount;
+
+            /**
+             * 折前总保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "benchmarkPremium")
+            private BigDecimal benchmarkPremium;
+
+            /**
+             * 转保车问题
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "question")
+            private String question;
+
+            /**
+             * 建议折扣
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "entireRecommenDiscount")
+            private BigDecimal entireRecommenDiscount;
+
+            /**
+             * NCD系数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "profitRate")
+            private BigDecimal profitRate;
+
+            /**
+             * 续保标志 0-新保 1-转保
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "renewalFlag")
+            private String renewalFlag;
+
+            /**
+             * 连续承保期间出险次数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "claimsNum")
+            private String claimsNum;
+
+            /**
+             * 自主定价系数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "fixedPriceRate")
+            private BigDecimal fixedPriceRate;
+
+            /**
+             * 光博车险分
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sunlightScore")
+            private BigDecimal sunlightScore;
+
+            /**
+             * 连续承保年数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "insureYears")
+            private Integer insureYears;
+        }
+        /**
+         * 险别信息(Kind)
+         */
+        @NoArgsConstructor
+        @Data
+        public static class Kind {
+
+            /**
+             * 险种代码
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "riskCode")
+            private String riskCode;
+
+            /**
+             * 险别名称
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "kindName")
+            private String kindName;
+
+            /**
+             * 险别代码
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "kindCode")
+            private String kindCode;
+
+            /**
+             * 保额
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "amount")
+            private BigDecimal amount;
+
+            /**
+             * 折后保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "grossPremium")
+            private BigDecimal grossPremium;
+
+            /**
+             * 折前保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "benchmarkPremium")
+            private BigDecimal benchmarkPremium;
+
+            /**
+             * 折扣率
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "discount")
+            private BigDecimal discount;
+
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class compRisk {
+        /**
+         * 公共部分
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "Ftrno")
+        private ftrno Ftrno;
+
+        /**
+         * 基础信息
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "BasePart")
+        private basePart BasePart;
+
+        /**
+         * 车船税信息
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "CarShipTax")
+        private carShipTax CarShipTax;
+
+        @NoArgsConstructor
+        @Data
+        public static class ftrno {
+            /**
+             * 订单号
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "orderNumber")
+            private String orderNumber;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class basePart {
+            /**
+             * 总保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sumPremuim")
+            private String sumPremuim;
+
+            /**
+             * 总折扣
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "discount")
+            private BigDecimal discount;
+
+            /**
+             * 折前总保费
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "benchmarkPremium")
+            private BigDecimal benchmarkPremium;
+
+            /**
+             * 转保车问题
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "question")
+            private String question;
+
+            /**
+             * 上年出险次数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "claimsNum")
+            private String claimsNum;
+
+            /**
+             * 续保标志
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "renewalFlag")
+            private String renewalFlag;
+
+            /**
+             * 光博车险分
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sunlightScore")
+            private BigDecimal sunlightScore;
+
+            /**
+             * 交强险分类
+             * 1真单交 2假单交
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "isCIFlag")
+            private String isCIFlag;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class carShipTax {
+            /**
+             * 税额合计
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sumPayTax")
+            private BigDecimal sumPayTax;
+
+            /**
+             * 计税分类
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "taxRelifFlag")
+            private String taxRelifFlag;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AcciRisk {
+        /**
+         * 非车产品code
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "nvhlSuitCode")
+        private String nvhlSuitCode;
+
+        /**
+         * 非车产品保费
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "nvhlSuitPrice")
+        private BigDecimal nvhlSuitPrice;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class OcftInfo {
+        /**
+         * 壹账通定价信息ID
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "ocftId")
+        private String ocftId;
+
+        /**
+         * 壹账通系数列表
+         */
+        @JacksonXmlElementWrapper(useWrapping = false)
+        @JacksonXmlProperty(isAttribute = false, localName = "coefficientList")
+        private List<Coefficient> coefficientList;
+
+        @NoArgsConstructor
+        @Data
+        public static class Coefficient {
+            /**
+             * 序号
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "sortNo")
+            private Integer sortNo;
+
+            /**
+             * 业务类型
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "dataType")
+            private String dataType;
+
+            /**
+             * 自主定价系数
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "coefficient")
+            private BigDecimal coefficient;
+
+            /**
+             * 车辆用途代码
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "carUsing")
+            private String carUsing;
+
+            /**
+             * 车辆用途名称
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "carUsingName")
+            private String carUsingName;
+
+            /**
+             * 选中标识 1-选中,默认空
+             */
+            @JacksonXmlProperty(isAttribute = false, localName = "isChoose")
+            private String isChoose;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class yztScore {
+        /**
+         * orderID
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "orderId")
+        private String orderId;
+
+        /**
+         * 评分ID
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "scoreId")
+        private String scoreId;
+
+        /**
+         * 评分百分段
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "centile")
+        private Integer centile;
+
+        /**
+         * 商业险纯损失
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "commercialPureLost")
+        private BigDecimal commercialPureLost;
+
+        /**
+         * 预估标的终极赔付率
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "finalLossrationRate")
+        private BigDecimal finalLossrationRate;
+
+        /**
+         * 交强险纯损失
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "forcePureLost")
+        private BigDecimal forcePureLost;
+
+        /**
+         * 标的纯损失
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "targetPureLost")
+        private BigDecimal targetPureLost;
+
+        /**
+         * 升分主要因子
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "increaseFactor")
+        private String increaseFactor;
+
+        /**
+         * 具体错误信息
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "errorMessage")
+        private String errorMessage;
+    }
+}

+ 15 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/SubmitCallBackResponse.java

@@ -0,0 +1,15 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/3/11 15:39
+ */
+
+@AllArgsConstructor
+@Data
+public class SubmitCallBackResponse {
+    private String responseCode;
+}

+ 138 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/SubmitResponse.java

@@ -0,0 +1,138 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/3/4 14:49
+ */
+
+
+@NoArgsConstructor
+@Data
+@JacksonXmlRootElement(localName = "policySaveResponseBody")
+public class SubmitResponse {
+    /**
+     * 请求头信息
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "Head")
+    private head Head;
+
+    /**
+     * 投保单保存成功对象
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "Proposal")
+    private proposal Proposal;
+
+    /**
+     * 投保单失败信息
+     */
+    @JacksonXmlProperty(isAttribute = false, localName = "errorMessage")
+    private String errorMessage;
+
+    @JacksonXmlProperty(isAttribute = false, localName = "requestType")
+    private String requestType;
+
+    @JacksonXmlProperty(isAttribute = false, localName = "responseCode")
+    private String responseCode;
+
+
+
+    @NoArgsConstructor
+    @Data
+    public static class head {
+        /**
+         * 请求类型
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "requestType")
+        private String requestType;
+
+        /**
+         * 返回类型代码
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "responseCode")
+        private String responseCode;
+
+        /**
+         * 错误描述
+         */
+        @JacksonXmlProperty(isAttribute = false, localName = "errorMessage")
+        private String errorMessage;
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class proposal {
+        /**
+         * 投保单号
+         */
+        @JacksonXmlProperty(localName = "proposalNo")
+        private String proposalNo;
+
+        /**
+         * 险种代码
+         * 0801	交强险
+         * 0808	机动车综合险(2014)
+         */
+        @JacksonXmlProperty(localName = "riskCode")
+        private String riskCode;
+
+        /**
+         * 审核标志
+         * 0	初始状态(暂存状态)
+         * 1	双审核通过
+         * 2	下发修改
+         * 3	双审核自动通过
+         * 4	拒保
+         * 5	复核通过
+         * 6	承保确认
+         * 7	复核不通过
+         * 8	代复核
+         * 9	代双核审核
+         * A	已修改代复核
+         * B	下发影像
+         * C	报价确认
+         */
+        @JacksonXmlProperty(localName = "underWriteInd")
+        private String underWriteInd;
+
+        /**
+         * 商业险投保单号
+         */
+        @JacksonXmlProperty(localName = "commProposalNo")
+        private String commProposalNo;
+
+        /**
+         * 交强险投保单号
+         */
+        @JacksonXmlProperty(localName = "compProposalNo")
+        private String compProposalNo;
+
+        /**
+         * 签名状态
+         * 1	已签名
+         * 2	未签名
+         * 3	无需签名
+         */
+        @JacksonXmlProperty(localName = "signStatus")
+        private String signStatus;
+
+        /**
+         * 非车险投保单号
+         */
+        @JacksonXmlProperty(localName = "noCarProposalNo")
+        private String noCarProposalNo;
+
+        /**
+         * 是否需要短信验证码 0:不需要,2:缴费需要
+         */
+        @JacksonXmlProperty(localName = "smsCheckFlag")
+        private String smsCheckFlag;
+    }
+
+
+}

+ 22 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/UpLoadResponse.java

@@ -0,0 +1,22 @@
+package com.ydtech.modules.order.entity.api.chengtai.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author quchen
+ * @date 2026/3/4 11:15
+ */
+
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class UpLoadResponse extends ChengTaiBaseResponse implements Serializable {
+    @JsonProperty("errorMessage")
+    private String errorMessage;
+
+}

+ 11 - 2
src/main/java/com/ydtech/modules/order/entity/config/ChengTaiConfigureParameters.java

@@ -6,11 +6,20 @@ import lombok.Data;
 @Data
 public class ChengTaiConfigureParameters implements ConfigureParameters {
 
-    // 合作代码
+    // 合作伙伴代码
     private String partnerCode;
 
     // 合作方代码
-    private String userId; // 20230801
+    private String userId;
+
+    // 用户名
+    private String userName;
+
+    // 密码
+    private String passWord;
+
+    // 外网提供的唯一标志
+    private String queryId;
 
     public String getAccessLock() {
         return OrderCacheConstant.CT_ACCESS_LOCK + ":" + this.getPartnerCode();

+ 57 - 10
src/main/java/com/ydtech/modules/order/service/ChengTaiOrderApiService.java

@@ -5,11 +5,13 @@ import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
 import com.ydtech.modules.order.entity.InsOrders;
-import com.ydtech.modules.order.entity.api.chengtai.response.CarInfoResponse;
+import com.ydtech.modules.order.entity.api.chengtai.request.PaymentCallBackRequest;
+import com.ydtech.modules.order.entity.api.chengtai.request.SubmitCallBackRequest;
+import com.ydtech.modules.order.entity.api.chengtai.request.UnderwriteCallBackRequest;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
-import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
+
 
 public interface ChengTaiOrderApiService{
 
@@ -20,7 +22,9 @@ public interface ChengTaiOrderApiService{
      * @param quoteVo
      * @return
      */
-    HttpResult<QuoteRespVo> quoteApi(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) throws Exception;
+//    HttpResult<QuoteRespVo> quoteApi(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) throws Exception;
+
+    HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) throws Exception;
 
     /**
      * 提交影像信息
@@ -35,49 +39,92 @@ public interface ChengTaiOrderApiService{
      * @param modelName
      * @return
      */
-    CarInfoResponse modelsQuery(String modelName) throws Exception;
+//    CarInfoResponse modelsQuery(String modelName) throws Exception;
 
     /**
      * 提交核保
      * @param companyId
      * @return
      */
-    HttpResult<Object> audit(String companyId) throws Exception;
+    HttpResult<Object> submit(String companyId) throws Exception;
+
+    /**
+     * 核保回调接口
+     * @param submitCallBackRequest
+     * @return
+     */
+    HttpResult<Object> submitCallBack(SubmitCallBackRequest submitCallBackRequest) throws Exception;
+
+    /**
+     * 支付
+     * @param companyId
+     * @return
+     */
+    String payment(String companyId) throws Exception;
+
+    /**
+     * 支付回调
+     * @param paymentCallBackRequest
+     * @return
+     */
+    HttpResult<Object> paymentCallBack(PaymentCallBackRequest paymentCallBackRequest) throws Exception;
+
+    /**
+     * 承保回调
+     * @param underwriteCallBackRequest
+     * @return
+     */
+    HttpResult<Object> underwriteCallBack(UnderwriteCallBackRequest underwriteCallBackRequest) throws Exception;
 
     /**
      * 订单状态查询
      * @param companyId
      * @return
      */
-    HttpResult<Object> getOrderDetail(String companyId) throws Exception;
+//    HttpResult<Object> getOrderDetail(String companyId) throws Exception;
 
     /**
      * 核保状态查询
      * @param companyId
      * @return
      */
-    HttpResult<Object> auditStatusQuery(String companyId) throws Exception;
+//    HttpResult<Object> auditStatusQuery(String companyId) throws Exception;
+
+    /**
+     * 保单状态查询
+     */
+    HttpResult<Object> policyStatus(String companyId) throws Exception;
 
     /**
      * 电子保单
      * @param policyPrintVo
      * @return
      */
-    HttpResult<String> getPolicyPrint(PolicyPrintVo policyPrintVo) throws Exception;
+//    HttpResult<String> getPolicyPrint(PolicyPrintVo policyPrintVo) throws Exception;
+
+    /**
+     * 电子保单下载
+     */
+    HttpResult<Object> policyElectronic(String companyId) throws Exception;
 
     /**
      * 未缴费保单撤单
      * @param companyId
      * @return
      */
-    HttpResult<Object> cancel(String companyId) throws Exception;
+//    HttpResult<Object> cancel(String companyId) throws Exception;
+
+    /**
+     * 撤单
+     */
+    HttpResult<Object> policyRecall(String companyId) throws Exception;
 
     /**
      * 获取支付链接
      * @param companyId
      * @return
      */
-    HttpResult<String> getPayUrl(String companyId) throws Exception;
+//    HttpResult<String> getPayUrl(String companyId) throws Exception;
 
     /**
      * 获取保单信息

File diff suppressed because it is too large
+ 1230 - 790
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java


+ 5 - 3
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -63,7 +63,6 @@ import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.crawler.response.CrawlerVerifyPaymentResponse;
 import com.ydtech.modules.order.entity.dto.*;
 import com.ydtech.modules.order.entity.vo.*;
-import com.ydtech.modules.order.entity.vo.bohai.BoHaiQuoteAccidentVo;
 import com.ydtech.modules.order.entity.vo.guoren.GuoRenQuoteVo;
 import com.ydtech.modules.order.entity.vo.guoren.GuorenAccidentalDrivingVo;
 import com.ydtech.modules.order.entity.vo.telemarketing.TelemarketingAuditOrderQueryVo;
@@ -2348,8 +2347,11 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             // 诚泰财险
             BaseQuoteVo<Object> chengtaiBaseQuoteVo = new BaseQuoteVo<>();
             BeanUtils.copyProperties(baseQuoteVo, chengtaiBaseQuoteVo);
-            InsDrivingIntentionInsurance byProjectCode = insDrivingIntentionInsuranceService.getByProjectCode(baseQuoteVo.getCompanyId(), baseQuoteVo.getAccidentalDrivingVo().getProjectCode(), baseQuoteVo.getSeatNum());
-            chengtaiBaseQuoteVo.setAccidentalDrivingVo(JSONObject.parseObject(byProjectCode.getRequestData()));
+            JSONObject accidentObject = JSONObject.parseObject(JSONObject.toJSONString(chengtaiBaseQuoteVo.getAccidentalDrivingVo()));
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("projectCode", accidentObject.getString("projectCode"));
+            jsonObject.put("sumPremium", accidentObject.getString("sumPremium"));
+            chengtaiBaseQuoteVo.setAccidentalDrivingVo(jsonObject);
             return chengtaiBaseQuoteVo;
         } else if (baseQuoteVo.getCompanyId().equals("CPIC1000000")) {
             // 太平洋财险

+ 2 - 2
src/main/java/com/ydtech/modules/order/service/impl/InsuranceCompanyPolymerizationServiceImpl.java

@@ -112,7 +112,7 @@ public class InsuranceCompanyPolymerizationServiceImpl implements InsuranceCompa
                 zhongMeiOrderApiService.auditStatusQuery(insAreaCompany.getId());
             } else if (InsuranceEnum.CHAC.getCode().equals(code)) {
                 try {
-                    chengTaiOrderApiService.auditStatusQuery(insAreaCompany.getId());
+                    chengTaiOrderApiService.policyStatus(insAreaCompany.getId());
                 } catch (Exception e) {
                     throw new RuntimeException(e);
                 }
@@ -165,7 +165,7 @@ public class InsuranceCompanyPolymerizationServiceImpl implements InsuranceCompa
             // 诚泰财险
             } else if (InsuranceEnum.CHAC.getCode().equals(code)) {
                 try {
-                    chengTaiOrderApiService.getOrderDetail(insAreaCompany.getId());
+                    chengTaiOrderApiService.policyStatus(insAreaCompany.getId());
                 } catch (Exception e) {
                     throw new RuntimeException(e);
                 }

+ 2 - 0
src/main/resources/application-prod.yml

@@ -428,6 +428,8 @@ yangguang:
 
 chengtai:
   api:
+    codeKey: TYTQBX
+    url: https://echac.champion-ic.com/
     baseUrl: https://hsale.champion-ic.com/app/SERVER_V2/4001/
     ctPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvuUnoPTFin84nDdpNZFDiGZgUKn6d9fbp6F4/fqrb6pFoJX/wLMr0IsheP0ZnVCPpLGKLjflPNHJo/P9WRRTSM67D8fRD8GKoq+7CtSJkdIticASpN/U8AgJiNV6xdReJcMkaAWJ1ZbOQ+nYLg9OE0qQ6cuXqhy/wVrqx72CrvwIDAQAB
     publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyVlpqmibguria884GdAYEuqCV4aQRl2N21+7l8Vxocoyz+M8KYyXqmlLKqApNL/U5pUVTjS6vpC6ojS+wvNbawijeMsm8r2NOlTHBnQ5vN0azjjPPtSrxgHL8/EYBa4lmBcexdmcUrUyWjAIYqfO8dlY+RuXvbiw7fBHZ7xpAvQIDAQAB

+ 2 - 0
src/main/resources/application-test.yml

@@ -496,6 +496,8 @@ yangguang:
 
 chengtai:
   api:
+    codeKey: TYTQBX
+    url: https://b2cuat.champion-ic.com/echannel/
     baseUrl: https://test.baoxianzhanggui.com/ct/app/SERVER_V2/4001/
     ctPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSsdhdXaBshYpHRc0mBWugsecv7U7OMmNNNrToXoAE789dfWZ8Im/YBwaB0JEYC55sDVr3pZeIoLLlDlD8IosYJGulQcUrlga5sZ6BjBsfvW+KtoU4H5krR7eKX4dGCHX2qGH9eHJRU1Y7jGhOwjxDvEBHwRlY2Ur/gD2vBcJT8wIDAQAB
     publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG5XjPzLv7/LwXmDkSS2kL4JN3B9JK6mRDxgal+K7f5GY2c3TRXSIm2ot+2ZL2Tr4nSJEkZUe98ORovYnpvgeW16MFhPAkUYHVu3rv6JKuGrJhdvkfNC/TR92oey8/Qk0YwSeOzHEf1tEfMvnE3pC8xZom4Et2W9y62+RoH22uhQIDAQAB

Some files were not shown because too many files changed in this diff