Sfoglia il codice sorgente

恒邦爬虫报价相关

shenweidong 1 anno fa
parent
commit
272cec8cf2
31 ha cambiato i file con 2737 aggiunte e 4 eliminazioni
  1. 1 0
      tenant/insurance/pom.xml
  2. 5 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/CacheConstant.java
  3. 1 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/InsuranceCode.java
  4. 28 0
      tenant/insurance/quotation-hengbang/pom.xml
  5. 81 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/build/HbCrawlerQuoteResultVoBuild.java
  6. 252 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  7. 22 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/constant/RequestConstant.java
  8. 60 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/constant/enums/RequestUrl.java
  9. 27 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/HengBangCrawlerConfigureParameters.java
  10. 135 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/dto/HbEncDTO.java
  11. 11 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbBaseRequest.java
  12. 41 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerAuthenticateRequest.java
  13. 130 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  14. 24 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerCaptchaRequest.java
  15. 48 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerDepreciationRequest.java
  16. 55 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerQueryCarRequest.java
  17. 502 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java
  18. 20 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerSaleInfoRequest.java
  19. 11 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbBaseResponse.java
  20. 41 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerAuthenticateResponse.java
  21. 62 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerCalculationResponse.java
  22. 33 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerCaptchaResponse.java
  23. 18 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerDepreciationResponse.java
  24. 687 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerProposalResponse.java
  25. 188 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerQueryCarResponse.java
  26. 23 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerSaleInfoResponse.java
  27. 21 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/properties/HengBangCrawlerProperties.java
  28. 11 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/service/HengBangCrawlerRequest.java
  29. 147 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  30. 47 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/utils/HengBangAESUtil.java
  31. 5 4
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

+ 1 - 0
tenant/insurance/pom.xml

@@ -28,6 +28,7 @@
         <module>quotation-huanong</module>
         <module>quotation-huanong</module>
         <module>quotation-taikang</module>
         <module>quotation-taikang</module>
         <module>quotation-ansheng</module>
         <module>quotation-ansheng</module>
+        <module>quotation-hengbang</module>
     </modules>
     </modules>
 
 
     <dependencies>
     <dependencies>

+ 5 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/constant/CacheConstant.java

@@ -38,4 +38,9 @@ public class CacheConstant {
      */
      */
     public static final long ZHONGMEI_AUTHORIZATION_TIME = 30L;
     public static final long ZHONGMEI_AUTHORIZATION_TIME = 30L;
 
 
+    /**
+     * 恒邦财险授权
+     */
+    public static final String HENGBANG_AUTHORIZATION = "hengbang:authorization:";
+
 }
 }

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

@@ -43,6 +43,7 @@ public class InsuranceCode {
     public static final String INSURANCE_GPIC = "GPIC";
     public static final String INSURANCE_GPIC = "GPIC";
     public static final String INSURANCE_GYIC = "GYIC";
     public static final String INSURANCE_GYIC = "GYIC";
     public static final String INSURANCE_HAIC = "HAIC";
     public static final String INSURANCE_HAIC = "HAIC";
+    //恒邦财险
     public static final String INSURANCE_HBIC = "HBIC";
     public static final String INSURANCE_HBIC = "HBIC";
     public static final String INSURANCE_HGIC = "HGIC";
     public static final String INSURANCE_HGIC = "HGIC";
     public static final String INSURANCE_HHBX = "HHBX";
     public static final String INSURANCE_HHBX = "HHBX";

+ 28 - 0
tenant/insurance/quotation-hengbang/pom.xml

@@ -0,0 +1,28 @@
+<?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-hengbang</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>

+ 81 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/build/HbCrawlerQuoteResultVoBuild.java

@@ -0,0 +1,81 @@
+package com.jzg.quote.hengbang.crawler.build;
+
+import com.jzg.commons.constants.ProductsType;
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quote.hengbang.crawler.entity.response.HbCrawlerProposalResponse;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description: 恒邦财险 构建报价返回数据格式
+ * @author: shenwd
+ * @date: 2025/4/10 11:48
+ **/
+public final class HbCrawlerQuoteResultVoBuild {
+    private HbCrawlerQuoteResultVoBuild() {throw new IllegalStateException("Utility class");}
+
+    public static QuoteResultsVo build(QuoteVo quoteVo, HbCrawlerProposalResponse proposalResponse) {
+        QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
+        quoteResultsVo.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        //交强险
+        quoteResultsVo.setCiRiskInfoVo(buildCiInfo(proposalResponse));
+        //商业险
+        quoteResultsVo.setBiRiskInfoVo(buildbiInfo(proposalResponse));
+        quoteResultsVo.setKindInfoVo(buildKindInfoList(proposalResponse, quoteVo));
+        //设置保费,车船税,投保单号
+        buildParams(proposalResponse, quoteResultsVo);
+        return quoteResultsVo;
+    }
+
+    public static RiskInfoVo buildCiInfo(HbCrawlerProposalResponse proposalResponse) {
+        RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
+        HbCrawlerProposalResponse.ForceCarInsureRiskDTO forceCarInsureRisk = proposalResponse.getForceCarInsureRisk();
+        ciRiskInfoVo.setRiskCode(forceCarInsureRisk.getRiskcode());
+        ciRiskInfoVo.setStartDate(forceCarInsureRisk.getBegintime());
+        ciRiskInfoVo.setEndDate(forceCarInsureRisk.getEndtime());
+
+        return ciRiskInfoVo;
+    }
+
+    public static RiskInfoVo buildbiInfo(HbCrawlerProposalResponse proposalResponse) {
+        RiskInfoVo biRiskInfoVo = new RiskInfoVo();
+        HbCrawlerProposalResponse.BusiCarInsureRiskDTO busiCarInsureRisk = proposalResponse.getBusiCarInsureRisk();
+        biRiskInfoVo.setRiskCode(busiCarInsureRisk.getRiskcode());
+        biRiskInfoVo.setStartDate(busiCarInsureRisk.getBegintime());
+        biRiskInfoVo.setEndDate(busiCarInsureRisk.getEndtime());
+        return biRiskInfoVo;
+    }
+
+    public static List<KindInfoVo> buildKindInfoList(HbCrawlerProposalResponse proposalResponse, QuoteVo quoteVo) {
+        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+        List<HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityList = proposalResponse.getCarInsureLiabilityList();
+        Map<String, HbCrawlerProposalResponse.CarInsureLiabilityDTO> carInsureLiabilityDTOMap = carInsureLiabilityList.stream().collect(Collectors.toMap(HbCrawlerProposalResponse.CarInsureLiabilityDTO::getKindcode, carInsureLiabilityDTO -> carInsureLiabilityDTO));
+        kindInfoVoList.forEach(kindInfoVo -> {
+            HbCrawlerProposalResponse.CarInsureLiabilityDTO carInsureLiabilityDTO = carInsureLiabilityDTOMap.get(kindInfoVo.getKindCode());
+            kindInfoVo.setAmount(String.valueOf(carInsureLiabilityDTO.getLiabamt()));
+            kindInfoVo.setPremium(String.valueOf(carInsureLiabilityDTO.getLiabprm()));
+            kindInfoVo.setUnitAmount(carInsureLiabilityDTO.getUnitAmount());
+            kindInfoVo.setQuantity(String.valueOf(carInsureLiabilityDTO.getQuantity()));
+            kindInfoVo.setDeductibleRate(carInsureLiabilityDTO.getLiabrate());
+        });
+        return kindInfoVoList;
+    }
+
+    public static void buildParams(HbCrawlerProposalResponse proposalResponse, QuoteResultsVo quoteResultsVo) {
+        //交强险数据
+        HbCrawlerProposalResponse.ForceCarInsureRiskDTO forceCarInsureRisk = proposalResponse.getForceCarInsureRisk();
+        //商业险数据
+        HbCrawlerProposalResponse.BusiCarInsureRiskDTO busiCarInsureRisk = proposalResponse.getBusiCarInsureRisk();
+        HbCrawlerProposalResponse.CarInsureShiptaxDTO carInsureShiptax = proposalResponse.getCarInsureShiptax();
+        quoteResultsVo.setBiPremium(busiCarInsureRisk.getSumPremium());
+        quoteResultsVo.setCiPremium(forceCarInsureRisk.getSumPremium());
+        quoteResultsVo.setVvTax(carInsureShiptax.getSumtax());
+        //设置非车保费
+        quoteResultsVo.setNiPremium(proposalResponse.getAccidentTotalPremium());
+    }
+}

+ 252 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -0,0 +1,252 @@
+package com.jzg.quote.hengbang.crawler.component;
+
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.component.RequestComponent;
+import com.jzg.quotation.commons.constant.CacheConstant;
+import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import com.jzg.quote.hengbang.crawler.constant.RequestConstant;
+import com.jzg.quote.hengbang.crawler.constant.enums.RequestUrl;
+import com.jzg.quote.hengbang.crawler.entity.dto.HbEncDTO;
+import com.jzg.quote.hengbang.crawler.entity.request.*;
+import com.jzg.quote.hengbang.crawler.entity.response.*;
+import com.jzg.quote.hengbang.crawler.properties.HengBangCrawlerProperties;
+import com.jzg.quote.hengbang.crawler.utils.HengBangAESUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * @description: 恒邦财险
+ * @author: shenwd
+ * @date: 2025/4/7 11:19
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class HengBangCrawlerRequestComponent {
+
+    private final RedissonClient redissonClient;
+
+    private final HengBangCrawlerProperties hbCrawlerProperties;
+
+    private final ExteriorUtilsRequest exteriorUtilsRequest;
+
+    private final RequestComponent requestComponent;
+
+    /**
+     * 验证码
+     * @return
+     */
+    public HbCrawlerCaptchaResponse captcha(int frequency) {
+        if (frequency <= 0) {
+            throw new SystemException("验证码异常");
+        }
+        HbCrawlerCaptchaRequest captchaRequest = new HbCrawlerCaptchaRequest();
+        // 请求
+        HbCrawlerCaptchaResponse HbCrawlerCaptchaResponse = requestComponent.objectPost(RequestUrl.VERIFY_CODE.getRequestUrl(hbCrawlerProperties.getBaseUrl()), JSONObject.toJSONString(captchaRequest), "", HbCrawlerCaptchaResponse.class);
+        // 识别验证码
+        String s = exteriorUtilsRequest.captchaIdentify(HbCrawlerCaptchaResponse.getVerifyImg());
+        try {
+            int i = processCaptcha(s);
+            s = String.valueOf(i);
+        } catch (Exception e) {
+            frequency = frequency - 1;
+            return captcha(frequency);
+        }
+        HbCrawlerCaptchaResponse.setVerifyCode(s);
+        return HbCrawlerCaptchaResponse;
+    }
+
+    public int processCaptcha(String res) {
+        // 检查字符串长度是否足够,并且第三个字符不是'='
+        if (res.length() >= 3 && res.charAt(2) != '=') {
+            char operator = res.charAt(1);
+            try {
+                int operand1 = Integer.parseInt(res.substring(0, 1));
+                int operand2 = Integer.parseInt(res.substring(2, 3));
+                // 注意:这里假设操作符和操作数都是有效的,实际应用中应该添加更多的错误处理
+
+                switch (operator) {
+                    case '+':
+                    case 'f': // 通常'f'不是加法运算符,但根据原代码保留
+                        return operand1 + operand2;
+                    case 'x':
+                    case 'X':
+                    case '4': // 通常'4'不是乘法运算符,但保留以匹配原代码
+                    case '9': // 通常'9'也不是乘法运算符,但保留以匹配原代码
+                        return operand1 * operand2;
+                    case '-':
+                    case 'e': // 通常'e'不是减法运算符,但根据原代码保留
+                    case '=': // 通常'='不是减法运算符,但根据原代码保留
+                    case '2': // 通常'2'也不是减法运算符,但根据原代码保留
+                        return operand1 - operand2;
+                    // 如果操作符不匹配,则获取新的验证码图片(模拟)
+                }
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        throw new SystemException("");
+    }
+
+    /**
+     * 登录次数
+     * @param username     用户名
+     * @param password     密码
+     * @param loginsNumber 登录次数
+     * @return token
+     */
+    public String authenticate(String username, String password, int loginsNumber) {
+        // 登录验证码获取
+        HbCrawlerCaptchaResponse captchaResponse = captcha(RequestConstant.REQUEST_NUMBER);
+        // 登录存入缓存当中
+        HbCrawlerAuthenticateRequest authenticateRequest = new HbCrawlerAuthenticateRequest(captchaResponse, username, password);
+        ResponseEntity<HbCrawlerAuthenticateResponse> responseEntity = requestComponent.objectPost(RequestUrl.AUTHENTICATE.getRequestUrl(hbCrawlerProperties.getBaseUrl()), JSONObject.toJSONString(authenticateRequest), HbCrawlerAuthenticateResponse.class);
+        HbCrawlerAuthenticateResponse authenticateResponse = Optional.of(responseEntity).map(ResponseEntity::getBody).orElseThrow();
+
+        if (!StringUtils.isEmpty(authenticateResponse.getId_token())) {
+            return authenticateResponse.getId_token();
+        }
+        if (!StringUtils.isEmpty(authenticateResponse.getId_token())) {
+            Map<String, String> authorizationMap = buildCache(authenticateResponse);
+            RMap<Object, Object> map = redissonClient.getMap(CacheConstant.HENGBANG_AUTHORIZATION + username);
+            map.putAll(authorizationMap);
+            map.expire(Duration.ofDays(CacheConstant.GR_SPECIAL_AGREEMENT_TIME));
+            return authorizationMap.get(RequestConstant.AUTHORIZATION);
+        }
+        loginsNumber = loginsNumber - 1;
+        if (loginsNumber <= 0) {
+            throw new SystemException("恒邦财险登录异常");
+        }
+        return authenticate(username, password, loginsNumber);
+    }
+
+    private Map<String, String> buildCache(HbCrawlerAuthenticateResponse authenticateResponse) {
+        Map<String, String> authorizationMap = new HashMap<>();
+        authorizationMap.put(RequestConstant.AUTHORIZATION, authenticateResponse.getId_token());
+        authorizationMap.put(RequestConstant.PHONE_NUMBER, authenticateResponse.getPhoneNumber());
+        return authorizationMap;
+    }
+
+    /**
+     * 获取授权信息
+     * @param username 用户名
+     * @return 授权token
+     */
+    public String getAuthorization(String username) {
+        return (String) redissonClient.getMap(CacheConstant.HENGBANG_AUTHORIZATION + username).get(RequestConstant.AUTHORIZATION);
+    }
+    /**
+     * 获取手机号
+     * @param username 用户名
+     * @return 授权token
+     */
+    public String getPhoneNumber(String username) {
+        return (String) redissonClient.getMap(CacheConstant.HENGBANG_AUTHORIZATION + username).get(RequestConstant.PHONE_NUMBER);
+    }
+
+    /**
+     * 获取请求头
+     * @return
+     */
+    public HttpHeaders getHeaders(String username, String password) {
+        String authorization = getAuthorization(username);
+        if (!org.springframework.util.StringUtils.hasLength(authorization)) {
+            authorization = authenticate(username, password, RequestConstant.REQUEST_NUMBER);
+        }
+        HttpHeaders headers = new HttpHeaders();
+        headers.set(HttpHeaders.AUTHORIZATION , RequestConstant.BEARER + authorization);
+        return headers;
+    }
+
+    /**
+     * 查询车型
+     * @param queryCarRequest
+     * @param headers
+     * @return
+     */
+    public List<HbCrawlerQueryCarResponse.ContentDTO> queryCar(HbCrawlerQueryCarRequest queryCarRequest, HttpHeaders headers) {
+        HbCrawlerQueryCarResponse queryCarResponse = requestComponent.objectPost(RequestUrl.QUERY_CAR.getRequestUrl(hbCrawlerProperties.getBaseUrl()), queryCarRequest, HbCrawlerQueryCarResponse.class, headers).getBody();
+        return queryCarResponse.getContent();
+    }
+
+    /**
+     * 获取归属信息
+     * @param saleInfoRequest
+     * @param headers
+     * @return
+     * @throws Exception
+     */
+    public HbEncDTO getSalesInfo(HbCrawlerSaleInfoRequest saleInfoRequest, HttpHeaders headers) throws Exception {
+        Map<String, Object> params = new HashMap<>();
+        params.put("mobile", saleInfoRequest.getMobile());
+        HbCrawlerSaleInfoResponse saleInfoResponse = requestComponent.get(RequestUrl.FIND_SALE_INFO.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", HbCrawlerSaleInfoResponse.class, headers);
+        String hbEncD = saleInfoResponse.getHbEncD();
+        return JSONObject.parseObject(HengBangAESUtil.decryptStr(hbEncD), HbEncDTO.class);
+    }
+
+    /**
+     * 获取折旧价
+     * @param depreciationRequest
+     * @param headers
+     * @return
+     */
+    public String getDepreciationPrice(HbCrawlerDepreciationRequest depreciationRequest, HttpHeaders headers) {
+        Map<String, Object> params = JSONObject.parseObject(JSONObject.toJSONString(depreciationRequest), Map.class);
+        HbCrawlerDepreciationResponse depreciationResponse = requestComponent.get(RequestUrl.DEPRECIATIONRATE.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", HbCrawlerDepreciationResponse.class, headers);
+        return String.valueOf(depreciationResponse.getDepreciationRate());
+    }
+
+    /**
+     * 报价第一步,提交报价基础数据,获取订单号
+     * @param quoteimmediatelyRequest
+     * @param headers
+     * @return
+     */
+    public String quoteImmediately(HbCrawlerQuoteimmediatelyRequest quoteimmediatelyRequest, HttpHeaders headers) {
+        ResponseEntity<String> stringResponseEntity = requestComponent.objectPost(RequestUrl.QUOTEIMMEDIATELY.getRequestUrl(hbCrawlerProperties.getBaseUrl()), quoteimmediatelyRequest, String.class, headers);
+        return stringResponseEntity.getBody();
+    }
+
+    /**
+     * 报价第二步,提交报价险种数据 返回是否重复投保提示信息
+     * @param calculationRequest
+     * @param headers
+     * @return
+     */
+    public Map<String, Object> getCalculationResult(HbCrawlerCalculationRequest calculationRequest, HttpHeaders headers) {
+        ResponseEntity<HbCrawlerCalculationResponse> calculationResponseResponseEntity = requestComponent.objectPost(RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl()), calculationRequest, HbCrawlerCalculationResponse.class, headers);
+        HbCrawlerCalculationResponse calculationResponse = calculationResponseResponseEntity.getBody();
+        return calculationResponse.getData();
+    }
+
+    /**
+     * 报价第三步 获取报价返回数据
+     * @param plyappno 投保单号
+     * @param headers
+     * @return
+     */
+    public HbCrawlerProposalResponse proposal(String plyappno, HttpHeaders headers) {
+        Map<String, Object> params = new HashMap<>();
+        String encryptPlyappno;
+        try {
+            encryptPlyappno = new StringBuilder(RequestConstant.ENCRYPTPRE).append(HengBangAESUtil.encryptStr(plyappno)).toString();
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+        params.put("plyappno", encryptPlyappno);
+        HbCrawlerProposalResponse proposalResponse = requestComponent.get(RequestUrl.PROPOSAL.getRequestUrl(hbCrawlerProperties.getBaseUrl()), params, "", HbCrawlerProposalResponse.class, headers);
+        return proposalResponse;
+    }
+}

+ 22 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/constant/RequestConstant.java

@@ -0,0 +1,22 @@
+package com.jzg.quote.hengbang.crawler.constant;
+
+/**
+ * @description: 常量
+ * @author: shenwd
+ * @date: 2025/4/7 17:24
+ **/
+public class RequestConstant {
+
+    /**
+     * 请求次数
+     */
+    public static final int REQUEST_NUMBER = 3;
+
+    public static final String AUTHORIZATION = "AUTHORIZATION";
+
+    public static final String PHONE_NUMBER = "phoneNumber";
+
+    public static final String BEARER = "Bearer ";
+
+    public static final String ENCRYPTPRE = "HbinsEncrypt_";
+}

+ 60 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/constant/enums/RequestUrl.java

@@ -0,0 +1,60 @@
+package com.jzg.quote.hengbang.crawler.constant.enums;
+
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+* @description: todo
+* @author: shenwd
+* @date: 2025/4/7 14:14
+**/
+@Getter
+@AllArgsConstructor
+public enum RequestUrl implements CrawlerRequestUrlStandard {
+    VERIFY_CODE("/api/refreshVerifyCode", "获取验证码"),
+    AUTHENTICATE("/api/authenticateNew", "登录"),
+
+    QUERY_CAR("/backstage/api/car-model/queryByCarMapping", "查询车型"),
+    FIND_SALE_INFO("/backstage/api/findSaleInformationNew", "查询归属信息"),
+    DEPRECIATIONRATE("/backstage/api/coredblink/depreciationrate", "获取折旧价"),
+    QUOTEIMMEDIATELY("/new-insure/api/carinsurenew/quoteimmediately", "生成投保单号"),
+    CALCULATION("/new-insure/api/carinsurenew/calculation", "提交报价数据"),
+    PROPOSAL("/new-insure/api/carinsurenew/proposal", "获取报价数据"),
+
+    ;
+
+    private final String url;
+    private final String description;
+
+    /**
+     * 获取爬虫请求的 url
+     *
+     * @param url
+     * @return url
+     */
+    @Override
+    public String getRequestUrl(String url) {
+        return CrawlerRequestUrlStandard.super.getRequestUrl(url);
+    }
+
+    /**
+     * 获取爬虫请求的 描述
+     *
+     * @return 描述
+     */
+    @Override
+    public String getRequestDescription() {
+        return "";
+    }
+
+    /**
+     * 获取请求的uri
+     *
+     * @return uri
+     */
+    @Override
+    public String uri() {
+        return "";
+    }
+}

+ 27 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/HengBangCrawlerConfigureParameters.java

@@ -0,0 +1,27 @@
+package com.jzg.quote.hengbang.crawler.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/4/7 17:39
+ **/
+@Data
+public class HengBangCrawlerConfigureParameters implements ConfigureParameters {
+    @Serial
+    private static final long serialVersionUID = 7212934480389963171L;
+
+    /**
+     * 银保信车型唯一id
+     */
+    private Integer vehicleStyleUniqueId;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+}

+ 135 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/dto/HbEncDTO.java

@@ -0,0 +1,135 @@
+package com.jzg.quote.hengbang.crawler.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 恒邦财险 归属信息 解密数据
+ * @author: shenwd
+ * @date: 2025/4/8 11:23
+ **/
+@Data
+public class HbEncDTO implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 3387220768382747446L;
+
+    private String ecarshiptaxPart;
+
+    private CompanysDTO companys;
+
+    private SalesManDTO salesMan;
+
+    private List<CanChoiceCompanysDTO> canChoiceCompanys;
+
+    @Data
+    public static class CompanysDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -8134603592384992149L;
+
+        private String companyCode;
+        private String companyCName;
+        private String companyTName;
+        private String companyEName;
+        private String addressCName;
+        private String addressTName;
+        private String addressEName;
+        private String insurerCName;
+        private String insurerTName;
+        private String insurerEName;
+        private String upperCompanyCode;
+        private String comAttribute;
+        private String comType;
+        private String centerInd;
+        private String comLevel;
+        private String postCode;
+        private String phoneNumber;
+        private String faxNumber;
+        private String manager;
+        private String webAddress;
+        private String servicePhone;
+        private String reportPhone;
+        private String creatorCode;
+        private String createTime;
+        private String updaterCode;
+        private String updateTime;
+        private String validInd;
+        private String remark;
+        private String flag;
+        private String shortCName;
+        private String shortTName;
+        private String shortEName;
+        private String taxNumber;
+        private String email;
+        private String printPolicyComCode;
+        private String printInvoiceComCode;
+        private String cityCode;
+    }
+
+    @Data
+    public static class SalesManDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 6710912392678260370L;
+
+        private String id;
+        private String usercode;
+        private String username;
+        private String companycode;
+        private String area;
+        private String remark;
+        private String flag;
+        private String approveind;
+        private String approvedate;
+        private String usertype;
+        private String idcardno;
+        private String mobile;
+        private String createtype;
+        private String refferid;
+        private String creatime;
+        private String openid;
+        private String solutioncode;
+        private String saleschannel;
+        private String agreementcode;
+        private String salesmancode;
+        private String salesmanname;
+        private String salesmanterminatedate;
+        private String channelsort;
+        private String channeltip;
+        private String channelsortName;
+        private String channeltipName;
+    }
+
+    @Data
+    public static class CanChoiceCompanysDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 8423902472584783331L;
+
+        private String companyCode;
+        private String companyName;
+        private String shortCompanyName;
+        private List<ChildrenDTO> children;
+
+        @Data
+        public static class ChildrenDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = -3678054625225854900L;
+
+            private String companyCode;
+            private String companyName;
+            private String shortCompanyName;
+            private List<SubChildrenDTO> children;
+
+            @Data
+            public static class SubChildrenDTO implements Serializable {
+                @Serial
+                private static final long serialVersionUID = -3678054625225854900L;
+
+                private String companyCode;
+                private String companyName;
+                private String shortCompanyName;
+            }
+        }
+    }
+}

+ 11 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbBaseRequest.java

@@ -0,0 +1,11 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/4/7 15:41
+ **/
+public class HbBaseRequest implements Serializable {
+}

+ 41 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerAuthenticateRequest.java

@@ -0,0 +1,41 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import cn.hutool.crypto.digest.DigestUtil;
+import com.jzg.commons.text.CharsetKit;
+import com.jzg.quote.hengbang.crawler.entity.response.HbCrawlerCaptchaResponse;
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Base64;
+
+/**
+ * @description: 恒邦财险 登录 请求参数
+ * @author: shenwd
+ * @date: 2025/4/7 16:03
+ * {
+ * 	"password": "qSxicCcOHVM0hiSOi40v8Q==",
+ * 	"username": "SXXN000136",
+ * 	"resourceType": "HBXSH",
+ * 	"verifyKey": "4419ed08-5b7a-469d-bee2-9fbc719058d3",
+ * 	"verifyCode": "8634"
+ * }
+ **/
+@Data
+public class HbCrawlerAuthenticateRequest extends HbBaseRequest{
+    @Serial
+    private static final long serialVersionUID = -2918249553072556767L;
+
+    public HbCrawlerAuthenticateRequest(HbCrawlerCaptchaResponse captchaResponse, String username, String password) {
+        this.username = username;
+        this.password = Base64.getEncoder().encodeToString(DigestUtil.md5(password, CharsetKit.UTF_8));
+        this.resourceType = "HBXSH";
+        this.verifyKey = captchaResponse.getVerifyKey();
+        this.verifyCode = captchaResponse.getVerifyCode();
+    }
+
+    private String username;
+    private String password;
+    private String resourceType;
+    private String verifyKey;
+    private String verifyCode;
+}

+ 130 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -0,0 +1,130 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description: 恒邦财险 报价第二步 请求参数
+ * @author: shenwd
+ * @date: 2025/4/8 18:15
+ * {
+ * 	"outofwarrantytype": "N",
+ * 	"clauseType": "2",
+ * 	"ecarChargingPosts": [],
+ * 	"carInsureDevices": [],
+ * 	"effectfLag": null,
+ * 	"accidentInsuranceList": [],
+ * 	"epersonliabilityList": [{
+ * 		"kindcode": "101",
+ * 		"liabamt": 52248,
+ * 		"liabname": "机动车损失保险",
+ * 		"model": "0"
+ * 	    }, {
+ * 		"kindcode": "102",
+ * 		"liabamt": 100000,
+ * 		"liabname": "机动车第三者责任保险",
+ * 		"model": "0"
+ *    }, {
+ * 		"kindcode": "103",
+ * 		"liabamt": 5000,
+ * 		"liabname": "机动车车上人员责任保险(司机)",
+ * 		"model": "0",
+ * 		"quantity": 1,
+ * 		"unitAmount": 5000
+ *    }, {
+ * 		"kindcode": "104",
+ * 		"liabamt": 40000,
+ * 		"liabname": "机动车车上人员责任保险(乘客)",
+ * 		"model": "0",
+ * 		"quantity": 4,
+ * 		"unitAmount": 10000
+ *    }, {
+ * 		"kindcode": "115",
+ * 		"liabamt": 20000,
+ * 		"liabname": "附加医保外医疗费用责任险(三者)",
+ * 		"model": "0"
+ *    }],
+ * 	"begintimeBi": "2025-04-08T11:12:00.000Z",
+ * 	"begintimeCi": "2025-04-08T11:12:00.000Z",
+ * 	"endtimeBi": "",
+ * 	"endtimeCi": "",
+ * 	"plyappno": "T9704020801202589742122",
+ * 	"risktype": "2",
+ * 	"expdisc": "",
+ * 	"ecarshiptaxPart": "投保人",
+ * 	"taxonomyCode": "02",
+ * 	"epolicyFlag": "Y",
+ * 	"accidentEpolicyFlag": ""
+ * }
+ **/
+@Data
+public class HbCrawlerCalculationRequest extends HbBaseRequest{
+    @Serial
+    private static final long serialVersionUID = -6130320344004620564L;
+
+    public HbCrawlerCalculationRequest(QuoteVo quoteVo, String plyappno) {
+        this.outofwarrantytype = "N";
+        this.clauseType = "2";
+        this.epersonliabilityList = getEpersonliabilityList(quoteVo);
+        this.begintimeBi = quoteVo.getBiRiskInfoVo().getStartDate();
+        this.begintimeCi = quoteVo.getCiRiskInfoVo().getStartDate();
+        this.plyappno = plyappno;
+        this.risktype = "2";
+        this.ecarshiptaxPart = "投保人";
+        this.taxonomyCode = "02";
+        this.epolicyFlag = "Y";
+    }
+
+    public List<EpersonliabilityDTO> getEpersonliabilityList(QuoteVo quoteVo) {
+        List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
+        List<EpersonliabilityDTO> epersonliabilityDTOList = new ArrayList<>();
+        for (KindInfoVo kindInfoVo : kindInfoVoList) {
+            EpersonliabilityDTO epersonliabilityDTO = new EpersonliabilityDTO();
+            epersonliabilityDTO.setKindcode(kindInfoVo.getKindCode());
+            epersonliabilityDTO.setLiabname(kindInfoVo.getKindName());
+            epersonliabilityDTO.setLiabamt(kindInfoVo.getAmount());
+            epersonliabilityDTO.setQuantity(kindInfoVo.getQuantity());
+            epersonliabilityDTO.setUnitAmount(kindInfoVo.getUnitAmount());
+            epersonliabilityDTOList.add(epersonliabilityDTO);
+        }
+        return epersonliabilityDTOList;
+    }
+
+    private String outofwarrantytype;
+    private String clauseType;
+    private List<String> ecarChargingPosts;
+    private List<String> carInsureDevices;
+    private String effectfLag;
+    private List<String> accidentInsuranceList;
+    private List<EpersonliabilityDTO> epersonliabilityList;
+    private String begintimeBi;
+    private String begintimeCi;
+    private String endtimeBi;
+    private String endtimeCi;
+    private String plyappno;
+    private String risktype;
+    private String expdisc;
+    private String ecarshiptaxPart;
+    private String taxonomyCode;
+    private String epolicyFlag;
+    private String accidentEpolicyFlag;
+
+    @Data
+    public static class EpersonliabilityDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 4972640996367640469L;
+
+        private String kindcode;
+        private String liabamt;
+        private String liabname;
+        private String model = "0";
+        private String quantity;
+        private String unitAmount;
+    }
+}

+ 24 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerCaptchaRequest.java

@@ -0,0 +1,24 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 获取登录验证码 请求参数
+ * @author: shenwd
+ * @date: 2025/4/7 15:40
+ **/
+@Data
+public class HbCrawlerCaptchaRequest extends HbBaseRequest{
+    @Serial
+    private static final long serialVersionUID = -8408562254508198842L;
+
+    public HbCrawlerCaptchaRequest() {
+        this.width = 120;
+        this.height = 38;
+    }
+
+    private Integer width;
+    private Integer height;
+}

+ 48 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerDepreciationRequest.java

@@ -0,0 +1,48 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 获取折旧价 请求参数
+ * 若无商业险,则不请求该接口
+ * @author: shenwd
+ * @date: 2025/4/8 15:01
+ **/
+@Data
+public class HbCrawlerDepreciationRequest extends HbBaseRequest{
+    @Serial
+    private static final long serialVersionUID = 8016121918793424743L;
+
+    public HbCrawlerDepreciationRequest(CarInfoVo carInfoVo, String beginDate, String riskCode) {
+        this.beginDate = beginDate;
+        this.riskCode = riskCode;
+        this.carKindCode = carInfoVo.getCarKindCode();
+        this.enrollDate = carInfoVo.getIssueDate();
+        this.purchasePrice = carInfoVo.getPurchasePrice();
+        this.carUseType = carInfoVo.getVehicleUseCode();
+        this.seatCount = carInfoVo.getSeatCount();
+        this.tonCount = carInfoVo.getTonCount();
+        this.useNatureCode = carInfoVo.getCarNatureCode();
+        this.energyType = carInfoVo.getEnergyTypeCode();
+    }
+
+    /**
+     * 商业险起保日期
+     */
+    private String beginDate;
+    private String riskCode;
+    private String carKindCode;
+    /**
+     * 初登日期
+     */
+    private String enrollDate;
+    private String purchasePrice;
+    private String carUseType;
+    private String seatCount;
+    private String tonCount;
+    private String useNatureCode;
+    private String energyType;
+}

+ 55 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerQueryCarRequest.java

@@ -0,0 +1,55 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import com.jzg.quote.hengbang.crawler.service.HengBangCrawlerRequest;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 恒邦财险 车型查询 请求参数
+ * @author: shenwd
+ * @date: 2025/4/7 17:50
+ * {
+ *   "cbitData": [
+ *     {
+ *       "Brand": "大众牌",
+ *       "ModelCode": "BYQKBMUC0021",
+ *       "VehicleStyleUniqueId": 4986
+ *     }
+ *   ],
+ *   "pageNo": 0,
+ *   "pageSize": 5
+ * }
+ **/
+@Data
+@NoArgsConstructor
+public class HbCrawlerQueryCarRequest extends HbBaseRequest {
+    @Serial
+    private static final long serialVersionUID = 2573166312583296895L;
+
+    public HbCrawlerQueryCarRequest(String brand, String modelCode, Integer VehicleStyleUniqueId) {
+        this.cbitData.Brand = brand;
+        this.cbitData.ModelCode = modelCode;
+        this.cbitData.VehicleStyleUniqueId = VehicleStyleUniqueId;
+        this.pageNo = 0;
+        this.pageSize = 5;
+    }
+
+    private CbitDataDTO cbitData;
+
+    private Integer pageNo;
+
+    private Integer pageSize;
+
+    @Data
+    @NoArgsConstructor
+    public static class CbitDataDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 5943174137237635474L;
+        private String Brand;
+        private String ModelCode;
+        private Integer VehicleStyleUniqueId;
+    }
+}

+ 502 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java

@@ -0,0 +1,502 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quote.hengbang.crawler.entity.HengBangCrawlerConfigureParameters;
+import com.jzg.quote.hengbang.crawler.entity.dto.HbEncDTO;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 恒邦财险 报价第一步 提交基础数据,返回投保单号
+ * @author: shenwd
+ * @date: 2025/4/9 09:56
+ **/
+@Data
+public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
+    @Serial
+    private static final long serialVersionUID = -4097447719083993314L;
+
+    public HbCrawlerQuoteimmediatelyRequest(QuoteVo quoteVo, HbEncDTO saleInfo, String depreciationPrice, HengBangCrawlerConfigureParameters parameters) {
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();//车主
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();//投保人
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();//被保人
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+
+        CarInsureItemDTO carInsureItemDTO = new CarInsureItemDTO();
+        //设置车主信息
+        carInsureItemDTO.setCarOwner(ownersInfo.getName());
+        carInsureItemDTO.setCredentialType(ownersInfo.getDocumentsTypeCode());
+        carInsureItemDTO.setCredentialNo(ownersInfo.getIdentifyNumber());
+        //设置车辆信息
+        carInsureItemDTO.setEnergyType(carInfoVo.getEnergyTypeCode());
+        carInsureItemDTO.setLicenseNo(carInfoVo.getLicenseNo());
+        carInsureItemDTO.setEnrollDate(carInfoVo.getRegisterDate());
+        carInsureItemDTO.setIssueDate(carInfoVo.getIssueDate());
+        carInsureItemDTO.setFrameNo(carInfoVo.getVinNo());
+        carInsureItemDTO.setEngineNo(carInfoVo.getEngineNo());
+        carInsureItemDTO.setPrintBrandName(carInfoVo.getBrandName());
+        carInsureItemDTO.setBrandName(carInfoVo.getBrandName());
+        carInsureItemDTO.setCarKindCode(carInfoVo.getCarKindCode());
+        carInsureItemDTO.setUsenatureCode(carInfoVo.getCarNatureCode());
+        carInsureItemDTO.setCarUseType(carInfoVo.getVehicleUseCode());
+        carInsureItemDTO.setNegotiationValue(Integer.parseInt(depreciationPrice));
+        carInsureItemDTO.setLicenseKindCode(carInfoVo.getLicenseKindCode());
+        carInsureItemDTO.setVehicleType(carInfoVo.getCarTypeCode());
+        carInsureItemDTO.setTransferDate(carInfoVo.getTransferDate());
+        carInsureItemDTO.setSeatCount(carInfoVo.getSeatCount());
+        carInsureItemDTO.setPurchasePrice(Integer.parseInt(carInfoVo.getPurchasePrice()));
+        carInsureItemDTO.setExhaustscale(carInfoVo.getDisplacement());
+        carInsureItemDTO.setExhaustscale(carInfoVo.getDisplacement());
+        carInsureItemDTO.setPower(carInfoVo.getPowerScale());
+        carInsureItemDTO.setTonCount(carInfoVo.getTonCount());
+        carInsureItemDTO.setCompleteKerbMass(carInfoVo.getCompleteKerbMass());
+        carInsureItemDTO.setActualValue(Integer.parseInt(depreciationPrice));
+
+        //设置被保人
+        CarInsureRiskRelatedPartyDTO riskRelatedPartyDTO = new CarInsureRiskRelatedPartyDTO();
+        riskRelatedPartyDTO.setName(insuredPersonInfo.getName());
+        riskRelatedPartyDTO.setMobilePhone(insuredPersonInfo.getMobile());
+        riskRelatedPartyDTO.setIdentifyType(insuredPersonInfo.getDocumentsTypeCode());
+        riskRelatedPartyDTO.setIdentifyNumber(insuredPersonInfo.getIdentifyNumber());
+        riskRelatedPartyDTO.setBirthday(insuredPersonInfo.getBirthday());
+        riskRelatedPartyDTO.setEmail(insuredPersonInfo.getEmail());
+        riskRelatedPartyDTO.setCountyCode(insuredPersonInfo.getCountyCode());
+        riskRelatedPartyDTO.setCountyNameArray(new StringBuilder(insuredPersonInfo.getProvince()).append(",").append(insuredPersonInfo.getCity()).append(",").append(insuredPersonInfo.getCounty()).toString());
+        riskRelatedPartyDTO.setCountyCodeArray(new StringBuilder(insuredPersonInfo.getProvinceCode()).append(",").append(insuredPersonInfo.getCityCode()).append(",").append(insuredPersonInfo.getCountyCode()).toString());
+        riskRelatedPartyDTO.setSex(insuredPersonInfo.getGender());
+        riskRelatedPartyDTO.setAddress(insuredPersonInfo.getAddr());
+        riskRelatedPartyDTO.setValidityBegintime(insuredPersonInfo.getIdentifyValidDate());
+        riskRelatedPartyDTO.setValidityEndTime(insuredPersonInfo.getIdentifyValidEndDate());
+
+        //设置投保人数据
+        CarInsureRelatedPartyDTO carInsureRelatedPartyDTO = new CarInsureRelatedPartyDTO();
+        carInsureRelatedPartyDTO.setName(policyHolderInfo.getName());
+        carInsureRelatedPartyDTO.setMobilePhone(policyHolderInfo.getMobile());
+        carInsureRelatedPartyDTO.setIdentifyType(policyHolderInfo.getDocumentsTypeCode());
+        carInsureRelatedPartyDTO.setIdentifyNumber(policyHolderInfo.getIdentifyNumber());
+        carInsureRelatedPartyDTO.setBirthday(policyHolderInfo.getBirthday());
+        carInsureRelatedPartyDTO.setEmail(policyHolderInfo.getEmail());
+        carInsureRelatedPartyDTO.setCountyCode(policyHolderInfo.getCountyCode());
+        carInsureRelatedPartyDTO.setCountyNameArray(new StringBuilder(policyHolderInfo.getProvince()).append(",").append(policyHolderInfo.getCity()).append(",").append(policyHolderInfo.getCounty()).toString());
+        carInsureRelatedPartyDTO.setCountyCodeArray(new StringBuilder(policyHolderInfo.getProvinceCode()).append(",").append(policyHolderInfo.getCityCode()).append(",").append(policyHolderInfo.getCountyCode()).toString());
+        carInsureRelatedPartyDTO.setSex(policyHolderInfo.getGender());
+        carInsureRelatedPartyDTO.setAddress(policyHolderInfo.getAddr());
+        carInsureRelatedPartyDTO.setValidityBegintime(policyHolderInfo.getIdentifyValidDate());
+        carInsureRelatedPartyDTO.setValidityEndTime(insuredPersonInfo.getIdentifyValidEndDate());
+        carInsureRelatedPartyDTO.setInsuredType(parameters.getInvoiceType());
+
+        //设置归属数据
+        CarInsureMainDTO carInsureMainDTO = new CarInsureMainDTO();
+        HbEncDTO.SalesManDTO salesMan = saleInfo.getSalesMan();
+        HbEncDTO.CompanysDTO companysDTO = saleInfo.getCompanys();
+        carInsureMainDTO.setBusinessSource(salesMan.getSaleschannel());
+        carInsureMainDTO.setIntermediaryCode(salesMan.getUsercode());
+        carInsureMainDTO.setIntermediaryName(salesMan.getUsername());
+        carInsureMainDTO.setAgreementCode(salesMan.getAgreementcode());
+        carInsureMainDTO.setSolutionCode(salesMan.getSolutioncode());
+        carInsureMainDTO.setBusinessChannel(salesMan.getChannelsort());
+        carInsureMainDTO.setBusinessChannelName(salesMan.getChannelsortName());
+        carInsureMainDTO.setChannelDetailCode(salesMan.getChanneltip());
+        carInsureMainDTO.setChannelDetailName(salesMan.getChanneltipName());
+        carInsureMainDTO.setSalesmanCode(salesMan.getSalesmancode());
+        carInsureMainDTO.setCompanyCode(salesMan.getCompanycode());
+        carInsureMainDTO.setCompanyCName(companysDTO.getCompanyCName());
+        carInsureMainDTO.setMobile(salesMan.getMobile());
+        carInsureMainDTO.setSalesmanname(salesMan.getSalesmanname());
+        carInsureMainDTO.setUsertype(salesMan.getUsertype());
+        carInsureMainDTO.setInvoiceRequest(parameters.getInvoiceType());
+        carInsureMainDTO.setOperatorCode(quoteVo.getOrder().getAttributionInformationVo().getUsername());
+        carInsureMainDTO.setCreator(quoteVo.getOrder().getAttributionInformationVo().getUsername());
+    }
+
+    /**
+     * 车辆及车主信息
+     */
+    private CarInsureItemDTO carInsureItem;
+
+    /**
+     * 被保人
+     */
+    private CarInsureRiskRelatedPartyDTO carInsureRiskRelatedParty;
+
+    /**
+     * 投保人
+     */
+    private CarInsureRelatedPartyDTO carInsureRelatedParty;
+
+    /**
+     * 业务归属相关信息
+     */
+    private CarInsureMainDTO carInsureMain;
+
+    private Object carInsureProtectedContact;
+    private Object htbOrderExpand;
+
+    @Data
+    public static class CarInsureItemDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -1337339430368042318L;
+
+        /**
+         * 能源类型
+         */
+        private String energyType;
+        /**
+         *
+         */
+        private String purerange;
+        /**
+         *
+         */
+        private String otherEnergyTypeDesc;
+        /**
+         * 车牌号
+         */
+        private String licenseNo;
+        /**
+         * 初登日期
+         */
+        private String enrollDate;
+        /**
+         * 发证日期
+         */
+        private String issueDate;
+        /**
+         * 车架号
+         */
+        private String frameNo;
+        /**
+         * 发动机号
+         */
+        private String engineNo;
+        /**
+         * 打印厂牌型号
+         */
+        private String printBrandName;
+        /**
+         * 车辆型号
+         */
+        private String brandName;
+        /**
+         *
+         */
+        private String modelCode;
+        /**
+         *
+         */
+        private String familyName;
+        /**
+         * 机动车种类
+         */
+        private String carKindCode;
+        /**
+         *
+         */
+        private String carKindShow;
+        /**
+         *
+         */
+        private String usenatureCode;
+        /**
+         *
+         */
+        private String attachNature;
+        /**
+         * 车辆用途
+         */
+        private String carUseType;
+        /**
+         * 协商价格
+         */
+        private Integer negotiationValue;
+        /**
+         * 车牌种类
+         */
+        private String licenseKindCode;
+        /**
+         * 交管车辆类型
+         */
+        private String vehicleType;
+        /**
+         *
+         */
+        private String chgownerFlag;
+        /**
+         * 过户日期
+         */
+        private String transferDate;
+        /**
+         * 座位数
+         */
+        private String seatCount;
+        /**
+         *
+         */
+        private String countrynature;
+        /**
+         * 新车购置价
+         */
+        private Integer purchasePrice;
+        /**
+         * 排量(cc)
+         */
+        private String exhaustscale;
+        /**
+         * 排量
+         */
+        private String exhaustScale;
+        /**
+         * 功率(KW)
+         */
+        private String power;
+        /**
+         * 核定载质量
+         */
+        private String tonCount;
+        /**
+         * 整备质量(kg)
+         */
+        private String completeKerbMass;
+        /**
+         * 总质量
+         */
+        private String totalTonCount;
+        /**
+         *
+         */
+        private String specialCarFlag;
+        /**
+         *
+         */
+        private String dealerCode;
+        /**
+         *
+         */
+        private String dealerName;
+        /**
+         * 行业车型编码
+         */
+        private String ciModelCode;
+        /**
+         * 折旧价
+         */
+        private Integer actualValue;
+        /**
+         *
+         */
+        private Integer purchasePriceNotTax;
+        /**
+         *
+         */
+        private String groupCode;
+        private String maxDesignSpeed;
+        private String carSequenceNo;
+        private String styleUniqueId;
+        private String noticeType;
+        /**
+         * 车主姓名
+         */
+        private String carOwner;
+        /**
+         * 车主证件类型
+         */
+        private String credentialType;
+        /**
+         * 车主证件号
+         */
+        private String credentialNo;
+        /**
+         *
+         */
+        private String countyCode;
+        /**
+         *
+         */
+        private String countyCodeArray;
+        /**
+         *
+         */
+        private String countyNameArray;
+    }
+
+    @Data
+    public static class CarInsureRiskRelatedPartyDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -9156065133258869988L;
+
+        private String id;
+        private String plyappno;
+        /**
+         * 被保人姓名
+         */
+        private String name;
+        private String mobilePhone;
+        private String insuredType;
+        /**
+         * 证件类型
+         */
+        private String identifyType;
+        /**
+         * 证件号
+         */
+        private String identifyNumber;
+        private String birthday;
+        private String company;
+        private String email;
+        /**
+         * 区县编码
+         */
+        private String countyCode;
+        /**
+         * 省市区县名称
+         * 山西省 , 吕梁市 , 文水县
+         */
+        private String countyNameArray;
+        /**
+         * 省市区县编码
+         * 140000,141100,141121
+         */
+        private String countyCodeArray;
+        /**
+         * 邮政编码
+         */
+        private String postCode;
+        private String position;
+        private String sex;
+        private String address;
+        private String validityBegintime;
+        private String validityEndTime;
+        private String customerType;
+        private String vipInd;
+        private String relationshipToInsrnt;
+    }
+
+    @Data
+    public static class CarInsureRelatedPartyDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -6098236046645090816L;
+
+        private String id;
+        private String plyappno;
+        /**
+         * 投保人姓名
+         */
+        private String name;
+        private String mobilePhone;
+        private String insuredType;
+        /**
+         * 证件类型
+         */
+        private String identifyType;
+        /**
+         * 证件号
+         */
+        private String identifyNumber;
+        private String birthday;
+        private String company;
+        private String email;
+        /**
+         * 区县编码
+         */
+        private String countyCode;
+        /**
+         * 省市区县名称
+         * 山西省 , 吕梁市 , 文水县
+         */
+        private String countyNameArray;
+        /**
+         * 省市区县编码
+         * 140000,141100,141121
+         */
+        private String countyCodeArray;
+        /**
+         * 邮政编码
+         */
+        private String postCode;
+        private String position;
+        private String sex;
+        private String address;
+        private String validityBegintime;
+        private String validityEndTime;
+        private String customerType;
+        private String vipInd;
+        /**
+         * 洗钱分线
+         */
+        private String moneyLaunderingInd;
+        private String invoiceRequest;
+    }
+
+    @Data
+    public static class CarInsureMainDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -8256518061391720615L;
+
+        /**
+         * 业务方式
+         */
+        private String businessMode;
+        private String businessModeName;
+        /**
+         * 业务来源
+         */
+        private String businessSource;
+        private String businessAgency;
+        /**
+         * 中介编码
+         */
+        private String intermediaryCode;
+        /**
+         * 中介名称
+         */
+        private String intermediaryName;
+        /**
+         * 中介协议号
+         */
+        private String agreementCode;
+        /**
+         * 子协议号
+         */
+        private String solutionCode;
+        private String salesman;
+        private String resourceType;
+        /**
+         * 渠道类型编码
+         */
+        private String businessChannel;
+        /**
+         * 渠道类型名称
+         */
+        private String businessChannelName;
+        /**
+         * 渠道小类编码
+         */
+        private String channelDetailCode;
+        /**
+         * 渠道小类名称
+         */
+        private String channelDetailName;
+        private String salesmanCode;
+        /**
+         * 业务归属代码
+         */
+        private String companyCode;
+        /**
+         * 业务归属名称
+         */
+        private String companyCName;
+        private String accountPeriod;
+        private String mobile;
+        private String salesmanname;
+        private String dealerCode;
+        private String dealerName;
+        private String usertype;
+        private String invoiceRequest;
+        private String operatorCode;
+        private String creator;
+    }
+}

+ 20 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/request/HbCrawlerSaleInfoRequest.java

@@ -0,0 +1,20 @@
+package com.jzg.quote.hengbang.crawler.entity.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 归属信息 请求参数
+ * @author: shenwd
+ * @date: 2025/4/8 11:18
+ **/
+@Data
+@AllArgsConstructor
+public class HbCrawlerSaleInfoRequest extends HbBaseRequest{
+    @Serial
+    private static final long serialVersionUID = 589141880937488744L;
+
+    private String mobile;
+}

+ 11 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbBaseResponse.java

@@ -0,0 +1,11 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import java.io.Serializable;
+
+/**
+ * @description:
+ * @author: shenwd
+ * @date: 2025/4/7 15:45
+ **/
+public class HbBaseResponse implements Serializable {
+}

+ 41 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerAuthenticateResponse.java

@@ -0,0 +1,41 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 登录 返回参数
+ * @author: shenwd
+ * @date: 2025/4/7 16:04
+ * {
+ * 	"approveind": null,
+ * 	"usertype": "3",
+ * 	"operateCode": null,
+ * 	"userName": "SXXN000136",
+ * 	"resourceType": "HBXSH",
+ * 	"phoneNumber": "18935170101",
+ * 	"userId": 1119495512,
+ * 	"cardCode": null,
+ * 	"riskPlanCode": null,
+ * 	"wxCheckFlag": "0",
+ * 	"id_token": "eyJhbGciOiJFUzUxMiJ9.eyJpc3MiOiJIQklOQyIsInN1YiI6InBhc3N3ZDpTWFhOMDAwMTM2IiwiaWF0IjoxNzQ0MDExMTY0LCJqdGkiOiIyMDgzY2NjNy0yNTY5LTRiOGUtOTg3ZC05MTE5OGNlODkyYmIiLCJBVVRIT1JJVElFU19LRVkiOiIiLCJsb2dpblVzZXJOYW1lIjoiU1hYTjAwMDEzNiIsInRva2VuU291cmNlIjoiSEIiLCJsb2dpblVzZXJJbmZvIjp7InNvbHV0aW9uY29kZSI6IjAxMDcwNDAyMDEwMDIwMDAxMzAwMDEiLCJjb21wYW55Y29kZSI6IjAxMDcwNDAyMDEiLCJtb2JpbGUiOiIxODkzNTE3MDEwMSIsInVzZXJ0eXBlIjoiMyIsImlkY2FyZG5vIjoiOTExNDA4MDJNQTBIME1BOVhLIiwic2FsZXNtYW5jb2RlIjoiMzYwMDAwMjUyOSIsIm9wZXJhdG9yY29kZSI6bnVsbCwiaWQiOjExMTk0OTU1MTIsInVzZXJjb2RlIjoiMDkwMDAwMDA0NjA5IiwiYWdyZWVtZW50Y29kZSI6IjAxMDcwNDAyMDEwMDIwMDAxMyJ9LCJsb2dpbkN0bEZsYWciOiIiLCJyZXNvdXJjZVR5cGUiOiJIQlhTSCIsImV4cCI6MTc0NDA5NzU2NH0.AIzGCyitaPFRR09TaSrtr0cWabQJHIvvY73WYD_PsTtsiytc3lS-wcece2FlolkoAEF9deLHdRbe6H-IlYNcpIklAKj4exJeScjb3uuJKviB8SDlTAIVyc7oB_tzaE5nN8SY9rXkct5ruH5pzZHyIwmkeVcs0yz7_T6U7Jczjyos99Wt"
+ * }
+ **/
+@Data
+public class HbCrawlerAuthenticateResponse extends HbBaseResponse {
+    @Serial
+    private static final long serialVersionUID = -8055792020449251993L;
+
+    private String approveind;
+    private String usertype;
+    private String operateCode;
+    private String userName;
+    private String resourceType;
+    private String phoneNumber;
+    private String userId;
+    private String cardCode;
+    private String riskPlanCode;
+    private String wxCheckFlag;
+    private String id_token;
+}

+ 62 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerCalculationResponse.java

@@ -0,0 +1,62 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.util.Map;
+
+/** 返回数据示例
+ * {
+ *   "type" : "https://www.jhipster.tech/problem/problem-with-message",
+ *   "title" : "Internal Server Error",
+ *   "status" : 500,
+ *   "detail" : "失败:交互车险平台异常\n交强险平台返回:号牌号码“晋LK879F”的保单发生重复投保,与其重复投保的本公司的保单信息如下:车架号 LVSHCADB7JR078450;发动机号 4216311;地区 山西。",
+ *   "path" : "/api/carinsurenew/calculation",
+ *   "message" : "error.http.500"
+ * }
+ *
+ * {
+ * 	"status": "3",
+ * 	"errorCode": "0000",
+ * 	"message": "交互车险平台异常\n交强险平台返回:号牌号码“晋H3U166”的保单发生重复投保,与其重复投保的其它公司的保单信息如下:投保确认码 02PICC140024052214721106428571;保单号 PDZA202414220000028712;起保日期 2024-05-03 16:00;终保日期 2025-05-03 16:00;号牌号码 晋H3U166;号牌种类 02;车架号 LGB652E08RS257787;发动机号 5028706;地区 山西。",
+ * 	"responseBody": {
+ * 		"begintimeCi": " 2025-05-03 16:00"
+ * 	    },
+ * 	"plyappno": "T9704020801202589735924",
+ * 	"map": {
+ * 		"responseBody": {
+ * 			"begintimeCi": " 2025-05-03 16:00"
+ *        },
+ * 		"errorCode": "0000",
+ * 		"message": "交互车险平台异常\n交强险平台返回:号牌号码“晋H3U166”的保单发生重复投保,与其重复投保的其它公司的保单信息如下:投保确认码 02PICC140024052214721106428571;保单号 PDZA202414220000028712;起保日期 2024-05-03 16:00;终保日期 2025-05-03 16:00;号牌号码 晋H3U166;号牌种类 02;车架号 LGB652E08RS257787;发动机号 5028706;地区 山西。",
+ * 		"status": "3"
+ *    }
+ * }
+ *
+ * {
+ *   "status" : "9",
+ *   "errorCode" : "0000",
+ *   "message" : "投保.单车.0_下发修改.通用规则.三者限额管控新</br>投保.单车.0_下发修改.通用规则.24单组合险预期赔付率管控-非ABFHM</br>投保.单车.0_下发修改.通用规则.客车商业核实意外险</br>车型唯一ID: 423732 ;投保的行业车型编码 : BHFKHLUC0111 ;平台行业车型编码:BHFKHLUC0104 ;请核实!",
+ *   "responseBody" : null,
+ *   "plyappno" : "T9704020801202589742122",
+ *   "map" : {
+ *     "responseBody" : null,
+ *     "errorCode" : "0000",
+ *     "message" : "投保.单车.0_下发修改.通用规则.三者限额管控新</br>投保.单车.0_下发修改.通用规则.24单组合险预期赔付率管控-非ABFHM</br>投保.单车.0_下发修改.通用规则.客车商业核实意外险</br>车型唯一ID: 423732 ;投保的行业车型编码 : BHFKHLUC0111 ;平台行业车型编码:BHFKHLUC0104 ;请核实!",
+ *     "status" : "9"
+ *   }
+ * }
+ */
+
+/**
+ * @description: 恒邦财险 报价第二步 返回参数
+ * @author: shenwd
+ * @date: 2025/4/8 18:34
+ **/
+@Data
+public class HbCrawlerCalculationResponse extends HbBaseResponse{
+    @Serial
+    private static final long serialVersionUID = -6201659311207043003L;
+
+    private Map<String, Object> data;
+}

+ 33 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerCaptchaResponse.java

@@ -0,0 +1,33 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 获取登录验证码 返回参数
+ * @author: shenwd
+ * @date: 2025/4/7 15:45
+ **/
+@Data
+@AllArgsConstructor
+public class HbCrawlerCaptchaResponse extends HbBaseResponse{
+    @Serial
+    private static final long serialVersionUID = -8992172251538749662L;
+
+    /**
+     * 验证码图片base64字符串
+     */
+    private String verifyImg;
+
+    /**
+     * 验证码标识
+     */
+    private String verifyKey;
+
+    /**
+     * 验证码字符串
+     */
+    private String verifyCode;
+}

+ 18 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerDepreciationResponse.java

@@ -0,0 +1,18 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 获取折旧价 返回参数
+ * @author: shenwd
+ * @date: 2025/4/8 16:02
+ **/
+@Data
+public class HbCrawlerDepreciationResponse extends HbBaseResponse{
+    @Serial
+    private static final long serialVersionUID = 8099798304263496357L;
+
+    private Double depreciationRate;
+}

+ 687 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerProposalResponse.java

@@ -0,0 +1,687 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 恒邦财险 获取报价数据
+ * @author: shenwd
+ * @date: 2025/4/9 09:27
+ **/
+@Data
+public class HbCrawlerProposalResponse extends HbBaseResponse{
+    @Serial
+    private static final long serialVersionUID = -1121451252494068473L;
+
+    private String plyappno;
+
+    /**
+     * 业务归属相关信息
+     */
+    private CarInsureMainDTO carInsureMain;
+
+    /**
+     * 被保人
+     */
+    private CarInsureRiskRelatedPartyDTO carInsureRiskRelatedParty;
+
+    /**
+     * 投保人
+     */
+    private CarInsureRelatedPartyDTO carInsureRelatedParty;
+
+    private CarInsureContactDTO carInsureContact;
+    private CarInsureProtectedContactDTO carInsureProtectedContact;
+
+    /**
+     * 车辆及车主信息
+     */
+    private CarInsureItemDTO carInsureItem;
+
+    /**
+     * 商业险险种
+     */
+    private List<CarInsureLiabilityDTO> carInsureLiabilityList;
+
+    /**
+     * 意外险
+     */
+    private List<Object> accidentInsuranceList;
+
+    /**
+     * 家财险
+     */
+    private List<Object> familyInsuranceList;
+
+    /**
+     * 交强险
+     */
+    private ForceLiabilityDTO forceLiability;
+
+    /**
+     * 车船税
+     */
+    private CarInsureShiptaxDTO carInsureShiptax;
+
+    private List<Object> eaccidentRecordList;
+
+    private List<EcarcicarmodelDTO> ecarcicarmodelList;
+
+    private List<EcarshiptaxDTO> ecarshiptaxSubList;
+    
+    private List<EcarPlatformInfoDTO> ecarPlatformInfoList;
+
+    private List<CarInsureScoreDTO> carInsureScoreList;
+
+    private List<Object> multiPricingInfos;
+
+    private List<fraudQueryDTO> fraudQueryList;
+
+    private String epolicyFlag;
+
+    private String busiTotalPremium;
+
+    private String accidentTotalPremium;
+    private String familyTotalPremium;
+    private String totalPremium;
+
+    private ForceCarInsureRiskDTO forceCarInsureRisk;
+
+    private BusiCarInsureRiskDTO busiCarInsureRisk;
+
+    @Data
+    public static class CarInsureMainDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -1266442684206710366L;
+
+        private String id;
+        private String plyappno;
+        private String quotationno;
+        private String proposalno;
+        private String policyno;
+        private Double premium;
+        /**
+         * 总保额
+         */
+        private Double amt;
+        private Double uwPremium;
+        private String risktype;
+        private String expdisc;
+        private String jiaoshangbutongbuFlag;
+        private String epolicyFlag;
+        private String accidentEpolicyFlag;
+        private String businessMode;
+        private String businessChannel;
+        private String channelDetailCode;
+        private String companyCode;
+        private String intermediaryCode;
+        private String agreementCode;
+        private String solutionCode;
+        private String salesmanId;
+        private String salesmanCode;
+        private String businessSource;
+        private String renewind;
+        private String renewindCount;
+        private String operatorCode;
+        private String remark;
+        private String uwRules;
+        private String onlineSales;
+        private String ecarshiptaxPart;
+        private String resourceType;
+        private String mobile;
+        private String agentMobile;
+        private String openid;
+        private String signTime;
+        private String createDate;
+        private String creator;
+        private String lastUpdated;
+        private String planNo;
+        private String delFlag;
+        private String yguuid;
+        private String referralCode;
+        private String promotionCode;
+        private String fraudQueryNo;
+    }
+
+    @Data
+    public static class CarInsureRiskRelatedPartyDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 8426885993654639708L;
+
+        private String id;
+        private String plyappno;
+        private String name;
+        private String identifyNumber;
+        private String identifyType;
+        private String sex;
+        private String email;
+        private String postCode;
+        private String address;
+        private String company;
+        private String position;
+        private String vipInd;
+        private String insuredType;
+        private String birthday;
+        private String countyCode;
+        private String mobilePhone;
+        private String createDate;
+        private String validityBegintime;
+        private String validityEndTime;
+        private String customerType;
+        private String relationshipToInsrnt;
+        private String countyCodeArray;
+        private String countyNameArray;
+    }
+
+    @Data
+    public static class CarInsureRelatedPartyDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 165125596560303865L;
+
+        private String id;
+        private String plyappno;
+        private String name;
+        private String identifyNumber;
+        private String identifyType;
+        private String sex;
+        private String email;
+        private String postCode;
+        private String address;
+        private String company;
+        private String position;
+        private String vipInd;
+        private String insuredType;
+        private String birthday;
+        private String countyCode;
+        private String mobilePhone;
+        private String createDate;
+        private String validityBegintime;
+        private String validityEndTime;
+        private String moneyLaunderingInd;
+        private String invoiceRequest;
+        private String customerType;
+        private String countyCodeArray;
+        private String countyNameArray;
+    }
+
+    @Data
+    public static class CarInsureContactDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -3181470124792512222L;
+
+        private String plyappno;
+        private String taxPayerType;
+        private String taxPayerNumber;
+        private String taxAddress;
+        private String taxPhone;
+        private String accountBank;
+        private String bankAccountNumber;
+        private String contactName;
+        private String contactIdentifyType;
+        private String contactIdentifyNumber;
+        private String contactExpirationStartDate;
+        private String contactExpirationEndDate;
+        private String contactPhone;
+        private String contactEmail;
+        private String officePhone;
+        private String representative;
+        private String representativeNo;
+    }
+
+    @Data
+    public static class CarInsureProtectedContactDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -165565443901126263L;
+
+        private String plyappno;
+        private String contactName;
+        private String contactIdentifyType;
+        private String contactIdentifyNumber;
+        private String contactExpirationStartDate;
+        private String contactExpirationEndDate;
+        private String contactPhone;
+        private String contactEmail;
+        private String officePhone;
+    }
+
+    @Data
+    public static class CarInsureItemDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 3451657532791237490L;
+
+        private String id;
+        private String plyappno;
+        private String enrollDate;
+        private String issueDate;
+        private String licenseNo;
+        private String engineNo;
+        private String frameNo;
+        private String brandName;
+        private String modelCode;
+        private String carKindCode;
+        private String carKindShow;
+        private String usenatureCode;
+        private String attachNature;
+        private String carUseType;
+        private String negotiationValue;
+        private String carOwner;
+        private String credentialType;
+        private String credentialNo;
+        private String licenseKindCode;
+        private String vehicleType;
+        private String chgownerFlag;
+        private String transferDate;
+        private String seatCount;
+        private String countrynature;
+        private String purchasePrice;
+        private String power;
+        private String exhaustScale;
+        private String tonCount;
+        private String completeKerbMass;
+        private String totalTonCount;
+        private String specialCarFlag;
+        private String dealerCode;
+        private String dealerName;
+        private String ciModelCode;
+        private String printBrandName;
+        private String countyCode;
+        private String countyCodeArray;
+        private String actualValue;
+        private String purchasePriceNotTax;
+        private String countyNameArray;
+        private String groupCode;
+        private String vehicleScore;
+        private String vehicleLimitScore;
+        private String hbicScore;
+        private String hbicLimitScore;
+        private String carLoadTranch;
+        private String carLoadScore;
+        private String updateDate;
+        private String createDate;
+        private String energyType;
+        private String purerange;
+        private String otherEnergyTypeDesc;
+        private String ubiScore;
+        private String ubiLimitScore;
+        private String maxDesignSpeed;
+        private String carSequenceNo;
+        private String styleUniqueId;
+        private String noticeType;
+    }
+
+    @Data
+    public static class CarInsureLiabilityDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -2506574718530500035L;
+        private String id;
+        private String plyappno;
+        private String kindcode;
+        /**
+         * 保额
+         */
+        private Integer liabamt;
+        /**
+         * 保费
+         */
+        private Double liabprm;
+        /**
+         * 险种名称
+         */
+        private String liabname;
+        private String orderby;
+        private String isprintprm;
+        private String liabrate;
+        private String itemno;
+        private String kindind;
+        private String createDate;
+        private String creator;
+        private String lastUpdated;
+        private String modifier;
+        /**
+         * 份数
+         */
+        private Integer quantity;
+        private String itemdetailcode;
+        private String model;
+        private String qutationNo;
+        private String modeCode;
+        private String unitAmount;
+        private String deDuctibleFranchise;
+        private String serviceTimes;
+        private String value;
+        private String limitDoubledType;
+    }
+
+    @Data
+    public static class ForceLiabilityDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1117414543270737314L;
+        private String id;
+        private String plyappno;
+        private String kindcode;
+        private Integer liabamt;
+        private Double liabprm;
+        private String riskplancode;
+        private String liabname;
+        private String orderby;
+        private String isprintprm;
+        private String liabrate;
+        private String itemno;
+        private String kindind;
+        private String createDate;
+        private String creator;
+        private String lastUpdated;
+        private String modifier;
+        private Integer quantity;
+        private String itemdetailcode;
+        private String model;
+        private String qutationNo;
+        private String modeCode;
+        private String unitAmount;
+        private String deDuctibleFranchise;
+        private String serviceTimes;
+        private String value;
+        private String limitDoubledType;
+    }
+
+    @Data
+    public static class CarInsureShiptaxDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -2943803816981415748L;
+        private String plyappno;
+        private String annualtaxdue;
+        private String sumtaxdefault;
+        private String sumoverdue;
+        private String sumtax;
+        private String taxdocumentnumber;
+        private String taxonomyCode;
+        private String ecarshiptaxPartChoice;
+        private String ecarshiptaxPapaidareacodertChoice;
+        private String paidtaxdocumentdate;
+        private String taxdepartment;
+        private String deducationduetype;
+        private String deducationduepropotion;
+        private String deducation;
+        private String deducationduecode;
+        private String taxRelifFlag;
+        private String calcTaxFlag;
+        private String taxRegistryNumber;
+    }
+
+    @Data
+    public static class EcarcicarmodelDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -2802163234969650344L;
+        private String id;
+        private String plyappno;
+        private String modelCode;
+        private String modelidCode;
+        private String tradeName;
+        private String brand;
+        private String series;
+        private String carName;
+        private String deptName;
+        private String pureriskPremium;
+        private String vehicleCode;
+        private String vehicleName;
+        private String hfCode;
+        private String hfName;
+        private String platModelCode;
+        private String carYear;
+        private String seatCount;
+        private String tonCount;
+        private String purchasePrice;
+        private String purchasePriceNoTax;
+        private String carKind;
+        private String vehicleClass;
+        private String kindredPrice;
+        private String exhaustscale;
+        private String yearPattern;
+        private String remark;
+        private String completeKerbMass;
+    }
+
+    @Data
+    public static class EcarshiptaxDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 7344021472594145980L;
+        private String plyappno;
+        private String lineNo;
+        private String rowType;
+        private String taxLocationCode;
+        private String taxStartDate;
+        private String taxEndDate;
+        private String declareDate;
+        private String taxDepartment;
+        private String taxDocumentNumber;
+        private String annualTaxAmount;
+        private String taxDue;
+        private String exceedDate;
+        private String overDueStartDate;
+        private String exceedDaysCount;
+        private String overdue;
+        private String totalAmount;
+        private String calcTaxFlag;
+    }
+
+    @Data
+    public static class EcarPlatformInfoDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 6384939819770273672L;
+        private String id;
+        private String plyappno;
+        private String demandNo;
+        private String lastEffectiveDate;
+        private String lastExpireDate;
+        private String lastIssuedate;
+        private String rateFloatFlag;
+        private String remark;
+        private String scoreCode;
+        private String score;
+        private String renewInsurerFlag;
+        private String riskCode;
+    }
+
+    @Data
+    public static  class CarInsureScoreDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -6303955218431970830L;
+        private String id;
+        private String plyappno;
+        private String scoringType;
+        private String scoring;
+        private String scoringLimit;
+        private String scoringGrade;
+        private String vehicleRiskRating;
+        private String elr;
+        private String fromapps;
+        private String extFileds;
+        private String createDate;
+    }
+
+    @Data
+    public static class fraudQueryDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -1739647310371398848L;
+         private String id;
+         private String plyappno;
+         private String ruleCode;
+         private String ruleCname;
+         private String roleType;
+         private String roleTypeCname;
+         private String roleTyruslpeCname;
+         private String result;
+         private String resultCname;
+
+    }
+
+    @Data
+    public static class ForceCarInsureRiskDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -6933186881268842658L;
+        private String id;
+        private String plyappno;
+        private String proposalno;
+        private String subProposalno;
+        private String policyno;
+        private String riskcode;
+        private String begintime;
+        private String endtime;
+        private String effectFlag;
+        private String sumAmount;
+        private String sumPremium;
+        private String sumUwPremium;
+        private String companyCode;
+        private String feeAmount;
+        private String discount;
+        private String ecDiscount;
+        private String entireDiscount;
+        private String status;
+        private String info;
+        private String payStatus;
+        private String payResponse;
+        private String noCompanionValue;
+        private String trafficViolationValue;
+        private String insureYears;
+        private String claimTimes;
+        private String claimAdjustLevel;
+        private String ciadAustReasonName;
+        private String accepTime;
+        private String quotationno;
+        private String billctpelr;
+        private String billcomelr;
+        private String billelr;
+        private String billcomelr2;
+        private String billelr2;
+        private String expdiscThreshold;
+        private String expdiscLimit;
+        private String expThreshold;
+        private String expLimit;
+    }
+
+    @Data
+    public static class BusiCarInsureRiskDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -6580294483562268921L;
+        private String id;
+        private String plyappno;
+        private String proposalno;
+        private String subProposalno;
+        private String policyno;
+        private String riskcode;
+        private String begintime;
+        private String endtime;
+        private String effectFlag;
+        private String sumAmount;
+        private String sumPremium;
+        private String sumUwPremium;
+        private String companyCode;
+        private String feeAmount;
+        private String discount;
+        private String ecDiscount;
+        private String entireDiscount;
+        private String status;
+        private String info;
+        private String payStatus;
+        private String payResponse;
+        private String noCompanionValue;
+        private String trafficViolationValue;
+        private String insureYears;
+        private String claimTimes;
+        private String claimAdjustLevel;
+        private String ciadAustReasonName;
+        private String noAdjustReasonName;
+        private String accepTime;
+        private String quotationno;
+        private String billctpelr;
+        private String billcomelr;
+        private String billelr;
+        private String billcomelr2;
+        private String billelr2;
+        private String expdiscThreshold;
+        private String expdiscLimit;
+        private String expThreshold;
+        private String expLimit;
+    }
+
+    @Data
+    public static class AccidentInsuranceDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 4659431310465402682L;
+        private String id;
+        private String plyappno;
+        private String proposalno;
+        private String policyCode;
+        private String nonriskcode;
+        private String programcode;
+        private String programname;
+        private String companycode;
+        private String resourcetype;
+        /**
+         * 单位保额
+         */
+        private Integer suminsured;
+        /**
+         * 单位保费
+         */
+        private Integer sumgrosspremium;
+        private String ifDefault;
+        private String seatcount;
+        private String begintime;
+        private String endtime;
+        private String sumitcoretime;
+        /**
+         * 份数
+         */
+        private Integer buynum;
+        private String proposalnoStatus;
+        private String proposalnoInfo;
+        private String ggriskprogramparamlist;
+        private String familyInsureItem;
+        private String drivingType;
+        private String relationCarOwner;
+
+        private List<GgRiskProgramClauseDTO> ggriskprogramclauselist;
+        private List<Object> ggriskprogramdeductiblelist;
+        private List<GgRiskProgramDetailsDTO> ggriskprogramdetailslist;
+
+        @Data
+        public static class GgRiskProgramClauseDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 6163770993645891232L;
+            private String id;
+            private String plyappno;
+            private String nonriskcode;
+            private String programcode;
+            private String clausecode;
+            private String clausecname;
+            private String remark;
+        }
+
+        @Data
+        public static class GgRiskProgramDetailsDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 6249628809238302246L;
+            private String id;
+            private String plyappno;
+            private String insureRiskId;
+            private String nonriskcode;
+            private String programcode;
+            private String serialno;
+            private String kindcode;
+            private String kindname;
+            private String kindrate;
+            private Integer kindunitinsured;
+            private Integer kindsuminsured;
+            private Double kindunitpremium;
+            private Double kindgrosspremium;
+            private String itemDetailCode;
+            private String itemDetailName;
+            private String kindInd;
+            private String calculateInd;
+        }
+    }
+}

+ 188 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerQueryCarResponse.java

@@ -0,0 +1,188 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import com.jzg.quotation.commons.filter.CarModelsFilter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 恒邦财险 车型查询 返回参数
+ * @author: shenwd
+ * @date: 2025/4/7 17:57
+ * {
+ *   "content": [
+ *     {
+ *       "modelCode": "DZAAND0116",
+ *       "modelCName": "大众FV7162FAMGG轿车",
+ *       "carBrand": "一汽大众",
+ *       "familyName": "宝来",
+ *       "vehicleClass": "轿车类",
+ *       "carStyle": "1",
+ *       "exhaustScale": 1598,
+ *       "power": "77",
+ *       "tonCount": null,
+ *       "seatCount": 5,
+ *       "carYear": "201212",
+ *       "purchasePrice": "117556",
+ *       "transmissiontType": "手动档",
+ *       "remark": "手动档 舒适型 国Ⅳ",
+ *       "completeKerbMass": 1265,
+ *       "carKind": null,
+ *       "purchasePriceNotTax": "108300",
+ *       "cimodelCode": "BYQKBMUC0021",
+ *       "cimodelName": "大众FV7162FAMGG 舒适型",
+ *       "cimodelCodeC": null,
+ *       "ciModelNameC": null,
+ *       "energyType": null,
+ *       "noticeType": "FV7162FAMGG",
+ *       "vehicleStyleUniqueId": "4986",
+ *       "dataType": null
+ *     },
+ *     {
+ *       "modelCode": "DZAAND0124",
+ *       "modelCName": "大众FV7162FAMGG轿车",
+ *       "carBrand": "一汽大众",
+ *       "familyName": "宝来",
+ *       "vehicleClass": "轿车类",
+ *       "carStyle": "1",
+ *       "exhaustScale": 1598,
+ *       "power": "77",
+ *       "tonCount": null,
+ *       "seatCount": 5,
+ *       "carYear": "201402",
+ *       "purchasePrice": "112129",
+ *       "transmissiontType": "手动档",
+ *       "remark": "手动档 舒适型 国Ⅳ",
+ *       "completeKerbMass": 1265,
+ *       "carKind": null,
+ *       "purchasePriceNotTax": "103300",
+ *       "cimodelCode": "BYQKBMUC0021",
+ *       "cimodelName": "大众FV7162FAMGG 舒适型",
+ *       "cimodelCodeC": null,
+ *       "ciModelNameC": null,
+ *       "energyType": null,
+ *       "noticeType": "FV7162FAMGG",
+ *       "vehicleStyleUniqueId": "4986",
+ *       "dataType": null
+ *     },
+ *     {
+ *       "modelCode": "DZAAND0126",
+ *       "modelCName": "大众FV7162FAMWG轿车",
+ *       "carBrand": "一汽大众",
+ *       "familyName": "宝来",
+ *       "vehicleClass": "轿车类",
+ *       "carStyle": "1",
+ *       "exhaustScale": 1598,
+ *       "power": "77",
+ *       "tonCount": null,
+ *       "seatCount": 5,
+ *       "carYear": "201402",
+ *       "purchasePrice": "112129",
+ *       "transmissiontType": "手动档",
+ *       "remark": "手动档 舒适型 京5国Ⅳ",
+ *       "completeKerbMass": 1265,
+ *       "carKind": null,
+ *       "purchasePriceNotTax": "103300",
+ *       "cimodelCode": "BYQKBMUC0021",
+ *       "cimodelName": null,
+ *       "cimodelCodeC": null,
+ *       "ciModelNameC": null,
+ *       "energyType": null,
+ *       "noticeType": "FV7162FAMGG",
+ *       "vehicleStyleUniqueId": "4986",
+ *       "dataType": null
+ *     }
+ *   ],
+ *   "pageable": {
+ *     "sort": {
+ *       "sorted": false,
+ *       "unsorted": true
+ *     },
+ *     "pageNumber": 0,
+ *     "pageSize": 5,
+ *     "offset": 0,
+ *     "paged": true,
+ *     "unpaged": false
+ *   },
+ *   "totalElements": 3,
+ *   "totalPages": 1,
+ *   "last": true,
+ *   "first": true,
+ *   "sort": {
+ *     "sorted": false,
+ *     "unsorted": true
+ *   },
+ *   "numberOfElements": 3,
+ *   "size": 5,
+ *   "number": 0
+ * }
+ **/
+@Data
+@NoArgsConstructor
+public class HbCrawlerQueryCarResponse extends HbBaseResponse {
+    @Serial
+    private static final long serialVersionUID = -8624231841629870165L;
+
+    private Integer totalElements;
+    private Integer totalPages;
+    private Boolean last;
+    private Boolean first;
+    private Integer numberOfElements;
+    private Integer size;
+    private Integer number;
+
+    private List<ContentDTO> content;
+
+    @Data
+    public static class ContentDTO implements Serializable, CarModelsFilter {
+        @Serial
+        private static final long serialVersionUID = 2286931992313421081L;
+
+        private String modelCode;
+        private String modelCName;
+        private String carBrand;
+        private String familyName;
+        private String vehicleClass;
+        private String carStyle;
+        private Double exhaustScale;
+        private String power;
+        private String seatCount;
+        private String carYear;
+        private String purchasePrice;
+        private String transmissiontType;
+        private String remark;
+        private Double completeKerbMass;
+        private String carKind;
+        private String purchasePriceNotTax;
+        private String cimodelCode;
+        private String cimodelName;
+        private String cimodelCodeC;
+        private String ciModelNameC;
+        private String energyType;
+        private String noticeType;
+        private String vehicleStyleUniqueId;
+        private String dataType;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class PageableDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -902590371801773192L;
+
+        private SortDTO sort;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class SortDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -7503703259474809394L;
+
+        private Boolean sorted;
+        private Boolean unsorted;
+    }
+}

+ 23 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/entity/response/HbCrawlerSaleInfoResponse.java

@@ -0,0 +1,23 @@
+package com.jzg.quote.hengbang.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 恒邦财险 归属信息 返回参数
+ * @author: shenwd
+ * @date: 2025/4/8 11:20
+ **/
+@Data
+public class HbCrawlerSaleInfoResponse extends HbBaseResponse{
+    @Serial
+    private static final long serialVersionUID = 838664002844998460L;
+
+    @JsonProperty("hb_enc_v")
+    private String hbEncV;
+
+    @JsonProperty("hb_enc_d")
+    private String hbEncD;
+}

+ 21 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/properties/HengBangCrawlerProperties.java

@@ -0,0 +1,21 @@
+package com.jzg.quote.hengbang.crawler.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 恒邦财险
+ * @author: shenwd
+ * @date: 2025/4/7 11:34
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "hengbang.crawler")
+public class HengBangCrawlerProperties {
+    /**
+     * 恒邦财险车险系统url
+     * https://car.hbins.com.cn
+     */
+    private String baseUrl;
+}

+ 11 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/service/HengBangCrawlerRequest.java

@@ -0,0 +1,11 @@
+package com.jzg.quote.hengbang.crawler.service;
+
+import com.jzg.quotation.commons.service.QuotationCrawlerBaseService;
+
+/**
+ * @description: 恒邦财险 爬虫请求
+ * @author: shenwd
+ * @date: 2025/4/7 11:13
+ **/
+public interface HengBangCrawlerRequest extends QuotationCrawlerBaseService {
+}

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

@@ -0,0 +1,147 @@
+package com.jzg.quote.hengbang.crawler.service.Impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.constant.InsuranceCode;
+import com.jzg.quotation.commons.entity.vo.aggregated.*;
+import com.jzg.quotation.commons.entity.vo.base.LoginBase;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quote.hengbang.crawler.build.HbCrawlerQuoteResultVoBuild;
+import com.jzg.quote.hengbang.crawler.component.HengBangCrawlerRequestComponent;
+import com.jzg.quote.hengbang.crawler.constant.RequestConstant;
+import com.jzg.quote.hengbang.crawler.entity.HengBangCrawlerConfigureParameters;
+import com.jzg.quote.hengbang.crawler.entity.dto.HbEncDTO;
+import com.jzg.quote.hengbang.crawler.entity.request.*;
+import com.jzg.quote.hengbang.crawler.entity.response.HbCrawlerProposalResponse;
+import com.jzg.quote.hengbang.crawler.entity.response.HbCrawlerQueryCarResponse;
+import com.jzg.quote.hengbang.crawler.service.HengBangCrawlerRequest;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description: 恒邦财险 爬虫请求
+ * @author: shenwd
+ * @date: 2025/4/7 11:10
+ **/
+@Service(value = InsuranceCode.INSURANCE_HBIC)
+@RequiredArgsConstructor
+public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
+
+    private final HengBangCrawlerRequestComponent hbCrawlerRequestComponent;
+    /**
+     * 登录
+     * @param loginBase 登录信息
+     */
+    @Override
+    public void login(LoginBase loginBase) {
+        hbCrawlerRequestComponent.authenticate(loginBase.getUsername(), loginBase.getPassword(), RequestConstant.REQUEST_NUMBER);
+    }
+
+    /**
+     * 报价
+     *
+     * @param quoteVo 报价实体
+     * @return 报价信息
+     */
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        // 1.0获取token的请求头
+        AttributionInformationVo attributionInformationVo = quoteVo
+                .getOrder()
+                .getAttributionInformationVo();
+        HttpHeaders headers = hbCrawlerRequestComponent.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        //获取配置信息
+        HengBangCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HengBangCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        //获取车型
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+        HbCrawlerQueryCarRequest hbCrawlerQueryCarRequest = new HbCrawlerQueryCarRequest(carInfoVo.getBrandName(), carInfoVo.getVinNo(), parameters.getVehicleStyleUniqueId());
+        List<HbCrawlerQueryCarResponse.ContentDTO> contentDTOS = hbCrawlerRequestComponent.queryCar(hbCrawlerQueryCarRequest, headers);
+        //过滤车型
+        HbCrawlerQueryCarResponse.ContentDTO contentDTO = CarModelsFilterUtils.to(contentDTOS, carInfoVo);
+        //查询归属信息
+        String phoneNumber = hbCrawlerRequestComponent.getPhoneNumber(attributionInformationVo.getUsername());
+        HbCrawlerSaleInfoRequest saleInfoRequest = new HbCrawlerSaleInfoRequest(phoneNumber);
+        HbEncDTO salesInfo;
+        try {
+            salesInfo = hbCrawlerRequestComponent.getSalesInfo(saleInfoRequest, headers);
+        } catch (Exception e) {
+            throw new SystemException(e.getMessage());
+        }
+        //获取折旧价
+        RiskInfoVo biRiskInfoVo = quoteVo.getBiRiskInfoVo();
+        HbCrawlerDepreciationRequest depreciationRequest = new HbCrawlerDepreciationRequest(carInfoVo, biRiskInfoVo.getStartDate(), biRiskInfoVo.getRiskCode());
+        String depreciationPrice = hbCrawlerRequestComponent.getDepreciationPrice(depreciationRequest, headers);
+
+        //报价第一步,提交基础数据,返回投保单号
+        HbCrawlerQuoteimmediatelyRequest quoteimmediatelyRequest = new HbCrawlerQuoteimmediatelyRequest(quoteVo, salesInfo, depreciationPrice, parameters);
+        String plyappno = hbCrawlerRequestComponent.quoteImmediately(quoteimmediatelyRequest, headers);
+        //报价第二步,提交报价数据,返回是否重复投保,脱保等提示信息
+        HbCrawlerCalculationRequest calculationRequest = new HbCrawlerCalculationRequest(quoteVo, plyappno);
+        Map<String, Object> calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
+        //报价第三步,获取报价数据
+        HbCrawlerProposalResponse proposalResponse = hbCrawlerRequestComponent.proposal(plyappno, headers);
+
+
+        return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse);
+    }
+
+    /**
+     * 提交核保 子订单
+     *
+     * @param underwritingVo
+     */
+    @Override
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) throws JsonProcessingException {
+        return null;
+    }
+
+    /**
+     * 获取支付链接
+     *
+     * @param paymentLinkVo
+     */
+    @Override
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
+        return null;
+    }
+
+    /**
+     * 上传影像
+     *
+     * @param insuranceUploadImageVo
+     */
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    /**
+     * 下载保单
+     *
+     * @param orderBase
+     */
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+
+    }
+
+    /**
+     * 查询订单状态
+     *
+     * @param orderStatusVo
+     */
+    @Override
+    public void queryOrderState(OrderStatusVo orderStatusVo) {
+
+    }
+}

File diff suppressed because it is too large
+ 47 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quote/hengbang/crawler/utils/HengBangAESUtil.java


+ 5 - 4
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -182,7 +182,7 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         ZmCrawlerOrder crawlerOrder = zmCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
         ZmCrawlerOrder crawlerOrder = zmCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
         //打开影像系统
         //打开影像系统
         zmCrawlerRequestComponent.startUploadImage(userCode.substring(0,2), authorization, crawlerOrder.getBussinessNo());
         zmCrawlerRequestComponent.startUploadImage(userCode.substring(0,2), authorization, crawlerOrder.getBussinessNo());
-        //生成影像批次号
+        //生成影像批次号,如果存在多次上传该字段需保存
         String batchId = MD5.create().digestHex(ZmCrawlerImageConstant.ZM_IMAGE_BATCHID_PRE + crawlerOrder.getBussinessNo());
         String batchId = MD5.create().digestHex(ZmCrawlerImageConstant.ZM_IMAGE_BATCHID_PRE + crawlerOrder.getBussinessNo());
 
 
         //导入影像
         //导入影像
@@ -204,7 +204,7 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
                         imageResList = maps;
                         imageResList = maps;
                     }
                     }
                     for (int i = 0; i < result.keySet().size()-1; i++) {
                     for (int i = 0; i < result.keySet().size()-1; i++) {
-                        imageResList.add((Map<String, String>)result.get(i));
+                        imageResList.add((Map<String, String>)result.get(String.valueOf(i)));
                     }
                     }
                     docCodeAndImage.put(imageImportRequest.getDocCode(), imageResList);
                     docCodeAndImage.put(imageImportRequest.getDocCode(), imageResList);
                 }
                 }
@@ -239,10 +239,11 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
     /**
     /**
      * 查询订单状态
      * 查询订单状态
      *
      *
-     * @param orderBase
+     * @param orderStatusVo
      */
      */
     @Override
     @Override
-    public void queryOrderState(OrderBase orderBase) {
+    public void queryOrderState(OrderStatusVo orderStatusVo) {
+        OrderBase orderBase = orderStatusVo.getOrder();
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
         String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
         String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
         //获取配置信息
         //获取配置信息

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