shenweidong 1 год назад
Родитель
Сommit
d226b87e2a
54 измененных файлов с 5732 добавлено и 5 удалено
  1. 138 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/build/HuaTaiApiQuoteResultsVoBuild.java
  2. 304 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/HuaTaiRequestApiComponent.java
  3. 219 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/HuiTaiUploadImageComponent.java
  4. 69 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/InsImagesUploadCacheComponent.java
  5. 71 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/HuaTaiBaseCode.java
  6. 43 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/HuaTaiTransCode.java
  7. 17 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/TimeConstants.java
  8. 72 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/ContractEnum.java
  9. 24 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/HuaTaiRiskCode.java
  10. 61 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/ImageTypeCode.java
  11. 26 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/MotorTypeCode.java
  12. 30 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/MotorUsageTypeCode.java
  13. 79 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiApiOrder.java
  14. 46 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBaseRequestHead.java
  15. 22 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBaseResponseHead.java
  16. 29 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBastHead.java
  17. 58 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiConfigureParameters.java
  18. 75 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiActualValueRequest.java
  19. 23 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiBaseRequest.java
  20. 29 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiEncryptReq.java
  21. 35 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiInsurancePolicyPrintRequest.java
  22. 80 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiModelsQueryRequest.java
  23. 64 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiOrderStatusRequest.java
  24. 50 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiPaymentLogoutRequest.java
  25. 69 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiPaymentUrlRequest.java
  26. 812 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiQuotedPriceRequest.java
  27. 209 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSaveFileIdxRequest.java
  28. 521 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSubmitRequest.java
  29. 88 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSubmitStatusQueryRequest.java
  30. 54 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiUploadImageRequest.java
  31. 30 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiActualValueResponse.java
  32. 23 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiBaseResponse.java
  33. 30 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiEncryptRes.java
  34. 370 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiImageInitParamResponse.java
  35. 54 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiInsurancePolicyPrintResponse.java
  36. 107 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiModelsQueryResponse.java
  37. 78 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiOrderStatusResponse.java
  38. 28 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiPaymentLogoutResponse.java
  39. 58 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiPaymentUrlResponse.java
  40. 297 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiQuotedPriceResponse.java
  41. 89 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiSubmitResponse.java
  42. 64 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiSubmitStatusQueryResponse.java
  43. 27 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiUploadImageResponse.java
  44. 33 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/vo/InsHuataiContributingVo.java
  45. 34 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/properties/HuaTaiApiConfigurationProperties.java
  46. 16 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/repository/HuaTaiApiOrderRepository.java
  47. 15 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/HuaTaiApiOrderService.java
  48. 38 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/Impl/HuaTaiApiOrderServiceImpl.java
  49. 246 4
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/Impl/HuaTaiApiRequestImpl.java
  50. 178 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/AESUtilsWithDataBase.java
  51. 63 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/Base64Utils.java
  52. 128 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/BizCommStreamUtils.java
  53. 308 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/RSAUtils.java
  54. 1 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/constant/enums/ContractEnum.java

+ 138 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/build/HuaTaiApiQuoteResultsVoBuild.java

@@ -0,0 +1,138 @@
+package com.jzg.quote.huatai.api.build;
+
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.KindInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quote.huatai.api.constant.enums.HuaTaiRiskCode;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiQuotedPriceResponse;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 华泰财险  处理华泰返回的报价数据
+ * @author: shenwd
+ * @date: 2025/3/11 14:29
+ **/
+public class HuaTaiApiQuoteResultsVoBuild {
+    public static QuoteResultsVo buildQuoteResultsVo(String orderNo, QuoteVo quoteVo, HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setOrdersNo(orderNo);
+        // 交强险
+        quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(quotedPriceResponse));
+        // 商业险
+        quoteResultsVo.setBiRiskInfoVo(buildBiRiskInfoVo(quotedPriceResponse));
+        // 商业险险种信息
+        HuaTaiQuotedPriceResponse.ContractDto biContractDto = getBiContractDto(quotedPriceResponse);
+        List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), biContractDto.getCoverage());
+        quoteResultsVo.setKindInfoVo(kindInfoVo);
+
+        // 交强保费 车船税 商业保费
+        buildPremium(quoteResultsVo, quotedPriceResponse);
+        return quoteResultsVo;
+    }
+
+    /**
+     * 处理商业险数据
+     * @param quotedPriceResponse
+     * @return
+     */
+    public static RiskInfoVo buildBiRiskInfoVo(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        HuaTaiQuotedPriceResponse.ContractDto biContractDto = getBiContractDto(quotedPriceResponse);
+        riskInfoVo.setRiskCode(biContractDto.getContractMain().getRiskCode());
+        riskInfoVo.setStartDate(biContractDto.getContractMain().getValidDate());
+        riskInfoVo.setEndDate(biContractDto.getContractMain().getExpiryDate());
+
+        return riskInfoVo;
+    }
+
+    /**
+     * 处理交强险数据
+     * @param quotedPriceResponse
+     * @return
+     */
+    public static RiskInfoVo buildCiRiskInfoVo(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        HuaTaiQuotedPriceResponse.ContractDto ciContractDto = getCiContractDto(quotedPriceResponse);
+        riskInfoVo.setRiskCode(ciContractDto.getContractMain().getRiskCode());
+        riskInfoVo.setStartDate(ciContractDto.getContractMain().getValidDate());
+        riskInfoVo.setEndDate(ciContractDto.getContractMain().getExpiryDate());
+
+        return riskInfoVo;
+    }
+
+    /**
+     * 处理商业险信息
+     * @param kindInfoVo
+     * @param coverageListDTOS
+     * @return
+     */
+    private static List<KindInfoVo> buildKindInfoVo(List<KindInfoVo> kindInfoVo, List<HuaTaiQuotedPriceResponse.ContractDto.CoverageDto> coverageListDTOS) {
+        Map<String, HuaTaiQuotedPriceResponse.ContractDto.CoverageDto> collect = coverageListDTOS.stream()
+                .collect(Collectors.toMap(HuaTaiQuotedPriceResponse.ContractDto.CoverageDto::getKindCode, x -> x));
+        kindInfoVo.forEach(kind -> {
+            HuaTaiQuotedPriceResponse.ContractDto.CoverageDto coverageDto = collect.get(kind.getKindCode());
+            if (coverageDto.getKindCode().equals(kind.getKindCode())) {
+                //kind.setAmount(String.valueOf(coverageDto.getAmount()));//设置保额
+                kind.setPremium(String.valueOf(coverageDto.getCoveragePremium()));//设置保费
+                kind.setUnitAmount(String.valueOf(coverageDto.getUnitAmount()));//设置每座保额
+                kind.setQuantity(String.valueOf(coverageDto.getQuantity()));//设置份数
+            }
+        });
+        return kindInfoVo;
+    }
+
+    /**
+     * 设置商业险,交强险保费
+     * @param quoteResultsVo
+     * @param quotedPriceResponse
+     */
+    private static void buildPremium(QuoteResultsVo quoteResultsVo, HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        HuaTaiQuotedPriceResponse.ContractDto biContractDto = getBiContractDto(quotedPriceResponse);
+        HuaTaiQuotedPriceResponse.ContractDto ciContractDto = getCiContractDto(quotedPriceResponse);
+        // 设置交强险保费
+        quoteResultsVo.setCiPremium(String.valueOf(ciContractDto.getContractMain().getTotalPremium()));
+        // 设置车船税
+        quoteResultsVo.setVvTax(String.valueOf(ciContractDto.getTax().getSumTax()));
+        // 设置商业险保费
+        quoteResultsVo.setBiPremium(String.valueOf(biContractDto.getContractMain().getTotalPremium()));
+        // 设置非车险(驾意险)保费,暂时无数据
+
+    }
+
+    //获取商业险数据
+    public static HuaTaiQuotedPriceResponse.ContractDto getBiContractDto(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        HuaTaiQuotedPriceResponse.ContractDto result = null;
+        List<HuaTaiQuotedPriceResponse.ContractDto> contractDtos = quotedPriceResponse.getBusinessData().getContract();
+        List<String> huaTaiSyRiskCodes = new ArrayList<>();
+        huaTaiSyRiskCodes.add(HuaTaiRiskCode.R_1251.getCode());
+        huaTaiSyRiskCodes.add(HuaTaiRiskCode.R_1252.getCode());
+        huaTaiSyRiskCodes.add(HuaTaiRiskCode.R_1253.getCode());
+        huaTaiSyRiskCodes.add(HuaTaiRiskCode.R_1255.getCode());
+        for (HuaTaiQuotedPriceResponse.ContractDto contractDto : contractDtos) {
+            HuaTaiQuotedPriceResponse.ContractDto.ContractMainDto contractMain = contractDto.getContractMain();
+            if (huaTaiSyRiskCodes.contains(contractMain.getRiskCode())) {
+                result = contractDto;
+            }
+        }
+        return result;
+    }
+
+    //获取交强险数据
+    public static HuaTaiQuotedPriceResponse.ContractDto getCiContractDto(HuaTaiQuotedPriceResponse quotedPriceResponse) {
+        HuaTaiQuotedPriceResponse.ContractDto result = null;
+        List<HuaTaiQuotedPriceResponse.ContractDto> contractDtos = quotedPriceResponse.getBusinessData().getContract();
+        for (HuaTaiQuotedPriceResponse.ContractDto contractDto : contractDtos) {
+            HuaTaiQuotedPriceResponse.ContractDto.ContractMainDto contractMain = contractDto.getContractMain();
+            if (HuaTaiRiskCode.R_1002.equals(contractMain.getRiskCode())) {
+                result = contractDto;
+            }
+        }
+        return result;
+    }
+
+}

+ 304 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/HuaTaiRequestApiComponent.java

@@ -0,0 +1,304 @@
+package com.jzg.quote.huatai.api.component;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quote.huatai.api.entity.request.*;
+import com.jzg.quote.huatai.api.entity.response.*;
+import com.jzg.quote.huatai.api.properties.HuaTaiApiConfigurationProperties;
+import com.jzg.quote.huatai.api.utils.AESUtilsWithDataBase;
+import com.jzg.quote.huatai.api.utils.Base64Utils;
+import com.jzg.quote.huatai.api.utils.RSAUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
+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.ObjectUtils;
+import org.springframework.web.client.RestTemplate;
+
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description: 华泰 APi 请求
+ * @author: shenwd
+ * @date: 2025/3/10 09:36
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class HuaTaiRequestApiComponent {
+
+    private final HuaTaiApiConfigurationProperties properties;
+
+    private final RequestComponent requestComponent;
+
+    private final StringRedisTemplate redisTemplate;
+
+    private final RestTemplate restTemplate;
+    /**
+     * 加密请求
+     *
+     * @param q      请求参数
+     * @param url    请求url
+     * @param tClass 响应类型
+     * @param <Q>    Request 请求体
+     * @param <S>    Response 响应体
+     * @return <S>
+     */
+    private <Q extends HuaTaiBaseRequest, S extends HuaTaiBaseResponse> S post(Q q, String url, Class<S> tClass, String insuredCode) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+
+        String busReqString = JSON.toJSONString(q, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+        //InsuranceLog.infoLog(InsuranceEnum.HTIC.getPinyin(), "\n\t---------> URl: {} \n---------> 请求参数:{}", url, busReqString);
+        // ----加密starting------------
+        //1.先获取16位随机字符串 Key
+        String key = generateRadomStr(8);
+        //2.使用Base64加密请求报文
+        String base64ReqJson = Base64Utils.getBase64Encode(busReqString);
+        //3. 使用AES算法 秘钥Key  对 base64ReqJson加密
+        String busiContent = AESUtilsWithDataBase.encryptECBPK5Base64(base64ReqJson, key);
+        //4.对Key 使用RSA算法进行加密
+        String accessToken = "";
+        try {
+            accessToken = RSAUtils.rsaEncrypt(key, properties.getHuaTaiPublicKey(), "utf-8");
+        } catch (Exception e) {
+            throw new SystemException("RSA加密获取accessToken失败!");
+        }
+        HuaTaiEncryptReq encryptReq = new HuaTaiEncryptReq();
+        encryptReq.setInsuredCode(insuredCode);
+        encryptReq.setSourceCode(properties.getSourceCode());
+        encryptReq.setBusiContent(busiContent);
+        encryptReq.setAccessToken(accessToken);
+
+
+        String jsonString = JSON.toJSONString(encryptReq, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+//        InsuranceLog.infoLog(InsuranceEnum.HTIC.getPinyin(), "\n\t---------> 加密后的参数:{}", jsonString);
+        HttpEntity<String> httpEntity = new HttpEntity<>(jsonString, httpHeaders);
+        //----加密endding------------
+        ResponseEntity<String> response = requestComponent.objectPost(url, httpEntity, String.class);
+        String body = response.getBody();
+
+//        InsuranceLog.infoLog(InsuranceEnum.HTIC.getPinyin(), "\n\t---------> 解密前的参数:{}", body);
+        // ------解密starting---------
+        HuaTaiEncryptRes encryptRes = JSON.parseObject(body, HuaTaiEncryptRes.class);
+        //1.通过自己的私钥对key进行解密
+        String resAccessToken = "";
+        try {
+            resAccessToken = RSAUtils.rsaDecrypt(encryptRes.getAccessToken(), properties.getSelfPrivateKey(), "UTF-8");
+        } catch (Exception e) {
+            throw new SystemException("RSA解密获取accessToken失败!");
+        }
+        //2.用key解密出出参报文
+        String aseDecryptStr = AESUtilsWithDataBase.decryptECBPK5Base64(encryptRes.getBusiContent(), resAccessToken);
+        //3.使用Base64解密最终返回报文
+        String text = Base64Utils.getBase64Decode(aseDecryptStr);
+        // ------解密ending---------
+//        InsuranceLog.infoLog(InsuranceEnum.HTIC.getPinyin(), "\n\t---------> {}:{}", "响应参数", text);
+        S t = JSON.parseObject(text, tClass);
+        if (ObjectUtils.isEmpty(t)) {
+            throw new SystemException("请求失败");
+        }
+        return t;
+    }
+
+    /**
+     * @param <Q>     Request 请求体
+     * @param <S>     Response 响应体
+     * @param request 请求内容
+     * @param tClass  响应类型
+     * @param verify  结果是否需要验证
+     * @return 响应内容
+     */
+    private <Q extends HuaTaiBaseRequest, S extends HuaTaiBaseResponse> S request(Q request, Class<S> tClass, boolean verify,
+                                                                                  String domain, String insuredCode) {
+        String url = domain;
+        //拼接voken的参数
+        url=getAllUrl(url);
+
+        S response = post(request, url, tClass, insuredCode);
+        if (verify) {
+            validationResults(response);
+        }
+        return response;
+    }
+
+    /**
+     * @param <Q> Request 请求体
+     * @param <S> Response 响应体
+     *            常规
+     */
+    private <Q extends HuaTaiBaseRequest, S extends HuaTaiBaseResponse> S routineRequest(Q request, Class<S> tClass, boolean verify, String insuredCode) {
+        return request(request, tClass, verify, properties.getBaseUrl(), insuredCode);
+    }
+
+    /**
+     * 车型查询 传入必要车辆信息,返回车型列表给用户选择
+     */
+    public List<HuaTaiModelsQueryResponse.CarModelDto> modelQuery(HuaTaiModelsQueryRequest request,
+                                                                  Class<HuaTaiModelsQueryResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode).getCarModel();
+    }
+
+    public HuaTaiActualValueResponse actualValue(HuaTaiActualValueRequest request, Class<HuaTaiActualValueResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+    /**
+     * 报价 传入必要投保方案信息,返回投保单保费及车船税
+     */
+    public HuaTaiQuotedPriceResponse quotedPrice(HuaTaiQuotedPriceRequest request, Class<HuaTaiQuotedPriceResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, false, insuredCode);
+    }
+
+    /**
+     * 提交核保 传入投保单必要信息,对投保单进行审核
+     */
+    public HuaTaiSubmitResponse submit(HuaTaiSubmitRequest request, Class<HuaTaiSubmitResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, false, insuredCode);
+    }
+
+    /**
+     * 上传影像 传入订单信息,查询是否生成保单成功
+     */
+    public HuaTaiUploadImageResponse uploadImage(HuaTaiUploadImageRequest request, Class<HuaTaiUploadImageResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+    /**
+     * 缴费查询
+     */
+    public HuaTaiOrderStatusResponse orderStatus(HuaTaiOrderStatusRequest request, Class<HuaTaiOrderStatusResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+    public <T extends HuaTaiBaseResponse> void validationResults(T t) {
+        if ("-1".equals(t.getHead().getReturnCode())) {
+            if (StringUtils.isNotEmpty(t.getHead().getReturnMessage()) && t.getHead().getReturnMessage().contains("商业险重复投保") && t.getHead().getReturnMessage().contains("重复投保的本公司的保单信息")) {
+
+            } else {
+                throw new SystemException(t.getHead().getReturnMessage());
+            }
+
+        }
+    }
+
+    /**
+     * 缴费注销
+     */
+    public HuaTaiPaymentLogoutResponse paymentLogout(HuaTaiPaymentLogoutRequest request, Class<HuaTaiPaymentLogoutResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+    /**
+     * 获取缴费链接
+     */
+    public HuaTaiPaymentUrlResponse getPaymentUrl(HuaTaiPaymentUrlRequest request, Class<HuaTaiPaymentUrlResponse> tClass, String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+    /**
+     * 核保状态查询 传入单号查询该单核保状态
+     */
+    public HuaTaiSubmitStatusQueryResponse submitStatus(HuaTaiSubmitStatusQueryRequest request,
+                                                        Class<HuaTaiSubmitStatusQueryResponse> tClass,
+                                                        String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+
+    /**
+     * 电子保单下载 传入单号相关信息下载电子保单
+     */
+    public HuaTaiInsurancePolicyPrintResponse insurancePolicyPrint(HuaTaiInsurancePolicyPrintRequest request,
+                                                                   Class<HuaTaiInsurancePolicyPrintResponse> tClass,
+                                                                   String insuredCode) {
+        return routineRequest(request, tClass, true, insuredCode);
+    }
+
+    /**
+     * 生成对应长度的随机字符串
+     *
+     * @param length
+     * @return
+     */
+    private static String generateRadomStr(int length) {
+        SecureRandom random = new SecureRandom();
+        byte[] bytes = new byte[length];
+        random.nextBytes(bytes);
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bytes) {
+            sb.append(String.format("%02x", b));
+        }
+        return sb.toString();
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/6/25 17:56
+     *  @Description: 获取voken
+     */
+    public String getVotoken(){
+        String voken = redisTemplate.opsForValue().get("HT_GET_VOKEN_STR");
+        if(StringUtils.isBlank(voken)){
+            //重新放入,重新获取
+            setVoken();
+            voken = redisTemplate.opsForValue().get("HT_GET_VOKEN_STR");
+        }
+        return voken;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/6/25 18:01
+     *  @Description: 添加voken参数的路径
+     */
+    private String getAllUrl(String url) {
+        return  url+"?voken="+getVotoken();
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/6/25 17:29
+     *  @Description:  访问车险核心系统API时,需要在请求头或请求参数中传voken。
+     *  添加获取voken的接口 放入到redis中, 2小时,过期后需重新获取。
+     *
+     */
+    public void setVoken(){
+        String url = properties.getTokenUrl();
+        if(StringUtils.isBlank(url)){
+            throw new SystemException("获取voken地址不能为空");
+        }
+        String jkey = properties.getHuaTaiKey();
+        if(StringUtils.isBlank(url)){
+            throw new SystemException("jkey不能为空");
+        }
+        String key = properties.getKey();
+        if(StringUtils.isBlank(url)){
+            throw new SystemException("key不能为空");
+        }
+        //获取voken
+        Map<String, String> params = new HashMap<>();
+        params.put("key", key);
+        params.put("jkey", jkey);
+        try{
+            url=url+"?key={key}&jkey={jkey}";
+            String result = restTemplate.getForObject(url, String.class, params);
+            if(StringUtils.isNotBlank(result)){
+                //放入到redis中  2小时
+                redisTemplate.opsForValue().set("HT_GET_VOKEN_STR", result, 2*60*59, TimeUnit.SECONDS);
+            }
+        }catch(Exception e){
+            throw new SystemException("获取voken异常");
+        }
+    }
+}

+ 219 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/HuiTaiUploadImageComponent.java

@@ -0,0 +1,219 @@
+package com.jzg.quote.huatai.api.component;
+
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.entity.vo.image.InsuranceImageVo;
+import com.jzg.quote.huatai.api.constant.enums.ImageTypeCode;
+import com.jzg.quote.huatai.api.entity.request.HuaTaiSaveFileIdxRequest;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiImageInitParamResponse;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * @description: 华泰财险 影像上传
+ * @author: shenwd
+ * @date: 2025/3/12 09:02
+ **/
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class HuiTaiUploadImageComponent {
+    private final RestTemplate restTemplate;
+    private static final String INIT_PARAM = "/h5img/app/ImgManager/initParam.cmd?t=";
+    private static final String FILE_UPLOAD = "/h5img/fileupload";
+    private static final String SAVE_FILE_IDX = "/h5img/app/ImgManager/saveFileIdx.cmd";
+
+    private final InsImagesUploadCacheComponent insImagesUploadCacheComponent;
+
+    /**
+     * 上传影像
+     *
+     * @param url                 上传url
+     * @param imageVoList 影像信息
+     */
+    public void uploadImage(String companyId, String url, List<InsuranceImageVo> imageVoList) {
+        URL u;
+        try {
+            u = new URL(url);
+        } catch (MalformedURLException e) {
+            throw new SystemException("华泰文件上传路劲解析失败");
+        }
+        String domain = u.getProtocol() + "://" + u.getAuthority();
+        String query = u.getQuery();
+        String[] params = query.split("&");
+        String token = null;
+        for (String param : params) {
+            String[] pair = param.split("=");
+            if (pair[0].equals("token")) {
+                token = pair[1];
+            }
+        }
+
+        HuaTaiImageInitParamResponse initParamResponse = initParam(domain, token);
+        List<HuaTaiImageInitParamResponse.TypeSelectVosDTO.ChildrenDTO> childrenDTO = initParamResponse.getChildrenDTO();
+        // 使用map 存储上传类型和图片
+        Map<String, List<InsuranceImageVo.ImageDTO>> map = new HashMap<>();
+        for (InsuranceImageVo insuranceImageVo : imageVoList) {
+            for (InsuranceImageVo.ImageDTO imageDTO : insuranceImageVo.getImageBase64List()) {
+                String imageType = insuranceImageVo.getImageCode();//影像类型编码
+                String fileName = imageDTO.getImageName();
+                String substring = fileName.substring(fileName.lastIndexOf("."));
+                String file = getUUIDUpper() + substring;
+
+                for (ImageTypeCode fileTypeEnum : ImageTypeCode.values()) {
+                    boolean contains = Arrays.asList(fileTypeEnum.getImagesType()).contains(imageType);
+                    if (contains) {
+                        try {
+                            HuaTaiImageInitParamResponse.TypeSelectVosDTO.ChildrenDTO childrenDTO1 =
+                                    HuaTaiImageInitParamResponse.filteringTypeCode(childrenDTO, fileTypeEnum.getCode());
+                            /* 涉及业务表
+                            FileuploadResult fileupload = fileupload(domain, token, initParamResponse, imageDTO.getFilePath(), file);
+                            saveFileIdx(domain, token, initParamResponse, fileupload, fileName, childrenDTO1);
+                            map.put(insuranceImageVo.getImageCode(), imageDTO.getImageId());*/
+                        } catch (Exception e) {
+                            insImagesUploadCacheComponent.setUploadImageCache(companyId, map);
+                            throw new SystemException(fileTypeEnum.getName() + "上传异常, 请重试");
+                        }
+
+                    }
+                }
+            }
+        }
+
+        insImagesUploadCacheComponent.setUploadImageCache(companyId, map);
+
+
+    }
+
+    /**
+     * 初始化参数获取 配置信息
+     *
+     * @param domain 域名
+     * @param token  token
+     * @return
+     */
+    private HuaTaiImageInitParamResponse initParam(String domain, String token) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        // token
+        httpHeaders.set("Cookie", "token=" + token);
+        String initParamUrl = domain + INIT_PARAM + System.currentTimeMillis();
+        HttpEntity<Object> httpEntity = new HttpEntity<>(null, httpHeaders);
+        ResponseEntity<HuaTaiImageInitParamResponse> response = restTemplate.exchange(initParamUrl, HttpMethod.GET, httpEntity,
+                HuaTaiImageInitParamResponse.class);
+        return response.getBody();
+    }
+
+    /**
+     * 文件上传返回文件路劲
+     *
+     * @return 文件路劲
+     */
+    private FileuploadResult fileupload(String domain, String token, HuaTaiImageInitParamResponse initParamResponse, String path,
+                                        String fileName) {
+        File file = new File(path);
+        byte[] bytes = file2byte(file);
+        double v = (double) bytes.length / 1024;
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setAccept(Collections.singletonList(MediaType.MULTIPART_FORM_DATA));
+        httpHeaders.set("Bucket", initParamResponse.getStorageType());
+        httpHeaders.set("Bussmodule", initParamResponse.getBussType());
+        httpHeaders.set("Bussno", initParamResponse.getBussNo());
+
+        // token
+        httpHeaders.set("Token", token);
+        // 文件名称
+        httpHeaders.set("Filename", fileName);
+        httpHeaders.setContentType(MediaType.IMAGE_JPEG);
+        HttpEntity<byte[]> httpEntity = new HttpEntity<>(bytes, httpHeaders);
+
+        String fileuploadUrl = domain + FILE_UPLOAD;
+        ResponseEntity<String> response = restTemplate.postForEntity(fileuploadUrl, httpEntity, String.class);
+        return new FileuploadResult(response.getBody(), v);
+    }
+
+
+    /**
+     * 服务端保存
+     *
+     * @param token       token
+     * @param response    请求
+     * @param fileName    文件名称
+     * @param childrenDTO 上传的文件类型
+     */
+    private void saveFileIdx(String domain, String token, HuaTaiImageInitParamResponse response, FileuploadResult fileupload,
+                             String fileName,
+                             HuaTaiImageInitParamResponse.TypeSelectVosDTO.ChildrenDTO childrenDTO) {
+        HuaTaiSaveFileIdxRequest huaTaiSaveFileIdxRequest = new HuaTaiSaveFileIdxRequest(token, response, fileupload, fileName,
+                childrenDTO);
+        huaTaiSaveFileIdxRequest.getFileIdxVo().setImgId(System.currentTimeMillis());
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        httpHeaders.set("Cookie", "token=" + token);
+        HttpEntity<HuaTaiSaveFileIdxRequest> httpEntity = new HttpEntity<>(huaTaiSaveFileIdxRequest, httpHeaders);
+        String saveFileIdxUrl = domain + SAVE_FILE_IDX;
+        restTemplate.postForEntity(saveFileIdxUrl, httpEntity, String.class);
+    }
+
+
+    @AllArgsConstructor
+    @Data
+    public static class FileuploadResult {
+
+        private String filePath;
+
+        private double fileSize;
+
+    }
+
+
+    /**
+     * 获取uuid文件名
+     *
+     * @return UUID名
+     */
+    public static String getUUIDUpper() {
+        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
+    }
+
+    /**
+     * 获取uuid文件名
+     *
+     * @return UUID名
+     */
+    public static String getUUIDLower() {
+        return UUID.randomUUID().toString().replace("-", "").toLowerCase();
+    }
+
+    /**
+     * 将文件转换成byte数组
+     *
+     * @param file 文件
+     * @return 字节
+     */
+    public static byte[] file2byte(File file) {
+        byte[] buffer;
+        try (FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
+            byte[] b = new byte[1024];
+            int n;
+            while ((n = fis.read(b)) != -1) {
+                bos.write(b, 0, n);
+            }
+            buffer = bos.toByteArray();
+            return buffer;
+        } catch (IOException ignored) {
+            throw new SystemException("文件转换异常");
+        }
+    }
+}

+ 69 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/component/InsImagesUploadCacheComponent.java

@@ -0,0 +1,69 @@
+package com.jzg.quote.huatai.api.component;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.quotation.commons.entity.vo.image.InsuranceImageVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 保险公司影像上传缓存组件
+ * @author: wenks
+ * @date: 2023/12/4 14:08
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class InsImagesUploadCacheComponent {
+
+    private final StringRedisTemplate redisTemplate;
+
+    private static final String IMAGE = "ins:images:";
+
+    private static final long IMAGE_TIME = 30L;
+
+
+    public JSONObject isUploadImage(String companyId) {
+        String key = IMAGE + companyId;
+        String value = redisTemplate.opsForValue().get(key);
+        JSONObject jsonObject = JSON.parseObject(value);
+        if (ObjectUtils.isEmpty(jsonObject)) {
+            return new JSONObject();
+        }
+        return JSON.parseObject(value);
+    }
+
+    public void setUploadImageCache(String companyId, Map<String, List<InsuranceImageVo.ImageDTO>> map) {
+        try {
+            JSONObject uploadImage = isUploadImage(companyId);
+            if (!ObjectUtils.isEmpty(uploadImage)) {
+                uploadImage.putAll(map);
+            }
+
+            String key = IMAGE + companyId;
+            String s = JSON.toJSONString(map);
+            redisTemplate.opsForValue().set(key, s, IMAGE_TIME, TimeUnit.MINUTES);
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+    public void setUploadImageCache(String companyId, List<InsuranceImageVo> imageVoList) {
+        try {
+            Map<String, List<InsuranceImageVo.ImageDTO>> collect = imageVoList.stream().collect(Collectors.toMap(InsuranceImageVo::getImageCode,
+                    InsuranceImageVo::getImageBase64List));
+            setUploadImageCache(companyId, collect);
+        } catch (Exception e) {
+            log.info(e.getMessage());
+        }
+    }
+
+}

+ 71 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/HuaTaiBaseCode.java

@@ -0,0 +1,71 @@
+package com.jzg.quote.huatai.api.constant;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 18:28
+ **/
+public class HuaTaiBaseCode {
+
+    protected static final Map<String, String> SaPromoteId = new HashMap<>();
+
+    static {
+        SaPromoteId.put("2111000023", "01直销渠道");
+        SaPromoteId.put("2200000001", "04渠道");
+        SaPromoteId.put("2111000022", "09渠道");
+        SaPromoteId.put("2008000009", "通融折扣0.65");
+        SaPromoteId.put("2008000010", "通融折扣0.75");
+        SaPromoteId.put("2008000011", "通融折扣0.85");
+        SaPromoteId.put("2008000012", "通融折扣1.0");
+        SaPromoteId.put("2008000008", "综改折扣下浮15%");
+    }
+
+    /**
+     * 活动
+     * @return
+     */
+    public static Map<String, String> getSaPromoteId() {
+        return SaPromoteId;
+    }
+
+
+
+    protected static final List<String> Occupation = new ArrayList<>();
+    static {
+        Occupation.add("10000");//党的机关国家机关群众团体和社会组织企事业单位负责人
+        Occupation.add("20000");//专业技术人员
+        Occupation.add("20100");//科学研究人员
+        Occupation.add("20200");//工程技术人员
+        Occupation.add("20300");//农业技术人员
+        Occupation.add("20400");//飞机和船舶技术人员
+        Occupation.add("20500");//卫生专业技术人员
+        Occupation.add("20600");//经济和金融专业人员
+        Occupation.add("20800");//教学人员
+        Occupation.add("40000");//社会生产服务和生活服务人员
+        Occupation.add("40400");//信息运输软件和信息技术服务人员
+        Occupation.add("40500");//金融服务人员
+        Occupation.add("40600");//房地产服务人员
+        Occupation.add("40700");//租赁和商务服务人员
+        Occupation.add("40800");//技术辅助服务人员
+        Occupation.add("40900");//水利环境和公共设施管理服务人员
+        Occupation.add("41000");//居民服务人员
+        Occupation.add("41100");//电力燃气及水供应服务人员
+        Occupation.add("50000");//农林牧渔业生产及辅助人员
+        Occupation.add("60000");//生产制造及有关人员
+        Occupation.add("70000");//军人
+        Occupation.add("80000");//不便分类的其他从业人员
+    }
+
+    /**
+     * 职业
+     */
+    public static List<String> getOccupation() {
+        return Occupation;
+    }
+
+}

+ 43 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/HuaTaiTransCode.java

@@ -0,0 +1,43 @@
+package com.jzg.quote.huatai.api.constant;
+
+/**
+ * @description: 华泰财险API交互代码
+ * @author: shenwd
+ * @date: 2025/3/10 11:25
+ **/
+public class HuaTaiTransCode {
+
+    private HuaTaiTransCode() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    //车型查询
+    public static final String MODELS_QUERY = "ModelsQuery";
+
+    //实际价值
+    public static final String ACTUAL_VALUE = "ActualValue";
+
+    //报价
+    public static final String QUOTE_PRICE = "QuotedPrice";
+
+    //转投保
+    public static final String SAVE = "Save";
+
+    // 缴费注销
+    public static final String ORDER_CANCEL = "OrderCancel";
+
+    //提交核保
+    public static final String SUBMIT = "submit";
+
+    //见费出单结果查询接口
+    public static final String ORDER_CONFIRM = "OrderConfirm";
+
+    public static final String UPLOAD_IMAGE = "UploadImage";
+
+    //非电子投保单缴费申请接口
+    public static final String VERIFICATIONCODESEND = "VERIFICATIONCODESEND";
+
+    //电子保单下载
+    public static final String ELEC_DOWN = "ElecDown";
+
+}

+ 17 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/TimeConstants.java

@@ -0,0 +1,17 @@
+package com.jzg.quote.huatai.api.constant;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 11:23
+ **/
+public class TimeConstants {
+
+    private TimeConstants() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    public static final String START_TIME = "00:00:00";
+
+    public static final String END_TIME = "23:59:59";
+}

+ 72 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/ContractEnum.java

@@ -0,0 +1,72 @@
+package com.jzg.quote.huatai.api.constant.enums;
+
+import lombok.Getter;
+
+/**
+ * @description: 华泰险种编码
+ * @author: shenwd
+ * @date: 2025/3/10 14:37
+ **/
+@Getter
+public enum ContractEnum {
+    C_BZ("BZ", "机动车交通事故责任强制险"),
+    C_01("01", "机动车损失保险"),
+    C_02("02", "机动车第三者责任保险"),
+    C_041("041", "机动车车上人员责任保险(司机)"),
+    C_044("044", "机动车车上人员责任保险(乘客)"),
+    C_52("52", "附加车轮单独损失险"),
+    C_14("14", "附加新增加设备损失险"),
+    C_21("21", "附加车身划痕损失险"),
+    C_26("26", "附加修理期间费用补偿险"),
+    C_51("51", "附加发动机进水损坏除外特约条款"),
+    C_08("08", "附加车上货物责任险"),
+    C_2702("2702", "附加精神损害抚慰金责任险(三者)"),
+    C_2741("2741", "附加精神损害抚慰金责任险(司机)"),
+    C_2744("2744", "附加精神损害抚慰金责任险(乘客)"),
+    C_49("49", "附加法定节假日限额翻倍险"),
+    C_5302("5302", "附加医保外用药责任险(三者)"),
+    C_5341("5341", "附加医保外用药责任险(司机)"),
+    C_5344("5344", "附加医保外用药责任险(乘客)"),
+    C_54("54", "附加机动车增值服务特约条款(救援)"),
+    C_55("55", "附加机动车增值服务特约条款(检测)"),
+    C_56("56", "附加机动车增值服务特约条款(代驾)"),
+    C_57("57", "附加机动车增值服务特约条款(送检)"),
+    C_501("501", "附加绝对免赔率特约条款(车损)"),
+    C_502("502", "附加绝对免赔率特约条款(三者)"),
+    C_5041("5041", "附加绝对免赔率特约条款(司机)"),
+    C_5044("5044", "附加绝对免赔率特约条款(乘客)"),
+    H_BZ("BZ", "机动车交通事故责任强制保险"),
+    H_A("A", "机动车损失保险"),
+    H_B("B", "机动车第三者责任险"),
+    H_D11("D11", "机动车车上人员责任险(司机)"),
+    H_D12("D12", "机动车车上人员责任险(乘客)"),
+    H_L("L", "附加车身划痕损失险"),
+    H_X("X", "附加新增加设备损失险"),
+    H_C("C", "附加修理期间费用补偿险"),
+    H_N("N", "附加发动机进水损坏除外特约条款"),
+    H_BD("BD", "附加法定节假日限额翻倍险"),
+    H_MT("MT", "附加车轮单独损失险"),
+    H_RB("RB", "附加精神损害抚慰金责任险(三者)"),
+    H_RD11("RD11", "附加精神损害抚慰金责任险(司机)"),
+    H_RD12("RD12", "附加精神损害抚慰金责任险(乘客)"),
+    H_PB("PB", "附加医保外用药责任险(三者)"),
+    H_PD11("PD11", "附加医保外用药责任险(司机)"),
+    H_PD12("PD12", "附加医保外用药责任险(乘客)"),
+    H_SR("SR", "附加机动车道路救援服务特约条款"),
+    H_SD("SD", "附加机动车代为驾驶服务特约条款"),
+    H_MMA("MMA", "附加绝对免赔率特约条款(车损)"),
+    H_MMB("MMB", "附加绝对免赔率特约条款(三者)"),
+    H_MMD11("MMD11", "附加绝对免赔率特约条款(车上人员-驾驶员)"),
+    H_MMD12("MMD12", "附加绝对免赔率特约条款(车上人员-乘客)");
+
+    ContractEnum(String kindCode, String kindName) {
+        this.kindCode = kindCode;
+        this.kindName = kindName;
+    }
+
+    // 险别代码
+    private final String kindCode;
+    // 险别名称
+    private final String kindName;
+
+}

+ 24 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/HuaTaiRiskCode.java

@@ -0,0 +1,24 @@
+package com.jzg.quote.huatai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 华泰财险 险种代码
+ * @author: shenwd
+ * @date: 2025/3/11 11:59
+ **/
+@Getter
+@AllArgsConstructor
+public enum HuaTaiRiskCode {
+
+    R_1002("1002", "交强险(08版)"),
+    R_1251("1251", "机动车商业保险示范条款(2020版)"),
+    R_1252("1252", "特种车商业保险示范条款(2020版)"),
+    R_1253("1253", "摩托车、拖拉机商业保险示范条款(2020版)"),
+    R_1255("1255", "新能源汽车商业保险示范条款(试行)");
+
+    private final String code;
+
+    private final String name;
+}

+ 61 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/ImageTypeCode.java

@@ -0,0 +1,61 @@
+package com.jzg.quote.huatai.api.constant.enums;
+
+import com.jzg.quotation.commons.constant.enums.base.InsuranceImageEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 华泰财险图片类型
+ * @author: shenwd
+ * @date: 2025/3/12 09:55
+ **/
+@Getter
+@AllArgsConstructor
+public enum ImageTypeCode {
+
+    I_5001("5001", "验车照片", new String[]{}),
+    I_5002("5002", "验车单", new String[]{}),
+    I_5999("5999", "其它", new String[]{}),
+    I_5003("5003", "自助验车照片", new String[]{}),
+    I_4001("4001", "投保单", new String[]{}),
+    I_4002("4002", "上年保险凭证", new String[]{}),
+    I_4003("4003", "完税/免税/减税凭证", new String[]{}),
+    I_4004("4004", "费率浮动告知书", new String[]{}),
+    I_4005("4005", "异地车在本地使用证明", new String[]{}),
+    I_4444("4444", "双录资料", new String[]{}),
+    I_4999("4999", "其它", new String[]{}),
+    I_2001("2001", "身份证", new String[]{}),
+    I_2007("2007", "投保人身份证", new String[]{
+            InsuranceImageEnum.C03.getCode(),
+            InsuranceImageEnum.D03.getCode(),
+    }),
+    I_2008("2008", "被保险人身份证", new String[]{
+            InsuranceImageEnum.C04.getCode(),
+            InsuranceImageEnum.D04.getCode(),
+    }),
+    I_2009("2009", "车主身份证", new String[]{
+            InsuranceImageEnum.C02.getCode(),
+            InsuranceImageEnum.D02.getCode(),
+    }),
+    I_1001("1001", "组织机构代码证", new String[]{}),
+    I_1999("1999", "其他", new String[]{}),
+    I_3001("3001", "行驶证", new String[]{
+            InsuranceImageEnum.C01.getCode(),
+            InsuranceImageEnum.D01.getCode(),
+    }),
+    I_3002("3002", "购车发票/二手车交易发票", new String[]{
+            InsuranceImageEnum.GC00.getCode(),
+    }),
+    I_3003("3003", "出厂合格证", new String[]{}),
+    I_3004("3004", "机动车辆登记证书", new String[]{}),
+    I_3005("3005", "道路运输许可证", new String[]{}),
+    I_3999("3999", "其它", new String[]{}),
+    I_3006("3006", "新能源充电桩", new String[]{});
+
+    private final String code;
+
+    private final String name;
+
+    private final String[] imagesType;
+
+}

+ 26 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/MotorTypeCode.java

@@ -0,0 +1,26 @@
+package com.jzg.quote.huatai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 华泰财险 1.16.车辆种类
+ * @author: shenwd
+ * @date: 2025/3/10 11:34
+ **/
+@Getter
+@AllArgsConstructor
+public enum MotorTypeCode {
+
+    MTC_A0("A0", "客车"),
+    MTC_G0("G0", "挂车"),
+    MTC_A1("H0", "货车"),
+    MTC_H1("H1", "低速载货汽车");
+
+    private final String code;
+
+    private final String desc;
+
+    public static final String TITLE = "MTC_";
+
+}

+ 30 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/constant/enums/MotorUsageTypeCode.java

@@ -0,0 +1,30 @@
+package com.jzg.quote.huatai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 华泰财险 1.17.使用性质
+ * @author: shenwd
+ * @date: 2025/3/10 11:32
+ **/
+@Getter
+@AllArgsConstructor
+public enum MotorUsageTypeCode {
+
+    MUTC_05( "8A", "家庭自用"),
+    MUTC_07( "8B", "非营业企业"),
+    MUTC_06( "8C", "非营业党政机关,事业团体"),
+    MUTC_01( "9A", "营业出租租赁"),
+    MUTC_02( "9B", "营业城市公交"),
+    MUTC_03( "9C", "营业公路客运"),
+    MUTC_08( "8D", "非营业货运"),
+    MUTC_04( "9D", "营业货运");
+
+    private final String code;
+
+    private final String desc;
+
+    public static final String TITLE = "MUTC_";
+
+}

+ 79 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiApiOrder.java

@@ -0,0 +1,79 @@
+package com.jzg.quote.huatai.api.entity;
+
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @description: 华泰财险 操作mongodb数据库
+ * @author: shenwd
+ * @date: 2025/3/11 10:06
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Document("huatai.api.order")
+public class HuaTaiApiOrder {
+    @Id
+    private String id;
+
+    /**
+     * 交互唯一订单 OrderBase类的ordersNo
+     */
+    private String ordersNo;
+
+    /**
+     * 华泰财险 交强险平台查询码
+     */
+    private String JqQuerySequenceNo;
+
+    /**
+     * 华泰财险 商业险平台查询码
+     */
+    private String SyQuerySequenceNo;
+
+    /**
+     * 华泰财险 交强险投保单号
+     */
+    private String JqApplyNo;
+
+    /**
+     * 华泰财险 商业险投保单号
+     */
+    private String SyApplyNo;
+
+    /**
+     * 华泰财险 交强险保费
+     */
+    private String JqPremium;
+
+    /**
+     * 华泰财险 商业险保费
+     */
+    private String SyPremium;
+
+    /**
+     * 车主
+     */
+    private CustomerInfoVo ownersInfo;
+    /**
+     * 投保人
+     */
+    private CustomerInfoVo policyHolderInfo;
+    /**
+     * 被保人
+     */
+    private CustomerInfoVo insuredPersonInfo;
+    /**
+     * 交强险 险种信息
+     */
+    private RiskInfoVo ciRiskInfoVo;
+    /**
+     * 商业险 险种信息
+     */
+    private RiskInfoVo biRiskInfoVo;
+}

+ 46 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBaseRequestHead.java

@@ -0,0 +1,46 @@
+package com.jzg.quote.huatai.api.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 09:53
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HuaTaiBaseRequestHead extends HuaTaiBastHead {
+    @Serial
+    private static final long serialVersionUID = 3060560505993610758L;
+
+    //出单工具
+    private String source;
+    //出单机构
+    private String comCode;
+    //出单代理人
+    private String agentCode;
+    //业务员代码
+    private String userCode;
+    //代理人协议代码
+    private String agreementNo;
+    //操作人员代码
+    private String operatorCode;
+    //中介机构销售人员 江苏、山东、广东第三方出单时必传
+    private String saUserCode;
+    //中介机构销售人员执业证书号 江苏、山东、广东第三方出单时必传
+    private String saUserProNo;
+
+    public HuaTaiBaseRequestHead(HuaTaiConfigureParameters huaTaiConfigureParameters) {
+        this.source = huaTaiConfigureParameters.getSource();
+        this.comCode = huaTaiConfigureParameters.getComCode();
+        this.agentCode =huaTaiConfigureParameters.getAgentCode();
+        this.userCode = huaTaiConfigureParameters.getUserCode();
+        this.agreementNo = huaTaiConfigureParameters.getAgreementNo();
+        this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+        super.setTransType("Req");
+    }
+
+}

+ 22 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBaseResponseHead.java

@@ -0,0 +1,22 @@
+package com.jzg.quote.huatai.api.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 09:58
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HuaTaiBaseResponseHead  extends HuaTaiBastHead {
+    @Serial
+    private static final long serialVersionUID = 7745408616805612421L;
+
+    private String returnCode;
+    private String returnMessage;
+
+}

+ 29 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiBastHead.java

@@ -0,0 +1,29 @@
+package com.jzg.quote.huatai.api.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 09:53
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HuaTaiBastHead implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2370758939804095461L;
+
+    //接口代码
+    private String transCode;
+    //请求类型
+    private String transType;
+    //第三方订单号
+    private String token;
+
+}

+ 58 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/HuaTaiConfigureParameters.java

@@ -0,0 +1,58 @@
+package com.jzg.quote.huatai.api.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+
+/**
+ * @description: 华泰api 配置
+ * @author: shenwd
+ * @date: 2025/3/10 09:34
+ **/
+@Data
+public class HuaTaiConfigureParameters implements ConfigureParameters {
+
+
+    /**
+     * 合作方代码,由华泰分配
+     */
+    private String insuredCode;
+    /**
+     * 出单机构
+     */
+    private String comCode;
+
+    /**
+     * 出单代理人
+     */
+    private String agentCode;
+    /**
+     * 业务员代码
+     */
+    private String userCode;
+    /**
+     * 代理人协议代码
+     */
+    private String agreementNo;
+    /**
+     * 操作人员代码
+     */
+    private String operatorCode;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 县
+     */
+    private String district;
+
+    /**
+     * 出单工具
+     */
+    private String source;
+
+}

+ 75 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiActualValueRequest.java

@@ -0,0 +1,75 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.constant.TimeConstants;
+import com.jzg.quote.huatai.api.constant.enums.MotorTypeCode;
+import com.jzg.quote.huatai.api.constant.enums.MotorUsageTypeCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiModelsQueryResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * @description: 实际价值计算接口请求
+ * @author: shenwd
+ * @date: 2025/3/10 11:30
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HuaTaiActualValueRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -5461692205826756153L;
+
+    //Y	机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+    //Y	系统车型编码(3.1接口返回)
+    @JsonProperty("localModelCode")
+    private String localModelCode;
+    //Y	起保日期(格式:YYYY-MM-DD HH24:MI:SS)
+    @JsonProperty("validDate")
+    private String validDate;
+    //Y	初登日期(格式:YYYY-MM-DD HH24:MI:SS)
+    @JsonProperty("registerDate")
+    private String registerDate;
+    //Y	新车购置价(3.1接口返回)
+    @JsonProperty("purchasePrice")
+    private double purchasePrice;
+    //Y	座位数(3.1接口返回)
+    @JsonProperty("approvedPassengersCapacity")
+    private Integer approvedPassengersCapacity;
+    //Y	参见使用性质代码
+    @JsonProperty("motorUsageTypeCode")
+    private String motorUsageTypeCode;
+    //Y	参见车辆种类代码
+    @JsonProperty("motorTypeCode")
+    private String motorTypeCode;
+
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.ACTUAL_VALUE);
+    }
+
+    public HuaTaiActualValueRequest(CarInfoVo carInfoVo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto,
+                                    String startDate, String loginCom) {
+        this.loginCom = loginCom;
+        this.localModelCode = fullCarDataDto.getLocalModelCode();
+        this.validDate = startDate;
+        this.registerDate = carInfoVo.getRegisterDate() + " " + TimeConstants.START_TIME;
+        this.purchasePrice = Double.parseDouble(fullCarDataDto.getPurchasePrice());
+        this.approvedPassengersCapacity = fullCarDataDto.getApprovedPassengersCapacity();
+
+        MotorUsageTypeCode usageTypeCode = Enum.valueOf(MotorUsageTypeCode.class, MotorUsageTypeCode.TITLE + carInfoVo.getVehicleUseCode());
+        this.motorUsageTypeCode = usageTypeCode.getCode();
+
+        MotorTypeCode motorTypeCode1 = Enum.valueOf(MotorTypeCode.class,MotorTypeCode.TITLE + carInfoVo.getCarKindCode());
+        this.motorTypeCode = motorTypeCode1.getCode();
+    }
+}

+ 23 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiBaseRequest.java

@@ -0,0 +1,23 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 09:51
+ **/
+@Data
+public abstract class HuaTaiBaseRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -3146705327462332761L;
+    @JsonProperty(value = "head")
+    private HuaTaiBaseRequestHead head;
+
+}

+ 29 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiEncryptReq.java

@@ -0,0 +1,29 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 10:29
+ **/
+@Data
+public class HuaTaiEncryptReq {
+
+    //合作方代码,由华泰分配
+    @JsonProperty(value = "insuredCode")
+    private String insuredCode;
+
+    //系统来源代码,由华泰分配
+    @JsonProperty(value = "sourceCode")
+    private String sourceCode;
+
+    //业务数据加密串
+    @JsonProperty(value = "busiContent")
+    private String busiContent;
+
+    //请求令牌
+    @JsonProperty(value = "accessToken")
+    private String accessToken;
+}

+ 35 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiInsurancePolicyPrintRequest.java

@@ -0,0 +1,35 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:21
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiInsurancePolicyPrintRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 1481883255125093399L;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.ELEC_DOWN);
+    }
+
+    //保单号
+    @JsonProperty("businessNo")
+    private String businessNo;
+
+}

+ 80 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiModelsQueryRequest.java

@@ -0,0 +1,80 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.constant.TimeConstants;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description: 车型查询
+ * @author: shenwd
+ * @date: 2025/3/10 11:13
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HuaTaiModelsQueryRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -3087539588919555217L;
+
+    //Y	参见险种代码
+    @JsonProperty("riskCode")
+    private String riskCode;
+    //Y	机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+    //CY	代理人代码(上海第三方出单时必传)
+    @JsonProperty("agentCode")
+    private String agentCode;
+    //CY	车牌号码(已上牌车辆必传)
+    @JsonProperty("plateNo")
+    private String plateNo;
+    //Y	车架号
+    @JsonProperty("vIN")
+    private String vIN;
+    //CY	发动机号(如车牌号已传,则可传空;如车牌号未传,则必传)
+    @JsonProperty("engineNo")
+    private String engineNo;
+    //CY	厂牌名称(非续保查询必传)
+    @JsonProperty("brand")
+    private String brand;
+    //CY	初登日期(格式:YYYY-MM-DD HH24:MI:SS)
+    @JsonProperty("registerDate")
+    private String registerDate;
+    //CY	座位数(上海第三方出单时必传)
+    @JsonProperty("approvedPassengersCapacity")
+    private String approvedPassengersCapacity;
+    //CY	行业车型编码(平台返回精准服务提示信息后,依据平台返回信息重新查车时必传)
+    @JsonProperty("vehicleCode")
+    private List<String> vehicleCode;
+    //CY	精友车型编码
+    @JsonProperty("modelCode")
+    private String modelCode;
+    //Y	页码
+    @JsonProperty("pageNo")
+    private Integer pageNo = 1;
+    //Y	每页行数
+    @JsonProperty("rows")
+    private Integer rows = 50;
+
+    public HuaTaiModelsQueryRequest(CarInfoVo carInfo){
+        this.vIN = carInfo.getVinNo();
+        this.plateNo = carInfo.getLicenseNo();
+        this.registerDate = carInfo.getRegisterDate()+ " " + TimeConstants.START_TIME;
+        this.brand = carInfo.getBrandName();
+        this.riskCode = "1002";
+    }
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.MODELS_QUERY);
+    }
+
+}

+ 64 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiOrderStatusRequest.java

@@ -0,0 +1,64 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serial;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:08
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiOrderStatusRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 7157156061741251262L;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.ORDER_CONFIRM);
+    }
+
+    //支付交易号
+    @JsonProperty("poaCode")
+    private String poaCode;
+
+    //操作员代码
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+
+    //机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+
+    //报价单号(列表)
+    @JsonProperty("contractNo")
+    private List<String> contractNo;
+
+    public HuaTaiOrderStatusRequest (HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters){
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+        this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+        this. contractNo = new ArrayList<>();
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo())){
+            this.contractNo.add(huaTaiApiOrder.getJqApplyNo());
+        }
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())){
+            this.contractNo.add(huaTaiApiOrder.getSyApplyNo());
+        }
+    }
+
+}

+ 50 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiPaymentLogoutRequest.java

@@ -0,0 +1,50 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:13
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@NoArgsConstructor
+public class HuaTaiPaymentLogoutRequest  extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 133128178948557487L;
+
+    //操作员代码
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+
+    //机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+
+    //支付交易号
+    @JsonProperty("poaCode")
+    private String poaCode;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.ORDER_CANCEL);
+    }
+
+    public HuaTaiPaymentLogoutRequest(String poaCode, HuaTaiConfigureParameters huaTaiConfigureParameters) {
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+        this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+        this.poaCode = poaCode;
+    }
+
+}

+ 69 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiPaymentUrlRequest.java

@@ -0,0 +1,69 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serial;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:15
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiPaymentUrlRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -4916944769912995581L;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.VERIFICATIONCODESEND);
+    }
+
+    //操作员代码
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+
+    //机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+
+    //报价单号(列表)
+    @JsonProperty("contractNo")
+    private List<String> contractNo;
+
+    //请求类型(1-电子投保单确认及缴费短信、北京平台电子投保单短信)(确认传值规则)
+    @JsonProperty("flag")
+    private String flag;
+
+    //是否发送短信,1-是,0-否,当等于0时会返回电子投保单链接(当为北京电子投保单短信时该短信由平台发送,所以必传1)
+    @JsonProperty("sendMessageFlag")
+    private String sendMessageFlag;
+
+    public HuaTaiPaymentUrlRequest (HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters){
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+        this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+        this.flag = "1";
+        this. contractNo = new ArrayList<>();
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo())){
+            this.contractNo.add(huaTaiApiOrder.getJqApplyNo());
+        }
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())){
+            this.contractNo.add(huaTaiApiOrder.getSyApplyNo());
+        }
+        this. sendMessageFlag = "0";
+    }
+}

+ 812 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiQuotedPriceRequest.java

@@ -0,0 +1,812 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.jzg.commons.constants.InsuranceRisk;
+import com.jzg.quotation.commons.constant.InsuranceTypeCorrespondence;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.*;
+import com.jzg.quote.huatai.api.constant.HuaTaiBaseCode;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.constant.TimeConstants;
+import com.jzg.quote.huatai.api.constant.enums.ContractEnum;
+import com.jzg.quote.huatai.api.constant.enums.MotorTypeCode;
+import com.jzg.quote.huatai.api.constant.enums.MotorUsageTypeCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiActualValueResponse;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiModelsQueryResponse;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 11:37
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiQuotedPriceRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -7598037304369799704L;
+
+    //Y	投保单信息
+    @JSONField(name = "businessData")
+    private BusinessDataDto businessData;
+
+    public HuaTaiQuotedPriceRequest(QuoteVo quoteVo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto,
+                                    HuaTaiActualValueResponse actualValueResponse, AccidentalDrivingVo accidentalDrivingVo,
+                                    HuaTaiConfigureParameters huaTaiConfigureParameters) {
+        this.businessData = new BusinessDataDto(quoteVo, fullCarDataDto, actualValueResponse, accidentalDrivingVo,
+                huaTaiConfigureParameters);
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+    }
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.QUOTE_PRICE);
+    }
+
+    //Y	机构代码
+    @JSONField(name = "loginCom")
+    private String loginCom;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class BusinessDataDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -7919877849492707702L;
+
+        //Y	投保主信息
+        @JSONField(name = "businessMain")
+        private BusinessMainDto businessMain;
+        //Y	业务信息(列表)
+        @JSONField(name = "contract")
+        private List<ContractDto> contract;
+        //Y	客户信息(列表)
+        @JSONField(name = "customer")
+        private List<CustomerDto> customer;
+        //Y	投保车辆信息
+        @JSONField(name = "insuredObject")
+        private InsuredObjectDto insuredObject;
+        //Y	销售信息
+        @JSONField(name = "saleInfo")
+        private SaleInfoDto saleInfo;
+
+        public BusinessDataDto(QuoteVo quoteVo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto,
+                               HuaTaiActualValueResponse actualValueResponse, AccidentalDrivingVo accidentalDrivingVo,
+                               HuaTaiConfigureParameters huaTaiConfigureParameters) {
+            CarInfoVo carInfo = quoteVo.getCarInfoVo();
+            List<KindInfoVo> kindList = quoteVo.getKindInfoVo();
+            VehicleAndVesselTaxVo vesselTax = quoteVo.getVehicleAndVesselTax();
+            CustomerInfoVo ownerInfo = quoteVo.getOwnersInfo();
+            CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+            CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+            int i = Integer.parseInt(carInfo.getSeatCount());
+            // 保单归属地
+            this.businessMain = new BusinessMainDto(huaTaiConfigureParameters);
+            // 车辆信息
+            this.insuredObject = new InsuredObjectDto(carInfo, fullCarDataDto);
+            // 保险信息
+            this.contract = new ContractDto().getContract(quoteVo, kindList, i - 1, vesselTax, actualValueResponse,
+                    huaTaiConfigureParameters, fullCarDataDto);
+            // 客户信息
+            this.customer = new CustomerDto().getCustomers(ownerInfo, policyHolderInfo, insuredPersonInfo);
+            //销售信息
+            this.saleInfo = new SaleInfoDto(huaTaiConfigureParameters);
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessMainDto implements Serializable {
+            private static final long serialVersionUID = 2471155101522896774L;
+            //Y	操作机构代码
+            @JSONField(name = "makeCom")
+            private String makeCom;
+            //Y	操作员代码
+            @JSONField(name = "operatorCode")
+            private String operatorCode;
+            //Y	投保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "operateDate")
+            private String operateDate;
+            //CY	出单计算机IP地址(北京出单机构必传)
+            @JSONField(name = "computerIp")
+            private String computerIp;
+
+            public BusinessMainDto(HuaTaiConfigureParameters huaTaiConfigureParameters) {
+                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                this.makeCom = huaTaiConfigureParameters.getComCode();
+                this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+                this.operateDate = df.format(new Date());
+            }
+
+            public void setOperate() {
+                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                this.operateDate = df.format(new Date());
+            }
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class InsuredObjectDto implements Serializable {
+            private static final long serialVersionUID = 8289493908102574837L;
+            //Y	保险采集和管理车信息
+            @JSONField(name = "policyCar")
+            private PolicyCarDto policyCar;
+            //Y	简化版精友信息
+            @JSONField(name = "simpleStadarCar")
+            private SimpleStadarCarDto simpleStadarCar;
+
+            @JSONField(name = "platformCar")
+            private PlatformCarDto platformCar;
+
+
+            public InsuredObjectDto(CarInfoVo carInfo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto) {
+                this.policyCar = new PolicyCarDto(carInfo, fullCarDataDto);
+                this.simpleStadarCar = new SimpleStadarCarDto(carInfo, fullCarDataDto);
+                this.platformCar = new PlatformCarDto();
+            }
+
+            @AllArgsConstructor
+            @Data
+            public static class PlatformCarDto implements Serializable {
+
+                private static final long serialVersionUID = -7496687235740494863L;
+
+                @JSONField(name = "searchSequenceNo")
+                private String searchSequenceNo;
+
+                public PlatformCarDto() {
+                    this.searchSequenceNo = "";
+                }
+
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class PolicyCarDto implements Serializable {
+                private static final long serialVersionUID = -435073301215297662L;
+                //CY	座位数
+                @JSONField(name = "approvedPassengersCapacity")
+                private int approvedPassengersCapacity;
+                //Y	排量(单位:升)
+                @JSONField(name = "displacement")
+                private double displacement;
+                //Y	车牌号
+                @JSONField(name = "plateNo")
+                private String plateNo;
+                //Y	初次登记日期(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "registerDate")
+                private String registerDate;
+                //Y	行驶证发证日期(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "issueDate")
+                private String issueDate;
+                //Y	新车购置价
+                @JSONField(name = "purchasePrice")
+                private String purchasePrice;
+                //Y	港澳车标志(false-非港澳车;true-是港澳车)
+                @JSONField(name = "hKFlag")
+                private boolean hKFlag;
+                //Y	发动机号
+                @JSONField(name = "engine")
+                private String engine;
+                //Y	外地车标志(false-本地车;true-外地车)
+                @JSONField(name = "ecdemicVehicleFlag")
+                private boolean ecdemicVehicleFlag;
+                //Y	商业险过户车标志(0-非过户车;1-过户重新投保)
+                @JSONField(name = "chgOwnerFlag")
+                private String chgOwnerFlag;
+                //Y	交强险过户车标志(1-过户重新投保,非过户车传空即可)
+                @JSONField(name = "specialCarFlag")
+                private String specialCarFlag;
+                //CY	过户日期(过户车必传)(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "transferDate")
+                private String transferDate;
+                //Y	车架号
+                @JSONField(name = "vIN")
+                private String vin;
+                //Y	是否贷款购车标志(0-非贷款车;1-是贷款车)
+                @JSONField(name = "loanStatus")
+                private String loanStatus;
+                //Y	厂牌型号
+                @JSONField(name = "modelName")
+                private String modelName;
+                //CY	整备质量
+                @JSONField(name = "UnladenMass")
+                private String unladenMass;
+                //Y	能源种类
+                @JSONField(name = "FullType")
+                private String FullType;
+                //CY	车辆来历凭证种类(新车,北京上海机构出单必录)
+                @JSONField(name = "CertificateType")
+                private String CertificateType;
+                //CY	车辆来历凭证编号(新车,北京机构出单必录)
+                @JSONField(name = "CertificateNo")
+                private String CertificateNo;
+                //CY	车辆来历凭证所载日期(新车,北京机构出单必录)(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "CertificateDate")
+                private String CertificateDate;
+                //CY	参见车辆种类代码
+                @JSONField(name = "MotorTypeCode")
+                private String motorTypeCode;
+                //CY	参见使用性质代码
+                @JSONField(name = "MotorUsageTypeCode")
+                private String motorUsageTypeCode;
+                //CY	参见号牌种类代码
+                @JSONField(name = "PlateType")
+                private String plateType;
+                //CY	功率(纯电摩托车必录)
+                @JSONField(name = "Power")
+                private String Power;
+                //CY	最高设计车速(摩托车必录)
+                @JSONField(name = "MaximumSpeed")
+                private String MaximumSpeed;
+                //CY	参见所属性质代码
+                @JSONField(name = "Property")
+                private String property;
+                //CY	新车销售公司名称(广东机构新车出单必录)
+                @JSONField(name = "NewCarSalesCompanyName")
+                private String NewCarSalesCompanyName;
+                //CY	销售公司所在省(广东机构出单新车必录)
+                @JSONField(name = "NewCarSalesProvince")
+                private String NewCarSalesProvince;
+                //CY	销售公司所在市(广东机构出单新车必录)
+                @JSONField(name = "NewCarSalesCity")
+                private String NewCarSalesCity;
+                //CY	销售公司所在区(广东机构出单新车必录)
+                @JSONField(name = "NewCarSalesDistrict")
+                private String NewCarSalesDistrict;
+                //CY	是否4S店销售(广东机构出单新车必录)
+                @JSONField(name = "IsFourSShop")
+                private String IsFourSShop;
+                //CY	购车发票日期(上海机构出单必录)(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "InvoiceDate")
+                private Date InvoiceDate;
+                //CY	参见车身颜色代码
+                @JSONField(name = "ColorCode")
+                private String colorCode;
+                //CY	验车状态代码(1-未验车;2-免验车;4-已验车)
+                @JSONField(name = "CarCheckStatus")
+                private String carCheckStatus;
+                //CY	验车人(已验车必录)
+                @JSONField(name = "CarChecker")
+                private String carChecker;
+                //CY	验车时间(已验车必录)(格式:YYYY-MM-DD HH24:MI:SS)
+                @JSONField(name = "CarCheckTime")
+                private String carCheckTime;
+                //CY	验车记录(已验车必录)
+                @JSONField(name = "CarCheckRecord")
+                private String carCheckRecord;
+                //CY	车况(0-好;1-中;2-差)
+                @JSONField(name = "VehicleCondition")
+                private String vehicleCondition;
+                //Y	参见交管车辆类型代码
+                @JSONField(name = "VehicleType")
+                private String vehicleType;
+                //CY	行驶证车型
+                @JSONField(name = "RegistModelCode")
+                private String registModelCode;
+                //CY	参见号牌底色代码
+                @JSONField(name = "PlateColorCode")
+                private String plateColorCode;
+
+                public PolicyCarDto(CarInfoVo carInfoVo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto) {
+                    this.approvedPassengersCapacity = Integer.parseInt(carInfoVo.getSeatCount());
+                    if (fullCarDataDto.getDisplacement() != 0) {
+                        this.displacement = fullCarDataDto.getDisplacement();
+                    } else {
+                        this.displacement = Double.parseDouble(carInfoVo.getDisplacement());
+                    }
+//                    this.displacement = fullCarDataDto.getDisplacement();
+                    this.plateNo = carInfoVo.getLicenseNo();
+                    this.registerDate = carInfoVo.getRegisterDate() + " " + TimeConstants.START_TIME;
+                    this.issueDate = carInfoVo.getIssueDate() + " " + TimeConstants.START_TIME;
+                    this.purchasePrice = String.valueOf(fullCarDataDto.getPurchasePrice());
+                    this.hKFlag = false;
+                    this.engine = carInfoVo.getEngineNo();
+                    this.ecdemicVehicleFlag = false;
+                    if (carInfoVo.isTransfer()) {
+                        this.specialCarFlag = "1";
+                        this.transferDate = carInfoVo.getTransferDate() + " " + TimeConstants.START_TIME;
+                    } else {
+                        this.specialCarFlag = "";
+                    }
+                    this.Power = carInfoVo.getPowerScale();
+                    if (carInfoVo.isTransfer()) {
+                        this.chgOwnerFlag = "1";
+                        this.transferDate = carInfoVo.getTransferDate() + " " + TimeConstants.START_TIME;
+                    } else {
+                        this.chgOwnerFlag = "0";
+                    }
+
+                    this.vin = carInfoVo.getVinNo();
+                    this.loanStatus = "0";
+                    this.modelName = fullCarDataDto.getModelName();
+                    this.unladenMass = carInfoVo.getCompleteKerbMass();
+                    this.FullType = fullCarDataDto.getEnergyTypes();
+
+                    MotorUsageTypeCode usageTypeCode = Enum.valueOf(MotorUsageTypeCode.class,
+                            MotorUsageTypeCode.TITLE + carInfoVo.getVehicleUseCode());
+                    this.motorUsageTypeCode = usageTypeCode.getCode();
+
+                    MotorTypeCode motorTypeCode1 = Enum.valueOf(MotorTypeCode.class, MotorTypeCode.TITLE + carInfoVo.getCarKindCode());
+                    this.motorTypeCode = motorTypeCode1.getCode();
+
+                    this.plateType = "02";
+                    this.property = "04";
+                    this.colorCode = null;
+                    this.carCheckStatus = "2";
+                    this.vehicleCondition = "0";
+                    this.vehicleType = carInfoVo.getCarTypeCode();
+                    this.registModelCode = fullCarDataDto.getModelName();
+                    this.plateColorCode = "01";
+                }
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class SimpleStadarCarDto implements Serializable {
+                private static final long serialVersionUID = 1260421320708015158L;
+                //Y	行业车型编码
+                @JSONField(name = "modelCode")
+                private String modelCode;
+                //Y	座位数
+                @JSONField(name = "approvedPassengersCapacity")
+                private int approvedPassengersCapacity;
+                //Y	精友车型编码
+                @JSONField(name = "localModelCode")
+                private String localModelCode;
+                //Y	参见能源种类代码
+                @JSONField(name = "energyTypes")
+                private String energyTypes;
+
+                public SimpleStadarCarDto(CarInfoVo carInfoVo, HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto) {
+
+                    this.modelCode = fullCarDataDto.getModelCode();
+                    this.approvedPassengersCapacity = fullCarDataDto.getApprovedPassengersCapacity();
+                    if (carInfoVo.getSeatCount() != null) {
+                        this.approvedPassengersCapacity = Integer.parseInt(carInfoVo.getSeatCount());
+                    }
+                    this.localModelCode = fullCarDataDto.getLocalModelCode();
+                    this.energyTypes = fullCarDataDto.getEnergyTypes();
+                }
+            }
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class SaleInfoDto implements Serializable {
+            private static final long serialVersionUID = -8717559068867090498L;
+            //Y	代理人代码
+            @JSONField(name = "agentCode")
+            private String agentCode;
+            //Y	代理协议编码
+            @JSONField(name = "agreementNo")
+            private String agreementNo;
+            //Y	机构代码
+            @JSONField(name = "comCode")
+            private String comCode;
+            //Y	活动ID(通过活动查询接口获得)
+            @JSONField(name = "promoteSalePlanID")
+            private String promoteSalePlanID;
+
+            public SaleInfoDto(HuaTaiConfigureParameters huaTaiConfigureParameters) {
+                this.agentCode = huaTaiConfigureParameters.getAgentCode();
+                this.agreementNo = huaTaiConfigureParameters.getAgreementNo();
+                this.comCode = huaTaiConfigureParameters.getComCode();
+                this.promoteSalePlanID = "";//后期需维护
+            }
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ContractDto implements Serializable {
+        private static final long serialVersionUID = -8141574495483504299L;
+        //Y	业务主信息
+        @JSONField(name = "contractMain")
+        private ContractMainDto contractMain;
+        //Y	投保险别列表
+        @JSONField(name = "coverage")
+        private List<CoverageDto> coverage;
+        //Y	平台交互信息
+        @JSONField(name = "platFormMessage")
+        private PlatFormMessageDto platFormMessage;
+        //CY	车船税信息(交强险节点下传值)
+        @JSONField(name = "tax")
+        private TaxDto tax;
+        //CY	充电桩信息(列表)
+        @JSONField(name = "ChargingPost")
+        private List<ChargingPostDto> chargingPost;
+
+        public List<ContractDto> getContract(QuoteVo quoteVo, List<KindInfoVo> kindInfoVos, Integer quantity,
+                                             VehicleAndVesselTaxVo vesselTax, HuaTaiActualValueResponse actualValueResponse,
+                                             HuaTaiConfigureParameters huaTaiConfigureParameters,
+                                             HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto) {
+            List<ContractDto> contractDTOS = new ArrayList<>();
+            if (quoteVo.getCiRiskInfoVo() != null) {
+                ContractDto contractDto = new ContractDto();
+                ContractMainDto contractMainDto = new ContractMainDto(quoteVo.getCiRiskInfoVo(), huaTaiConfigureParameters, fullCarDataDto);
+                contractDto.setContractMain(contractMainDto);
+                contractDto.setCoverage(Collections.singletonList(new ContractDto.CoverageDto().fetchTraffic(contractMainDto)));
+                contractDto.setTax(new ContractDto.TaxDto(vesselTax));
+                contractDTOS.add(contractDto);
+            }
+            if (quoteVo.getBiRiskInfoVo() != null) {
+                ContractDto contractDto = new ContractDto();
+                ContractMainDto contractMainDto = new ContractMainDto(quoteVo.getBiRiskInfoVo(), huaTaiConfigureParameters, fullCarDataDto);
+                contractDto.setContractMain(contractMainDto);
+                contractDto.setCoverage(new ContractDto.CoverageDto().getBusiness(kindInfoVos, quantity, contractMainDto,
+                        actualValueResponse));
+                contractDTOS.add(contractDto);
+            }
+
+            /*ContractDto contractDto = new ContractDto();
+            for (RiskInfoVo riskInfoVo : riskInfoVos) {
+                ContractDto contractDto = new ContractDto();
+                this.contractMain = new ContractMainDto(riskInfoVo, huaTaiConfigureParameters, fullCarDataDto);
+                contractDto.setContractMain(contractMain);
+                if (InsuranceRisk.TRAFFIC.getCode().equals(riskInfoVo.getRiskCode())) {
+                    contractDto.coverage = Collections.singletonList(new ContractDto.CoverageDto().fetchTraffic(contractMain));
+                    contractDto.tax = new ContractDto.TaxDto(vesselTax);
+                }
+                if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode())) {
+                    contractDto.coverage = new ContractDto.CoverageDto().getBusiness(kindInfoVos, quantity, contractMain,
+                            actualValueResponse);
+                }
+                contractDTOS.add(contractDto);
+            }*/
+            return contractDTOS;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class ContractMainDto implements Serializable {
+
+            private static final long serialVersionUID = 7688777472649812180L;
+            //CY	报价单号(初次报价为空,同一单再次报价需传入之前接口返回的值)
+            @JSONField(name = "contractNo")
+            private String contractNo;
+            //Y	经办人代码
+            @JSONField(name = "handlerCode")
+            private String handlerCode;
+            //Y	参见险种代码
+            @JSONField(name = "riskCode")
+            private String riskCode;
+            //Y	起保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "validDate")
+            private String validDate;
+            //Y	终保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "expiryDate")
+            private String expiryDate;
+            //Y	生成日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "productionDate")
+            private String productionDate;
+
+            public ContractMainDto(RiskInfoVo riskInfoVo, HuaTaiConfigureParameters huaTaiConfigureParameters,
+                                   HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto) {
+                SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                this.riskCode = InsuranceTypeCorrespondence.getHuaTaiRisk().get(riskInfoVo.getRiskCode());
+                if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode()) && "1,2,3,".contains(fullCarDataDto.getEnergyTypes() + ",")) {//纯电动 燃料电池 插电式混合动力 归属为新能源产品
+                    this.riskCode = InsuranceTypeCorrespondence.getHuaTaiNewEnergyRisk();
+                }
+                this.handlerCode = huaTaiConfigureParameters.getOperatorCode();
+                String startDate = riskInfoVo.getStartDate();
+                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+                LocalDate localDate = LocalDate.parse(startDate, formatter);
+                LocalDate nextYears = localDate.plusYears(1);
+                if (startDate.contains(TimeConstants.START_TIME)) {
+                    LocalDate expiry = nextYears.minusDays(1);
+                    this.validDate = riskInfoVo.getStartDate();
+                    this.expiryDate = expiry + " " + TimeConstants.END_TIME;
+                } else {
+                    // 及时
+                    LocalDateTime localDateTime = LocalDateTime.parse(startDate, formatter);
+                    LocalDateTime expiryDateTime = localDateTime.plusYears(1);
+                    this.validDate = startDate;
+                    this.expiryDate = expiryDateTime.format(formatter);
+                }
+
+                this.productionDate = df.format(new Date());
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CoverageDto implements Serializable {
+            private static final long serialVersionUID = -4784793249784721550L;
+            //Y	保额(传值要求参见险别代码)
+            @JSONField(name = "amount")
+            private double amount;
+            //Y	起保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "validDate")
+            private String validDate;
+            //Y	终保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "expiryDate")
+            private String expiryDate;
+            //Y	参见险别代码
+            @JSONField(name = "kindCode")
+            private String kindCode;
+            //Y	险别名称(传值要求参见险别代码)
+            @JSONField(name = "kindName")
+            private String kindName;
+            //CY	单位保额(传值要求参见险别代码)
+            @JSONField(name = "unitAmount")
+            private String unitAmount;
+            //CY	数量(乘客险录入值为座位数-1,其他险别无需录入)
+            @JSONField(name = "quantity")
+            private String quantity;
+            //CY	服务次数(传值要求参见险别代码)
+            @JSONField(name = "serviceTimes")
+            private String serviceTimes;
+            //CY	免赔率(车损险可传,传值要求参见险别代码)
+            @JSONField(name = "deductibleRate")
+            private String deductibleRate;
+            //CY	可选免赔额(附加绝对免赔率特约条款必传,传值要求参见险别代码)
+            @JSONField(name = "deductible")
+            private String deductible;
+
+            /**
+             * 商业险
+             *
+             * @param kindInfoVos 商业险
+             * @param quantity    乘客数
+             * @return
+             */
+            public List<CoverageDto> getBusiness(List<KindInfoVo> kindInfoVos, int quantity, ContractMainDto contractMain,
+                                                 HuaTaiActualValueResponse actualValueResponse) {
+                List<CoverageDto> list = new ArrayList<>();
+                for (KindInfoVo kindInfoVo : kindInfoVos) {
+                    CoverageDto coverageDto = new CoverageDto();
+                    String code = kindInfoVo.getKindCode();
+                    ContractEnum contractEnum = Enum.valueOf(ContractEnum.class, "H_" + code);
+                    coverageDto.kindCode = contractEnum.getKindCode();
+                    coverageDto.kindName = contractEnum.getKindName();
+                    coverageDto.amount = Double.parseDouble(kindInfoVo.getAmount());
+                    coverageDto.validDate = contractMain.getValidDate();
+                    coverageDto.expiryDate = contractMain.getExpiryDate();
+                    coverageDto.unitAmount = String.valueOf(kindInfoVo.getUnitAmount());
+                    // 车损
+                    if ("A".equals(code)) {
+                        //车损险保额
+                        coverageDto.amount = actualValueResponse.getActualValue();
+                    }
+                    // 司机
+                    if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getDriver(), code) >= 0) {
+                        coverageDto.quantity = "1";
+                        coverageDto.unitAmount = String.valueOf(kindInfoVo.getAmount());
+                    }
+                    // 乘客
+                    if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getPassenger(), code) >= 0) {
+                        coverageDto.quantity = String.valueOf(quantity);
+                        coverageDto.amount = Integer.parseInt(kindInfoVo.getUnitAmount()) * quantity;
+                    }
+                    // 绝对免赔
+                    if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getAbsoluteDeductible(), code) >= 0) {
+                        coverageDto.deductible = "-" + kindInfoVo.getDeductibleRate();
+                    }
+
+                    if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getSpecialContractClause(), code) >= 0) {
+                        coverageDto.serviceTimes = String.valueOf(kindInfoVo.getServiceTimes());
+                    }
+                    list.add(coverageDto);
+
+                }
+                return list;
+            }
+
+            /**
+             * 交强险
+             *
+             * @return
+             */
+            public CoverageDto fetchTraffic(ContractMainDto contractMain) {
+                this.amount = 200000;
+                this.kindName = ContractEnum.H_BZ.getKindName();
+                this.kindCode = ContractEnum.H_BZ.getKindCode();
+                this.validDate = contractMain.getValidDate();
+                this.expiryDate = contractMain.getExpiryDate();
+                return this;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class PlatFormMessageDto implements Serializable {
+            private static final long serialVersionUID = 6094816644827817884L;
+            //CY	平台查询码
+            @JSONField(name = "querySequenceNo")
+            private String querySequenceNo;
+            //CY	平台查询码(获取上年保单信息)
+            @JSONField(name = "querySequenceNoForBiRe")
+            private String querySequenceNoForBiRe;
+            //CY	平台校验图片转码后得到的验证码
+            @JSONField(name = "checkCode")
+            private String checkCode;
+
+            @JSONField(name = "checkCodeRe")
+            private String checkCodeRe;
+
+            //CY	平台校验图片转码后得到的验证码(获取上年保单信息)
+            @JSONField(name = "checkCodeForBiRe")
+            private String checkCodeForBiRe;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TaxDto implements Serializable {
+            private static final long serialVersionUID = 5186435194104031157L;
+            //Y	参见纳税类型代码
+            @JSONField(name = "TaxConditionCode")
+            private String taxConditionCode;
+            //CY	缴税起期(完税必传)
+            @JSONField(name = "TaxStartDate")
+            private String TaxStartDate;
+            //CY	缴税止期(完税必传)
+            @JSONField(name = "TaxEndDate")
+            private String TaxEndDate;
+            //CY	开具税务机关代码(减税、免税、完税必传)
+            @JSONField(name = "TaxDepartmentCode")
+            private String TaxDepartmentCode;
+            //CY	开具税务机关名称(减税、免税、完税必传)
+            @JSONField(name = "TaxDepartment")
+            private String TaxDepartment;
+            //CY	减税/免税/完税凭证号(减税、免税、完税必传)
+            @JSONField(name = "DocumentNumber")
+            private String DocumentNumber;
+            //Y	纳税人是否同车主(1-是;0-否)
+            @JSONField(name = "isSameWithOwner")
+            private String isSameWithOwner;
+            //CY	纳税人证件类型代码,参见证件类型代码(纳税人不同车主时必填)
+            @JSONField(name = "taxpayerIdentifyType")
+            private String taxpayerIdentifyType;
+            //CY	纳税人证件号码(纳税人不同车主时必填)
+            @JSONField(name = "TaxPayerIdentificationCode")
+            private String TaxPayerIdentificationCode;
+            //CY	纳税人名称(纳税人不同车主时必填)
+            @JSONField(name = "TaxPayerName")
+            private String TaxPayerName;
+            //CY	参见纳税地区代码(完税必传)
+            @JSONField(name = "taxLocationCode")
+            private String taxLocationCode;
+            //CY	完税凭证填发日期(完税必传)(格式:YYYY-MM-DD HH24:MI:SS)
+            @JSONField(name = "taxDocumentDate")
+            private String taxDocumentDate;
+            //CY	参见减免原因代码
+            @JSONField(name = "DeductionDueCode")
+            private String DeductionDueCode;
+            //CY	减免方案代码(1-按金额减免;2-按比例减免)
+            @JSONField(name = "DeductionDueType")
+            private String DeductionDueType;
+            //CY	减免金额(减免方案为1时必传)
+            @JSONField(name = "Deduction")
+            private double Deduction;
+            //CY	减免比例(取值区间为0-100之间,减免方案为2时必传)
+            @JSONField(name = "DeductionDueProportion")
+            private double DeductionDueProportion;
+
+            public TaxDto(VehicleAndVesselTaxVo vesselTax) {
+
+                this.taxConditionCode = "1N";
+                this.isSameWithOwner = "1";
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class ChargingPostDto implements Serializable {
+            private static final long serialVersionUID = -6324590056449630117L;
+            //Y	充电桩序号
+            @JSONField(name = "itemNo")
+            private String itemNo;
+            //Y	充电桩型号
+            @JSONField(name = "chargingPostType")
+            private String chargingPostType;
+            //Y	充电桩编码
+            @JSONField(name = "chargingPostCode")
+            private String chargingPostCode;
+            //Y	充电桩地址
+            @JSONField(name = "chargingPostAddress")
+            private String chargingPostAddress;
+            //Y	充电桩安装地点类型
+            @JSONField(name = "chargingPostAddressType")
+            private String chargingPostAddressType;
+            //Y	充电桩种类
+            @JSONField(name = "chargingPostKind")
+            private String chargingPostKind;
+            //Y	充电桩购买日期(格式:YYYY-MM-DD)
+            @JSONField(name = "chargingPostDate")
+            private String chargingPostDate;
+            //CY	UAP对应保额(投保UAP险必传,传值要求参见险别代码)
+            @JSONField(name = "amountUAP")
+            private String amountUAP;
+            //CY	UBP对应保额(投保UBP险必传,传值要求参见险别代码)
+            @JSONField(name = "amountUBP")
+            private String amountUBP;
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class CustomerDto implements Serializable {
+        private static final long serialVersionUID = -931739185225437306L;
+        //CY	证件号码(个人客户必传)
+        @JSONField(name = "identifyNumber")
+        private String identifyNumber;
+        //Y	参见客户证件类型代码
+        @JSONField(name = "identifyType")
+        private String identifyType;
+        //Y	客户名称
+        @JSONField(name = "name")
+        private String name;
+        //Y	客户角色身份(1-投保人;2-被保险人;3-车主)
+        @JSONField(name = "role")
+        private String role;
+        //Y	手机号码
+        @JSONField(name = "mobile")
+        private String mobile;
+        //Y	证件有效起期(格式:YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "identifyValidDate")
+        private String identifyValidDate;
+        //Y	证件有效止期(格式:YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "identifyValidEndDate")
+        private String identifyValidEndDate;
+        //Y	客户职业(传值要求通过职业查询接口获得)
+        @JSONField(name = "occupationCode")
+        private String occupationCode;
+        //Y	客户类型(1-个人,2-机构)
+        @JSONField(name = "type")
+        private String type;
+        //CY	办理人姓名(机构客户必录)
+        @JSONField(name = "transactorName")
+        private String transactorName;
+        //CY	组织机构代码(机构客户必录)
+        @JSONField(name = "organizeCode")
+        private String organizeCode;
+        //Y	车辆与被保险人所属关系(1-所有;2-使用;3-管理)
+        @JSONField(name = "carInsuredRelation")
+        private String carInsuredRelation;
+
+        public CustomerDto(CustomerInfoVo customerInfoVo, String role) {
+            this.name = customerInfoVo.getName();
+            this.identifyType = "01";
+            this.identifyNumber = customerInfoVo.getIdentifyNumber();
+            this.mobile = customerInfoVo.getMobile();
+            this.type = "1";
+            this.role = role;
+            int randomNum = new Random().nextInt(HuaTaiBaseCode.getOccupation().size());
+            this.occupationCode = HuaTaiBaseCode.getOccupation().get(randomNum);//后续需要根据接口维护返参到表里
+            this.identifyValidDate = customerInfoVo.getIdentifyValidDate() + " " + TimeConstants.START_TIME;
+            this.identifyValidEndDate = customerInfoVo.getIdentifyValidEndDate() + " " + TimeConstants.END_TIME;
+            if ("2".equals(role)) {
+                this.carInsuredRelation = "1";
+            }
+        }
+
+        public List<CustomerDto> getCustomers(CustomerInfoVo ownerInfo, CustomerInfoVo policyHolderInfo, CustomerInfoVo insuredPersonInfo) {
+            return Arrays.asList(new CustomerDto(ownerInfo, "3"), new CustomerDto(policyHolderInfo, "1"),
+                    new CustomerDto(insuredPersonInfo, "2"));
+        }
+    }
+
+}

+ 209 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSaveFileIdxRequest.java

@@ -0,0 +1,209 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.component.HuiTaiUploadImageComponent;
+import com.jzg.quote.huatai.api.entity.response.HuaTaiImageInitParamResponse;
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/12 10:40
+ **/
+@Data
+public class HuaTaiSaveFileIdxRequest {
+
+    @JsonProperty("token")
+    private String token;
+
+    @JsonProperty("fileIdxVo")
+    private FileIdxVoDTO fileIdxVo;
+
+    public HuaTaiSaveFileIdxRequest(String token, HuaTaiImageInitParamResponse response, HuiTaiUploadImageComponent.FileuploadResult fileupload, String fileName,
+                                    HuaTaiImageInitParamResponse.TypeSelectVosDTO.ChildrenDTO childrenDTO) {
+        this.token = token;
+        this.fileIdxVo = new FileIdxVoDTO(response, fileupload, fileName, childrenDTO);
+    }
+
+    @Data
+    public static class FileIdxVoDTO {
+
+        @JsonProperty("rotate")
+        private Integer rotate;
+
+        @JsonProperty("rotateStart")
+        private Integer rotateStart;
+
+        @JsonProperty("optionFlag")
+        private Integer optionFlag;
+
+        @JsonProperty("imgId")
+        private Long imgId;
+
+        @JsonProperty("createTime")
+        private Long createTime;
+
+        @JsonProperty("createUser")
+        private String createUser;
+
+        @JsonProperty("createUserName")
+        private String createUserName;
+
+        @JsonProperty("appSource")
+        private String appSource;
+
+        @JsonProperty("docId")
+        private Integer docId;
+
+        @JsonProperty("bussNo")
+        private String bussNo;
+
+        @JsonProperty("bussType")
+        private String bussType;
+
+        @JsonProperty("bussTypeName")
+        private String bussTypeName;
+
+        @JsonProperty("riskCode")
+        private String riskCode;
+
+        @JsonProperty("riskCodeName")
+        private String riskCodeName;
+
+        @JsonProperty("comCode")
+        private String comCode;
+
+        @JsonProperty("comName")
+        private String comName;
+
+        @JsonProperty("bussDate")
+        private String bussDate;
+
+        @JsonProperty("validFlag")
+        private Integer validFlag;
+
+        @JsonProperty("uploadNode")
+        private String uploadNode;
+
+        @JsonProperty("appendPath")
+        private String appendPath;
+
+        @JsonProperty("editable")
+        private Boolean editable;
+
+        @JsonProperty("deletable")
+        private Boolean deletable;
+
+        @JsonProperty("voType")
+        private String voType;
+
+        @JsonProperty("archType")
+        private String archType;
+
+        @JsonProperty("picFileFlag")
+        private Integer picFileFlag;
+
+        @JsonProperty("fileSize")
+        private Double fileSize;
+
+        @JsonProperty("fileSizeFormat")
+        private String fileSizeFormat;
+
+        @JsonProperty("fileOrgName")
+        private String fileOrgName;
+
+        @JsonProperty("fileTitle")
+        private String fileTitle;
+
+        @JsonProperty("fileName")
+        private String fileName;
+
+        @JsonProperty("typePath")
+        private String typePath;
+
+        @JsonProperty("typePathName")
+        private String typePathName;
+
+        @JsonProperty("typeName")
+        private String typeName;
+
+        @JsonProperty("picMaxSize")
+        private Integer picMaxSize;
+
+        @JsonProperty("picQuality")
+        private Integer picQuality;
+
+        @JsonProperty("error")
+        private Integer error;
+
+        @JsonProperty("checked")
+        private Boolean checked;
+
+        @JsonProperty("uploadStatus")
+        private Integer uploadStatus;
+
+        @JsonProperty("showIdx")
+        private Integer showIdx;
+
+        @JsonProperty("uploadTime")
+        private Integer uploadTime;
+
+        @JsonProperty("storageType")
+        private String storageType;
+
+        public FileIdxVoDTO(HuaTaiImageInitParamResponse response, HuiTaiUploadImageComponent.FileuploadResult fileupload, String fileName,
+                            HuaTaiImageInitParamResponse.TypeSelectVosDTO.ChildrenDTO childrenDTO) {
+            this.rotate = 0;
+            this.rotateStart = 0;
+            this.optionFlag = 2;
+            this.createTime = System.currentTimeMillis();
+
+            // 初始化的时候获取参数
+            this.createUser = response.getOptUserId();
+            this.createUserName = response.getOptUserName();
+            this.appSource = response.getAppSource();
+            this.docId = response.getDocId();
+            this.bussNo = response.getBussNo();
+            this.bussType = response.getBussType();
+            this.bussTypeName = response.getBussTypeName();
+            this.riskCode = response.getRiskCode();
+            this.riskCodeName = response.getRiskCodeName();
+            this.comCode = response.getComCode();
+            this.comName = response.getComName();
+            this.bussDate = response.getBussDate();
+            this.validFlag = 1;
+            this.uploadNode = response.getUploadNode();
+            this.appendPath = fileupload.getFilePath().substring(0,fileupload.getFilePath().lastIndexOf("/")+1);
+            this.editable = true;
+            this.deletable = true;
+            this.voType = "C";
+            this.archType = response.getArchType();
+
+            this.picFileFlag = 1;
+            this.fileSize = fileupload.getFileSize();
+            this.fileSizeFormat = String.format("%.2f", fileupload.getFileSize()) + "KB";
+
+            String uuidLower = HuiTaiUploadImageComponent.getUUIDLower();
+            String substring = fileName.substring(fileName.lastIndexOf("."));
+
+            this.fileTitle = uuidLower;
+            this.fileOrgName = uuidLower + substring;
+
+            this.fileName = fileupload.getFilePath().substring(fileupload.getFilePath().lastIndexOf("/")+1);;
+
+            this.typePath = childrenDTO.getTypePath();
+            this.typePathName = childrenDTO.getTypePathName();
+            this.typeName = childrenDTO.getLabel();
+            this.picMaxSize = childrenDTO.getPicMaxSize();
+            this.picQuality = childrenDTO.getPicQuality();
+
+            this.error = 0;
+            this.uploadStatus = 3;
+            this.showIdx = 30;
+            this.uploadTime = 154;
+            this.storageType = response.getStorageType();
+        }
+
+    }
+
+}

+ 521 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSubmitRequest.java

@@ -0,0 +1,521 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.jzg.commons.constants.InsuranceRisk;
+import com.jzg.quotation.commons.constant.InsuranceTypeCorrespondence;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.constant.TimeConstants;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import com.jzg.quote.huatai.api.entity.vo.InsHuataiContributingVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 华泰财险 提交核保请求
+ * @author: shenwd
+ * @date: 2025/3/10 18:34
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiSubmitRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 3936247930307223088L;
+
+    @JSONField(name = "businessData")
+    //投保单信息
+    private BusinessDataDto businessData;
+    //Y	机构代码
+    @JSONField(name = "loginCom")
+    private String loginCom;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.SAVE);
+    }
+
+    public HuaTaiSubmitRequest(HuaTaiApiOrder huaTaiApiOrder,
+                               HuaTaiConfigureParameters huaTaiConfigureParameters, List<InsHuataiContributingVo> engageList) {
+        this.businessData = new BusinessDataDto(huaTaiApiOrder, huaTaiConfigureParameters, engageList);
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class BusinessDataDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 4577005582537148386L;
+
+        // 投保主信息
+        @JSONField(name = "businessMain")
+        private BusinessMainDto businessMain;
+        // 业务信息(列表)
+        @JSONField(name = "contract")
+        private List<ContractDto> contract;
+        // 客户信息(列表)
+        @JSONField(name = "customer")
+        private List<CustomerDto> customer;
+        //  销售信息
+        @JSONField(name = "saleInfo")
+        private SaleInfoDto saleInfo;
+
+        public BusinessDataDto(HuaTaiApiOrder huaTaiApiOrder,
+                               HuaTaiConfigureParameters huaTaiConfigureParameters, List<InsHuataiContributingVo> engageList) {
+            List<RiskInfoVo> riskList = new ArrayList<>();
+            riskList.add(huaTaiApiOrder.getBiRiskInfoVo());
+            riskList.add(huaTaiApiOrder.getCiRiskInfoVo());
+            CustomerInfoVo ownerInfo = huaTaiApiOrder.getOwnersInfo();
+
+            CustomerInfoVo policyHolderInfo = huaTaiApiOrder.getPolicyHolderInfo();
+            CustomerInfoVo insuredPersonInfo = huaTaiApiOrder.getInsuredPersonInfo();
+            // 保单归属地
+            this.businessMain = new BusinessMainDto(huaTaiConfigureParameters);
+
+            // 保险信息
+            this.contract = new ContractDto().getContract(riskList, huaTaiApiOrder, engageList);
+            // 客户信息
+            this.customer = new CustomerDto().getCustomers(ownerInfo, policyHolderInfo, insuredPersonInfo, huaTaiConfigureParameters);
+            //销售信息
+            this.saleInfo = new SaleInfoDto(huaTaiConfigureParameters);
+
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class BusinessMainDto implements Serializable {
+
+        private static final long serialVersionUID = -3901160212812740520L;
+        // 操作机构代码
+        @JSONField(name = "makeCom")
+        private String makeCom;
+        // 操作员代码
+        @JSONField(name = "operatorCode")
+        private String operatorCode;
+
+        public BusinessMainDto(HuaTaiConfigureParameters huaTaiConfigureParameters) {
+            this.makeCom = huaTaiConfigureParameters.getComCode();
+            this.operatorCode = huaTaiConfigureParameters.getOperatorCode();
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ContractDto implements Serializable {
+
+        private static final long serialVersionUID = 2452110821283897129L;
+        // 业务主信息
+        @JSONField(name = "contractMain")
+        private ContractMainDto contractMain;
+        // 平台交互信息
+        @JSONField(name = "platFormMessage")
+        private PlatFormMessage platFormMessage;
+        //CY	自定义特别约定列表
+        @JSONField(name = "engage")
+        private List<EngageDto> engage;
+
+        public List<ContractDto> getContract(List<RiskInfoVo> riskInfoVos, HuaTaiApiOrder huaTaiApiOrder,
+                                             List<InsHuataiContributingVo> engageList) {
+            List<ContractDto> contractDTOS = new ArrayList<>();
+            for (RiskInfoVo riskInfoVo : riskInfoVos) {
+                ContractDto contractDto = new ContractDto();
+                this.contractMain = new ContractMainDto(riskInfoVo, huaTaiApiOrder);
+                if (InsuranceRisk.TRAFFIC.getCode().equals(riskInfoVo.getRiskCode())) {
+                    this.platFormMessage = new PlatFormMessage(huaTaiApiOrder.getJqQuerySequenceNo());
+                }
+
+                if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode())) {
+                    this.platFormMessage = new PlatFormMessage(huaTaiApiOrder.getSyQuerySequenceNo());
+                }
+
+                List<InsHuataiContributingVo> insHuataiContributingVos =
+                        engageList.stream().filter(x -> x.getRiskCode().equals(riskInfoVo.getRiskCode())).collect(Collectors.toList());
+
+                this.engage = new EngageDto().getEngageList(insHuataiContributingVos);
+                contractDto.setEngage(engage);
+                contractDto.setContractMain(contractMain);
+                contractDto.setPlatFormMessage(platFormMessage);
+                contractDTOS.add(contractDto);
+            }
+            return contractDTOS;
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ContractMainDto implements Serializable {
+
+        private static final long serialVersionUID = -827498526562322815L;
+        //报价单号(需传入报价接口返回的值)
+        @JSONField(name = "contractNo")
+        private String contractNo;
+        //参见险种代码
+        @JSONField(name = "riskCode")
+        private String riskCode;
+        //起保日期(YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "validDate")
+        private String validDate;
+        //终保日期(YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "expiryDate")
+        private String expiryDate;
+        //总签单保费
+        @JSONField(name = "totalPremium")
+        private double totalPremium;
+        //备注
+        @JSONField(name = "remark")
+        private String remark;
+
+        public ContractMainDto(RiskInfoVo riskInfoVo, HuaTaiApiOrder huaTaiApiOrder) {
+            if (InsuranceRisk.TRAFFIC.getCode().equals(riskInfoVo.getRiskCode())) {
+                this.contractNo = huaTaiApiOrder.getJqApplyNo();
+                this.totalPremium = Double.parseDouble(huaTaiApiOrder.getJqPremium());
+                this.validDate = riskInfoVo.getStartDate();
+                this.expiryDate = riskInfoVo.getEndDate();
+            } else if (InsuranceRisk.BUSINESS.getCode().equals(riskInfoVo.getRiskCode())) {
+                this.contractNo = huaTaiApiOrder.getSyApplyNo();
+                this.totalPremium = Double.parseDouble(huaTaiApiOrder.getSyPremium());
+                this.validDate = riskInfoVo.getStartDate();
+                this.expiryDate = riskInfoVo.getEndDate();
+            }
+            this.riskCode = InsuranceTypeCorrespondence.getHuaTaiRisk().get(riskInfoVo.getRiskCode());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PlatFormMessage implements Serializable {
+
+        private static final long serialVersionUID = 7957269957188794595L;
+        // 业务主信息
+        @JSONField(name = "querySequenceNo")
+        private String querySequenceNo;
+
+        public PlatFormMessage(String querySequenceNo) {
+            this.querySequenceNo = querySequenceNo;
+        }
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class EngageDto implements Serializable {
+
+        private static final long serialVersionUID = 7957269957188794595L;
+        // 业务主信息
+        @JSONField(name = "engageCode")
+        private String engageCode;
+        // 业务主信息
+        @JSONField(name = "engageTitle")
+        private String engageTitle;
+        // 业务主信息
+        @JSONField(name = "engageDetail")
+        private String engageDetail;
+
+        public EngageDto(InsHuataiContributingVo insHuataiContributingVo) {
+            this.engageCode = insHuataiContributingVo.getEngageCode();
+            this.engageTitle = insHuataiContributingVo.getEngageTitle();
+            this.engageDetail = insHuataiContributingVo.getEngageDetail();
+        }
+
+        public List<EngageDto> getEngageList(List<InsHuataiContributingVo> insHuataiContributingVos) {
+            return insHuataiContributingVos.stream().map(EngageDto::new).collect(Collectors.toList());
+        }
+
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class CustomerDto implements Serializable {
+
+        private static final long serialVersionUID = 3423549173956690508L;
+        //Y	证件号码(个人客户必传)
+        @JSONField(name = "identifyNumber")
+        private String identifyNumber;
+        //CY	组织机构代码(机构客户必录)
+        @JSONField(name = "organizeCode")
+        private String organizeCode;
+        //Y	参见客户证件类型代码(机构客户传99)
+        @JSONField(name = "identifyType")
+        private String identifyType;
+        //Y	名称
+        @JSONField(name = "name")
+        private String name;
+        //Y	客户角色身份(1-投保人;2-被保险人;3-车主)
+        @JSONField(name = "role")
+        private String role;
+        //Y	手机号码
+        @JSONField(name = "mobile")
+        private String mobile;
+        //Y	证件有效起期(格式:YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "identifyValidDate")
+        private String identifyValidDate;
+        //Y	证件有效止期(格式:YYYY-MM-DD HH24:MI:SS)
+        @JSONField(name = "identifyValidEndDate")
+        private String identifyValidEndDate;
+        //Y	客户职业(通过职业查询接口获得)
+        @JSONField(name = "occupationCode")
+        private String occupationCode;
+        //Y	客户地址
+        @JSONField(name = "addr")
+        private String addr;
+        //Y	客户邮箱
+        @JSONField(name = "email")
+        private String email;
+        //Y	客户类型(1-个人,2-机构)
+        @JSONField(name = "type")
+        private String type;
+        //CY	车辆与被保险人所属关系(1-所有;2-使用;3-管理,当角色是被保险人时必传)
+        @JSONField(name = "carInsuredRelation")
+        private String carInsuredRelation;
+        //CY 参见投保人与被保人关系代码(投保人和被保人均为个人客户时必传)
+        @JSONField(name = "aiRelation")
+        private String aiRelation;
+        //CY	客户地址(省)代码(江西必传)
+        @JSONField(name = "Province")
+        private String province;
+        //CY	客户地址(省)名称(江西必传)
+        @JSONField(name = "ProvinceName")
+        private String provinceName;
+        //CY	客户地址(市)代码(江西必传)
+        @JSONField(name = "City")
+        private String city;
+        //CY	客户地址(市)名称(江西必传)
+        @JSONField(name = "CityName")
+        private String cityName;
+        //CY	客户地址(区)代码(江西必传)
+        @JSONField(name = "District")
+        private String district;
+        //CY	客户地址(区)名称(江西必传)
+        @JSONField(name = "DistrictName")
+        private String districtName;
+        //CY	手机实际持有人姓名(上海出单必录)
+        @JSONField(name = "ActualHolderName")
+        private String actualHolderName;
+        //CY	手机实际持有人证件类型(参见客户证件类型代码)(上海出单必录)
+        @JSONField(name = "ActualHolderIdentifyType")
+        private String actualHolderIdentifyType;
+        //CY	手机实际持有人证件号码(上海出单必录)
+        @JSONField(name = "ActualHolderIdentifyCode")
+        private String actualHolderIdentifyCode;
+        //CY	企业经办人类别(传值参见企业经办人类别)(上海机构客户出单必录)
+        @JSONField(name = "transactorType")
+        private String transactorType;
+        //CY	营业性质/主要业务范围(机构客户)
+        @JSONField(name = "businessDetail")
+        private String businessDetail;
+        //CY	行业代码(机构客户)(传值参见行业代码)
+        @JSONField(name = "BusinessSource")
+        private String businessSource;
+        //CY	国籍代码(传值参见国籍代码)
+        @JSONField(name = "CitizenshipCode")
+        private String citizenshipCode;
+        //CY	股权结构(机构客户)(传值参见股权结构)
+        @JSONField(name = "EquityStructure")
+        private String equityStructure;
+        //CY	法定代表人姓名(机构客户)
+        @JSONField(name = "leaderName")
+        private String leaderName;
+        //CY	法定代表人姓名其他身份证明号码(机构客户)
+        @JSONField(name = "leaderIdentifyNumber")
+        private String leaderIdentifyNumber;
+        //CY	法定代表人姓名其他身份证明种类(机构客户)(参见客户证件类型代码)
+        @JSONField(name = "leaderOtherIdentifyType")
+        private String leaderOtherIdentifyType;
+        //CY	法定代表人姓名其他身份证明号码(机构客户)
+        @JSONField(name = "leaderOtherIdentifyNumber")
+        private String leaderOtherIdentifyNumber;
+        //CY	法定代表人姓名其他身份证明有效期(机构客户)
+        @JSONField(name = "leaderOtherEffectiveDate")
+        private String leaderOtherEffectiveDate;
+        //CY	注册所在地代码(机构客户)(参见注册所在地代码)
+        @JSONField(name = "nationalityCode")
+        private String nationalityCode;
+        //CY	注册资本金币种(机构客户)
+        @JSONField(name = "registCurrency")
+        private String registCurrency;
+        //CY	注册资本金(机构客户)
+        @JSONField(name = "registFund")
+        private String registFund;
+        //CY	税务号(机构客户)
+        @JSONField(name = "RevenueCode")
+        private String revenueCode;
+        //CY	反洗钱交易监测记录(参见风险提示信息或权威媒体报道)
+        @JSONField(name = "MonitorRecord")
+        private String monitorRecord;
+        //CY	风险提示信息或权威媒体报道(参见风险提示信息或权威媒体报道)
+        @JSONField(name = "RiskWarnInfo")
+        private String riskWarnInfo;
+        //CY	执照、证明名称(机构客户必传)
+        @JSONField(name = "supportDocuName")
+        private String supportDocuName;
+        //CY	执照、证明号码(机构客户必传)
+        @JSONField(name = "supportDocuNumber")
+        private String supportDocuNumber;
+        //CY	执照、证明有效期(机构客户必传)
+        @JSONField(name = "supportDocuValidDate")
+        private String supportDocuValidDate;
+        //CY	办理人姓名(机构客户必传)
+        @JSONField(name = "TransactorName")
+        private String transactorName;
+        //CY	办理人证件类型代码(机构客户必传)(参见客户证件类型代码)
+        @JSONField(name = "transactorIdentifyType")
+        private String transactorIdentifyType;
+        //CY	办理人证件号码(机构客户必传)
+        @JSONField(name = "transactorIdentifyCode")
+        private String transactorIdentifyCode;
+        //CY	办理人手机号码(机构客户必传)
+        @JSONField(name = "transactorMobile")
+        private String transactorMobile;
+        //CY	办理人证件有效期(机构客户必传)
+        @JSONField(name = "transactorExpiryDate")
+        private String transactorExpiryDate;
+        //CY	工作单位名称(个人客户必传)
+        @JSONField(name = "workUnit")
+        private String workUnit;
+        //CY	工作单位地址(个人客户必传)
+        @JSONField(name = "workAddress")
+        private String workAddress;
+        //CY	其他联系方式(个人客户必传)
+        @JSONField(name = "otherContact")
+        private String otherContact;
+        //CY	其他住所地或工作单位地址(个人客户必传)
+        @JSONField(name = "otherWorkAddress")
+        private String otherWorkAddress;
+        //CY	联系人信息
+        @JSONField(name = "insuredLinkerList")
+        private List<InsuredLinkerBean> insuredLinkerList;
+
+
+        public CustomerDto(CustomerInfoVo customerInfoVo, String role, HuaTaiConfigureParameters huaTaiConfigureParameters, CustomerInfoVo ownerInfo) {
+            this.identifyNumber = customerInfoVo.getIdentifyNumber();
+            this.identifyType = "01";
+            this.name = customerInfoVo.getName();
+            this.mobile = customerInfoVo.getMobile();
+            this.role = role;
+            this.type = "1";
+            this.occupationCode = "20114";//后续需要根据接口维护返参到表里
+            this.identifyValidDate = customerInfoVo.getIdentifyValidDate() + " " + TimeConstants.START_TIME;
+            this.identifyValidEndDate = customerInfoVo.getIdentifyValidEndDate() + " " + TimeConstants.END_TIME;
+            this.addr = customerInfoVo.getAddr();
+            this.email = "123@qq.com";
+            if (StringUtils.isNotEmpty(customerInfoVo.getEmail())) {
+                this.email = customerInfoVo.getEmail();
+            }
+            if ("2".equals(role)) {//2代表当前角色为被保人,需要判断被保人与车主是否一致
+                if (ownerInfo != null && ownerInfo.getIdentifyNumber().equals(customerInfoVo.getIdentifyNumber())) {
+                    this.carInsuredRelation = "1";
+                } else {
+                    this.carInsuredRelation = "2";
+                }
+            }
+            this.aiRelation = "01";
+            this.workUnit = "其他";
+            this.workAddress = customerInfoVo.getAddr();
+            this.otherWorkAddress = customerInfoVo.getAddr();
+            this.insuredLinkerList = Arrays.asList(new InsuredLinkerBean(customerInfoVo, huaTaiConfigureParameters));
+        }
+
+        public List<CustomerDto> getCustomers(CustomerInfoVo ownerInfo, CustomerInfoVo policyHolderInfo, CustomerInfoVo insuredPersonInfo
+                , HuaTaiConfigureParameters huaTaiConfigureParameters) {
+            return Arrays.asList(new CustomerDto(ownerInfo, "3", huaTaiConfigureParameters, null), new CustomerDto(policyHolderInfo, "1",
+                    huaTaiConfigureParameters, null), new CustomerDto(insuredPersonInfo, "2", huaTaiConfigureParameters, ownerInfo));
+        }
+
+    }
+
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class InsuredLinkerBean implements Serializable {
+
+        private static final long serialVersionUID = -7819712018066777471L;
+        // Y	联系人名称
+        @JSONField(name = "linkName")
+        private String linkName;
+        // Y	联系人关联关系(默认传01,对应本人)
+        @JSONField(name = "linkerRelation")
+        private String linkerRelation;
+        // CY	单位电话(机构客户出单必传)
+        @JSONField(name = "unitPhoneNumber")
+        private String unitPhoneNumber;
+        //Y	省(需传省国标码)
+        @JSONField(name = "province")
+        private String province;
+        //Y	市(需传市国标码)
+        @JSONField(name = "city")
+        private String city;
+        //Y	区(需传区国标码)
+        @JSONField(name = "district")
+        private String district;
+        //Y	地址
+        @JSONField(name = "street")
+        private String street;
+        // Y	电话
+        @JSONField(name = "mobile")
+        private String mobile;
+        // CY	邮箱(电子保单必传)
+        @JSONField(name = "email")
+        private String email;
+
+        public InsuredLinkerBean(CustomerInfoVo customerInfoVo, HuaTaiConfigureParameters huaTaiConfigureParameters) {
+            this.linkName = customerInfoVo.getName();
+            this.linkerRelation = "01";
+
+            this.province = huaTaiConfigureParameters.getProvince();
+            this.city = huaTaiConfigureParameters.getCity();
+            this.district = huaTaiConfigureParameters.getDistrict();
+
+            this.street = customerInfoVo.getAddr();
+            this.mobile = customerInfoVo.getMobile();
+            this.email = "123@qq.com";
+            if (StringUtils.isNotEmpty(customerInfoVo.getEmail())) {
+                this.email = customerInfoVo.getEmail();
+            }
+        }
+
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class SaleInfoDto implements Serializable {
+
+        private static final long serialVersionUID = 2631084372177408934L;
+        // 操作机构代码
+        @JSONField(name = "agentCode")
+        private String agentCode;
+        // 操作员代码
+        @JSONField(name = "agreementNo")
+        private String agreementNo;
+
+        public SaleInfoDto(HuaTaiConfigureParameters huaTaiConfigureParameters) {
+            this.agentCode = huaTaiConfigureParameters.getAgentCode();
+            this.agreementNo = huaTaiConfigureParameters.getAgreementNo();
+        }
+
+    }
+}

+ 88 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiSubmitStatusQueryRequest.java

@@ -0,0 +1,88 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/11 09:18
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiSubmitStatusQueryRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 2741182338556977198L;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.SUBMIT);
+    }
+    //机构代码
+    @JsonProperty("loginCom")
+    private String loginCom;
+
+    //操作员代码
+    @JsonProperty("userCode")
+    private String userCode;
+
+    //操作类型代码(1-提交核保;2-查询核保状态)
+    @JsonProperty("operateType")
+    private String operateType;
+
+    //业务信息(列表)
+    @JsonProperty("contractMain")
+    private List<ContractMainDto> contractMain;
+
+    public HuaTaiSubmitStatusQueryRequest (HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters, String operateType){
+        this.loginCom = huaTaiConfigureParameters.getComCode();
+        this.userCode = huaTaiConfigureParameters.getOperatorCode();
+        this.operateType= operateType;
+        this.contractMain = new ArrayList<>();
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo())){
+            this.contractMain.add(new ContractMainDto(huaTaiApiOrder.getJqApplyNo()));
+        }
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())){
+            this.contractMain.add(new ContractMainDto(huaTaiApiOrder.getSyApplyNo()));
+        }
+    }
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ContractMainDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 4756621771965272658L;
+
+        // 业务类型(2-投保)
+        @JsonProperty("businessType")
+        private String businessType;
+        // 报价单号
+        @JsonProperty("contractNo")
+        private String contractNo;
+        // 备注
+        @JsonProperty("remark")
+        private String remark;
+
+        public ContractMainDto(String businessNo) {
+            this.businessType = "2";
+            this.contractNo = businessNo;
+        }
+    }
+}

+ 54 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/request/HuaTaiUploadImageRequest.java

@@ -0,0 +1,54 @@
+package com.jzg.quote.huatai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.constant.HuaTaiTransCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:05
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiUploadImageRequest extends HuaTaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -7987911367874710947L;
+
+    @Override
+    public void setHead(HuaTaiBaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(HuaTaiTransCode.UPLOAD_IMAGE);
+    }
+
+    //支付交易号
+    @JsonProperty("bizNo")
+    private String bizNo;
+
+    //操作员代码
+    @JsonProperty("loginComCode")
+    private String loginComCode;
+
+
+    public HuaTaiUploadImageRequest(HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters){
+        this.loginComCode = huaTaiConfigureParameters.getComCode();
+        if(StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo()) && StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())){
+            this.bizNo = huaTaiApiOrder.getSyApplyNo();
+        }else if(StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo())){
+            this.bizNo = huaTaiApiOrder.getJqApplyNo();
+        }else if(StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())){
+            this.bizNo = huaTaiApiOrder.getSyApplyNo();
+        }
+    }
+
+}

+ 30 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiActualValueResponse.java

@@ -0,0 +1,30 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 实际价值计算接口返回
+ * @author: shenwd
+ * @date: 2025/3/10 11:28
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiActualValueResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -4312164603714389780L;
+
+    //Y	实际价值
+    @JsonProperty("pageNo")
+    private double actualValue;
+    //Y	使用年限
+    @JsonProperty("totalRow")
+    private Integer useYears;
+
+}

+ 23 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiBaseResponse.java

@@ -0,0 +1,23 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseResponseHead;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 09:57
+ **/
+@Data
+public abstract class HuaTaiBaseResponse implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -6348121670625324312L;
+
+    @JsonProperty(value = "head")
+    private HuaTaiBaseResponseHead head;
+
+}

+ 30 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiEncryptRes.java

@@ -0,0 +1,30 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 10:30
+ **/
+@Data
+public class HuaTaiEncryptRes {
+    //合作方代码,由华泰分配
+    @JsonProperty(value = "insuredCode")
+    private String insuredCode;
+
+    //系统来源代码,由华泰分配
+    @JsonProperty(value = "sourceCode")
+    private String sourceCode;
+
+    //业务数据加密串
+    @JsonProperty(value = "busiContent")
+    private String busiContent;
+
+    //请求令牌
+    @JsonProperty(value = "accessToken")
+    private String accessToken;
+
+
+}

+ 370 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiImageInitParamResponse.java

@@ -0,0 +1,370 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/12 09:42
+ **/
+@NoArgsConstructor
+@Data
+public class HuaTaiImageInitParamResponse {
+
+    @JsonProperty("accessKeyVo")
+    private AccessKeyVoDTO accessKeyVo;
+
+    @JsonProperty("appSource")
+    private String appSource;
+
+    @JsonProperty("archType")
+    private String archType;
+
+    @JsonProperty("arriveNotify")
+    private Integer arriveNotify;
+
+    @JsonProperty("bucket")
+    private String bucket;
+
+    @JsonProperty("bussDate")
+    private String bussDate;
+
+    @JsonProperty("bussNo")
+    private String bussNo;
+
+    @JsonProperty("bussType")
+    private String bussType;
+
+    @JsonProperty("bussTypeName")
+    private String bussTypeName;
+
+    @JsonProperty("comCode")
+    private String comCode;
+
+    @JsonProperty("comName")
+    private String comName;
+
+    @JsonProperty("docId")
+    private Integer docId;
+
+    @JsonProperty("documentFile")
+    private String documentFile;
+
+    @JsonProperty("dstKey")
+    private String dstKey;
+
+    @JsonProperty("extendInfo")
+    private Object extendInfo;
+
+    @JsonProperty("imgVersion")
+    private String imgVersion;
+
+    @JsonProperty("initTime")
+    private Long initTime;
+
+    @JsonProperty("maxFileSize")
+    private Integer maxFileSize;
+
+    @JsonProperty("maxShowIdx")
+    private Double maxShowIdx;
+
+    @JsonProperty("maxUnUploadNum")
+    private Integer maxUnUploadNum;
+
+    @JsonProperty("mediaFile")
+    private String mediaFile;
+
+    @JsonProperty("netType")
+    private String netType;
+
+    @JsonProperty("optUserId")
+    private String optUserId;
+
+    @JsonProperty("optUserName")
+    private String optUserName;
+
+    @JsonProperty("pictureFile")
+    private String pictureFile;
+
+    @JsonProperty("riskCode")
+    private String riskCode;
+
+    @JsonProperty("riskCodeName")
+    private String riskCodeName;
+
+    @JsonProperty("showDelete")
+    private Integer showDelete;
+
+    @JsonProperty("showImgType")
+    private Object showImgType;
+
+    @JsonProperty("storageType")
+    private String storageType;
+
+    @JsonProperty("supportFileTypes")
+    private String supportFileTypes;
+
+    @JsonProperty("token")
+    private String token;
+
+    @JsonProperty("typeSelectVos")
+    private List<TypeSelectVosDTO> typeSelectVos;
+
+    @JsonProperty("typeTreeNodeVo")
+    private TypeTreeNodeVoDTO typeTreeNodeVo;
+
+    @JsonProperty("typeTreeNodeVos")
+    private Object typeTreeNodeVos;
+
+    @JsonProperty("uploadNode")
+    private String uploadNode;
+
+    @JsonProperty("uploadedFileList")
+    private List<String> uploadedFileList;
+
+    @JsonProperty("viewShowType")
+    private String viewShowType;
+
+    @JsonProperty("viewType")
+    private String viewType;
+
+    public List<TypeSelectVosDTO.ChildrenDTO> getChildrenDTO() {
+        return this.getTypeSelectVos().stream().map(TypeSelectVosDTO::getChildren).flatMap(List::stream).collect(Collectors.toList());
+    }
+
+    public static TypeSelectVosDTO.ChildrenDTO filteringTypeCode(List<TypeSelectVosDTO.ChildrenDTO> list, String typeCode){
+        return list.stream().filter(x -> x.getTypeCode().equals(typeCode)).collect(Collectors.toList()).get(0);
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AccessKeyVoDTO {
+        @JsonProperty("accessKeyId")
+        private String accessKeyId;
+        @JsonProperty("accessKeySecret")
+        private String accessKeySecret;
+        @JsonProperty("endpoint")
+        private Object endpoint;
+        @JsonProperty("ossRegion")
+        private String ossRegion;
+        @JsonProperty("token")
+        private String token;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TypeTreeNodeVoDTO {
+        @JsonProperty("acceptDragDrop")
+        private Integer acceptDragDrop;
+        @JsonProperty("archType")
+        private String archType;
+        @JsonProperty("bussNo")
+        private String bussNo;
+        @JsonProperty("bussType")
+        private String bussType;
+        @JsonProperty("bussTypeName")
+        private String bussTypeName;
+        @JsonProperty("children")
+        private List<ChildrenDTO> children;
+        @JsonProperty("count")
+        private Integer count;
+        @JsonProperty("docId")
+        private Integer docId;
+        @JsonProperty("docMaxSize")
+        private Integer docMaxSize;
+        @JsonProperty("label")
+        private String label;
+        @JsonProperty("limitSumCount")
+        private Integer limitSumCount;
+        @JsonProperty("lockFlag")
+        private Integer lockFlag;
+        @JsonProperty("medMaxSize")
+        private Integer medMaxSize;
+        @JsonProperty("nodeType")
+        private String nodeType;
+        @JsonProperty("parentTypeCode")
+        private Object parentTypeCode;
+        @JsonProperty("picMaxSize")
+        private Integer picMaxSize;
+        @JsonProperty("picQuality")
+        private Integer picQuality;
+        @JsonProperty("readable")
+        private Integer readable;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("riskCodeName")
+        private String riskCodeName;
+        @JsonProperty("typeCode")
+        private String typeCode;
+        @JsonProperty("typePath")
+        private Object typePath;
+        @JsonProperty("typePathName")
+        private Object typePathName;
+        @JsonProperty("writable")
+        private Integer writable;
+
+        @NoArgsConstructor
+        @Data
+        public static class ChildrenDTO {
+            @JsonProperty("acceptDragDrop")
+            private Integer acceptDragDrop;
+            @JsonProperty("archType")
+            private Object archType;
+            @JsonProperty("bussNo")
+            private Object bussNo;
+            @JsonProperty("bussType")
+            private Object bussType;
+            @JsonProperty("bussTypeName")
+            private Object bussTypeName;
+            @JsonProperty("children")
+            private Object children;
+            @JsonProperty("count")
+            private Integer count;
+            @JsonProperty("docId")
+            private Object docId;
+            @JsonProperty("docMaxSize")
+            private Integer docMaxSize;
+            @JsonProperty("label")
+            private String label;
+            @JsonProperty("limitSumCount")
+            private Integer limitSumCount;
+            @JsonProperty("lockFlag")
+            private Integer lockFlag;
+            @JsonProperty("medMaxSize")
+            private Integer medMaxSize;
+            @JsonProperty("nodeType")
+            private String nodeType;
+            @JsonProperty("parentTypeCode")
+            private String parentTypeCode;
+            @JsonProperty("picMaxSize")
+            private Integer picMaxSize;
+            @JsonProperty("picQuality")
+            private Integer picQuality;
+            @JsonProperty("readable")
+            private Integer readable;
+            @JsonProperty("riskCode")
+            private Object riskCode;
+            @JsonProperty("riskCodeName")
+            private Object riskCodeName;
+            @JsonProperty("typeCode")
+            private String typeCode;
+            @JsonProperty("typePath")
+            private Object typePath;
+            @JsonProperty("typePathName")
+            private Object typePathName;
+            @JsonProperty("writable")
+            private Integer writable;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TypeSelectVosDTO {
+        @JsonProperty("acceptDragDrop")
+        private Integer acceptDragDrop;
+        @JsonProperty("archType")
+        private String archType;
+        @JsonProperty("bussNo")
+        private String bussNo;
+        @JsonProperty("bussType")
+        private String bussType;
+        @JsonProperty("bussTypeName")
+        private String bussTypeName;
+        @JsonProperty("children")
+        private List<ChildrenDTO> children;
+        @JsonProperty("count")
+        private Integer count;
+        @JsonProperty("docId")
+        private Integer docId;
+        @JsonProperty("docMaxSize")
+        private Integer docMaxSize;
+        @JsonProperty("label")
+        private String label;
+        @JsonProperty("limitSumCount")
+        private Integer limitSumCount;
+        @JsonProperty("lockFlag")
+        private Integer lockFlag;
+        @JsonProperty("medMaxSize")
+        private Integer medMaxSize;
+        @JsonProperty("nodeType")
+        private String nodeType;
+        @JsonProperty("parentTypeCode")
+        private String parentTypeCode;
+        @JsonProperty("picMaxSize")
+        private Integer picMaxSize;
+        @JsonProperty("picQuality")
+        private Integer picQuality;
+        @JsonProperty("readable")
+        private Integer readable;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("riskCodeName")
+        private String riskCodeName;
+        @JsonProperty("typeCode")
+        private String typeCode;
+        @JsonProperty("typePath")
+        private String typePath;
+        @JsonProperty("typePathName")
+        private String typePathName;
+        @JsonProperty("writable")
+        private Integer writable;
+
+        @NoArgsConstructor
+        @Data
+        public static class ChildrenDTO {
+            @JsonProperty("acceptDragDrop")
+            private Integer acceptDragDrop;
+            @JsonProperty("archType")
+            private String archType;
+            @JsonProperty("bussNo")
+            private String bussNo;
+            @JsonProperty("bussType")
+            private String bussType;
+            @JsonProperty("bussTypeName")
+            private String bussTypeName;
+            @JsonProperty("children")
+            private Object children;
+            @JsonProperty("count")
+            private Integer count;
+            @JsonProperty("docId")
+            private Integer docId;
+            @JsonProperty("docMaxSize")
+            private Integer docMaxSize;
+            @JsonProperty("label")
+            private String label;
+            @JsonProperty("limitSumCount")
+            private Integer limitSumCount;
+            @JsonProperty("lockFlag")
+            private Integer lockFlag;
+            @JsonProperty("medMaxSize")
+            private Integer medMaxSize;
+            @JsonProperty("nodeType")
+            private String nodeType;
+            @JsonProperty("parentTypeCode")
+            private String parentTypeCode;
+            @JsonProperty("picMaxSize")
+            private Integer picMaxSize;
+            @JsonProperty("picQuality")
+            private Integer picQuality;
+            @JsonProperty("readable")
+            private Integer readable;
+            @JsonProperty("riskCode")
+            private String riskCode;
+            @JsonProperty("riskCodeName")
+            private String riskCodeName;
+            @JsonProperty("typeCode")
+            private String typeCode;
+            @JsonProperty("typePath")
+            private String typePath;
+            @JsonProperty("typePathName")
+            private String typePathName;
+            @JsonProperty("writable")
+            private Integer writable;
+        }
+    }
+}

+ 54 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiInsurancePolicyPrintResponse.java

@@ -0,0 +1,54 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:19
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiInsurancePolicyPrintResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 1100205214349474105L;
+
+    //保批单登记结果
+    @JsonProperty("registResult")
+    private String registResult;
+
+    //下载地址(列表)
+    @JsonProperty("registResult")
+    private List<ElecDownLoadResultDto> elecDownLoadResultList;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ElecDownLoadResultDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -3868171183795201703L;
+
+        //
+        @JsonProperty("bzDownFlag")
+        private String bzDownFlag;
+
+        // 电子保单下载链接
+        @JsonProperty("downURL")
+        private String downURL;
+
+        //
+        @JsonProperty("previewTotalPage")
+        private String previewTotalPage;
+    }
+}

+ 107 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiModelsQueryResponse.java

@@ -0,0 +1,107 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.entity.vo.quote.CoreModelsVo;
+import com.jzg.quotation.commons.filter.CarModelsFilter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 车型查询返回
+ * @author: shenwd
+ * @date: 2025/3/10 11:01
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiModelsQueryResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 9154713817439073126L;
+
+    @JsonProperty("pageNo")
+    private Integer pageNo;
+
+    @JsonProperty("carModel")
+    private List<CarModelDto> carModel;
+
+    @JsonProperty("totalRow")
+    private Integer totalRow;
+
+    @NoArgsConstructor
+    @Data
+    public static class CarModelDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 3138285940280359512L;
+
+        @JsonProperty("fullCarData")
+        private FullCarDataDto fullCarData;
+
+        @NoArgsConstructor
+        @Data
+        public static class FullCarDataDto implements Serializable, CarModelsFilter {
+
+            @Serial
+            private static final long serialVersionUID = 5819430508868233287L;
+
+            //Y	核定载质量(单位:吨)
+            @JsonProperty("approvedLoad")
+            private Integer approvedLoad;
+            //Y	核定载客人数
+            @JsonProperty("approvedPassengersCapacity")
+            private Integer approvedPassengersCapacity;
+            //Y	排量(单位:毫升)
+            @JsonProperty("displacement")
+            private double displacement;
+            //Y	系统车型编码
+            @JsonProperty("localModelCode")
+            private String localModelCode;
+            //Y	行业车型编码
+            @JsonProperty("modelCode")
+            private String modelCode;
+            //Y	厂牌型号
+            @JsonProperty("modelName")
+            private String modelName;
+            //Y	新车购置价
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+            //String	CY	能源种类
+            @JsonProperty("energyTypes")
+            private String energyTypes;
+            //CY	整备质量
+            @JsonProperty("unladenMass")
+            private String unladenMass;
+            //CY	上市年份(格式:YYYYMM)
+            @JsonProperty("carYear")
+            private String carYear;
+
+            public CoreModelsVo toCoreModelsVo(){
+                CoreModelsVo coreModelsVo = new CoreModelsVo();
+                coreModelsVo.setModelCode(this.modelCode);
+                coreModelsVo.setModelName(this.modelName);
+                coreModelsVo.setCarYear(this.carYear);
+                coreModelsVo.setEnginedesc(String.valueOf(this.displacement));
+                coreModelsVo.setPurchasePrice(this.purchasePrice);
+                coreModelsVo.setSeatCount(String.valueOf(this.approvedPassengersCapacity));
+                return coreModelsVo;
+            }
+
+            @Override
+            public String getCarYear() {
+                return carYear;
+            }
+
+            @Override
+            public String getPurchasePrice() {
+                return String.valueOf(purchasePrice);
+            }
+        }
+    }
+
+}

+ 78 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiOrderStatusResponse.java

@@ -0,0 +1,78 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:07
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiOrderStatusResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -6345183941811068925L;
+
+    //支付明细
+    @JsonProperty("payDetaiList")
+    private List<PayDetaiDto> payDetaiList;
+
+    //支付交易号
+    @JsonProperty("poaCode")
+    private String poaCode;
+
+    //POS交易流水号
+    @JsonProperty("transSerialNo")
+    private String transSerialNo;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class PayDetaiDto implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -5737638693567759366L;
+
+        // 报价单号
+        @JsonProperty("bUSINESSNO")
+        private String bUSINESSNO;
+
+        // 失败原因
+        @JsonProperty("fAILREASON")
+        private String fAILREASON;
+
+        // 失败原因代码
+        @JsonProperty("fAILREASONCODE")
+        private String fAILREASONCODE;
+
+        // 车牌号
+        @JsonProperty("lICENSENO")
+        private String lICENSENO;
+
+        // 保单号
+        @JsonProperty("pOLICYNO")
+        private String pOLICYNO;
+
+        // 保单状态(0-生成失败;1-生成成功)
+        @JsonProperty("pOLICYSTATUS")
+        private String pOLICYSTATUS;
+
+        // 平台确认结果(0-失败;1-成功)
+        @JsonProperty("vALUEFLAG")
+        private String vALUEFLAG;
+
+        // 险种代码(仅返回车险险种代码)
+        @JsonProperty("riskCode")
+        private String riskCode;
+    }
+}

+ 28 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiPaymentLogoutResponse.java

@@ -0,0 +1,28 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:11
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class HuaTaiPaymentLogoutResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -152387356383101236L;
+
+    /**
+     * 报价单号(列表)
+     */
+    @JsonProperty("contractNo")
+    private List<String> contractNo;
+
+}

+ 58 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiPaymentUrlResponse.java

@@ -0,0 +1,58 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:14
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiPaymentUrlResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 3363165318522518432L;
+
+    //短信发送结果(列表)
+    @JsonProperty("business")
+    private List<Business> business;
+
+    //电子投保单分享链接
+    @JsonProperty("messageUrl")
+    private String messageUrl;
+
+    //支付链接
+    @JsonProperty("payUrl")
+    private String payUrl;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class Business implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 3064172002527432885L;
+
+        // 报价单号--投保单改为报价单
+        @JsonProperty("businessNo")
+        private String businessNo;
+
+        // 手机实名校验信息(确认字段含义)
+        @JsonProperty("phoneRealNameMsg")
+        private String phoneRealNameMsg;
+
+        // 短信发送结果(1-发送成功)
+        @JsonProperty("validStatus")
+        private String validStatus;
+    }
+}

+ 297 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiQuotedPriceResponse.java

@@ -0,0 +1,297 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.util.StringUtils;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 11:36
+ **/
+@NoArgsConstructor
+@Data
+public class HuaTaiQuotedPriceResponse extends HuaTaiBaseResponse {
+
+    //Y	投保单信息
+    @JsonProperty("businessData")
+    private BusinessDataDto businessData;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class BusinessDataDto implements Serializable {
+
+        private static final long serialVersionUID = 204528161258466544L;
+        //投保险别信息列表
+        @JsonProperty("contract")
+        private List<ContractDto> contract;
+    }
+
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class ContractDto implements Serializable{
+        private static final long serialVersionUID = -8141574495483504299L;
+        //Y	投保险别主信息
+        @JsonProperty("contractMain")
+        private ContractMainDto contractMain;
+        //Y	险别信息(列表)
+        @JsonProperty("coverage")
+        private List<CoverageDto> coverage;
+        //Y	平台交互信息
+        @JsonProperty("platFormMessage")
+        private PlatFormMessageDto platFormMessage;
+        //CY	车船税信息
+        @JsonProperty("tax")
+        private TaxDto tax;
+        //CY	充电桩信息(列表)
+        @JsonProperty("ChargingPost")
+        private List<ChargingPostDto> chargingPost;
+
+        @NoArgsConstructor
+        @Data
+        public static class ContractMainDto implements Serializable{
+            private static final long serialVersionUID = 1697439760193401733L;
+            //Y	报价单号
+            @JsonProperty("contractNo")
+            private String contractNo;
+            //Y	终保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("expiryDate")
+            private String expiryDate;
+            //Y	起保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("validDate")
+            private String validDate;
+            //Y	参见险种代码
+            @JsonProperty("riskCode")
+            private String riskCode;
+            //Y	总浮动系数
+            @JsonProperty("totalAdjustRate")
+            private double totalAdjustRate;
+            //Y	总签单保费
+            @JsonProperty("totalPremium")
+            private double totalPremium;
+            //Y	核保业务品质
+            @JsonProperty("category")
+            private String category;
+        }
+        @NoArgsConstructor
+        @Data
+        public static class CoverageDto implements Serializable{
+            private static final long serialVersionUID = -5558633804113575096L;
+            //Y	总浮动系数
+            @JsonProperty("coverageAdjustRate")
+            private double coverageAdjustRate;
+            //Y	险别签单保费
+            @JsonProperty("coveragePremium")
+            private double coveragePremium;
+            //Y	终保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("expiryDate")
+            private Date expiryDate;
+            //Y	起保日期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("validDate")
+            private Date validDate;
+            //Y	险别代码
+            @JsonProperty("kindCode")
+            private String kindCode;
+            //Y	险别名称
+            @JsonProperty("kindName")
+            private String kindName;
+            //CY	单位保额(传值参见险别代码)
+            @JsonProperty("unitAmount")
+            private String unitAmount;
+            //CY	数量
+            @JsonProperty("quantity")
+            private String quantity;
+            //CY	服务次数(传值参见险别代码)
+            @JsonProperty("serviceTimes")
+            private String serviceTimes;
+            //CY	免赔率(传值参见险别代码)
+            @JsonProperty("deductibleRate")
+            private String deductibleRate;
+            //CY	可选免赔额(传值参见险别代码)
+            @JsonProperty("deductible")
+            private String deductible;
+            //Y	不含税保费
+            @JsonProperty("premExcludeVAT")
+            private String premExcludeVAT;
+            //Y	增值税
+            @JsonProperty("vAT")
+            private String vAT;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class PlatFormMessageDto implements Serializable {
+            private static final long serialVersionUID = 6009071402390966463L;
+            //CY	平台查询码
+            @JsonProperty("querySequenceNo")
+            private String querySequenceNo;
+            //CY	平台查询码(获取上年保单信息)
+            @JsonProperty("querySequenceNoForBiRe")
+            private String querySequenceNoForBiRe;
+            //CY	平台校验图片转码
+            @JsonProperty("checkCode")
+            private String checkCode;
+            //CY	平台校验图片转码(获取上年保单信息)
+            @JsonProperty("checkCodeForBiRe")
+            private String checkCodeForBiRe;
+            //CY	平台车型精准服务信息(如果报价返回,则需要前台展示车型信息,选择其中一个以后,重新查车、计算实际价值、并再次报价)
+            @JsonProperty("accurateServiceInfo")
+            private List<AccurateServiceInfoDto> accurateServiceInfo;
+            //CY	平台重复投保提示信息(如果报价返回,则需要前台展示,选择对应车型后重新保费计算)
+            @JsonProperty("reInsureMsg")
+            private String reInsureMsg;
+
+            public String getCheckCode() {
+                if(StringUtils.isNotEmpty(checkCode)){
+                    return checkCode.replace("\n", "");
+                }
+                return checkCode;
+            }
+        }
+        @NoArgsConstructor
+        @Data
+        public static class AccurateServiceInfoDto implements Serializable{
+            private static final long serialVersionUID = -3637136496580082363L;
+            //Y	上市年份
+            @JsonProperty("carYear")
+            private String carYear;
+            //Y	排量(单位:升)
+            @JsonProperty("displacement")
+            private String displacement;
+            //Y	系统车型编码
+            @JsonProperty("modelCode")
+            private String modelCode;
+            //Y	推荐标识(1-推荐;0-无标识)
+            @JsonProperty("modelFlag")
+            private String modelFlag;
+            //Y	厂牌型号
+            @JsonProperty("modelName")
+            private String modelName;
+            //Y	新车购置价
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+            //Y	备注
+            @JsonProperty("remark")
+            private String remark;
+            //Y	核定载客
+            @JsonProperty("seatCount")
+            private String seatCount;
+            //Y	核定载质量
+            @JsonProperty("tonCount")
+            private String tonCount;
+            //Y	行业车型编码
+            @JsonProperty("vehicleCode")
+            private String vehicleCode;
+        }
+        @NoArgsConstructor
+        @Data
+        public static class TaxDto implements Serializable{
+            private static final long serialVersionUID = -5447178202141350948L;
+            //Y	合计金额
+            @JsonProperty("sumTax")
+            private double sumTax;
+            //Y	参见纳税类型代码
+            @JsonProperty("taxConditionCode")
+            private String taxConditionCode;
+            //Y	缴税起期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("taxStartDate")
+            private Date taxStartDate;
+            //Y	缴税止期(格式:YYYY-MM-DD HH24:MI:SS)
+            @JsonProperty("taxEndDate")
+            private String taxEndDate;
+            //CY	开具完税凭证地区代码
+            @JsonProperty("taxLocationCode")
+            private String taxLocationCode;
+            //CY	开具税务机关代码
+            @JsonProperty("TaxDepartmentCode")
+            private String TaxDepartmentCode;
+            //CY	开具税务机关名称
+            @JsonProperty("taxDepartment")
+            private String taxDepartment;
+            //CY	纳税人识别号
+            @JsonProperty("taxPayerIdentificationCode")
+            private String taxPayerIdentificationCode;
+            //CY	纳税人名称
+            @JsonProperty("taxPayerName")
+            private String taxPayerName;
+            //CY	减税/免税/完税凭证号(减税、免税、完税必传)
+            @JsonProperty("documentNumber")
+            private String documentNumber;
+            //CY	参见减免原因代码
+            @JsonProperty("deductionDueCode")
+            private String deductionDueCode;
+            //CY	减免方案代码(1-按金额减免;2-按比例减免)
+            @JsonProperty("deductionDueType")
+            private String deductionDueType;
+            //CY	减免比例(单位:%)
+            @JsonProperty("deductionDueProportion")
+            private double deductionDueProportion;
+            //CY	减免金额(单位:元)
+            @JsonProperty("deduction")
+            private double deduction;
+            //CY	前次缴税年度
+            @JsonProperty("lastPaidYear")
+            private int lastPaidYear;
+            //CY	年单位税额
+            @JsonProperty("annualTaxAmount")
+            private String annualTaxAmount;
+            //CY	单位数量
+            @JsonProperty("unit")
+            private String unit;
+            //CY	当年应缴
+            @JsonProperty("annualTaxDue")
+            private double annualTaxDue;
+            //CY	往年补缴
+            @JsonProperty("sumTaxDefault")
+            private double sumTaxDefault;
+            //CY	滞纳金
+            @JsonProperty("sumOverdue")
+            private double sumOverdue;
+            //CY	滞纳天数
+            @JsonProperty("exceedDaysCount")
+            private int exceedDaysCount;
+
+        }
+        @NoArgsConstructor
+        @Data
+        public static class ChargingPostDto implements Serializable{
+            private static final long serialVersionUID = -1914275609505968266L;
+            //Y	险种代码
+            @JsonProperty("riskCode")
+            private String riskCode;
+            //Y	险别代码
+            @JsonProperty("kindCode")
+            private String kindCode;
+            //Y	充电桩型号
+            @JsonProperty("chargingPostType")
+            private String chargingPostType;
+            //Y	充电桩编码
+            @JsonProperty("chargingPostCode")
+            private String chargingPostCode;
+            //Y	保险金额/赔偿限额
+            @JsonProperty("amount")
+            private String amount;
+            //Y	保费/储金(含税)
+            @JsonProperty("premium")
+            private String premium;
+            //Y	增值税金额
+            @JsonProperty("vat")
+            private String vat;
+            //Y	签单保费(不含税)
+            @JsonProperty("premExcludeVat")
+            private String premExcludeVat;
+            //Y	充电桩序号(1开始,自动递增)
+            @JsonProperty("itemNo")
+            private String itemNo;
+        }
+    }
+}

+ 89 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiSubmitResponse.java

@@ -0,0 +1,89 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/10 18:30
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiSubmitResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -3010051705836127516L;
+
+    //合同列表
+    @JsonProperty("appliResult")
+    private List<AppliResult> appliResult;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class AppliResult implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 321461000635353819L;
+
+        // 报价单号
+        @JsonProperty("contractNo")
+        private String contractNo;
+        // 审核列表
+        @JsonProperty("notion")
+        private List<Notion> notion;
+        // 参见核保状态代码
+        @JsonProperty("status")
+        private String status;
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class Notion implements Serializable{
+
+        private static final long serialVersionUID = 9128291340725273264L;
+        // 审核意见
+        @JsonProperty("uWNotion")
+        private String uWNotion;
+        // 处理方式
+        @JsonProperty("uWResult")
+        private String uWResult;
+        // 业务类型
+        @JsonProperty("uWType")
+        private String uWType;
+        //
+        @JsonProperty("cellPhone")
+        private String cellPhone;
+        //
+        @JsonProperty("relationNo")
+        private String relationNo;
+        //
+        @JsonProperty("serialNumber")
+        private String serialNumber;
+        //
+        @JsonProperty("underWirteMessage")
+        private String underWirteMessage;
+        //
+        @JsonProperty("underWriteMessagePpcf")
+        private String underWriteMessagePpcf;
+        //
+        @JsonProperty("underWriteMessageToperson")
+        private String underWriteMessageToperson;
+        //
+        @JsonProperty("underWriteMessageToreview")
+        private String underWriteMessageToreview;
+        //
+        @JsonProperty("underWriteNewDataValidMSG")
+        private String underWriteNewDataValidMSG;
+    }
+}

+ 64 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiSubmitStatusQueryResponse.java

@@ -0,0 +1,64 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:17
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiSubmitStatusQueryResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -7751676526348464226L;
+
+    //处理结果
+    @JsonProperty("appliResult")
+    private List<AppliResult> appliResult;
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class AppliResult implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -146734866363568646L;
+
+        // 报价单号
+        @JsonProperty("contractNo")
+        private String contractNo;
+        // 核保信息
+        @JsonProperty("notion")
+        private List<Notion> notion;
+        // 应收金额汇总(含税)
+        @JsonProperty("planFee")
+        private String planFee;
+        // 核保状态代码(操作类型为1); 审核状态代码(操作类型为2)
+        @JsonProperty("underWriteFlag")
+        private String underWriteFlag;
+    }
+
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Data
+    public static class Notion implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = 6843175989578479753L;
+
+        // 核保信息
+        @JsonProperty("uWNotion")
+        private String uWNotion;
+    }
+}

+ 27 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/response/HuaTaiUploadImageResponse.java

@@ -0,0 +1,27 @@
+package com.jzg.quote.huatai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 09:04
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class HuaTaiUploadImageResponse extends HuaTaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 1888079292206632844L;
+
+    //上传影像的地址
+    @JsonProperty("url")
+    private String url;
+
+}

+ 33 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/entity/vo/InsHuataiContributingVo.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.huatai.api.entity.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 华泰特约实体
+ * @author: shenwd
+ * @date: 2025/3/11 08:31
+ **/
+@Data
+//@ApiModel("华泰特约实体")
+public class InsHuataiContributingVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -6210625689251510084L;
+
+    //    @ApiModelProperty("险种代码")
+    private String riskCode;
+
+//    @ApiModelProperty("特约编码")
+    private String engageCode;
+
+//    @ApiModelProperty("特约名称")
+    private String engageTitle;
+
+//    @ApiModelProperty("特约内容")
+    private String engageDetail;
+
+
+}

+ 34 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/properties/HuaTaiApiConfigurationProperties.java

@@ -0,0 +1,34 @@
+package com.jzg.quote.huatai.api.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 华泰API对接参数
+ * @author: shenwd
+ * @date: 2025/3/10 09:40
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "huatai.api")
+public class HuaTaiApiConfigurationProperties {
+
+    //华泰请求API地址
+    private String baseUrl;
+    //我司提供RSA公钥
+    private String selfPublicKey;
+    //我司自用RSA私钥
+    private String selfPrivateKey;
+    // 华泰RSA公钥
+    private String huaTaiPublicKey;
+    //系统来源代码,由华泰分配
+    private String sourceCode;
+    // 华泰key
+    private String huaTaiKey;
+    // 我司key
+    private String key;
+    // 获取 token url
+    private String tokenUrl;
+
+}

+ 16 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/repository/HuaTaiApiOrderRepository.java

@@ -0,0 +1,16 @@
+package com.jzg.quote.huatai.api.repository;
+
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/11 10:49
+ **/
+public interface HuaTaiApiOrderRepository extends MongoRepository<HuaTaiApiOrder, String> {
+
+    @Query("{'ordersNo' : ?0}")
+    HuaTaiApiOrder findByOrdersNo(String ordersNo);
+}

+ 15 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/HuaTaiApiOrderService.java

@@ -0,0 +1,15 @@
+package com.jzg.quote.huatai.api.service;
+
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+
+/**
+ * @description: 华泰财险 mongodb中操作数据
+ * @author: shenwd
+ * @date: 2025/3/11 10:51
+ **/
+public interface HuaTaiApiOrderService {
+
+    HuaTaiApiOrder findByOrdersNo(String ordersNo);
+
+    HuaTaiApiOrder save(HuaTaiApiOrder huaTaiApiOrder);
+}

+ 38 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/Impl/HuaTaiApiOrderServiceImpl.java

@@ -0,0 +1,38 @@
+package com.jzg.quote.huatai.api.service.Impl;
+
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.repository.HuaTaiApiOrderRepository;
+import com.jzg.quote.huatai.api.service.HuaTaiApiOrderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/11 10:54
+ **/
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class HuaTaiApiOrderServiceImpl implements HuaTaiApiOrderService {
+
+    private final HuaTaiApiOrderRepository huaTaiApiOrderRepository;
+    /**
+     * @param ordersNo
+     * @return
+     */
+    @Override
+    public HuaTaiApiOrder findByOrdersNo(String ordersNo) {
+        return huaTaiApiOrderRepository.findByOrdersNo(ordersNo);
+    }
+
+    /**
+     * @param huaTaiApiOrder
+     * @return
+     */
+    @Override
+    public HuaTaiApiOrder save(HuaTaiApiOrder huaTaiApiOrder) {
+        return huaTaiApiOrderRepository.save(huaTaiApiOrder);
+    }
+}

+ 246 - 4
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/service/Impl/HuaTaiApiRequestImpl.java

@@ -1,18 +1,47 @@
 package com.jzg.quote.huatai.api.service.Impl;
 
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.vo.quote.AttributionInformationVo;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quote.huatai.api.build.HuaTaiApiQuoteResultsVoBuild;
+import com.jzg.quote.huatai.api.component.HuaTaiRequestApiComponent;
+import com.jzg.quote.huatai.api.constant.enums.HuaTaiRiskCode;
+import com.jzg.quote.huatai.api.entity.HuaTaiApiOrder;
+import com.jzg.quote.huatai.api.entity.HuaTaiBaseRequestHead;
+import com.jzg.quote.huatai.api.entity.HuaTaiConfigureParameters;
+import com.jzg.quote.huatai.api.entity.request.*;
+import com.jzg.quote.huatai.api.entity.response.*;
+import com.jzg.quote.huatai.api.entity.vo.InsHuataiContributingVo;
+import com.jzg.quote.huatai.api.properties.HuaTaiApiConfigurationProperties;
+import com.jzg.quote.huatai.api.service.HuaTaiApiOrderService;
 import com.jzg.quote.huatai.api.service.HuaTaiApiRequest;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
- * @description:
+ * @description: 华泰财险
  * @author: shenwd
  * @date: 2025/3/10 09:24
  **/
+@Service(value = InsuranceCode.INSURANCE_HTIC)
+@RequiredArgsConstructor
 public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
+    private final HuaTaiRequestApiComponent huataiRequestApiComponent;
+
+    private final HuaTaiApiOrderService huaTaiApiOrderService;
     /**
      * 报价
      *
@@ -21,7 +50,68 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
      */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
-        return null;
+        OrderBase orderBase = quoteVo.getOrder();
+        //配置信息
+        HuaTaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
+        HuaTaiBaseRequestHead baseRequestHead = new HuaTaiBaseRequestHead(parameters);
+
+        //查询车型
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        HuaTaiModelsQueryRequest huaTaiModelsQueryRequest = new HuaTaiModelsQueryRequest(carInfoVo);
+        huaTaiModelsQueryRequest.setHead(baseRequestHead);
+        huaTaiModelsQueryRequest.setLoginCom(parameters.getComCode());
+        huaTaiModelsQueryRequest.setAgentCode(parameters.getAgentCode());
+        List<HuaTaiModelsQueryResponse.CarModelDto> carModelDtos = huataiRequestApiComponent.modelQuery(huaTaiModelsQueryRequest,
+                HuaTaiModelsQueryResponse.class, parameters.getInsuredCode());
+        List<HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto> fullCarDataDtos = new ArrayList<>();
+        for (HuaTaiModelsQueryResponse.CarModelDto carModelDto : carModelDtos) {
+            fullCarDataDtos.add(carModelDto.getFullCarData());
+        }
+        // 2.2 过滤车型
+        HuaTaiModelsQueryResponse.CarModelDto.FullCarDataDto fullCarDataDto = CarModelsFilterUtils.to(fullCarDataDtos, carInfoVo);
+        //获取车辆实际价值
+        HuaTaiActualValueResponse actualValueResponse = null;
+        RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();//商业险
+        if (biRiskInfoVo != null) {
+                String startDate = biRiskInfoVo.getStartDate();
+                HuaTaiActualValueRequest huaTaiActualValueRequest = new HuaTaiActualValueRequest(carInfoVo, fullCarDataDto, startDate,
+                        parameters.getComCode());
+                huaTaiActualValueRequest.setHead(baseRequestHead);
+                actualValueResponse = huataiRequestApiComponent.actualValue(huaTaiActualValueRequest, HuaTaiActualValueResponse.class, parameters.getInsuredCode());
+        }
+        //组装报价参数
+        HuaTaiQuotedPriceRequest quotedPriceRequest = new HuaTaiQuotedPriceRequest(quoteVo, fullCarDataDto, actualValueResponse,
+                quoteVo.getAccidentalDrivings().get(0), parameters);
+        quotedPriceRequest.setHead(baseRequestHead);
+        //调用报价接口
+        HuaTaiQuotedPriceResponse quotedPriceResponse = huataiRequestApiComponent.quotedPrice(quotedPriceRequest,
+                HuaTaiQuotedPriceResponse.class,  parameters.getInsuredCode());
+
+        QuoteResultsVo quoteResultsVo = HuaTaiApiQuoteResultsVoBuild.buildQuoteResultsVo(orderBase.getOrdersNo(), quoteVo, quotedPriceResponse);
+        //数据保存到mongodb,后续接口需要的数据
+        HuaTaiApiOrder huaTaiApiOrder = new HuaTaiApiOrder();
+        huaTaiApiOrder.setOrdersNo(orderBase.getOrdersNo());
+        //设置商业险数据
+        HuaTaiQuotedPriceResponse.ContractDto biContractDto = HuaTaiApiQuoteResultsVoBuild.getBiContractDto(quotedPriceResponse);
+        huaTaiApiOrder.setSyQuerySequenceNo(biContractDto.getPlatFormMessage().getQuerySequenceNo());
+        huaTaiApiOrder.setSyApplyNo(biContractDto.getContractMain().getContractNo());
+        huaTaiApiOrder.setSyPremium(String.valueOf(biContractDto.getContractMain().getTotalPremium()));
+
+        //设置交强险数据
+        HuaTaiQuotedPriceResponse.ContractDto ciContractDto = HuaTaiApiQuoteResultsVoBuild.getCiContractDto(quotedPriceResponse);
+        huaTaiApiOrder.setJqQuerySequenceNo(ciContractDto.getPlatFormMessage().getQuerySequenceNo());
+        huaTaiApiOrder.setJqApplyNo(ciContractDto.getContractMain().getContractNo());
+        huaTaiApiOrder.setJqPremium(String.valueOf(ciContractDto.getContractMain().getTotalPremium()));
+
+        huaTaiApiOrder.setOwnersInfo(quoteVo.getOwnersInfo());
+        huaTaiApiOrder.setPolicyHolderInfo(quoteVo.getPolicyHolderInfo());
+        huaTaiApiOrder.setInsuredPersonInfo(quoteVo.getInsuredPersonInfo());
+        huaTaiApiOrder.setCiRiskInfoVo(quoteResultsVo.getCiRiskInfoVo());
+        huaTaiApiOrder.setBiRiskInfoVo(quoteResultsVo.getBiRiskInfoVo());
+
+        huaTaiApiOrderService.save(huaTaiApiOrder);
+
+        return quoteResultsVo;
     }
 
     /**
@@ -31,6 +121,95 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
      */
     @Override
     public void underwriting(UnderwritingVo underwritingVo) {
+        OrderBase orderBase = underwritingVo.getOrder();
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        //配置信息
+        HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        //调用转投保接口
+        List<InsHuataiContributingVo> engageList = new ArrayList<>();//报价接口未返回特约信息
+        HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        HuaTaiSubmitRequest submitRequest = new HuaTaiSubmitRequest(huaTaiApiOrder, huaTaiParameters, engageList);
+        submitRequest.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
+        HuaTaiSubmitResponse submitResponse = huataiRequestApiComponent.submit(submitRequest, HuaTaiSubmitResponse.class, huaTaiParameters.getInsuredCode());
+
+        if ("-1".equals(submitResponse.getHead().getReturnCode())) {
+            throw new SystemException(submitResponse.getHead().getReturnMessage());
+        }
+        /**
+         * 0	下发修改
+         * 1	转人工
+         * 3	转复核
+         * 4	自核通过
+         * 6	强制下发
+         * 7	强制自核
+         * 9	自核异常
+         */
+        boolean haveJQFlag = false;
+        boolean haveSYFlag = false;
+        String jqStatus = "";
+        String syStatus = "";
+        StringBuffer jqNotion = new StringBuffer();
+        StringBuffer syNotion = new StringBuffer();
+        for (HuaTaiSubmitResponse.AppliResult appliResult : submitResponse.getAppliResult()) {
+            appliResult.getStatus();
+            if (StringUtils.isNotEmpty(huaTaiApiOrder.getJqApplyNo())) {
+                haveJQFlag = true;
+                if (huaTaiApiOrder.getJqApplyNo().equals(appliResult.getContractNo())) {
+                    jqStatus = appliResult.getStatus();
+                    for (HuaTaiSubmitResponse.Notion notion : appliResult.getNotion()) {
+                        jqNotion.append(notion.getUWNotion() + "</br>");
+                    }
+                }
+            }
+            if (StringUtils.isNotEmpty(huaTaiApiOrder.getSyApplyNo())) {
+                haveSYFlag = true;
+                if (huaTaiApiOrder.getSyApplyNo().equals(appliResult.getContractNo())) {
+                    syStatus = appliResult.getStatus();
+                    for (HuaTaiSubmitResponse.Notion notion : appliResult.getNotion()) {
+                        syNotion.append(notion.getUWNotion() + "</br>");
+                    }
+                }
+            }
+        }
+        String totalStatus = "";
+        //同保交商
+        if (haveJQFlag && haveSYFlag) {
+            //自核通过 和 强制自核
+            if ("4,7".contains(jqStatus) && "4,7".contains(syStatus)) {
+                totalStatus = "4";
+            }
+            //转人工和转复核
+            if ("1,3".contains(jqStatus) || "1,3".contains(syStatus)) {
+                totalStatus = "1";
+            }
+            if ("0,6,7".contains(jqStatus) || "0,6,7".contains(syStatus)) {
+                totalStatus = "0";
+            }
+        } else {//单保交强或单保商业
+
+            String status = jqStatus;
+            if (StringUtils.isNotEmpty(syStatus)) {
+                status = syStatus;
+            }
+
+            if ("4,7".contains(status)) {
+                totalStatus = "4";
+            } else if ("1,3".contains(status)) {
+                totalStatus = "1";
+            } else if ("0,6,7".contains(status)) {
+                totalStatus = "0";
+            }
+        }
+
+        if ("4".equals(totalStatus)) {
+            //再调用缴费接口获取缴费链接
+            //return getPayURL(insAreaCompany, huaTaiConfigureParameters);
+        } else if ("1".equals(totalStatus)) {
+            //调用提交核保接口
+            HuaTaiSubmitStatusQueryResponse huaTaiSubmitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "1");
+
+        }
 
     }
 
@@ -41,7 +220,21 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
      */
     @Override
     public String getPaymentLink(OrderBase orderBase) {
-        return "";
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        //配置信息
+        HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        HuaTaiPaymentUrlRequest huaTaiPaymentUrlRequest = new HuaTaiPaymentUrlRequest(huaTaiApiOrder, huaTaiParameters);
+        huaTaiPaymentUrlRequest.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
+
+        HuaTaiPaymentUrlResponse paymentUrlResponse = huataiRequestApiComponent.getPaymentUrl(huaTaiPaymentUrlRequest, HuaTaiPaymentUrlResponse.class, huaTaiParameters.getInsuredCode());
+
+        String payUrl = "";
+        if (StringUtils.isNotEmpty(paymentUrlResponse.getPayUrl())) {
+            payUrl = paymentUrlResponse.getPayUrl();
+        }
+        return payUrl;
     }
 
     /**
@@ -51,16 +244,35 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
      */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        OrderBase orderBase = insuranceUploadImageVo.getOrder();
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        //配置信息
+        HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        HuaTaiUploadImageRequest uploadImageRequest = new HuaTaiUploadImageRequest(huaTaiApiOrder, huaTaiParameters);
+        uploadImageRequest.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
+        //返回影像上传url
+        HuaTaiUploadImageResponse huaTaiUploadImageResponse = huataiRequestApiComponent.uploadImage(uploadImageRequest, HuaTaiUploadImageResponse.class, huaTaiParameters.getInsuredCode());
 
     }
 
     /**
      * 下载保单
-     *
      * @param orderBase
      */
     @Override
     public void downloadPolicy(OrderBase orderBase) {
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        //配置信息
+        HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        String policyNo = "";//以后需补充如何获取
+        HuaTaiInsurancePolicyPrintRequest request = new HuaTaiInsurancePolicyPrintRequest();
+        request.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
+        request.setBusinessNo(policyNo);
+
+        HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode());
 
     }
 
@@ -71,6 +283,36 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
      */
     @Override
     public void queryOrderState(OrderBase orderBase) {
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        //配置信息
+        HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        HuaTaiBaseRequestHead baseRequestHead = new HuaTaiBaseRequestHead(huaTaiParameters);
 
+        HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        //获取核保状态
+        HuaTaiSubmitStatusQueryResponse submitStatusQueryResponse = submitStatus(huaTaiApiOrder, huaTaiParameters, "2");
+
+        //获取见费出单结果
+        HuaTaiOrderStatusRequest orderStatusRequest = new HuaTaiOrderStatusRequest(huaTaiApiOrder, huaTaiParameters);
+        orderStatusRequest.setHead(baseRequestHead);
+        HuaTaiOrderStatusResponse orderStatusResponse = huataiRequestApiComponent.orderStatus(orderStatusRequest, HuaTaiOrderStatusResponse.class, huaTaiParameters.getInsuredCode());
+
+
+    }
+
+    /**
+     * 提交核保或核保查询接口
+     * @param huaTaiApiOrder
+     * @param huaTaiConfigureParameters
+     * @param operateType               1为提交 2为查询
+     * @return
+     */
+    private HuaTaiSubmitStatusQueryResponse submitStatus(HuaTaiApiOrder huaTaiApiOrder, HuaTaiConfigureParameters huaTaiConfigureParameters, String operateType) {
+        HuaTaiSubmitStatusQueryRequest huaTaiSubmitStatusQueryRequest = new HuaTaiSubmitStatusQueryRequest(huaTaiApiOrder,
+                huaTaiConfigureParameters, operateType);
+        huaTaiSubmitStatusQueryRequest.setHead(new HuaTaiBaseRequestHead(huaTaiConfigureParameters));
+        HuaTaiSubmitStatusQueryResponse submitStatusQueryResponse =
+                huataiRequestApiComponent.submitStatus(huaTaiSubmitStatusQueryRequest, HuaTaiSubmitStatusQueryResponse.class, huaTaiConfigureParameters.getInsuredCode());
+        return submitStatusQueryResponse;
     }
 }

+ 178 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/AESUtilsWithDataBase.java

@@ -0,0 +1,178 @@
+package com.jzg.quote.huatai.api.utils;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+import java.net.URLDecoder;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 10:10
+ **/
+@Slf4j
+public class AESUtilsWithDataBase {
+
+    private static final String ECB_PKCS5_PADDING = "AES/ECB/PKCS5Padding";
+
+    private static final String AES = "AES";
+
+    //编码方式
+    public static final String CODE_TYPE = "UTF-8";
+
+    /**
+     * AES 加密操作  ECBPK5Hex
+     *
+     * @param content 待加密内容
+     * @return 返回Base64转码后的加密数据
+     */
+    public static String encryptECBPK5Hex(String content, String sessionKey) {
+        byte[] result = null;
+        if (content == null || "".equals(content)) {
+            return content;
+        }
+        try {
+            byte[] byteContent = content.getBytes(CODE_TYPE);
+            //使用加密秘钥
+            SecretKeySpec skeySpec = new SecretKeySpec(sessionKey.getBytes(CODE_TYPE), AES);
+            /*
+             * 新建一个密码编译器的实例,由三部分构成,用"/"分隔,分别代表如下
+             * 1. 加密的类型(如AES,DES,RC2等)
+             * 2. 模式(AES中包含ECB,CBC,CFB,CTR,CTS等)
+             * 3. 补码方式(包含nopadding/PKCS5Padding等等)
+             * 依据这三个参数可以创建很多种加密方式
+             */
+            synchronized (Cipher.class) {
+                Cipher cipher = Cipher.getInstance(ECB_PKCS5_PADDING);//"AES/ECB/PKCS5Padding";
+                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);// 初始化为加密模式的密码器
+                result = cipher.doFinal(byteContent);// 加密
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return byteToHex(result);//通过hex转码返回
+    }
+
+    /**
+     * AES 解密操作  ECBPK5Hex
+     *
+     * @param content
+     * @return
+     */
+    public static String decryptECBPK5Hex(String content, String sessionKey) {
+        String returnStr = content;
+        byte[] result;
+        if (content == null || "".equals(content)) {
+            return content;
+        }
+        try {
+            //使用加密秘钥
+            SecretKeySpec skeySpec = new SecretKeySpec(sessionKey.getBytes(CODE_TYPE), AES);
+            synchronized (Cipher.class) {
+                //实例化
+                Cipher cipher = Cipher.getInstance(ECB_PKCS5_PADDING);
+                cipher.init(Cipher.DECRYPT_MODE, skeySpec);// 初始化为加密模式的密码器
+                result = cipher.doFinal(hexToByte(content));
+            }
+            returnStr = new String(result, CODE_TYPE);
+        } catch (Exception ex) {
+        }
+        return returnStr;
+    }
+
+    public static String byteToHex(byte[] bytes) {
+        String strHex = "";
+        StringBuilder sb = new StringBuilder("");
+        for (int n = 0; n < bytes.length; n++) {
+            strHex = Integer.toHexString(bytes[n] & 0xFF);
+            sb.append((strHex.length() == 1) ? "0" + strHex : strHex); // 每个字节由两个字符表示,位数不够,高位补0
+        }
+        return sb.toString().trim();
+    }
+
+    public static byte[] hexToByte(String hex) throws Exception {
+        hex = URLDecoder.decode(hex, CODE_TYPE);
+        int m = 0, n = 0;
+        int byteLen = hex.length() / 2; // 每两个字符描述一个字节
+        byte[] ret = new byte[byteLen];
+        for (int i = 0; i < byteLen; i++) {
+            m = i * 2 + 1;
+            n = m + 1;
+            int intVal = Integer.decode("0x" + hex.substring(i * 2, m) + hex.substring(m, n));
+            ret[i] = Byte.valueOf((byte) intVal);
+        }
+        return ret;
+    }
+
+
+    public static <T> T decryptMessage(String s, Class<T> c, String message, String sessionKey) {
+//        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> 解密前的参数:{}", s);
+        // 解密
+        String text = decryptECBPK5Hex(s.replace("\n", ""), sessionKey);
+//        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {}:{}", message, text);
+        return JSON.parseObject(text, c);
+    }
+
+    /**
+     * AES 加密操作  ECBPK5-Base64
+     *
+     * @param content
+     * @return
+     */
+    public static String encryptECBPK5Base64(String content, String sessionKey) {
+        byte[] result = null;
+        if (content == null || "".equals(content)) {
+            return content;
+        }
+        try {
+            byte[] byteContent = content.getBytes(CODE_TYPE);
+            //使用加密秘钥
+            SecretKeySpec skeySpec = new SecretKeySpec(sessionKey.getBytes(CODE_TYPE), AES);
+            /*
+             * 新建一个密码编译器的实例,由三部分构成,用"/"分隔,分别代表如下
+             * 1. 加密的类型(如AES,DES,RC2等)
+             * 2. 模式(AES中包含ECB,CBC,CFB,CTR,CTS等)
+             * 3. 补码方式(包含nopadding/PKCS5Padding等等)
+             * 依据这三个参数可以创建很多种加密方式
+             */
+            synchronized (Cipher.class) {
+                Cipher cipher = Cipher.getInstance(ECB_PKCS5_PADDING);//"AES/ECB/PKCS5Padding";
+                cipher.init(Cipher.ENCRYPT_MODE, skeySpec);// 初始化为加密模式的密码器
+                result = cipher.doFinal(byteContent);// 加密
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return Base64.encodeBase64String(result);//通过base64转码返回
+    }
+
+    /**
+     * AES 解密操作  ECBPK5-Base64
+     *
+     * @param content
+     * @return
+     */
+    public static String decryptECBPK5Base64(String content, String sessionKey) {
+        String returnStr = content;
+        byte[] result;
+        if (content == null || "".equals(content)) {
+            return content;
+        }
+        try {
+            //使用加密秘钥
+            SecretKeySpec skeySpec = new SecretKeySpec(sessionKey.getBytes(CODE_TYPE), AES);
+            synchronized (Cipher.class) {
+                //实例化
+                Cipher cipher = Cipher.getInstance(ECB_PKCS5_PADDING);
+                cipher.init(Cipher.DECRYPT_MODE, skeySpec);// 初始化为加密模式的密码器
+                result = cipher.doFinal(Base64.decodeBase64(content));
+            }
+            returnStr = new String(result, CODE_TYPE);
+        } catch (Exception ex) {
+        }
+        return returnStr;
+    }
+}

+ 63 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/Base64Utils.java

@@ -0,0 +1,63 @@
+package com.jzg.quote.huatai.api.utils;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 10:07
+ **/
+public class Base64Utils {
+    /**
+     * 判断图片base64字符串的文件格式
+     *
+     * @param base64ImgData
+     * @return
+     */
+    public static String checkImageBase64Format(String base64ImgData) {
+        byte[] b = base64ImgData.getBytes();
+
+        String type = "";
+        if (0x424D == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
+            type = "bmp";
+        } else if (0x8950 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
+            type = "png";
+        } else if (0xFFD8 == ((b[0] & 0xff) << 8 | (b[1] & 0xff))) {
+            type = "jpg";
+        } else {
+            type = "jpeg";
+        }
+        return type;
+    }
+
+    // 加密
+    public static String getBase64Encode(String str) {
+        byte[] b = null;
+        String s = null;
+        b = str.getBytes(StandardCharsets.UTF_8);
+
+
+        s = Base64.getEncoder().encodeToString(b);
+//        s = new BASE64Encoder().encode(b);
+        return s;
+    }
+
+    // 解密
+    public static String getBase64Decode(String s) {
+        byte[] b = null;
+        String result = null;
+        if (s != null) {
+//            BASE64Decoder decoder = new BASE64Decoder();
+            try {
+//                b = decoder.decodeBuffer(s);
+                b = Base64.getDecoder().decode(s);
+                result = new String(b, StandardCharsets.UTF_8);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        return result;
+    }
+
+}

+ 128 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/BizCommStreamUtils.java

@@ -0,0 +1,128 @@
+package com.jzg.quote.huatai.api.utils;
+
+import java.io.*;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/10 10:27
+ **/
+public class BizCommStreamUtils {
+
+    private static final int DEFAULT_BUFFER_SIZE = 8192;
+
+    public static void io(InputStream in, OutputStream out) throws IOException {
+        io(in, out, -1);
+    }
+
+    public static void io(InputStream in, OutputStream out, int bufferSize) throws IOException {
+        if (bufferSize == -1) {
+            bufferSize = DEFAULT_BUFFER_SIZE;
+        }
+
+        byte[] buffer = new byte[bufferSize];
+        int amount;
+
+        while ((amount = in.read(buffer)) >= 0) {
+            out.write(buffer, 0, amount);
+        }
+    }
+
+    public static void io(Reader in, Writer out) throws IOException {
+        io(in, out, -1);
+    }
+
+    public static void io(Reader in, Writer out, int bufferSize) throws IOException {
+        if (bufferSize == -1) {
+            bufferSize = DEFAULT_BUFFER_SIZE >> 1;
+        }
+
+        char[] buffer = new char[bufferSize];
+        int amount;
+
+        while ((amount = in.read(buffer)) >= 0) {
+            out.write(buffer, 0, amount);
+        }
+    }
+
+    public static OutputStream synchronizedOutputStream(OutputStream out) {
+        return new SynchronizedOutputStream(out);
+    }
+
+    public static OutputStream synchronizedOutputStream(OutputStream out, Object lock) {
+        return new SynchronizedOutputStream(out, lock);
+    }
+
+    public static String readText(InputStream in) throws IOException {
+        return readText(in, null, -1);
+    }
+
+    public static String readText(InputStream in, String encoding) throws IOException {
+        return readText(in, encoding, -1);
+    }
+
+    public static String readText(InputStream in, String encoding, int bufferSize) throws IOException {
+        Reader reader = (encoding == null) ? new InputStreamReader(in) : new InputStreamReader(in, encoding);
+
+        return readText(reader, bufferSize);
+    }
+
+    public static String readText(Reader reader) throws IOException {
+        return readText(reader, -1);
+    }
+
+    public static String readText(Reader reader, int bufferSize) throws IOException {
+        StringWriter writer = new StringWriter();
+
+        io(reader, writer, bufferSize);
+        return writer.toString();
+    }
+
+    private static class SynchronizedOutputStream extends OutputStream {
+
+        private OutputStream out;
+
+        private Object lock;
+
+        SynchronizedOutputStream(OutputStream out) {
+            this(out, out);
+        }
+
+        SynchronizedOutputStream(OutputStream out, Object lock) {
+            this.out = out;
+            this.lock = lock;
+        }
+
+        public void write(int datum) throws IOException {
+            synchronized (lock) {
+                out.write(datum);
+            }
+        }
+
+        public void write(byte[] data) throws IOException {
+            synchronized (lock) {
+                out.write(data);
+            }
+        }
+
+        public void write(byte[] data, int offset, int length) throws IOException {
+            synchronized (lock) {
+                out.write(data, offset, length);
+            }
+        }
+
+        public void flush() throws IOException {
+            synchronized (lock) {
+                out.flush();
+            }
+        }
+
+        public void close() throws IOException {
+            synchronized (lock) {
+                out.close();
+            }
+        }
+
+    }
+
+}

+ 308 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quote/huatai/api/utils/RSAUtils.java

@@ -0,0 +1,308 @@
+package com.jzg.quote.huatai.api.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.Cipher;
+import java.io.*;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @description: 加解密签名工具
+ * @author: shenwd
+ * @date: 2025/3/10 10:21
+ **/
+public class RSAUtils {
+
+    public static final String SIGN_ALGORITHMS = "SHA1WithRSA";
+
+    public static final String CONTENT = "CONTENT";
+
+    public static final String SIGN = "SIGNATURE";
+
+    public static final String SIGN_TYPE_RSA = "RSA";
+
+    public static final String CHARSET_UTF_8 = "UTF-8";
+
+    public static final String CHARSET_GBK = "GBK";
+
+    public static final int MAX_ENCRYPT_BLOCK = 117;
+
+    public static final int MAX_DECRYPT_BLOCK = 128;
+    /**
+     * 加密并签名<br>
+     * 对于<b>合作方</b>,publicKey是指评驾车险平台的公钥,privateKey是指合作方的私钥<br>
+     * 对于<b>评驾车险平台</b>,publicKey是指合作方的公钥,privateKey是指评驾车险平台自己的私钥<br>
+     *
+     * @param bizContent 需要加密数据
+     * @param publicKey  公钥
+     * @param privateKey 私钥
+     * @param charset    字符编码
+     * @param isEncrypt  是否加密
+     * @param isSign     是否加签
+     * @return CONTENT   密文  SIGN 签名
+     * @throws Exception
+     */
+    public static Map<String, String> encryptAndSign(String bizContent, String publicKey, String privateKey, String charset,
+                                                     boolean isEncrypt, boolean isSign) throws Exception {
+        if (isEmpty(charset)) {
+            charset = CHARSET_UTF_8;
+        }
+        bizContent = URLEncoder.encode(bizContent, CHARSET_UTF_8);
+        Map<String, String> map = new HashMap<String, String>();
+        if (isEncrypt) {
+            //加密
+            String encrypted = rsaEncrypt(bizContent, publicKey, charset);
+            map.put(CONTENT, encrypted);
+            //加签
+            if (isSign) {
+                String sign = rsaSign(encrypted, privateKey, charset);
+                map.put(SIGN, sign);
+            }
+        } else if (isSign) {
+            // 不加密,但需要签名
+            map.put(CONTENT, bizContent);
+            String sign = rsaSign(bizContent, privateKey, charset);
+            map.put(SIGN, sign);
+        }
+        return map;
+    }
+
+    /**
+     * 验签并解密
+     * <p>
+     * 对于<b>合作方</b>,publicKey是指评驾车险平台的公钥,privateKey是指合作方的私钥<br>
+     * 对于<b>评驾车险平台</b>,publicKey是指合作方的公钥,privateKey是指评驾车险平台自己的私钥<br>
+     *
+     * @param publicKey   公钥
+     * @param privateKey  私钥
+     * @param isCheckSign 是否验签
+     * @param isDecrypt   是否解密
+     * @return 解密后明文,验签失败则异常抛出
+     * @throws Exception
+     */
+    public static String checkSignAndDecrypt(String content, String sign, String publicKey, String privateKey, String charset,
+                                             boolean isDecrypt, boolean isCheckSign) throws Exception {
+        if (isEmpty(charset)) {
+            charset = CHARSET_UTF_8;
+        }
+        //验签
+        if (isCheckSign) {
+            checkRSASign(sign, content, publicKey, charset);
+        }
+        //解密
+        if (isDecrypt) {
+            return URLDecoder.decode(rsaDecrypt(content, privateKey, charset), CHARSET_UTF_8);
+        }
+        return content;
+    }
+
+    /**
+     * 公钥加密<br>
+     * 对于<b>评驾车险平台</b>,publicKey是指合作方的公钥,privateKey是指评驾车险平台自己的私钥<br>
+     * 对于<b>合作方</b>,publicKey是指评驾车险平台的公钥,privateKey是指合作方的私钥<br>
+     *
+     * @param content   待加密内容
+     * @param publicKey 公钥
+     * @param charset   字符集,如UTF-8, GBK, GB2312
+     * @return 密文内容
+     * @throws Exception
+     */
+    public static String rsaEncrypt(String content, String publicKey, String charset) throws Exception {
+        PublicKey pubKey = getPublicKeyFromX509(SIGN_TYPE_RSA,
+                new ByteArrayInputStream(publicKey.getBytes()));
+        Cipher cipher = Cipher.getInstance(SIGN_TYPE_RSA);
+        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
+        byte[] data = isEmpty(charset) ? content.getBytes() : content.getBytes(charset);
+        int inputLen = data.length;
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        int offSet = 0;
+        byte[] cache;
+        int i = 0;
+        // 对数据分段加密
+        while (inputLen - offSet > 0) {
+            if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
+                cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
+            } else {
+                cache = cipher.doFinal(data, offSet, inputLen - offSet);
+            }
+            out.write(cache, 0, cache.length);
+            i++;
+            offSet = i * MAX_ENCRYPT_BLOCK;
+        }
+        byte[] encryptedData = Base64.encodeBase64(out.toByteArray());
+        out.close();
+
+        return isEmpty(charset) ? new String(encryptedData) : new String(encryptedData, charset);
+    }
+
+    /**
+     * 私钥解密<br>
+     *
+     * @param content    待解密内容
+     * @param privateKey 私钥
+     * @param charset    字符集,如UTF-8, GBK, GB2312
+     * @return 明文内容
+     * @throws Exception
+     */
+    public static String rsaDecrypt(String content, String privateKey, String charset) throws Exception {
+        try {
+            PrivateKey priKey = getPrivateKeyFromPKCS8(SIGN_TYPE_RSA,
+                    new ByteArrayInputStream(privateKey.getBytes()));
+            Cipher cipher = Cipher.getInstance(SIGN_TYPE_RSA);
+            cipher.init(Cipher.DECRYPT_MODE, priKey);
+            byte[] encryptedData = isEmpty(charset) ? Base64.decodeBase64(content.getBytes()) : Base64
+                    .decodeBase64(content.getBytes(charset));
+            int inputLen = encryptedData.length;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            int offSet = 0;
+            byte[] cache;
+            int i = 0;
+            // 对数据分段解密
+            while (inputLen - offSet > 0) {
+                if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
+                    cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
+                } else {
+                    cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
+                }
+                out.write(cache, 0, cache.length);
+                i++;
+                offSet = i * MAX_DECRYPT_BLOCK;
+            }
+            byte[] decryptedData = out.toByteArray();
+            out.close();
+
+            return isEmpty(charset) ? new String(decryptedData) : new String(decryptedData, charset);
+        } catch (Exception e) {
+            throw new Exception("EncodeContent = " + content + ",charset = " + charset, e);
+        }
+    }
+
+
+    /**
+     * RSA签名
+     *
+     * @param content
+     * @param privateKey
+     * @param charset
+     * @return
+     * @throws Exception
+     */
+    public static String rsaSign(String content, String privateKey, String charset) throws Exception {
+        try {
+            PrivateKey priKey = getPrivateKeyFromPKCS8(SIGN_TYPE_RSA,
+                    new ByteArrayInputStream(privateKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
+
+            signature.initSign(priKey);
+
+            if (isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            byte[] signed = signature.sign();
+
+            return new String(Base64.encodeBase64(signed));
+        } catch (Exception e) {
+            throw new Exception("RSAcontent = " + content + "; charset = " + charset, e);
+        }
+    }
+
+    /**
+     * RSA签名校验<br>
+     * 对于<b>评驾车险平台</b>,publicKey是指合作方的公钥<br>
+     * 对于<b>合作方</b>,publicKey是指评驾车险平台的公钥<br>
+     *
+     * @param sign
+     * @param content
+     * @param publicKey
+     * @param charset
+     * @throws Exception
+     */
+    public static void checkRSASign(String sign, String content, String publicKey, String charset) throws Exception {
+        if (!rsaCheckContent(content, sign, publicKey, charset)) {
+            throw new Exception("rsaCheck failure: sign=" + sign + ", content=" + content + ", charset=" + charset);
+        }
+    }
+
+
+    public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, InputStream ins) throws Exception {
+        if (ins == null || isEmpty(algorithm)) {
+            return null;
+        }
+
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+        byte[] encodedKey = BizCommStreamUtils.readText(ins).getBytes();
+
+        encodedKey = Base64.decodeBase64(encodedKey);
+
+        return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey));
+    }
+
+    /**
+     * RSA签名校验<br>
+     * 对于<b>评驾车险平台</b>,publicKey是指合作方的公钥<br>
+     * 对于<b>合作方</b>,publicKey是指评驾车险平台的公钥<br>
+     *
+     * @param sign
+     * @param content
+     * @param publicKey
+     * @param charset
+     * @throws Exception
+     */
+    public static boolean rsaCheckContent(String content, String sign, String publicKey, String charset)
+            throws Exception {
+        try {
+            PublicKey pubKey = getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes()));
+
+            java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);
+
+            signature.initVerify(pubKey);
+
+            if (isEmpty(charset)) {
+                signature.update(content.getBytes());
+            } else {
+                signature.update(content.getBytes(charset));
+            }
+
+            return signature.verify(Base64.decodeBase64(sign.getBytes()));
+        } catch (Exception e) {
+            throw new Exception("RSAcontent=" + content + ",sign=" + sign + ",charset=" + charset, e);
+        }
+    }
+
+    public static PublicKey getPublicKeyFromX509(String algorithm, InputStream ins) throws Exception {
+        KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
+
+        StringWriter writer = new StringWriter();
+        BizCommStreamUtils.io(new InputStreamReader(ins), writer);
+
+        byte[] encodedKey = writer.toString().getBytes();
+
+        encodedKey = Base64.decodeBase64(encodedKey);
+
+        return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
+    }
+
+    /**
+     * 判断字符串是否为空
+     *
+     * @param value 字符串
+     * @return 空或空串返回true 否则false
+     */
+    public static boolean isEmpty(String value) {
+        return (null == value || value.trim().equals("")) ? true : false;
+    }
+
+}

+ 1 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/constant/enums/ContractEnum.java

@@ -3,7 +3,7 @@ package com.jzg.quote.zhongmei.api.constant.enums;
 import lombok.Getter;
 
 /**
- * @description: todo
+ * @description: 中煤险种编码
  * @author: shenwd
  * @date:2025/2/25 09:05
  **/