|
@@ -34,6 +34,7 @@ import com.smppw.modaq.domain.entity.EmailParseInfoDO;
|
|
import com.smppw.modaq.domain.mapper.EmailFileInfoMapper;
|
|
import com.smppw.modaq.domain.mapper.EmailFileInfoMapper;
|
|
import com.smppw.modaq.domain.mapper.EmailParseInfoMapper;
|
|
import com.smppw.modaq.domain.mapper.EmailParseInfoMapper;
|
|
import com.smppw.modaq.infrastructure.util.ArchiveUtil;
|
|
import com.smppw.modaq.infrastructure.util.ArchiveUtil;
|
|
|
|
+import com.smppw.modaq.infrastructure.util.ConvertUtil;
|
|
import com.smppw.modaq.infrastructure.util.PdfUtil;
|
|
import com.smppw.modaq.infrastructure.util.PdfUtil;
|
|
import jakarta.mail.*;
|
|
import jakarta.mail.*;
|
|
import jakarta.mail.internet.MimeUtility;
|
|
import jakarta.mail.internet.MimeUtility;
|
|
@@ -176,9 +177,9 @@ public class EmailParseService {
|
|
Integer type = EmailUtil.getEmailTypeBySubject(emailTitle + emailFile.getFilename());
|
|
Integer type = EmailUtil.getEmailTypeBySubject(emailTitle + emailFile.getFilename());
|
|
// 特殊月报
|
|
// 特殊月报
|
|
if ((Objects.equals(EmailTypeConst.NAV_EMAIL_TYPE, type)
|
|
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)
|
|
&& (ReportParseUtils.containsAny(emailTitle, ReportParseUtils.MANAGER_KEYWORDS)
|
|
- || emailTitle.contains("定期报告"))) {
|
|
|
|
|
|
+ || emailTitle.contains("定期报告"))) {
|
|
type = EmailTypeConst.REPORT_EMAIL_TYPE;
|
|
type = EmailTypeConst.REPORT_EMAIL_TYPE;
|
|
}
|
|
}
|
|
// 其他报告
|
|
// 其他报告
|
|
@@ -610,9 +611,9 @@ public class EmailParseService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ocr信息提取(印章、联系人、基金名称和产品代码)
|
|
// ocr信息提取(印章、联系人、基金名称和产品代码)
|
|
- this.ocrReportData(reportType, reportData, fileName, images);
|
|
|
|
|
|
+ reportData = this.ocrReportData(fileId, reportType, reportData, fileName, images);
|
|
if (log.isInfoEnabled()) {
|
|
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 fileName 报告名称
|
|
* @param images 报告的收益和尾页png图片
|
|
* @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()) {
|
|
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) {
|
|
if (ReportType.LETTER != reportType) {
|
|
OCRParseData parseRes = null;
|
|
OCRParseData parseRes = null;
|
|
@@ -740,22 +744,24 @@ public class EmailParseService {
|
|
log.error("报告{} OCR提取确认单关键信息出错:{}", fileName, e.getMessage());
|
|
log.error("报告{} OCR提取确认单关键信息出错:{}", fileName, e.getMessage());
|
|
}
|
|
}
|
|
if (parseRes == null) {
|
|
if (parseRes == null) {
|
|
- return;
|
|
|
|
|
|
+ return reportData;
|
|
}
|
|
}
|
|
if (letterReportData.getFundInfo() != null) {
|
|
if (letterReportData.getFundInfo() != null) {
|
|
letterReportData.getFundInfo().setFundName(parseRes.getFundName());
|
|
letterReportData.getFundInfo().setFundName(parseRes.getFundName());
|
|
letterReportData.getFundInfo().setFundCode(parseRes.getFundCode());
|
|
letterReportData.getFundInfo().setFundCode(parseRes.getFundCode());
|
|
}
|
|
}
|
|
|
|
+ // 投资者信息
|
|
if (letterReportData.getInvestorInfo() == null) {
|
|
if (letterReportData.getInvestorInfo() == null) {
|
|
- letterReportData.setInvestorInfo(new ReportInvestorInfoDTO());
|
|
|
|
|
|
+ letterReportData.setInvestorInfo(new ReportInvestorInfoDTO(fileId));
|
|
}
|
|
}
|
|
letterReportData.getInvestorInfo().setInvestorName(parseRes.getInvestorName());
|
|
letterReportData.getInvestorInfo().setInvestorName(parseRes.getInvestorName());
|
|
letterReportData.getInvestorInfo().setCertificateNumber(parseRes.getCertificateNumber());
|
|
letterReportData.getInvestorInfo().setCertificateNumber(parseRes.getCertificateNumber());
|
|
letterReportData.getInvestorInfo().setTradingAccount(parseRes.getTradingAccount());
|
|
letterReportData.getInvestorInfo().setTradingAccount(parseRes.getTradingAccount());
|
|
letterReportData.getInvestorInfo().setFundAccount(parseRes.getFundAccount());
|
|
letterReportData.getInvestorInfo().setFundAccount(parseRes.getFundAccount());
|
|
letterReportData.getInvestorInfo().setCertificateType(parseRes.getCertificateType());
|
|
letterReportData.getInvestorInfo().setCertificateType(parseRes.getCertificateType());
|
|
|
|
+ // 交易流水
|
|
if (letterReportData.getFundTransaction() == null) {
|
|
if (letterReportData.getFundTransaction() == null) {
|
|
- letterReportData.setFundTransaction(new ReportFundTransactionDTO());
|
|
|
|
|
|
+ letterReportData.setFundTransaction(new ReportFundTransactionDTO(fileId));
|
|
}
|
|
}
|
|
letterReportData.getFundTransaction().setTransactionType(parseRes.getTransactionType());
|
|
letterReportData.getFundTransaction().setTransactionType(parseRes.getTransactionType());
|
|
letterReportData.getFundTransaction().setApplyDate(parseRes.getApplyDate());
|
|
letterReportData.getFundTransaction().setApplyDate(parseRes.getApplyDate());
|
|
@@ -766,7 +772,48 @@ public class EmailParseService {
|
|
letterReportData.getFundTransaction().setShare(parseRes.getShare());
|
|
letterReportData.getFundTransaction().setShare(parseRes.getShare());
|
|
letterReportData.getFundTransaction().setNav(parseRes.getNav());
|
|
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;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|