Переглянути джерело

feat:新增支持文件链接来解析报告的接口

wangzaijun 1 день тому
батько
коміт
a3a9798068

+ 12 - 0
mo-daq/src/main/java/com/smppw/modaq/application/api/ParseApi.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
 import com.smppw.modaq.application.service.EmailParseApiService;
 import com.smppw.modaq.domain.dto.UploadReportParams;
 import com.smppw.modaq.domain.dto.UploadReportResult;
+import com.smppw.modaq.domain.dto.UploadUrlReportParams;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -51,6 +52,17 @@ public class ParseApi {
     }
 
     /**
+     * 批量解析(http链接)
+     *
+     * @param params 参数
+     * @return 解析结果
+     */
+    @PostMapping("upload-url-parse")
+    public ResponseEntity<List<UploadReportResult>> uploadUrlReport(@RequestBody UploadUrlReportParams params) {
+        return ResponseEntity.ok(this.service.uploadUrlReport(params));
+    }
+
+    /**
      * 批量上传文件流并解析
      *
      * @param files 文件流对象

+ 9 - 0
mo-daq/src/main/java/com/smppw/modaq/application/service/EmailParseApiService.java

@@ -3,6 +3,7 @@ package com.smppw.modaq.application.service;
 import com.smppw.modaq.domain.dto.MailboxInfoDTO;
 import com.smppw.modaq.domain.dto.UploadReportParams;
 import com.smppw.modaq.domain.dto.UploadReportResult;
+import com.smppw.modaq.domain.dto.UploadUrlReportParams;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Date;
@@ -37,6 +38,14 @@ public interface EmailParseApiService {
     List<UploadReportResult> uploadReport(UploadReportParams params);
 
     /**
+     * 批量文件解析(http链接)
+     *
+     * @param params 上传参数
+     * @return /
+     */
+    List<UploadReportResult> uploadUrlReport(UploadUrlReportParams params);
+
+    /**
      * 批量上传文件解析
      *
      * @param files 文件流对象

+ 51 - 8
mo-daq/src/main/java/com/smppw/modaq/application/service/EmailParseApiServiceImpl.java

@@ -1,19 +1,14 @@
 package com.smppw.modaq.application.service;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.exceptions.ExceptionUtil;
 import cn.hutool.core.util.StrUtil;
-import com.smppw.modaq.application.util.EmailUtil;
-import com.smppw.modaq.common.conts.DateConst;
+import cn.hutool.http.HttpUtil;
 import com.smppw.modaq.common.enums.ReportParseStatus;
-import com.smppw.modaq.domain.dto.EmailContentInfoDTO;
 import com.smppw.modaq.domain.dto.MailboxInfoDTO;
 import com.smppw.modaq.domain.dto.UploadReportParams;
 import com.smppw.modaq.domain.dto.UploadReportResult;
-import com.smppw.modaq.domain.entity.EmailFileInfoDO;
-import com.smppw.modaq.domain.entity.EmailParseInfoDO;
+import com.smppw.modaq.domain.dto.UploadUrlReportParams;
 import com.smppw.modaq.domain.entity.MailboxInfoDO;
 import com.smppw.modaq.domain.mapper.MailboxInfoMapper;
 import com.smppw.modaq.domain.service.EmailParseService;
@@ -22,7 +17,9 @@ import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Date;
@@ -101,6 +98,41 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
     }
 
     @Override
+    public List<UploadReportResult> uploadUrlReport(UploadUrlReportParams params) {
+        List<UploadReportParams.ReportInfo> reportInfos = ListUtil.list(false);
+        List<UploadUrlReportParams.UrlReportInfo> urlReportInfos = params.getReportInfos();
+        for (UploadUrlReportParams.UrlReportInfo urlReportInfo : urlReportInfos) {
+            String reportUrl = urlReportInfo.getReportUrl();
+            String filename;
+            if (StrUtil.isNotBlank(getFileExtension(urlReportInfo.getReportName()))) {
+                filename = reportUrl;
+            } else {
+                filename = urlReportInfo.getReportName() + "." + getFileExtension(reportUrl);
+            }
+            File saveFile = this.emailParseService.generateSavePath("upload", new Date(), filename);
+            if (!saveFile.exists()) {
+                if (!saveFile.getParentFile().exists()) {
+                    saveFile.getParentFile().mkdirs();
+                }
+                HttpUtil.downloadFile(reportUrl, saveFile);
+            }
+            UploadReportParams.ReportInfo reportInfo = new UploadReportParams.ReportInfo(saveFile.getAbsolutePath());
+            reportInfo.setReportName(filename);
+            reportInfo.setReportType(urlReportInfo.getReportType());
+            reportInfo.setPdfPwd(urlReportInfo.getPdfPwd());
+            reportInfos.add(reportInfo);
+        }
+        UploadReportParams req = new UploadReportParams();
+        req.setReportInfos(reportInfos);
+        if (StrUtil.isBlank(params.getTitle())) {
+            req.setTitle("报告上传解析-url");
+        } else {
+            req.setTitle(params.getTitle());
+        }
+        return this.emailParseService.uploadReportResults(req);
+    }
+
+    @Override
     public List<UploadReportResult> batchUploadReport(MultipartFile[] files) {
         List<UploadReportResult> dataList = ListUtil.list(false);
         UploadReportParams params = new UploadReportParams();
@@ -298,4 +330,15 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
 //        return null;
 //    }
 
+    private static String getFileExtension(String fileName) {
+        if (fileName == null || fileName.isEmpty()) {
+            return "";
+        }
+        int lastDotIndex = fileName.lastIndexOf('.');
+        // 后缀不存在的情况:无点、点在开头(隐藏文件无后缀)、点在末尾
+        if (lastDotIndex == -1 || lastDotIndex == 0 || lastDotIndex == fileName.length() - 1) {
+            return "";
+        }
+        return fileName.substring(lastDotIndex + 1);
+    }
 }

+ 2 - 11
mo-daq/src/main/java/com/smppw/modaq/domain/dto/UploadReportParams.java

@@ -8,7 +8,6 @@ import com.smppw.modaq.common.conts.EmailTypeConst;
 import lombok.Getter;
 import lombok.Setter;
 
-import java.io.File;
 import java.util.List;
 
 @Setter
@@ -41,17 +40,14 @@ public class UploadReportParams {
         /**
          * 报告路径,必传
          */
+        @Getter
         private String reportPath;
-        /**
-         * 报告路径转file对象
-         */
-        private transient File reportFile;
 
         public String getReportName() {
             if (StrUtil.isNotBlank(this.reportName)) {
                 return this.reportName;
             }
-            return FileUtil.getName(this.reportFile);
+            return FileUtil.getName(this.reportPath);
         }
 
         public Integer getReportType() {
@@ -61,11 +57,6 @@ public class UploadReportParams {
             return EmailUtil.getEmailTypeBySubject(this.reportPath);
         }
 
-        public String getReportPath() {
-            this.reportFile = FileUtil.file(reportPath);
-            return reportPath;
-        }
-
         public ReportInfo() {
         }
 

+ 50 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/dto/UploadUrlReportParams.java

@@ -0,0 +1,50 @@
+package com.smppw.modaq.domain.dto;
+
+import cn.hutool.core.collection.ListUtil;
+import com.smppw.modaq.common.conts.EmailTypeConst;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Setter
+@Getter
+public class UploadUrlReportParams {
+    private String title;
+    private List<UrlReportInfo> reportInfos;
+
+    public UploadUrlReportParams() {
+        this.reportInfos = ListUtil.list(false);
+    }
+
+    @Setter
+    @Getter
+    public static class UrlReportInfo {
+        /**
+         * 报告名称
+         */
+        private String reportName;
+        /**
+         * 报告类型
+         *
+         * @see EmailTypeConst
+         */
+        private Integer reportType;
+        /**
+         * 如果pdf有密码,可以传密码过来
+         */
+        private String pdfPwd;
+        /**
+         * 报告路径,必传
+         */
+        private String reportUrl;
+
+        public UrlReportInfo() {
+        }
+
+        public UrlReportInfo(String reportName, String reportUrl) {
+            this.reportName = reportName;
+            this.reportUrl = reportUrl;
+        }
+    }
+}

+ 10 - 3
mo-daq/src/main/java/com/smppw/modaq/domain/service/EmailParseService.java

@@ -429,7 +429,9 @@ public class EmailParseService {
                     && ReportParseUtils.containsAny(emailTitle, ReportParseUtils.MONTHLY_REPORT_KEYWORDS)) {
                 type = EmailTypeConst.REPORT_EMAIL_TYPE;
             }
-            emailFile.setEmailType(type);
+            if (EmailTypeConst.SUPPORT_EMAIL_TYPES.contains(type)) {
+                emailFile.setEmailType(type);
+            }
         }
     }
 
@@ -557,11 +559,13 @@ public class EmailParseService {
         ReportParserFileType fileType = ReportParserFileType.getBySuffix(zipFile.getExtName());
         // 不支持的格式
         if (fileType == null) {
-            return new ParseResult<>(ReportParseStatus.NO_SUPPORT_TEMPLATE, null, fileName);
+            ReportData reportData = this.buildNvlReportData(fileId, reportType, null, fileName);
+            return new ParseResult<>(ReportParseStatus.NO_SUPPORT_TEMPLATE, reportData, fileName);
         }
         // 不是定期报告的判断逻辑放在不支持的格式下面
         if (reportType == null) {
-            return new ParseResult<>(ReportParseStatus.NOT_A_REPORT, null, fileName);
+            ReportData reportData = this.buildNvlReportData(fileId, ReportType.OTHER, null, fileName);
+            return new ParseResult<>(ReportParseStatus.NOT_A_REPORT, reportData, fileName);
         }
 
         // docx转pdf
@@ -859,6 +863,9 @@ public class EmailParseService {
         if (reportData != null) {
             return reportData;
         }
+        if (reportType == null) {
+            reportType = ReportType.OTHER;
+        }
         ReportBaseInfoDTO baseInfo = new ReportBaseInfoDTO(fileId);
         baseInfo.setReportName(fileName);
         baseInfo.setReportType(reportType.name());

+ 3 - 4
mo-daq/src/main/resources/mapper/EmailFileInfoMapper.xml

@@ -7,7 +7,7 @@
         <result column="file_name" property="fileName"/>
         <result column="file_path" property="filePath"/>
         <result column="ai_parse" property="aiParse"/>
-        <result column="ai_file_id" property="aiFileId"/>
+<!--        <result column="ai_file_id" property="aiFileId"/>-->
         <result column="isvalid" property="isvalid"/>
         <result column="creatorid" property="creatorId"/>
         <result column="createtime" property="createTime"/>
@@ -38,7 +38,7 @@
 <!--    </select>-->
 
     <select id="queryByEmailId" resultMap="BaseResultMap">
-        select id, file_name, file_path,ai_parse,ai_file_id
+        select id, file_name, file_path,ai_parse
         from mo_email_file_info
         where email_id = #{emailId}
           and isvalid = 1
@@ -238,8 +238,7 @@
     <update id="batchUpdateByFileId">
         <foreach collection="entityList" item="entity">
             update mo_email_file_info
-            set ai_file_id = #{entity.aiFileId},
-                ai_parse = #{entity.aiParse},
+            set ai_parse = #{entity.aiParse},
                 parse_status = #{entity.parseStatus},
                 fail_reason = #{entity.failReason},
                 updatetime = now()