Ver Fonte

渤海报价相关

shenweidong há 1 ano atrás
pai
commit
cae2572f7f
64 ficheiros alterados com 5066 adições e 0 exclusões
  1. 1 0
      tenant/insurance/pom.xml
  2. 29 0
      tenant/insurance/quotation-bohai/pom.xml
  3. 100 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/build/BoHaiApiQuoteResultsVoBuild.java
  4. 247 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/component/BoHaiRequestApiComponent.java
  5. 21 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/CertType.java
  6. 44 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/Coverages.java
  7. 25 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/CustomerType.java
  8. 53 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/DocumentClass.java
  9. 22 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/FormatType.java
  10. 50 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/InsurKind.java
  11. 95 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/InsuranceEnum.java
  12. 24 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/InvoiceType.java
  13. 40 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/RequestType.java
  14. 22 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/ResponseCode.java
  15. 33 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/ResultCode.java
  16. 23 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleAffNature.java
  17. 23 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleKind.java
  18. 22 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleUsage.java
  19. 28 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleUsageDetail.java
  20. 26 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/BoHaiConfigureParameters.java
  21. 35 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/dto/DrivingInsuranceDTO.java
  22. 48 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/dto/InsUploadImagesDTO.java
  23. 41 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/po/BoHaiApiOrder.java
  24. 60 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/po/InsTaskImagesBase64.java
  25. 135 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/BoHaiBaseRequest.java
  26. 42 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/ElectronicPolicyRequest.java
  27. 27 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/GenerateOrderNoRequest.java
  28. 108 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/ImageUploadRequest.java
  29. 42 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/NonAutomotiveProductsDetailsRequest.java
  30. 109 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/NonAutomotiveProductsRequest.java
  31. 36 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/PaymentRequest.java
  32. 341 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/QuotationRequest.java
  33. 31 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/StatusDocumentsRequest.java
  34. 80 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/UnderwritingRequest.java
  35. 33 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/UnderwritingRevocationRequest.java
  36. 49 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/VehicleCheckCodeRequest.java
  37. 572 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/VehicleConfirmationReqeust.java
  38. 64 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/VehicleTypeQueryRequest.java
  39. 42 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/BoHaiBaseResponse.java
  40. 41 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/CallbackResponse.java
  41. 43 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/ElectronicPolicyResponse.java
  42. 33 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/GenerateOrderNoResponse.java
  43. 21 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/ImageUploadResponse.java
  44. 52 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/NonAutomotiveProductsDetailsResponse.java
  45. 73 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/NonAutomotiveProductsResponse.java
  46. 44 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/PaymentResponse.java
  47. 510 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/QuotationResponse.java
  48. 59 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/StatusDocumentsResponse.java
  49. 201 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/UnderwritingResponse.java
  50. 37 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleCheckCodeResponse.java
  51. 67 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleConfirmationResponse.java
  52. 138 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleTypeQueryResponse.java
  53. 32 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/BoHaiQuoteAccidentVo.java
  54. 44 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/PersonAreaVo.java
  55. 29 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/ProductDetailsQueryVo.java
  56. 73 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/ProductQueryVo.java
  57. 33 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/properties/BohaiApiConfigurationProperties.java
  58. 14 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/repository/BoHaiApiOrderRepository.java
  59. 11 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/service/BoHaiApiRequest.java
  60. 202 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/service/impl/BoHaiApiRequestImpl.java
  61. 45 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/BoHaiEncrypted.java
  62. 346 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/SignatureUtils.java
  63. 93 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/StringSubStringUtils.java
  64. 2 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/InsuranceCode.java

+ 1 - 0
tenant/insurance/pom.xml

@@ -17,6 +17,7 @@
         <module>quotation-dajia</module>
         <module>quotation-zhongmei</module>
         <module>quotation-zijin</module>
+        <module>quotation-bohai</module>
     </modules>
 
     <dependencies>

+ 29 - 0
tenant/insurance/quotation-bohai/pom.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.jzg</groupId>
+        <artifactId>insurance</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>quotation-bohai</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-commons</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+
+</project>

+ 100 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/build/BoHaiApiQuoteResultsVoBuild.java

@@ -0,0 +1,100 @@
+package com.jzg.quote.bohai.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.bohai.api.entity.response.QuotationResponse;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 渤海财险 处理报价返回的数据
+ * @author: shenwd
+ * @date: 2025/3/4 14:34
+ **/
+public class BoHaiApiQuoteResultsVoBuild {
+    public static QuoteResultsVo buildQuoteResultsVo(String orderNo, QuoteVo quoteVo, QuotationResponse quotationResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setOrdersNo(orderNo);
+        // 交强险
+        quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(quotationResponse));
+        // 商业险
+        quoteResultsVo.setBiRiskInfoVo(buildBiRiskInfoVo(quotationResponse));
+        // 商业险险种信息
+        List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), quotationResponse.getData().getBusinessPolicy().getCoverages());
+        quoteResultsVo.setKindInfoVo(kindInfoVo);
+
+        // 交强保费 车船税 商业保费
+        buildPremium(quoteResultsVo, quotationResponse);
+        return quoteResultsVo;
+    }
+
+    /**
+     * 处理交强险数据
+     * @param quotationResponse
+     * @return
+     */
+    public static RiskInfoVo buildCiRiskInfoVo(QuotationResponse quotationResponse) {
+        QuotationResponse.DataDTO.TrafficPolicyDTO trafficPolicy = quotationResponse.getData().getTrafficPolicy();
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        riskInfoVo.setStartDate(trafficPolicy.getStartDate());
+        riskInfoVo.setEndDate(trafficPolicy.getEndDate());
+
+        return riskInfoVo;
+    }
+    /**
+     * 处理商业险数据
+     * @param quotationResponse
+     * @return
+     */
+    public static RiskInfoVo buildBiRiskInfoVo(QuotationResponse quotationResponse) {
+        // 获取商业险数据
+        QuotationResponse.DataDTO.BusinessPolicyDTO businessPolicy = quotationResponse.getData().getBusinessPolicy();
+        RiskInfoVo riskInfoVo = new RiskInfoVo();
+        riskInfoVo.setStartDate(businessPolicy.getStartDate());
+        riskInfoVo.setEndDate(businessPolicy.getEndDate());
+
+        return riskInfoVo;
+    }
+
+    /**
+     * 处理商业险信息
+     * @param kindInfoVo
+     * @param coverageListDTOS
+     * @return
+     */
+    private static List<KindInfoVo> buildKindInfoVo(List<KindInfoVo> kindInfoVo, List<QuotationResponse.DataDTO.BusinessPolicyDTO.CoveragesDTO> coverageListDTOS) {
+        Map<String, QuotationResponse.DataDTO.BusinessPolicyDTO.CoveragesDTO> collect = coverageListDTOS.stream()
+                .collect(Collectors.toMap(QuotationResponse.DataDTO.BusinessPolicyDTO.CoveragesDTO::getCoverageCode, x -> x));
+        kindInfoVo.forEach(kind -> {
+            QuotationResponse.DataDTO.BusinessPolicyDTO.CoveragesDTO coverageListDTO = collect.get(kind.getKindCode());
+            if (coverageListDTO.getCoverageCode().equals(kind.getKindCode())) {
+                kind.setAmount(String.valueOf(coverageListDTO.getSumInsurd()));//设置保额
+                kind.setPremium(String.valueOf(coverageListDTO.getPremium()));//设置保费
+            }
+        });
+        return kindInfoVo;
+    }
+
+    /**
+     * 设置商业险,交强险保费
+     * @param quoteResultsVo
+     * @param quotationResponse
+     */
+    private static void buildPremium(QuoteResultsVo quoteResultsVo, QuotationResponse quotationResponse) {
+        // 设置商业险保费
+        quoteResultsVo.setBiPremium(String.valueOf(quotationResponse.getData().getBusinessPolicy().getPremium()));
+        // 设置交强险保费
+        quoteResultsVo.setCiPremium(String.valueOf(quotationResponse.getData().getTrafficPolicy().getPremium()));
+        // 设置车船税
+        quoteResultsVo.setVvTax(String.valueOf(quotationResponse.getData().getTrafficPolicy().getVehicleTax().getTotalAmount()));
+        // 设置非车险(驾意险)保费
+        QuotationResponse.DataDTO.UnAutoPremiumDTO unAutoPremium = quotationResponse.getData().getUnAutoPremium();
+        if (unAutoPremium != null) {
+            quoteResultsVo.setNiPremium(unAutoPremium.getPremium());
+        }
+    }
+}

+ 247 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/component/BoHaiRequestApiComponent.java

@@ -0,0 +1,247 @@
+package com.jzg.quote.bohai.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.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
+import com.jzg.quote.bohai.api.constant.enums.RequestType;
+import com.jzg.quote.bohai.api.constant.enums.ResponseCode;
+import com.jzg.quote.bohai.api.entity.request.*;
+import com.jzg.quote.bohai.api.entity.response.*;
+import com.jzg.quote.bohai.api.properties.BohaiApiConfigurationProperties;
+import com.jzg.quote.bohai.api.util.BoHaiEncrypted;
+import com.jzg.quote.bohai.api.util.SignatureUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description: 渤海财险
+ * @author: shenwd
+ * @date: 2025/3/3 14:42
+ **/
+@Component
+@RequiredArgsConstructor
+public class BoHaiRequestApiComponent {
+
+    private final BohaiApiConfigurationProperties properties;
+
+    private final RequestComponent requestComponent;
+
+    public <T extends BoHaiBaseRequest, B extends BoHaiBaseResponse> B requestUrl(String url, T requestBody, Class<B> responseType, String sysSourceCode, RequestType requestType) throws Exception {
+        requestBody.setBaseParamRequestType(requestType.getCode());
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+
+        String busReqString = JSON.toJSONString(requestBody, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+//        InsuranceLog.infoLog(InsuranceEnum.BPIC.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+//                requestType.getDesc(), url, busReqString);
+        BoHaiEncrypted boHaiEncrypted = new BoHaiEncrypted(busReqString, properties, sysSourceCode);
+
+        String json = JSON.toJSONString(boHaiEncrypted, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+        // 获取请求头signature 和加密后的内容
+        Map<String, String> stringStringMap = SignatureUtils.encryptAndSign(properties.getSelfPrivateKey(),
+                properties.getBoHaiPublicKey(), json, true, true);
+        String signature = stringStringMap.get("signature");
+        String content = stringStringMap.get("content");
+        httpHeaders.set("signature", signature);
+//        InsuranceLog.infoLog(InsuranceEnum.BPIC.getPinyin(), "\n\t---------> {} \n\t---------> 加密后的参数:{} \n\t---------> " +
+//                "请求头内容signature:{}", requestType.getDesc(), content, signature);
+
+        ResponseEntity<B> bResponseEntity = requestComponent.objectPost(url, content, responseType, httpHeaders);
+        String body = JSON.toJSONString(bResponseEntity.getBody());//需要联调观察数据格式
+//        InsuranceLog.infoLog(InsuranceEnum.BPIC.getPinyin(), "\n\t---------> {} \n\t---------> 解密前的参数:{}", requestType.getDesc(), body);
+
+        BoHaiEncrypted encrypted = JSON.parseObject(body).toJavaObject(BoHaiEncrypted.class);
+        String info = SignatureUtils.decryptByPrivateKey(encrypted.getBizContent(), properties.getSelfPrivateKey());
+//        InsuranceLog.infoLog(InsuranceEnum.BPIC.getPinyin(), "\n\t---------> {} \n\t---------> 解密后的参数:{}", requestType.getDesc(), info);
+        return JSON.parseObject(info).toJavaObject(responseType);
+    }
+
+    public <Q extends BoHaiBaseRequest, S extends BoHaiBaseResponse> S verificationResponse(Q q, String url, Class<S> tClass, String sysSourceCode, RequestType requestType) throws Exception {
+        S response = requestUrl(url, q, tClass, sysSourceCode, requestType);
+        verificationResponseCode(response.getResponseCode(), response.getResponseMsg());
+        return response;
+    }
+
+    /**
+     * 生成订单号请求
+     *
+     * @param request 生成订单号请求实体
+     * @return 返回订单号响应
+     */
+    public GenerateOrderNoResponse generateOrderNo(GenerateOrderNoRequest request, String sysSourceCode) throws Exception {
+        return verificationResponse(request, properties.getUrl(), GenerateOrderNoResponse.class, sysSourceCode, RequestType.Z00002);
+    }
+
+    /**
+     * 车辆查询
+     *
+     * @param request 车辆查询请求实体
+     * @return 响应
+     */
+    public VehicleTypeQueryResponse.DataDTO.VehicleModelsDTO vehicleTypeQuery(VehicleTypeQueryRequest request, String sysSourceCode, CarInfoVo carInfoVo) throws Exception {
+        VehicleTypeQueryResponse vehicleTypeQueryResponse =  verificationResponse(request, properties.getUrl(), VehicleTypeQueryResponse.class, sysSourceCode, RequestType.Z00004);
+        List<VehicleTypeQueryResponse.DataDTO.VehicleModelsDTO> vehicleModels = vehicleTypeQueryResponse.getData().getVehicleModels();
+        return CarModelsFilterUtils.to(vehicleModels, carInfoVo);
+    }
+
+    /**
+     * 车辆确认
+     *
+     * @param request 车辆确认 请求实体
+     * @return 响应
+     */
+    public VehicleConfirmationResponse vehicleConfirmation(VehicleConfirmationReqeust request, String sysSourceCode) throws Exception {
+        VehicleConfirmationResponse response = requestUrl(properties.getUrl(), request, VehicleConfirmationResponse.class, sysSourceCode, RequestType.Z00005);
+        if (ResponseCode.R_Z00002.getCode().equals(response.getResponseCode())) {
+            response = requestUrl(properties.getUrl(), request, VehicleConfirmationResponse.class, sysSourceCode, RequestType.Z00005);
+        }
+        if (ResponseCode.R_Z00001.getCode().equals(response.getResponseCode())) {
+            return response;
+        }
+        // throw new SystemException(response.getResponseMsg());
+        return response;
+    }
+
+    /**
+     * 上传影响
+     *
+     * @param imageUploadRequest 影像请求
+     * @return 响应
+     */
+    public ImageUploadResponse imageUpload(ImageUploadRequest imageUploadRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(imageUploadRequest, properties.getUrl(), ImageUploadResponse.class, sysSourceCode, RequestType.Z00014);
+    }
+
+
+    /**
+     * 车+X产品查询接口
+     *
+     * @param request 车辆确认 请求实体
+     * @return 响应
+     */
+    public NonAutomotiveProductsResponse products(NonAutomotiveProductsRequest request, String sysSourceCode) throws Exception {
+        return verificationResponse(request, properties.getUrl(), NonAutomotiveProductsResponse.class, sysSourceCode, RequestType.Z00018);
+    }
+
+    /**
+     * 车+X产品详情查询接口
+     *
+     * @param request 车辆确认 请求实体
+     * @return 响应
+     */
+    public NonAutomotiveProductsDetailsResponse productsDetails(NonAutomotiveProductsDetailsRequest request, String sysSourceCode) throws Exception {
+        return verificationResponse(request, properties.getUrl(), NonAutomotiveProductsDetailsResponse.class, sysSourceCode,
+                RequestType.Z00019);
+    }
+
+
+    /**
+     * 报价
+     *
+     * @param request 车辆确认 请求实体
+     * @return 响应
+     */
+    public QuotationResponse quotation(QuotationRequest request, String sysSourceCode) throws Exception {
+        return requestUrl(properties.getUrl(), request, QuotationResponse.class, sysSourceCode, RequestType.Z00006);
+    }
+
+    /**
+     * 核保
+     *
+     * @param underwritingRequest 核保 请求实体
+     * @return 响应
+     */
+    public UnderwritingResponse underwriting(UnderwritingRequest underwritingRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(underwritingRequest, properties.getUrl(), UnderwritingResponse.class, sysSourceCode, RequestType.Z00007);
+    }
+
+    /**
+     * 支付
+     *
+     * @param paymentRequest 支付申请 请求实体
+     * @return 响应
+     */
+    public PaymentResponse payment(PaymentRequest paymentRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(paymentRequest, properties.getUrl(), PaymentResponse.class, sysSourceCode, RequestType.Z00008);
+    }
+
+    /**
+     * 核保撤销
+     *
+     * @param paymentRequest 核保撤销 请求实体
+     * @return 响应
+     */
+    public BoHaiBaseResponse underwritingRevocation(UnderwritingRevocationRequest paymentRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(paymentRequest, properties.getUrl(), PaymentResponse.class, sysSourceCode, RequestType.Z00009);
+    }
+
+
+    /**
+     * 获取保单接口
+     *
+     * @param electronicPolicyRequest 保单请求
+     * @return 响应
+     */
+    public ElectronicPolicyResponse electronicPolicy(ElectronicPolicyRequest electronicPolicyRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(electronicPolicyRequest, properties.getUrl(), ElectronicPolicyResponse.class, sysSourceCode,
+                RequestType.Z00020);
+    }
+
+    /**
+     * 单证查询
+     *
+     * @param statusDocumentsRequest 单证查询
+     * @return 响应
+     */
+    public StatusDocumentsResponse statusDocuments(StatusDocumentsRequest statusDocumentsRequest, String sysSourceCode) throws Exception {
+        return verificationResponse(statusDocumentsRequest, properties.getUrl(), StatusDocumentsResponse.class, sysSourceCode,
+                RequestType.Z00021);
+    }
+
+    /**
+     * 验证响应
+     *
+     * @param responseCode 响应code
+     * @param responseMsg  响应内容
+     */
+    private void verificationResponseCode(String responseCode, String responseMsg) {
+        if (ResponseCode.R_Z00004.getCode().equals(responseCode)) {
+            throw new SystemException(responseMsg);
+        }
+    }
+
+    /**
+     * @param responseCode 渤海财险请求状态
+     * @param requestNo    请求内容
+     * @return
+     * @throws Exception
+     */
+    public String encryptionCallbackResponse(ResponseCode responseCode, String requestNo) throws Exception {
+        CallbackResponse callbackResponse = new CallbackResponse(responseCode, requestNo);
+        String json = JSON.toJSONString(callbackResponse, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty);
+        Map<String, String> stringStringMap = SignatureUtils.encryptAndSign(properties.getSelfPrivateKey(),
+                properties.getBoHaiPublicKey(), json, false, true);
+        return stringStringMap.get("content");
+    }
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/4/7 10:01
+     *  @param request  请求
+     *  @param sysSourceCode  编码
+     *  @Description: 获取交管查询校验码接口  请求 3.17
+     */
+    public VehicleCheckCodeResponse getVehicleCheckCode(VehicleCheckCodeRequest request, String sysSourceCode) throws Exception {
+        return verificationResponse(request, properties.getUrl(), VehicleCheckCodeResponse.class, sysSourceCode, RequestType.Z00003);
+    }
+}

+ 21 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/CertType.java

@@ -0,0 +1,21 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 证件类型代码
+ * @author: shenwd
+ * @date: 2025/3/3 17:25
+ **/
+@AllArgsConstructor
+@Getter
+public enum CertType {
+
+    CT_111("111", "居民身份证");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 44 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/Coverages.java

@@ -0,0 +1,44 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险险种
+ * @author: shenwd
+ * @date: 2025/3/4 08:32
+ **/
+@AllArgsConstructor
+@Getter
+public enum Coverages {
+
+    C_A("0301200", "机动车损失保险", "0401200", "新能源汽车损失保险"),
+    C_B("0301600", "机动车第三者责任保险", "0401600", "新能源汽车第三者责任保险"),
+    C_D3("0301701", "机动车车上人员责任保险(司机)", "0401701", "新能源汽车车上人员责任保险(司机)"),
+    C_D4("0301702", "机动车车上人员责任保险(乘客)", "0301702", "新能源汽车车上人员责任保险(乘客)"),
+    C_L("0301210", "附加车身划痕损失险", "0301210", "附加车身划痕损失险"),
+    C_BD("0301604", "附加法定节假日限额翻倍险", "0301604", "附加法定节假日限额翻倍险"),
+
+    C_SY_FJ_YBW1("0301002", "附加医保外医疗费用责任险(机动车第三者责任保险)", "0301002", "附加医保外医疗费用责任险(机动车第三者责任保险)"),
+    C_SY_FJ_YBW3("0301011", "附加医保外医疗费用责任险(机动车车上人员责任保险(司机))", "0301011", "附加医保外医疗费用责任险(机动车车上人员责任保险(司机))"),
+    C_SY_FJ_YBW2("0301012", "附加医保外医疗费用责任险(机动车车上人员责任保险(乘客))", "0301012", "附加医保外医疗费用责任险(机动车车上人员责任保险(乘客))"),
+
+    C_TY1("0301003", "道路救援服务特约条款", "0301003", "道路救援服务特约条款"),
+    C_TY2("0301004", "车辆安全检测特约条款", "0301004", "车辆安全检测特约条款"),
+    C_TY3("0301005", "代为驾驶服务特约条款", "0301005", "代为驾驶服务特约条款"),
+    C_TY4("0301006", "代为送检服务特约条款", "0301006", "代为送检服务特约条款"),
+
+    C_MJ1("0301007", "附加绝对免赔率特约条款(机动车损失保险)", "0301007", "附加绝对免赔率特约条款(机动车损失保险)"),
+    C_MJ2("0301008", "附加绝对免赔率特约条款(机动车第三者责任保险)", "0301008", "附加绝对免赔率特约条款(机动车第三者责任保险)"),
+    C_MJ3("0301009", "附加绝对免赔率特约条款(机动车车上人员责任保险(司机))", "0301009", "附加绝对免赔率特约条款(机动车车上人员责任保险(司机))"),
+    C_MJ4("0301010", "附加绝对免赔率特约条款(机动车车上人员责任保险(乘客))", "0301010", "附加绝对免赔率特约条款(机动车车上人员责任保险(乘客))");
+
+    private final String fuelOilCode;
+
+    private final String fuelOilDesc;
+
+    private final String newEnergyCode;
+
+    private final String newEnergyDesc;
+
+}

+ 25 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/CustomerType.java

@@ -0,0 +1,25 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 客户类型代码
+ * @author: shenwd
+ * @date: 2025/3/3 17:26
+ **/
+@Getter
+@AllArgsConstructor
+public enum CustomerType {
+
+    CT_1("1", "团体客户"),
+    CT_2("2","个人客户"),
+    CT_3("3","虚拟客户"),
+    CT_4("4","机关"),
+    CT_5("5","企业"),
+    CT_6("6","事业单位");
+
+    private final String code;
+
+    private final String desc;
+}

+ 53 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/DocumentClass.java

@@ -0,0 +1,53 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 17:56
+ **/
+@AllArgsConstructor
+@Getter
+public enum DocumentClass {
+
+    SFZ_01("SFZ_01", "身份证正面", "", ""),
+    SFZ_02("SFZ_02", "身份证反面", "", ""),
+
+    ZGZ_00("ZGZ_00", "资格证照片", "", ""),
+
+    LD_00("LD_00", "劳动合同照片", "", ""),
+
+    YP_00("YP_00", "应聘表照片", "", ""),
+
+    DX_00("DX_00", "定薪表照片", "", ""),
+
+    XC00("XC00", "新车合格证", "Z00400", "Z00404"),
+    GC00("GC00", "购车发票", "Z00400", "Z00401"),
+    GX00("GX00", "关系证明", "", ""),
+
+    C01("C01", "行驶证正面", "Z00400", "Z001044"),
+    D01("D01", "行驶证反面", "Z00400", "Z001044"),
+
+    C02("C02", "车主身份证正面", "Z00300", "Z001042"),
+    D02("D02", "车主身份证反面", "Z00300", "Z001042"),
+
+    C03("C03", "投保人身份证正面", "Z00100", "Z001042"),
+    D03("D03", "投保人身份证反面", "Z00100", "Z001042"),
+
+    C04("C04", "被保人身份证正面", "Z00200", "Z001042"),
+    D04("D04", "被保人身份证反面", "Z00200", "Z001042");
+
+
+    private final String code;
+
+    private final String desc;
+
+    // 大类
+    private final String document;
+
+    // 小类
+    private final String documentType;
+
+}

+ 22 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/FormatType.java

@@ -0,0 +1,22 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 保单格式
+ * @author: shenwd
+ * @date: 2025/3/3 17:39
+ **/
+@AllArgsConstructor
+@Getter
+public enum FormatType {
+
+    FT_0("0", "纸质保单"),
+    FT_1("1", "电子保单");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 50 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/InsurKind.java

@@ -0,0 +1,50 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @description: 险种   保险种类
+ * @author: shenwd
+ * @date: 2025/3/4 08:36
+ **/
+@Getter
+@AllArgsConstructor
+public enum InsurKind {
+
+    B("B", "第三者责任险"),
+    D4("D4", "乘客责任险"),
+    A("A", "机动车损失险"),
+    D3("D3", "司机责任险"),
+    MJ1("MJ1", "附加绝对免赔率特约条款(车损)"),
+    MJ2("MJ2", "附加绝对免赔率特约条款(机动车第三者责任保险)"),
+    MJ3("MJ3", "附加绝对免赔率特约条款(机动车车上人员责任保险(司机))"),
+    MJ4("MJ4", "附加绝对免赔率特约条款(机动车车上人员责任保险(乘客))"),
+    L("L", "附加车身划痕损失险"),
+    BD("BD", "附加法定节假日限额翻倍险"),
+    SY_FJ_YBW1("SY_FJ_YBW1", "附加医保外用药责任险(第三者责任保险)"),
+    SY_FJ_YBW2("SY_FJ_YBW2", "附加医保外用药责任险(车上人员责任保险(乘客))"),
+    SY_FJ_YBW3("SY_FJ_YBW3", "附加医保外用药责任险(车上人员责任保险(司机))"),
+
+    TY1("TY1", "道路救援服务特约条款"),
+    TY2("TY2", "车辆安全检测特约条款"),
+    TY3("TY3", "代为驾驶服务特约条款"),
+    TY4("TY4", "代为送检服务特约条款");
+
+    private final String code;
+
+    private final String desc;
+
+    /**
+     * 主险排除车损
+     *
+     * @return 排除车损的信息
+     */
+    public static List<String> removalOfVehicleDamage() {
+        return Arrays.asList(B.getCode(), D3.getCode(), D4.getCode());
+    }
+
+}

+ 95 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/InsuranceEnum.java

@@ -0,0 +1,95 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 15:45
+ **/
+@AllArgsConstructor
+@Getter
+public enum InsuranceEnum {
+
+    AAIC("AAIC", "安信农业保险股份有限公司", ""),
+    ABIC("ABIC", "安邦财产保险股份有限公司", ""),
+    ACIC("ACIC", "安诚财产保险股份有限公司", ""),
+    AHIC("AHIC", "安华农业保险股份有限公司", ""),
+    AICS("AICS", "永诚财产保险股份有限公司", "yongcheng"),
+    AIGC("AIGC", "美亚财产保险有限公司", ""),
+    AMIC("AMIC", "中航安盟财产保险有限公司", ""),
+    APIC("APIC", "安心财产保险有限责任公司", ""),
+    AZCN("AZCN", "京东安联财产保险有限公司", ""),
+    BGIC("BGIC", "北部湾财产保险股份有限公司", ""),
+    BOCI("BOCI", "中银保险有限公司", ""),
+    BPIC("BPIC", "渤海财产保险股份有限公司", "bohai"),
+    CAIC("CAIC", "长安责任保险股份有限公司", ""),
+    CATH("CATH", "国泰财产保险有限责任公司", ""),
+    CCBP("CCBP", "建信财产保险有限公司", ""),
+    CCIC("CCIC", "中国大地财产保险股份有限公司", ""),
+    CHAC("CHAC", "诚泰财产保险股份有限公司", "chengtai"),
+    CICP("CICP", "中华联合财产保险股份有限公司", ""),
+    CJCX("CJCX", "长江财产保险股份有限公司", ""),
+    CPIC("CPIC", "中国太平洋财产保险股份有限公司", "taipingyang"),
+    CRCI("CRCI", "中国铁路财产保险自保有限公司", ""),
+    CRIC("CRIC", "富德财产保险股份有限公司", ""),
+    DBIC("DBIC", "都邦财产保险股份有限公司", ""),
+    DHIC("DHIC", "鼎和财产保险股份有限公司", ""),
+    DICC("DICC", "史带财产保险股份有限公司", ""),
+    DJPC("DJPC", "大家财产保险有限责任公司", "dajia"),
+    EAIC("EAIC", "易安财产保险股份有限公司", ""),
+    FPIC("FPIC", "富邦财产保险有限公司", ""),
+    GPIC("GPIC", "中国人寿财产保险股份有限公司", "renshou"),
+    GYIC("GYIC", "国元农业保险股份有限公司", ""),
+    HAIC("HAIC", "华安财产保险股份有限公司", ""),
+    HBIC("HBIC", "恒邦财产保险股份有限公司", "hengbang"),
+    HGIC("HGIC", "海峡金桥财产保险股份有限公司", ""),
+    HHBX("HHBX", "华海财产保险股份有限公司", ""),
+    HNIC("HNIC", "华农财产保险股份有限公司", "huanong"),
+    HTIC("HTIC", "华泰财产保险有限公司", "huatai"),
+    HYIC("HYIC", "现代财产保险(中国)有限公司", ""),
+    JLIC("JLIC", "久隆财产保险有限公司", ""),
+    JTIC("JTIC", "锦泰财产保险股份有限公司", ""),
+    LIHI("LIHI", "利宝保险有限公司", ""),
+    MACN("MACN", "亚太财产保险有限公司", ""),
+    MSIC("MSIC", "三井住友海上火灾保险(中国)有限公司", ""),
+    PAIC("PAIC", "中国平安财产保险股份有限公司", "pingan"),
+    PICC("PICC", "中国人民财产保险股份有限公司", ""),
+    QHIC("QHIC", "新疆前海联合财产保险股份有限公司", ""),
+    RSIC("RSIC", "融盛财产保险股份有限公司", ""),
+    SJIC("SJIC", "日本财产保险(中国)有限公司", ""),
+    SMIC("SMIC", "阳光农业相互保险公司", ""),
+    SPIC("SPIC", "三星财产保险(中国)有限公司", ""),
+    TAIC("TAIC", "天安财产保险股份有限公司", ""),
+    TKIC("TKIC", "泰康在线财产保险股份有限公司", "taikang"),
+    TMNF("TMNF", "东京海上日动火灾保险(中国)有限公司", ""),
+    TPBX("TPBX", "安盛天平财产保险股份有限公司", "ansheng"),
+    TPIC("TPIC", "太平财产保险有限公司", "taiping"),
+    TSBX("TSBX", "泰山财产保险股份有限公司", ""),
+    ULIC("ULIC", "合众财产保险股份有限公司", ""),
+    UTIC("UTIC", "众诚汽车保险股份有限公司", ""),
+    XAIC("XAIC", "鑫安汽车保险股份有限公司", ""),
+    XDCX("XDCX", "国任财产保险股份有限公司", "guoren"),
+    YAIC("YAIC", "永安财产保险股份有限公司", "yongan"),
+    YDCX("YDCX", "英大泰和财产保险股份有限公司", ""),
+    YGBX("YGBX", "阳光财产保险股份有限公司", "yangguang"),
+    YPIC("YPIC", "黄河财产保险股份有限公司", ""),
+    YZIC("YZIC", "燕赵财产保险股份有限公司", ""),
+    ZAPA("ZAPA", "众安在线财产保险股份有限公司", "zongan"),
+    ZFIC("ZFIC", "珠峰财产保险股份有限公司", ""),
+    ZKIC("ZKIC", "紫金财产保险股份有限公司", "zijin"),
+    ZLIC("ZLIC", "中路财产保险股份有限公司", ""),
+    ZMBX("ZMBX", "中煤财产保险股份有限公司", "zhongmei"),
+    ZSIC("ZSIC", "浙商财产保险股份有限公司", ""),
+    ZYBX("ZYBX", "中原农业保险股份有限公司", ""),
+    ZYIC("ZYIC", "中意财产保险有限公司", ""),
+    SNPIC("SNPIC", "申能财产保险股份有限公司", "");
+
+    private final String code;
+
+    private final String name;
+
+    private final String pinyin;
+
+}

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

@@ -0,0 +1,24 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险 发票类型
+ * @author: shenwd
+ * @date: 2025/3/3 17:38
+ **/
+@AllArgsConstructor
+@Getter
+public enum InvoiceType {
+
+    IT_0("0", "纸质普票"),
+    IT_1("1", "电子普票"),
+    IT_2("2", "电子专票"),
+    IT_3("3", "纸质专票");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 40 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/RequestType.java

@@ -0,0 +1,40 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险 请求类型代码
+ * @author: shenwd
+ * @date: 2025/3/3 14:48
+ **/
+@Getter
+@AllArgsConstructor
+public enum RequestType {
+
+    Z00001("Z00001", "获取初始化参数"),
+    Z00002("Z00002", "生成订单号"),
+    Z00003("Z00003", "获取交管查询校验码"),
+    Z00004("Z00004", "车型查询"),
+    Z00005("Z00005", "车辆确认"),
+    Z00006("Z00006", "报价"),
+    Z00007("Z00007", "核保"),
+    Z00008("Z00008", "支付申请"),
+    Z00009("Z00009", "撤销核保"),
+    Z00010("Z00010", "获取短信验证码"),
+    Z00011("Z00011", "回收短信验证码"),
+    Z00014("Z00014", "公共影像上传"),
+    Z00017("Z00017", "续保查询"),
+    Z00018("Z00018", "车+X产品查询"),
+    Z00019("Z00019", "车+X产品详情查询"),
+    Z00020("Z00020", "电子保单下载"),
+    Z00021("Z00021", "单证状态查询"),
+    Z00022("Z00022", "支付信息回调"),
+    Z00023("Z00023", "保单结果回调"),
+    Z00024("Z00024", "人工审核信息回调");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 22 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/ResponseCode.java

@@ -0,0 +1,22 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险请求状态
+ * @author: shenwd
+ * @date: 2025/3/3 17:46
+ **/
+@AllArgsConstructor
+@Getter
+public enum ResponseCode {
+
+    R_Z00001("Z00001", "处理成功"),
+    R_Z00002("Z00002", "再次调用此接口确认"),
+    R_Z00004("Z00004", "处理失败");
+
+    private final String code;
+
+    private final String desc;
+}

+ 33 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/ResultCode.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 投保单状态
+ * @author: shenwd
+ * @date: 2025/3/4 08:50
+ **/
+@AllArgsConstructor
+@Getter
+public enum ResultCode {
+
+    RC_A0("A0", "核保通过(待缴费)"),
+    RC_A1("A1", "发生重复投保"),
+    RC_A2("A2", "拒保不可申诉"),
+    RC_A3("A3", "拒保可申诉"),
+    RC_A4("A4", "待人工审核(非标件)"),//待核保
+    RC_A6("A6", "核保失败"),
+    RC_B0("B0", "出单失败"),
+    RC_B3("B3", "待承保"),
+    RC_B4("B4", "修改中"),
+    RC_B5("B5", "已承保"),
+    RC_99("99", "已失效"),
+    RC_BZ("BZ", "系统异常"),
+    RC_BT("BT", "已退费");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 23 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleAffNature.java

@@ -0,0 +1,23 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险 车辆所属性质代码
+ * @author: shenwd
+ * @date: 2025/3/3 17:19
+ **/
+@Getter
+@AllArgsConstructor
+public enum VehicleAffNature {
+
+    VAN_1("1", "个人"),
+    VAN_2("2", "机关"),
+    VAN_3("3", "企业");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 23 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleKind.java

@@ -0,0 +1,23 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险 车辆种类
+ * @author: shenwd
+ * @date: 2025/3/3 17:16
+ **/
+@Getter
+@AllArgsConstructor
+public enum VehicleKind {
+
+    VK_A0("11", "客车"),
+    VK_A1("21", "货车"),
+    VK_A2("25", "货车");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 22 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleUsage.java

@@ -0,0 +1,22 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 17:21
+ **/
+@Getter
+@AllArgsConstructor
+public enum VehicleUsage {
+
+    VU_01("100",	"营业"),
+    VU_02("200",	"非营业");
+
+    private final String code;
+
+    private final String desc;
+
+}

+ 28 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/constant/enums/VehicleUsageDetail.java

@@ -0,0 +1,28 @@
+package com.jzg.quote.bohai.api.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 车辆用途
+ * @author: shenwd
+ * @date: 2025/3/3 17:22
+ **/
+@Getter
+@AllArgsConstructor
+public enum VehicleUsageDetail {
+
+    VUD_01("101", "营业出租租赁"),
+    VUD_02("102", "营业城公交"),
+    VUD_03("103", "营业公路客运"),
+    VUD_04("105", "营业货运"),
+    VUD_05("210", "非营业个人"),
+    VUD_06("230", "非营业机关"),
+    VUD_07("220", "非营业企业"),
+    VUD_08("240", "非营业货运");
+
+    // 编号
+    private final String code;
+    // 说明
+    private final String desc;
+}

+ 26 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/BoHaiConfigureParameters.java

@@ -0,0 +1,26 @@
+package com.jzg.quote.bohai.api.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 14:28
+ **/
+@Data
+public class BoHaiConfigureParameters implements ConfigureParameters {
+
+    // 合作方代码
+    private String sysSourceCode;
+
+    // 二级机构编码
+    private String insurerBranchCode;
+
+    // 中介机构代码
+    private String franchiserInstitutionCode;
+
+    // 机构渠道id
+    private String franchiserChannelId;
+
+}

+ 35 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/dto/DrivingInsuranceDTO.java

@@ -0,0 +1,35 @@
+package com.jzg.quote.bohai.api.entity.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 子订单中驾意险信息
+ * @author: shenwd
+ * @date: 2025/3/4 08:52
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+//@ApiModel("子订单中驾意险信息")
+public class DrivingInsuranceDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -8978643489925851120L;
+//    @ApiModelProperty("驾意险编号")
+    private String code;
+
+//    @ApiModelProperty("驾意险名称")
+    private String name;
+
+//    @ApiModelProperty("保单号")
+    private String policyNumber;
+
+//    @ApiModelProperty("投保单号")
+    private String applicationNumber;
+
+}

+ 48 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/dto/InsUploadImagesDTO.java

@@ -0,0 +1,48 @@
+package com.jzg.quote.bohai.api.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 18:02
+ **/
+@Data
+public class InsUploadImagesDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -8929969203446159196L;
+    /**
+     * 报价号
+     */
+    private String quoteNo;
+    /**
+     * 图片类型(C01车辆影像,C02车主身份证,C03投保人身份证,C04被保人身份证,C05验车照)
+     */
+    private String imageType;
+    /**
+     * 文件名称
+     */
+    private String fileName;
+    /**
+     * 文件路劲
+     */
+    private String filePath;
+    /**
+     * 文件存储ID
+     */
+    private String imageId;
+
+    /**
+     * 平安key
+     */
+    private String pinganKey;
+
+    /**
+     * id
+     */
+    private String id;
+}

+ 41 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/po/BoHaiApiOrder.java

@@ -0,0 +1,41 @@
+package com.jzg.quote.bohai.api.entity.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @description: 渤海财险
+ * @author: shenwd
+ * @date: 2025/3/4 15:44
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Document("bohai.api.order")
+public class BoHaiApiOrder {
+    @Id
+    private String id;
+    /**
+     * 交互唯一订单 OrderBase类的ordersNo
+     */
+    private String ordersNo;
+
+    /**
+     * 渤海财险 订单业务
+     * session id
+     */
+    private String busUniqueId;
+
+    /**
+     * 渤海财险投保单号
+     */
+    private String proposalNo;
+
+    /**
+     * 订单号,由渤海财险的生成订单号接口返回
+     */
+    private String orderNo;
+}

+ 60 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/po/InsTaskImagesBase64.java

@@ -0,0 +1,60 @@
+package com.jzg.quote.bohai.api.entity.po;
+
+import com.jzg.quote.bohai.api.entity.dto.InsUploadImagesDTO;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+/**
+ * @description: 图片转base64
+ * @author: shenwd
+ * @date: 2025/3/3 18:00
+ **/
+@Data
+@NoArgsConstructor
+public class InsTaskImagesBase64 {
+
+    /**
+     * 图片id
+     */
+    private String imageId;
+    /**
+     * 报价单号
+     */
+    private String quoteNo;
+    /**
+     * 图片类型(C01车辆影像,C02车主身份证,C03投保人身份证,C04被保人身份证,C05验车照)
+     */
+    private String imageType;
+    /**
+     * 文件名称
+     */
+    private String fileName;
+    /**
+     * 图片转base64 文件
+     */
+    private String base64String;
+
+
+    public InsTaskImagesBase64(InsUploadImagesDTO insUploadImagesDto, Map<String, String> map) {
+        this.imageId = insUploadImagesDto.getImageId();
+        this.quoteNo = insUploadImagesDto.getQuoteNo();
+        this.imageType = insUploadImagesDto.getImageType();
+        this.fileName = insUploadImagesDto.getFileName();
+        this.base64String = map.get(insUploadImagesDto.getImageId());
+        this.id=insUploadImagesDto.getId();
+        this.pinganKey =insUploadImagesDto.getPinganKey();
+    }
+
+    /***
+     *  平安上传的key
+     */
+    private String pinganKey;
+
+    /***
+     *  id
+     */
+    private String id;
+
+}

+ 135 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/BoHaiBaseRequest.java

@@ -0,0 +1,135 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.util.ObjectUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.UUID;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 14:26
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiBaseRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -2570382501451577195L;
+    @JsonProperty("baseParam")
+    private BaseParamDTO baseParam;
+
+    public void setBaseParam(BoHaiConfigureParameters parameters) {
+        if (ObjectUtils.isEmpty(this.baseParam)) {
+            baseParam = new BaseParamDTO();
+        }
+
+        baseParam.requestNo = UUID.randomUUID().toString().replace("-", "");
+        baseParam.requestTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"));
+        baseParam.ip = "118.81.124.183";
+        baseParam.insurerBranchCode = parameters.getInsurerBranchCode();
+        baseParam.franchiserInstitutionCode = parameters.getFranchiserInstitutionCode();
+        baseParam.franchiserChannel = new BaseParamDTO.FranchiserChannelDTO(parameters);
+    }
+
+    public void setBaseParamRequestType(String requestType) {
+        if (ObjectUtils.isEmpty(this.baseParam)) {
+            baseParam = new BaseParamDTO();
+        }
+        this.baseParam.requestType = requestType;
+    }
+
+    public void setBaseParam(BoHaiConfigureParameters parameters, String orderNo) {
+        setBaseParam(parameters);
+        baseParam.orderNo = orderNo;
+    }
+
+
+    @NoArgsConstructor
+    @Data
+    public static class BaseParamDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1597512790005631746L;
+        /**
+         * 订单号
+         */
+        @JsonProperty("orderNo")
+        private String orderNo;
+
+        /**
+         * 请求流水号
+         */
+        @JsonProperty("requestNo")
+        private String requestNo;
+
+        /**
+         * 请求时间
+         */
+        @JsonProperty("requestTime")
+        private String requestTime;
+
+        /**
+         * 请求类型
+         */
+        @JsonProperty("requestType")
+        private String requestType;
+
+        /**
+         * ip地址
+         */
+        @JsonProperty("ip")
+        private String ip;
+
+        /**
+         * 二级机构编码
+         */
+        @JsonProperty("insurerBranchCode")
+        private String insurerBranchCode;
+
+        /**
+         * 中介机构代码
+         */
+        @JsonProperty("franchiserInstitutionCode")
+        private String franchiserInstitutionCode;
+
+        /**
+         * 机构渠道信息
+         */
+        @JsonProperty("franchiserChannel")
+        private FranchiserChannelDTO franchiserChannel;
+
+        @NoArgsConstructor
+        @Data
+        public static class FranchiserChannelDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 1070571013841990648L;
+            /**
+             * 机构渠道id
+             */
+            @JsonProperty("franchiserChannelId")
+            private String franchiserChannelId;
+
+            /**
+             * 身份信息采集器编码
+             */
+            @JsonProperty("machineCode")
+            private String machineCode;
+
+            public FranchiserChannelDTO(BoHaiConfigureParameters parameters) {
+                this.franchiserChannelId = parameters.getFranchiserChannelId();
+            }
+
+        }
+
+    }
+
+}

+ 42 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/ElectronicPolicyRequest.java

@@ -0,0 +1,42 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 电子保单
+ * @author: shenwd
+ * @date: 2025/3/4 09:05
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ElectronicPolicyRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -1780602701294602343L;
+    @JsonProperty("policyNo")
+    private String policyNo;
+
+    @JsonProperty("policyType")
+    private String policyType;
+
+    public ElectronicPolicyRequest(BoHaiConfigureParameters parameters, String id, String jqpolicyno, String sypolicyno) {
+        this.setBaseParam(parameters, id);
+        this.policyNo = StringUtils.isNotEmpty(jqpolicyno) ? jqpolicyno : sypolicyno;
+        if (StringUtils.isEmpty(jqpolicyno)) {
+            this.policyType = "0";
+        } else if (StringUtils.isEmpty(sypolicyno)) {
+            this.policyType = "1";
+        } else {
+            this.policyType = "2";
+        }
+
+    }
+}

+ 27 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/GenerateOrderNoRequest.java

@@ -0,0 +1,27 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 生成订单接口
+ * @author: shenwd
+ * @date: 2025/3/3 14:36
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class GenerateOrderNoRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -8464551031213723939L;
+
+    public GenerateOrderNoRequest(BoHaiConfigureParameters parameters) {
+        this.setBaseParam(parameters);
+    }
+
+}

+ 108 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/ImageUploadRequest.java

@@ -0,0 +1,108 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.entity.vo.image.InsuranceImageVo;
+import com.jzg.quote.bohai.api.constant.enums.DocumentClass;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.entity.po.InsTaskImagesBase64;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 渤海财险 上传影像 请求
+ * @author: shenwd
+ * @date: 2025/3/3 17:49
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ImageUploadRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -4264809549045685813L;
+    @JsonProperty("fileInfos")
+    private List<FileInfosDTO> fileInfos;
+
+    @JsonProperty("busUniqueId")
+    private String busUniqueId;
+
+    public ImageUploadRequest(BoHaiConfigureParameters parameters, String orderNo, String busUniqueId, List<InsuranceImageVo> imageVoList) {
+        this.setBaseParam(parameters, orderNo);
+        this.setBusUniqueId(busUniqueId);
+        this.fileInfos = FileInfosDTO.toFileInfosDTOs(imageVoList);
+    }
+
+
+    @NoArgsConstructor
+    @Data
+    public static class FileInfosDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 4696592671583565893L;
+        /**
+         * 文件大类编码
+         */
+        @JsonProperty("documentClass")
+        private String documentClass;
+
+        /**
+         * 文件小类编码
+         */
+        @JsonProperty("documentType")
+        private String documentType;
+
+        /**
+         * 文件流
+         * 单个文件不超过5M,
+         * 多文件总大小不超过20M
+         */
+        @JsonProperty("base64")
+        private String base64;
+
+        /**
+         * 文件名称 包含后缀
+         */
+        @JsonProperty("fileName")
+        private String fileName;
+
+
+        public static List<FileInfosDTO> toFileInfosDTOList(List<InsTaskImagesBase64> imagesBase64){
+            return imagesBase64.stream().map(FileInfosDTO::toFileInfosDTO).collect(Collectors.toList());
+        }
+
+        private static FileInfosDTO toFileInfosDTO(InsTaskImagesBase64 imagesBase64){
+            FileInfosDTO fileInfosDTO = new FileInfosDTO();
+            DocumentClass document = DocumentClass.valueOf(imagesBase64.getImageType());
+            fileInfosDTO.setDocumentType(document.getDocumentType());
+            fileInfosDTO.setDocumentClass(document.getDocument());
+            fileInfosDTO.setFileName(imagesBase64.getFileName());
+            fileInfosDTO.setBase64(imagesBase64.getBase64String());
+            return fileInfosDTO;
+        }
+
+        private static List<FileInfosDTO> toFileInfosDTOs(List<InsuranceImageVo> imageVoList){
+            List<FileInfosDTO> fileInfosDTOS = new ArrayList<>();
+            imageVoList.forEach(imageVo -> {
+                imageVo.getImageBase64List().forEach(imageBase64 -> {
+                    FileInfosDTO fileInfosDTO = new FileInfosDTO();
+                    DocumentClass aClass = DocumentClass.valueOf(imageVo.getImageCode());
+                    fileInfosDTO.setDocumentType(aClass.getDocumentType());
+                    fileInfosDTO.setDocumentClass(aClass.getDocument());
+                    fileInfosDTO.setFileName(imageBase64.getImageName());
+                    fileInfosDTO.setBase64(imageBase64.getImageBase64Str());
+                    fileInfosDTOS.add(fileInfosDTO);
+                });
+            });
+            return fileInfosDTOS;
+        }
+
+    }
+
+}

+ 42 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/NonAutomotiveProductsDetailsRequest.java

@@ -0,0 +1,42 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.constant.enums.RequestType;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.entity.vo.ProductDetailsQueryVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 车+X产品详情
+ * @author: shenwd
+ * @date: 2025/3/3 18:19
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class NonAutomotiveProductsDetailsRequest extends BoHaiBaseRequest  {
+
+    @Serial
+    private static final long serialVersionUID = 4687973932481001689L;
+
+    @JsonProperty("productCode")
+    private String productCode;
+
+    @JsonProperty("packageCode")
+    private String packageCode;
+
+    @JsonProperty("version")
+    private String version;
+
+    public NonAutomotiveProductsDetailsRequest(BoHaiConfigureParameters parameters, ProductDetailsQueryVo productDetailsQueryVo) {
+        this.setBaseParam(parameters, RequestType.Z00019.getCode());
+        this.productCode = productDetailsQueryVo.getProductCode();
+        this.packageCode = productDetailsQueryVo.getPackageCode();
+        this.version = productDetailsQueryVo.getVersion();
+    }
+
+}

+ 109 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/NonAutomotiveProductsRequest.java

@@ -0,0 +1,109 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.constant.enums.RequestType;
+import com.jzg.quote.bohai.api.constant.enums.VehicleKind;
+import com.jzg.quote.bohai.api.constant.enums.VehicleUsage;
+import com.jzg.quote.bohai.api.constant.enums.VehicleUsageDetail;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.entity.vo.ProductQueryVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 车+X产品
+ * @author: shenwd
+ * @date: 2025/3/3 18:13
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class NonAutomotiveProductsRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -8957897097041720889L;
+    @JsonProperty("vehicleUsage")
+    private String vehicleUsage;
+
+    @JsonProperty("seatCount")
+    private String seatCount;
+
+    @JsonProperty("vehicleUsageDetail")
+    private String vehicleUsageDetail;
+
+    @JsonProperty("vehicleKind")
+    private String vehicleKind;
+
+    @JsonProperty("tonNumber")
+    private String tonNumber;
+
+    @JsonProperty("power")
+    private String power;
+
+    @JsonProperty("exhaustScale")
+    private String exhaustScale;
+    /**
+     * 投保人
+     */
+    @JsonProperty("applicantDto")
+    private PremPersonnelDto applicantDto;
+    /**
+     * 被保人
+     */
+    @JsonProperty("insuredDto")
+    private PremPersonnelDto insuredDto;
+
+
+    public NonAutomotiveProductsRequest(BoHaiConfigureParameters parameters, ProductQueryVo productQueryVo) {
+        this.setBaseParam(parameters, RequestType.Z00018.getCode());
+        // 车辆种类
+        VehicleKind vehicleKindEnum = VehicleKind.valueOf("VK_" + productQueryVo.getCimodelclass());
+        // 车辆使用性质
+        VehicleUsage vehicleUsageEnum = VehicleUsage.valueOf("VU_" + productQueryVo.getCarnature());
+        // 车辆用途
+        VehicleUsageDetail vehicleUsageDetailEnum = VehicleUsageDetail.valueOf("VUD_" + productQueryVo.getVehicleUse());
+
+        this.vehicleUsage = vehicleUsageEnum.getCode();
+        this.seatCount = productQueryVo.getSeatCount();
+        this.vehicleUsageDetail = vehicleUsageDetailEnum.getCode();
+        this.vehicleKind = vehicleKindEnum.getCode();
+
+        this.tonNumber = productQueryVo.getLimitLoad();
+        this.power = productQueryVo.getPowerScale();
+        this.exhaustScale = productQueryVo.getExhaustScale();
+        this.applicantDto = new PremPersonnelDto(productQueryVo.getPolicyHolderInfo());
+        this.insuredDto = new PremPersonnelDto(productQueryVo.getInsuredPersonInfo());
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PremPersonnelDto implements Serializable {
+
+        private static final long serialVersionUID = 49261748717534895L;
+
+        @JsonProperty("type")
+        private String type;
+
+        @JsonProperty("name")
+        private String name;
+
+        @JsonProperty("identifyType")
+        private String identifyType;
+
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+
+        public PremPersonnelDto(ProductQueryVo.CustomerInfoDTO policyHolderInfo) {
+            this.type = "1";
+            this.name = policyHolderInfo.getName();
+            this.identifyType = "111";
+            this.identifyNumber = policyHolderInfo.getIdentifyNumber();
+        }
+
+    }
+
+}

+ 36 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/PaymentRequest.java

@@ -0,0 +1,36 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 电子签名支付
+ * @author: shenwd
+ * @date: 2025/3/4 08:58
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class PaymentRequest extends BoHaiBaseRequest{
+
+    @Serial
+    private static final long serialVersionUID = -450923791967467547L;
+    @JsonProperty("busUniqueId")
+    private String busUniqueId;
+
+    @JsonProperty("payWay")
+    private String payWay;
+
+
+    public PaymentRequest(BoHaiConfigureParameters parameters, String orderNo, String busUniqueId) {
+        this.setBaseParam(parameters, orderNo);
+        this.busUniqueId = busUniqueId;
+        this.payWay = "82";
+    }
+
+}

+ 341 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/QuotationRequest.java

@@ -0,0 +1,341 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import cn.hutool.core.util.ArrayUtil;
+import com.fasterxml.jackson.annotation.JsonProperty;
+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.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.KindInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quote.bohai.api.constant.enums.Coverages;
+import com.jzg.quote.bohai.api.constant.enums.InsurKind;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.entity.vo.BoHaiQuoteAccidentVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 渤海财险 报价接口
+ * @author: shenwd
+ * @date: 2025/3/3 18:27
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class QuotationRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -6539396502627332558L;
+    /**
+     * 交强险信息
+     */
+    @JsonProperty("trafficPolicy")
+    private TrafficPolicyDTO trafficPolicy;
+
+    /**
+     * 商业险信息
+     */
+    @JsonProperty("businessPolicy")
+    private BusinessPolicyDTO businessPolicy;
+
+    /**
+     * 合同争议解决方式
+     */
+    @JsonProperty("argueSolution")
+    private String argueSolution;
+
+    /**
+     * 实名验证
+     */
+    @JsonProperty("realNameCheck")
+    private RealNameCheckDTO realNameCheck;
+
+    /**
+     * 财意险
+     */
+    @JsonProperty("unAutos")
+    private List<UnAutoDTO> unAutos;
+
+    //@JsonProperty("checkInfoList")
+    //private List<CheckInfoDTO> checkInfoList=null;
+
+    public QuotationRequest(BoHaiConfigureParameters parameters,
+                            QuoteVo quoteVo,
+                            String currentValue,
+                            String orderNO,
+                            List<BoHaiQuoteAccidentVo> accidentVo,
+                            String discount) {
+        this.setBaseParam(parameters, orderNO);
+        this.argueSolution = "1";
+        List<KindInfoVo> kindInfoVos = quoteVo.getKindInfoVo();
+        this.trafficPolicy = new TrafficPolicyDTO(quoteVo.getCiRiskInfoVo());
+        this.businessPolicy = new BusinessPolicyDTO(quoteVo.getBiRiskInfoVo(), kindInfoVos, currentValue, quoteVo.getCarInfoVo(), discount);
+        if(ArrayUtil.isNotEmpty(accidentVo)){
+            this.unAutos = accidentVo.stream().map(UnAutoDTO::new).collect(Collectors.toList());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class UnAutoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -5067823780790277487L;
+        @JsonProperty("productCode")
+        private String productCode;
+
+        @JsonProperty("packageCode")
+        private String packageCode;
+
+        @JsonProperty("copies")
+        private String copies;
+
+        public UnAutoDTO(BoHaiQuoteAccidentVo boHaiQuoteAccidentVo) {
+            this.productCode = boHaiQuoteAccidentVo.getProductCode();
+            this.packageCode = boHaiQuoteAccidentVo.getPackageCode();
+            this.copies = boHaiQuoteAccidentVo.getCopies();
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TrafficPolicyDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 5069562567513533213L;
+        @JsonProperty("startDate")
+        private String startDate;
+
+        @JsonProperty("endDate")
+        private String endDate;
+
+        @JsonProperty("vehicleTax")
+        private VehicleTaxDTO vehicleTax;
+
+        public TrafficPolicyDTO(RiskInfoVo riskInfoVo) {
+            this.startDate = riskInfoVo.getStartDate();
+            this.endDate = riskInfoVo.getEndDate();
+            this.vehicleTax = new VehicleTaxDTO();
+        }
+
+        @Data
+        public static class VehicleTaxDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -8036498687628336351L;
+            @JsonProperty("taxType")
+            private String taxType;
+
+            @JsonProperty("taxpayerFlag")
+            private String taxpayerFlag;
+
+            public VehicleTaxDTO() {
+                this.taxType = "T";
+                this.taxpayerFlag = "1";
+            }
+
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class BusinessPolicyDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -765015742401739534L;
+        /**
+         * 险别列表
+         */
+        @JsonProperty("coverages")
+        private List<CoveragesDTO> coverages;
+
+        /**
+         * 商业险起保时间
+         */
+        @JsonProperty("startDate")
+        private String startDate;
+
+        /**
+         * 商业险终保时间
+         */
+        @JsonProperty("endDate")
+        private String endDate;
+
+        /**
+         * 保费浮动项信息
+         */
+        @JsonProperty("floatingRateOption")
+        private FloatingRateOptionDTO floatingRateOption;
+
+        public BusinessPolicyDTO(RiskInfoVo riskInfoVo, List<KindInfoVo> kindList, String currentValue, CarInfoVo carInfo, String floatingRate) {
+            this.startDate = riskInfoVo.getStartDate();
+            this.endDate = riskInfoVo.getEndDate();
+            this.coverages = CoveragesDTO.toCoveragesDTOList(kindList, currentValue, carInfo);
+            this.floatingRateOption = new FloatingRateOptionDTO(floatingRate);
+        }
+
+
+        @NoArgsConstructor
+        @Data
+        public static class FloatingRateOptionDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -1586991814895460011L;
+            /**
+             * 期望总折扣率
+             */
+            @JsonProperty("floatingRate")
+            private String floatingRate;
+
+            public FloatingRateOptionDTO(String floatingRate) {
+                this.floatingRate = floatingRate;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CoveragesDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -2038548147622937239L;
+
+            /**
+             * 险别代码
+             */
+            @JsonProperty("coverageCode")
+            private String coverageCode;
+
+            /**
+             * 险别名称
+             */
+            @JsonProperty("coverageName")
+            private String coverageName;
+            /**
+             * seat: 乘客数 (机动车车上人员责任保险-乘客)
+             * repairFactorRate:指定修理厂费率(指定专修厂险,
+             * 国产车:车损险基准纯风险保费的10%~30%之间,选择国产默认10%;
+             * 进口车:车损险基准纯风险保费的15%~60%之间,选择进口默认20%。)
+             * importFlag:是否国产 0:国产 1:进口';
+             * claimLimitPerDay:每日赔付限额 (修理期间赔付险)
+             * maxClaimDays:最大赔付天数(修理期间赔付险)
+             * damageCardeductibles:绝对免赔额(车辆损失险)
+             * damageCarDeductiblesNoClaimRate: 车损险绝对免赔率
+             * serviceTimes: 服务次数
+             * serviceGrade: 服务款别
+             */
+            @JsonProperty("extendInfos")
+            private Map<String, String> extendInfos;
+
+            /**
+             * 保额
+             */
+            @JsonProperty("sumInsurd")
+            private String sumInsurd;
+
+            public static List<CoveragesDTO> toCoveragesDTOList(List<KindInfoVo> kindList, String currentValue, CarInfoVo carInfo) {
+                return kindList.stream().map(x -> toCoveragesDTO(x, currentValue, carInfo)).collect(Collectors.toList());
+            }
+
+            private static CoveragesDTO toCoveragesDTO(KindInfoVo kindInfoVo, String currentValue, CarInfoVo carInfo) {
+                String kindCode = kindInfoVo.getKindCode();
+                Coverages coverages = Coverages.valueOf("C_" + kindInfoVo.getKindCode());
+                CoveragesDTO coveragesDTO = new CoveragesDTO();
+                if (carInfo.isNewEnergyMark()) {
+                    coveragesDTO.setCoverageCode(coverages.getNewEnergyCode());
+                    coveragesDTO.setCoverageName(coverages.getNewEnergyDesc());
+                } else {
+                    coveragesDTO.setCoverageCode(coverages.getFuelOilCode());
+                    coveragesDTO.setCoverageName(coverages.getFuelOilDesc());
+                }
+                coveragesDTO.extendInfos = new HashMap<>();
+
+                if (InsurKind.A.getCode().equals(kindCode)) {
+                    coveragesDTO.setSumInsurd(currentValue);
+                }
+                // 乘客
+                else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getPassenger(), kindCode) >= 0) {
+                    int quantity = Integer.parseInt(carInfo.getSeatCount()) - 1;
+                    coveragesDTO.extendInfos.put("seat", String.valueOf(quantity));
+                    double v = quantity * Double.parseDouble(kindInfoVo.getUnitAmount());
+                    coveragesDTO.setSumInsurd(String.valueOf(v));
+                }
+                // 绝对免赔
+                else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getAbsoluteDeductible(), kindCode) >= 0) {
+                    coveragesDTO.extendInfos.put("", String.valueOf(kindInfoVo.getDeductibleRate()));
+                }
+                // 增值服务
+                else if (ArrayUtil.indexOf(InsuranceTypeCorrespondence.getSpecialContractClause(), kindCode) >= 0) {
+                    coveragesDTO.extendInfos.put("serviceTimes", String.valueOf(kindInfoVo.getServiceTimes()));
+                } else {
+                    coveragesDTO.setSumInsurd(String.valueOf(kindInfoVo.getAmount()));
+                }
+                return coveragesDTO;
+            }
+
+
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class RealNameCheckDTO implements Serializable {
+
+        private static final long serialVersionUID = 7007478686453041903L;
+
+        @JsonProperty("busSrePcmac")
+        private String busSrePcmac;
+
+        @JsonProperty("busSrePcip")
+        private String busSrePcip;
+
+        @JsonProperty("busSrePcname")
+        private String busSrePcname;
+
+        @JsonProperty("busSrePhone")
+        private String busSrePhone;
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/4/7 10:25
+     *  @Description:  交管验证码信息
+     */
+    @NoArgsConstructor
+    @Data
+    public static class CheckInfoDTO implements Serializable {
+
+        private static final long serialVersionUID = 422012236525748899L;
+        /***
+         *   Y	1:问题形式,2:图形验证码形式
+         */
+        @JsonProperty("answerFlag")
+        private String answerFlag;
+        /***
+         *   Y	问题类型为1时为回答问题的答案,
+         * 问题类型为2时为图形验证码值
+         */
+        @JsonProperty("answer")
+        private String answer;
+        /***
+         *  Y	返回值原样送请求
+         * Y:交强险,N:商业险
+         */
+        @JsonProperty("isTrafficQuestion")
+        private String isTrafficQuestion;
+
+        public CheckInfoDTO(String answerFlag, String answer, String isTrafficQuestion) {
+            this.answerFlag = answerFlag;
+            this.answer = answer;
+            this.isTrafficQuestion = isTrafficQuestion;
+        }
+    }
+}

+ 31 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/StatusDocumentsRequest.java

@@ -0,0 +1,31 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 单证查询
+ * @author: shenwd
+ * @date: 2025/3/4 09:11
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class StatusDocumentsRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 2553751293335840265L;
+    @JsonProperty("applicationNo")
+    private String applicationNo;
+
+    public StatusDocumentsRequest(BoHaiConfigureParameters parameters, String id, String applicationNo) {
+        this.setBaseParam(parameters, id);
+        this.applicationNo = applicationNo;
+    }
+
+}

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

@@ -0,0 +1,80 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+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/4 08:46
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class UnderwritingRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 4926822390971507888L;
+    @JsonProperty("businessPolicy")
+    private BusinessPolicyDTO businessPolicy;
+
+    @JsonProperty("trafficPolicy")
+    private TrafficPolicyDTO trafficPolicy;
+
+    public UnderwritingRequest(BoHaiConfigureParameters parameters, String orderNo) {
+        this.setBaseParam(parameters, orderNo);
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class BusinessPolicyDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 5564549381599703789L;
+        @JsonProperty("specialTermItems")
+        private List<SpecialTermItemsDTO> specialTermItems;
+
+        @NoArgsConstructor
+        @Data
+        public static class SpecialTermItemsDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 5989204321822826633L;
+            @JsonProperty("specialTermCode")
+            private String specialTermCode;
+
+            @JsonProperty("specialTermParams")
+            private String specialTermParams;
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class TrafficPolicyDTO implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = 447789784044058122L;
+        @JsonProperty("specialTermItems")
+        private List<SpecialTermItemsDTO> specialTermItems;
+
+        @NoArgsConstructor
+        @Data
+        public static class SpecialTermItemsDTO implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -8263482534266271461L;
+            @JsonProperty("specialTermCode")
+            private String specialTermCode;
+
+            @JsonProperty("specialTermParams")
+            private String specialTermParams;
+        }
+    }
+}

+ 33 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/UnderwritingRevocationRequest.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 核保撤销
+ * @author: shenwd
+ * @date: 2025/3/4 09:03
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UnderwritingRevocationRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -8530262060683315022L;
+    /**
+     * 订单业务
+     */
+    @JsonProperty("busUniqueId")
+    private String busUniqueId;
+
+
+    public UnderwritingRevocationRequest(BoHaiConfigureParameters parameters, String id, String busUniqueId) {
+        this.setBaseParam(parameters, id);
+        this.busUniqueId = busUniqueId;
+    }
+
+}

+ 49 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/VehicleCheckCodeRequest.java

@@ -0,0 +1,49 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 获取交管查询校验码接口  入参参数封装
+ * @author: shenwd
+ * @date: 2025/3/4 09:17
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class VehicleCheckCodeRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = -3664129897203331760L;
+    /**
+     * 车架号
+     */
+    @JsonProperty("vin")
+    private String vin;
+
+    /**
+     * 发动机号
+     */
+    @JsonProperty("engineNo")
+    private String engineNo;
+
+    /**
+     * 号牌号码
+     */
+    @JsonProperty("plateNo")
+    private String plateNo;
+
+
+    public VehicleCheckCodeRequest(BoHaiConfigureParameters parameters, String orderNo, String vin, String engineNo, String plateNo) {
+        this.setBaseParam(parameters, orderNo);
+        this.vin = vin;
+        this.engineNo = engineNo;
+        this.plateNo = plateNo;
+    }
+
+}

+ 572 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/request/VehicleConfirmationReqeust.java

@@ -0,0 +1,572 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.util.IDCardUtils;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.quote.CarInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.quote.RiskInfoVo;
+import com.jzg.quote.bohai.api.constant.enums.*;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.entity.response.VehicleTypeQueryResponse;
+import com.jzg.quote.bohai.api.entity.vo.PersonAreaVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 渤海财险 车辆确认请求接口
+ * @author: shenwd
+ * @date: 2025/3/3 16:53
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class VehicleConfirmationReqeust extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 5738667931387435773L;
+    @JsonProperty("vehicle")
+    private VehicleDTO vehicle;
+
+    @JsonProperty("carOwner")
+    private CarOwnerDTO carOwner;
+
+    @JsonProperty("holder")
+    private HolderDTO holder;
+
+    @JsonProperty("insureder")
+    private InsurederDTO insureder;
+
+
+    public VehicleConfirmationReqeust(BoHaiConfigureParameters parameters, QuoteVo quoteVo,
+                                      VehicleTypeQueryResponse.DataDTO.VehicleModelsDTO vehicleModelsDTO,
+                                      String orderNo, PersonAreaVo ownerInfoArea, PersonAreaVo insuredPersonArea,
+                                      PersonAreaVo policyHolderArea) {
+        String effectDate;
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            effectDate = quoteVo.getBiRiskInfoVo().getStartDate();
+        } else {
+            effectDate = quoteVo.getCiRiskInfoVo().getStartDate();
+        }
+
+        this.setBaseParam(parameters, orderNo);
+        // 车辆信息
+        CarInfoVo carInfo = quoteVo.getCarInfoVo();
+        this.vehicle = new VehicleDTO(carInfo, vehicleModelsDTO, effectDate);
+        // 车主
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        this.carOwner = new CarOwnerDTO(ownersInfo, ownerInfoArea);
+        // 投保人
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+        this.holder = new HolderDTO(policyHolderInfo, policyHolderArea);
+        // 被保人
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+        this.insureder = new InsurederDTO(insuredPersonInfo, insuredPersonArea);
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleDTO implements Serializable {
+
+        private static final long serialVersionUID = -2343894775576071422L;
+
+        /**
+         * 车辆识别代号/车架号
+         */
+        @JsonProperty("carVin")
+        private String carVin;
+
+        /**
+         * 车型编码
+         */
+        @JsonProperty("vehicleModelCode")
+        private String vehicleModelCode;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        private String engineNo;
+
+        /**
+         * 号牌号码
+         */
+        @JsonProperty("plateNo")
+        private String plateNo;
+
+        @JsonProperty("licenseType")
+        private String licenseType;
+
+        /**
+         * 初登日期
+         */
+        @JsonProperty("registerDate")
+        private String registerDate;
+
+        /**
+         * 指导价格
+         */
+        @JsonProperty("purchasePrice")
+        private String purchasePrice;
+
+        /**
+         * 是否新车
+         */
+        @JsonProperty("newVehicleFlag")
+        private String newVehicleFlag;
+
+        /**
+         * 车型名称 (品牌型号)
+         */
+        @JsonProperty("moldName")
+        private String moldName;
+
+        @JsonProperty("modelCode")
+        private String modelCode;
+        /**
+         * 座位数
+         */
+        @JsonProperty("seatCount")
+        private String seatCount;
+
+
+        @JsonProperty("purchaseinvoicesDate")
+        private String purchaseinvoicesDate;
+
+        /**
+         * 核定载质量(KG)
+         */
+        @JsonProperty("tonNumber")
+        private String tonNumber;
+
+        /**
+         * 燃料类型
+         */
+        @JsonProperty("fuelType")
+        private String fuelType;
+
+        /**
+         * 整备质量(KG)
+         */
+        @JsonProperty("emptyWeight")
+        private String emptyWeight;
+
+        /**
+         * 保险起期
+         */
+        @JsonProperty("effectDate")
+        private String effectDate;
+
+        /**
+         * 排气量(L)
+         */
+        @JsonProperty("exhaustMeasure")
+        private String exhaustMeasure;
+
+        /**
+         * 车辆种类
+         */
+        @JsonProperty("vehicleKind")
+        private String vehicleKind;
+
+        /**
+         * 车辆所属性质
+         */
+        @JsonProperty("vehicleAffNature")
+        private String vehicleAffNature;
+
+        /**
+         * 车辆使用性质
+         */
+        @JsonProperty("vehicleUsage")
+        private String vehicleUsage;
+
+        /**
+         * 车辆使用性质细分
+         */
+        @JsonProperty("vehicleUsageDetail")
+        private String vehicleUsageDetail;
+
+        /**
+         * 是否过户
+         */
+        @JsonProperty("isTransfer")
+        private String isTransfer;
+
+        /**
+         * 过户日期
+         */
+        @JsonProperty("transferDate")
+        private String transferDate;
+
+        @JsonProperty("vehicleTypeOfDrivingPermit")
+        private String vehicleTypeOfDrivingPermit;
+
+        @JsonProperty("secondHandVehicleFlag")
+        private String secondHandVehicleFlag;
+
+
+        public VehicleDTO(CarInfoVo carInfo, VehicleTypeQueryResponse.DataDTO.VehicleModelsDTO vehicleModelsDTO, String effectDate) {
+            this.carVin = carInfo.getVinNo();
+            this.vehicleModelCode = vehicleModelsDTO.getVehicleModelCode();
+            this.engineNo = carInfo.getEngineNo();
+            this.plateNo = carInfo.getLicenseNo();
+            this.licenseType = "02";
+            this.registerDate = carInfo.getRegisterDate();
+            this.purchasePrice = vehicleModelsDTO.getPurchasePrice();
+            // 新车
+            this.newVehicleFlag = StringUtils.isNotEmpty(carInfo.getLicenseNo()) ? "0" : "1";
+            this.moldName = vehicleModelsDTO.getMoldName();
+            this.modelCode = vehicleModelsDTO.getModelCode();
+
+            this.seatCount = carInfo.getSeatCount();
+            this.tonNumber = StringUtils.isEmpty(carInfo.getLimitLoad()) ? "0": carInfo.getLimitLoad();
+            this.fuelType = carInfo.getEnergyTypeCode();
+            this.emptyWeight = carInfo.getCompleteKerbMass();
+            this.exhaustMeasure = vehicleModelsDTO.getExhaustMeasure();
+            VehicleKind vehicleKindEnum = VehicleKind.valueOf("VK_" + carInfo.getCarKindCode());
+            this.effectDate = effectDate;
+            this.vehicleKind = vehicleKindEnum.getCode();
+            this.vehicleAffNature = VehicleAffNature.VAN_1.getCode();
+            // 车辆使用性质
+            VehicleUsage vehicleUsageEnum = VehicleUsage.valueOf("VU_" + carInfo.getCarNatureCode());
+            this.vehicleUsage = vehicleUsageEnum.getCode();
+            // 车辆用途
+            VehicleUsageDetail vehicleUsageDetailEnum = VehicleUsageDetail.valueOf("VUD_" + carInfo.getVehicleUseCode());
+            this.vehicleUsageDetail = vehicleUsageDetailEnum.getCode();
+            this.isTransfer = carInfo.isTransfer() ? "1" : "0";
+            this.transferDate = carInfo.getTransferDate();
+
+            this.vehicleTypeOfDrivingPermit = carInfo.getCarTypeCode();
+            this.secondHandVehicleFlag = "0";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CarOwnerDTO implements Serializable {
+
+        private static final long serialVersionUID = 8709315851618789033L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("ownerName")
+        private String ownerName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        /**
+         * 客户类型
+         */
+        @JsonProperty("customerType")
+        private String customerType;
+        /**
+         *
+         */
+        @JsonProperty("certiType")
+        private String certiType;
+
+        /**
+         * 邮箱
+         */
+        @JsonProperty("email")
+        private String email;
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public CarOwnerDTO(CustomerInfoVo ownerInfo, PersonAreaVo ownerInfoArea) {
+            this.certType = CertType.CT_111.getCode();
+            this.ownerName = ownerInfo.getName();
+            this.certNo = ownerInfo.getIdentifyNumber();
+            this.address = ownerInfo.getAddr();
+            this.phoneNumber = ownerInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = ownerInfo.getEmail();
+            this.certiType = ownerInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.residentialAddress = ownerInfo.getAddr();
+            this.provCode = ownerInfoArea.getProvinceCode();
+            this.provName = ownerInfoArea.getProvinceName();
+            this.cityCode = ownerInfoArea.getCityCode();
+            this.cityName = ownerInfoArea.getCityName();
+            this.distCode = ownerInfoArea.getCountyCode();
+            this.distName = ownerInfoArea.getCountyName();
+            this.birthday = IDCardUtils.GetBirthday(ownerInfo.getIdentifyNumber());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class HolderDTO implements Serializable {
+
+        private static final long serialVersionUID = -2088635630636574306L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("holderName")
+        private String holderName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        @JsonProperty("nation")
+        private String nation;
+
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+
+        @JsonProperty("certiType")
+        private String certiType;
+
+        @JsonProperty("issuer")
+        private String issuer;
+
+        @JsonProperty("email")
+        private String email;
+
+        @JsonProperty("invoiceType")
+        private String invoiceType;
+
+        @JsonProperty("bizFormatType")
+        private String bizFormatType;
+
+        @JsonProperty("forceFormatType")
+        private String forceFormatType;
+
+        @JsonProperty("elecApplicationFlag")
+        private String elecApplicationFlag;
+
+        @JsonProperty("customerType")
+        private String customerType;
+
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public HolderDTO(CustomerInfoVo policyHolderInfo, PersonAreaVo policyHolderArea) {
+            // 通用参数
+            this.certType = CertType.CT_111.getCode();
+            this.holderName = policyHolderInfo.getName();
+            this.certNo = policyHolderInfo.getIdentifyNumber();
+            this.address = policyHolderInfo.getAddr();
+            this.phoneNumber = policyHolderInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = policyHolderInfo.getEmail();
+            this.certiType = policyHolderInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+
+            // 个别参数
+            this.invoiceType = InvoiceType.IT_1.getCode();
+            this.bizFormatType = FormatType.FT_1.getCode();
+            this.forceFormatType = FormatType.FT_1.getCode();
+
+            // 省市县
+            this.provCode = policyHolderArea.getProvinceCode();
+            this.provName = policyHolderArea.getProvinceName();
+            this.cityCode = policyHolderArea.getCityCode();
+            this.cityName = policyHolderArea.getCityName();
+            this.distCode = policyHolderArea.getCountyCode();
+            this.distName = policyHolderArea.getCountyName();
+
+            this.residentialAddress = policyHolderInfo.getAddr();
+            this.birthday = IDCardUtils.GetBirthday(policyHolderInfo.getIdentifyNumber());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class InsurederDTO implements Serializable {
+
+        private static final long serialVersionUID = 1045840175935280892L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        @JsonProperty("nation")
+        private String nation;
+
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+
+        @JsonProperty("certiType")
+        private String certiType;
+
+        @JsonProperty("customerType")
+        private String customerType;
+
+        @JsonProperty("email")
+        private String email;
+
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public InsurederDTO(CustomerInfoVo insuredPersonInfo, PersonAreaVo insuredPersonArea) {
+            // 通用参数
+            this.certType = CertType.CT_111.getCode();
+            this.insuredName = insuredPersonInfo.getName();
+            this.certNo = insuredPersonInfo.getIdentifyNumber();
+            this.address = insuredPersonInfo.getAddr();
+            this.phoneNumber = insuredPersonInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = insuredPersonInfo.getEmail();
+            this.certiType = insuredPersonInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.residentialAddress = insuredPersonInfo.getAddr();
+            // 省市县
+            this.provCode = insuredPersonArea.getProvinceCode();
+            this.provName = insuredPersonArea.getProvinceName();
+            this.cityCode = insuredPersonArea.getCityCode();
+            this.cityName = insuredPersonArea.getCityName();
+            this.distCode = insuredPersonArea.getCountyCode();
+            this.distName = insuredPersonArea.getCountyName();
+            this.birthday = IDCardUtils.GetBirthday(insuredPersonInfo.getIdentifyNumber());
+
+        }
+
+    }
+
+
+}

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

@@ -0,0 +1,64 @@
+package com.jzg.quote.bohai.api.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 车辆查询请求参数
+ * @author: shenwd
+ * @date: 2025/3/3 16:33
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class VehicleTypeQueryRequest extends BoHaiBaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 483454793064182612L;
+    /**
+     * 车辆型号
+     */
+    @JsonProperty("vehicleBrandModelKey")
+    private String vehicleBrandModelKey;
+
+    /**
+     * 车架号
+     */
+    @JsonProperty("vin")
+    private String vin;
+
+    /**
+     * 发动机号
+     */
+    @JsonProperty("engineNo")
+    private String engineNo;
+
+    /**
+     * 车辆初始登记日期
+     */
+    @JsonProperty("firstRegisterDate")
+    private String firstRegisterDate;
+
+    /**
+     * 是否新车
+     */
+    @JsonProperty("newVehicleFlag")
+    private String newVehicleFlag;
+
+    /**
+     * add by hxl  2024-04-03  添加行业车型编码
+     */
+    @JsonProperty("modelCode")
+    private String modelCode;
+
+    public VehicleTypeQueryRequest(BoHaiConfigureParameters parameters, String vehicleBrandModelKey, String orderNo) {
+        this.setBaseParam(parameters, orderNo);
+        this.vehicleBrandModelKey = vehicleBrandModelKey;
+    }
+
+}

+ 42 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/BoHaiBaseResponse.java

@@ -0,0 +1,42 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 14:30
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiBaseResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5489561233132767139L;
+
+    @JsonProperty("responseCode")
+    private String responseCode;
+
+    @JsonProperty("responseMsg")
+    private String responseMsg;
+
+    @JsonProperty("baseParam")
+    private BaseParamDTO baseParam;
+
+    @NoArgsConstructor
+    @Data
+    public static class BaseParamDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -387691987089999421L;
+
+        @JsonProperty("requestNo")
+        private String requestNo;
+
+    }
+}

+ 41 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/CallbackResponse.java

@@ -0,0 +1,41 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.constant.enums.ResponseCode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/4 09:14
+ **/
+@NoArgsConstructor
+@Data
+public class CallbackResponse {
+
+    @JsonProperty("responseCode")
+    private String responseCode;
+
+    @JsonProperty("responseMsg")
+    private String responseMsg;
+
+    @JsonProperty("baseParam")
+    private BaseParamDTO baseParam;
+
+
+    public CallbackResponse(ResponseCode responseCode, String requestNo) {
+        this.responseCode = responseCode.getCode();
+        this.responseMsg = responseCode.getDesc();
+        this.baseParam = new BaseParamDTO(requestNo);
+    }
+
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Data
+    public static class BaseParamDTO {
+        @JsonProperty("requestNo")
+        private String requestNo;
+    }
+}

+ 43 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/ElectronicPolicyResponse.java

@@ -0,0 +1,43 @@
+package com.jzg.quote.bohai.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/4 09:06
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ElectronicPolicyResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -4158179084647516096L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+
+        @JsonProperty("trafficEPolicyUrl")
+        private String trafficEPolicyUrl;
+
+        @JsonProperty("trafficEFlagUrl")
+        private String trafficEFlagUrl;
+
+        @JsonProperty("businessEPolicyUrl")
+        private String businessEPolicyUrl;
+
+        // 非车保单
+        @JsonProperty("acciEPolicyUrl")
+        private String acciEPolicyUrl;
+
+    }
+}

+ 33 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/GenerateOrderNoResponse.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 16:24
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class GenerateOrderNoResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 8333642936965912523L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+
+        @JsonProperty("orderNo")
+        private String orderNo;
+    }
+
+}

+ 21 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/ImageUploadResponse.java

@@ -0,0 +1,21 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 渤海财险 上传影像 响应
+ * @author: shenwd
+ * @date: 2025/3/3 17:48
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class ImageUploadResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 1275045231261232172L;
+}

+ 52 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/NonAutomotiveProductsDetailsResponse.java

@@ -0,0 +1,52 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 渤海财险 车+X产品详情
+ * @author: shenwd
+ * @date: 2025/3/3 18:25
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class NonAutomotiveProductsDetailsResponse extends BoHaiBaseResponse{
+
+    @Serial
+    private static final long serialVersionUID = 7698477616684912529L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -2231175603558667195L;
+        @JsonProperty("coverages")
+        private List<CoveragesDTO> coverages;
+
+        @NoArgsConstructor
+        @Data
+        public static class CoveragesDTO implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -3339640950085029597L;
+            @JsonProperty("coverageName")
+            private String coverageName;
+
+            @JsonProperty("insuredAmount")
+            private String insuredAmount;
+
+        }
+
+    }
+
+}

+ 73 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/NonAutomotiveProductsResponse.java

@@ -0,0 +1,73 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 车+X产品
+ * @author: shenwd
+ * @date: 2025/3/3 18:18
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class NonAutomotiveProductsResponse  extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -6042706725380391111L;
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 8763936387970709454L;
+
+        @JsonProperty("products")
+        private List<ProductsDTO> products;
+
+        @NoArgsConstructor
+        @Data
+        public static class ProductsDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -5344199431955133535L;
+
+            @JsonProperty("productType")
+            private String productType;
+
+            @JsonProperty("productCode")
+            private String productCode;
+
+            @JsonProperty("premium")
+            private String premium;
+
+            @JsonProperty("minInsuredAge")
+            private String minInsuredAge;
+
+            @JsonProperty("maxInsuredAge")
+            private String maxInsuredAge;
+
+            @JsonProperty("packageCode")
+            private String packageCode;
+
+            @JsonProperty("packageName")
+            private String packageName;
+
+            @JsonProperty("version")
+            private String version;
+
+            @JsonProperty("maxCopies")
+            private String maxCopies;
+        }
+    }
+}

+ 44 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/PaymentResponse.java

@@ -0,0 +1,44 @@
+package com.jzg.quote.bohai.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/4 08:59
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class PaymentResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -3967549405502069263L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+
+        @JsonProperty("payNo")
+        private String payNo;
+
+        @JsonProperty("checkCode")
+        private String checkCode;
+
+        @JsonProperty("amount")
+        private String amount;
+
+        @JsonProperty("payUrl")
+        private String payUrl;
+
+        @JsonProperty("paymentEndDate")
+        private String paymentEndDate;
+    }
+}

+ 510 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/QuotationResponse.java

@@ -0,0 +1,510 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/4 08:41
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class QuotationResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -7074383106771349265L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444305L;
+        /**
+         * 保额
+         */
+        @JsonProperty("sumInsurd")
+        private String sumInsurd;
+
+        /**
+         * 总保费
+         */
+        @JsonProperty("premium")
+        private String premium;
+
+        /**
+         * 车辆信息
+         */
+        @JsonProperty("vehicle")
+        private VehicleDTO vehicle;
+
+        /**
+         * 车主信息
+         */
+        @JsonProperty("carOwner")
+        private CarOwnerDTO carOwner;
+
+        /**
+         * 投保人信息
+         */
+        @JsonProperty("holder")
+        private HolderDTO holder;
+
+        /**
+         * 被保人信息
+         */
+        @JsonProperty("insureder")
+        private InsurederDTO insureder;
+
+        /**
+         * 商业险信息
+         */
+        @JsonProperty("businessPolicy")
+        private BusinessPolicyDTO businessPolicy;
+
+        /**
+         * 交强险信息
+         */
+        @JsonProperty("trafficPolicy")
+        private TrafficPolicyDTO trafficPolicy;
+
+        /**
+         * 订单业务唯一标识
+         */
+        @JsonProperty("busUniqueId")
+        private String busUniqueId;
+
+        /**
+         * 转保问题回答
+         */
+        @JsonProperty("checkInfoList")
+        private List<CheckInfoDTO> checkInfoList;
+
+        /**
+         * 财意险保费
+         */
+        @JsonProperty("unAutoPremium")
+        private UnAutoPremiumDTO unAutoPremium;
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -806570876742330810L;
+            /**
+             * 参考实际价值
+             */
+            @JsonProperty("currentValue")
+            private String currentValue;
+
+            /**
+             * 车辆识别代号/车架号
+             */
+            @JsonProperty("carVin")
+            private String carVin;
+
+            /**
+             * 车型编码
+             */
+            @JsonProperty("vehicleModelCode")
+            private String vehicleModelCode;
+
+            /**
+             * 发动机号
+             */
+            @JsonProperty("engineNo")
+            private String engineNo;
+
+            /**
+             * 车牌号码
+             */
+            @JsonProperty("plateNo")
+            private String plateNo;
+
+            @JsonProperty("plateColor")
+            private String plateColor;
+
+            /**
+             * 初登日期
+             */
+            @JsonProperty("registerDate")
+            private String registerDate;
+
+            /**
+             * 新车指导价
+             */
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CarOwnerDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -4953589376949080420L;
+            @JsonProperty("ownerName")
+            private String ownerName;
+
+            /**
+             * 证件类型
+             */
+            @JsonProperty("certType")
+            private String certType;
+
+            /**
+             * 证件号码
+             */
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class HolderDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -8424986900592324029L;
+            @JsonProperty("holderName")
+            private String holderName;
+            @JsonProperty("certType")
+            private String certType;
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+
+            /**
+             * 发票类型
+             */
+            @JsonProperty("invoiceType")
+            private String invoiceType;
+
+            /**
+             * 商业险保单格式
+             */
+            @JsonProperty("bizFormatType")
+            private String bizFormatType;
+
+            /**
+             * 交强险保单格式
+             */
+            @JsonProperty("forceFormatType")
+            private String forceFormatType;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class InsurederDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 8204617214215277369L;
+            @JsonProperty("insuredName")
+            private String insuredName;
+            @JsonProperty("certType")
+            private String certType;
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessPolicyDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 5450064515568215998L;
+            /**
+             * 险别列表
+             */
+            @JsonProperty("coverages")
+            private List<CoveragesDTO> coverages;
+
+            /**
+             * 特别约定条款
+             */
+            @JsonProperty("specialTermItems")
+            private List<SpecialTermItemsDTO> specialTermItems;
+
+            /**
+             * 商业险投保单号
+             */
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            /**
+             * 商业险保单号
+             */
+            @JsonProperty("policyNo")
+            private String policyNo;
+
+            /**
+             * 商业险保费
+             */
+            @JsonProperty("premium")
+            private String premium;
+
+            /**
+             * 商业险保额
+             */
+            @JsonProperty("sumInsurd")
+            private String sumInsurd;
+            @JsonProperty("startDate")
+            private String startDate;
+            @JsonProperty("endDate")
+            private String endDate;
+
+            // 2024-11-18 新增商业险维度编码
+            @JsonProperty("dimenSionCode")
+            private String dimenSionCode;
+
+            //  add by hxl  2024-04-07
+            @JsonProperty("errorMsg")
+            private String errorMsg;
+
+            @JsonProperty("floatingRateOption")
+            private FloatingRateOptionDTO floatingRateOption;
+
+
+            @NoArgsConstructor
+            @Data
+            public static class FloatingRateOptionDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 4212441794484941902L;
+                @JsonProperty("maxFloatingRate")
+                private String maxFloatingRate;
+
+                @JsonProperty("minFloatingRate")
+                private String minFloatingRate;
+
+                @JsonProperty("floatingRate")
+                private String floatingRate;
+
+                @JsonProperty("nonClaimDiscountRate")
+                private String nonClaimDiscountRate	;
+
+                @JsonProperty("trafficTransgressRate")
+                private String trafficTransgressRate;
+
+                @JsonProperty("adjustFactor")
+                private String adjustFactor;
+            }
+
+
+            @NoArgsConstructor
+            @Data
+            public static class CoveragesDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 4184476442463160091L;
+                /**
+                 * 险别代码
+                 */
+                @JsonProperty("coverageCode")
+                private String coverageCode;
+
+                /**
+                 * 险别名称
+                 */
+                @JsonProperty("coverageName")
+                private String coverageName;
+                @JsonProperty("isNonDeductionCovered")
+                private String isNonDeductionCovered;
+
+                /**
+                 * 保额
+                 */
+                @JsonProperty("sumInsurd")
+                private String sumInsurd;
+
+                /**
+                 * 保费
+                 */
+                @JsonProperty("premium")
+                private String premium;
+                @JsonProperty("floatingRate")
+                private String floatingRate;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class SpecialTermItemsDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = -696978603455134076L;
+                @JsonProperty("specialTermCode")
+                private String specialTermCode;
+
+                @JsonProperty("specialTermText")
+                private String specialTermText;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TrafficPolicyDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -8649307668401416001L;
+            /**
+             * 交强险投保单号
+             */
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            /**
+             * 交强险保单号
+             */
+            @JsonProperty("policyNo")
+            private String policyNo;
+
+            /**
+             * 交强险保额
+             */
+            @JsonProperty("sumInsurd")
+            private String sumInsurd;
+
+            /**
+             * 交强险保费
+             */
+            @JsonProperty("premium")
+            private String premium;
+
+            /**
+             * 车船税
+             */
+            @JsonProperty("vehicleTax")
+            private VehicleTaxDTO vehicleTax;
+
+            @JsonProperty("startDate")
+            private String startDate;
+
+            @JsonProperty("endDate")
+            private String endDate;
+
+            // 2024-11-18 新增交强险维度编码
+            @JsonProperty("dimenSionCode")
+            private String dimenSionCode;
+
+            @NoArgsConstructor
+            @Data
+            public static class VehicleTaxDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 5184120330503187940L;
+                /**
+                 * 总额
+                 */
+                @JsonProperty("totalAmount")
+                private String totalAmount;
+
+                /**
+                 * 纳税类型
+                 */
+                @JsonProperty("taxType")
+                private String taxType;
+
+                /**
+                 * 欠税总额(含滞纳金)
+                 */
+                @JsonProperty("overdueTaxAmount")
+                private String overdueTaxAmount;
+
+                /**
+                 * 滞纳金
+                 */
+                @JsonProperty("lateFee")
+                private String lateFee;
+
+                /**
+                 * 补缴所属开始日期
+                 */
+                @JsonProperty("overdueTaxStartDate")
+                private String overdueTaxStartDate;
+
+                /**
+                 * 补缴所属结束日期
+                 */
+                @JsonProperty("overdueTaxEndDate")
+                private String overdueTaxEndDate;
+
+                /**
+                 * 申报状态
+                 * 0: 未申报
+                 * 1: 已申报
+                 * 2: 已完税
+                 * 9: 未知
+                 */
+                @JsonProperty("declareStatus")
+                private String declareStatus;
+
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CheckInfoDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -7310260036900373077L;
+            @JsonProperty("answerFlag")
+            private String answerFlag;
+
+            @JsonProperty("checkCode")
+            private String checkCode;
+
+            @JsonProperty("question")
+            private String question;
+
+            @JsonProperty("isTrafficQuestion")
+            private String isTrafficQuestion;
+
+        }
+
+
+        @NoArgsConstructor
+        @Data
+        public static class UnAutoPremiumDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -6416113416581494822L;
+            @JsonProperty("premium")
+            private String premium;
+
+            @JsonProperty("propertyPremium")
+            private String propertyPremium;
+
+            @JsonProperty("casualtyPremium")
+            private String casualtyPremium;
+
+        }
+
+    }
+}

+ 59 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/StatusDocumentsResponse.java

@@ -0,0 +1,59 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/4 09:13
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class StatusDocumentsResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 2242621970971062373L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2863430719526780809L;
+        @JsonProperty("documentList")
+        private List<DocumentListDTO> documentList;
+
+        @NoArgsConstructor
+        @Data
+        public static class DocumentListDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 1436500973928431777L;
+            @JsonProperty("policyNo")
+            private String policyNo;
+
+            @JsonProperty("insuranceType")
+            private String insuranceType;
+
+            @JsonProperty("applicationNo ")
+            private String applicationNo;
+
+            @JsonProperty("status")
+            private String status;
+
+            @JsonProperty("auditOpinion")
+            private String auditOpinion;
+
+        }
+    }
+}

+ 201 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/UnderwritingResponse.java

@@ -0,0 +1,201 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quote.bohai.api.constant.enums.ResultCode;
+import com.jzg.quote.bohai.api.entity.dto.DrivingInsuranceDTO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.springframework.util.ObjectUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description: 渤海财险 核保响应
+ * @author: shenwd
+ * @date: 2025/3/4 08:47
+ **/
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class UnderwritingResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -8793975250540002639L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 5790787222952173427L;
+        @JsonProperty("trafficResultCode")
+        private String trafficResultCode;
+
+        @JsonProperty("trafficResultMsg")
+        private String trafficResultMsg;
+
+        @JsonProperty("businessResultCode")
+        private String businessResultCode;
+
+        @JsonProperty("businessResultMsg")
+        private String businessResultMsg;
+
+        @JsonProperty("total")
+        private String total;
+
+        @JsonProperty("propertyPolicies")
+        private List<UnAutoPolicyDTO> propertyPolicies;
+
+        @JsonProperty("casualtyPolicies")
+        private List<UnAutoPolicyDTO> casualtyPolicies;
+
+        @JsonProperty("businessPolicy")
+        private BusinessPolicyDTO businessPolicy;
+
+        @JsonProperty("trafficPolicy")
+        private TrafficPolicyDTO trafficPolicy;
+
+        public List<UnAutoPolicyDTO> getPropertyPolicies() {
+            return ObjectUtils.isEmpty(propertyPolicies) ? new ArrayList<>() : propertyPolicies;
+        }
+
+        public List<UnAutoPolicyDTO> getCasualtyPolicies() {
+            return ObjectUtils.isEmpty(casualtyPolicies) ? new ArrayList<>() : casualtyPolicies;
+        }
+
+        public int verificationUnderwriting() {
+            int traffic = 1;
+            int business = 1;
+
+            if (StringUtils.isNotEmpty(this.trafficResultCode)) {
+                traffic = extracted(this.trafficResultCode);
+            }
+
+            if (StringUtils.isNotEmpty(this.businessResultCode)) {
+                business = extracted(this.businessResultCode);
+            }
+
+            if (traffic == 1 && business == 1) {
+                return 1;
+            } else if (traffic == 2 || business == 2) {
+                return 2;
+            }
+            return 0;
+        }
+
+        private int extracted(String resultCode) {
+            if (ResultCode.RC_A0.getCode().equals(resultCode)) {
+                return 1;
+            } else if (ResultCode.RC_A4.getCode().equals(resultCode)) {
+                return 2;
+            }
+            return 0;
+        }
+
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessPolicyDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -1298331388910039993L;
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            @JsonProperty("specialTermItems")
+            private List<SpecialTermItemsDTO> specialTermItems;
+
+            @NoArgsConstructor
+            @Data
+            public static class SpecialTermItemsDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 6332068712896954306L;
+                @JsonProperty("specialTermCode")
+                private String specialTermCode;
+                @JsonProperty("specialTermText")
+                private String specialTermText;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TrafficPolicyDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 6076446236495759377L;
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            @JsonProperty("specialTermItems")
+            private List<SpecialTermItemsDTO> specialTermItems;
+
+            @NoArgsConstructor
+            @Data
+            public static class SpecialTermItemsDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = -7735576897443595113L;
+                @JsonProperty("specialTermCode")
+                private String specialTermCode;
+
+                @JsonProperty("specialTermText")
+                private String specialTermText;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class UnAutoPolicyDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 4376155345058349268L;
+            /**
+             * 产品编码
+             */
+            @JsonProperty("productCode")
+            private String productCode;
+
+            /**
+             * 套餐编码
+             */
+            @JsonProperty("packageCode")
+            private String packageCode;
+
+            /**
+             * 投保单号
+             */
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            /**
+             * 非车核保规则
+             */
+            @JsonProperty("resultMsg")
+            private String resultMsg;
+
+            private static final String MESSAGES = "核保成功";
+
+            public DrivingInsuranceDTO toDrivingInsuranceDto() {
+                if (StringUtils.isEmpty(this.getApplicationNo())) {
+                    throw new SystemException(this.getResultMsg());
+                }
+
+                DrivingInsuranceDTO drivingInsuranceDto = new DrivingInsuranceDTO();
+                drivingInsuranceDto.setCode(this.getProductCode());
+                drivingInsuranceDto.setName(this.getPackageCode());
+                drivingInsuranceDto.setApplicationNumber(this.getApplicationNo());
+                return drivingInsuranceDto;
+            }
+
+        }
+    }
+}

+ 37 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleCheckCodeResponse.java

@@ -0,0 +1,37 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * @description: 获取交管查询校验码接口  出参参数封装
+ * @author: shenwd
+ * @date: 2025/3/4 09:18
+ **/
+@NoArgsConstructor
+@Data
+public class VehicleCheckCodeResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -4273927093821684650L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        /***
+         * 图形校验码字
+         */
+        @JsonProperty("checkCode")
+        private String checkCode;
+        /***
+         * 查询码
+         */
+        @JsonProperty("checkNo")
+        private String checkNo;
+    }
+}

+ 67 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleConfirmationResponse.java

@@ -0,0 +1,67 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description: 车辆确认 返回数据
+ * @author: shenwd
+ * @date: 2025/3/3 16:52
+ **/
+@NoArgsConstructor
+@Data
+public class VehicleConfirmationResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -1117358781373926565L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JsonProperty("vehicleModels")
+        private List<VehicleModelsDTO> vehicleModels;
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleModelsDTO {
+            @JsonProperty("familyCode")
+            private String familyCode;
+            @JsonProperty("familyName")
+            private String familyName;
+            @JsonProperty("engineCapacity")
+            private String engineCapacity;
+            @JsonProperty("vehicleAlias")
+            private String vehicleAlias;
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+            @JsonProperty("moldName")
+            private String moldName;
+            @JsonProperty("seatCount")
+            private String seatCount;
+            @JsonProperty("moldCharacterCode")
+            private String moldCharacterCode;
+            @JsonProperty("producingArea")
+            private String producingArea;
+            @JsonProperty("vehicleBrand")
+            private String vehicleBrand;
+            @JsonProperty("yearPattern")
+            private String yearPattern;
+            @JsonProperty("emptyWeight")
+            private String emptyWeight;
+            @JsonProperty("carryingCapacity")
+            private Object carryingCapacity;
+            @JsonProperty("deductionDueCodeJY")
+            private String deductionDueCodeJY;
+            @JsonProperty("fuelType")
+            private String fuelType;
+            @JsonProperty("currentValue")
+            private String currentValue;
+        }
+    }
+}

+ 138 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/response/VehicleTypeQueryResponse.java

@@ -0,0 +1,138 @@
+package com.jzg.quote.bohai.api.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+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/3 16:30
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = 8820284696823147297L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 9050692389631367223L;
+        /**
+         * 车型数量
+         */
+        @JsonProperty("totalCount")
+        private String totalCount;
+
+        /**
+         * 车型列表
+         */
+        @JsonProperty("vehicleModels")
+        private List<VehicleModelsDTO> vehicleModels;
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleModelsDTO implements Serializable, CarModelsFilter {
+
+            private static final long serialVersionUID = -8338971802644830464L;
+
+            @JsonProperty("moldCharacterCode")
+            private String moldCharacterCode;
+
+            /**
+             * 车型名称
+             */
+            @JsonProperty("moldName")
+            private String moldName;
+
+            /**
+             * 品牌名称
+             */
+            @JsonProperty("vehicleBrand")
+            private String vehicleBrand;
+
+            /**
+             * 车型别名
+             */
+            @JsonProperty("vehicleAlias")
+            private String vehicleAlias;
+
+            /**
+             * 新车指导价
+             */
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+
+            /**
+             * 座位数
+             */
+            @JsonProperty("seatCount")
+            private String seatCount;
+
+            /**
+             * 整备质量(KG)
+             */
+            @JsonProperty("emptyWeight")
+            private String emptyWeight;
+
+            @JsonProperty("carryingCapacity")
+            private String carryingCapacity;
+
+            @JsonProperty("engineCapacity")
+            private String engineCapacity;
+
+            /**
+             * 行业车型编码
+             */
+            @JsonProperty("modelCode")
+            private String modelCode;
+
+            /**
+             * 年份
+             */
+            @JsonProperty("yearPattern")
+            private String yearPattern;
+
+            @JsonProperty("exhaustMeasure")
+            private String exhaustMeasure;
+
+            @JsonProperty("vehicleModelCode")
+            private String vehicleModelCode;
+
+            @Override
+            public String getPurchasePrice() {
+                return purchasePrice;
+            }
+
+            @Override
+            public String getCarYear() {
+                return yearPattern;
+            }
+
+            /*未引入CoreModelsVo,先注释
+            public CoreModelsVo toCoreModelsVo(){
+                CoreModelsVo coreModelsVo = new CoreModelsVo();
+                coreModelsVo.setModelCode(this.getModelCode());
+                coreModelsVo.setModelCode(this.getModelCode());
+                coreModelsVo.setSeatCount(this.seatCount);
+                coreModelsVo.setCarYear(this.getCarYear());
+                coreModelsVo.setPurchasePrice(this.getPurchasePrice());
+                coreModelsVo.setEnginedesc(this.getEngineCapacity());
+                return coreModelsVo;
+            }*/
+        }
+    }
+}

+ 32 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/BoHaiQuoteAccidentVo.java

@@ -0,0 +1,32 @@
+package com.jzg.quote.bohai.api.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 驾意险
+ * @author: shenwd
+ * @date: 2025/3/3 18:29
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+//@ApiModel("驾意险")
+public class BoHaiQuoteAccidentVo implements Serializable {
+
+    private static final long serialVersionUID = -3398555586817573322L;
+
+//    @ApiModelProperty("产品编码")
+    private String productCode;
+
+//    @ApiModelProperty("套餐编码")
+    private String packageCode;
+
+//    @ApiModelProperty("份数")
+    private String copies;
+
+
+}

+ 44 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/PersonAreaVo.java

@@ -0,0 +1,44 @@
+package com.jzg.quote.bohai.api.entity.vo;
+
+import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 17:09
+ **/
+@Data
+@NoArgsConstructor
+public class PersonAreaVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -3920242388874610188L;
+    //省
+    private String provinceCode;
+    private String provinceName;
+
+
+    //市
+    private String cityCode;
+    private String cityName;
+
+    //区
+    private String countyCode;
+    private String countyName;
+
+
+
+    public PersonAreaVo(CustomerInfoVo customerInfoVo) {
+        this.provinceCode = customerInfoVo.getProvinceCode();
+        this.provinceName = customerInfoVo.getProvince();
+        this.cityCode = customerInfoVo.getCityCode();
+        this.cityName = customerInfoVo.getCity();
+        this.countyCode = customerInfoVo.getCountyCode();
+        this.countyName = customerInfoVo.getCounty();
+    }
+}

+ 29 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/ProductDetailsQueryVo.java

@@ -0,0 +1,29 @@
+package com.jzg.quote.bohai.api.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 18:21
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductDetailsQueryVo {
+
+//    @ApiModelProperty(value = "协议id")
+    private String agreementId;
+
+//    @ApiModelProperty("产品编码")
+    private String productCode;
+
+//    @ApiModelProperty("套餐编码")
+    private String packageCode;
+
+//    @ApiModelProperty("版本号")
+    private String version;
+
+}

+ 73 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/entity/vo/ProductQueryVo.java

@@ -0,0 +1,73 @@
+package com.jzg.quote.bohai.api.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 车+X产品查询
+ * @author: shenwd
+ * @date: 2025/3/3 18:15
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+//@ApiModel("渤海财险 车+X产品查询")
+public class ProductQueryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -5833333559739490659L;
+    //    @ApiModelProperty(value = "协议id")
+    private String agreementId;
+
+//    @ApiModelProperty(value = "使用性质")
+    private String carnature;
+
+//    @ApiModelProperty(value = "车辆种类")
+    private String cimodelclass;
+
+//    @ApiModelProperty(value = "座位数")
+    private String seatCount;
+
+//    @ApiModelProperty(value = "核定载质量")
+    private String limitLoad;
+
+//    @ApiModelProperty(value = "车辆用途")
+    private String vehicleUse;
+
+//    @ApiModelProperty(value = "发动机功率")
+    private String powerScale;
+
+//    @ApiModelProperty(value = "排量")
+    private String exhaustScale;
+
+//    @ApiModelProperty(value = "投保人")
+    private CustomerInfoDTO policyHolderInfo;
+
+    //被保人信息  lig 2023-04-13
+//    @ApiModelProperty(value = "被保人信息")
+    private CustomerInfoDTO insuredPersonInfo;
+
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @Data
+//    @ApiModel("实体")
+    public static class CustomerInfoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 7506480802006750358L;
+        //        @ApiModelProperty("姓名")
+        private String name;
+
+//        @ApiModelProperty("身份证号")
+        private String identifyNumber;
+
+//        @ApiModelProperty("身份证类型")
+        private String identifyType;
+
+    }
+
+}

+ 33 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/properties/BohaiApiConfigurationProperties.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.bohai.api.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/3 14:44
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "bohai.api")
+public class BohaiApiConfigurationProperties {
+
+    // 请求地址
+    private String url;
+
+    // 我司公钥
+    private String selfPublicKey;
+
+    // 我司私钥
+    private String selfPrivateKey;
+
+    // 渤海方公钥
+    private String boHaiPublicKey;
+
+    // 合作方代码,由渤海分配
+    private String insurerCode;
+
+
+}

+ 14 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/repository/BoHaiApiOrderRepository.java

@@ -0,0 +1,14 @@
+package com.jzg.quote.bohai.api.repository;
+
+import com.jzg.quote.bohai.api.entity.po.BoHaiApiOrder;
+import org.springframework.data.mongodb.repository.MongoRepository;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/4 15:47
+ **/
+public interface BoHaiApiOrderRepository extends MongoRepository<BoHaiApiOrder, String> {
+
+    BoHaiApiOrder getByOrdersNo(String ordersNo);
+}

+ 11 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/service/BoHaiApiRequest.java

@@ -0,0 +1,11 @@
+package com.jzg.quote.bohai.api.service;
+
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/3 14:19
+ **/
+public interface BoHaiApiRequest extends QuotationApiBaseService {
+}

+ 202 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/service/impl/BoHaiApiRequestImpl.java

@@ -0,0 +1,202 @@
+package com.jzg.quote.bohai.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.CustomerInfoVo;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quote.bohai.api.build.BoHaiApiQuoteResultsVoBuild;
+import com.jzg.quote.bohai.api.component.BoHaiRequestApiComponent;
+import com.jzg.quote.bohai.api.constant.enums.ResponseCode;
+import com.jzg.quote.bohai.api.entity.po.BoHaiApiOrder;
+import com.jzg.quote.bohai.api.entity.request.*;
+import com.jzg.quote.bohai.api.entity.response.*;
+import com.jzg.quote.bohai.api.entity.vo.BoHaiQuoteAccidentVo;
+import com.jzg.quote.bohai.api.entity.vo.PersonAreaVo;
+import com.jzg.quote.bohai.api.repository.BoHaiApiOrderRepository;
+import com.jzg.quote.bohai.api.service.BoHaiApiRequest;
+import com.jzg.quote.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quote.bohai.api.util.StringSubStringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/3/3 14:23
+ **/
+@Service(value = InsuranceCode.INSURANCE_BPIC)
+@RequiredArgsConstructor
+public class BoHaiApiRequestImpl implements BoHaiApiRequest {
+
+    private final BoHaiApiOrderRepository boHaiApiOrderRepository;
+
+    private final BoHaiRequestApiComponent boHaiRequestApiComponent;
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) {
+        OrderBase order = quoteVo.getOrder();
+        AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+        //配置信息
+        BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        // 生成订单号
+        GenerateOrderNoRequest generateOrderNoRequest = new GenerateOrderNoRequest(parameters);
+        GenerateOrderNoResponse generateOrderNoResponse;
+        try {
+            generateOrderNoResponse = boHaiRequestApiComponent.generateOrderNo(generateOrderNoRequest,
+                    parameters.getSysSourceCode());
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        String orderNo = generateOrderNoResponse.getData().getOrderNo();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        //查询车辆
+        VehicleTypeQueryRequest vehicleTypeQueryRequest = new VehicleTypeQueryRequest(parameters, carInfoVo.getBrandName(), orderNo);
+        // 调用 车辆查询和车辆确认接口
+        Map<String, Object> map = new HashMap<>();
+        try {
+            map = getVehicleConfirmationResponse(quoteVo, parameters, carInfoVo, orderNo, vehicleTypeQueryRequest);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        //调用车型号查询可能会出现多条数据,导致车辆确认报错  ESB车型及纯风险保费查询服务返回错误信息_选择车辆的行业车型编码(BBWABBUA0005)在平台不存在!请使用正确的行业车型编码(BBWABBUB0007)"
+        //通过报错信息截取出正确的行业车型编
+        VehicleConfirmationResponse vehicleConfirmationResponse = (VehicleConfirmationResponse) map.get("vehicleConfirmationResponse");
+        if (ResponseCode.R_Z00004.getCode().equals(vehicleConfirmationResponse.getResponseCode())) {
+            String responseMsg = vehicleConfirmationResponse.getResponseMsg();
+            if (responseMsg.contains("行业车型编码")) {
+                String modelCode = StringSubStringUtils.extractLastParenthesesContent(responseMsg);
+                //清空车辆型号  添加行业车型编码确定唯一车型
+                vehicleTypeQueryRequest.setVehicleBrandModelKey(null);
+                vehicleTypeQueryRequest.setModelCode(modelCode);
+                // 重新调用 车辆查询和车辆确认接口
+                Map<String, Object> map_two = null;
+                try {
+                    map_two = getVehicleConfirmationResponse(quoteVo, parameters, carInfoVo, orderNo,
+                            vehicleTypeQueryRequest);
+                } catch (Exception e) {
+                    throw new SystemException(e.getMessage());
+                }
+                vehicleConfirmationResponse = (VehicleConfirmationResponse) map_two.get("vehicleConfirmationResponse");
+            } else {
+                throw new SystemException(responseMsg);
+            }
+        }
+
+        // 车辆实际价值
+        String currentValue = vehicleConfirmationResponse.getData().getVehicleModels().get(0).getCurrentValue();
+        // 4. 报价接口
+        String discount = "";// 折扣待补充
+        List<BoHaiQuoteAccidentVo> accidentVos = new ArrayList<>();//驾意险待处理
+        QuotationRequest quotationRequest = new QuotationRequest(parameters, quoteVo, currentValue, orderNo, accidentVos, discount);
+
+        //报价接口调用
+        QuotationResponse quotationResponse;
+        try {
+            quotationResponse = boHaiRequestApiComponent.quotation(quotationRequest, parameters.getSysSourceCode());
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+        BoHaiApiOrder apiOrder = new BoHaiApiOrder();
+        apiOrder.setOrdersNo(order.getOrdersNo());
+        apiOrder.setBusUniqueId(quotationResponse.getData().getBusUniqueId());
+        apiOrder.setOrderNo(orderNo);
+        boHaiApiOrderRepository.save(apiOrder);
+        return BoHaiApiQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, quotationResponse);
+    }
+
+    @Override
+    public void underwriting(UnderwritingVo underwritingVo) {
+        OrderBase order = underwritingVo.getOrder();
+        //获取配置信息
+        BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, order.getAttributionInformationVo().getConfigInfo());
+
+        //核保请求
+        BoHaiApiOrder apiOrder = boHaiApiOrderRepository.getByOrdersNo(order.getOrdersNo());
+        UnderwritingRequest underwritingRequest = new UnderwritingRequest(parameters, apiOrder.getOrderNo());
+        UnderwritingResponse underwritingResponse;
+        try {
+            underwritingResponse = boHaiRequestApiComponent.underwriting(underwritingRequest, parameters.getSysSourceCode());
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+
+    }
+
+    @Override
+    public String getPaymentLink(OrderBase orderBase) {
+        //获取配置信息
+        BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
+        BoHaiApiOrder apiOrder = boHaiApiOrderRepository.getByOrdersNo(orderBase.getOrdersNo());
+        PaymentRequest paymentRequest = new PaymentRequest(parameters, apiOrder.getOrderNo(), apiOrder.getBusUniqueId());
+        PaymentResponse paymentResponse;
+        try {
+            paymentResponse = boHaiRequestApiComponent.payment(paymentRequest, parameters.getSysSourceCode());
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+
+        return paymentResponse.getData().getPayUrl();
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+        OrderBase order = insuranceUploadImageVo.getOrder();
+        //获取配置信息
+        BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, order.getAttributionInformationVo().getConfigInfo());
+        BoHaiApiOrder apiOrder = boHaiApiOrderRepository.getByOrdersNo(order.getOrdersNo());
+        ImageUploadRequest imageUploadRequest = new ImageUploadRequest(parameters, apiOrder.getOrderNo(), apiOrder.getBusUniqueId(), insuranceUploadImageVo.getImageVoList());
+        ImageUploadResponse imageUploadResponse;
+        try {
+            imageUploadResponse = boHaiRequestApiComponent.imageUpload(imageUploadRequest, parameters.getSysSourceCode());
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 下载保单待补充
+     * @param orderBase
+     */
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+
+    }
+
+    public Map<String, Object> getVehicleConfirmationResponse(QuoteVo quoteVo, BoHaiConfigureParameters parameters,
+                                                              CarInfoVo carInfo, String orderNo,
+                                                              VehicleTypeQueryRequest vehicleTypeQueryRequest) throws Exception {
+        // 2 车型查询接口
+        VehicleTypeQueryResponse.DataDTO.VehicleModelsDTO vehicleModelsDTO =
+                boHaiRequestApiComponent.vehicleTypeQuery(vehicleTypeQueryRequest, parameters.getSysSourceCode(), carInfo);
+        // 3 车辆确认接口
+        // 车主信息
+        CustomerInfoVo ownerInfo = quoteVo.getOwnersInfo();
+        PersonAreaVo ownerInfoArea = new PersonAreaVo(ownerInfo);
+        // 被保人信息
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+        PersonAreaVo insuredPersonArea = new PersonAreaVo(insuredPersonInfo);
+        // 投保人信息
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+        PersonAreaVo policyHolderArea = new PersonAreaVo(policyHolderInfo);
+        VehicleConfirmationReqeust vehicleConfirmationReqeust = new VehicleConfirmationReqeust(parameters, quoteVo, vehicleModelsDTO,
+                orderNo, ownerInfoArea, insuredPersonArea, policyHolderArea);
+        VehicleConfirmationResponse vehicleConfirmationResponse = boHaiRequestApiComponent.vehicleConfirmation(vehicleConfirmationReqeust
+                , parameters.getSysSourceCode());
+        Map<String, Object> map = new HashMap<>();
+        map.put("vehicleModelsDTO", vehicleModelsDTO);
+        map.put("vehicleConfirmationResponse", vehicleConfirmationResponse);
+        return map;
+    }
+}

+ 45 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/BoHaiEncrypted.java

@@ -0,0 +1,45 @@
+package com.jzg.quote.bohai.api.util;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.bohai.api.properties.BohaiApiConfigurationProperties;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险请求加密
+ * @author: shenwd
+ * @date: 2025/3/3 15:47
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiEncrypted implements Serializable {
+
+    /**
+     * 业务数据加密串
+     */
+    @JsonProperty("bizContent")
+    private String bizContent;
+
+    /**
+     * 合作方代码,由渤海分配
+     */
+    @JsonProperty("insurerCode")
+    private String insurerCode;
+
+    /**
+     * 配置
+     */
+    @JsonProperty("sysSourceCode")
+    private String sysSourceCode;
+
+
+    public BoHaiEncrypted(String bizContent, BohaiApiConfigurationProperties properties, String sysSourceCode) {
+        this.bizContent = bizContent;
+        this.insurerCode = properties.getInsurerCode();
+        this.sysSourceCode = sysSourceCode;
+    }
+
+
+}

+ 346 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/SignatureUtils.java

@@ -0,0 +1,346 @@
+package com.jzg.quote.bohai.api.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.quote.bohai.api.constant.enums.InsuranceEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.Base64Utils;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.*;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/3 15:49
+ **/
+@Slf4j
+public class SignatureUtils {
+
+    private SignatureUtils(){
+        throw new IllegalStateException("Utility class");
+    }
+    /**
+     * 加密算法RSA
+     */
+    public static final String KEY_ALGORITHM = "RSA";
+
+    /**
+     * 签名算法
+     */
+    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
+
+    /**
+     * RSA最大加密明文大小
+     */
+    private static final int MAX_ENCRYPT_BLOCK = 117;
+
+    /**
+     * RSA最大解密密文大小
+     */
+    private static final int MAX_DECRYPT_BLOCK = 128;
+
+    /**
+     * 验签并解密
+     * <p>
+     * 对于<b>银保信</b>,publicKey是指合作方的公钥,privateKey是指银保信的私钥<br>
+     * 对于<b>合作方</b>,publicKey是指银保信的公钥,privateKey是指合作方的私钥<br>
+     *
+     * @param request     原始报文(JSON字符串)
+     * @param publicKey   公钥
+     * @param privateKey  私钥
+     * @param isCheckSign 是否验签
+     * @param isDecrypt   是否解密
+     * @return 解密后的明文,验签失败则异常抛出
+     */
+    public static String checkSignAndDecrypt(String request, String sign, String publicKey, String privateKey, boolean isCheckSign,
+                                             boolean isDecrypt) {
+        boolean verifyResult = false;
+        JSONObject requestJSONObject = JSONObject.parseObject(request);
+        String bizContent = requestJSONObject.getString("bizContent");// 获取的业务数据密文
+        String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+        if (isCheckSign) {
+            verifyResult = verify(signContent, sign, publicKey);
+        }
+        if (!isCheckSign) {
+            verifyResult = true;
+        }
+        if (isDecrypt && verifyResult) {
+            return decryptByPrivateKey(bizContent, privateKey);
+        }
+        return null;
+    }
+
+    public static String checkSignAndDecryptNew(String request, String sign, String publicKey, String privateKey, boolean isCheckSign,
+                                                boolean isDecrypt) throws Exception {
+        boolean verifyResult = false;
+        JSONObject requestJSONObject = JSONObject.parseObject(request);
+        String bizContent = requestJSONObject.getString("bizContent");// 获取的业务数据密文
+        String insurerCode = requestJSONObject.getString("insurerCode");
+        String sysSourceCode = requestJSONObject.getString("sysSourceCode");
+        String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+        if (isCheckSign) {
+            verifyResult = verify(signContent, sign, publicKey);
+        }
+        if (!isCheckSign) {
+            verifyResult = true;
+        }
+        if (isDecrypt && verifyResult) {
+            String json = decryptByPrivateKey(bizContent, privateKey);
+            String oldChar = "\\{";
+            String newChar = "{\"sysSourceCode\": \"" + sysSourceCode + "\",\"insurerCode\": \"" + insurerCode + "\",";
+            return json.replaceFirst(oldChar, newChar);
+        }
+        return null;
+    }
+
+    /**
+     * 加密并签名
+     * <p>
+     * 对于<b>银保信</b>,publicKey是指合作方的公钥,privateKey是指银保信的私钥<br>
+     * 对于<b>合作方</b>,publicKey是指银保信的公钥,privateKey是指合作方的私钥<br>
+     *
+     * @param publicKey      公钥
+     * @param requestContent 报文原文
+     * @param isCheckSign    是否签名
+     * @param isEncrypt      是否加密
+     * @return 加密加签后的返回报文
+     * @throws Exception
+     */
+    public static Map<String, String> encryptAndSign(String privateKey, String publicKey, String requestContent, boolean isCheckSign,
+                                                     boolean isEncrypt) throws Exception {
+        JSONObject requestJSONObject = JSONObject.parseObject(requestContent);
+        String bizContent = requestJSONObject.getString("bizContent");
+        Map<String, String> map = new HashMap<String, String>();
+        if (isEncrypt) {
+            //加密
+            String encryptBizContent = encryptByPublicKey(bizContent, publicKey);//对业务数据进行加密
+            requestJSONObject.put("bizContent", encryptBizContent);//将加密后的数据替换原有的明文
+            map.put("content", requestJSONObject.toJSONString());
+            if (isCheckSign) {
+                //加签
+                String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+                String sign = sign(signContent, privateKey);
+                map.put("signature", sign);
+            }
+        } else if (isCheckSign) {// 只加签、不加密
+            String signContent = getSignContent(requestJSONObject);// 所有key排序后放入LingkedMap后map.toString()
+            String sign = sign(signContent, privateKey);
+            map.put("signature", sign);
+        }
+        return map;
+    }
+
+    /**
+     * 封装待验签的内容
+     *
+     * @param sortedParam
+     * @return
+     */
+    public static String getSignContent(Map<String, Object> sortedParam) {
+        LinkedHashMap map = new LinkedHashMap();
+        List<String> keys = new ArrayList<String>(sortedParam.keySet());
+        Collections.sort(keys);
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = sortedParam.get(key).toString();
+            map.put(key, value);
+        }
+        return map.toString();
+    }
+
+    /**
+     * 验签
+     *
+     * @param request
+     * @param sign
+     * @param
+     * @return
+     */
+    public static boolean verify(String request, String sign, String publicKey) {
+        try {
+            return SignatureUtils.verify(request.getBytes(), publicKey, sign);
+        } catch (Exception e) {
+            log.error("验签异常,inputParams: {} and publicKey: {} and sign: {} and errorMessage: {}", request, publicKey, sign,
+                    e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <p>
+     * 校验数字签名
+     * </p>
+     *
+     * @param data      已加密数据
+     * @param publicKey 公钥(BASE64编码)
+     * @param sign      数字签名
+     * @return
+     * @throws Exception
+     */
+    public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(publicKey.getBytes());
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PublicKey publicK = keyFactory.generatePublic(keySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initVerify(publicK);
+        signature.update(data);
+        return signature.verify(Base64Utils.decode(sign.getBytes()));
+    }
+
+    /**
+     * 私钥对数据进行解密
+     *
+     * @param bizContent
+     * @param privateKey
+     * @return
+     */
+    public static String decryptByPrivateKey(String bizContent, String privateKey) {
+        try {
+            return new String(SignatureUtils.decryptByPrivateKey(Base64Utils.decode(bizContent.getBytes()), privateKey));
+        } catch (Exception e) {
+            log.error("私钥解密异常,inputParams: {} and privateKey: {}  and errorMessage: {}", bizContent, privateKey, e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <P>
+     * 私钥解密
+     * </p>
+     *
+     * @param encryptedData 已加密数据
+     * @param privateKey    私钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(privateKey.getBytes());
+        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.DECRYPT_MODE, privateK);
+        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 decryptedData;
+    }
+
+    /**
+     * 公钥加密
+     *
+     * @param request
+     * @param publicKey
+     * @return
+     */
+    public static String encryptByPublicKey(String request, String publicKey) throws Exception {
+        return new String(Base64Utils.encode(SignatureUtils.encryptByPublicKey(request.getBytes(), publicKey)));
+    }
+
+    /**
+     * <p>
+     * 公钥加密
+     * </p>
+     *
+     * @param data      源数据
+     * @param publicKey 公钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(publicKey.getBytes());
+        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        Key publicK = keyFactory.generatePublic(x509KeySpec);
+        // 对数据加密
+        Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
+        cipher.init(Cipher.ENCRYPT_MODE, publicK);
+        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 = out.toByteArray();
+        out.close();
+        return encryptedData;
+    }
+
+    /**
+     * 加签
+     *
+     * @param
+     * @param privateKey
+     * @return
+     */
+    public static String sign(String request, String privateKey) {
+        try {
+            return SignatureUtils.sign(request.getBytes(), privateKey);
+        } catch (Exception e) {
+            log.error("加签异常,inputParams: {} and privateKey: {}  and errorMessage: {}", request, privateKey, e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * <p>
+     * 用私钥对信息生成数字签名
+     * </p>
+     *
+     * @param data       已加密数据
+     * @param privateKey 私钥(BASE64编码)
+     * @return
+     * @throws Exception
+     */
+    public static String sign(byte[] data, String privateKey) throws Exception {
+        byte[] keyBytes = Base64Utils.decode(privateKey.getBytes());
+        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
+        PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
+        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
+        signature.initSign(privateK);
+        signature.update(data);
+        return new String(Base64Utils.encode(signature.sign()));
+    }
+
+
+    public static <T> T decryptMessage(String s, Class<T> c, String message, String sessionKey) {
+//        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> 解密前的参数:{}", s);
+        // 解密
+        String text = decryptByPrivateKey(s.replace("\n", ""), sessionKey);
+//        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {}:{}", message, text);
+        return JSON.parseObject(text, c);
+    }
+
+}

+ 93 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quote/bohai/api/util/StringSubStringUtils.java

@@ -0,0 +1,93 @@
+package com.jzg.quote.bohai.api.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *  @version  截取字符串括号的内容用于渤海提取错误信息中的内容
+ *  @author: hxl
+ *  @Date: 2024/4/3 16:17
+ *  @Description:
+ */
+public class StringSubStringUtils {
+    public static void main(String[] args) {
+        // String input = "ESB车型及纯风险保费查询服务返回错误信息_选择车辆的行业车型编码(BBWABBUA0005)在平台不存在!请使用正确的行业车型编码(BBWABBUB0007)";
+        // String result = extractLastParenthesesContent(input);
+        // String input="算费微服务返回报错信息_保信返回错误信息:平台返回错误信息号牌号码“晋J60L55”的保单发生重复投保,与其重复投保的其它公司的保单信息如下:投保确认码 02PAIC140023031919549498257741;保单号 13312993901973801278;起保日期 2023-04-11 00:00;终保日期 2024-04-11 00:00;号牌号码 晋J60L55;号牌种类 02;车架号 LZWADAGA5LG477030;发动机号 8LB1921291;地区 山西。";
+        // String keywords=":";
+        //  String key="起保日期";
+        // String result = subjectStringContentByTrafficPolicyDTOBenginDate(input,keywords,key);
+        String input="重复投保保单信息 :保单号:314042303060007485车牌号:晋A881SR车架号:LMGAC1381K1535834发动机号:F699317保险公司代码:YAIC签单日期:20230414起保日期:202305030000终保日期:202405030000险别:机动车第三者责任保险,附加医保外用药责任险(机动车第三者责任保险)";
+        String keywords="终保日期:";
+        String result = subjectStringContentByBusinessPolicyEndDate(input, keywords);
+        System.out.println(result);
+    }
+    /**
+     *  @version  截取行业车型编码
+     *  @author: hxl
+     *  @Date: 2024/4/3 17:29
+     *  @Description:
+     */
+    public static String extractLastParenthesesContent(String str) {
+        int startIndex = str.lastIndexOf("(");
+        int endIndex = str.lastIndexOf(")");
+        if (startIndex != -1 && endIndex != -1 && startIndex < endIndex) {
+            return str.substring(startIndex + 1, endIndex);
+        }
+        return "";
+    }
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/4/3 17:29
+     *  @Description:
+     */
+    public static String subjectStringContentByTrafficPolicyDTOBenginDate(String allStr,String keywords,String key) {
+        int startIndex = allStr.indexOf(keywords);
+        Map<String,String> msgMap=new HashMap<>();
+        if (startIndex != -1) {
+            //截取与其重复投保的其它公司的保单信息如下:之后的字符串
+            String extractedString = allStr.substring(startIndex + keywords.length());
+            //投保确认码 02PAIC140023031919549498257741;保单号 13312993901973801278;起保日期 2023-04-11 00:00;终保日期 2024-04-11 00:00;号牌号码 晋J60L55;号牌种类 02;车架号 LZWADAGA5LG477030;发动机号 8LB1921291;地区 山西。
+            //以;截取存入map中
+            if(extractedString!=null && !"".equals(extractedString)){
+                String[] strs = extractedString.split(";");
+                if(strs.length>0){
+                    for (String str : strs) {
+                        if(str!=null && !"".equals(str) && str.contains(" ")){
+                            String[] strParams = str.split("\\s", 2);
+                            msgMap.put(strParams[0].trim(),strParams[1].trim());
+                        }
+                    }
+                }
+            }
+        }
+        String returnStr="";
+        if(msgMap!=null && msgMap.size()>0){
+            returnStr = msgMap.get(key);
+        }
+        return returnStr;
+    }
+    /**
+     * @Description  截取商业险报错信息
+     * 重复投保保单信息 :保单号:314042303060007485车牌号:晋A881SR车架号:LMGAC1381K1535834发动机号:F699317保险公司代码:YAIC签单日期:20230414起保日期:202305030000终保日期:202405030000险别:机动车第三者责任保险,附加医保外用药责任险(机动车第三者责任保险)
+     * @Author  hxl
+     * @Date   2024/4/7 15:20
+     * @Param
+     * @Return
+     * @Exception
+     *
+     */
+    public static String subjectStringContentByBusinessPolicyEndDate(String allStr,String keywords) {
+        int startIndex = allStr.indexOf(keywords);
+        String returnStr="";
+        if (startIndex != -1) {
+            //截取与其重复投保的其它公司的保单信息如下:之后的字符串
+            allStr = allStr.substring(startIndex + keywords.length());
+            //202405030000险别:机动车第三者责任保险,附加医保外用药责任险(机动车第三者责任保险)
+            //截取前12为日期为终保日期
+            returnStr = allStr.substring(0, 11);
+        }
+        return returnStr;
+    }
+}

+ 2 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/InsuranceCode.java

@@ -22,6 +22,8 @@ public class InsuranceCode {
     public static final String INSURANCE_AZCN = "AZCN";
     public static final String INSURANCE_BGIC = "BGIC";
     public static final String INSURANCE_BOCI = "BOCI";
+
+    // 渤海财险
     public static final String INSURANCE_BPIC = "BPIC";
     public static final String INSURANCE_CAIC = "CAIC";
     public static final String INSURANCE_CATH = "CATH";