Bläddra i källkod

中煤报价 核保 上传影像

Qchen 5 månader sedan
förälder
incheckning
5e3f13ff86
13 ändrade filer med 285 tillägg och 129 borttagningar
  1. 6 14
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  2. 18 2
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java
  3. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/impl/ExteriorUtilsRequestImpl.java
  4. 72 45
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerSubmitResultVoBuild.java
  5. 70 23
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/component/ZmCrawlerRequestComponent.java
  6. 8 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerOrderStatusRequest.java
  7. 16 3
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java
  8. 6 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Response/ZmCrawlerActualValueResponse.java
  9. 1 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Response/ZmCrawlerImageImportResponse.java
  10. 20 19
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerQuoteProcessServiceImpl.java
  11. 63 20
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java
  12. 2 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZmCrawlerOrderServiceImpl.java
  13. 2 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/ZhongMeiCrawlerQuoteProcessService.java

+ 6 - 14
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -1,9 +1,11 @@
 package com.jzg.quotation.commons.component;
 
 import com.alibaba.fastjson2.JSON;
+import com.jzg.commons.constants.quote.enums.base.InsuranceEnum;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.config.WebClientConfig;
 import com.jzg.quotation.commons.entity.CookiesRequest;
+import com.jzg.quotation.commons.utils.InsuranceLog;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -580,13 +582,11 @@ public class RequestComponent {
      * @param <T>           响应实体
      * @return 响应
      */
-    public <T> Mono<T> postGbk(String url, String body, Class<T> responseClass, HttpHeaders headers) {
+    public <T> Mono<T> postGbk(String url, String body, Class<T> responseClass, HttpHeaders headers,String type) {
         if (log.isDebugEnabled()) {
             log.debug("request body is {}", body);
         }
-        System.out.println(body);
         body = Optional.ofNullable(body).orElse("");
-        System.out.println(body);
         return webClient.post()
                 .uri(url)
                 .headers(setHeaders(headers))
@@ -596,7 +596,8 @@ public class RequestComponent {
                 .map(responseBody -> {
                     // 将解码后的响应体转换为 Java 对象
                     try {
-                        System.out.println(responseBody);
+                        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 响应参数:{}",
+                                "爬虫" + type,url,responseBody);
                         return JSON.parseObject(responseBody).toJavaObject(responseClass);
                     } catch (Exception e) {
                         throw new RuntimeException("JSON 解析失败", e);
@@ -694,19 +695,10 @@ public class RequestComponent {
      */
     public <Response> ResponseEntity<Response> formData(String url, MultiValueMap<String, Object> parts, Class<Response> responseClass, HttpHeaders headers) {
         WebClient webClient = selectWebClient(url);
-//        String block = webClient.post()
-//                .uri(url)
-//                .headers(RequestComponent.setHeaders(headers))
-//                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
-//                .body(BodyInserters.fromMultipartData(parts))
-//                .retrieve().bodyToMono(String.class).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody)) // 打印响应
-//                .block();
-
-
         return webClient.post()
                 .uri(url)
                 .headers(RequestComponent.setHeaders(headers))
-                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+//                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(BodyInserters.fromMultipartData(parts))
                 .retrieve()
                 .toEntity(responseClass).doOnNext(responseBody -> System.out.println("响应内容: " + responseBody.getBody()))

+ 18 - 2
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/config/WebClientConfig.java

@@ -118,8 +118,8 @@ public class WebClientConfig {
         // 配置HTTP连接池
         ConnectionProvider connectionProvider = ConnectionProvider.builder("secure-" + domain).maxConnections(CONNECTION_PROVIDER_MAX_CONNECTIONS).maxIdleTime(CONNECTION_PROVIDER_MAX_IDLE_TIME).build();
 
-        // 获取域名对应的SSL上下文
-        SslContext sslContext = getSSLContextForDomain(domain);
+        // 获取域名对应的SSL上下文 过滤SSL证书
+        SslContext sslContext = getInsecureSslContext();
 
         // 配置带SSL的HTTP客户端
         HttpClient httpClient = HttpClient.create(connectionProvider).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, HTTPCLIENT_CONNECT_TIMEOUT_MILLIS).responseTimeout(HTTPCLIENT_RESPONSE_TIMEOUT).secure(spec -> spec.sslContext(sslContext)).doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(READ_TIMEOUT)).addHandlerLast(new WriteTimeoutHandler(WRITE_TIMEOUT)));
@@ -165,4 +165,20 @@ public class WebClientConfig {
             throw e;
         }
     }
+
+    public static SslContext getInsecureSslContext() throws Exception {
+        TrustManager[] trustAllCerts = new TrustManager[]{
+                new X509TrustManager() {
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[0];
+                    }
+                    public void checkClientTrusted(X509Certificate[] certs, String t) {}
+                    public void checkServerTrusted(X509Certificate[] certs, String t) {}
+                }
+        };
+
+        return SslContextBuilder.forClient()
+                .trustManager(InsecureTrustManagerFactory.INSTANCE)
+                .build();
+    }
 }

+ 1 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/service/impl/ExteriorUtilsRequestImpl.java

@@ -48,7 +48,7 @@ public class ExteriorUtilsRequestImpl implements ExteriorUtilsRequest {
     private String request(String base64String, ExpenseRequestUrl expenseRequestUrl) {
         base64String = prefixToRemove(base64String);
         String url = ExpenseRequestUrl.getUrl(captchaRecognitionProperties.getUrl(), expenseRequestUrl.getUri());
-        Mono<R> response = requestComponent.postGbk(url, JSON.toJSONString(Map.of("captcha", base64String)), R.class, new HttpHeaders());
+        Mono<R> response = requestComponent.postGbk(url, JSON.toJSONString(Map.of("captcha", base64String)), R.class, new HttpHeaders(),"");
         return response.block().getData().toString();
     }
 

+ 72 - 45
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerSubmitResultVoBuild.java

@@ -4,8 +4,11 @@ import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingResultsVo;
 import com.jzg.quotation.zhongmei.crawler.entity.Response.ZmCrawlerSubmitResponse;
 import com.jzg.quotation.zhongmei.crawler.entity.po.ZmCrawlerOrder;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
+import java.util.Map;
+import java.util.function.BiConsumer;
 
 /**
  * @author quchen
@@ -13,52 +16,76 @@ import java.util.List;
  */
 
 public final class ZmCrawlerSubmitResultVoBuild {
-    public static UnderwritingResultsVo build(ZmCrawlerSubmitResponse submitResponse, ZmCrawlerOrder zmCrawlerOrder) {
-        UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
-        if (submitResponse.getHead().getReturnCode().equals("0")) {
-            // 自动核保成功 投保单号
-            if (!submitResponse.getAppliResult().isEmpty() && !submitResponse.getAppliResult().get(0).getSubContractNos().isEmpty()) {
-                List<String> subContractNos = submitResponse.getAppliResult().get(0).getSubContractNos();
-                if (subContractNos.size() == 3) {
-                    underwritingResultsVo.setJqApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setJyApplyNo(subContractNos.get(2));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 2 && zmCrawlerOrder.getProductsCode().equals("0330")) { // 单交
-                    underwritingResultsVo.setJqApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setJyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 2 && zmCrawlerOrder.getProductsCode().equals("034001")) { // 单商
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setJyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 2 && zmCrawlerOrder.getProductsCode().equals("034002")) { // 单三
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setJyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 2 && zmCrawlerOrder.getProductsCode().equals("0330034002")) { // 交三
-                    underwritingResultsVo.setJqApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 2 && zmCrawlerOrder.getProductsCode().equals("0330034001")) { // 交商
-                    underwritingResultsVo.setJqApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(1));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 1 && zmCrawlerOrder.getProductsCode().equals("0330")) { // 单交
-                    underwritingResultsVo.setJqApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 1 && zmCrawlerOrder.getProductsCode().equals("034001")) { // 单商
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                } else if (subContractNos.size() == 1 && zmCrawlerOrder.getProductsCode().equals("034002")) { // 单三
-                    underwritingResultsVo.setSyApplyNo(subContractNos.get(0));
-                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-                }
+    public static UnderwritingResultsVo build(ZmCrawlerSubmitResponse submitResponse, ZmCrawlerOrder zmCrawlerOrder, UnderwritingResultsVo vo) {
+        if (submitResponse == null || submitResponse.getHead() == null) {
+            vo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            vo.setUnderwritingResult("请求参数为空");
+            return vo;
+        }
+        // 核保失败
+        if (!"0".equals(submitResponse.getHead().getReturnCode())) {
+            vo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            vo.setUnderwritingResult(submitResponse.getHead().getReturnMessage());
+            return vo;
+        }
+
+        // 核保成功 获取投保单号列表
+        List<ZmCrawlerSubmitResponse.AppliResultDTO> appliResults = submitResponse.getAppliResult();
+        if (CollectionUtils.isEmpty(appliResults) || CollectionUtils.isEmpty(appliResults.get(0).getSubContractNos())) {
+            return vo;
+        }
+        List<String> subContractNos = appliResults.get(0).getSubContractNos();
+        String productCode = zmCrawlerOrder.getProductsCode();
+
+        // 赋值状态
+        vo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+
+        // 投保单号数量匹配规则
+        int size = subContractNos.size();
+        if (size == 3) {
+            vo.setJqApplyNo(subContractNos.get(0));
+            vo.setSyApplyNo(subContractNos.get(1));
+            vo.setJyApplyNo(subContractNos.get(2));
+        } else if (size == 2 || size == 1) {
+            String mapKey = size == 1 ? productCode + "_SINGLE" : productCode;
+            BiConsumer<List<String>, UnderwritingResultsVo> consumer = PRODUCT_RULE_MAP.get(mapKey);
+            if (consumer != null) {
+                consumer.accept(subContractNos, vo);
             }
-        } else {
-            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
-            underwritingResultsVo.setUnderwritingResult(submitResponse.getHead().getReturnMessage());
         }
-        return underwritingResultsVo;
+        return vo;
+    }
+
+    private static final Map<String, BiConsumer<List<String>, UnderwritingResultsVo>> PRODUCT_RULE_MAP;
+
+    static {
+        // 初始化映射规则:key=产品编码,value=对应赋值逻辑
+        PRODUCT_RULE_MAP = Map.ofEntries(
+                // 2个投保单号规则
+                Map.entry("0330", (nos, vo) -> {
+                    vo.setJqApplyNo(nos.get(0));
+                    vo.setJyApplyNo(nos.get(1));
+                }),
+                Map.entry("034001", (nos, vo) -> {
+                    vo.setSyApplyNo(nos.get(0));
+                    vo.setJyApplyNo(nos.get(1));
+                }),
+                Map.entry("034002", (nos, vo) -> {
+                    vo.setSyApplyNo(nos.get(0));
+                    vo.setJyApplyNo(nos.get(1));
+                }),
+                Map.entry("0330034002", (nos, vo) -> {
+                    vo.setJqApplyNo(nos.get(0));
+                    vo.setSyApplyNo(nos.get(1));
+                }),
+                Map.entry("0330034001", (nos, vo) -> {
+                    vo.setJqApplyNo(nos.get(0));
+                    vo.setSyApplyNo(nos.get(1));
+                }),
+                // 1个投保单号规则
+                Map.entry("0330_SINGLE", (nos, vo) -> vo.setJqApplyNo(nos.get(0))),
+                Map.entry("034001_SINGLE", (nos, vo) -> vo.setSyApplyNo(nos.get(0))),
+                Map.entry("034002_SINGLE", (nos, vo) -> vo.setSyApplyNo(nos.get(0)))
+        );
     }
 }

+ 70 - 23
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/component/ZmCrawlerRequestComponent.java

@@ -3,14 +3,19 @@ package com.jzg.quotation.zhongmei.crawler.component;
 import cn.hutool.core.util.XmlUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.jzg.commons.constants.quote.enums.base.InsuranceEnum;
+import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.MinioUtils;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.constant.CacheConstant;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
 import com.jzg.quotation.commons.utils.DateUtil;
+import com.jzg.quotation.commons.utils.InsuranceLog;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.zhongmei.api.constant.enums.ImageTypeEnum;
 import com.jzg.quotation.zhongmei.api.entity.BaseRequestHead;
@@ -26,11 +31,13 @@ import com.jzg.quotation.zhongmei.crawler.properties.ZmCrawlerProperties;
 import com.jzg.quotation.zhongmei.crawler.util.Base64Tool;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
 import org.redisson.api.RBucket;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.springframework.http.*;
 import org.springframework.http.MediaType;
+import org.springframework.http.client.MultipartBodyBuilder;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
@@ -86,6 +93,10 @@ public class ZmCrawlerRequestComponent {
 
     public static final Duration ZM_SAVE_TIME = Duration.ofHours(3L);
 
+    private final PlatformClient platformClient;
+
+    private final MinioUtils minioUtils;
+
 
     /**
      * 验证码
@@ -99,8 +110,10 @@ public class ZmCrawlerRequestComponent {
             ZmCrawlerCaptchaRequest captchaRequest = new ZmCrawlerCaptchaRequest(username);
             BaseRequestHead head = new BaseRequestHead(null,"2");
             captchaRequest.setHead(head);
-            // 请求
-            Mono<ZmCrawlerCaptchaResponse> monoResponse = requestComponent.postGbk(RequestUrl.CAPTCHA.getRequestUrl(zmCrawlerProperties.getBaseUrl()), Base64Tool.encode(JSONObject.toJSONString(captchaRequest)), ZmCrawlerCaptchaResponse.class, new HttpHeaders());
+            InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                    "爬虫验证码",RequestUrl.CAPTCHA.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(captchaRequest));
+            // 请求验证码
+            Mono<ZmCrawlerCaptchaResponse> monoResponse = requestComponent.postGbk(RequestUrl.CAPTCHA.getRequestUrl(zmCrawlerProperties.getBaseUrl()), Base64Tool.encode(JSONObject.toJSONString(captchaRequest)), ZmCrawlerCaptchaResponse.class, new HttpHeaders(),"验证码");
             ZmCrawlerCaptchaResponse response = monoResponse.block();
             // 识别验证码
             String s = exteriorUtilsRequest.captchaIdentify(response.getVerifyCode());
@@ -135,8 +148,9 @@ public class ZmCrawlerRequestComponent {
         ZmCrawlerAuthenticateRequest authenticateRequest = new ZmCrawlerAuthenticateRequest(captchaResponse, username, password);
         BaseRequestHead head = new BaseRequestHead(null,"2");
         authenticateRequest.setHead(head);
-
-        Mono<ZmCrawlerAuthenticateResponse> responseMono = requestComponent.postGbk(RequestUrl.AUTHENTICATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()), Base64Tool.encode(JSONObject.toJSONString(authenticateRequest)), ZmCrawlerAuthenticateResponse.class, new HttpHeaders());
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫登录",RequestUrl.AUTHENTICATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(authenticateRequest));
+        Mono<ZmCrawlerAuthenticateResponse> responseMono = requestComponent.postGbk(RequestUrl.AUTHENTICATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()), Base64Tool.encode(JSONObject.toJSONString(authenticateRequest)), ZmCrawlerAuthenticateResponse.class, new HttpHeaders(),"登录");
         ZmCrawlerAuthenticateResponse authenticateResponse = Optional.of(responseMono.block()).orElseThrow();
         if ("0".equals(authenticateResponse.getHead().getReturnCode()) && authenticateResponse.getReCode().equals("0")) {
             Map<String, String> authorizationMap = buildCache(authenticateResponse);
@@ -230,10 +244,11 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public List<ZmCrawlerModelQueryResponse.FullCarDataDTO> modelQuery(ZmCrawlerModelQueryRequest modelQueryRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫车型查询",RequestUrl.MODELS_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(modelQueryRequest));
         Mono<ZmCrawlerModelQueryResponse> responseMono = requestComponent.postGbk(RequestUrl.MODELS_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(modelQueryRequest)), ZmCrawlerModelQueryResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(modelQueryRequest)), ZmCrawlerModelQueryResponse.class,new HttpHeaders(),"车型查询");
         ZmCrawlerModelQueryResponse zmCrawlerModelQueryResponseResponse = responseMono.block();
-        System.out.println(JSON.toJSONString(zmCrawlerModelQueryResponseResponse.getCarModel()));
         return zmCrawlerModelQueryResponseResponse.getCarModel();
     }
 
@@ -244,7 +259,7 @@ public class ZmCrawlerRequestComponent {
      */
     public Mono<ZmCrawlerNetpointQueryResponse> netpointQuery(ZmCrawlerNetpointQueryRequest modelQueryRequest) {
         return requestComponent.postGbk(RequestUrl.NETPOINT_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(modelQueryRequest)), ZmCrawlerNetpointQueryResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(modelQueryRequest)), ZmCrawlerNetpointQueryResponse.class,new HttpHeaders(),"网点查询");
     }
 
     /**
@@ -267,17 +282,19 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerActualValueResponse getActualValue(ZmCrawlerActualValueRequest actualValueRequest) {
-        System.out.println(JSON.toJSONString(actualValueRequest));
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫获取折旧价",RequestUrl.ACTUAL_VALUE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(actualValueRequest));
         Mono<ZmCrawlerActualValueResponse> responseMono = requestComponent.postGbk(RequestUrl.ACTUAL_VALUE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(actualValueRequest)), ZmCrawlerActualValueResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(actualValueRequest)), ZmCrawlerActualValueResponse.class,new HttpHeaders(),"获取折旧价");
         ZmCrawlerActualValueResponse response = responseMono.block();
         return response;
     }
 
     public ZmCrawlerRideAccidentResponse rideAccident(ZmCrawlerRideAccidentRequest rideAccidentRequest) {
-        System.out.println(JSON.toJSON(rideAccidentRequest));
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫获取非车险列表",RequestUrl.BASECODESCHME.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(rideAccidentRequest));
         Mono<ZmCrawlerRideAccidentResponse> responseMono = requestComponent.postGbk(RequestUrl.BASECODESCHME.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(rideAccidentRequest)), ZmCrawlerRideAccidentResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(rideAccidentRequest)), ZmCrawlerRideAccidentResponse.class,new HttpHeaders(),"获取非车险");
         ZmCrawlerRideAccidentResponse response = responseMono.block();
         return response;
     }
@@ -288,9 +305,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerQuotedPriceResponse quotedPrice(ZmCrawlerQuotedPriceRequest quotedPriceRequest) {
-        System.out.println(JSON.toJSON(quotedPriceRequest));
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫保费计算",RequestUrl.QUOTED_PRICE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(quotedPriceRequest));
         Mono<ZmCrawlerQuotedPriceResponse> responseMono = requestComponent.postGbk(RequestUrl.QUOTED_PRICE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSON.toJSONString(quotedPriceRequest)), ZmCrawlerQuotedPriceResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSON.toJSONString(quotedPriceRequest)), ZmCrawlerQuotedPriceResponse.class,new HttpHeaders(),"保费计算");
         ZmCrawlerQuotedPriceResponse response = responseMono.onErrorResume(ex -> {
             log.error("Request failed", ex);
             return Mono.empty();
@@ -328,11 +346,21 @@ public class ZmCrawlerRequestComponent {
 
         MultiValueMap<String, Object> formData = RequestObjectConversion.convertMultiValueMap(importRequest);
         JSONObject imageMap = new JSONObject();
+        SysUploadFiles sysUploadFiles = platformClient.getUploadFile(imageDTOS.get(0).getImageId());
+        String fileName = sysUploadFiles.getFileName();
+        InputStream inputStream = minioUtils.getObject("jzg", fileName);
+        byte[] fileBytes = null;
+        try {
+            fileBytes = IOUtils.toByteArray(inputStream);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        imageDTOS.get(0).setImageBase64Str(Base64.getEncoder().encodeToString(fileBytes));
         String base64Str = "data:image/jpeg;base64," + imageDTOS.get(0).getImageBase64Str();
         imageMap.put("base64", base64Str);
         imageMap.put("size", base64Str.length());
-        imageMap.put("orginalName", imageDTOS.get(0).getImageName());
-        imageMap.put("exif", "");
+        imageMap.put("orginalName", fileName);
+        imageMap.put("exif", "%7B'Create%20SoftWare%7C%E5%88%9B%E5%BB%BA%E8%BD%AF%E4%BB%B6':'undefined','Camera%20model%7C%E7%9B%B8%E6%9C%BA%E5%9E%8B%E5%8F%B7':'undefined','CaptureTime%7C%E6%8B%8D%E6%91%84%E6%97%B6%E9%97%B4':'undefined','Width%20x%20Height%7C%E9%95%BF%20x%20%E5%AE%BD':'undefined%20x%20undefined','Latitude%7C%E7%BA%AC%E5%BA%A6':'undefined%20undefined','Longitude%7C%E7%BB%8F%E5%BA%A6':'undefined%20undefined','Altitude%7C%E9%AB%98%E5%BA%A6':'undefined','DocClass%7C':''%7D");
         formData.add("image0", imageMap.toJSONString());
 
         // 构建 WebClient 实例
@@ -341,6 +369,9 @@ public class ZmCrawlerRequestComponent {
                 .defaultHeader(HttpHeaders.COOKIE, cookies.get(1) + ";" + cookies.get(0))
                 .defaultHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
                 .defaultHeader(HttpHeaders.REFERER, "https://image.chinacoal-ins.com/SunICMS/ecm-nview/image/webScan/webScanMain.jsp")
+                .defaultHeader(HttpHeaders.CONTENT_TYPE, "multipart/form-data")
+                .defaultHeader(HttpHeaders.ACCEPT, "*/*")
+                .defaultHeader(HttpHeaders.CONNECTION, "keep-alive")
                 .build();
         // 发送 POST 请求
         String response  = webClient.post()
@@ -824,8 +855,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerOrderStatusResponse orderStatusQuery(ZmCrawlerOrderStatusRequest orderStatusRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫查询投保单状态",RequestUrl.ORDER_STATUS_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(orderStatusRequest));
         Mono<ZmCrawlerOrderStatusResponse> responseMono = requestComponent.postGbk(RequestUrl.ORDER_STATUS_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(orderStatusRequest)), ZmCrawlerOrderStatusResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(orderStatusRequest)), ZmCrawlerOrderStatusResponse.class,new HttpHeaders(),"查询投保单状态");
         ZmCrawlerOrderStatusResponse response = responseMono.block();
         return response;
     }
@@ -836,8 +869,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerSubmitResponse submit(ZmCrawlerSubmitRequest submitRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫提交核保",RequestUrl.SUBMIT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(submitRequest));
         Mono<ZmCrawlerSubmitResponse> responseMono = requestComponent.postGbk(RequestUrl.SUBMIT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(submitRequest)), ZmCrawlerSubmitResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(submitRequest)), ZmCrawlerSubmitResponse.class,new HttpHeaders(),"提交核保");
         ZmCrawlerSubmitResponse response = responseMono.block();
         return response;
     }
@@ -848,8 +883,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerCheckPaymentResponse checkPayment(ZmCrawlerCheckPaymentRequest checkPaymentRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫检查支付",RequestUrl.CHECK_PAYMENT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(checkPaymentRequest));
         Mono<ZmCrawlerCheckPaymentResponse> responseMono = requestComponent.postGbk(RequestUrl.CHECK_PAYMENT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(checkPaymentRequest)), ZmCrawlerCheckPaymentResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(checkPaymentRequest)), ZmCrawlerCheckPaymentResponse.class,new HttpHeaders(),"检查支付");
         ZmCrawlerCheckPaymentResponse response = responseMono.block();
         return response;
     }
@@ -860,8 +897,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerFindZfTaskResponse findZfTask(ZmCrawlerFindZfTaskRequest findZfTaskRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫查询是否存在支付数据",RequestUrl.FIND_ZF_TASK.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(findZfTaskRequest));
         Mono<ZmCrawlerFindZfTaskResponse> responseMono = requestComponent.postGbk(RequestUrl.FIND_ZF_TASK.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(findZfTaskRequest)), ZmCrawlerFindZfTaskResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(findZfTaskRequest)), ZmCrawlerFindZfTaskResponse.class,new HttpHeaders(),"查询是否存在支付数据");
         ZmCrawlerFindZfTaskResponse response = responseMono.block();
         return response;
     }
@@ -872,8 +911,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerOrderApplyResponse orderApply(ZmCrawlerOrderApplyRequest orderApplyRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫获取支付参数",RequestUrl.ORDER_APPLY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(orderApplyRequest));
         Mono<ZmCrawlerOrderApplyResponse> responseMono = requestComponent.postGbk(RequestUrl.ORDER_APPLY.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(orderApplyRequest)), ZmCrawlerOrderApplyResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(orderApplyRequest)), ZmCrawlerOrderApplyResponse.class,new HttpHeaders(),"获取支付参数");
         ZmCrawlerOrderApplyResponse response = responseMono.block();
         return response;
     }
@@ -884,8 +925,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerOrderUpdateResponse orderUpdate(ZmCrawlerOrderUpdateRequest orderApplyRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫获取支付参数,更新相关数据",RequestUrl.ORDER_UPDATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(orderApplyRequest));
         Mono<ZmCrawlerOrderUpdateResponse> responseMono = requestComponent.postGbk(RequestUrl.ORDER_UPDATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(orderApplyRequest)), ZmCrawlerOrderUpdateResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(orderApplyRequest)), ZmCrawlerOrderUpdateResponse.class,new HttpHeaders(),"获取支付参数,更新相关数据");
         ZmCrawlerOrderUpdateResponse response = responseMono.block();
         return response;
     }
@@ -896,8 +939,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerGetQrCodeResponse getQrCode(ZmCrawlerGetQrCodeRequest qrCodeRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫获取支付二维码",RequestUrl.ACHIEVE_QR_CODE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(qrCodeRequest));
         Mono<ZmCrawlerGetQrCodeResponse> responseMono = requestComponent.postGbk(RequestUrl.ACHIEVE_QR_CODE.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(qrCodeRequest)), ZmCrawlerGetQrCodeResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(qrCodeRequest)), ZmCrawlerGetQrCodeResponse.class,new HttpHeaders(),"获取支付二维码");
         ZmCrawlerGetQrCodeResponse response = responseMono.block();
         return response;
     }
@@ -908,8 +953,10 @@ public class ZmCrawlerRequestComponent {
      * @return
      */
     public ZmCrawlerPolicyPrintResponse policyPrint(ZmCrawlerPolicyPrintRequest printRequest) {
+        InsuranceLog.infoLog(InsuranceEnum.ZMBX.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "爬虫保单下载",RequestUrl.POLICY_PRINT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),JSON.toJSONString(printRequest));
         Mono<ZmCrawlerPolicyPrintResponse> responseMono = requestComponent.postGbk(RequestUrl.POLICY_PRINT.getRequestUrl(zmCrawlerProperties.getBaseUrl()),
-                Base64Tool.encode(JSONObject.toJSONString(printRequest)), ZmCrawlerPolicyPrintResponse.class,new HttpHeaders());
+                Base64Tool.encode(JSONObject.toJSONString(printRequest)), ZmCrawlerPolicyPrintResponse.class,new HttpHeaders(),"保单下载");
         ZmCrawlerPolicyPrintResponse response = responseMono.block();
         return response;
     }

+ 8 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerOrderStatusRequest.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.zhongmei.crawler.entity.Request;
 import com.jzg.quotation.zhongmei.api.constant.TransCode;
 import com.jzg.quotation.zhongmei.api.entity.BaseRequestHead;
 import com.jzg.quotation.zhongmei.api.entity.request.BaseRequest;
+import com.jzg.quotation.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -125,4 +126,11 @@ public class ZmCrawlerOrderStatusRequest extends BaseRequest {
      */
     private String subMenu;
 
+    public ZmCrawlerOrderStatusRequest(ZmCrawlerConfigureParameters parameters, String proposalNo) {
+        this.proposalNo = proposalNo;
+        this.loginCom = parameters.getComCode();
+        this.businessType = "T";
+        this.companyCode = parameters.getComCode();
+        this.subMenu = "MENU_TBXG";
+    }
 }

+ 16 - 3
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -573,6 +573,9 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                 @JsonProperty("plateColorCode")
                 private String plateColorCode;
 
+                @JsonProperty("colorCode")
+                private String colorCode;
+
                 @JsonProperty("secondhandCarFlag")
                 private String secondhandCarFlag;
 
@@ -612,7 +615,6 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                     this.carChecker = "";
                     this.carQueryCheckCode = "";
                     this.carUseType = carInfoVo.getVehicleUseCode();
-                    this.chgOwnerFlag = "0";
                     this.engine = carInfoVo.getEngineNo();
                     this.issueDate = carInfoVo.getIssueDate() + " 00:00:00";
                     this.motorMainType = carInfoVo.getCarKindCode();
@@ -620,22 +622,33 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                     AssertionUtils.isEmpty(motorSubTypeEnum, "车辆类型输入错误");
                     this.motorSubType = motorSubTypeEnum.getCode();
                     if(carInfoVo.getCarKindCode().equals("100")){
-                        this.motorTypeCode = "11";
+                        if (Integer.parseInt(carInfoVo.getSeatCount()) < 6) {
+                            this.motorTypeCode = "11";
+                        } else {
+                            this.motorTypeCode = "12";
+                        }
                     }else{
                         this.motorTypeCode = "21";
                     }
+                    if (carInfoVo.isTransfer() || carInfoVo.isTransferBi()) {
+                        this.chgOwnerFlag = "01";
+                        this.transferDate = issueDate;
+                    } else {
+                        this.chgOwnerFlag = "0";
+                        this.transferDate = "";
+                    }
                     this.motorUsageTypeCode = carInfoVo.getCarNatureCode();
                     this.newCarSign = true;
                     this.noDamageYears = "";
                     this.personLiable = "";
                     this.plateColorCode = carInfoVo.getLicenseColorCode();
+                    this.colorCode = "02";
                     this.plateNo = carInfoVo.getLicenseNo();
                     this.plateType = "02";
                     this.registerDate = carInfoVo.getRegisterDate() + " 00:00:00";
                     this.repairTime = "";
                     this.runMiles = 0;
                     this.taxInclued = false;
-                    this.transferDate = "";
                     this.useYears = actualValueResponse.getUseYears();
                     this.vehicleType = carInfoVo.getCarTypeCode();
                     this.noLicenseFlag = false;

+ 6 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Response/ZmCrawlerActualValueResponse.java

@@ -23,6 +23,12 @@ public class ZmCrawlerActualValueResponse extends BaseResponse {
 
     @JsonProperty("useYears")
     private Integer useYears;
+
+    @JsonProperty("validDate")
+    private String validDate;
+
+    @JsonProperty("registerDate")
+    private String registerDate;
     /**
      * {
      * "actualValue":63751.2

+ 1 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Response/ZmCrawlerImageImportResponse.java

@@ -4,6 +4,7 @@ import com.jzg.quotation.zhongmei.api.entity.response.BaseResponse;
 import lombok.Data;
 
 import java.io.Serial;
+import java.util.List;
 import java.util.Map;
 
 /**

+ 20 - 19
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerQuoteProcessServiceImpl.java

@@ -3,8 +3,11 @@ package com.jzg.quotation.zhongmei.crawler.service.Impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.hutool.crypto.digest.MD5;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.zhongmei.crawler.component.ZmCrawlerRequestComponent;
@@ -42,21 +45,24 @@ public class ZhongMeiCrawlerQuoteProcessServiceImpl implements ZhongMeiCrawlerQu
 
     private final ZmCrawlerRequestComponent zmCrawlerRequestComponent;
 
+    private final PlatformClient platformClient;
+
 
     @Override
-    public void uploadImage(String authorization, ZmCrawlerOrder crawlerOrder, List<InsuranceImageVo> imageVoList) {
+    public void uploadImage(String authorization, ZmCrawlerOrder crawlerOrder, List<InsuranceImageVo> imageVoList, String usercode) {
 
         // 1. 获取上传页面的cookie
         ZmCrawlerImageCookieRequest request = new ZmCrawlerImageCookieRequest(crawlerOrder.getBussinessNo(), authorization);
         MultiValueMap<String, String> param = RequestObjectConversion.convertMultiValueStringMap(request);
-        ResponseEntity<String> response = requestComponent.baseGet(ZmCrawlerImageConstant.IMAGE_SYSTEM_URL, param, String.class,null);
-        System.out.println(response.getBody());
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36");
+        ResponseEntity<String> response = requestComponent.baseGet(ZmCrawlerImageConstant.IMAGE_SYSTEM_URL, param, String.class, httpHeaders);
         // 2. 使用 Jsoup 解析 HTML
         Document doc = Jsoup.parse(response.getBody());
         String actionUrl = doc.selectFirst("form[action][method]").attr("action");
         Elements inputs = doc.select("input[value]");
-        String xml = inputs.get(0).attr("value");
-        String code = inputs.get(1).attr("value");
+        String code = inputs.get(0).attr("value");
+        String xml = inputs.get(1).attr("value");
         String format = inputs.get(2).attr("value");
         System.out.println(actionUrl);
 
@@ -67,22 +73,12 @@ public class ZhongMeiCrawlerQuoteProcessServiceImpl implements ZhongMeiCrawlerQu
         parts.add("format", format);
         HttpHeaders headers = new HttpHeaders();
         headers.set("Host", "image.chinacoal-ins.com");
-        headers.set("Connection", "keep-alive");
-        headers.set("Cache-Control", "max-age=0");
-        headers.set("sec-ch-ua", "\"Chromium\";v=\"104\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"104\"");
-        headers.set("sec-ch-ua-mobile", "?0");
-        headers.set("sec-ch-ua-platform", "\"Windows\"");
-        headers.set("Upgrade-Insecure-Requests", "1");
-        headers.set("Origin", "https://hxkscd.chinacoal-ins.com");
         headers.set("Content-Type", "application/x-www-form-urlencoded");
         headers.set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36");
         headers.set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
-        headers.set("Sec-Fetch-Site", "same-site");
-        headers.set("Sec-Fetch-Mode", "navigate");
-        headers.set("Sec-Fetch-Dest", "document");
-        headers.set("Referer", "https://hxkscd.chinacoal-ins.com/");
         headers.set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");
-        ResponseEntity<String> res = requestComponent.formData(actionUrl,parts,String.class,headers);
+        headers.set("Referer", "https://hxkscd.chinacoal-ins.com/");
+        ResponseEntity<String> res = requestComponent.formData(actionUrl, parts, String.class, headers);
         System.out.println(res.getBody());
         String responseText = res.getBody();
         // 5. 提取 XML 返回内容
@@ -92,7 +88,7 @@ public class ZhongMeiCrawlerQuoteProcessServiceImpl implements ZhongMeiCrawlerQu
         String orgCode = extract(responseText, "<ORG_CODE>(.*?)</ORG_CODE>");
         List<String> cookies = res.getHeaders().get("Set-Cookie");
         if (StringUtil.isEmpty(userCode)) {
-            throw new SystemException("获取上传图片cookie失败!");
+            userCode = usercode;
         }
         System.out.println("CREATE_USER = " + userCode);
         System.out.println("CREATE_USERNAME = " + userName);
@@ -188,9 +184,14 @@ public class ZhongMeiCrawlerQuoteProcessServiceImpl implements ZhongMeiCrawlerQu
         data = data.replace("\n", "").replace("\r", "").replace("\t", "");
         // URL 编码
         String dataEncoded = URLEncoder.encode(data, StandardCharsets.UTF_8);
+        StringBuilder cookieSb = new StringBuilder();
+        for (String cookie : cookies) {
+            // 只取 key=value,去掉后面;path=xxx等
+            cookieSb.append(cookie.split(";")[0]).append("; ");
+        }
         WebClient client = WebClient.builder()
                 .baseUrl("https://image.chinacoal-ins.com")
-                .defaultHeader("Cookie", cookies.get(1) + ";" + cookies.get(0))
+                .defaultHeader("Cookie", cookieSb.toString())
                 .defaultHeader("Referer", "https://image.chinacoal-ins.com/SunICMS/ecm-nview/image/webScan/webScanMain.jsp")
                 .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36")
                 .build();

+ 63 - 20
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.zhongmei.crawler.service.Impl;
 
+import cn.hutool.crypto.digest.MD5;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
@@ -8,15 +10,18 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quotation.zhongmei.api.constant.TransCode;
 import com.jzg.quotation.zhongmei.api.entity.BaseRequestHead;
 import com.jzg.quotation.zhongmei.crawler.build.ZmCrawlerQuoteResultVoBuild;
 import com.jzg.quotation.zhongmei.crawler.build.ZmCrawlerSubmitResultVoBuild;
 import com.jzg.quotation.zhongmei.crawler.component.ZmCrawlerRequestComponent;
+import com.jzg.quotation.zhongmei.crawler.constant.ZmCrawlerImageConstant;
 import com.jzg.quotation.zhongmei.crawler.entity.Request.*;
 import com.jzg.quotation.zhongmei.crawler.entity.Response.*;
 import com.jzg.quotation.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
@@ -30,10 +35,10 @@ import lombok.RequiredArgsConstructor;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * @description: 中煤财险 爬虫报价
@@ -103,12 +108,25 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
             if (quotedPriceResponse.getHead().getReturnCode().equals("-1") && quotedPriceResponse.getHead().getReturnMessage().contains("重复投保")) {
                 String startTime = extractDuplicateEndTime(quotedPriceResponse.getHead().getReturnMessage());
                 String endTime = calculateEndTime(startTime);
-                List<ZmCrawlerQuotedPriceRequest.BusinessDataDTO.ContractDTO> contract =quotedPriceRequest.getBusinessData().getContract();
-                contract.forEach(contractDTO -> {
-                    contractDTO.getContractMain().setValidDate(startTime);
-                    contractDTO.getContractMain().setExpiryDate(endTime);
-                });
-                quotedPriceResponse = zmCrawlerRequestComponent.quotedPrice(quotedPriceRequest);
+                if (startTime != null && endTime != null) {
+                    List<ZmCrawlerQuotedPriceRequest.BusinessDataDTO.ContractDTO> contract = quotedPriceRequest.getBusinessData().getContract();
+                    contract.forEach(contractDTO -> {
+                        contractDTO.getContractMain().setValidDate(startTime);
+                        contractDTO.getContractMain().setExpiryDate(endTime);
+                        contractDTO.getCoverage().forEach(coverageDTO -> {
+                            coverageDTO.setValidDate(startTime);
+                            coverageDTO.setExpiryDate(endTime);
+                        });
+                    });
+                    // 重复投保 获取日期重新计算折旧价
+                    ZmCrawlerActualValueRequest actualValueReq = new ZmCrawlerActualValueRequest(quoteVo.getCarInfoVo(),fullCarDataDTO,head,startTime);
+                    ZmCrawlerActualValueResponse actualValueResp = zmCrawlerRequestComponent.getActualValue(actualValueReq);
+                    quotedPriceRequest.getBusinessData().getInsuredObject().getPolicyCar().setActualValue(actualValueResp.getActualValue());
+                    quotedPriceRequest.getBusinessData().getInsuredObject().getPolicyCar().setActualValueCarLoss(actualValueResp.getActualValue());
+                    quotedPriceRequest.getBusinessData().getInsuredObject().getPolicyCar().setUseYears(actualValueResp.getUseYears());
+                    quotedPriceRequest.getHead().setTransCode(TransCode.QUOTE_PRICE);
+                    quotedPriceResponse = zmCrawlerRequestComponent.quotedPrice(quotedPriceRequest);
+                }
             }
             // 3.1 缓存数据
             if(quotedPriceResponse.getHead().getReturnCode().equals("0")){
@@ -141,7 +159,9 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
     }
 
     // 截取重复投保终保日期
-    private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+    private static final Pattern DUPLICATE_END_TIME_PATTERN =
+            Pattern.compile("终保日期[\\s::](\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}(?::\\d{2})?)");
+
 
     /**
      * 提取系统自动分配的起保时间
@@ -151,14 +171,19 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
     private String extractDuplicateEndTime(String returnMessage) {
         Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(returnMessage);
         if (matcher.find()) {
-            String shortEndTime = matcher.group(1);
+            // 取出匹配到的时间
+            String timeStr = matcher.group(1);
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-            shortEndTime = shortEndTime + ":00";
-            // 判断是否是及时起保的 如果是则 day + 1
-            LocalDateTime dateTime = LocalDateTime.parse(shortEndTime,formatter);
+            LocalDateTime dateTime;
+
+            if (timeStr.length() == 16) {
+                dateTime = LocalDateTime.parse(timeStr + ":00", formatter);
+            } else {
+                dateTime = LocalDateTime.parse(timeStr, formatter);
+            }
             if(dateTime.getHour() == 0 && dateTime.getMinute() == 0){
-                return shortEndTime + ":00";
+                return dateTime.format(formatter);
             }else{
                 dateTime = dateTime.plusDays(1)
                         .withHour(0)
@@ -212,7 +237,25 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         ZmCrawlerSubmitRequest submitRequest = new ZmCrawlerSubmitRequest(zmCrawlerOrder.getBussinessNo(),zmCrawlerConfigureParameters);
         submitRequest.setHead(head);
         ZmCrawlerSubmitResponse submit = zmCrawlerRequestComponent.submit(submitRequest);
-        return ZmCrawlerSubmitResultVoBuild.build(submit, zmCrawlerOrder);
+        UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        if (submit.getHead().getReturnCode().equals("0")) {
+            submit.getAppliResult().stream().forEach(appliResult -> {
+                appliResult.getNotion().stream().forEach(notion -> {
+                    if (notion.getUWResult().equals("双核审核自动通过") || notion.getUWResult().equals("双核审核自动通过")) {
+                        PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                        paymentLinkVo.setOrder(underwritingVo.getOrder());
+                        PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                        underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+                    }
+                    // 人工处理
+                    if (notion.getUWResult().contains("人工")) {
+                        underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+                        underwritingResultsVo.setUnderwritingResult(notion.getUWResult());
+                    }
+                });
+            });
+        }
+        return ZmCrawlerSubmitResultVoBuild.build(submit, zmCrawlerOrder, underwritingResultsVo);
     }
 
     /**
@@ -232,7 +275,7 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         BaseRequestHead head = new BaseRequestHead(authorization, "2");
 
         //调用检查支付状态接口
-        ZmCrawlerCheckPaymentRequest checkPaymentRequest = new ZmCrawlerCheckPaymentRequest("businessNo");
+        ZmCrawlerCheckPaymentRequest checkPaymentRequest = new ZmCrawlerCheckPaymentRequest(crawlerOrder.getBussinessNo());
         checkPaymentRequest.setHead(head);
         ZmCrawlerCheckPaymentResponse checkPaymentResponse = zmCrawlerRequestComponent.checkPayment(checkPaymentRequest);
         //调用是否存在支付订单接口
@@ -285,9 +328,10 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
                 .getOrder()
                 .getAttributionInformationVo();
         String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo);
+        String userCode = zmCrawlerRequestComponent.getUserCode(attributionInformationVo.getUsername());
         ZmCrawlerOrder crawlerOrder = zmCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
         // 上传影像 封装
-        zhongMeiCrawlerQuoteProcessService.uploadImage(authorization, crawlerOrder, insuranceUploadImageVo.getImageVoList());
+        zhongMeiCrawlerQuoteProcessService.uploadImage(authorization, crawlerOrder, insuranceUploadImageVo.getImageVoList(),userCode);
     }
 
     @Override
@@ -329,10 +373,9 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         //获取配置信息
         ZmCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         BaseRequestHead requestHead = new BaseRequestHead(authorization, "2");
-
-        ZmCrawlerOrderStatusRequest orderStatusRequest = new ZmCrawlerOrderStatusRequest();
+        ZmCrawlerOrder zmCrawlerOrder = zmCrawlerOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        ZmCrawlerOrderStatusRequest orderStatusRequest = new ZmCrawlerOrderStatusRequest(parameters,zmCrawlerOrder.getBussinessNo());
         orderStatusRequest.setHead(requestHead);
-
         ZmCrawlerOrderStatusResponse zmCrawlerOrderStatusResponse = zmCrawlerRequestComponent.orderStatusQuery(orderStatusRequest);
         return null;
     }

+ 2 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZmCrawlerOrderServiceImpl.java

@@ -44,8 +44,9 @@ public class ZmCrawlerOrderServiceImpl implements ZmCrawlerOrderService {
         ZmCrawlerOrder zmCrawlerOrder = new ZmCrawlerOrder();
         zmCrawlerOrder.setId(quoteVo.getOrder().getOrdersNo());
         zmCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
-        zmCrawlerOrder.setProductsCode(quoteVo.getProductId());
+        zmCrawlerOrder.setProductsCode(quoteVo.getOrder().getProductId());
         zmCrawlerOrder.setBussinessNo(quotedPriceResponse.getBussinessMain().getContractMainNo());
+        zmCrawlerOrder.setProposalName(quoteVo.getPolicyHolderInfo().getName());
         zmCrawlerOrderReposiroty.save(zmCrawlerOrder);
         return null;
     }

+ 2 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/ZhongMeiCrawlerQuoteProcessService.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.zhongmei.crawler.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.zhongmei.crawler.entity.po.ZmCrawlerOrder;
 
@@ -13,5 +14,5 @@ public interface ZhongMeiCrawlerQuoteProcessService {
      * @param crawlerOrder
      * @param imageVoList
      */
-    void uploadImage(String authorization, ZmCrawlerOrder crawlerOrder, List<InsuranceImageVo> imageVoList);
+    void uploadImage(String authorization, ZmCrawlerOrder crawlerOrder, List<InsuranceImageVo> imageVoList,String userCode);
 }