Parcourir la source

fix:修复ocr解析逻辑问题

wangzaijun il y a 1 semaine
Parent
commit
4fa1cae6d7

+ 7 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/dto/report/ReportFundTransactionDTO.java

@@ -239,6 +239,13 @@ public class ReportFundTransactionDTO extends BaseReportDTO<ReportFundTransactio
      */
     private String actualPerformanceShare;
 
+    public ReportFundTransactionDTO() {
+    }
+
+    public ReportFundTransactionDTO(Integer fileId) {
+        super(fileId);
+    }
+
     @Override
     public ReportFundTransactionDO toEntity() {
         ReportFundTransactionDO entity = new ReportFundTransactionDO();

+ 7 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/dto/report/ReportInvestorInfoDTO.java

@@ -37,6 +37,13 @@ public class ReportInvestorInfoDTO extends BaseReportDTO<ReportInvestorInfoDO> {
      */
     private String tradingAccount;
 
+    public ReportInvestorInfoDTO() {
+    }
+
+    public ReportInvestorInfoDTO(Integer fileId) {
+        super(fileId);
+    }
+
     @Override
     public ReportInvestorInfoDO toEntity() {
         ReportInvestorInfoDO entity = new ReportInvestorInfoDO();

+ 61 - 14
mo-daq/src/main/java/com/smppw/modaq/domain/service/EmailParseService.java

@@ -34,6 +34,7 @@ import com.smppw.modaq.domain.entity.EmailParseInfoDO;
 import com.smppw.modaq.domain.mapper.EmailFileInfoMapper;
 import com.smppw.modaq.domain.mapper.EmailParseInfoMapper;
 import com.smppw.modaq.infrastructure.util.ArchiveUtil;
+import com.smppw.modaq.infrastructure.util.ConvertUtil;
 import com.smppw.modaq.infrastructure.util.PdfUtil;
 import jakarta.mail.*;
 import jakarta.mail.internet.MimeUtility;
@@ -176,9 +177,9 @@ public class EmailParseService {
                 Integer type = EmailUtil.getEmailTypeBySubject(emailTitle + emailFile.getFilename());
                 // 特殊月报
                 if ((Objects.equals(EmailTypeConst.NAV_EMAIL_TYPE, type)
-                          || Objects.equals(EmailTypeConst.REPORT_OTHER_TYPE, type))
+                        || Objects.equals(EmailTypeConst.REPORT_OTHER_TYPE, type))
                         && (ReportParseUtils.containsAny(emailTitle, ReportParseUtils.MANAGER_KEYWORDS)
-                          || emailTitle.contains("定期报告"))) {
+                        || emailTitle.contains("定期报告"))) {
                     type = EmailTypeConst.REPORT_EMAIL_TYPE;
                 }
                 // 其他报告
@@ -610,9 +611,9 @@ public class EmailParseService {
                 }
             }
             // ocr信息提取(印章、联系人、基金名称和产品代码)
-            this.ocrReportData(reportType, reportData, fileName, images);
+            reportData = this.ocrReportData(fileId, reportType, reportData, fileName, images);
             if (log.isInfoEnabled()) {
-                log.info("报告{} 解析耗时{}ms,结果是:\n{}", fileName, (System.currentTimeMillis() - start), reportData);
+                log.info("报告{} 解析耗时{}ms,结果是:{}", fileName, (System.currentTimeMillis() - start), reportData);
             }
         }
         // 保存报告解析结果
@@ -678,16 +679,19 @@ public class EmailParseService {
      * @param fileName   报告名称
      * @param images     报告的收益和尾页png图片
      */
-    private void ocrReportData(ReportType reportType,
-                               ReportData reportData,
-                               String fileName,
-                               List<String> images) {
-        if (reportData == null || CollUtil.isEmpty(images)) {
-            return;
+    private ReportData ocrReportData(Integer fileId,
+                                     ReportType reportType,
+                                     ReportData reportData,
+                                     String fileName,
+                                     List<String> images) {
+        if (CollUtil.isEmpty(images)) {
+            return reportData;
         }
         if (log.isInfoEnabled()) {
-            log.info("报告{} 用ocr补充解析结果。补充前的结果是:\n{}", fileName, reportData);
+            log.info("报告{} 用ocr补充解析结果。补充前的结果是:{}", fileName, reportData);
         }
+        // 当reportData==null时重新构建一个reportData对象
+        reportData = this.buildNvlReportData(fileId, reportType, reportData, fileName);
         // 报告才识别尾页的印章和联系人,确认单不识别尾页
         if (ReportType.LETTER != reportType) {
             OCRParseData parseRes = null;
@@ -740,22 +744,24 @@ public class EmailParseService {
                     log.error("报告{} OCR提取确认单关键信息出错:{}", fileName, e.getMessage());
                 }
                 if (parseRes == null) {
-                    return;
+                    return reportData;
                 }
                 if (letterReportData.getFundInfo() != null) {
                     letterReportData.getFundInfo().setFundName(parseRes.getFundName());
                     letterReportData.getFundInfo().setFundCode(parseRes.getFundCode());
                 }
+                // 投资者信息
                 if (letterReportData.getInvestorInfo() == null) {
-                    letterReportData.setInvestorInfo(new ReportInvestorInfoDTO());
+                    letterReportData.setInvestorInfo(new ReportInvestorInfoDTO(fileId));
                 }
                 letterReportData.getInvestorInfo().setInvestorName(parseRes.getInvestorName());
                 letterReportData.getInvestorInfo().setCertificateNumber(parseRes.getCertificateNumber());
                 letterReportData.getInvestorInfo().setTradingAccount(parseRes.getTradingAccount());
                 letterReportData.getInvestorInfo().setFundAccount(parseRes.getFundAccount());
                 letterReportData.getInvestorInfo().setCertificateType(parseRes.getCertificateType());
+                // 交易流水
                 if (letterReportData.getFundTransaction() == null) {
-                    letterReportData.setFundTransaction(new ReportFundTransactionDTO());
+                    letterReportData.setFundTransaction(new ReportFundTransactionDTO(fileId));
                 }
                 letterReportData.getFundTransaction().setTransactionType(parseRes.getTransactionType());
                 letterReportData.getFundTransaction().setApplyDate(parseRes.getApplyDate());
@@ -766,7 +772,48 @@ public class EmailParseService {
                 letterReportData.getFundTransaction().setShare(parseRes.getShare());
                 letterReportData.getFundTransaction().setNav(parseRes.getNav());
             }
+            return letterReportData;
+        }
+        return reportData;
+    }
+
+    /**
+     * 当reportData==null时重新构建一个新对象
+     *
+     * @param fileId     文件ID
+     * @param reportType 报告类型
+     * @param reportData 解析结果对象
+     * @param fileName   报告名称
+     * @return /
+     */
+    private ReportData buildNvlReportData(Integer fileId,
+                                          ReportType reportType,
+                                          ReportData reportData,
+                                          String fileName) {
+        if (reportData != null) {
+            return reportData;
+        }
+        ReportBaseInfoDTO baseInfo = new ReportBaseInfoDTO(fileId);
+        baseInfo.setReportName(fileName);
+        baseInfo.setReportType(reportType.name());
+        String reportDate = ReportParseUtils.matchReportDate(reportType, fileName);
+        baseInfo.setReportDate(ConvertUtil.toDate(reportDate));
+        ReportFundInfoDTO fundInfo = new ReportFundInfoDTO(fileId);
+        if (ReportType.ANNUALLY == reportType) {
+            reportData = new AnnuallyReportData(baseInfo, fundInfo);
+        } else if (ReportType.QUARTERLY == reportType) {
+            reportData = new QuarterlyReportData(baseInfo, fundInfo);
+        } else if (ReportType.MONTHLY == reportType) {
+            reportData = new MonthlyReportData(baseInfo, fundInfo);
+        } else if (ReportType.WEEKLY == reportType) {
+            reportData = new WeeklyReportData(baseInfo, fundInfo);
+        } else if (ReportType.OTHER == reportType) {
+            reportData = new ReportData.DefaultReportData(baseInfo, fundInfo);
+        } else if (ReportType.LETTER == reportType) {
+            reportData = new LetterReportData(baseInfo, fundInfo);
         }
+        reportData.setAiParse(true);
+        return reportData;
     }
 
     /**

+ 1 - 1
mo-daq/src/test/java/com/smppw/modaq/MoDaqApplicationTests.java

@@ -26,7 +26,7 @@ public class MoDaqApplicationTests {
     @Test
     public void letterTest() {
         MailboxInfoDTO emailInfoDTO = this.buildMailbox("**@simuwang.com", "**");
-        Date startDate = DateUtil.parse("2025-06-18 08:47:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date startDate = DateUtil.parse("2025-06-18 17:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         Date endDate = DateUtil.parse("2025-06-18 18:56:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
             List<String> folderNames = ListUtil.list(false);