Bladeren bron

fix:优化定期报告解析功能

wangzaijun 1 week geleden
bovenliggende
commit
35a8ce309f

+ 50 - 0
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/pdf/AbstractPDReportParser.java

@@ -219,4 +219,54 @@ public abstract class AbstractPDReportParser<T extends ReportData> extends Abstr
         }
         return dtos;
     }
+
+    /**
+     * 判断表格是否需要合并并且把需要合并的表格放在一个索引对应的map中(主要处理有分级基金数据表格,不处理可能会把数据绑定到错误的分级基金中)
+     *
+     * @param table                待判断的表格
+     * @param rowCount             判断依据(一个完整的表格有多少行)
+     * @param index                当前完整表格所在的索引位置
+     * @param tables               不需要合并的表格集合
+     * @param spanningPageTableMap 需要合并的表格数据
+     * @return /
+     */
+    protected int splitTables(Table table, int rowCount, int index,
+                              List<Table> tables, Map<Integer, List<Table>> spanningPageTableMap) {
+        if (table.getRowCount() == rowCount) {
+            index++;
+            tables.add(table);
+        } else {
+            List<Table> tempList = spanningPageTableMap.getOrDefault(index, ListUtil.list(true));
+            tempList.add(table);
+            spanningPageTableMap.putIfAbsent(index, tempList);
+            // 一个表格最多跨两页,所以一个表格最多被分成2部分
+            if (tempList.size() == 2) {
+                index++;
+            }
+        }
+        return index;
+    }
+
+    /**
+     * 把跨页的表格合并为一个并且插入到数据集合中的特定位置
+     *
+     * @param tables               数据集合
+     * @param spanningPageTableMap 跨页的表格对象
+     */
+    protected void handleSpanningPageTables(List<Table> tables,
+                                            Map<Integer, List<Table>> spanningPageTableMap) {
+        // 跨页的表格数据处理
+        for (Map.Entry<Integer, List<Table>> entry : spanningPageTableMap.entrySet()) {
+            List<Table> spanningPageShareChangeTables = entry.getValue();
+            Table master = spanningPageShareChangeTables.get(0);
+            Table slave = spanningPageShareChangeTables.get(1);
+            int rowCount = master.getRowCount();
+            for (int j = 0; j < slave.getRowCount(); j++) {
+                for (int k = 0; k < slave.getColCount(); k++) {
+                    master.add(slave.getCell(j, k), rowCount + j, k);
+                }
+            }
+            tables.add(entry.getKey(), master);
+        }
+    }
 }

+ 3 - 0
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/pdf/PDLetterReportParser.java

@@ -97,6 +97,9 @@ public class PDLetterReportParser extends AbstractPDReportParser<LetterReportDat
     @Override
     protected LetterReportData parseExtInfoAndSetData(ReportBaseInfoDTO reportInfo, ReportFundInfoDTO fundInfo) {
         Integer fileId = reportInfo.getFileId();
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("文件{} 解析的内容是:{}", fileId, this.allInfoMap);
+        }
         // 投资者信息
         ReportInvestorInfoDTO investorInfo = this.buildDto(fileId, ReportInvestorInfoDTO.class, this.allInfoMap);
         // 交易流水

+ 6 - 16
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/pdf/PDMonthlyReportParser.java

@@ -42,6 +42,8 @@ public class PDMonthlyReportParser extends AbstractPDReportParser<MonthlyReportD
 
     @Override
     protected void initTableInfo(List<Table> tables) {
+        Map<Integer, List<Table>> spanningPageTableMap = MapUtil.newHashMap(8, true);
+        int index = 0;
         // 一般月报是固定的模板,4列表格是基金基本信息,其他5列的表格是月净值
         for (Table table : tables) {
             int colCount = table.getColCount();
@@ -51,24 +53,12 @@ public class PDMonthlyReportParser extends AbstractPDReportParser<MonthlyReportD
             }
             if (colCount == 4) {
                 this.fundInfoTable = table;
-            } else if (colCount == 5 && rowCount == 2) {
-                this.extNavTables.add(table);
+            } else if (colCount == 5) {
+                index = this.splitTables(table, 2, index, this.extNavTables, spanningPageTableMap);
             }
         }
-        // 跨页表格合并处理
-        List<Table> spanningPageTables = tables.stream().filter(e -> e.getRowCount() == 1)
-                .filter(e -> e.getColCount() == 5).toList();
-        for (int i = 0; i < spanningPageTables.size(); i = i + 2) {
-            if (i + 1 >= spanningPageTables.size()) {
-                continue;
-            }
-            Table keyTable = spanningPageTables.get(i);
-            Table valueTable = spanningPageTables.get(i + 1);
-            for (int j = 0; j < valueTable.getColCount(); j++) {
-                keyTable.add(valueTable.getCell(0, j), 1, j);
-            }
-            this.extNavTables.add(keyTable);
-        }
+        // 跨页的净值记录表(包括表头一共有2行)
+        this.handleSpanningPageTables(this.extNavTables, spanningPageTableMap);
     }
 
     @Override

+ 2 - 51
mo-daq/src/main/java/com/smppw/modaq/application/components/report/parser/pdf/PDQuarterlyReportParser.java

@@ -72,9 +72,9 @@ public class PDQuarterlyReportParser<T extends QuarterlyReportData> extends Abst
                 List<String> texts = this.getTableColTexts(table, 0);
                 // 主要财务指标或份额变动
                 if (CollUtil.containsAny(texts, ReportParseUtils.SHARE_CHANGE_COLUMN_NAMES)) {
-                    sci = splitTables(table, 5, sci, this.shareChangeTables, spanningPageShareChangeTableMap);
+                    sci = this.splitTables(table, 5, sci, this.shareChangeTables, spanningPageShareChangeTableMap);
                 } else if (CollUtil.containsAny(texts, ReportParseUtils.FINANCIAL_INDICATORS_COLUMN_NAMES)) {
-                    fi = splitTables(table, 10, fi, this.financialIndicatorsTables, spanningPageFinancialIndicatorsTableMap);
+                    fi = this.splitTables(table, 10, fi, this.financialIndicatorsTables, spanningPageFinancialIndicatorsTableMap);
                 }
             } else if (colCount == 4) {
                 // 行业配置
@@ -291,53 +291,4 @@ public class PDQuarterlyReportParser<T extends QuarterlyReportData> extends Abst
         }
         return details;
     }
-
-    /**
-     * 判断表格是否需要合并并且把需要合并的表格放在一个索引对应的map中(主要处理有分级基金数据表格,不处理可能会把数据绑定到错误的分级基金中)
-     *
-     * @param table                待判断的表格
-     * @param rowCount             判断依据(一个完整的表格有多少行)
-     * @param index                当前完整表格所在的索引位置
-     * @param tables               不需要合并的表格集合
-     * @param spanningPageTableMap 需要合并的表格数据
-     * @return /
-     */
-    protected int splitTables(Table table, int rowCount, int index,
-                              List<Table> tables, Map<Integer, List<Table>> spanningPageTableMap) {
-        if (table.getRowCount() == rowCount) {
-            index++;
-            tables.add(table);
-        } else {
-            List<Table> tempList = spanningPageTableMap.getOrDefault(index, ListUtil.list(true));
-            tempList.add(table);
-            spanningPageTableMap.putIfAbsent(index, tempList);
-            if (tempList.size() == 2) {
-                index++;
-            }
-        }
-        return index;
-    }
-
-    /**
-     * 把跨页的表格合并为一个并且插入到数据集合中的特定位置
-     *
-     * @param tables               数据集合
-     * @param spanningPageTableMap 跨页的表格对象
-     */
-    protected void handleSpanningPageTables(List<Table> tables,
-                                            Map<Integer, List<Table>> spanningPageTableMap) {
-        // 跨页的份额变动记录表(包括表头一共有5行)
-        for (Map.Entry<Integer, List<Table>> entry : spanningPageTableMap.entrySet()) {
-            List<Table> spanningPageShareChangeTables = entry.getValue();
-            Table master = spanningPageShareChangeTables.get(0);
-            Table slave = spanningPageShareChangeTables.get(1);
-            int rowCount = master.getRowCount();
-            for (int j = 0; j < slave.getRowCount(); j++) {
-                for (int k = 0; k < slave.getColCount(); k++) {
-                    master.add(slave.getCell(j, k), rowCount + j, k);
-                }
-            }
-            tables.add(entry.getKey(), master);
-        }
-    }
 }