Explorar o código

feat:excel报告解析临时保存

wangzaijun hai 6 meses
pai
achega
4eae73148a

+ 2 - 1
service-base/src/main/java/com/simuwang/base/pojo/dto/report/CustomExcelTable.java

@@ -9,8 +9,9 @@ import java.io.Serializable;
  * @author wangzaijun
  * @date 2024/10/14 8:52
  * @description 自定义传递的表格对象,设置表格表格、列数(如果为0则不限制列数)、开始列索引和行数(包含表头,如果为0则不限制行数)
+ * key 表示这个表格属于什么信息的表格
  */
-public record CustomExcelTable(String title, int colCount, int startCol, int rowCount) implements Serializable {
+public record CustomExcelTable(String key, String title, int colCount, int startCol, int rowCount) implements Serializable {
     @Serial
     private static final long serialVersionUID = Constants.DEFAULT_SERIAL_ID;
 }

+ 7 - 1
service-base/src/main/java/com/simuwang/base/pojo/dto/report/SimpleTable.java

@@ -17,6 +17,7 @@ import java.util.List;
 public class SimpleTable implements Serializable {
     @Serial
     private static final long serialVersionUID = Constants.DEFAULT_SERIAL_ID;
+    private final String tableKey;
     /**
      * 表格标题
      */
@@ -34,7 +35,8 @@ public class SimpleTable implements Serializable {
      */
     private int rowCount;
 
-    public SimpleTable(String title, int colCount) {
+    public SimpleTable(String tableKey, String title, int colCount) {
+        this.tableKey = tableKey;
         this.title = title;
         this.colCount = colCount;
         this.rows = ListUtil.list(true);
@@ -56,6 +58,10 @@ public class SimpleTable implements Serializable {
         return rowCount;
     }
 
+    public String getTableKey() {
+        return tableKey;
+    }
+
     public String getTitle() {
         return title;
     }

+ 10 - 2
service-daq/src/main/java/com/simuwang/daq/components/CustomExcelMultiSheetListener.java

@@ -18,9 +18,17 @@ import java.util.List;
  * @description 自定义的excel多sheet解析事件监听器
  */
 public class CustomExcelMultiSheetListener extends AnalysisEventListener<LinkedHashMap<Integer, Object>> implements Closeable {
+    /**
+     * 所有提取出来的表格
+     */
     private final List<SimpleTable> tables = ListUtil.list(false);
+    /**
+     * 当前表格(每次标题变更都需要重新赋值)
+     */
     private SimpleTable table;
-
+    /**
+     * 当前提取表格的配置(每次标题变更都需要重新赋值)
+     */
     private CustomExcelTable customExcelTable;
 
     public List<SimpleTable> getTables() {
@@ -41,7 +49,7 @@ public class CustomExcelMultiSheetListener extends AnalysisEventListener<LinkedH
             for (CustomExcelTable customExcelTable : customExcelTables) {
                 String tableTitle = customExcelTable.title();
                 if (title.equals(tableTitle) || title.contains(tableTitle)) {
-                    this.table = new SimpleTable(tableTitle, customExcelTable.colCount());
+                    this.table = new SimpleTable(customExcelTable.key(), title, customExcelTable.colCount());
                     this.customExcelTable = customExcelTable;
                     this.tables.add(this.table);
                     return;

+ 18 - 0
service-daq/src/main/java/com/simuwang/daq/components/report/parser/AbstractReportParser.java

@@ -6,7 +6,9 @@ import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.simuwang.base.mapper.EmailFieldMappingMapper;
 import com.simuwang.base.pojo.dos.EmailFieldMappingDO;
+import com.simuwang.base.pojo.dto.report.ReportBaseInfoDTO;
 import com.simuwang.base.pojo.dto.report.ReportData;
+import com.simuwang.base.pojo.dto.report.ReportParserParams;
 import com.simuwang.daq.components.ReportParseUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -83,6 +85,22 @@ public abstract class AbstractReportParser<T extends ReportData> implements Repo
         }
     }
 
+    /**
+     * 构建报告基本信息
+     *
+     * @param params /
+     * @return /
+     */
+    protected ReportBaseInfoDTO buildReportInfo(ReportParserParams params) {
+        Integer fileId = params.getFileId();
+        String reportName = params.getFilename();
+        ReportBaseInfoDTO reportInfo = new ReportBaseInfoDTO(fileId);
+        reportInfo.setReportName(reportName);
+        reportInfo.setReportType(ReportParseUtils.matchReportType(reportName));
+        reportInfo.setReportDate(ReportParseUtils.matchReportDate(reportName));
+        return reportInfo;
+    }
+
 //    protected String cleaningValue(Object value) {
 //        return this.cleaningValue(value, true);
 //    }

+ 40 - 13
service-daq/src/main/java/com/simuwang/daq/components/report/parser/excel/AbstractExcelReportParser.java

@@ -1,13 +1,11 @@
 package com.simuwang.daq.components.report.parser.excel;
 
+import cn.hutool.core.exceptions.ExceptionUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.read.builder.ExcelReaderBuilder;
 import com.simuwang.base.common.exception.ReportParseException;
 import com.simuwang.base.mapper.EmailFieldMappingMapper;
-import com.simuwang.base.pojo.dto.report.CustomExcelTable;
-import com.simuwang.base.pojo.dto.report.ReportData;
-import com.simuwang.base.pojo.dto.report.ReportParserParams;
-import com.simuwang.base.pojo.dto.report.SimpleTable;
+import com.simuwang.base.pojo.dto.report.*;
 import com.simuwang.daq.components.CustomExcelMultiSheetListener;
 import com.simuwang.daq.components.report.parser.AbstractReportParser;
 
@@ -21,17 +19,38 @@ public abstract class AbstractExcelReportParser<T extends ReportData> extends Ab
 
     @Override
     public T parse(ReportParserParams params) throws IOException, ReportParseException {
+        String filename = params.getFilename();
         this.init();
         // 配置excel解析
         CustomExcelMultiSheetListener excelListener = new CustomExcelMultiSheetListener();
-        ExcelReaderBuilder readerBuilder = EasyExcel.read(params.getFilepath());
-        readerBuilder.sheet();
-        readerBuilder.customObject(this.customExcelTables());
-        readerBuilder.registerReadListener(excelListener);
-        readerBuilder.doReadAll();
-        // 解析出表格
-        List<SimpleTable> tables = excelListener.getTables();
-        return this.excelParse(tables, params);
+        try {
+            ExcelReaderBuilder readerBuilder = EasyExcel.read(params.getFilepath());
+            readerBuilder.sheet();
+            readerBuilder.customObject(this.customExcelTables());
+            readerBuilder.registerReadListener(excelListener);
+            readerBuilder.doReadAll();
+        } catch (Exception e) {
+            this.logger.warn("报告解析错误:{}", ExceptionUtil.stacktraceToString(e));
+            throw new ReportParseException(ReportParseStatus.NOT_A_FIXED_FORMAT, filename);
+        }
+        try {
+            // 从excel中提取的表格信息
+            List<SimpleTable> tables = excelListener.getTables();
+            // 报告基本信息
+            ReportBaseInfoDTO reportInfo = this.buildReportInfo(params);
+            // 解析报告中主体基金的基本信息
+            ReportFundInfoDTO reportFundInfo = this.buildFundInfo(params, tables);
+            // 解析其他表格信息并且设置结果字段
+            T reportData = this.parseExtInfoAndSetData(reportInfo, reportFundInfo, tables);
+            // 数据清洗后返回
+            this.cleaningReportData(reportData);
+            return reportData;
+        } catch (ReportParseException e) {
+            throw e;
+        } catch (Exception e) {
+            this.logger.warn("报告解析错误:{}", ExceptionUtil.stacktraceToString(e));
+            throw new ReportParseException(ReportParseStatus.NOT_A_FIXED_FORMAT, filename);
+        }
     }
 
     @Override
@@ -41,5 +60,13 @@ public abstract class AbstractExcelReportParser<T extends ReportData> extends Ab
 
     protected abstract List<CustomExcelTable> customExcelTables();
 
-    protected abstract T excelParse(List<SimpleTable> tables, ReportParserParams params);
+    protected abstract T parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo, ReportFundInfoDTO reportFundInfo, List<SimpleTable> tables);
+
+    /**
+     * 解析基金基本信息表格
+     *
+     * @param tables 表格
+     * @return /
+     */
+    protected abstract ReportFundInfoDTO buildFundInfo(ReportParserParams params, List<SimpleTable> tables);
 }

+ 11 - 8
service-daq/src/main/java/com/simuwang/daq/components/report/parser/excel/ExcelMonthlyReportParser.java

@@ -2,10 +2,7 @@ package com.simuwang.daq.components.report.parser.excel;
 
 import cn.hutool.core.collection.ListUtil;
 import com.simuwang.base.mapper.EmailFieldMappingMapper;
-import com.simuwang.base.pojo.dto.report.CustomExcelTable;
-import com.simuwang.base.pojo.dto.report.MonthlyReportData;
-import com.simuwang.base.pojo.dto.report.ReportParserParams;
-import com.simuwang.base.pojo.dto.report.SimpleTable;
+import com.simuwang.base.pojo.dto.report.*;
 import com.simuwang.daq.components.report.parser.ReportParserConstant;
 import org.springframework.stereotype.Component;
 
@@ -20,14 +17,20 @@ public class ExcelMonthlyReportParser extends AbstractExcelReportParser<MonthlyR
     @Override
     protected List<CustomExcelTable> customExcelTables() {
         List<CustomExcelTable> customExcelTables = ListUtil.list(true);
-        customExcelTables.add(new CustomExcelTable("基金概况", 4, 1, 0));
-        customExcelTables.add(new CustomExcelTable("净值月报", 5, 1, 2));
-        customExcelTables.add(new CustomExcelTable("级基金净值表", 5, 1, 2));
+        customExcelTables.add(new CustomExcelTable("fundInfo", "基金概况", 4, 1, 0));
+        customExcelTables.add(new CustomExcelTable("netReport", "净值月报", 5, 1, 2));
+        customExcelTables.add(new CustomExcelTable("netReport", "级基金净值表", 5, 1, 2));
         return customExcelTables;
     }
 
     @Override
-    protected MonthlyReportData excelParse(List<SimpleTable> tables, ReportParserParams params) {
+    protected MonthlyReportData parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo, ReportFundInfoDTO reportFundInfo, List<SimpleTable> tables) {
+        return null;
+    }
+
+    @Override
+    protected ReportFundInfoDTO buildFundInfo(ReportParserParams params, List<SimpleTable> tables) {
+        SimpleTable fundInfoTable = tables.stream().filter(e -> "fundInfo".equals(e.getTableKey())).findFirst().orElse(null);
         return null;
     }
 

+ 0 - 16
service-daq/src/main/java/com/simuwang/daq/components/report/parser/pdf/AbstractPDReportParser.java

@@ -142,22 +142,6 @@ public abstract class AbstractPDReportParser<T extends ReportData> extends Abstr
     }
 
     /**
-     * 构建报告基本信息
-     *
-     * @param params /
-     * @return /
-     */
-    private ReportBaseInfoDTO buildReportInfo(ReportParserParams params) {
-        Integer fileId = params.getFileId();
-        String reportName = params.getFilename();
-        ReportBaseInfoDTO reportInfo = new ReportBaseInfoDTO(fileId);
-        reportInfo.setReportName(reportName);
-        reportInfo.setReportType(ReportParseUtils.matchReportType(reportName));
-        reportInfo.setReportDate(ReportParseUtils.matchReportDate(reportName));
-        return reportInfo;
-    }
-
-    /**
      * 构建只有两列表格的dto数据对象,如果有分级基金时(并且一个表格可能跨页)
      *
      * @param <DTO>    泛型对象

+ 3 - 3
service-daq/src/main/java/com/simuwang/daq/utils/ExcelReportParseUtil.java

@@ -14,9 +14,9 @@ public class ExcelReportParseUtil {
 
     public static void main(String[] args) {
         List<CustomExcelTable> customExcelTables = ListUtil.list(true);
-        customExcelTables.add(new CustomExcelTable("基金概况", 4, 1, 0));
-        customExcelTables.add(new CustomExcelTable("净值月报", 5, 1, 2));
-        customExcelTables.add(new CustomExcelTable("级基金净值表", 5, 1, 2));
+        customExcelTables.add(new CustomExcelTable("fundInfo", "基金概况", 4, 1, 0));
+        customExcelTables.add(new CustomExcelTable("netReport", "级基金净值表", 5, 1, 2));
+        customExcelTables.add(new CustomExcelTable("netReport", "净值月报", 5, 1, 2));
 
         CustomExcelMultiSheetListener readListener = new CustomExcelMultiSheetListener();
         ExcelReaderBuilder readerBuilder = EasyExcel.read(filepath);