EmailParseApiServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package com.smppw.modaq.application.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.collection.ListUtil;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.exceptions.ExceptionUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import com.smppw.modaq.application.util.EmailUtil;
  8. import com.smppw.modaq.common.conts.DateConst;
  9. import com.smppw.modaq.common.enums.ReportParseStatus;
  10. import com.smppw.modaq.domain.dto.EmailContentInfoDTO;
  11. import com.smppw.modaq.domain.dto.MailboxInfoDTO;
  12. import com.smppw.modaq.domain.dto.UploadReportParams;
  13. import com.smppw.modaq.domain.dto.report.ParseResult;
  14. import com.smppw.modaq.domain.dto.report.ReportData;
  15. import com.smppw.modaq.domain.entity.EmailFileInfoDO;
  16. import com.smppw.modaq.domain.entity.EmailParseInfoDO;
  17. import com.smppw.modaq.domain.entity.MailboxInfoDO;
  18. import com.smppw.modaq.domain.mapper.MailboxInfoMapper;
  19. import com.smppw.modaq.domain.service.EmailParseService;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.stereotype.Service;
  23. import org.springframework.web.multipart.MultipartFile;
  24. import java.io.*;
  25. import java.net.URLDecoder;
  26. import java.net.URLEncoder;
  27. import java.nio.charset.StandardCharsets;
  28. import java.nio.file.Files;
  29. import java.util.Date;
  30. import java.util.List;
  31. import java.util.Objects;
  32. /**
  33. * @author mozuwen
  34. * @date 2024-09-12
  35. * @description 邮件解析服务对外接口实现层
  36. */
  37. @Service
  38. public class EmailParseApiServiceImpl implements EmailParseApiService {
  39. private static final Logger log = LoggerFactory.getLogger(EmailParseApiServiceImpl.class);
  40. private final MailboxInfoMapper mailboxInfoMapper;
  41. private final EmailParseService emailParseService;
  42. // private final EmailParseInfoMapper emailParseInfoMapper;
  43. // private final EmailFileInfoMapper emailFileInfoMapper;
  44. // private final ThreadPoolTaskExecutor asyncExecutor;
  45. // private final EmailTaskInfoMapper emailTaskInfoMapper;
  46. public EmailParseApiServiceImpl(MailboxInfoMapper mailboxInfoMapper,
  47. EmailParseService emailParseService) {
  48. this.mailboxInfoMapper = mailboxInfoMapper;
  49. this.emailParseService = emailParseService;
  50. // this.emailParseInfoMapper = emailParseInfoMapper;
  51. // this.emailFileInfoMapper = emailFileInfoMapper;
  52. }
  53. @Override
  54. public void parseEmail(Date startDate, Date endDate, List<String> folderNames, List<Integer> emailTypes) {
  55. List<MailboxInfoDO> mailboxList = this.mailboxInfoMapper.listMailboxInfo();
  56. for (MailboxInfoDO mailbox : mailboxList) {
  57. MailboxInfoDTO paramDTO = new MailboxInfoDTO();
  58. paramDTO.setAccount(mailbox.getEmail());
  59. paramDTO.setPassword(mailbox.getPassword());
  60. paramDTO.setPort(mailbox.getPort());
  61. paramDTO.setHost(mailbox.getServer());
  62. paramDTO.setProtocol(mailbox.getProtocol());
  63. this.parseEmail(paramDTO, startDate, endDate, folderNames, emailTypes);
  64. }
  65. }
  66. @Override
  67. public void parseEmail(MailboxInfoDTO mailboxInfoDTO, Date startDate, Date endDate, List<String> folderNames, List<Integer> emailTypes) {
  68. // Integer userId = null;
  69. // try{
  70. // if(UserUtils.getPrincipal() == null){
  71. // userId = 1;
  72. // }else{
  73. // userId = UserUtils.getLoginUser().getUserId();
  74. // }
  75. // }catch (Exception e){
  76. // log.error(e.getMessage());
  77. // }
  78. // Integer finalUserId = userId;
  79. // asyncExecutor.execute(() -> {
  80. //// EmailTaskInfoDO emailTaskInfoDO = startEmailTask(mailboxInfoDTO.getAccount(), 1, finalUserId);
  81. // try {
  82. //
  83. // } catch (Exception e) {
  84. // log.error(e.getMessage(), e);
  85. //// endEmailTask(emailTaskInfoDO.getId(),-1);
  86. //// return;
  87. // }
  88. //// endEmailTask(emailTaskInfoDO.getId(),2);
  89. // }
  90. // );
  91. emailParseService.parseEmail(mailboxInfoDTO, startDate, endDate, folderNames, emailTypes);
  92. }
  93. // @Override
  94. // public List<UploadReportResult> uploadReport(UploadReportParams params) {
  95. // return this.emailParseService.uploadReportResults(params);
  96. // }
  97. @Override
  98. public List<ParseResult<ReportData>> batchUploadReport(MultipartFile[] files) {
  99. List<ParseResult<ReportData>> dataList = ListUtil.list(false);
  100. UploadReportParams params = new UploadReportParams();
  101. for (MultipartFile file : files) {
  102. String filename = URLDecoder.decode(Objects.requireNonNull(file.getOriginalFilename()), StandardCharsets.UTF_8);
  103. File saveFile = this.emailParseService.generateSavePath("upload", new Date(), filename);
  104. if (!saveFile.exists()) {
  105. if (!saveFile.getParentFile().exists()) {
  106. saveFile.getParentFile().mkdirs();
  107. }
  108. try (InputStream is = file.getInputStream()) {
  109. Files.copy(is, saveFile.toPath());
  110. } catch (IOException e) {
  111. log.warn("文件{} 上传失败:{}", filename, ExceptionUtil.stacktraceToString(e));
  112. dataList.add(new ParseResult<>(ReportParseStatus.FILE_UPLOAD_FAIL, null));
  113. }
  114. }
  115. params.getReportInfos().add(new UploadReportParams.ReportInfo(saveFile.getAbsolutePath()));
  116. }
  117. params.setTitle("确认单上传解析");
  118. List<ParseResult<ReportData>> tempList = this.emailParseService.uploadReportResults(params);
  119. if (CollUtil.isNotEmpty(tempList)) {
  120. dataList.addAll(tempList);
  121. }
  122. return dataList;
  123. }
  124. // private void endEmailTask(Integer id,Integer taskStatus) {
  125. // try{
  126. // EmailTaskInfoDO emailTaskInfoDO = new EmailTaskInfoDO();
  127. // emailTaskInfoDO.setId(id);
  128. // emailTaskInfoDO.setTaskStatus(taskStatus);
  129. // emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
  130. // emailTaskInfoDO.setEndTime(DateUtils.getNowDate());
  131. // emailTaskInfoMapper.updateTaskStatusById(emailTaskInfoDO);
  132. // }catch (Exception e){
  133. // log.error(e.getMessage());
  134. // }
  135. // }
  136. //
  137. // private EmailTaskInfoDO startEmailTask(String email,Integer taskStatus,Integer userId) {
  138. // EmailTaskInfoDO emailTaskInfoDO = new EmailTaskInfoDO();
  139. // try{
  140. // emailTaskInfoDO.setTaskName(TaskType.EMAIL_PARSE.getInfo());
  141. // emailTaskInfoDO.setTaskType(TaskType.EMAIL_PARSE.getType());
  142. // emailTaskInfoDO.setTaskStatus(taskStatus);
  143. // emailTaskInfoDO.setStartTime(DateUtils.getNowDate());
  144. // emailTaskInfoDO.setIsvalid(1);
  145. // emailTaskInfoDO.setEmail(email);
  146. // emailTaskInfoDO.setCreateTime(DateUtils.getNowDate());
  147. // emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
  148. // emailTaskInfoDO.setCreatorId(userId);
  149. // emailTaskInfoDO.setUpdaterId(userId);
  150. // emailTaskInfoMapper.insert(emailTaskInfoDO);
  151. // }catch (Exception e){
  152. // log.error(e.getMessage());
  153. // }
  154. // return emailTaskInfoDO;
  155. // }
  156. // @Override
  157. // public void reparseEmail(Integer emailId) {
  158. // // 查询邮件信息
  159. // EmailParseInfoDO emailParseInfoDO = emailParseInfoMapper.queryById(emailId);
  160. // if (emailParseInfoDO == null) {
  161. // log.info("邮件不存在 ->邮件id:{}", emailId);
  162. // return;
  163. // }
  164. // //解析成功的邮件不再解析
  165. // if (emailParseInfoDO.getParseStatus() == 1) {
  166. // log.info("邮件解析状态为成功,不再解析 ->邮件id:{}", emailId);
  167. // return;
  168. // }
  169. // List<EmailFileInfoDO> emailFileInfoDOList = emailFileInfoMapper.queryByEmailId(emailId);
  170. // if (CollUtil.isEmpty(emailFileInfoDOList)) {
  171. // log.info("该邮件不存在附件 -> 邮件id:{}", emailId);
  172. // return;
  173. // }
  174. //// // 邮件字段识别映射表
  175. //// Map<String, List<String>> emailFieldMap = emailParseService.getEmailFieldMapping();
  176. //// // 邮件类型配置
  177. //// Map<Integer, List<String>> emailTypeMap = emailParseService.getEmailType();
  178. //
  179. // // 解析流程
  180. // List<EmailContentInfoDTO> emailContentInfoDTOList = buildEmailContentInfoDTO(emailId, emailParseInfoDO, emailFileInfoDOList);
  181. //
  182. //// List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
  183. // Map<EmailContentInfoDTO, List<EmailZipFileDTO>> emailZipFileMap = MapUtil.newHashMap();
  184. // for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
  185. // try {
  186. // List<EmailZipFileDTO> emailZipFiles = emailParseService.parseZipEmail(emailContentInfoDTO);
  187. // emailZipFileMap.put(emailContentInfoDTO, emailZipFiles);
  188. //// emailFundNavDTOList.addAll(fundNavDTOList);
  189. // } catch (Exception e) {
  190. // log.error("重新解析邮件失败,邮件id:{},堆栈信息:{}", emailId, ExceptionUtil.stacktraceToString(e));
  191. // }
  192. // }
  193. // // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
  194. // emailParseService.saveRelatedTable(null, emailParseInfoDO.getEmail(), emailZipFileMap);
  195. // }
  196. //
  197. // @Override
  198. // public void reparseFile(List<Integer> fileIdList) {
  199. // if (CollUtil.isEmpty(fileIdList)) {
  200. // return;
  201. // }
  202. // List<EmailInfoDTO> emailParseInfoDOList = emailParseInfoMapper.queryValuationEmailByFileId(fileIdList);
  203. // if (CollUtil.isEmpty(emailParseInfoDOList)) {
  204. // return;
  205. // }
  206. // asyncExecutor.execute(() -> {
  207. // Map<Integer, List<EmailInfoDTO>> emailIdFileMap = emailParseInfoDOList.stream().collect(Collectors.groupingBy(EmailInfoDTO::getId));
  208. // for (Map.Entry<Integer, List<EmailInfoDTO>> entry : emailIdFileMap.entrySet()) {
  209. // Integer emailId = entry.getKey();
  210. // List<EmailInfoDTO> emailInfoDTOList = entry.getValue();
  211. // String emailAddress = emailInfoDTOList.get(0).getEmail();
  212. // List<EmailContentInfoDTO> emailContentInfoDTOList = emailInfoDTOList.stream().map(this::buildEmailContentInfoDTO).collect(Collectors.toList());
  213. //
  214. // List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
  215. // Map<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavMap = MapUtil.newHashMap();
  216. // for (EmailContentInfoDTO emailContentInfoDTO : emailContentInfoDTOList) {
  217. // try {
  218. // log.info("开始重新解析文件 -> 文件id:{}", emailContentInfoDTO.getFileId());
  219. // List<EmailFundNavDTO> fundNavDTOList = emailParseService.parseEmail(emailContentInfoDTO, MapUtil.newHashMap());
  220. // fileNameNavMap.put(emailContentInfoDTO, fundNavDTOList);
  221. // emailFundNavDTOList.addAll(fundNavDTOList);
  222. // } catch (Exception e) {
  223. // log.error("重新解析文件失败,邮件id:{},文件id:{},堆栈信息:{}", emailId, emailContentInfoDTO.getFileId(), ExceptionUtil.stacktraceToString(e));
  224. // }
  225. // }
  226. // // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
  227. // emailParseService.saveRelatedTable(emailAddress, emailContentInfoDTOList, fileNameNavMap);
  228. // }
  229. // log.info("重新解析文件结束... -> 文件id:{}", fileIdList);
  230. // });
  231. // }
  232. // private EmailContentInfoDTO buildEmailContentInfoDTO(EmailInfoDTO emailInfoDTO) {
  233. // String emailDate = DateUtils.format(emailInfoDTO.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS);
  234. // String parseDate = DateUtils.format(new Date(), DateConst.YYYY_MM_DD_HH_MM_SS);
  235. // EmailContentInfoDTO contentInfoDTO = new EmailContentInfoDTO();
  236. // contentInfoDTO.setEmailId(emailInfoDTO.getId());
  237. // contentInfoDTO.setFileId(emailInfoDTO.getFileId());
  238. // contentInfoDTO.setEmailAddress(emailInfoDTO.getEmail());
  239. // contentInfoDTO.setEmailDate(emailDate);
  240. // contentInfoDTO.setEmailTitle(emailInfoDTO.getEmailTitle());
  241. // contentInfoDTO.setParseDate(parseDate);
  242. // contentInfoDTO.setFileName(emailInfoDTO.getFileName());
  243. // contentInfoDTO.setFilePath(emailInfoDTO.getFilePath());
  244. // contentInfoDTO.setEmailType(emailInfoDTO.getEmailType());
  245. // return contentInfoDTO;
  246. // }
  247. private List<EmailContentInfoDTO> buildEmailContentInfoDTO(Integer emailId,
  248. EmailParseInfoDO emailParseInfoDO,
  249. List<EmailFileInfoDO> emailFileInfoDOList) {
  250. List<EmailContentInfoDTO> emailContentInfoDTOList = CollUtil.newArrayList();
  251. String emailDate = DateUtil.format(emailParseInfoDO.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS);
  252. String parseDate = DateUtil.format(new Date(), DateConst.YYYY_MM_DD_HH_MM_SS);
  253. for (EmailFileInfoDO fileInfoDO : emailFileInfoDOList) {
  254. EmailContentInfoDTO contentInfoDTO = new EmailContentInfoDTO();
  255. contentInfoDTO.setEmailId(emailId);
  256. contentInfoDTO.setFileId(fileInfoDO.getId());
  257. contentInfoDTO.setSenderEmail(emailParseInfoDO.getSenderEmail());
  258. contentInfoDTO.setEmailAddress(emailParseInfoDO.getEmail());
  259. contentInfoDTO.setEmailDate(emailDate);
  260. contentInfoDTO.setEmailTitle(emailParseInfoDO.getEmailTitle());
  261. contentInfoDTO.setParseDate(parseDate);
  262. contentInfoDTO.setFileName(fileInfoDO.getFileName());
  263. contentInfoDTO.setFilePath(fileInfoDO.getFilePath());
  264. Integer emailType = EmailUtil.getEmailTypeBySubject(emailParseInfoDO.getEmailTitle());
  265. contentInfoDTO.setEmailType(emailType);
  266. String emailContent = readHtmlFileContent(fileInfoDO.getFilePath());
  267. contentInfoDTO.setEmailContent(emailContent);
  268. contentInfoDTO.setAiFileId(fileInfoDO.getAiFileId());
  269. emailContentInfoDTOList.add(contentInfoDTO);
  270. }
  271. return emailContentInfoDTOList;
  272. }
  273. public static String readHtmlFileContent(String filePath) {
  274. if (StrUtil.isNotBlank(filePath) && filePath.endsWith("html")) {
  275. StringBuilder content = new StringBuilder();
  276. try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
  277. String line;
  278. while ((line = reader.readLine()) != null) {
  279. // 追加每一行到StringBuilder中
  280. content.append(line).append("\n");
  281. }
  282. } catch (IOException e) {
  283. System.err.println("Error reading the file: " + e.getMessage());
  284. return null;
  285. }
  286. return content.toString();
  287. }
  288. return null;
  289. }
  290. }