Sfoglia il codice sorgente

开发获取支付链接的接口

jinshihui 11 mesi fa
parent
commit
9ea6cd869f
15 ha cambiato i file con 2518 aggiunte e 62 eliminazioni
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersQrcode.java
  2. 124 14
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java
  3. 34 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/CertifyType.java
  4. 3 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/po/BoHaiCrawlerOrder.java
  5. 20 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerPaymentEncryptionRequest.java
  6. 143 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerPaymentNoticeNoGenerationRequest.java
  7. 495 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerPaymentCertiNoQueryResponse.java
  8. 881 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerPaymentNoticeNoGenerationResponse.java
  9. 6 12
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerQrcodeResponse.java
  10. 22 11
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java
  11. 441 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/Base64ImageExtractor.java
  12. 301 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/QRCodeParser.java
  13. 19 0
      tenant/insurance/quotation-commons/pom.xml
  14. 15 21
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  15. 11 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersQrcode.java

@@ -25,6 +25,9 @@ public class InsOrdersQrcode implements Serializable {
     @Schema(description = "订单号")
     private String orderno;
 
+    /**
+     * 二维码状态 1 开启 0 关闭
+     */
     @Schema(description = "二维码状态 1 开启 0 关闭")
     private Integer qrcodeStatus;
 

+ 124 - 14
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerRequestComponent.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson2.JSON;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.zxing.NotFoundException;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
@@ -20,9 +21,7 @@ import com.jzg.quotation.bohai.crawler.entity.request.*;
 import com.jzg.quotation.bohai.crawler.entity.request.quote.CarModelDataDTO;
 import com.jzg.quotation.bohai.crawler.entity.response.*;
 import com.jzg.quotation.bohai.crawler.properties.BoHaiCrawlerProperties;
-import com.jzg.quotation.bohai.crawler.util.BatchNumberGenerator;
-import com.jzg.quotation.bohai.crawler.util.DESEncryption;
-import com.jzg.quotation.bohai.crawler.util.DESUtil;
+import com.jzg.quotation.bohai.crawler.util.*;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
@@ -31,6 +30,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.core.io.ByteArrayResource;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
@@ -38,6 +38,7 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.*;
 
 /**
@@ -50,7 +51,7 @@ import java.util.*;
 @RequiredArgsConstructor
 public class BoHaiCrawlerRequestComponent {
 
-    private static final String TOKEN = "114050281-e867bc9aab4951bdc2803f54c81892e8";
+    private static final String TOKEN = "114050281-9605ec6831302f4d5e37ea64b3c15370";
 
     // 循环次数
     public static final int CIRCULATE_NUMBER = 3;
@@ -183,12 +184,25 @@ public class BoHaiCrawlerRequestComponent {
     public <BoHaiResponse> BoHaiResponse executeRequest(RequestType requestType, Object urlOrStandard, Object request, Class<BoHaiResponse> responseClass, HttpHeaders headers) {
         try {
             switch (requestType) {
+                // 请求参数加密
                 case ENCRYPTED:
+                    String jsonString = JSON.toJSONString(request);
+                    log.info("请求参数:{}", jsonString);
                     // 请求参数加密
+                    // 参数加密
+                    String encrypt = DESUtil.des_encrypt(jsonString);
+                    log.info("请求参数加密:{}", encrypt);
+                    //生成md5值
+                    String md5Value = DESUtil.md5(encrypt + "c2lub3NvZnQuY2hhbm5lbC55ZHBpYw==");
+                    log.info("请求参数md5的值:{}", md5Value);
+                    BoHaiCrawlerPaymentEncryptionRequest boHaiCrawlerPaymentEncryptionRequest = new BoHaiCrawlerPaymentEncryptionRequest();
+                    boHaiCrawlerPaymentEncryptionRequest.setEncryptionData(encrypt);
+                    boHaiCrawlerPaymentEncryptionRequest.setMd5(md5Value);
+
                     CrawlerRequestUrlStandard standard = (CrawlerRequestUrlStandard) urlOrStandard;
                     ResponseEntity<String> encryptedResponse = requestComponent.objectPost2(
                             standard.getRequestUrl(boHaiCrawlerProperties.getBaseUrl2()),
-                            request,
+                            boHaiCrawlerPaymentEncryptionRequest,
                             String.class,
                             headers
                     );
@@ -200,9 +214,8 @@ public class BoHaiCrawlerRequestComponent {
                     String decrypt = DESUtil.des_decrypt(responseString);
                     log.info("请求返回参数解密:{}", decrypt);
                     return JSON.parseObject(decrypt, responseClass);
-
+                // 请求参数不加密
                 case UNENCRYPTED:
-                    // 请求参数不加密
                     CrawlerRequestUrlStandard unencryptedStandard = (CrawlerRequestUrlStandard) urlOrStandard;
                     ResponseEntity<BoHaiResponse> unencryptedResponse = requestComponent.objectPost(
                             unencryptedStandard.getRequestUrl(boHaiCrawlerProperties.getBaseUrl2()),
@@ -210,13 +223,14 @@ public class BoHaiCrawlerRequestComponent {
                             responseClass,
                             headers
                     );
-
                     AssertionUtils.isEmpty(unencryptedResponse, "请求异常请重试");
                     BoHaiResponse body = unencryptedResponse.getBody();
+                    if(body instanceof String){
+                        return body;
+                    }
                     return JSON.parseObject(JSON.toJSONString(body), responseClass);
-
+                // 文件上传
                 case FILE_UPLOAD:
-                    // 文件上传
                     String url = (String) urlOrStandard;
                     ResponseEntity<String> uploadResponse = requestComponent.objectPostForUpload(
                             url,
@@ -570,10 +584,106 @@ public class BoHaiCrawlerRequestComponent {
      * 获取支付链接
      *
      * @param boHaiCrawlerPaymentCertiNoQueryRequest
-     * @param headers                                请求头
-     * @return
+     * @param headers
+     * @return BoHaiCrawlerQrcodeResponse
      */
-    public BoHaiCrawlerQrcodeResponse payment(BoHaiCrawlerPaymentCertiNoQueryRequest boHaiCrawlerPaymentCertiNoQueryRequest, HttpHeaders headers) {
-        return executeRequest(RequestType.ENCRYPTED, RequestUrl.PAYMENTCERTINOQUERY, boHaiCrawlerPaymentCertiNoQueryRequest, BoHaiCrawlerQrcodeResponse.class, headers);
+    public BoHaiCrawlerQrcodeResponse payment(BoHaiCrawlerPaymentCertiNoQueryRequest boHaiCrawlerPaymentCertiNoQueryRequest, HttpHeaders headers) throws NotFoundException, IOException {
+        //1、调用支付凭证号查询(交强险、商业险保单号查询)接口
+        BoHaiCrawlerPaymentCertiNoQueryResponse boHaiCrawlerPaymentCertiNoQueryResponse = executeRequest(RequestType.ENCRYPTED, RequestUrl.PAYMENTCERTINOQUERY, boHaiCrawlerPaymentCertiNoQueryRequest, BoHaiCrawlerPaymentCertiNoQueryResponse.class, headers);
+        log.info("支付凭证号查询响应对象的值:{}", JSON.toJSONString(boHaiCrawlerPaymentCertiNoQueryResponse));
+        if("0".equals(boHaiCrawlerPaymentCertiNoQueryResponse.getHead().getReturnCode())){
+            /*if(CollectionUtils.isEmpty(boHaiCrawlerPaymentCertiNoQueryResponse.getBusinessInfoList())){
+                log.error("支付凭证号查询失败,返回数据为空");
+                throw new SystemException("支付凭证号查询失败,返回数据为空");
+            }*/
+            //2、调用支付通知单号生成接口
+            BoHaiCrawlerPaymentNoticeNoGenerationRequest boHaiCrawlerPaymentNoticeNoGenerationRequest = buildPaymentNoticeNoGenerationRequest();
+            BoHaiCrawlerPaymentNoticeNoGenerationResponse boHaiCrawlerPaymentNoticeNoGenerationResponse = executeRequest(RequestType.ENCRYPTED, RequestUrl.PAYMENTNOTICENO_GENERATION, boHaiCrawlerPaymentNoticeNoGenerationRequest, BoHaiCrawlerPaymentNoticeNoGenerationResponse.class, headers);
+            log.info("支付通知单号生成响应对象的值:{}", JSON.toJSONString(boHaiCrawlerPaymentNoticeNoGenerationResponse));
+            if(!"0".equals(boHaiCrawlerPaymentNoticeNoGenerationResponse.getHead().getReturnCode())){
+                //获取缴费流水号
+                //String poaCode = boHaiCrawlerPaymentNoticeNoGenerationResponse.getPoaInfoVo().getPoaCode();
+                String poaCode = "1140725000025669";
+                log.info("缴费流水号:{}", poaCode);
+
+                //3、调用生成支付链接接口
+                // 构建请求参数
+                MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+                params.add("orderNo", AESCryptoUtil.encrypt(poaCode));
+                params.add("provider", AESCryptoUtil.encrypt("baorongpay"));
+                params.add("deptCode", AESCryptoUtil.encrypt("*"));
+                params.add("systemId", AESCryptoUtil.encrypt("8a81c8ad61c6c85a0161db65adbf00ed"));
+                params.add("configId", AESCryptoUtil.encrypt("8a81c8ad72019f24017202c6402c01ca"));
+                params.add("paytype", AESCryptoUtil.encrypt(""));
+
+                headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
+                String responseHtml = executeRequest(RequestType.UNENCRYPTED, RequestUrl.QRCODE, params, String.class, headers);
+                // 提取base64图片
+                List<String> base64Images = Base64ImageExtractor.extractBase64ImagesWithPrefix(responseHtml);
+                if(CollectionUtils.isEmpty(base64Images)){
+                    log.error("生成支付链接失败,未提取到base64图片");
+                    throw new SystemException("生成支付链接失败,未提取到base64图片");
+                }
+                String base64ImagesString = base64Images.get(0);
+                // 解析二维码
+                String qrContent = QRCodeParser.parseQRCodeFromBase64(base64ImagesString);
+                log.info("解析到的二维码内容:{}", qrContent);
+                BoHaiCrawlerQrcodeResponse boHaiCrawlerQrcodeResponse = new BoHaiCrawlerQrcodeResponse();
+                boHaiCrawlerQrcodeResponse.setUrl(qrContent);
+                return boHaiCrawlerQrcodeResponse;
+            }else{
+                log.error("支付通知单号生成失败,错误信息:{}", boHaiCrawlerPaymentNoticeNoGenerationResponse.getHead().getReturnMessage());
+                throw new SystemException("支付通知单号生成失败,错误信息:" + boHaiCrawlerPaymentNoticeNoGenerationResponse.getHead().getReturnMessage());
+            }
+        }else{
+            log.error("调用支付凭证号接口查询失败");
+            throw new SystemException("调用支付凭证号接口查询失败");
+        }
+    }
+
+    /**
+     * 构建支付通知单号生成请求对象
+     *
+     * @return BoHaiCrawlerPaymentNoticeNoGenerationRequest
+     */
+    private BoHaiCrawlerPaymentNoticeNoGenerationRequest buildPaymentNoticeNoGenerationRequest() {
+        BoHaiCrawlerPaymentNoticeNoGenerationRequest boHaiCrawlerPaymentNoticeNoGenerationRequest = new BoHaiCrawlerPaymentNoticeNoGenerationRequest();
+
+        // 设置请求头信息
+        BoHaiCrawlerPaymentNoticeNoGenerationRequest.HeadDTO head = new BoHaiCrawlerPaymentNoticeNoGenerationRequest.HeadDTO();
+        head.setTransCode("PaymentNoticeNoGeneration");
+        head.setTransType("Req");
+        head.setToken(TOKEN);
+        boHaiCrawlerPaymentNoticeNoGenerationRequest.setHead(head);
+
+        // 设置授权结果
+        boHaiCrawlerPaymentNoticeNoGenerationRequest.setAuthResult("");
+
+        // 设置POA授权信息
+        BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaInfoVoDTO poaInfoVo = new BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaInfoVoDTO();
+        poaInfoVo.setPosModelCode("WLS");
+        poaInfoVo.setCurrency("CNY");
+        poaInfoVo.setOperatorCode("114050281");
+        poaInfoVo.setPoaType("10");
+        poaInfoVo.setCenterCode("14");
+        poaInfoVo.setIsRapay("0");
+        boHaiCrawlerPaymentNoticeNoGenerationRequest.setPoaInfoVo(poaInfoVo);
+
+        // 设置授权计划列表(待支付的凭证)
+        List<BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaPlanDTO> poaPlanList = new ArrayList<>();
+
+        // 交强险凭证
+        BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaPlanDTO jqPlan = new BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaPlanDTO();
+        jqPlan.setCertiNo("5140703302025040234");
+        jqPlan.setCertiId("T14072510000004050");
+        poaPlanList.add(jqPlan);
+
+        // 商业险凭证
+        BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaPlanDTO syPlan = new BoHaiCrawlerPaymentNoticeNoGenerationRequest.PoaPlanDTO();
+        syPlan.setCertiNo("5140703802025010909");
+        syPlan.setCertiId("T14072510000004051");
+        poaPlanList.add(syPlan);
+        boHaiCrawlerPaymentNoticeNoGenerationRequest.setPoaPlanList(poaPlanList);
+        return boHaiCrawlerPaymentNoticeNoGenerationRequest;
     }
 }

+ 34 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/CertifyType.java

@@ -0,0 +1,34 @@
+package com.jzg.quotation.bohai.crawler.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 凭证类型代码
+ * @author: generated
+ * @date: 2025/10/22
+ **/
+@Getter
+@AllArgsConstructor
+public enum CertifyType {
+
+    /**
+     * 临时凭证
+     */
+    TEMPORARY("T", "临时凭证"),
+
+    /**
+     * 正式凭证
+     */
+    FORMAL("P", "正式凭证");
+
+    /**
+     * 凭证类型代码
+     */
+    private final String code;
+
+    /**
+     * 凭证类型描述
+     */
+    private final String desc;
+}

+ 3 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/po/BoHaiCrawlerOrder.java

@@ -24,6 +24,9 @@ public class BoHaiCrawlerOrder {
 
     private String ordersNo;
 
+    /**
+     * 渤海财险订单号(这个是保司返回的订单号)
+     */
     private String orderNo;
 
     private String busUniqueId;

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

@@ -0,0 +1,20 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import lombok.Data;
+
+/**
+ * 渤海保险获取支付链接加密请求实体
+ */
+@Data
+public class BoHaiCrawlerPaymentEncryptionRequest {
+
+    /**
+     * 加密数据
+     */
+    private String encryptionData;
+
+    /**
+     * MD5值
+     */
+    private String md5;
+}

+ 143 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerPaymentNoticeNoGenerationRequest.java

@@ -0,0 +1,143 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 渤海财险爬虫支付通知单号生成请求
+ * @author:
+ * @date:
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerPaymentNoticeNoGenerationRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -7074383106771349268L;
+
+    /**
+     * 请求头信息
+     */
+    @JsonProperty("head")
+    @JSONField(ordinal = 1)
+    private HeadDTO head;
+
+    /**
+     * 授权结果:空=无需授权,或授权已通过
+     */
+    @JsonProperty("authResult")
+    @JSONField(ordinal = 2)
+    private String authResult;
+
+    /**
+     * POA授权信息(Power of Attorney授权书/委托书)
+     */
+    @JsonProperty("poaInfoVo")
+    @JSONField(ordinal = 3)
+    private PoaInfoVoDTO poaInfoVo;
+
+    /**
+     * 授权计划列表(待支付的凭证)
+     */
+    @JsonProperty("poaPlanList")
+    @JSONField(ordinal = 4)
+    private List<PoaPlanDTO> poaPlanList;
+
+    @NoArgsConstructor
+    @Data
+    public static class HeadDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444308L;
+
+        /**
+         * 交易代码:支付通知单号生成
+         */
+        @JsonProperty("transCode")
+        private String transCode;
+
+        /**
+         * 交易类型
+         */
+        @JsonProperty("transType")
+        private String transType;
+
+        /**
+         * 令牌
+         */
+        @JsonProperty("token")
+        private String token;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PoaInfoVoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444309L;
+
+        /**
+         * POS机型号代码:WLS=无纸化系统/网络销售
+         */
+        @JsonProperty("posModelCode")
+        private String posModelCode;
+
+        /**
+         * 货币
+         */
+        @JsonProperty("currency")
+        private String currency;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        /**
+         * 授权类型:10=普通授权,20=特殊授权,30=紧急授权
+         */
+        @JsonProperty("poaType")
+        private String poaType;
+
+        /**
+         * 中心机构代码(省级/分公司代码,14=山西)
+         */
+        @JsonProperty("centerCode")
+        private String centerCode;
+
+        /**
+         * 是否快速支付:0=否(普通支付),1=是(快捷支付/自动扣款)
+         */
+        @JsonProperty("isRapay")
+        private String isRapay;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PoaPlanDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444310L;
+
+        /**
+         * 凭证号
+         */
+        @JsonProperty("certiNo")
+        @JSONField(ordinal = 1)
+        private String certiNo;
+
+        /**
+         * 凭证ID(系统内部唯一标识)
+         */
+        @JsonProperty("certiId")
+        @JSONField(ordinal = 2)
+        private String certiId;
+    }
+}

+ 495 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerPaymentCertiNoQueryResponse.java

@@ -0,0 +1,495 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 渤海财险爬虫支付凭证号查询响应
+ * @author:
+ * @date:
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerPaymentCertiNoQueryResponse {
+
+    @Serial
+    private static final long serialVersionUID = -7074383106771349266L;
+
+    /**
+     * 业务信息列表
+     */
+    @JsonProperty("businessInfoList")
+    private List<BusinessInfoDTO> businessInfoList;
+
+    /**
+     * 页码
+     */
+    @JsonProperty("pageNo")
+    private String pageNo;
+
+    /**
+     * 总行数
+     */
+    @JsonProperty("totalRow")
+    private String totalRow;
+
+    /**
+     * 响应头信息
+     */
+    @JsonProperty("head")
+    private HeadDTO head;
+
+    @NoArgsConstructor
+    @Data
+    public static class HeadDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444306L;
+
+        /**
+         * 返回码
+         */
+        @JsonProperty("returnCode")
+        private String returnCode;
+
+        /**
+         * 返回消息
+         */
+        @JsonProperty("returnMessage")
+        private String returnMessage;
+
+        /**
+         * 会话ID
+         */
+        @JsonProperty("sessionId")
+        private String sessionId;
+
+        /**
+         * 令牌
+         */
+        @JsonProperty("token")
+        private String token;
+
+        /**
+         * 交易代码
+         */
+        @JsonProperty("transCode")
+        private String transCode;
+
+        /**
+         * 交易类型
+         */
+        @JsonProperty("transType")
+        private String transType;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class BusinessInfoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444307L;
+
+        /**
+         * 代理人代码
+         */
+        @JsonProperty("agentCode")
+        private String agentCode;
+
+        /**
+         * 代理人名称
+         */
+        @JsonProperty("agentName")
+        private String agentName;
+
+        /**
+         * 协议号
+         */
+        @JsonProperty("agreementNo")
+        private String agreementNo;
+
+        /**
+         * 投保人代码
+         */
+        @JsonProperty("appliCode")
+        private String appliCode;
+
+        /**
+         * 投保人姓名
+         */
+        @JsonProperty("appliName")
+        private String appliName;
+
+        /**
+         * 投保人证件号码
+         */
+        @JsonProperty("appliNumber")
+        private String appliNumber;
+
+        /**
+         * 投保人联系电话
+         */
+        @JsonProperty("appliPhoneNo")
+        private String iPhoneNo;
+
+        /**
+         * 属性1
+         */
+        @JsonProperty("attribute1")
+        private String attribute1;
+
+        /**
+         * 属性2
+         */
+        @JsonProperty("attribute2")
+        private String attribute2;
+
+        /**
+         * 属性3
+         */
+        @JsonProperty("attribute3")
+        private String attribute3;
+
+        /**
+         * 属性4
+         */
+        @JsonProperty("attribute4")
+        private String attribute4;
+
+        /**
+         * 属性5
+         */
+        @JsonProperty("attribute5")
+        private String attribute5;
+
+        /**
+         * 属性6
+         */
+        @JsonProperty("attribute6")
+        private String attribute6;
+
+        /**
+         * 品牌名称
+         */
+        @JsonProperty("brandName")
+        private String brandName;
+
+        /**
+         * 营业执照类型
+         */
+        @JsonProperty("businessLicenseType")
+        private String businessLicenseType;
+
+        /**
+         * 车主
+         */
+        @JsonProperty("carOwner")
+        private String carOwner;
+
+        /**
+         * 中心代码
+         */
+        @JsonProperty("centerCode")
+        private String centerCode;
+
+        /**
+         * 凭证ID
+         */
+        @JsonProperty("certiId")
+        private String certiId;
+
+        /**
+         * 凭证号码
+         */
+        @JsonProperty("certiNo")
+        private String certiNo;
+
+        /**
+         * 凭证状态:0=有效,1=失效,2=已使用
+         */
+        @JsonProperty("certiStatus")
+        private String certiStatus;
+
+        /**
+         * 凭证类型:T=临时凭证,P=正式凭证
+         */
+        @JsonProperty("certiType")
+        private String certiType;
+
+        /**
+         * 险类代码:01=寿险,02=健康险,03=车险,04=意外险
+         */
+        @JsonProperty("classCode")
+        private String classCode;
+
+        /**
+         * 共保标识
+         */
+        @JsonProperty("coinsFlag")
+        private String coinsFlag;
+
+        /**
+         * 公司代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 公司名称
+         */
+        @JsonProperty("comName")
+        private String comName;
+
+        /**
+         * 合同号
+         */
+        @JsonProperty("contractNo")
+        private String contractNo;
+
+        /**
+         * 车船税计划费用
+         */
+        @JsonProperty("csTaxPlanFee")
+        private String csTaxPlanFee;
+
+        /**
+         * 货币1
+         */
+        @JsonProperty("currency1")
+        private String currency1;
+
+        /**
+         * 货币2
+         */
+        @JsonProperty("currency2")
+        private String currency2;
+
+        /**
+         * 需求时间
+         */
+        @JsonProperty("demandTime")
+        private String demandTime;
+
+        /**
+         * 结束日期
+         */
+        @JsonProperty("endDate")
+        private String endDate;
+
+        /**
+         * 结束小时
+         */
+        @JsonProperty("endHour")
+        private String endHour;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        private String engineNo;
+
+        /**
+         * 汇率
+         */
+        @JsonProperty("exchangeRate")
+        private String exchangeRate;
+
+        /**
+         * 车架号
+         */
+        @JsonProperty("frameNo")
+        private String frameNo;
+
+        /**
+         * 处理人1代码
+         */
+        @JsonProperty("handler1Code")
+        private String handler1Code;
+
+        /**
+         * 处理人1姓名
+         */
+        @JsonProperty("handler1Name")
+        private String handler1Name;
+
+        /**
+         * 处理人代码
+         */
+        @JsonProperty("handlerCode")
+        private String handlerCode;
+
+        /**
+         * 立即生效标识
+         */
+        @JsonProperty("immediatelyActiveFlag")
+        private String immediatelyActiveFlag;
+
+        /**
+         * 被保险人代码
+         */
+        @JsonProperty("insuredCode")
+        private String insuredCode;
+
+        /**
+         * 被保险人姓名
+         */
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        /**
+         * 是否交通事故
+         */
+        @JsonProperty("isTraAcci")
+        private String isTraAcci;
+
+        /**
+         * 项目状态
+         */
+        @JsonProperty("itemStatus")
+        private String itemStatus;
+
+        /**
+         * 最后付款日期
+         */
+        @JsonProperty("lastPayDate")
+        private String lastPayDate;
+
+        /**
+         * 车牌号
+         */
+        @JsonProperty("licenseNo")
+        private String licenseNo;
+
+        /**
+         * 出单公司
+         */
+        @JsonProperty("makeCom")
+        private String makeCom;
+
+        /**
+         * 操作日期
+         */
+        @JsonProperty("operateDate")
+        private String operateDate;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        /**
+         * 付款次数
+         */
+        @JsonProperty("payNo")
+        private String payNo;
+
+        /**
+         * 付款理由
+         */
+        @JsonProperty("payrefReason")
+        private String payrefReason;
+
+        /**
+         * 一次性标识
+         */
+        @JsonProperty("pefFlag")
+        private String pefFlag;
+
+        /**
+         * 计划日期
+         */
+        @JsonProperty("planDate")
+        private String planDate;
+
+        /**
+         * 计划费用
+         */
+        @JsonProperty("planFee")
+        private String planFee;
+
+        /**
+         * 计划序号
+         */
+        @JsonProperty("planSerialNo")
+        private String planSerialNo;
+
+        /**
+         * 代理人代码
+         */
+        @JsonProperty("poaCode")
+        private String poaCode;
+
+        /**
+         * 代理人类型
+         */
+        @JsonProperty("poaType")
+        private String poaType;
+
+        /**
+         * 保单号
+         */
+        @JsonProperty("policyNo")
+        private String policyNo;
+
+        /**
+         * 预付款费用
+         */
+        @JsonProperty("prePayrefFee")
+        private String prePayrefFee;
+
+        /**
+         * 保费计划费用
+         */
+        @JsonProperty("premiumPlanFee")
+        private String premiumPlanFee;
+
+        /**
+         * 查询过去日期
+         */
+        @JsonProperty("queryPastDate")
+        private String queryPastDate;
+
+        /**
+         * 险种代码
+         */
+        @JsonProperty("riskCode")
+        private String riskCode;
+
+        /**
+         * 开始日期
+         */
+        @JsonProperty("startDate")
+        private String startDate;
+
+        /**
+         * 开始小时
+         */
+        @JsonProperty("startHour")
+        private String startHour;
+
+        /**
+         * 任务ID
+         */
+        @JsonProperty("taskId")
+        private String taskId;
+
+        /**
+         * 承保日期
+         */
+        @JsonProperty("underWriteDate")
+        private String underWriteDate;
+
+        /**
+         * 生效日期
+         */
+        @JsonProperty("validDate")
+        private String validDate;
+    }
+}

+ 881 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerPaymentNoticeNoGenerationResponse.java

@@ -0,0 +1,881 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 渤海财险爬虫支付通知单号生成响应
+ * @author:
+ * @date:
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerPaymentNoticeNoGenerationResponse {
+
+    @Serial
+    private static final long serialVersionUID = -7074383106771349269L;
+
+    /**
+     * 业务性质
+     */
+    @JsonProperty("businessNature")
+    private String businessNature;
+
+    /**
+     * 卡产品标识
+     */
+    @JsonProperty("cardProductFlag")
+    private String cardProductFlag;
+
+    /**
+     * 公司代码
+     */
+    @JsonProperty("comCode")
+    private String comCode;
+
+    /**
+     * 请求头信息
+     */
+    @JsonProperty("head")
+    private HeadDTO head;
+
+    /**
+     * 最后付款时间
+     */
+    @JsonProperty("lastPayTime")
+    private String lastPayTime;
+
+    /**
+     * 是否逾期
+     */
+    @JsonProperty("overdue")
+    private String overdue;
+
+    /**
+     * POA授权信息(Power of Attorney授权书/委托书)
+     */
+    @JsonProperty("poaInfoVo")
+    private PoaInfoVoDTO poaInfoVo;
+
+    /**
+     * 授权计划列表
+     */
+    @JsonProperty("poaPlanList")
+    private List<PoaPlanDTO> poaPlanList;
+
+    /**
+     * 授权类型
+     */
+    @JsonProperty("poaType")
+    private String poaType;
+
+    /**
+     * 总保费
+     */
+    @JsonProperty("premiumTA")
+    private String premiumTA;
+
+    /**
+     * 互惠时间
+     */
+    @JsonProperty("reciprocalTime")
+    private String reciprocalTime;
+
+    /**
+     * 状态
+     */
+    @JsonProperty("state")
+    private String state;
+
+    /**
+     * 担保银行
+     */
+    @JsonProperty("warrantBank")
+    private String warrantBank;
+
+    /**
+     * 担保编号
+     */
+    @JsonProperty("warrantNo")
+    private String warrantNo;
+
+    @NoArgsConstructor
+    @Data
+    public static class HeadDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444311L;
+
+        /**
+         * 返回码
+         */
+        @JsonProperty("returnCode")
+        private String returnCode;
+
+        /**
+         * 返回消息
+         */
+        @JsonProperty("returnMessage")
+        private String returnMessage;
+
+        /**
+         * 会话ID
+         */
+        @JsonProperty("sessionId")
+        private String sessionId;
+
+        /**
+         * 令牌
+         */
+        @JsonProperty("token")
+        private String token;
+
+        /**
+         * 交易代码
+         */
+        @JsonProperty("transCode")
+        private String transCode;
+
+        /**
+         * 交易类型
+         */
+        @JsonProperty("transType")
+        private String transType;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PoaInfoVoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444312L;
+
+        /**
+         * 收款银行
+         */
+        @JsonProperty("accBank")
+        private String accBank;
+
+        /**
+         * 收款日期
+         */
+        @JsonProperty("accDate")
+        private String accDate;
+
+        /**
+         * 收款费用
+         */
+        @JsonProperty("accFee")
+        private String accFee;
+
+        /**
+         * 收款标识
+         */
+        @JsonProperty("accFlag")
+        private String accFlag;
+
+        /**
+         * 收款名称
+         */
+        @JsonProperty("accName")
+        private String accName;
+
+        /**
+         * 收款账号
+         */
+        @JsonProperty("accNo")
+        private String accNo;
+
+        /**
+         * 账户代码
+         */
+        @JsonProperty("accountCode")
+        private String accountCode;
+
+        /**
+         * 代理人代码
+         */
+        @JsonProperty("agentCode")
+        private String agentCode;
+
+        /**
+         * 代理人名称
+         */
+        @JsonProperty("agentName")
+        private String agentName;
+
+        /**
+         * 属性1
+         */
+        @JsonProperty("attribute1")
+        private String attribute1;
+
+        /**
+         * 属性2
+         */
+        @JsonProperty("attribute2")
+        private String attribute2;
+
+        /**
+         * 属性3
+         */
+        @JsonProperty("attribute3")
+        private String attribute3;
+
+        /**
+         * 属性4
+         */
+        @JsonProperty("attribute4")
+        private String attribute4;
+
+        /**
+         * 银行通知号
+         */
+        @JsonProperty("bankNoticeNo")
+        private String bankNoticeNo;
+
+        /**
+         * 账单接收日期
+         */
+        @JsonProperty("billAcceptDate")
+        private String billAcceptDate;
+
+        /**
+         * 账单金额
+         */
+        @JsonProperty("billAmount")
+        private String billAmount;
+
+        /**
+         * 账单号
+         */
+        @JsonProperty("billNo")
+        private String billNo;
+
+        /**
+         * 账单开立日期
+         */
+        @JsonProperty("billOpenDate")
+        private String billOpenDate;
+
+        /**
+         * 账单提供方
+         */
+        @JsonProperty("billProvider")
+        private String billProvider;
+
+        /**
+         * 中心代码
+         */
+        @JsonProperty("centerCode")
+        private String centerCode;
+
+        /**
+         * 凭证号
+         */
+        @JsonProperty("certiNo")
+        private String certiNo;
+
+        /**
+         * 检查日期
+         */
+        @JsonProperty("checkDate")
+        private String checkDate;
+
+        /**
+         * 核对标识
+         */
+        @JsonProperty("checkFlag")
+        private String checkFlag;
+
+        /**
+         * 公司代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 货币
+         */
+        @JsonProperty("currency")
+        private String currency;
+
+        /**
+         * 客户编号
+         */
+        @JsonProperty("customNo")
+        private String customNo;
+
+        /**
+         * 被保险人非自然人标识
+         */
+        @JsonProperty("insuredIsNotNature")
+        private String insuredIsNotNature;
+
+        /**
+         * 是否电子投保单
+         */
+        @JsonProperty("isElectronicProposal")
+        private String isElectronicProposal;
+
+        /**
+         * 是否快速支付
+         */
+        @JsonProperty("isRapay")
+        private String isRapay;
+
+        /**
+         * 是否实名标识
+         */
+        @JsonProperty("isRealFlag")
+        private String isRealFlag;
+
+        /**
+         * 是否交强险
+         */
+        @JsonProperty("isTraAcci")
+        private String isTraAcci;
+
+        /**
+         * 最后付款日期
+         */
+        @JsonProperty("lastPayDate")
+        private String lastPayDate;
+
+        /**
+         * 出单公司
+         */
+        @JsonProperty("makeCom")
+        private String makeCom;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        /**
+         * 支付中心代码
+         */
+        @JsonProperty("payCenterCode")
+        private String payCenterCode;
+
+        /**
+         * 缴费流水号
+         */
+        @JsonProperty("poaCode")
+        private String poaCode;
+
+        /**
+         * 授权类型
+         */
+        @JsonProperty("poaType")
+        private String poaType;
+
+        /**
+         * 授权用户
+         */
+        @JsonProperty("poaUser")
+        private String poaUser;
+
+        /**
+         * POS机型号代码
+         */
+        @JsonProperty("posModelCode")
+        private String posModelCode;
+
+        /**
+         * POS机号
+         */
+        @JsonProperty("posNo")
+        private String posNo;
+
+        /**
+         * 重新客户编号
+         */
+        @JsonProperty("recustomNo")
+        private String recustomNo;
+
+        /**
+         * 备注
+         */
+        @JsonProperty("remark")
+        private String remark;
+
+        /**
+         * 仓库编号
+         */
+        @JsonProperty("reposNo")
+        private String reposNo;
+
+        /**
+         * 返回附加代码
+         */
+        @JsonProperty("returnAppendCode")
+        private String returnAppendCode;
+
+        /**
+         * 返回代码
+         */
+        @JsonProperty("returnCode")
+        private String returnCode;
+
+        /**
+         * 发送短信手机号
+         */
+        @JsonProperty("sendMessagePhone")
+        private String sendMessagePhone;
+
+        /**
+         * 系统序列号
+         */
+        @JsonProperty("sysSerialNo")
+        private String sysSerialNo;
+
+        /**
+         * 交易序列号
+         */
+        @JsonProperty("transSerialNo")
+        private String transSerialNo;
+
+        /**
+         * 交易类型
+         */
+        @JsonProperty("transType")
+        private String transType;
+
+        /**
+         * 有效日期
+         */
+        @JsonProperty("validDate")
+        private String validDate;
+
+        /**
+         * 提取代码
+         */
+        @JsonProperty("withDrawCode")
+        private String withDrawCode;
+
+        /**
+         * 提取日期
+         */
+        @JsonProperty("withDrawDate")
+        private String withDrawDate;
+
+        /**
+         * 提取序列号
+         */
+        @JsonProperty("withDrawSerialNo")
+        private String withDrawSerialNo;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class PoaPlanDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444313L;
+
+        /**
+         * 代理人代码
+         */
+        @JsonProperty("agentCode")
+        private String agentCode;
+
+        /**
+         * 代理人名称
+         */
+        @JsonProperty("agentName")
+        private String agentName;
+
+        /**
+         * 协议号
+         */
+        @JsonProperty("agreementNo")
+        private String agreementNo;
+
+        /**
+         * 投保人代码
+         */
+        @JsonProperty("appliCode")
+        private String appliCode;
+
+        /**
+         * 投保人姓名
+         */
+        @JsonProperty("appliName")
+        private String appliName;
+
+        /**
+         * 投保人证件号码
+         */
+        @JsonProperty("appliNumber")
+        private String appliNumber;
+
+        /**
+         * 投保人联系电话
+         */
+        @JsonProperty("appliPhoneNo")
+        private String appliPhoneNo;
+
+        /**
+         * 属性1
+         */
+        @JsonProperty("attribute1")
+        private String attribute1;
+
+        /**
+         * 属性2
+         */
+        @JsonProperty("attribute2")
+        private String attribute2;
+
+        /**
+         * 属性3
+         */
+        @JsonProperty("attribute3")
+        private String attribute3;
+
+        /**
+         * 属性4
+         */
+        @JsonProperty("attribute4")
+        private String attribute4;
+
+        /**
+         * 属性5
+         */
+        @JsonProperty("attribute5")
+        private String attribute5;
+
+        /**
+         * 属性6
+         */
+        @JsonProperty("attribute6")
+        private String attribute6;
+
+        /**
+         * 品牌名称
+         */
+        @JsonProperty("brandName")
+        private String brandName;
+
+        /**
+         * 营业执照类型
+         */
+        @JsonProperty("businessLicenseType")
+        private String businessLicenseType;
+
+        /**
+         * 车主
+         */
+        @JsonProperty("carOwner")
+        private String carOwner;
+
+        /**
+         * 中心代码
+         */
+        @JsonProperty("centerCode")
+        private String centerCode;
+
+        /**
+         * 凭证ID
+         */
+        @JsonProperty("certiId")
+        private String certiId;
+
+        /**
+         * 凭证号
+         */
+        @JsonProperty("certiNo")
+        private String certiNo;
+
+        /**
+         * 凭证状态
+         */
+        @JsonProperty("certiStatus")
+        private String certiStatus;
+
+        /**
+         * 凭证类型
+         */
+        @JsonProperty("certiType")
+        private String certiType;
+
+        /**
+         * 险类代码
+         */
+        @JsonProperty("classCode")
+        private String classCode;
+
+        /**
+         * 共保标识
+         */
+        @JsonProperty("coinsFlag")
+        private String coinsFlag;
+
+        /**
+         * 公司代码
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+
+        /**
+         * 公司名称
+         */
+        @JsonProperty("comName")
+        private String comName;
+
+        /**
+         * 合同号
+         */
+        @JsonProperty("contractNo")
+        private String contractNo;
+
+        /**
+         * 车船税计划费用
+         */
+        @JsonProperty("csTaxPlanFee")
+        private String csTaxPlanFee;
+
+        /**
+         * 货币1
+         */
+        @JsonProperty("currency1")
+        private String currency1;
+
+        /**
+         * 货币2
+         */
+        @JsonProperty("currency2")
+        private String currency2;
+
+        /**
+         * 要求时间
+         */
+        @JsonProperty("demandTime")
+        private String demandTime;
+
+        /**
+         * 结束日期
+         */
+        @JsonProperty("endDate")
+        private String endDate;
+
+        /**
+         * 结束小时
+         */
+        @JsonProperty("endHour")
+        private String endHour;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        private String engineNo;
+
+        /**
+         * 汇率
+         */
+        @JsonProperty("exchangeRate")
+        private String exchangeRate;
+
+        /**
+         * 车架号
+         */
+        @JsonProperty("frameNo")
+        private String frameNo;
+
+        /**
+         * 处理人1代码
+         */
+        @JsonProperty("handler1Code")
+        private String handler1Code;
+
+        /**
+         * 处理人1姓名
+         */
+        @JsonProperty("handler1Name")
+        private String handler1Name;
+
+        /**
+         * 处理人代码
+         */
+        @JsonProperty("handlerCode")
+        private String handlerCode;
+
+        /**
+         * 立即生效标识
+         */
+        @JsonProperty("immediatelyActiveFlag")
+        private String immediatelyActiveFlag;
+
+        /**
+         * 被保险人代码
+         */
+        @JsonProperty("insuredCode")
+        private String insuredCode;
+
+        /**
+         * 被保险人姓名
+         */
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        /**
+         * 是否交通事故
+         */
+        @JsonProperty("isTraAcci")
+        private String isTraAcci;
+
+        /**
+         * 项目状态
+         */
+        @JsonProperty("itemStatus")
+        private String itemStatus;
+
+        /**
+         * 最后付款日期
+         */
+        @JsonProperty("lastPayDate")
+        private String lastPayDate;
+
+        /**
+         * 车牌号
+         */
+        @JsonProperty("licenseNo")
+        private String licenseNo;
+
+        /**
+         * 出单公司
+         */
+        @JsonProperty("makeCom")
+        private String makeCom;
+
+        /**
+         * 操作日期
+         */
+        @JsonProperty("operateDate")
+        private String operateDate;
+
+        /**
+         * 操作员代码
+         */
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+
+        /**
+         * 付款次数
+         */
+        @JsonProperty("payNo")
+        private String payNo;
+
+        /**
+         * 付款理由
+         */
+        @JsonProperty("payrefReason")
+        private String payrefReason;
+
+        /**
+         * 一次性标识
+         */
+        @JsonProperty("pefFlag")
+        private String pefFlag;
+
+        /**
+         * 计划日期
+         */
+        @JsonProperty("planDate")
+        private String planDate;
+
+        /**
+         * 计划费用
+         */
+        @JsonProperty("planFee")
+        private String planFee;
+
+        /**
+         * 计划序号
+         */
+        @JsonProperty("planSerialNo")
+        private String planSerialNo;
+
+        /**
+         * 授权代码
+         */
+        @JsonProperty("poaCode")
+        private String poaCode;
+
+        /**
+         * 授权类型
+         */
+        @JsonProperty("poaType")
+        private String poaType;
+
+        /**
+         * 保单号
+         */
+        @JsonProperty("policyNo")
+        private String policyNo;
+
+        /**
+         * 预付款费用
+         */
+        @JsonProperty("prePayrefFee")
+        private String prePayrefFee;
+
+        /**
+         * 保费计划费用
+         */
+        @JsonProperty("premiumPlanFee")
+        private String premiumPlanFee;
+
+        /**
+         * 查询过去日期
+         */
+        @JsonProperty("queryPastDate")
+        private String queryPastDate;
+
+        /**
+         * 险种代码
+         */
+        @JsonProperty("riskCode")
+        private String riskCode;
+
+        /**
+         * 开始日期
+         */
+        @JsonProperty("startDate")
+        private String startDate;
+
+        /**
+         * 开始小时
+         */
+        @JsonProperty("startHour")
+        private String startHour;
+
+        /**
+         * 任务ID
+         */
+        @JsonProperty("taskId")
+        private String taskId;
+
+        /**
+         * 承保日期
+         */
+        @JsonProperty("underWriteDate")
+        private String underWriteDate;
+
+        /**
+         * 生效日期
+         */
+        @JsonProperty("validDate")
+        private String validDate;
+    }
+}

+ 6 - 12
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerQrcodeResponse.java

@@ -18,16 +18,16 @@ public class BoHaiCrawlerQrcodeResponse {
     private String imageContent;
 
     /**
-     * 消息内容
+     * 二维码URL
      */
-    @JsonProperty("message")
-    private String message;
+    @JsonProperty("url")
+    private String url;
 
     /**
-     * 开始时间
+     * 消息内容
      */
-    @JsonProperty("startTime")
-    private String startTime;
+    @JsonProperty("message")
+    private String message;
 
     /**
      * 过期时间
@@ -35,16 +35,10 @@ public class BoHaiCrawlerQrcodeResponse {
     @JsonProperty("expireTime")
     private String expireTime;
 
-
     /**
      * 显示消息
      */
     @JsonProperty("showMessage")
     private String showMessage;
 
-    /**
-     * 显示标识
-     */
-    @JsonProperty("showFlag")
-    private String showFlag;
 }

+ 22 - 11
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/service/impl/BoHaiCrawlerRequestImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.bohai.crawler.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.google.zxing.NotFoundException;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
@@ -14,6 +15,7 @@ import com.jzg.quotation.bohai.api.entity.request.PaymentRequest;
 import com.jzg.quotation.bohai.api.entity.vo.PersonAreaVo;
 import com.jzg.quotation.bohai.crawler.component.BoHaiCrawlerCacheComponent;
 import com.jzg.quotation.bohai.crawler.component.BoHaiBuildingAttributionInformation;
+import com.jzg.quotation.bohai.crawler.constant.enums.CertifyType;
 import com.jzg.quotation.bohai.crawler.entity.request.BoHaiCrawlerQuotationRequest;
 import com.jzg.quotation.bohai.crawler.entity.request.BoHaiCrawlerPaymentCertiNoQueryRequest;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
@@ -32,6 +34,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -62,7 +65,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
 
     private final BoHaiCrawlerQuoteProcessService boHaiCrawlerQuoteProcessService;
 
-    private static final String TOKEN = "114050281-8a2c762d10a0194b65abd37e760f18e5";
+    private static final String TOKEN = "114050281-9605ec6831302f4d5e37ea64b3c15370";
 
     /**
      * 登录
@@ -642,17 +645,25 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
      */
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
-        AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
-        BoHaiCrawlerOrder boHaiCrawlerOrder = boHaiCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
-        HttpHeaders headers = boHaiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-
-        BoHaiCrawlerPaymentCertiNoQueryRequest boHaiCrawlerPaymentCertiNoQueryRequest = buildPaymentCertiNoQueryRequest(boHaiCrawlerOrder.getOrderNo());
+        try {
+            AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
+            BoHaiCrawlerOrder boHaiCrawlerOrder = boHaiCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
+            HttpHeaders headers = boHaiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
 
-        BoHaiCrawlerQrcodeResponse boHaiPaymentResponse = boHaiCrawlerRequestComponent.payment(boHaiCrawlerPaymentCertiNoQueryRequest, headers);
+            log.info("获取支付链接,订单号:{}", boHaiCrawlerOrder.getOrderNo());
+            BoHaiCrawlerPaymentCertiNoQueryRequest boHaiCrawlerPaymentCertiNoQueryRequest = buildPaymentCertiNoQueryRequest(boHaiCrawlerOrder.getOrderNo());
 
-        PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
-        //boHaiCrawlerQrcodeResponse.setPaymentLink(boHaiPaymentResponse.getData().getPayUrl());
-        return paymentLinkResultsVo;
+            BoHaiCrawlerQrcodeResponse boHaiPaymentResponse = boHaiCrawlerRequestComponent.payment(boHaiCrawlerPaymentCertiNoQueryRequest, headers);
+            PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
+            paymentLinkResultsVo.setPaymentLink(boHaiPaymentResponse.getUrl());
+            return paymentLinkResultsVo;
+        } catch (NotFoundException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
     }
 
     /**
@@ -695,7 +706,7 @@ public class BoHaiCrawlerRequestImpl implements BoHaiCrawlerRequest {
         request.setHead(head);
 
         // 凭证类型:T=临时凭证,P=正式凭证
-        request.setCertiType("T");
+        request.setCertiType(CertifyType.TEMPORARY.getCode());
         // 登录机构
         request.setLoginCom("14070201");
         // 每页行数

+ 441 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/Base64ImageExtractor.java

@@ -0,0 +1,441 @@
+package com.jzg.quotation.bohai.crawler.util;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class Base64ImageExtractor {
+    /**
+     * 从HTML内容中提取base64图片字符串(正则表达式方式)
+     * @param htmlContent HTML内容
+     * @return base64图片字符串列表
+     */
+    public static List<String> extractBase64ImagesByRegex(String htmlContent) {
+        List<String> base64Images = new ArrayList<>();
+
+        // 匹配 src="data:image/...;base64,..."
+        Pattern pattern = Pattern.compile("src=\"data:image/[^;]+;base64,([^\"]+)\"");
+        Matcher matcher = pattern.matcher(htmlContent);
+
+        while (matcher.find()) {
+            base64Images.add(matcher.group(1));
+        }
+
+        return base64Images;
+    }
+
+    /**
+     * 提取完整的data URI(包含前缀)
+     * @param htmlContent HTML内容
+     * @return 完整的base64 data URI列表
+     */
+    public static List<String> extractBase64ImagesWithPrefix(String htmlContent) {
+        List<String> base64Images = new ArrayList<>();
+
+        Document doc = Jsoup.parse(htmlContent);
+        Elements imgTags = doc.select("img[src^=data:image]");
+
+        for (Element img : imgTags) {
+            base64Images.add(img.attr("src"));
+        }
+        return base64Images;
+    }
+
+    /**
+     * 从HTML内容中提取二维码有效期时间(修正版)
+     * @param htmlContent HTML内容
+     * @return 有效期时间字符串
+     */
+    public static String extractQRCodeExpiry(String htmlContent) {
+        Document doc = Jsoup.parse(htmlContent);
+
+        // 方法1: 直接选择第二个li下的span.message
+        Element secondLi = doc.select("li.qrcode_right_li").get(1);
+        Element messageSpan = secondLi.selectFirst("span.message");
+        if (messageSpan != null) {
+            return messageSpan.text().trim();
+        }
+
+        return null;
+    }
+
+    // 测试方法
+    public static void main(String[] args) {
+        String html = "<html>\n" +
+                "\n" +
+                "<head>\n" +
+                "    <title>渤海支付平台</title>\n" +
+                "    <meta name=\"viewport\" content=\"width-device-width,minimum-scale=1.0,maximum-scale=1.0\" />\n" +
+                "</head>\n" +
+                "<script type=\"text/javascript\" src=\"/pubsrv/ecpay/payment/public/js/qrcode.min.js\"></script>\n" +
+                "<script type=\"text/javascript\" src=\"/pubsrv/ecpay/payment/public/js/jquery.min.js\"></script>\n" +
+                "<link type=\"text/css\" rel=\"stylesheet\" href=\"/pubsrv/ecpay/payment/payment/css/jscdPayment.css\" />\n" +
+                "<script type=\"text/javascript\" src=\"/pubsrv/ecpay/payment/public/js/crypto-js.min.js\"></script>\n" +
+                "<style>\n" +
+                "    #queryBtn {\n" +
+                "        background-color: #115dc5;\n" +
+                "        /* Green */\n" +
+                "        border: none;\n" +
+                "        color: white;\n" +
+                "        padding: 10px 20px;\n" +
+                "        text-align: center;\n" +
+                "        text-decoration: none;\n" +
+                "        display: inline-block;\n" +
+                "        font-size: 14px;\n" +
+                "        margin: 1px 1px;\n" +
+                "        cursor: pointer;\n" +
+                "        border-radius: 4px;\n" +
+                "    }\n" +
+                "\n" +
+                "    #queryBtn:hover {\n" +
+                "        background-color: #156de5;\n" +
+                "    }\n" +
+                "\n" +
+                "    #queryBtn:active {  \n" +
+                "        background-color: #0458cb;\n" +
+                "    }\n" +
+                "</style>\n" +
+                "\n" +
+                "<body>\n" +
+                "    <div class=\"qrcode_all\">\n" +
+                "        <img class=\"logo\" src=\"/pubsrv/ecpay/payment/public/images/bohai_logo2.png\" style=\"width: 580px;\">\n" +
+                "        <div class=\"qrcode_out\" id=\"qrcode_out \">\n" +
+                "            <div class=\"qrcode_left\" id=\"qrcode_left\">\n" +
+                "                <img style=\"height: 250px;margin-left:20px\"  src=\"data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a\n" +
+                "HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy\n" +
+                "MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAIwDASIA\n" +
+                "AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA\n" +
+                "AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3\n" +
+                "ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm\n" +
+                "p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA\n" +
+                "AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx\n" +
+                "BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK\n" +
+                "U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3\n" +
+                "uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDT1zXP\n" +
+                "iJrPxg1vwt4W1+0sYLK3juES6gjKhTHFuAby2YktJnn3q5/wj3xz/wChz0P/AL8r/wDI9Hh7/k6H\n" +
+                "xZ/2Co//AEG1r5goA+h77WPin4R8ZeFLDxD4msbu11fUEhKWlvGcoJIw4JMKkZEnb36V2Hxr8U6z\n" +
+                "4R8G2d/od59kupNQSFn8pJMoY5CRhwR1UflXD+JP+aF/9u3/ALa1wHxt/wCSva7/ANu//pPHQB7v\n" +
+                "4W0b4rWniO0n8S+JtKvdIXf9oggjUO+UYLgiFejbT1HT8K4/x18cDYeMrCw0d762tdM1CSHWUa3h\n" +
+                "b7QiSKCIyST0WT+794fhkS+J/id8W/Bd/ZWXh3SptMmlWGaaBxE6uhSTA8yb/d7HrWP4l0zxdf6j\n" +
+                "4A8L+NNKg02xSVNPtJLSVGkkjJhjckh3G4AJzgDJPB7AHSeNf2gor7RoYvB51LT9QFwrSS3VtCym\n" +
+                "La2VGWfncVPTsefX1+98a6bY+PNO8HywXZ1C/tzcRSKi+UFAkOGO7Of3bdAeo/D588U/ArxPaeI7\n" +
+                "uDw1pc97pC7Ps8893AHfKKWyCy9G3DoOn41H4w8YeN/D/wATdL8Q+IdI02z1q0stsFuuXiaJjKu5\n" +
+                "tsjHOXf+IdBx6gHt9z8Q7bVdG8cxaMl3b6h4bt51eWaNNvmqsu1k5bIDRE/MB24rH+EPxRHjG1i0\n" +
+                "TUWu59egt5Li5uWhjSJ1EuFC7SOdroPujofx4DSfiRofhTWbHVNFvo7ifxHcR3HidbmCUrZNuDMI\n" +
+                "MBTgGWbvJ91evfH1y/8AAfjH4wa3qOt63d2+gzW8bW11axOGeVY4k2lTGxA4fqo6Dn1APY/C3xr8\n" +
+                "N+LvEdpodhZarHdXW/Y88UYQbUZzkiQnop7VT1bQvjLNrN9LpfizRoNPe4ka1ikiUskRY7FP7g8h\n" +
+                "cDqfqa80+HviHwT/AMKq1bwp4r1mew+3ah5xEEMjPsAhKkMEZR80ZHNWPHPinRtT1H4d2HgS8/tW\n" +
+                "60WVYbdLiJ49zgwCEOWCA7inOMfhQB2//CQ+NtR/4oTT9Zgi8cab/pWoajLDH9kmgPIVPkJ3Ymh/\n" +
+                "5Zr91ufXpPGvi27TWYfBHh+aS08UajbrcWd5LGjW8aqzFg5O45KxSAfIeSOnUeEfFHx94v1kHwr4\n" +
+                "p0zTbGeyuEuHS1DFg3lnaC3mMpBWTPHtWp8QviZZf8LV0nxX4UuIL/7Dp/kgzwSKm8mYMCp2sflk\n" +
+                "B4oA7/4j+IfG2g/8IJo2mazBBq+qZtbyfyY2jln/AHK7vmQ4Xc7HhRwenaj/AIR745/9Dnof/flf\n" +
+                "/kesvx1qU2s6z8GtUuFjWe9uIriRYwQoZ2tWIGSTjJ9TXmnxt/5K9rv/AG7/APpPHQB6P4pb4z+E\n" +
+                "fDl3rl/4u0qS1tdm9ILeMudzqgwDAB1Yd69g8J31xqfg3Q7+8k8y6utPt5pn2gbnaNSxwOBkk9K+\n" +
+                "ePD3/Jr3iz/sKx/+hWte/wDgT/knnhr/ALBVr/6KWgDyfWL7xJ4R+OniHxDYeDdV1q1urSK2QwQy\n" +
+                "BD+7hJYOEYHBjIx/hVf/AIST/q3v/wAkP/uatTXPi9P4O+MGt6drc13caDDbxrbWtrBEWSVo4n3F\n" +
+                "jtJHL9WPUcelz/hHvjn/ANDnof8A35X/AOR6AOY1LUvEnjHxl4F/4t7quh2OjahF/wAu8jRrGZIv\n" +
+                "+mShFUR/THpir7f8I3/w0h4o/wCEo/sr7D/Z8Wz+0/L8vzPLt8Y8zjdjd74zVTw34q+JtzrOuy3/\n" +
+                "AIjtJdP8K3G7Voltog08SM/mLFiIZJWJwMleo5HbX0Wf4X/F7xjes3hvUm1Rrf7RNPdStErKmyMA\n" +
+                "COYjOCvYdDQBznw48O+MPCPh648V+Vrh+w3bL/wi/kzRfbd6InmY56b858tv9V1HUd34k8SQ+J7f\n" +
+                "QrKy8PR32qXqeVc3MJE0/hqaQIN74TdG6MSeTGcwnkY42PGur6/4V1mHxPJfxnwdZW6rf2EUatcS\n" +
+                "yszIrJuUcbniJ+ccKePXj/COpQ+K/FUuqfDZZNHg+2x3HiVdRALXqu5ZRHzIFOBPnBT74/AAPB66\n" +
+                "94I+JuqWni3xNqVxoMdlst9S1aZ4rWaZjE4CGRim8DzBgEnCt71xlp/xPv2e/Euuaz/xMdXt9Qjg\n" +
+                "gv7z99PFHvt/kWRssF+d+AcfM3qa9j+LN74UsfCtrL4w0y71DTzeoscVqxVhLsfDHDpxtDDr3HHp\n" +
+                "4h4B8H+N/GPw+1HTtE1fTbfQZr0rc2t1kM8qiN9wYRsQOE6MOh49QD0vT9P0fT/D3gGKL4cWOs/2\n" +
+                "vaW63t8tijfZcpFmSQ+W2c72bJI+6efTn7Sw8H6Z+0J4ls9ZtNDtNIj0+PyIbyOGOBZCluflVvlD\n" +
+                "HLnjnlveqmqzfFnwJceGPDjeKNNCai62NisMCOsQUxooctCDj5155PB/Hl7+Sx0b4qawvxVhk12c\n" +
+                "W6K7acdgMpSIo3Bi4EeQffsetAHQa54k8E+KPg/rd7aeHvD+ha0lxHFb20Rh+0OokiJdMIrYIZwc\n" +
+                "Dop561v2TaDN4V8Kab4c8M6bqOqX9lDb3ur6dCjz6NMyIonkKKWVwzO4JZDmM89SMzwt+zzqdp4j\n" +
+                "tJ/EsulXukLv+0QQXEwd8owXBCL0baeo6fhU83xC8BfDv/hJtG8K6Lqun6ufNtfP4lj8+LeqN+8l\n" +
+                "b5QxJ+7yOoPSgCh4Y0fR9B+NuvaZ431ax1aOHT1/03W9mJZCIGX/AFrN8wUkDknAPat/TvEvg+/+\n" +
+                "F+reNP8AhW+hx/2fdrbfY/KhPmZMQ3b/ACuP9b02n7vvxoeCfBPh34jeELHxX4r0/wDtDW7/AMz7\n" +
+                "TdedJFv2SNGvyRsqjCIo4A6Z61H4t1X4b/Dmwl8DXvh/Un0/UUW+lhtZC6sd+AS7ShwcwjgccD1N\n" +
+                "AGf8RG1LULf4Y+I9B8M3dzBaIt99hsIWdYVxbusWUXCjClQcdunGKjvvGd5qd5JeX/wGnu7qTG+a\n" +
+                "e0MjtgADLG2ycAAfhXUeK5fEsfw80bWfh/qMGk6RZaU11LBdoryNAIkaJRuR/mChh94ckcnrXmng\n" +
+                "rxx8VfHmszaXpfie0hnit2uGa6tYVUqGVcDbExzlx29aANDxL4i17WfBGoeGNL+EOpaNBeujs1rb\n" +
+                "OFDK6NkosCgkhAM59PSvb/BcE1r4F8PW9xFJDPFplskkcilWRhEoIIPIIPGK8Y8FftBRWOjTReMD\n" +
+                "qWoagbhmjltbaFVEW1cKcMnO4Mencc+nu+k6lDrOjWOqW6yLBe28dxGsgAYK6hgDgkZwfU0AeV/E\n" +
+                "z4hePfA+pz3NtoulN4eaWOG1u58s8jmPcQQsoI5D/wAI6fnH4t+LOvJYS+IPBFppup+F7VFju726\n" +
+                "jdWjuC+CgQujEYeLkKR8x54ONzU7Hw3H8QNSvPFHjLSrqxkiRU8PanNGY7STamJAkjkBiAxzsBxI\n" +
+                "eeefAPAHhjxJ4xnTQLa81Wz8PXUr/ap4opJLRZFTeN6ghCxKoOTnlfagD1Oy1KbxXrPhTVPiSsej\n" +
+                "z/aIbjw0unAlb1nZGYScyFRkQYyU++fw5j482XhRPEV5d2mp3cnih7iFbyyZT5UcXkDDKdgGcCP+\n" +
+                "I/ePHpt+IvDusfDXw9JFLFfeMfNtJFsr5oXH9geUnEkZ/eeX95WyCmPJHPHFz4Q/D6HXLWLxv4jv\n" +
+                "I9cfUreSI2uo2wnKMkuwP5js24hYsDgYDYzxyAan7OP/ACTzUP8AsKyf+ioqy73UpvCms+K9U+Gy\n" +
+                "x6xP9omuPEq6iCFsmRnZRHzGWGTPnBf7g/HvPAvhSz+FnhK7tb/XIJLVrs3L3c6C2SPcqIFOWI6q\n" +
+                "Oc98V5vrHgXWNI+Iel6tomo32raJ4n1X7TqMVlA/2YW7Sq22YqzLJGUlcZYAEBuxNAEHhvQfB3xm\n" +
+                "1GTVNY1W+h8VXERmvbKwHlwxJGREpUvG3VfLJ+c8senQFv4kvPAHhe7vPhpHBrPhGKUSXt/qakSR\n" +
+                "XTFUKBcxMV2+SeEPLHnsPc9N8NaDo1w1xpeiabYzshRpLW1SJiuQcEqAcZAOPYV84avPD4+8J3t9\n" +
+                "4clj0N0dbceDtOYOb9gysZ/LTZuIVuT5bcQdeOAD3v7db698LPt+uSfZrW/0Tzr57dT+6SSDMhQf\n" +
+                "MeATjr071zdhJfaN8K9HX4VQx67ALh1RtROwmIvKXbkxciTAHt2PWsvwDbf8I18PNeutR8Q/8JH5\n" +
+                "GlJJcaJcSZ/s/ZFIWtnUs+zPKEFR9zpxgWPAHxSs7+BIrnwvB4U8PCJ2tb6WcR2kkm/mNCY0TcSX\n" +
+                "bAOflbjrgAkj8H+CNG0ub4VNq+pCfWn+3LG2DKQuDlXEewD/AEc8Hng+ork/iT8TLLw74eh8EeF7\n" +
+                "iC9jhtJ9I1D7XBJ5kIRFiGG+VS33+QCMgduvSaR8QJtR8WWV74j+G8mgpGjIde1EFRartbA8x4V2\n" +
+                "hmO0DcOX75wfLPi5ff2/4htItO8G/wBneZd3C299bw5/tnc67ZEIQeZnhgQWz5nXnkA9L+A174rf\n" +
+                "w7Z2l3plpH4XS3mazvVYebJL55yrDeTjJk/hH3Rz6+eeFvht8T/CPiO01yw8NQSXVrv2JPdwlDuR\n" +
+                "kOQJQejHvVf4ceK/GHgrxDcab/Yeuat5Foy/2LvmT7PudH8zy9rbevXaP9Z1551PGviT4m+KNZhv\n" +
+                "dL8PeLtCgS3WJra1NztdgzHedqKMkMB0/hHNAHP+MvGupeM/FWl6X41gtNOg0u9e3u2sEbdGrOiz\n" +
+                "HlnBKhOMA/jWh4+8A+ENG+H2neKfCup6lfQXt6LdHuioUriTcQvlqwIaPHPvVPwDqV5p+o69/aPw\n" +
+                "9n8X3zyp9o+0W5lktZAZN2/MTkMxJznBynft7/4WufDfirw5aaVf+HtK0+6h3zv4cnjjZ7PDsA5h\n" +
+                "KgruDBs7R/rPfJAOfsbG4gvI/iV8So/7F1PSM2scVmwkgMDAqrMq+YxYvO44YdF46k+oWF9b6np1\n" +
+                "tf2cnmWt1Ek0L7SNyMAVODyMgjrXzJ4K0HUvido01rqnxNu7eeS4aJdJup2uGnVFWTeEaUEjOf4T\n" +
+                "jYTnjj6T0LTP7E8PaZpPned9htIrbzdu3fsQLuxk4zjOMmgD508cXvhSx+O/iOXxhpl3qGnm3hWO\n" +
+                "K1Yqwl8mHDHDpxtDDr3HHofCbV9f8K+FbrxPJfxnwdZXrrf2EUatcSysiIrJuUcbniJ+ccKePXo/\n" +
+                "iJ4p0bwB471LX9AvPtXi658q1vbC8idoIoDEjblKhfm/dxfxn7zcenQeKfjr4YtPDl3P4a1SC91d\n" +
+                "dn2eCe0nCPl1DZJVei7j1HT8KAMPxL471P4leFdXl8E3UmnafpdlM2sxajDGGuYnQ4WPAfnbHKDy\n" +
+                "v3hz6aHwG8a6bfeHbPwfFBdjULC3muJZGRfKKmcnCndnP7xeoHQ/j5B4bPgvxRrOu6p481e70ue5\n" +
+                "uPtEC2EbFXaRnaQf6uQgA7cZPfvWxqUl94xt1+HPgOGPVtB0pxfWtxKfKuHBB3lzIUXAedgAFBwB\n" +
+                "15JAPR/HHjXTfHnwI8R6ppcF3DBFcQ27LdIqsWE0LZG1mGMOO/rXceGtSh0b4R6RqlwsjQWWhQ3E\n" +
+                "ixgFiqQBiBkgZwPUV53FrenfBPxpYeEUuMeGr2JtQu7u8RpZ45GDoAvlgDbmGPjYTy3PpqT+Erv4\n" +
+                "u3Et34qhkstFtXMmgXOnSIrXdvKc75A+8g7UiIBCH5jkdgAR/wDDR3g//oG65/34h/8AjtchonwM\n" +
+                "+IHhzWINW0nWtDt76Dd5cvmSPt3KVPDQkHgkcijW5fDWm6xP8LvE2oz2XhXRdt1Z3kSM93JO6h9r\n" +
+                "lUZSv7+Xog+6vPrh+AfAPhDWfh9qPinxVqepWMFlem3d7UqVC4j2kr5bMSWkxx7UAez3vhK08N/D\n" +
+                "TxXdmGP+2tR0eaTVrmOR2W4uBC5dwDwoLO5woUc9BwBw+l3vhSx/Z38My+MNMu9Q083sqxxWrFWE\n" +
+                "vmXGGOHTjaGHXuOPTpP+Fv8AgTQfBv2DQ9d+03Vhp/k2KXFpP+9eOPEYc7FHJAz069q84+HvxMsv\n" +
+                "+Fq6t4r8V3EFh9u0/wAkmCCRk3gwhQFG5h8sZPNAHRg+NLr4kaX4A8f6vaatpeqW7XE9vaxrGrqq\n" +
+                "yMgLrGjgh4QeD2HXJFWNf02bw/rNhpfiFo7uea4Nv4Ga2J26WysqxmfhSwBNt94S/cbrn5qF78Kf\n" +
+                "EngPx5p2seANNk1WC3tyxfUbmHAlYSIy4DRnAUqR7nqela/iT4z6rbXGhaL4fg0278STP9k1Wzmh\n" +
+                "kCwXeUXy0YsqkbzIM7mHA5xyQDvPB3g59Kl/t7XvIuvF1zE0N9qEDtslTcNgCYVRhEjHCD7vfJJp\n" +
+                "+NfizoPgPWYdL1S01KaeW3W4VrWNGUKWZcHc6nOUPb0q5F4xfw54LsNW+IPkaRfTStDLHAjSor5c\n" +
+                "oBsL9UXPU/h0ryj4a+JLzwj8AfEOuWEcEl1a6qNiTqSh3C3Q5AIPRj3oA6fxFpOqWHh6Txv8OLmD\n" +
+                "Ro9RtJNX1f7X+8kuAU81MK6yKrDdLwpUZYdQBjkPB2t6j40l87wzcfY/iM8TSapq94iiCe1VgoRU\n" +
+                "AZQ3/Hv0jX7jc8nd5P8A8JJef8Jl/wAJR5cH27+0P7Q8vafL8zzPMxjOdue2c4717X4K/aClvtZm\n" +
+                "i8YHTdP08W7NHLa20zMZdy4U4Z+NpY9Ow59QDzDWvFGi6V4xsta+HNpd6Mltb7f9KAkbzTvVmAdp\n" +
+                "BgowH58d6+s/Cd9can4N0O/vJPMurrT7eaZ9oG52jUscDgZJPSuP+CnhbWfCPg28sNcs/sl1JqDz\n" +
+                "KnmpJlDHGAcoSOqn8q9IoA8f+PHhP+0/DNveaN4f+16vJqEfnzWdl5k7RiKQfMyjcVGEHPHC+1eI\n" +
+                "S33/AAjvgu/8L6z4N8jV7yVbmDUryHyp4Y8p8qhk3bT5bjIYD5m98/Q/xr8U6z4R8G2d/od59kup\n" +
+                "NQSFn8pJMoY5CRhwR1UflXlHxM/4l2mT6f47/wCJp44lijk0/UrP5YIbXzPuMBsBbKz/AMB++vPo\n" +
+                "Ad/p+n6Pp/h7wDFF8OLHWf7XtLdb2+WxRvsuUizJIfLbOd7NkkfdPPpl6FPoPhP9o3xOksum6Np6\n" +
+                "6YiRKzJbxBitu2F6DJ+Y4Hua5z4bax8U/F2nTWHh7xNY2lrpEUEIS7t4xhCGCAEQsTgR9/brWH8U\n" +
+                "fAPi/RgfFXinU9Nvp724S3d7UsGLeWdpK+WqgBY8ce1AHvevfDaz8RfEXTPFF/PBPa2dobZ9NntB\n" +
+                "Kk3+swxJOODIDjafu/lc8SeG5prjQr2y8QyaBpehv5tzbQgxwTwqUOx8OqqgVCOQQAx49fmz/hdv\n" +
+                "xD/6GH/ySt//AI3Xpfww8S+KPiV4V8baXq2px3M7WS29q0kKRLG0qTKSfLUHGQvY9OKAOk8Y654P\n" +
+                "ki/tHRvDGh+NtXllVZ4LNYbidYwpHmMVR22jCLkjHzKM9BXP/GjwL9g8K32saNqP9laRbxQrPoln\n" +
+                "B5UFxIZgPMYKwXd8yclSf3a89MZHhvw3eaHqMnhPwnJBp/xCsYjJqeqysZLSa1YhgiBg3zfvIP8A\n" +
+                "lmv3G5/vc38Ufi9P4xJ07RJru30Ga3Rbm1uoIgzyrIX3BhuIHCdGHQ8eoB6Xp+n6Pp/h7wDFF8OL\n" +
+                "HWf7XtLdb2+WxRvsuUizJIfLbOd7NkkfdPPpxGsCz8O/HTxDBYeA4PEFqlpEqaXBagpDmOFjIEEb\n" +
+                "Ac5GcD7/AF555vw18TviDNcaR4c0vX44Ed4bG1WS1hKoCQiAnyycDjnk/Wo/EPiHxt4H+JmrXNzr\n" +
+                "MDeIWijhuruCGNkkQpGwADIAOAn8I6fmAfVepeJdB0a4W31TW9NsZ2QOsd1dJExXJGQGIOMgjPsa\n" +
+                "8A0r4V6l418deJ9ZTUrvRYI9Ta6069W0ZluleWRlkik3KCAArBlJ+8D6Z6/V/CVpY+E73xP8XIY/\n" +
+                "EGoWbrGk2nSPGRbsyqibV8pSQ7uSSM4PU4AHmlh8UvGV54httA8L6z9h0ya7Sy0uC4tYT5EJcJEr\n" +
+                "sUZjtXaCcseOpoA9P8WeItH+H/gaw0bX5bHxvqdtd7ZoL+ZPOG8SOsjI/mMMKVUE9mHIzivNPEur\n" +
+                "ab4I8Eah8PtL1C08Qwao6XzarazKqwtvT90UUuCcQA53D744453Pi74OfSvANhr2veRdeLrnUFhv\n" +
+                "tQgdtkqbJdgCYVRhEjHCD7vfJJz/APhWdlp3/FCahbwS+ONS/wBK0/UYp5PskMA5Kv0O7EM3/LNv\n" +
+                "vLz6AHf6fp+j6f4e8AxRfDix1n+17S3W9vlsUb7LlIsySHy2znezZJH3Tz6eeeKvBug6r8a9f0aX\n" +
+                "V9N8L6fBbxSxO0SJFu8qH5FXcgBO9m4PY8Vc8V6x8U/hZp2jWF14msWtZImhtUtLeOTy0iCDBLwg\n" +
+                "9GX16HNZ9j8L/GvxQs4/GU2raVJJqOctOzRufLJi5VI9o+52/nQBc+HnjjXvFFk3gCXVdSi1DVLh\n" +
+                "5Ytda9eSW1VEV9irkEg+Uw4cf6w8ev0fpNnNp2jWNlcXcl5Pb28cUlzJndMyqAXOSTkkZ6nr1NfP\n" +
+                "miReGtN1iD4o+GdOnsvCui7rW8s5XZ7uSd1KbkDOylf38XVx91uPX6D0nUodZ0ax1S3WRYL23juI\n" +
+                "1kADBXUMAcEjOD6mgDj9X8a6l4V8WXsnieC0sPBxRY7HUFRpJZbgqrbGVGYgcTc7APlHPPPkHgfx\n" +
+                "rqXjz47+HNU1SC0hnit5rdVtUZVKiGZsnczHOXPf0r1/V/Dem23iy98QeLfENpPoN0ixW+k6sF+y\n" +
+                "wTBVAdPMcpvwknRQcO3PXPzhrXiSbxR4xsr3wb4ek0K8S38qK20YnzHYbyzjykU5KsQcDovXFAHe\n" +
+                "XXw40eT4h6x/wndzfaV/bWqyf2H9kdH+175WznCvs+/F97b94+hxr+JPg18NvCOnR3+ua9rlpayS\n" +
+                "iFX3JJlyCQMJCT0U/lVTSbPUo7exsri7u/FuqaskcUlzJumn8JzMAC5yXZHDPnrEc2/Xj5cfV7zX\n" +
+                "vhz4svYfFtpqXjPQURYreTVt4tWmZVcOnmCRN6jzE45xu5HIoA2Ph/e+K/iN8T9I8c3umWiafpyS\n" +
+                "2Ms1qwRVPlSEAozlyczDkccj0NU/Fnhj4Y6n4h1yGz8RarJ4quru4WGx2ERtes7BYtxhwFMhC5LY\n" +
+                "x/F3r1/W9H0f+x5/CGgatY+GNTv9s8K2GyKbhgWdY0ZGbKxspI7A+mK5fxX8H7PUNO0a7i12DRr7\n" +
+                "SImlvdXW0CyXUgCEzyPvUhgUZ9xYnLE57kA8k8A/C4az8QdR8LeKlu7GeysjcOlrNGWDZj2gthlI\n" +
+                "KyZ49q9P8W+LbTxrYSok0bfDdkWPVtYijdLi3uFfcqIrfMQW8gEiNhhzyMEjzTTvGP8AwrP4oatf\n" +
+                "f2h/wmG+0W2+3/a9vnbhE+7f+8zt27MZPTtjFep+HfFum658JtY1TS/h7aSQQ3oibQrVFkW5b9yd\n" +
+                "5CxYJAYH7p/1Y59ADiPhtHYw+Ffi5Fpc0k+npZOtrLIMM8QS52MeByVweg+gqn4e+IXj3wP8M9Ju\n" +
+                "bbRdKbw80skNrdz5Z5HLyMQQsoI5D/wjp+e/daNrHjXw9rEuk+Gb7wH/AGfaSNJY2lq6/wBs7kbE\n" +
+                "ZCrHu27CuCH/ANceB35zSPifD4T8J2Xg3xH4Bjv3052cx6i4QhnZnB8p4jtO2TAPofegCv4Bkvp/\n" +
+                "h9qOm61DHbeAJr0tqeqRHNxBKBGUVFySQXWEH923DHkdR7n8NrjXZNOmtryygj8PW0UEeg3akeZd\n" +
+                "2oDBHkG44YoIjyqcseB0HknjLSdS1j4eap4li0+78G6faPHby+G1haOK7bzE/fsMIM/vFGSh/wBU\n" +
+                "OfTQ8LeKdS8AeFba9srq78bQXdlFLc20NyxXQ1RM7Hx5gQEMRyE/1J444AO78U+FtZ8f+I7vQNfs\n" +
+                "/svhG22XVlf2cqLPLOEVdrBi3y/vJf4B91efXhL39n2JPHmnWloNSk8Lvblry9a5h82OXEmFUbQc\n" +
+                "ZEf8J+8efTs4vjB9v8F2GsaNoX9q6vcSss+iWd35s9vGC48xgqFtvypyVA/eLz0zy+j+OvEniL46\n" +
+                "eHoL/TtV8P2r2kqvpc88gSbEczCQoVUHnAzg/c68cAGR/wAIx8MdB8Q+TofiLVbnxVYXe2xsbhD5\n" +
+                "ct7G+I4nbyVG0yAKTuAwfvDrWvb/ABK+LV34ou/DUHhnQ31e0iE09vkjYhCkHcZ9p++vQ9/rVDx/\n" +
+                "8KbPRNR1fxXL44gsL6aW51KytWiEUjyAmQJG/mglgSoyBnJBxXofwcghvfAOl+ILuKOfWrpJkuNR\n" +
+                "lUNcTKJmADyH5mACIACeij0FAHzpFF4l+EnjSwvb3ToIdThiaaGGd1lRkcPHk+W/+93HSvrvw1qU\n" +
+                "2s+FdI1S4WNZ72yhuJFjBChnQMQMknGT6mvCJPhPpvizVIUl+L9prOoMmyJWK3EpUZbC/vycD5jg\n" +
+                "e5r3vQtM/sTw9pmk+d532G0itvN27d+xAu7GTjOM4yaAOT+LPgrUvHnhW10vS57SGeK9S4Zrp2VS\n" +
+                "oR1wNqsc5cdvWuP8Lz/C/SvDVz8RtF8N6lappNwbf5pWaXc4RCVVpihGJh1Pr7V2Hi3xrqSX8vh/\n" +
+                "wRBaan4otXWS7srpGVY7cpkuHLIpOXi4DE/MeODjxz4mfELx7/Zk/hTxXoulWH26KOYiDLPsEmVI\n" +
+                "YSso+aMjmgCTwJq+v3Pirxj4t8P38dpoMN6NS1W2mjUzz22+WTYgKsA+wSD7yjJHPcdH4k8SWeua\n" +
+                "dH4s8WRz6h8Pb6UR6ZpUSiO7hulBUu5Ur8v7uf8A5aN99eP7u59i8KXOjfCmXxBqd3aahDb2zaVF\n" +
+                "CpKzy7YPlfCNgbhGOq9Tz6WL/wCL0Hh/4qax4e8QzWlnotpbo0FwsErytKyRNtbbuGMO/wDCOg59\n" +
+                "QDm7jx14f+Ifii0bwlZX1h44MRh07Ur9VEMKKGeQModwcoZQMo3LDp1FfXPiZe6t4h8O+CBcT+Yb\n" +
+                "saR4k3QRiO9LOkUnlsPmVT+95AQ4YdD0oaJ8R9Y+LesQeB9ftrG20zU93nS2COky+WplXaXZlHzR\n" +
+                "qDlTwT061l+JfCnwj0a31e0t/FGstrVkk0cdtJGSpuEBAQkQAY3DGcge/egCvrnwuOs/GDW/C3hZ\n" +
+                "bSxgsreO4RLqaQqFMcW4BsMxJaTPPvXq/g/TZvgt8MtUuPEbR3SR3v2gjTiXO1xFEB84TncMn2/K\n" +
+                "vKPhdofxE0YjxV4W0C0voL23e3R7qeMKV8wbiF8xWBDR45966/4eDxp8K7JovE2kWlh4T+0PcX18\n" +
+                "0izSxMyKiBRHISQXWMfcP3j0HIAPZPt1xr3g37focn2a6v8AT/OsXuFH7p5I8xlx8w4JGevTvXzJ\n" +
+                "fyWOjfFTWF+KsMmuzi3RXbTjsBlKRFG4MXAjyD79j1qPx18Vb/xF4ysL+CKxe10LUJJtNdYpF85P\n" +
+                "MUoZAzZ5Ea9NvU9O1zUvGHjf4026+HLfSNNle2cXxW1zE2FBTJMkmMfvOnXp70Aep2Pgv4i6xeR2\n" +
+                "HjrXtK1Xw1Ln7ZZwDy3kwCUwyRIRhwh4YdO/Q82viLwBo1x4i8B+GNE1Kx1TV3k0ZppG3wGbLwox\n" +
+                "LSswQM5OQucHoelcR4PsPHniD4Zap4e8PaJaXmi3d7unuGlRJVlURNtXdIoxhE/hPU8+nsehfFLw\n" +
+                "b4Z8PaZoGr6z9m1PTLSKyvIPssz+VNGgR13KhU4ZSMgkHHBNAHEeG/Dd5oeoyeE/CckGn/EKxiMm\n" +
+                "p6rKxktJrViGCIGDfN+8g/5Zr9xuf73q/jGLw14cl/4WDq2nTz32lRLDHNA7F1R2KYCFwh5lbr6+\n" +
+                "wrz/AOI+t6d8W/D1voHge4/tXU7e7W9lg2NBthVHQtulCqfmkQYBzz04NdJ8UZL6cnTdahjtvAE1\n" +
+                "ujanqkRzcQSiQlFRckkF1hB/dtwx5HUAGp4n8LaN8UPBtrftZ7rqXT3m0t7iV4/IeaMFS4Q4OCEz\n" +
+                "97p378PokviXTdHg+F3hnUYLLxVou66vLyVFe0kgdi+1CyMxb9/F1Qfdbn15D/hIfBPg7/iTeEtZ\n" +
+                "nv8ASPEH+i67PewyeZawfd3Q4RPm2yynlX5VeOxp+D/APhDxj8TdU0TTtT1KfQYLL7RbXKlUldgY\n" +
+                "gwbdGONzuPujoPxAK9h4w8EeH/ipo/iHw9pGpWei2lu6z27YeVpWSVdy7pGGMOn8Q6Hj1+p9J1KH\n" +
+                "WdGsdUt1kWC9t47iNZAAwV1DAHBIzg+pryv9nH/knmof9hWT/wBFRV7BQB4/4h+I/wDYPxM1bTNG\n" +
+                "+Hn9ravDFH597Zn9/LGUjb5tsTNtGUHJI4X2rL1Lx1qWs3C3GqfAu7vp1QIsl1bNKwXJOAWtycZJ\n" +
+                "OPc1qeHv+TofFn/YKj/9Bta8g/4Xb8Q/+hh/8krf/wCN0Aenw/EzzvEPhnSdb+Fn9m77uK206W9G\n" +
+                "37Nl0XdCGhGNvyHCkdF6cV1CeBfDd/8AFzWtYv8AUdK1W6uLRFfRJ4I5Xt8LEBIQWJ6KOdo/1nX1\n" +
+                "4/xnfXGp6j8Fb+8k8y6upYJpn2gbnY2pY4HAySelVNU8a6b4D/aI8TapqkF3NBLZRW6raorMGMdu\n" +
+                "2TuZRjCHv6UAdfovwXh0Pwde6XaaxHHrU1x5tvrsVkI7i2X5AUQh9wBCuDhhxIeOubHg34Oab4eu\n" +
+                "NUuNentPEs986P5l/YKzRsC5Y5dnJLFgSeOnepPC3xr8N+LvEdpodhZarHdXW/Y88UYQbUZzkiQn\n" +
+                "op7Vx/jr4tatf+MrDwv4LvJ9Nvk1CTT7uS7t4mjkkMixoQSHO0EPzgHBHB7AHrH9u+D/AAz/AMSj\n" +
+                "+1dD0r7P/wAuX2iGDyt3zfcyMZ3Z6c5z3r50+KPiTxt4oJvbvw94g0LRUt0iuLaUzfZ3YSEh3yir\n" +
+                "klkAyOqjnpW54Y8HP4j+NuvaT8QfI1e+h09ZpZIHaJGfEAQjYE6I2Og/HrXV/Hnxrptj4dvPB8sF\n" +
+                "2dQv7eG4ikVF8oKJwcMd2c/u26A9R+ABJp+n6Pp/h7wDFF8OLHWf7XtLdb2+WxRvsuUizJIfLbOd\n" +
+                "7NkkfdPPpxGsaHZx/HTxDp1h4ng8E2sVpEyTwMLdGzHCTGAHQcklsZ/hzjvQNY+Kfh3TvBVhB4ms\n" +
+                "Utddihh01Ft428lMRhBIWhzwJF6buh69+r0X4MarqvjG91r4jT6brKXNvt/0WaSNvNGxVYhFjGAi\n" +
+                "kflx3oAk0HWfDfwg+HWppYeJtK8S3QuxcpbwXUcTvv8ALjKgBnPABbOPy61xk/hfwrdXEvj648Za\n" +
+                "NNPK51mTw9IYmZ2J842hYyZJJ/d52f8AAe1b9l8KfDfgPwHqOseP9Nj1We3uAwfTrmbIiYxoq4LR\n" +
+                "jIYsT7Hqelch8XfDXhfRtG8J6p4Y0ySxg1e3kuGWSZ3YrtiZAdzMAQHPQ9+9AB4Ps5viN8TdUm8O\n" +
+                "XcngxHsvNEenZIVVMSFPkMfDN859+x61c+PHiz+0/E1vZ6N4g+16RJp8fnw2d75kDSCWQ/MqnaWG\n" +
+                "EPPPC+1Hwz/4mOmQaf4E/wCJX44iikk1DUrz5oJrXzPuKDvAbLQfwD7jc+vB+NfBWpeA9Zh0vVJ7\n" +
+                "SaeW3W4VrV2ZQpZlwdyqc5Q9vSgD3vT9P0fT/D3gGKL4cWOs/wBr2lut7fLYo32XKRZkkPltnO9m\n" +
+                "ySPunn04jWNDs4/jp4h06w8TweCbWK0iZJ4GFujZjhJjADoOSS2M/wAOcd6BrHxT8O6d4KsIPE1i\n" +
+                "lrrsUMOmotvG3kpiMIJC0OeBIvTd0PXvh3/gHxf4x+KmsaJqOp6bPr0Fulxc3LFkidQkQULtjHO1\n" +
+                "0H3R0P4gEnw48Y+X4euPAn9of2F/aV21z/b/ANr8v7JtRG27flzu8rbnePv9+h+n9Ci8nw9pkX9o\n" +
+                "/wBpbLSJft27d9pwg/eZyc7vvZyevU18mXukaB488eado/gCwk0qC4typTUZGwZVEjs2Q0hwVCge\n" +
+                "46DrX1f4a02bRvCukaXcNG09lZQ28jRklSyIFJGQDjI9BQB423inRvCP7SHii/1y8+yWsmnxQq/l\n" +
+                "PJlzHbkDCAnop/KuY/4R74Gf9Dnrn/flv/kevoe+8J+G9TvJLy/8P6Vd3UmN809lHI7YAAyxGTgA\n" +
+                "D8Kr/wDCCeD/APoVND/8F0P/AMTQB4p4i8S+F9Z8VfC3S/DGpyX0GkXsNuzSQujBd9uqE7lUEkIe\n" +
+                "g7dq7e/1z4d+DviprGt6jr93Br09ulvc2zQSPEilIipXbGedqIfvHqfw7iDwX4VtbiK4t/DWjQzx\n" +
+                "OHjkjsIlZGByCCFyCDzmpL7wn4b1O8kvL/w/pV3dSY3zT2UcjtgADLEZOAAPwoA+fPhN8JtB8eeF\n" +
+                "brVNUu9ShnivXt1W1kRVKhEbJ3Ixzlz39K7v4j+CfEX/ABQn/CIaf/aH/CN52/aJo1+55Pl78sm7\n" +
+                "PlnO3H4cV6ppuk6bo1u1vpen2ljAzl2jtYViUtgDJCgDOABn2FXKAPmTxbqvxI+I1/L4GvfD+mpq\n" +
+                "GnOt9LDayBGUbMAl2lKEYmHA55Hoax7COx0b4qaO3wqmk12cW7si6iNgMpSUOvIi4EeCPfuelfU8\n" +
+                "ek6bDqk2qRafaJqEybJbtYVErrxwz4yR8q8E9h6VTsfCfhvTLyO8sPD+lWl1HnZNBZRxuuQQcMBk\n" +
+                "ZBI/GgDwj4ceMX0HxD47h1PyIPFWqXYWzsdjNHLe75h5W5SQF8x1XJYDB+93ro9F8S+F/DPjG98Q\n" +
+                "+NtTk0zxrdW/2fUdOiheS3hX5DGUKK/JjSIn525Y9Og9U/4RPw3/AGj/AGj/AMI/pX27zfP+0/Yo\n" +
+                "/M8zO7fuxndnnPXNF94T8N6neSXl/wCH9Ku7qTG+aeyjkdsAAZYjJwAB+FAHm/h74e+AvA/xM0m2\n" +
+                "tta1VvELRSTWtpPhkkQpIpJKxADgP/EOn58R478U6N4O1HxLYeErz7fdeIJbqHXUvYn/ANFfLDEJ\n" +
+                "AQdZZeu/7q/j9FyaTps2qQ6pLp9o+oQpsiu2hUyovPCvjIHzNwD3PrWfP4L8K3VxLcXHhrRpp5XL\n" +
+                "ySSWETM7E5JJK5JJ5zQB8seEvBWmvYReIPG893pnhe6Ro7S9tXVmkuA+AhQK7AYSXkqB8o55GTSr\n" +
+                "3xWnwa1y0tNMtJPC73qteXrMPNjlzDhVG8HGRH/CfvHn0+r5PDWgzaXDpcuiaa+nwvvitGtUMSNz\n" +
+                "yqYwD8zcgdz60R+GtBh0ubS4tE01NPmffLaLaoInbjlkxgn5V5I7D0oA8T+G138NbDw9NoEXiG+O\n" +
+                "p+J7SCyvYGhf93M6MhWNvK2j5pWGSWHA59bHxl8N2fhH4M6LodhJPJa2uqjY87AudyzuckADqx7V\n" +
+                "65B4L8K2txFcW/hrRoZ4nDxyR2ESsjA5BBC5BB5zWhqWk6brNutvqmn2l9Arh1juoVlUNgjIDAjO\n" +
+                "CRn3NAHhHwp8Fab4V8Z6fH4nnu7DxiXlksdPV1kiltzEy72ZFYA8TcbwflHHPP0HVOTSdNm1SHVJ\n" +
+                "dPtH1CFNkV20KmVF54V8ZA+ZuAe59auUAf/Z\">\n" +
+                "                <div id=\"saoma\" class=\"saoma\">\n" +
+                "                    <div class=\"radio\">\n" +
+                "                        <p>使用\n" +
+                "                            <input id=\"radio-1\" name=\"payType\" type=\"radio\" value=\"Alipay\" onclick=\"choosePayType('Alipay')\" checked>\n" +
+                "                            <label for=\"radio-1\" class=\"radio-label\">支付宝</label>\n" +
+                "                            <input id=\"radio-2\" name=\"payType\" type=\"radio\" value=\"wechat\" onclick=\"choosePayType('wechat')\">\n" +
+                "                            <label  for=\"radio-2\" class=\"radio-label\">微信</label>\n" +
+                "                            支付\n" +
+                "                        </p>\n" +
+                "                    </div>\n" +
+                "                </div>\n" +
+                "            </div>\n" +
+                "            <div class=\"qrcode_right\" id=\"qrcode_right\">\n" +
+                "                <ul class=\"qrcode_right_ul\">\n" +
+                "                    <li class=\"qrcode_right_li\"><span>二维码有效期:</span></li>\n" +
+                "                    <li class=\"qrcode_right_li\"><span class=\"message\">2025-10-30 11:12:40</span></li>\n" +
+                "                    <li class=\"qrcode_right_li\">\n" +
+                "                        <span>实付金额:</span><span class=\"message\" style=\"font-family: not specified\">¥1,674.89</span></li>\n" +
+                "                    <li class=\"qrcode_right_li\"><span>姓名:</span><span class=\"message\" >林海威</span></li>\n" +
+                "                    <li class=\"qrcode_right_li\"><span>车牌号:</span><span class=\"message\">晋AZ82B6</span></li>\n" +
+                "                    <li class=\"qrcode_right_li\" id=\"kefudianhua\"><span>客服电话:</span><span class=\"message\">956017</span>\n" +
+                "                    </li>\n" +
+                "                    <li class=\"qrcode_right_li\" id=\"refresh_li\">\n" +
+                "                </ul>\n" +
+                "            </div>\n" +
+                "        </div>\n" +
+                "    </div>\n" +
+                "    <script>\n" +
+                "        /**\n" +
+                "         * 查询订单状态,成功则跳转\n" +
+                "         */\n" +
+                "        function queryOrderStatus() {\n" +
+                "            var orderNo = \"1140725000025669\";\n" +
+                "            var url = \"/pubsrv/ecpay/payment/searchOrder/queryOrderState\";\n" +
+                "            $.ajax({\n" +
+                "                url: url,\n" +
+                "                dataType: 'json',\n" +
+                "                data: {\n" +
+                "                    \"orderNo\": orderNo\n" +
+                "                },\n" +
+                "                success: function (res) {\n" +
+                "                    console.log(\"success:\" + res)\n" +
+                "                    var state = res.state;\n" +
+                "                    if (state == \"SUCCESS\") {\n" +
+                "                        var returnUrl = 'https://biz.bpic.com.cn/motor/pspcc/app/#/onlinePayReturn/5140703302025040234,5140703802025010909';\n" +
+                "                        if (returnUrl != '') {\n" +
+                "                            window.location.href = returnUrl;\n" +
+                "                        }\n" +
+                "                    } else {\n" +
+                "                        alert(\"订单尚未支付成功,请稍后再查。\");\n" +
+                "                    }\n" +
+                "                },\n" +
+                "                error: function (res) {\n" +
+                "                    console.log(\"error:\" + res)\n" +
+                "                }\n" +
+                "            });\n" +
+                "        }\n" +
+                "        /**\n" +
+                "         * 加密\n" +
+                "         * @param word\n" +
+                "         * @returns {string}\n" +
+                "         */\n" +
+                "        var getAES = function(word) {\n" +
+                "            var key = CryptoJS.enc.Utf8.parse(\"AD42F6697B035B7580E4FEF93BE20BAD\");\n" +
+                "            var srcs = CryptoJS.enc.Utf8.parse(word);\n" +
+                "            var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});\n" +
+                "            return \"Base64\" + encrypted.toString();\n" +
+                "\n" +
+                "        };\n" +
+                "        window.onload=function(){\n" +
+                "            // 初始化内容\n" +
+                "            isIE()\n" +
+                "            choosePayType('Alipay');\n" +
+                "        }\n" +
+                "        function isIE(){\n" +
+                "            if (!!window.ActiveXObject || \"ActiveXObject\" in window) {\n" +
+                "                // IE下去掉背景色,背景设置为白色\n" +
+                "                document.body.style.backgroundColor = \"white\";\n" +
+                "            }\n" +
+                "        }\n" +
+                "        function choosePayType(payType){\n" +
+                "            var orderNo =  \"1140725000025669\";\n" +
+                "            var url = \"/pubsrv/ecpay/payment/payment/changePayType\";\n" +
+                "            $.ajax({\n" +
+                "                method:'post',\n" +
+                "                url:url,\n" +
+                "                type:'post',\n" +
+                "                dataType:'json',\n" +
+                "                data:{\n" +
+                "                    \"orderNo\":getAES(orderNo),\n" +
+                "                    \"payType\":getAES(payType)\n" +
+                "                },\n" +
+                "                success:function(res){\n" +
+                "                    var status = res.resultCode;\n" +
+                "                    /*if(status==\"success\"){\n" +
+                "                        alert(\"更新支付方式成功!!!\");\n" +
+                "                    }else{\n" +
+                "                        alert(\"系统异常,请稍后重试!!!\");\n" +
+                "                    }*/\n" +
+                "                    return true;\n" +
+                "                }\n" +
+                "            });\n" +
+                "        }\n" +
+                "    </script>\n" +
+                "</body>\n" +
+                "\n" +
+                "</html>";
+
+        // 提取纯base64字符串
+        /*List<String> images = extractBase64ImagesWithPrefix(html);
+        System.out.println("找到 " + images.size() + " 张base64图片");
+        System.out.println(images.get(0));*/
+
+        //提取二维码有效期时间
+        /*String expiry = extractQRCodeExpiry(html);
+        System.out.println("二维码有效期: " + expiry);*/
+    }
+}

+ 301 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/QRCodeParser.java

@@ -0,0 +1,301 @@
+package com.jzg.quotation.bohai.crawler.util;
+
+import com.google.zxing.*;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.common.HybridBinarizer;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+public class QRCodeParser {
+
+    /**
+     * 从base64字符串中解析二维码链接
+     * @param base64Image base64图片字符串(带或不带前缀都可以)
+     * @return 二维码中的内容(链接或文本)
+     */
+    public static String parseQRCodeFromBase64(String base64Image)
+            throws IOException, NotFoundException {
+        // 1. 去掉data URI前缀
+        String base64Data = base64Image;
+        if (base64Image.contains(",")) {
+            base64Data = base64Image.split(",")[1];
+        }
+
+        // 2. 清理Base64字符串:去除所有空白字符
+        base64Data = base64Data.replaceAll("\\s+", ""); // 去除所有空白字符(包括换行符、空格、制表符等)
+        // 3. 解码base64为字节数组
+        byte[] imageBytes = Base64.getDecoder().decode(base64Data);
+        // 4. 字节数组转BufferedImage
+        ByteArrayInputStream bis = new ByteArrayInputStream(imageBytes);
+        BufferedImage bufferedImage = ImageIO.read(bis);
+
+        // 5. 解析二维码
+        return parseQRCode(bufferedImage);
+    }
+
+    /**
+     * 从BufferedImage中解析二维码
+     * @param image 图片对象
+     * @return 二维码内容
+     */
+    public static String parseQRCode(BufferedImage image) throws NotFoundException {
+        LuminanceSource source = new BufferedImageLuminanceSource(image);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+
+        // 设置解码参数
+        Map<DecodeHintType, Object> hints = new HashMap<>();
+        hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
+        hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
+        hints.put(DecodeHintType.PURE_BARCODE, Boolean.FALSE);
+
+        // 解码
+        MultiFormatReader reader = new MultiFormatReader();
+        Result result = reader.decode(bitmap, hints);
+        return result.getText();
+    }
+
+
+
+    // 测试方法
+    public static void main(String[] args) {
+        // 你的base64字符串
+        String base64Image = """
+                data:image/jpg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
+                HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
+                MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAIwDASIA
+                AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
+                AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
+                ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
+                p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
+                AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
+                BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
+                U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
+                uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDT1zXP
+                iJrPxg1vwt4W1+0sYLK3juES6gjKhTHFuAby2YktJnn3q5/wj3xz/wChz0P/AL8r/wDI9Hh7/k6H
+                xZ/2Co//AEG1r5goA+h77WPin4R8ZeFLDxD4msbu11fUEhKWlvGcoJIw4JMKkZEnb36V2Hxr8U6z
+                4R8G2d/od59kupNQSFn8pJMoY5CRhwR1UflXD+JP+aF/9u3/ALa1wHxt/wCSva7/ANu//pPHQB7v
+                4W0b4rWniO0n8S+JtKvdIXf9oggjUO+UYLgiFejbT1HT8K4/x18cDYeMrCw0d762tdM1CSHWUa3h
+                b7QiSKCIyST0WT+794fhkS+J/id8W/Bd/ZWXh3SptMmlWGaaBxE6uhSTA8yb/d7HrWP4l0zxdf6j
+                4A8L+NNKg02xSVNPtJLSVGkkjJhjckh3G4AJzgDJPB7AHSeNf2gor7RoYvB51LT9QFwrSS3VtCym
+                La2VGWfncVPTsefX1+98a6bY+PNO8HywXZ1C/tzcRSKi+UFAkOGO7Of3bdAeo/D588U/ArxPaeI7
+                uDw1pc97pC7Ps8893AHfKKWyCy9G3DoOn41H4w8YeN/D/wATdL8Q+IdI02z1q0stsFuuXiaJjKu5
+                tsjHOXf+IdBx6gHt9z8Q7bVdG8cxaMl3b6h4bt51eWaNNvmqsu1k5bIDRE/MB24rH+EPxRHjG1i0
+                TUWu59egt5Li5uWhjSJ1EuFC7SOdroPujofx4DSfiRofhTWbHVNFvo7ifxHcR3HidbmCUrZNuDMI
+                MBTgGWbvJ91evfH1y/8AAfjH4wa3qOt63d2+gzW8bW11axOGeVY4k2lTGxA4fqo6Dn1APY/C3xr8
+                N+LvEdpodhZarHdXW/Y88UYQbUZzkiQnop7VT1bQvjLNrN9LpfizRoNPe4ka1ikiUskRY7FP7g8h
+                cDqfqa80+HviHwT/AMKq1bwp4r1mew+3ah5xEEMjPsAhKkMEZR80ZHNWPHPinRtT1H4d2HgS8/tW
+                60WVYbdLiJ49zgwCEOWCA7inOMfhQB2//CQ+NtR/4oTT9Zgi8cab/pWoajLDH9kmgPIVPkJ3Ymh/
+                5Zr91ufXpPGvi27TWYfBHh+aS08UajbrcWd5LGjW8aqzFg5O45KxSAfIeSOnUeEfFHx94v1kHwr4
+                p0zTbGeyuEuHS1DFg3lnaC3mMpBWTPHtWp8QviZZf8LV0nxX4UuIL/7Dp/kgzwSKm8mYMCp2sflk
+                B4oA7/4j+IfG2g/8IJo2mazBBq+qZtbyfyY2jln/AHK7vmQ4Xc7HhRwenaj/AIR745/9Dnof/flf
+                /kesvx1qU2s6z8GtUuFjWe9uIriRYwQoZ2tWIGSTjJ9TXmnxt/5K9rv/AG7/APpPHQB6P4pb4z+E
+                fDl3rl/4u0qS1tdm9ILeMudzqgwDAB1Yd69g8J31xqfg3Q7+8k8y6utPt5pn2gbnaNSxwOBkk9K+
+                ePD3/Jr3iz/sKx/+hWte/wDgT/knnhr/ALBVr/6KWgDyfWL7xJ4R+OniHxDYeDdV1q1urSK2QwQy
+                BD+7hJYOEYHBjIx/hVf/AIST/q3v/wAkP/uatTXPi9P4O+MGt6drc13caDDbxrbWtrBEWSVo4n3F
+                jtJHL9WPUcelz/hHvjn/ANDnof8A35X/AOR6AOY1LUvEnjHxl4F/4t7quh2OjahF/wAu8jRrGZIv
+                +mShFUR/THpir7f8I3/w0h4o/wCEo/sr7D/Z8Wz+0/L8vzPLt8Y8zjdjd74zVTw34q+JtzrOuy3/
+                AIjtJdP8K3G7Voltog08SM/mLFiIZJWJwMleo5HbX0Wf4X/F7xjes3hvUm1Rrf7RNPdStErKmyMA
+                COYjOCvYdDQBznw48O+MPCPh648V+Vrh+w3bL/wi/kzRfbd6InmY56b858tv9V1HUd34k8SQ+J7f
+                QrKy8PR32qXqeVc3MJE0/hqaQIN74TdG6MSeTGcwnkY42PGur6/4V1mHxPJfxnwdZW6rf2EUatcS
+                yszIrJuUcbniJ+ccKePXj/COpQ+K/FUuqfDZZNHg+2x3HiVdRALXqu5ZRHzIFOBPnBT74/AAPB66
+                94I+JuqWni3xNqVxoMdlst9S1aZ4rWaZjE4CGRim8DzBgEnCt71xlp/xPv2e/Euuaz/xMdXt9Qjg
+                gv7z99PFHvt/kWRssF+d+AcfM3qa9j+LN74UsfCtrL4w0y71DTzeoscVqxVhLsfDHDpxtDDr3HHp
+                4h4B8H+N/GPw+1HTtE1fTbfQZr0rc2t1kM8qiN9wYRsQOE6MOh49QD0vT9P0fT/D3gGKL4cWOs/2
+                vaW63t8tijfZcpFmSQ+W2c72bJI+6efTn7Sw8H6Z+0J4ls9ZtNDtNIj0+PyIbyOGOBZCluflVvlD
+                HLnjnlveqmqzfFnwJceGPDjeKNNCai62NisMCOsQUxooctCDj5155PB/Hl7+Sx0b4qawvxVhk12c
+                W6K7acdgMpSIo3Bi4EeQffsetAHQa54k8E+KPg/rd7aeHvD+ha0lxHFb20Rh+0OokiJdMIrYIZwc
+                Dop561v2TaDN4V8Kab4c8M6bqOqX9lDb3ur6dCjz6NMyIonkKKWVwzO4JZDmM89SMzwt+zzqdp4j
+                tJ/EsulXukLv+0QQXEwd8owXBCL0baeo6fhU83xC8BfDv/hJtG8K6Lqun6ufNtfP4lj8+LeqN+8l
+                b5QxJ+7yOoPSgCh4Y0fR9B+NuvaZ431ax1aOHT1/03W9mJZCIGX/AFrN8wUkDknAPat/TvEvg+/+
+                F+reNP8AhW+hx/2fdrbfY/KhPmZMQ3b/ACuP9b02n7vvxoeCfBPh34jeELHxX4r0/wDtDW7/AMz7
+                TdedJFv2SNGvyRsqjCIo4A6Z61H4t1X4b/Dmwl8DXvh/Un0/UUW+lhtZC6sd+AS7ShwcwjgccD1N
+                AGf8RG1LULf4Y+I9B8M3dzBaIt99hsIWdYVxbusWUXCjClQcdunGKjvvGd5qd5JeX/wGnu7qTG+a
+                e0MjtgADLG2ycAAfhXUeK5fEsfw80bWfh/qMGk6RZaU11LBdoryNAIkaJRuR/mChh94ckcnrXmng
+                rxx8VfHmszaXpfie0hnit2uGa6tYVUqGVcDbExzlx29aANDxL4i17WfBGoeGNL+EOpaNBeujs1rb
+                OFDK6NkosCgkhAM59PSvb/BcE1r4F8PW9xFJDPFplskkcilWRhEoIIPIIPGK8Y8FftBRWOjTReMD
+                qWoagbhmjltbaFVEW1cKcMnO4Mencc+nu+k6lDrOjWOqW6yLBe28dxGsgAYK6hgDgkZwfU0AeV/E
+                z4hePfA+pz3NtoulN4eaWOG1u58s8jmPcQQsoI5D/wAI6fnH4t+LOvJYS+IPBFppup+F7VFju726
+                jdWjuC+CgQujEYeLkKR8x54ONzU7Hw3H8QNSvPFHjLSrqxkiRU8PanNGY7STamJAkjkBiAxzsBxI
+                eeefAPAHhjxJ4xnTQLa81Wz8PXUr/ap4opJLRZFTeN6ghCxKoOTnlfagD1Oy1KbxXrPhTVPiSsej
+                z/aIbjw0unAlb1nZGYScyFRkQYyU++fw5j482XhRPEV5d2mp3cnih7iFbyyZT5UcXkDDKdgGcCP+
+                I/ePHpt+IvDusfDXw9JFLFfeMfNtJFsr5oXH9geUnEkZ/eeX95WyCmPJHPHFz4Q/D6HXLWLxv4jv
+                I9cfUreSI2uo2wnKMkuwP5js24hYsDgYDYzxyAan7OP/ACTzUP8AsKyf+ioqy73UpvCms+K9U+Gy
+                x6xP9omuPEq6iCFsmRnZRHzGWGTPnBf7g/HvPAvhSz+FnhK7tb/XIJLVrs3L3c6C2SPcqIFOWI6q
+                Oc98V5vrHgXWNI+Iel6tomo32raJ4n1X7TqMVlA/2YW7Sq22YqzLJGUlcZYAEBuxNAEHhvQfB3xm
+                1GTVNY1W+h8VXERmvbKwHlwxJGREpUvG3VfLJ+c8senQFv4kvPAHhe7vPhpHBrPhGKUSXt/qakSR
+                XTFUKBcxMV2+SeEPLHnsPc9N8NaDo1w1xpeiabYzshRpLW1SJiuQcEqAcZAOPYV84avPD4+8J3t9
+                4clj0N0dbceDtOYOb9gysZ/LTZuIVuT5bcQdeOAD3v7db698LPt+uSfZrW/0Tzr57dT+6SSDMhQf
+                MeATjr071zdhJfaN8K9HX4VQx67ALh1RtROwmIvKXbkxciTAHt2PWsvwDbf8I18PNeutR8Q/8JH5
+                GlJJcaJcSZ/s/ZFIWtnUs+zPKEFR9zpxgWPAHxSs7+BIrnwvB4U8PCJ2tb6WcR2kkm/mNCY0TcSX
+                bAOflbjrgAkj8H+CNG0ub4VNq+pCfWn+3LG2DKQuDlXEewD/AEc8Hng+ork/iT8TLLw74eh8EeF7
+                iC9jhtJ9I1D7XBJ5kIRFiGG+VS33+QCMgduvSaR8QJtR8WWV74j+G8mgpGjIde1EFRartbA8x4V2
+                hmO0DcOX75wfLPi5ff2/4htItO8G/wBneZd3C299bw5/tnc67ZEIQeZnhgQWz5nXnkA9L+A174rf
+                w7Z2l3plpH4XS3mazvVYebJL55yrDeTjJk/hH3Rz6+eeFvht8T/CPiO01yw8NQSXVrv2JPdwlDuR
+                kOQJQejHvVf4ceK/GHgrxDcab/Yeuat5Foy/2LvmT7PudH8zy9rbevXaP9Z1551PGviT4m+KNZhv
+                dL8PeLtCgS3WJra1NztdgzHedqKMkMB0/hHNAHP+MvGupeM/FWl6X41gtNOg0u9e3u2sEbdGrOiz
+                HlnBKhOMA/jWh4+8A+ENG+H2neKfCup6lfQXt6LdHuioUriTcQvlqwIaPHPvVPwDqV5p+o69/aPw
+                9n8X3zyp9o+0W5lktZAZN2/MTkMxJznBynft7/4WufDfirw5aaVf+HtK0+6h3zv4cnjjZ7PDsA5h
+                KgruDBs7R/rPfJAOfsbG4gvI/iV8So/7F1PSM2scVmwkgMDAqrMq+YxYvO44YdF46k+oWF9b6np1
+                tf2cnmWt1Ek0L7SNyMAVODyMgjrXzJ4K0HUvido01rqnxNu7eeS4aJdJup2uGnVFWTeEaUEjOf4T
+                jYTnjj6T0LTP7E8PaZpPned9htIrbzdu3fsQLuxk4zjOMmgD508cXvhSx+O/iOXxhpl3qGnm3hWO
+                K1Yqwl8mHDHDpxtDDr3HHofCbV9f8K+FbrxPJfxnwdZXrrf2EUatcSysiIrJuUcbniJ+ccKePXo/
+                iJ4p0bwB471LX9AvPtXi658q1vbC8idoIoDEjblKhfm/dxfxn7zcenQeKfjr4YtPDl3P4a1SC91d
+                dn2eCe0nCPl1DZJVei7j1HT8KAMPxL471P4leFdXl8E3UmnafpdlM2sxajDGGuYnQ4WPAfnbHKDy
+                v3hz6aHwG8a6bfeHbPwfFBdjULC3muJZGRfKKmcnCndnP7xeoHQ/j5B4bPgvxRrOu6p481e70ue5
+                uPtEC2EbFXaRnaQf6uQgA7cZPfvWxqUl94xt1+HPgOGPVtB0pxfWtxKfKuHBB3lzIUXAedgAFBwB
+                15JAPR/HHjXTfHnwI8R6ppcF3DBFcQ27LdIqsWE0LZG1mGMOO/rXceGtSh0b4R6RqlwsjQWWhQ3E
+                ixgFiqQBiBkgZwPUV53FrenfBPxpYeEUuMeGr2JtQu7u8RpZ45GDoAvlgDbmGPjYTy3PpqT+Erv4
+                u3Et34qhkstFtXMmgXOnSIrXdvKc75A+8g7UiIBCH5jkdgAR/wDDR3g//oG65/34h/8AjtchonwM
+                +IHhzWINW0nWtDt76Dd5cvmSPt3KVPDQkHgkcijW5fDWm6xP8LvE2oz2XhXRdt1Z3kSM93JO6h9r
+                lUZSv7+Xog+6vPrh+AfAPhDWfh9qPinxVqepWMFlem3d7UqVC4j2kr5bMSWkxx7UAez3vhK08N/D
+                TxXdmGP+2tR0eaTVrmOR2W4uBC5dwDwoLO5woUc9BwBw+l3vhSx/Z38My+MNMu9Q083sqxxWrFWE
+                vmXGGOHTjaGHXuOPTpP+Fv8AgTQfBv2DQ9d+03Vhp/k2KXFpP+9eOPEYc7FHJAz069q84+HvxMsv
+                +Fq6t4r8V3EFh9u0/wAkmCCRk3gwhQFG5h8sZPNAHRg+NLr4kaX4A8f6vaatpeqW7XE9vaxrGrqq
+                yMgLrGjgh4QeD2HXJFWNf02bw/rNhpfiFo7uea4Nv4Ga2J26WysqxmfhSwBNt94S/cbrn5qF78Kf
+                EngPx5p2seANNk1WC3tyxfUbmHAlYSIy4DRnAUqR7nqela/iT4z6rbXGhaL4fg0278STP9k1Wzmh
+                kCwXeUXy0YsqkbzIM7mHA5xyQDvPB3g59Kl/t7XvIuvF1zE0N9qEDtslTcNgCYVRhEjHCD7vfJJp
+                +NfizoPgPWYdL1S01KaeW3W4VrWNGUKWZcHc6nOUPb0q5F4xfw54LsNW+IPkaRfTStDLHAjSor5c
+                oBsL9UXPU/h0ryj4a+JLzwj8AfEOuWEcEl1a6qNiTqSh3C3Q5AIPRj3oA6fxFpOqWHh6Txv8OLmD
+                Ro9RtJNX1f7X+8kuAU81MK6yKrDdLwpUZYdQBjkPB2t6j40l87wzcfY/iM8TSapq94iiCe1VgoRU
+                AZQ3/Hv0jX7jc8nd5P8A8JJef8Jl/wAJR5cH27+0P7Q8vafL8zzPMxjOdue2c4717X4K/aClvtZm
+                i8YHTdP08W7NHLa20zMZdy4U4Z+NpY9Ow59QDzDWvFGi6V4xsta+HNpd6Mltb7f9KAkbzTvVmAdp
+                BgowH58d6+s/Cd9can4N0O/vJPMurrT7eaZ9oG52jUscDgZJPSuP+CnhbWfCPg28sNcs/sl1JqDz
+                KnmpJlDHGAcoSOqn8q9IoA8f+PHhP+0/DNveaN4f+16vJqEfnzWdl5k7RiKQfMyjcVGEHPHC+1eI
+                S33/AAjvgu/8L6z4N8jV7yVbmDUryHyp4Y8p8qhk3bT5bjIYD5m98/Q/xr8U6z4R8G2d/od59kup
+                NQSFn8pJMoY5CRhwR1UflXlHxM/4l2mT6f47/wCJp44lijk0/UrP5YIbXzPuMBsBbKz/AMB++vPo
+                Ad/p+n6Pp/h7wDFF8OLHWf7XtLdb2+WxRvsuUizJIfLbOd7NkkfdPPpl6FPoPhP9o3xOksum6Np6
+                6YiRKzJbxBitu2F6DJ+Y4Hua5z4bax8U/F2nTWHh7xNY2lrpEUEIS7t4xhCGCAEQsTgR9/brWH8U
+                fAPi/RgfFXinU9Nvp724S3d7UsGLeWdpK+WqgBY8ce1AHvevfDaz8RfEXTPFF/PBPa2dobZ9NntB
+                Kk3+swxJOODIDjafu/lc8SeG5prjQr2y8QyaBpehv5tzbQgxwTwqUOx8OqqgVCOQQAx49fmz/hdv
+                xD/6GH/ySt//AI3Xpfww8S+KPiV4V8baXq2px3M7WS29q0kKRLG0qTKSfLUHGQvY9OKAOk8Y654P
+                ki/tHRvDGh+NtXllVZ4LNYbidYwpHmMVR22jCLkjHzKM9BXP/GjwL9g8K32saNqP9laRbxQrPoln
+                B5UFxIZgPMYKwXd8yclSf3a89MZHhvw3eaHqMnhPwnJBp/xCsYjJqeqysZLSa1YhgiBg3zfvIP8A
+                lmv3G5/vc38Ufi9P4xJ07RJru30Ga3Rbm1uoIgzyrIX3BhuIHCdGHQ8eoB6Xp+n6Pp/h7wDFF8OL
+                HWf7XtLdb2+WxRvsuUizJIfLbOd7NkkfdPPpxGsCz8O/HTxDBYeA4PEFqlpEqaXBagpDmOFjIEEb
+                Ac5GcD7/AF555vw18TviDNcaR4c0vX44Ed4bG1WS1hKoCQiAnyycDjnk/Wo/EPiHxt4H+JmrXNzr
+                MDeIWijhuruCGNkkQpGwADIAOAn8I6fmAfVepeJdB0a4W31TW9NsZ2QOsd1dJExXJGQGIOMgjPsa
+                8A0r4V6l418deJ9ZTUrvRYI9Ta6069W0ZluleWRlkik3KCAArBlJ+8D6Z6/V/CVpY+E73xP8XIY/
+                EGoWbrGk2nSPGRbsyqibV8pSQ7uSSM4PU4AHmlh8UvGV54httA8L6z9h0ya7Sy0uC4tYT5EJcJEr
+                sUZjtXaCcseOpoA9P8WeItH+H/gaw0bX5bHxvqdtd7ZoL+ZPOG8SOsjI/mMMKVUE9mHIzivNPEur
+                ab4I8Eah8PtL1C08Qwao6XzarazKqwtvT90UUuCcQA53D744453Pi74OfSvANhr2veRdeLrnUFhv
+                tQgdtkqbJdgCYVRhEjHCD7vfJJz/APhWdlp3/FCahbwS+ONS/wBK0/UYp5PskMA5Kv0O7EM3/LNv
+                vLz6AHf6fp+j6f4e8AxRfDix1n+17S3W9vlsUb7LlIsySHy2znezZJH3Tz6eeeKvBug6r8a9f0aX
+                V9N8L6fBbxSxO0SJFu8qH5FXcgBO9m4PY8Vc8V6x8U/hZp2jWF14msWtZImhtUtLeOTy0iCDBLwg
+                9GX16HNZ9j8L/GvxQs4/GU2raVJJqOctOzRufLJi5VI9o+52/nQBc+HnjjXvFFk3gCXVdSi1DVLh
+                5Ytda9eSW1VEV9irkEg+Uw4cf6w8ev0fpNnNp2jWNlcXcl5Pb28cUlzJndMyqAXOSTkkZ6nr1NfP
+                miReGtN1iD4o+GdOnsvCui7rW8s5XZ7uSd1KbkDOylf38XVx91uPX6D0nUodZ0ax1S3WRYL23juI
+                1kADBXUMAcEjOD6mgDj9X8a6l4V8WXsnieC0sPBxRY7HUFRpJZbgqrbGVGYgcTc7APlHPPPkHgfx
+                rqXjz47+HNU1SC0hnit5rdVtUZVKiGZsnczHOXPf0r1/V/Dem23iy98QeLfENpPoN0ixW+k6sF+y
+                wTBVAdPMcpvwknRQcO3PXPzhrXiSbxR4xsr3wb4ek0K8S38qK20YnzHYbyzjykU5KsQcDovXFAHe
+                XXw40eT4h6x/wndzfaV/bWqyf2H9kdH+175WznCvs+/F97b94+hxr+JPg18NvCOnR3+ua9rlpayS
+                iFX3JJlyCQMJCT0U/lVTSbPUo7exsri7u/FuqaskcUlzJumn8JzMAC5yXZHDPnrEc2/Xj5cfV7zX
+                vhz4svYfFtpqXjPQURYreTVt4tWmZVcOnmCRN6jzE45xu5HIoA2Ph/e+K/iN8T9I8c3umWiafpyS
+                2Ms1qwRVPlSEAozlyczDkccj0NU/Fnhj4Y6n4h1yGz8RarJ4quru4WGx2ERtes7BYtxhwFMhC5LY
+                x/F3r1/W9H0f+x5/CGgatY+GNTv9s8K2GyKbhgWdY0ZGbKxspI7A+mK5fxX8H7PUNO0a7i12DRr7
+                SImlvdXW0CyXUgCEzyPvUhgUZ9xYnLE57kA8k8A/C4az8QdR8LeKlu7GeysjcOlrNGWDZj2gthlI
+                KyZ49q9P8W+LbTxrYSok0bfDdkWPVtYijdLi3uFfcqIrfMQW8gEiNhhzyMEjzTTvGP8AwrP4oatf
+                f2h/wmG+0W2+3/a9vnbhE+7f+8zt27MZPTtjFep+HfFum658JtY1TS/h7aSQQ3oibQrVFkW5b9yd
+                5CxYJAYH7p/1Y59ADiPhtHYw+Ffi5Fpc0k+npZOtrLIMM8QS52MeByVweg+gqn4e+IXj3wP8M9Ju
+                bbRdKbw80skNrdz5Z5HLyMQQsoI5D/wjp+e/daNrHjXw9rEuk+Gb7wH/AGfaSNJY2lq6/wBs7kbE
+                ZCrHu27CuCH/ANceB35zSPifD4T8J2Xg3xH4Bjv3052cx6i4QhnZnB8p4jtO2TAPofegCv4Bkvp/
+                h9qOm61DHbeAJr0tqeqRHNxBKBGUVFySQXWEH923DHkdR7n8NrjXZNOmtryygj8PW0UEeg3akeZd
+                2oDBHkG44YoIjyqcseB0HknjLSdS1j4eap4li0+78G6faPHby+G1haOK7bzE/fsMIM/vFGSh/wBU
+                OfTQ8LeKdS8AeFba9srq78bQXdlFLc20NyxXQ1RM7Hx5gQEMRyE/1J444AO78U+FtZ8f+I7vQNfs
+                /svhG22XVlf2cqLPLOEVdrBi3y/vJf4B91efXhL39n2JPHmnWloNSk8Lvblry9a5h82OXEmFUbQc
+                ZEf8J+8efTs4vjB9v8F2GsaNoX9q6vcSss+iWd35s9vGC48xgqFtvypyVA/eLz0zy+j+OvEniL46
+                eHoL/TtV8P2r2kqvpc88gSbEczCQoVUHnAzg/c68cAGR/wAIx8MdB8Q+TofiLVbnxVYXe2xsbhD5
+                ct7G+I4nbyVG0yAKTuAwfvDrWvb/ABK+LV34ou/DUHhnQ31e0iE09vkjYhCkHcZ9p++vQ9/rVDx/
+                8KbPRNR1fxXL44gsL6aW51KytWiEUjyAmQJG/mglgSoyBnJBxXofwcghvfAOl+ILuKOfWrpJkuNR
+                lUNcTKJmADyH5mACIACeij0FAHzpFF4l+EnjSwvb3ToIdThiaaGGd1lRkcPHk+W/+93HSvrvw1qU
+                2s+FdI1S4WNZ72yhuJFjBChnQMQMknGT6mvCJPhPpvizVIUl+L9prOoMmyJWK3EpUZbC/vycD5jg
+                e5r3vQtM/sTw9pmk+d532G0itvN27d+xAu7GTjOM4yaAOT+LPgrUvHnhW10vS57SGeK9S4Zrp2VS
+                oR1wNqsc5cdvWuP8Lz/C/SvDVz8RtF8N6lappNwbf5pWaXc4RCVVpihGJh1Pr7V2Hi3xrqSX8vh/
+                wRBaan4otXWS7srpGVY7cpkuHLIpOXi4DE/MeODjxz4mfELx7/Zk/hTxXoulWH26KOYiDLPsEmVI
+                YSso+aMjmgCTwJq+v3Pirxj4t8P38dpoMN6NS1W2mjUzz22+WTYgKsA+wSD7yjJHPcdH4k8SWeua
+                dH4s8WRz6h8Pb6UR6ZpUSiO7hulBUu5Ur8v7uf8A5aN99eP7u59i8KXOjfCmXxBqd3aahDb2zaVF
+                CpKzy7YPlfCNgbhGOq9Tz6WL/wCL0Hh/4qax4e8QzWlnotpbo0FwsErytKyRNtbbuGMO/wDCOg59
+                QDm7jx14f+Ifii0bwlZX1h44MRh07Ur9VEMKKGeQModwcoZQMo3LDp1FfXPiZe6t4h8O+CBcT+Yb
+                saR4k3QRiO9LOkUnlsPmVT+95AQ4YdD0oaJ8R9Y+LesQeB9ftrG20zU93nS2COky+WplXaXZlHzR
+                qDlTwT061l+JfCnwj0a31e0t/FGstrVkk0cdtJGSpuEBAQkQAY3DGcge/egCvrnwuOs/GDW/C3hZ
+                bSxgsreO4RLqaQqFMcW4BsMxJaTPPvXq/g/TZvgt8MtUuPEbR3SR3v2gjTiXO1xFEB84TncMn2/K
+                vKPhdofxE0YjxV4W0C0voL23e3R7qeMKV8wbiF8xWBDR45966/4eDxp8K7JovE2kWlh4T+0PcX18
+                0izSxMyKiBRHISQXWMfcP3j0HIAPZPt1xr3g37focn2a6v8AT/OsXuFH7p5I8xlx8w4JGevTvXzJ
+                fyWOjfFTWF+KsMmuzi3RXbTjsBlKRFG4MXAjyD79j1qPx18Vb/xF4ysL+CKxe10LUJJtNdYpF85P
+                MUoZAzZ5Ea9NvU9O1zUvGHjf4026+HLfSNNle2cXxW1zE2FBTJMkmMfvOnXp70Aep2Pgv4i6xeR2
+                HjrXtK1Xw1Ln7ZZwDy3kwCUwyRIRhwh4YdO/Q82viLwBo1x4i8B+GNE1Kx1TV3k0ZppG3wGbLwox
+                LSswQM5OQucHoelcR4PsPHniD4Zap4e8PaJaXmi3d7unuGlRJVlURNtXdIoxhE/hPU8+nsehfFLw
+                b4Z8PaZoGr6z9m1PTLSKyvIPssz+VNGgR13KhU4ZSMgkHHBNAHEeG/Dd5oeoyeE/CckGn/EKxiMm
+                p6rKxktJrViGCIGDfN+8g/5Zr9xuf73q/jGLw14cl/4WDq2nTz32lRLDHNA7F1R2KYCFwh5lbr6+
+                wrz/AOI+t6d8W/D1voHge4/tXU7e7W9lg2NBthVHQtulCqfmkQYBzz04NdJ8UZL6cnTdahjtvAE1
+                ujanqkRzcQSiQlFRckkF1hB/dtwx5HUAGp4n8LaN8UPBtrftZ7rqXT3m0t7iV4/IeaMFS4Q4OCEz
+                97p378PokviXTdHg+F3hnUYLLxVou66vLyVFe0kgdi+1CyMxb9/F1Qfdbn15D/hIfBPg7/iTeEtZ
+                nv8ASPEH+i67PewyeZawfd3Q4RPm2yynlX5VeOxp+D/APhDxj8TdU0TTtT1KfQYLL7RbXKlUldgY
+                gwbdGONzuPujoPxAK9h4w8EeH/ipo/iHw9pGpWei2lu6z27YeVpWSVdy7pGGMOn8Q6Hj1+p9J1KH
+                WdGsdUt1kWC9t47iNZAAwV1DAHBIzg+pryv9nH/knmof9hWT/wBFRV7BQB4/4h+I/wDYPxM1bTNG
+                +Hn9ravDFH597Zn9/LGUjb5tsTNtGUHJI4X2rL1Lx1qWs3C3GqfAu7vp1QIsl1bNKwXJOAWtycZJ
+                OPc1qeHv+TofFn/YKj/9Bta8g/4Xb8Q/+hh/8krf/wCN0Aenw/EzzvEPhnSdb+Fn9m77uK206W9G
+                37Nl0XdCGhGNvyHCkdF6cV1CeBfDd/8AFzWtYv8AUdK1W6uLRFfRJ4I5Xt8LEBIQWJ6KOdo/1nX1
+                4/xnfXGp6j8Fb+8k8y6upYJpn2gbnY2pY4HAySelVNU8a6b4D/aI8TapqkF3NBLZRW6raorMGMdu
+                2TuZRjCHv6UAdfovwXh0Pwde6XaaxHHrU1x5tvrsVkI7i2X5AUQh9wBCuDhhxIeOubHg34Oab4eu
+                NUuNentPEs986P5l/YKzRsC5Y5dnJLFgSeOnepPC3xr8N+LvEdpodhZarHdXW/Y88UYQbUZzkiQn
+                op7Vx/jr4tatf+MrDwv4LvJ9Nvk1CTT7uS7t4mjkkMixoQSHO0EPzgHBHB7AHrH9u+D/AAz/AMSj
+                +1dD0r7P/wAuX2iGDyt3zfcyMZ3Z6c5z3r50+KPiTxt4oJvbvw94g0LRUt0iuLaUzfZ3YSEh3yir
+                klkAyOqjnpW54Y8HP4j+NuvaT8QfI1e+h09ZpZIHaJGfEAQjYE6I2Og/HrXV/Hnxrptj4dvPB8sF
+                2dQv7eG4ikVF8oKJwcMd2c/u26A9R+ABJp+n6Pp/h7wDFF8OLHWf7XtLdb2+WxRvsuUizJIfLbOd
+                7NkkfdPPpxGsaHZx/HTxDp1h4ng8E2sVpEyTwMLdGzHCTGAHQcklsZ/hzjvQNY+Kfh3TvBVhB4ms
+                Utddihh01Ft428lMRhBIWhzwJF6buh69+r0X4MarqvjG91r4jT6brKXNvt/0WaSNvNGxVYhFjGAi
+                kflx3oAk0HWfDfwg+HWppYeJtK8S3QuxcpbwXUcTvv8ALjKgBnPABbOPy61xk/hfwrdXEvj648Za
+                NNPK51mTw9IYmZ2J842hYyZJJ/d52f8AAe1b9l8KfDfgPwHqOseP9Nj1We3uAwfTrmbIiYxoq4LR
+                jIYsT7Hqelch8XfDXhfRtG8J6p4Y0ySxg1e3kuGWSZ3YrtiZAdzMAQHPQ9+9AB4Ps5viN8TdUm8O
+                XcngxHsvNEenZIVVMSFPkMfDN859+x61c+PHiz+0/E1vZ6N4g+16RJp8fnw2d75kDSCWQ/MqnaWG
+                EPPPC+1Hwz/4mOmQaf4E/wCJX44iikk1DUrz5oJrXzPuKDvAbLQfwD7jc+vB+NfBWpeA9Zh0vVJ7
+                SaeW3W4VrV2ZQpZlwdyqc5Q9vSgD3vT9P0fT/D3gGKL4cWOs/wBr2lut7fLYo32XKRZkkPltnO9m
+                ySPunn04jWNDs4/jp4h06w8TweCbWK0iZJ4GFujZjhJjADoOSS2M/wAOcd6BrHxT8O6d4KsIPE1i
+                lrrsUMOmotvG3kpiMIJC0OeBIvTd0PXvh3/gHxf4x+KmsaJqOp6bPr0Fulxc3LFkidQkQULtjHO1
+                0H3R0P4gEnw48Y+X4euPAn9of2F/aV21z/b/ANr8v7JtRG27flzu8rbnePv9+h+n9Ci8nw9pkX9o
+                /wBpbLSJft27d9pwg/eZyc7vvZyevU18mXukaB488eado/gCwk0qC4typTUZGwZVEjs2Q0hwVCge
+                46DrX1f4a02bRvCukaXcNG09lZQ28jRklSyIFJGQDjI9BQB423inRvCP7SHii/1y8+yWsmnxQq/l
+                PJlzHbkDCAnop/KuY/4R74Gf9Dnrn/flv/kevoe+8J+G9TvJLy/8P6Vd3UmN809lHI7YAAyxGTgA
+                D8Kr/wDCCeD/APoVND/8F0P/AMTQB4p4i8S+F9Z8VfC3S/DGpyX0GkXsNuzSQujBd9uqE7lUEkIe
+                g7dq7e/1z4d+DviprGt6jr93Br09ulvc2zQSPEilIipXbGedqIfvHqfw7iDwX4VtbiK4t/DWjQzx
+                OHjkjsIlZGByCCFyCDzmpL7wn4b1O8kvL/w/pV3dSY3zT2UcjtgADLEZOAAPwoA+fPhN8JtB8eeF
+                brVNUu9ShnivXt1W1kRVKhEbJ3Ixzlz39K7v4j+CfEX/ABQn/CIaf/aH/CN52/aJo1+55Pl78sm7
+                PlnO3H4cV6ppuk6bo1u1vpen2ljAzl2jtYViUtgDJCgDOABn2FXKAPmTxbqvxI+I1/L4GvfD+mpq
+                GnOt9LDayBGUbMAl2lKEYmHA55Hoax7COx0b4qaO3wqmk12cW7si6iNgMpSUOvIi4EeCPfuelfU8
+                ek6bDqk2qRafaJqEybJbtYVErrxwz4yR8q8E9h6VTsfCfhvTLyO8sPD+lWl1HnZNBZRxuuQQcMBk
+                ZBI/GgDwj4ceMX0HxD47h1PyIPFWqXYWzsdjNHLe75h5W5SQF8x1XJYDB+93ro9F8S+F/DPjG98Q
+                +NtTk0zxrdW/2fUdOiheS3hX5DGUKK/JjSIn525Y9Og9U/4RPw3/AGj/AGj/AMI/pX27zfP+0/Yo
+                /M8zO7fuxndnnPXNF94T8N6neSXl/wCH9Ku7qTG+aeyjkdsAAZYjJwAB+FAHm/h74e+AvA/xM0m2
+                tta1VvELRSTWtpPhkkQpIpJKxADgP/EOn58R478U6N4O1HxLYeErz7fdeIJbqHXUvYn/ANFfLDEJ
+                AQdZZeu/7q/j9FyaTps2qQ6pLp9o+oQpsiu2hUyovPCvjIHzNwD3PrWfP4L8K3VxLcXHhrRpp5XL
+                ySSWETM7E5JJK5JJ5zQB8seEvBWmvYReIPG893pnhe6Ro7S9tXVmkuA+AhQK7AYSXkqB8o55GTSr
+                3xWnwa1y0tNMtJPC73qteXrMPNjlzDhVG8HGRH/CfvHn0+r5PDWgzaXDpcuiaa+nwvvitGtUMSNz
+                yqYwD8zcgdz60R+GtBh0ubS4tE01NPmffLaLaoInbjlkxgn5V5I7D0oA8T+G138NbDw9NoEXiG+O
+                p+J7SCyvYGhf93M6MhWNvK2j5pWGSWHA59bHxl8N2fhH4M6LodhJPJa2uqjY87AudyzuckADqx7V
+                65B4L8K2txFcW/hrRoZ4nDxyR2ESsjA5BBC5BB5zWhqWk6brNutvqmn2l9Arh1juoVlUNgjIDAjO
+                CRn3NAHhHwp8Fab4V8Z6fH4nnu7DxiXlksdPV1kiltzEy72ZFYA8TcbwflHHPP0HVOTSdNm1SHVJ
+                dPtH1CFNkV20KmVF54V8ZA+ZuAe59auUAf/Z
+                """;
+        try {
+            // 解析二维码
+            String qrContent = parseQRCodeFromBase64(base64Image);
+            System.out.println("二维码内容: " + qrContent);
+
+            // 判断是否为链接
+            if (qrContent.startsWith("http://") || qrContent.startsWith("https://")) {
+                System.out.println("这是一个链接: " + qrContent);
+            } else {
+                System.out.println("这是文本内容: " + qrContent);
+            }
+        } catch (IOException e) {
+            System.err.println("图片处理失败: " + e.getMessage());
+        } catch (NotFoundException e) {
+            System.err.println("未找到二维码: " + e.getMessage());
+        }
+    }
+}

+ 19 - 0
tenant/insurance/quotation-commons/pom.xml

@@ -42,6 +42,25 @@
             <version>3.1</version>
             <scope>compile</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.17.2</version>
+        </dependency>
+
+        <!-- ZXing 二维码解析库 -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.5.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.5.3</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 15 - 21
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -127,7 +127,7 @@ public class RequestComponent {
     public static Consumer<HttpHeaders> setHeaders(HttpHeaders headers) {
         return httpHeaders -> {
             httpHeaders.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36");
-            httpHeaders.add(HttpHeaders.ACCEPT, "application/json");
+            httpHeaders.add(HttpHeaders.ACCEPT, "application/json,text/html,text/json,*/*");
             httpHeaders.add(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9");
             httpHeaders.add(HttpHeaders.CACHE_CONTROL, "no-cache");
             if (headers != null) {
@@ -301,17 +301,16 @@ public class RequestComponent {
         }
     }
 
-
     /**
-     * 发送post请求,返回的content-type:text/json;charset=UTF-8
-     * @param url           请求地址
-     * @param body          请求体
-     * @param responseClass 响应类
-     * @param headers       请求头
+     * 构造post请求,返回的content-type:text/json;charset=UTF-8
+     * @param url
+     * @param body
+     * @param responseClass
+     * @param headers
      * @param <Response>    响应实体
      * @return <Response> ResponseEntity<Response> 响应
      */
-    public <Response> ResponseEntity<Response> post2(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> post(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
         body = Optional.ofNullable(body).orElse("");
         log.info("URL的值:{},body的值:{}", url, body);
         WebClient webClient = selectNoSSLWebClient2();
@@ -325,7 +324,6 @@ public class RequestComponent {
                     .body(BodyInserters.fromValue(body))
                     .retrieve()
                     .toEntity(responseClass)
-                    //.bodyToMono(responseClass)
                     .block();
         } catch (WebClientResponseException e) {
             e.printStackTrace();
@@ -334,15 +332,15 @@ public class RequestComponent {
     }
 
     /**
-     * 构造post请求,content-type:multipart/form-data;(应用场景:上传影像件)
-     * @param url
-     * @param body
-     * @param responseClass
-     * @param headers
+     * 发送post请求,返回的content-type:text/json;charset=UTF-8
+     * @param url           请求地址
+     * @param body          请求体
+     * @param responseClass 响应类
+     * @param headers       请求头
      * @param <Response>    响应实体
      * @return <Response> ResponseEntity<Response> 响应
      */
-    public <Response> ResponseEntity<Response> post3(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> post2(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
         body = Optional.ofNullable(body).orElse("");
         log.info("URL的值:{},body的值:{}", url, body);
         WebClient webClient = selectNoSSLWebClient2();
@@ -350,7 +348,6 @@ public class RequestComponent {
             return webClient.post()
                     .uri(url)
                     .headers(setHeaders(headers))
-                    .header(HttpHeaders.CONTENT_TYPE,"multipart/form-data")
                     .header(HttpHeaders.ACCEPT, "application/json,text/html,text/json,*/*")
                     .header(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9")
                     .header(HttpHeaders.CACHE_CONTROL, "no-cache")
@@ -365,7 +362,7 @@ public class RequestComponent {
     }
 
     /**
-     * 构造post请求,返回的content-type:text/json;charset=UTF-8
+     * 构造post请求
      * @param url
      * @param body
      * @param responseClass
@@ -373,7 +370,7 @@ public class RequestComponent {
      * @param <Response>    响应实体
      * @return <Response> ResponseEntity<Response> 响应
      */
-    public <Response> ResponseEntity<Response> post(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
+    public <Response> ResponseEntity<Response> post3(String url, Object body, Class<Response> responseClass, HttpHeaders headers) {
         body = Optional.ofNullable(body).orElse("");
         log.info("URL的值:{},body的值:{}", url, body);
         WebClient webClient = selectNoSSLWebClient2();
@@ -381,9 +378,6 @@ public class RequestComponent {
             return webClient.post()
                     .uri(url)
                     .headers(setHeaders(headers))
-                    .header(HttpHeaders.ACCEPT, "application/json,text/html,text/json,*/*")
-                    .header(HttpHeaders.ACCEPT_LANGUAGE, "zh-CN,zh;q=0.9")
-                    .header(HttpHeaders.CACHE_CONTROL, "no-cache")
                     .body(BodyInserters.fromValue(body))
                     .retrieve()
                     .toEntity(responseClass)

+ 11 - 4
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.summary.controller;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.constants.CompanyConstants;
@@ -357,10 +358,10 @@ public class UnifyOrderManager {
     }
 
     /**
-     * 获取支付连接
+     * 获取支付链接
      *
      * @param paymentLinkVo
-     * @return
+     * @return HttpResult
      * @throws JsonProcessingException
      */
     @OrderOperationLog(
@@ -374,10 +375,10 @@ public class UnifyOrderManager {
     @Operation(summary = "获取支付链接")
     @PostMapping("/getPaymentLink")
     public HttpResult getPaymentLink(@RequestBody PaymentLinkVo paymentLinkVo) throws Exception {
-        //获取保司实体
         InsOrders insOrders = insOrdersService.getById(paymentLinkVo.getOrder().getOrdersNo());
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
         InsOrdersCarInfo insOrdersCarInfo = insOrdersCarInfoService.getByOrderId(insOrders.getId());
+        //获取保司实体
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(insOrders.getCompanyId(), baseController.getToken());
         paymentLinkVo.getOrder().setInsuranceCompanyCode(esmInsCompanyHttpResult.getData().getCompanyCode());
         paymentLinkVo.getOrder().setInsuranceCompanyId(esmInsCompanyHttpResult.getData().getId());
@@ -394,6 +395,7 @@ public class UnifyOrderManager {
         paymentLinkVo.setInsOrdersCosts(insOrdersCosts);
 
         PaymentLinkResultsVo paymentLinkResultsVo = quoteService.getPaymentLink(paymentLinkVo);
+        log.info("paymentLinkResultsVo对象的值:{}", JSON.toJSONString(paymentLinkResultsVo));
 
         // 保存支付链接
         insOrders.setPayLink(paymentLinkResultsVo.getPaymentLink());
@@ -447,7 +449,12 @@ public class UnifyOrderManager {
         }
     }
 
-
+    /**
+     * 获取订单状态
+     * @param orderStatusVo
+     * @return HttpResult
+     * @throws Exception
+     */
     @OrderOperationLog(
             module = "车险订单",
             subModule = "订单详情",