Explorar el Código

华泰电子保单下载调试

xuqiang hace 1 año
padre
commit
7f01f282dd

+ 5 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java

@@ -5,9 +5,10 @@ import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.QrBarcodeConfig;
 import com.jzg.commons.entity.po.SysUploadFiles;
-import com.jzg.commons.entity.vo.PersonAreaVo;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -59,5 +60,8 @@ public interface PlatformClient {
     );
 
 
+    //上传保单文件
+    @PostMapping(value = "/file/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    HttpResult<SysUploadFiles> upload(@RequestPart("file") MultipartFile file);
 
 }

+ 6 - 0
tenant/insurance/quotation-huatai/pom.xml

@@ -23,6 +23,12 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>net.lingala.zip4j</groupId>
+            <artifactId>zip4j</artifactId>
+            <version>2.11.5</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/entity/response/HuaTaiInsurancePolicyPrintResponse.java

@@ -28,7 +28,7 @@ public class HuaTaiInsurancePolicyPrintResponse extends HuaTaiBaseResponse {
     private String registResult;
 
     //下载地址(列表)
-    @JsonProperty("registResult")
+    @JsonProperty("elecDownLoadResultList")
     private List<ElecDownLoadResultDto> elecDownLoadResultList;
 
     @AllArgsConstructor

+ 58 - 4
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/service/Impl/HuaTaiApiRequestImpl.java

@@ -4,12 +4,15 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.InsOrdersPolicy;
+import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.vo.aggregated.*;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
@@ -26,13 +29,17 @@ import com.jzg.quotation.huatai.api.entity.response.*;
 import com.jzg.quotation.huatai.api.entity.vo.InsHuataiContributingVo;
 import com.jzg.quotation.huatai.api.service.HuaTaiApiOrderService;
 import com.jzg.quotation.huatai.api.service.HuaTaiApiRequest;
+import com.jzg.quotation.huatai.api.utils.InMemoryZipExtractor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @description: 华泰财险
@@ -48,6 +55,10 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
     private final HuaTaiApiOrderService huaTaiApiOrderService;
 
     private final HuiTaiUploadImageComponent huiTaiUploadImageComponent;
+
+    private final PlatformClient platformClient;
+
+
     /**
      * 报价
      *
@@ -152,9 +163,6 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         HuaTaiSubmitRequest submitRequest = new HuaTaiSubmitRequest(huaTaiApiOrder, huaTaiParameters, engageList);
         HuaTaiSubmitResponse submitResponse = huataiRequestApiComponent.submit(submitRequest, HuaTaiSubmitResponse.class, huaTaiParameters.getInsuredCode());
 
-       // String str = "{\"appliResult\":[{\"contractNo\":\"B2781250425MM000003\",\"notion\":[{\"uWNotion\":\"交强险:2278110022025000020 投保预确认失败 \\n原因:投保业务:投保业务:中国银保信车险平台友情提示:投保(预)确认时间应早于或等于保险起期。\",\"uWResult\":\"您的业务无法正常生成订单,请联系店主15175223697咨询\",\"uWType\":\"CI\"}],\"status\":\"6\"}],\"head\":{\"returnCode\":\"0\",\"returnMessage\":\"成功\",\"token\":\"\",\"transCode\":\"SAVE\",\"transType\":\"RES\"}}";
-
-
         log.info("提交保单返回信息:{}", JSONObject.toJSONString(submitResponse));
         if ("-1".equals(submitResponse.getHead().getReturnCode())) {
             throw new SystemException(submitResponse.getHead().getReturnMessage());
@@ -320,11 +328,12 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         HuaTaiConfigureParameters huaTaiParameters = ConfigureParametersConversion.conversionEntity(HuaTaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
         HuaTaiInsurancePolicyPrintRequest request = new HuaTaiInsurancePolicyPrintRequest();
         request.setHead(new HuaTaiBaseRequestHead(huaTaiParameters));
+        HuaTaiApiOrder huaTaiApiOrder = huaTaiApiOrderService.findByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
         if (StringUtils.isNotBlank(police.getJqPolicyNo())){
             request.setBusinessNo(police.getJqPolicyNo());
             HuaTaiInsurancePolicyPrintResponse response = huataiRequestApiComponent.insurancePolicyPrint(request, HuaTaiInsurancePolicyPrintResponse.class, huaTaiParameters.getInsuredCode());
             response.getElecDownLoadResultList().forEach(elecDownLoadResultDto -> {
-                resultVo.setJqUrl(elecDownLoadResultDto.getDownURL());
+                getPdfLink(elecDownLoadResultDto.getDownURL(), resultVo, true,huaTaiApiOrder.getOwnersInfo().getIdentifyNumber());
             });
         }
         if (StringUtils.isNotBlank(police.getJyPolicyNo())){
@@ -337,6 +346,51 @@ public class HuaTaiApiRequestImpl implements HuaTaiApiRequest {
         return resultVo;
     }
 
+
+    public void getPdfLink(String downURL,DownloadPolicyResultVo resultVo, boolean type,String idCar){
+        try {
+            Map<String, MultipartFile> inputStreamMap = InMemoryZipExtractor.extractFromUrl(downURL, idCar);
+            inputStreamMap.forEach((fileName, file) -> {
+                //saveFile(file);
+                HttpResult<SysUploadFiles> upload = platformClient.upload(file);
+                System.out.println("文件名: " + upload.getData().getDownloadUrl());
+                if (type){
+                    if (fileName.contains("bz")){
+                        resultVo.setJqFlagUrl(upload.getData().getDownloadUrl());
+                    }else {
+                        resultVo.setJqUrl(upload.getData().getDownloadUrl());
+                    }
+                }
+            });
+
+        }catch (Exception e){
+            log.error("获取保单失败",e);
+        }
+    }
+
+
+    /**
+     * 测试文件
+     * @param file
+     */
+    public void saveFile(MultipartFile file){
+        String targetDir = "F:\\img\\xx";
+        if (file.isEmpty()) {
+            throw new IllegalArgumentException("文件不能为空");
+        }
+        File dir = new File(targetDir);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+        try {
+            file.transferTo(new File(targetDir + File.separator + file.getOriginalFilename()));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+
+
     /**
      * 查询订单状态
      *

+ 148 - 0
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/api/utils/InMemoryZipExtractor.java

@@ -0,0 +1,148 @@
+package com.jzg.quotation.huatai.api.utils;
+
+import net.lingala.zip4j.ZipFile;
+import net.lingala.zip4j.model.FileHeader;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.*;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.Map;
+
+public class InMemoryZipExtractor {
+
+
+    private static final HttpClient httpClient = HttpClient.newBuilder()
+            .connectTimeout(java.time.Duration.ofSeconds(30))
+            .followRedirects(HttpClient.Redirect.NORMAL)
+            .build();
+
+
+    // 从 URL 下载 ZIP 到内存并解压,返回文件名到文件内容的 Map
+    public static Map<String, MultipartFile > extractFromUrl(String zipUrl, String password){
+        return extractFromMemory(downloadZipFromUrl(zipUrl), password);
+    }
+
+    // 从 URL 下载 ZIP 文件
+    private static InputStream downloadZipFromUrl(String zipUrl){
+        try {
+            HttpRequest request = HttpRequest.newBuilder()
+                    .uri(URI.create(zipUrl))
+                    .header("Accept-Encoding", "gzip")
+                    .timeout(java.time.Duration.ofSeconds(60))
+                    .GET()
+                    .build();
+            HttpResponse<InputStream> response = httpClient.send(request,HttpResponse.BodyHandlers.ofInputStream());
+            if (response.statusCode() != 200) {
+                throw new IOException("HTTP 请求失败,状态码: " + response.statusCode());
+            }
+            return response.body();
+        }catch (Exception e){
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }
+
+
+    public static Map<String, MultipartFile > extractFromMemory(InputStream zipInputStream, String password) {
+        Map<String, MultipartFile> fileStreams = new HashMap<>();
+        File tempFile;
+        try {
+            tempFile = File.createTempFile("temp_zip", ".zip");
+            Files.write(tempFile.toPath(), zipInputStream.readAllBytes());
+            try (ZipFile zipFile = new ZipFile(tempFile)) {
+                if (zipFile.isEncrypted()) {
+                    if (password == null || password.isEmpty()) {
+                        throw new IllegalArgumentException("密码不能为空");
+                    }
+                    zipFile.setPassword(password.toCharArray());
+                }
+                for (FileHeader entry : zipFile.getFileHeaders()) {
+                    if (!entry.isDirectory()) {
+                        String fileName = entry.getFileName();
+                        // 防止路径穿越攻击
+                        if (fileName.contains("..") || fileName.startsWith("/") || fileName.contains("\\")) {
+                            throw new IllegalArgumentException("非法文件名: " + fileName);
+                        }
+                        try (InputStream inputStream = zipFile.getInputStream(entry)) {
+                            byte[] content = inputStream.readAllBytes();
+                            fileStreams.put(fileName, new CustomMultipartFile(content, fileName));
+                        }
+                    }
+                }
+            } finally {
+                if (tempFile != null && tempFile.exists()) {
+                    tempFile.delete();
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("解压失败: " + e.getMessage(), e);
+        }
+
+        return fileStreams;
+    }
+
+
+
+    public static class CustomMultipartFile implements MultipartFile {
+        private final byte[] content;
+        private final String name;
+        private final String originalFilename;
+        private final String contentType;
+
+        public CustomMultipartFile(byte[] content, String originalFilename) {
+            this.content = content;
+            this.name = "file";
+            this.originalFilename = originalFilename;
+            this.contentType = detectContentType(originalFilename);
+        }
+
+
+        private static String detectContentType(String filename) {
+            if (filename == null || !filename.contains(".")) {
+                return "application/octet-stream";
+            }
+            String ext = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
+            switch (ext) {
+                case "pdf": return "application/pdf";
+                case "txt": return "text/plain";
+                case "doc": return "application/msword";
+                case "docx": return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+                case "xls": return "application/vnd.ms-excel";
+                case "xlsx": return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+                default: return "application/octet-stream";
+            }
+        }
+
+        @Override
+        public String getName() { return name; }
+
+        @Override
+        public String getOriginalFilename() { return originalFilename; }
+
+        @Override
+        public String getContentType() { return contentType; }
+
+        @Override
+        public boolean isEmpty() { return content.length == 0; }
+
+        @Override
+        public long getSize() { return content.length; }
+
+        @Override
+        public byte[] getBytes() { return content; }
+
+        @Override
+        public InputStream getInputStream() { return new ByteArrayInputStream(content); }
+
+        @Override
+        public void transferTo(File dest) throws IOException {
+            try (FileOutputStream fos = new FileOutputStream(dest)) {
+                fos.write(content);
+            }
+        }
+    }
+}