Преглед изворни кода

fix:邮件解析-实现邮件重新解析功能

mozuwen пре 7 месеци
родитељ
комит
dedaed2180

+ 1 - 1
service-base/src/main/java/com/simuwang/base/mapper/EmailFileInfoMapper.java

@@ -16,7 +16,7 @@ public interface EmailFileInfoMapper {
 
     EmailFileInfoDO getEmailFileById(@Param("id") Integer fileId);
 
-    List<EmailParseInfoDO> queryByEmailId(@Param("emailId") Integer emailId);
+    List<EmailFileInfoDO> queryByEmailId(@Param("emailId") Integer emailId);
 
     List<FundFileInfoVO> searchFundFileInfo(@Param("fundId") String fundId, @Param("fileType")Integer fileType);
 

+ 72 - 3
service-daq/src/main/java/com/simuwang/daq/service/EmailParseApiServiceImpl.java

@@ -1,16 +1,28 @@
 package com.simuwang.daq.service;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
+import cn.hutool.core.map.MapUtil;
+import com.simuwang.base.common.conts.DateConst;
+import com.simuwang.base.common.util.EmailUtil;
 import com.simuwang.base.mapper.EmailFileInfoMapper;
 import com.simuwang.base.mapper.EmailParseInfoMapper;
+import com.simuwang.base.pojo.dos.EmailFileInfoDO;
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
+import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
+import com.simuwang.base.pojo.dto.EmailFundNavDTO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author mozuwen
@@ -46,11 +58,68 @@ public class EmailParseApiServiceImpl implements EmailParseApiService {
             log.info("邮件不存在 ->邮件id:{}", emailId);
             return;
         }
-        List<EmailParseInfoDO> emailParseInfoDOList = emailFileInfoMapper.queryByEmailId(emailId);
-        if (CollUtil.isNotEmpty(emailParseInfoDOList)) {
+        List<EmailFileInfoDO> emailFileInfoDOList = emailFileInfoMapper.queryByEmailId(emailId);
+        if (CollUtil.isNotEmpty(emailFileInfoDOList)) {
             log.info("该邮件不存在附件 -> 邮件id:{}", emailId);
             return;
         }
-        // todo 走解析流程
+        // 邮件字段识别映射表
+        Map<String, List<String>> emailFieldMap = emailParseService.getEmailFieldMapping();
+        // 邮件类型配置
+        Map<Integer, List<String>> emailTypeMap = emailParseService.getEmailType();
+
+        // 解析流程
+        List<EmailContentInfoDTO> emailContentInfoDTOList = buildEmailContentInfoDTO(emailParseInfoDO, emailFileInfoDOList, emailTypeMap);
+
+        List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
+        Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap = MapUtil.newHashMap();
+        for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
+            try {
+                List<EmailFundNavDTO> fundNavDTOList = emailParseService.parseEmail(emailContentInfoDTO, emailFieldMap);
+                fileNameNavMap.put(emailContentInfoDTO, fundNavDTOList);
+                emailFundNavDTOList.addAll(fundNavDTOList);
+            } catch (Exception e) {
+                log.error("堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+            }
+        }
+        // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
+        emailParseService.saveRelatedTable(emailParseInfoDO.getEmail(), emailContentInfoDTOList, fileNameNavMap);
+    }
+
+    private List<EmailContentInfoDTO> buildEmailContentInfoDTO(EmailParseInfoDO emailParseInfoDO, List<EmailFileInfoDO> emailParseInfoDOList, Map<Integer, List<String>> emailTypeMap) {
+        List<EmailContentInfoDTO> emailContentInfoDTOList = CollUtil.newArrayList();
+        String emailDate = DateUtil.format(emailParseInfoDO.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS);
+        String parseDate = DateUtil.format(new Date(), DateConst.YYYY_MM_DD_HH_MM_SS);
+        for (EmailFileInfoDO fileInfoDO : emailParseInfoDOList) {
+            EmailContentInfoDTO contentInfoDTO = new EmailContentInfoDTO();
+            contentInfoDTO.setEmailAddress(emailParseInfoDO.getEmail());
+            contentInfoDTO.setEmailDate(emailDate);
+            contentInfoDTO.setEmailTitle(emailParseInfoDO.getEmailTitle());
+            contentInfoDTO.setParseDate(parseDate);
+            contentInfoDTO.setFileName(fileInfoDO.getFileName());
+            contentInfoDTO.setFilePath(fileInfoDO.getFilePath());
+            Integer emailType = EmailUtil.getEmailTypeBySubject(emailParseInfoDO.getEmailTitle(), emailTypeMap);
+            contentInfoDTO.setEmailType(emailType);
+            String emailContent = getEmailContent(fileInfoDO.getFilePath());
+            contentInfoDTO.setEmailContent(emailContent);
+            emailContentInfoDTOList.add(contentInfoDTO);
+        }
+        return emailContentInfoDTOList;
     }
+
+    public static String getEmailContent(String filePath) {
+        StringBuilder content = new StringBuilder();
+        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                // 追加每一行到StringBuilder中
+                content.append(line).append("\n");
+            }
+        } catch (IOException e) {
+            System.err.println("Error reading the file: " + e.getMessage());
+            return null;
+        }
+        return content.toString();
+    }
+
 }

+ 2 - 2
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -120,13 +120,13 @@ public class EmailParseService {
         }
     }
 
-    private List<EmailFundNavDTO> parseEmail(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
+    public List<EmailFundNavDTO> parseEmail(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
         Integer emailType = emailContentInfoDTO.getEmailType();
         AbstractEmailParser emailParser = emailParserFactory.getInstance(emailType);
         return emailParser.parse(emailContentInfoDTO, emailFieldMap);
     }
 
-    private void saveRelatedTable(String emailAddress, List<EmailContentInfoDTO> emailContentInfoDTOList, Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap) {
+    public void saveRelatedTable(String emailAddress, List<EmailContentInfoDTO> emailContentInfoDTOList, Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap) {
         String emailTitle = CollUtil.isNotEmpty(emailContentInfoDTOList) ? emailContentInfoDTOList.get(0).getEmailTitle() : null;
         String emailDate = CollUtil.isNotEmpty(emailContentInfoDTOList) ? emailContentInfoDTOList.get(0).getEmailDate() : null;
         Integer emailType = CollUtil.isNotEmpty(emailContentInfoDTOList) ? emailContentInfoDTOList.get(0).getEmailType() : null;