Selaa lähdekoodia

update
华农财险
1. 上传影像修改

wks 1 vuosi sitten
vanhempi
commit
ae9a304a73

+ 11 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -303,6 +303,17 @@ public class RequestComponent {
                 .block();
     }
 
+    public <Response> ResponseEntity<Response> formUrlencoded(String url,  BodyInserters.FormInserter<String> formInserter, Class<Response> responseClass, HttpHeaders headers) {
+        return webClient.post()
+                .uri(url)
+                .headers(RequestComponent.setHeaders(headers))
+                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
+                .body(formInserter)
+                .retrieve()
+                .toEntity(responseClass)
+                .block();
+    }
+
     /**
      * formData post 请求
      *

+ 67 - 13
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerRequestComponent.java

@@ -12,20 +12,25 @@ import com.jzg.quotation.huanong.crawler.properties.HuaNongCrawlerProperties;
 import com.jzg.quotation.huanong.crawler.utils.RequestEncryptor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.core.io.FileSystemResource;
+import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.util.StringUtils;
+import org.springframework.web.reactive.function.BodyInserters;
 
-import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
 
 import static com.jzg.quotation.huanong.crawler.constant.enums.RequestUrl.*;
 
@@ -192,30 +197,64 @@ public class HuaNongCrawlerRequestComponent {
         return response.getData();
     }
 
+    private HttpHeaders getBizUploadHttpHeaders() {
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Host", "nile.chinahuanong.com.cn");
+        headers.set("Connection", "keep-alive");
+        headers.set("Cache-Control", "max-age=0");
+        headers.set("sec-ch-ua", "\"Not)A;Brand\";v=\"8\", \"Chromium\";v=\"138\", \"Google Chrome\";v=\"138\"");
+        headers.set("sec-ch-ua-mobile", "?0");
+        headers.set("sec-ch-ua-platform", "\"Windows\"");
+        headers.set("Upgrade-Insecure-Requests", "1");
+        headers.set("Origin", "https://cx.chinahuanong.com.cn");
+        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.7");
+        headers.set("Sec-Fetch-Site", "same-site");
+        headers.set("Sec-Fetch-Mode", "navigate");
+        headers.set("Sec-Fetch-User", "?1");
+        headers.set("Sec-Fetch-Dest", "document");
+        headers.set("Referer", "https://cx.chinahuanong.com.cn/");
+        headers.set("Accept-Encoding", "gzip, deflate, br, zstd");
+        headers.set("Accept-Language", "zh-CN,zh;q=0.9");
+        return headers;
+    }
+
     /**
      * 获取 accessToken
      *
-     * @param data    data数据
-     * @param headers 请求头
+     * @param data data数据
      * @return accessToken
      */
-    public String bizUpload(String data, HttpHeaders headers) {
-        MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
-        parts.add("data", data);
+    public String bizUpload(String data, HttpHeaders httpHeaders) {
         String url = properties.getUploadUrl() + RequestUrl.BIZ_UPLOAD.getUri();
-        ResponseEntity<String> response = requestComponent.formData(url, parts, String.class, headers);
+        BodyInserters.FormInserter<String> fromFormData = BodyInserters.fromFormData("data", data);
+        ResponseEntity<String> response = requestComponent.formUrlencoded(url, fromFormData, String.class, getBizUploadHttpHeaders());
+
         String fragment = Optional.ofNullable(response)
                 .map(ResponseEntity::getHeaders)
                 .map(HttpHeaders::getLocation)
                 .map(URI::getFragment)
                 .orElse("");
 
+        Optional.ofNullable(response)
+                .map(HttpEntity::getHeaders)
+                .map(x -> x.get("Set-Cookie"))
+                .ifPresent(x -> {
+                    httpHeaders.set("Cookie", String.join(";", x));
+                });
+
         // 解析片段中的查询参数
         String[] s = fragment.split("\\?");
+
         if (s.length > 1) {
             Map<String, String> params = parseQueryParams(s[1]);
-            return params.get("accessToken");
+            String accessToken = params.get("accessToken");
+            if (fragment.contains("/error")) {
+                unlock(accessToken, httpHeaders);
+                return "ERROR";
+            }
+            return accessToken;
         }
+
         throw new SystemException("");
     }
 
@@ -236,19 +275,31 @@ public class HuaNongCrawlerRequestComponent {
      * @param headers 请求头
      * @return 上传影像响应
      */
-    public HuaNongCrawlerFileUploadResponse fileUpload(String accessToken, String uuidFileName, String suffix,  byte[] imageByte, HttpHeaders headers){
+    public HuaNongCrawlerFileUploadResponse fileUpload(String accessToken, String uuidFileName, String suffix, byte[] imageByte, HttpHeaders headers) {
         try {
             MultiValueMap<String, Object> parts = new LinkedMultiValueMap<>();
             Path tempPath = Files.createTempFile(uuidFileName, suffix);
             Files.write(tempPath, imageByte);
             parts.add("file", new FileSystemResource(tempPath.toFile()));
-            String url = properties.getUploadUrl() + String.format(FILE_UPLOAD.getUri(), accessToken, "");
+            String url = properties.getUploadUrl() + String.format(FILE_UPLOAD.getUri(), accessToken, uuidFileName);
             ResponseEntity<HuaNongCrawlerFileUploadResponse> responseEntity = requestComponent.formData(url, parts, HuaNongCrawlerFileUploadResponse.class, headers);
             return responseEntity.getBody();
-        }catch (IOException e){
+        } catch (IOException e) {
             throw new SystemException("文件读取异常");
         }
     }
+    public HuaNongCrawlerBizQueryResponse bizQuery(String accessToken, HttpHeaders headers) {
+        String url = properties.getUploadUrl() + String.format(BIZ_QUERY.getUri(), accessToken);
+        ResponseEntity<HuaNongCrawlerBizQueryResponse> responseEntity = requestComponent.baseGet(url, new LinkedMultiValueMap<>(), HuaNongCrawlerBizQueryResponse.class, headers);
+        return responseEntity.getBody();
+    }
+
+    public void unlock(String accessToken, HttpHeaders headers) {
+        String url = properties.getUploadUrl() + String.format(UNLOCK.getUri(), accessToken);
+        String o = requestComponent.get(url, Map.of(), UNLOCK.getRequestDescription(), new ParameterizedTypeReference<>() {
+        }, headers);
+        System.out.println(o);
+    }
 
     /**
      * 提交影像
@@ -259,9 +310,12 @@ public class HuaNongCrawlerRequestComponent {
      */
     public void fileSubmit(HuaNongCrawlerFileSubmitRequest request, String accessToken, HttpHeaders headers) {
         String url = properties.getUploadUrl() + String.format(FILE_SUBMIT.getUri(), accessToken, System.currentTimeMillis());
-        ResponseEntity<HuaNongCrawlerFileUploadResponse> responseEntity = requestComponent.objectPost(url, request, HuaNongCrawlerFileUploadResponse.class, headers);
+        ResponseEntity<HuaNongCrawlerFileSubmitResponse> responseEntity = requestComponent.objectPost(url, request, HuaNongCrawlerFileSubmitResponse.class, headers);
+        System.out.println();
     }
 
+
+
     /**
      * 查询上传目录
      *

+ 3 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/RequestUrl.java

@@ -32,9 +32,11 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     NEW_IMAGE_QUERY("newImageQuery", "影像上传", "newImageQuery"),
 
     BIZ_UPLOAD("/tianying/api/biz/upload", "上传影像地址", ""),
+    BIZ_QUERY("/tianying/api/doc/bizQuery?accessToken=%s", "查询目录", ""),
     CATALOG_QUERY("/tianying/api/doc/catalogQuery", "影像目录查询", ""),
     FILE_UPLOAD("/tianying/api/doc/fileUpload?accessToken=%s&tempId=%s", "上传影像", ""),
-    FILE_SUBMIT("/tianying/api/doc/fileSubmit??accessToken=%s&time=%d", "提交影像", ""),
+    UNLOCK("/tianying/api/doc/unlock?accessToken=%s", "解锁", ""),
+    FILE_SUBMIT("/tianying/api/doc/fileSubmit?accessToken=%s&time=%d", "提交影像", ""),
 
     // 提交核保
     SUBMIT("Submit", "提交核保", "Submit"),

+ 4 - 4
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerFileSubmitRequest.java

@@ -20,8 +20,8 @@ public class HuaNongCrawlerFileSubmitRequest {
     @JsonProperty("vtree")
     private List<VtreeDTO> vtree;
 
-    public HuaNongCrawlerFileSubmitRequest(List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO> treeData) {
-        this.vtree = treeData.stream().map(VtreeDTO::new).collect(Collectors.toList());
+    public HuaNongCrawlerFileSubmitRequest(List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO> treeData, Integer version) {
+        this.vtree = treeData.stream().map(x->new VtreeDTO(x, version)).collect(Collectors.toList());
     }
 
     @NoArgsConstructor
@@ -43,11 +43,11 @@ public class HuaNongCrawlerFileSubmitRequest {
         @JsonProperty("nodes")
         private List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO> nodes;
 
-        public VtreeDTO(HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO treeDataDTO) {
+        public VtreeDTO(HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO treeDataDTO, Integer version) {
             this.appCode = treeDataDTO.getAppCode();
             this.appName = treeDataDTO.getAppName();
             this.bizNo = treeDataDTO.getBizNo();
-            this.version = treeDataDTO.getDocNum();
+            this.version = version;
             this.nodes = treeDataDTO.getNodes();
         }
 

+ 81 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerBizQueryResponse.java

@@ -0,0 +1,81 @@
+package com.jzg.quotation.huanong.crawler.entity.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class HuaNongCrawlerBizQueryResponse {
+
+    @JSONField(name = "code")
+    private String code;
+    @JSONField(name = "message")
+    private String message;
+    @JSONField(name = "data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JSONField(name = "baseData")
+        private BaseDataDTO baseData;
+
+        @NoArgsConstructor
+        @Data
+        public static class BaseDataDTO {
+            @JSONField(name = "userCode")
+            private String userCode;
+            @JSONField(name = "userName")
+            private String userName;
+            @JSONField(name = "orgCode")
+            private String orgCode;
+            @JSONField(name = "orgName")
+            private String orgName;
+            @JSONField(name = "roleCode")
+            private String roleCode;
+            @JSONField(name = "permissions")
+            private List<?> permissions;
+            @JSONField(name = "bizInfo")
+            private List<BizInfoDTO> bizInfo;
+
+            @NoArgsConstructor
+            @Data
+            public static class BizInfoDTO {
+                @JSONField(name = "appCode")
+                private String appCode;
+                @JSONField(name = "appName")
+                private String appName;
+                @JSONField(name = "bizNo")
+                private String bizNo;
+                @JSONField(name = "version")
+                private Integer version;
+                @JSONField(name = "totalSize")
+                private String totalSize;
+                @JSONField(name = "totalNum")
+                private Integer totalNum;
+                @JSONField(name = "ocrFlag")
+                private String ocrFlag;
+                @JSONField(name = "docNum")
+                private Integer docNum;
+                @JSONField(name = "fileSize")
+                private FileSizeDTO fileSize;
+                @JSONField(name = "untypeFlag")
+                private String untypeFlag;
+
+                @NoArgsConstructor
+                @Data
+                public static class FileSizeDTO {
+                    @JSONField(name = "jpg")
+                    private Integer jpg;
+                    @JSONField(name = "other")
+                    private Integer other;
+                    @JSONField(name = "default")
+                    private Integer defaultX;
+                }
+            }
+        }
+    }
+}

+ 49 - 22
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -155,6 +155,14 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
         // 获取accessToken
         HttpHeaders httpHeaders = new HttpHeaders();
         String accessToken = huaNongCrawlerRequestComponent.bizUpload(data, httpHeaders);
+
+        if ("ERROR".equals(accessToken)) {
+            data = huaNongCrawlerRequestComponent.newImageQuery(huaNongCrawlerNewImageQueryRequest, new HttpHeaders());
+            accessToken = huaNongCrawlerRequestComponent.bizUpload(data, httpHeaders);
+        }
+
+        HuaNongCrawlerBizQueryResponse huaNongCrawlerBizQueryResponse = huaNongCrawlerRequestComponent.bizQuery(accessToken, httpHeaders);
+
         // 查询上传目录
         HuaNongCrawlerCatalogQueryResponse huaNongCrawlerCatalogQueryResponse = huaNongCrawlerRequestComponent.catalogQuery(accessToken, contractNo, httpHeaders);
 
@@ -163,13 +171,14 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
 
         Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap = new HashMap<>();
 
+        String finalAccessToken = accessToken;
         imageVoList.forEach(insuranceImageVo -> {
             uploadDataMap.put(insuranceImageVo.getInsuranceImageCode(), new ArrayList<>());
             insuranceImageVo.getImageBase64List().forEach(imageDTO -> {
                 // 上传影像
                 String uuidFileName = UUID.randomUUID().toString();
                 String[] split = imageDTO.getImageName().split("\\.");
-                HuaNongCrawlerFileUploadResponse fileUpload = huaNongCrawlerRequestComponent.fileUpload(accessToken, uuidFileName, split[1], imageDTO.getImageByte(), httpHeaders);
+                HuaNongCrawlerFileUploadResponse fileUpload = huaNongCrawlerRequestComponent.fileUpload(finalAccessToken, uuidFileName, "." + split[1], imageDTO.getImageByte(), httpHeaders);
                 HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO pagesDTO = new HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO(fileUpload.getData(), loginInfoBO.getUserName(), loginInfoBO.getUserCode(), loginInfoBO.getLoginCom());
                 uploadDataMap.get(insuranceImageVo.getInsuranceImageCode()).add(pagesDTO);
             });
@@ -180,7 +189,8 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
         });
 
         // 提交影像
-        HuaNongCrawlerFileSubmitRequest huaNongCrawlerFileSubmitRequest = new HuaNongCrawlerFileSubmitRequest(treeData);
+        HuaNongCrawlerFileSubmitRequest huaNongCrawlerFileSubmitRequest = new HuaNongCrawlerFileSubmitRequest(treeData, huaNongCrawlerBizQueryResponse.getData().getBaseData().getBizInfo().get(0).getVersion());
+
         huaNongCrawlerRequestComponent.fileSubmit(huaNongCrawlerFileSubmitRequest, accessToken, httpHeaders);
 
     }
@@ -199,20 +209,31 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
     private static void propagateProperties(List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO> nodes, HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO treeDataDTO,
                                             Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap) {
         nodes.forEach(node -> {
+            if("DELETE".equals(node.getNodeCode())){
+                node.setPages(null);
+                node.setPagesNew(null);
+            }
+
+            // 设置属性
+            node.setId(null);
+            node.setAppCode(treeDataDTO.getAppCode());
+            node.setAppName(treeDataDTO.getAppName());
+            node.setIcon("iconwj-wj-2");
+            node.setBizNo(treeDataDTO.getBizNo());
+            node.setLabel(node.getNodeName() + "(0)");
+            setUpPagesDTO(node, uploadDataMap);
+            Optional.ofNullable(node.getPages())
+                    .filter(List::isEmpty)
+                    .ifPresent(x -> {
+                        node.setPages(null);
+                        node.setPagesNew(null);
+                    });
+
             // 处理当前节点的直接子节点
             Optional.ofNullable(node.getChildren())
+                    .filter(x -> !x.isEmpty())
                     .ifPresent(children -> children.forEach(child -> {
-                        // 设置属性
-                        child.setAppCode(treeDataDTO.getAppCode());
-                        child.setAppName(treeDataDTO.getAppName());
-                        child.setIcon("iconwj-wj-2");
-                        child.setBizNo(treeDataDTO.getBizNo());
-                        child.setLabel(child.getNodeName() + "(0)");
-                        setUpPagesDTO(child, uploadDataMap);
-                        // 递归处理所有子孙节点
-                        if (child.getChildren() != null && !child.getChildren().isEmpty()) {
-                            propagateProperties(child.getChildren(), treeDataDTO, uploadDataMap);
-                        }
+                        propagateProperties(children, treeDataDTO, uploadDataMap);
                     }));
         });
     }
@@ -225,16 +246,22 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
      */
     private static void setUpPagesDTO(HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO child, Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap) {
         List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> pagesDTOS = uploadDataMap.get(child.getNodeCode());
-        String id = ImageIdGenerate.getId(18);
-        pagesDTOS.forEach(pagesDTO -> {
-            pagesDTO.setNodeId(id);
-            pagesDTO.setAppCode(child.getAppCode());
-            pagesDTO.setBizNo(child.getBizNo());
-            pagesDTO.setId(ImageIdGenerate.getId(18));
-            pagesDTO.setPageDesc(child.getNodeName());
+        Optional.ofNullable(pagesDTOS).ifPresent(pagesDTOS1 -> {
+            String id = ImageIdGenerate.getId(18);
+            pagesDTOS1.forEach(pagesDTO -> {
+                pagesDTO.setNodeId(id);
+                pagesDTO.setAppCode(child.getAppCode());
+                pagesDTO.setBizNo(child.getBizNo());
+                pagesDTO.setId(ImageIdGenerate.getId(18));
+                pagesDTO.setPageDesc(child.getNodeName());
+            });
+            if (!pagesDTOS.isEmpty()) {
+                child.setPages(pagesDTOS);
+                child.setPagesNew(pagesDTOS);
+            }
+            child.setLabel(child.getNodeName() + "(" + pagesDTOS.size() + ")");
         });
-        child.setPages(pagesDTOS);
-        child.setPagesNew(pagesDTOS);
+
     }
 
 }

+ 3 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -22,8 +22,8 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.PDFUtil;
 import com.jzg.commons.util.StringUtils;
-import com.jzg.quotation.commons.client.EsmInsCompanyClient;
 import com.jzg.quotation.commons.client.OrgClient;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.summary.mapper.InsFeeAuditMapper;
 import com.jzg.quotation.summary.service.*;
 import lombok.RequiredArgsConstructor;
@@ -56,7 +56,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     private OrgClient orgClient;
 
     @Autowired
-    private EsmInsCompanyClient companyClient;
+    private PlatformClient platformClient;
 
     @Autowired
     private BaseController baseController;
@@ -91,7 +91,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     public Page<FeeAuditVo> queryPage(FeeAuditParam param) {
         // 获取选中的保险公司条件
         String companyId = param.getCompanyId();
-        HttpResult<List<String>> result = companyClient.getChildCompanyId(companyId);
+        HttpResult<List<String>> result = platformClient.getChildCompanyId(companyId);
         AssertionUtils.isFail(Objects.isNull(result.getData()),"获取保险公司下级失败!");
         List<String> companyIdList = result.getData();
         param.setCompanyIdList(companyIdList);

+ 1 - 1
tenant/insurance/quotation-summary/src/test/java/com/jzg/quotation/taikang/crawler/service/TKQuotationBaseServiceImplTest.java

@@ -37,7 +37,7 @@ public class TKQuotationBaseServiceImplTest {
         Map<String, String> collect = huaNongCrawlerLoginResponse.getLoginCom()
                 .stream()
                 .collect(Collectors.toMap(HuaNongCrawlerLoginResponse.LoginComDTO::getComName, HuaNongCrawlerLoginResponse.LoginComDTO::getComCode));
-        collect.put("TOKEN", "sin90jhRos20250710084716071oftipHcI");
+        collect.put("TOKEN", "sin3Tp9zos20250711181216724oft71e0o");
         collect.put("USER_CODE", userCode);
         collect.put("USER_NAME", userName);
         RMap<String, String> bucket = redissonClient.getMap("hunong:crawler:authorization:14001105");