Quellcode durchsuchen

feat:保证邮件都能下载并存表,托管方不校验印章

wangzaijun vor 3 Tagen
Ursprung
Commit
bd8bacac86

Datei-Diff unterdrückt, da er zu groß ist
+ 21 - 0
mo-daq/db/init.sql


+ 1 - 1
mo-daq/src/main/java/com/smppw/modaq/domain/dto/EmailContentInfoDTO.java

@@ -72,7 +72,7 @@ public class EmailContentInfoDTO implements Serializable {
     /**
      * 附件大小byte
      */
-    private int fileSize;
+    private long fileSize;
 
     @Override
     public boolean equals(Object o) {

+ 3 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/dto/EmailZipFileDTO.java

@@ -21,6 +21,9 @@ public class EmailZipFileDTO {
 
     private final String extName;
 
+    @Setter
+    private Integer fileId;
+
     public EmailZipFileDTO(String emailTitle, String filepath, Integer emailType) {
         File file = FileUtil.file(filepath);
         this.emailTitle = emailTitle;

+ 20 - 4
mo-daq/src/main/java/com/smppw/modaq/domain/entity/EmailFileInfoDO.java

@@ -1,5 +1,7 @@
 package com.smppw.modaq.domain.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
@@ -11,15 +13,16 @@ public class EmailFileInfoDO {
     /**
      * 主键Id
      */
+    @TableId(value = "id")
     private Integer id;
     /**
      * 邮件id(email_parse_info.id)
      */
     private Integer emailId;
-    /**
-     * 基金id
-     */
-    private Integer fundId;
+//    /**
+//     * 基金id
+//     */
+//    private Integer fundId;
     /**
      * 附件名称
      */
@@ -37,23 +40,36 @@ public class EmailFileInfoDO {
      */
     private String aiFileId;
     /**
+     * 当前报告解析状态
+     */
+    private Integer parseStatus;
+    /**
+     * 当前报告解析失败原因
+     */
+    private String failReason;
+    /**
      * 记录的有效性;1-有效;0-无效;
      */
+    @TableField(value = "isvalid")
     private Integer isvalid;
     /**
      * 创建者Id;第一次创建时与Creator值相同,修改时与修改人值相同
      */
+    @TableField(value = "creatorid")
     private Integer creatorId;
     /**
      * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
      */
+    @TableField(value = "updaterid")
     private Integer updaterId;
     /**
      * 创建时间,默认第一次创建的getdate()时间
      */
+    @TableField(value = "createtime")
     private Date createTime;
     /**
      * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
      */
+    @TableField(value = "updatetime")
     private Date updateTime;
 }

+ 49 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/entity/TgEmailConfigDO.java

@@ -0,0 +1,49 @@
+package com.smppw.modaq.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Setter
+@Getter
+@TableName("mo_email_tg_config")
+public class TgEmailConfigDO {
+    /**
+     * 主键Id
+     */
+    @TableId(value = "id")
+    private Integer id;
+
+    private String tg;
+    private String email;
+
+    /**
+     * 记录的有效性;1-有效;0-无效;
+     */
+    @TableField(value = "isvalid")
+    private Integer isvalid;
+    /**
+     * 创建者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     */
+    @TableField(value = "creatorid")
+    private Integer creatorId;
+    /**
+     * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     */
+    @TableField(value = "updaterid")
+    private Integer updaterId;
+    /**
+     * 创建时间,默认第一次创建的getdate()时间
+     */
+    @TableField(value = "createtime")
+    private Date createTime;
+    /**
+     * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+     */
+    @TableField(value = "updatetime")
+    private Date updateTime;
+}

+ 4 - 5
mo-daq/src/main/java/com/smppw/modaq/domain/mapper/EmailFileInfoMapper.java

@@ -1,5 +1,6 @@
 package com.smppw.modaq.domain.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.smppw.modaq.domain.entity.EmailFileInfoDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -8,9 +9,9 @@ import java.util.Date;
 import java.util.List;
 
 @Mapper
-public interface EmailFileInfoMapper {
+public interface EmailFileInfoMapper extends BaseMapper<EmailFileInfoDO> {
 
-    Integer insert(@Param("itemDo") EmailFileInfoDO emailFileInfoDO);
+    Integer insertById(@Param("itemDo") EmailFileInfoDO emailFileInfoDO);
 
 //    EmailFileInfoDO getEmailFileById(@Param("id") Integer fileId);
 //
@@ -32,9 +33,7 @@ public interface EmailFileInfoMapper {
 //
 //    List<String> getAllPriceDateByFileId(@Param("fileId") Integer fileId);
 
-    int updateAiParseByFileId(@Param("fileId") Integer fileId,
-                              @Param("aiParse") Boolean aiParse,
-                              @Param("aiFileId") String aiFileId);
+    int batchUpdateByFileId(@Param("entityList") List<EmailFileInfoDO> entityList);
 
     int getLetterFilenameSuccessCount(@Param("emailTitle") String emailTitle,
                                       @Param("filename") String filename);

+ 4 - 6
mo-daq/src/main/java/com/smppw/modaq/domain/mapper/EmailParseInfoMapper.java

@@ -1,5 +1,6 @@
 package com.smppw.modaq.domain.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.smppw.modaq.domain.entity.EmailParseInfoDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -7,9 +8,9 @@ import org.apache.ibatis.annotations.Param;
 import java.util.Date;
 
 @Mapper
-public interface EmailParseInfoMapper {
+public interface EmailParseInfoMapper extends BaseMapper<EmailParseInfoDO> {
 
-    Integer insert(@Param("itemDo") EmailParseInfoDO emailParseInfoDO);
+    Integer insertAndId(@Param("itemDo") EmailParseInfoDO emailParseInfoDO);
 
     void updateParseStatus(@Param("id") Integer id, @Param("parseStatus") int parseStatus, @Param("failReason") String failReason);
 
@@ -37,8 +38,5 @@ public interface EmailParseInfoMapper {
 //
 //    EmailParseInfoDO searchEmail(EmailParseInfoDO entity);
 
-    Integer countEmailByInfoAndStatus(@Param("emailTitle") String emailTitle,
-                                      @Param("senderAddress") String senderAddress,
-                                      @Param("emailAddress") String emailAddress,
-                                      @Param("emailDate") String emailDate);
+//    Integer countEmailByInfoAndStatus(@Param("entity") EmailParseInfoDO entity);
 }

+ 9 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/mapper/TgEmailConfigMapper.java

@@ -0,0 +1,9 @@
+package com.smppw.modaq.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.smppw.modaq.domain.entity.TgEmailConfigDO;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TgEmailConfigMapper extends BaseMapper<TgEmailConfigDO> {
+}

+ 159 - 97
mo-daq/src/main/java/com/smppw/modaq/domain/service/EmailParseService.java

@@ -8,6 +8,8 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.smppw.modaq.application.components.OCRReportParser;
 import com.smppw.modaq.application.components.ReportParseUtils;
 import com.smppw.modaq.application.components.report.parser.ReportParser;
@@ -31,8 +33,10 @@ import com.smppw.modaq.domain.dto.report.ocr.OCRLetterParseData;
 import com.smppw.modaq.domain.dto.report.ocr.OCRParseData;
 import com.smppw.modaq.domain.entity.EmailFileInfoDO;
 import com.smppw.modaq.domain.entity.EmailParseInfoDO;
+import com.smppw.modaq.domain.entity.TgEmailConfigDO;
 import com.smppw.modaq.domain.mapper.EmailFileInfoMapper;
 import com.smppw.modaq.domain.mapper.EmailParseInfoMapper;
+import com.smppw.modaq.domain.mapper.TgEmailConfigMapper;
 import com.smppw.modaq.infrastructure.util.ArchiveUtil;
 import com.smppw.modaq.infrastructure.util.ConvertUtil;
 import com.smppw.modaq.infrastructure.util.PdfUtil;
@@ -84,6 +88,9 @@ public class EmailParseService {
             // 按需添加其他类型...
     );
 
+    private static final List<String> TG_EMAIL_LIST = ListUtil.list(false);
+
+    private final TgEmailConfigMapper tgEmailConfigMapper;
     private final EmailParseInfoMapper emailParseInfoMapper;
     private final EmailFileInfoMapper emailFileInfoMapper;
     /* 报告解析和入库的方法 */
@@ -100,14 +107,25 @@ public class EmailParseService {
     @Value("${email.read-write-seen:true}")
     private boolean readWriteSeen;
 
-    public EmailParseService(EmailParseInfoMapper emailParseInfoMapper,
+    public EmailParseService(TgEmailConfigMapper tgEmailConfigMapper,
+                             EmailParseInfoMapper emailParseInfoMapper,
                              EmailFileInfoMapper emailFileInfoMapper,
                              ReportParserFactory reportParserFactory,
                              ReportWriterFactory reportWriterFactory) {
+        this.tgEmailConfigMapper = tgEmailConfigMapper;
         this.emailParseInfoMapper = emailParseInfoMapper;
         this.emailFileInfoMapper = emailFileInfoMapper;
         this.reportParserFactory = reportParserFactory;
         this.reportWriterFactory = reportWriterFactory;
+        this.init();
+    }
+
+    public void init() {
+        LambdaQueryWrapper<TgEmailConfigDO> wrapper = Wrappers.lambdaQuery(TgEmailConfigDO.class);
+        List<TgEmailConfigDO> dataList = this.tgEmailConfigMapper.selectList(wrapper);
+        for (TgEmailConfigDO temp : dataList) {
+            TG_EMAIL_LIST.add(temp.getEmail());
+        }
     }
 
     /**
@@ -120,7 +138,8 @@ public class EmailParseService {
      */
     public void parseEmail(MailboxInfoDTO mailboxInfoDTO,
                            Date startDate, Date endDate,
-                           List<String> folderNames, List<Integer> emailTypes) {
+                           List<String> folderNames,
+                           List<Integer> emailTypes) {
         if (CollUtil.isEmpty(emailTypes)) {
             emailTypes = ListUtil.of(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE);
         }
@@ -148,44 +167,70 @@ public class EmailParseService {
             }
             EmailContentInfoDTO dto = emailContentInfoDTOList.get(0);
             String emailTitle = dto.getEmailTitle();
-            log.info("开始解析邮件数据 -> 邮件主题:{},邮件日期:{}", emailTitle, dto.getEmailDate());
+            if (log.isInfoEnabled()) {
+                log.info("开始解析邮件数据 -> 邮件主题:{},邮件日期:{}", emailTitle, dto.getEmailDate());
+            }
+            Long totalSize = emailContentInfoDTOList.stream().map(EmailContentInfoDTO::getFileSize).reduce(0L, Long::sum);
+            String errMsg = null;
+            int status = 1;
             List<EmailZipFileDTO> emailFileList = ListUtil.list(false);
             EmailInfoDTO emailInfo = new EmailInfoDTO(dto, emailFileList);
-            for (EmailContentInfoDTO emailDto : emailContentInfoDTOList) {
-                // 正文不用解压附件
-                if (emailDto.getFileName() != null && emailDto.getFileName().endsWith(Constants.FILE_HTML)) {
-                    continue;
+            if (dto.getEmailContent() != null && dto.getEmailContent().contains("超大附件列表")) {
+                status = 0;
+                errMsg = "邮件中存在超大附件,需要手动处理该邮件";
+            } else {
+                for (EmailContentInfoDTO emailDto : emailContentInfoDTOList) {
+                    // 正文不用解压附件
+                    if (emailDto.getFileName() != null && emailDto.getFileName().endsWith(Constants.FILE_HTML)) {
+                        continue;
+                    }
+                    try {
+                        emailFileList.addAll(this.parseZipEmail(emailDto));
+                    } catch (IOException e) {
+                        log.error("邮件{} 压缩包解压失败:{}", emailTitle, ExceptionUtil.stacktraceToString(e));
+                        status = 0;
+                        errMsg = "压缩包解压失败";
+                    } catch (Exception e) {
+                        log.error("邮件{} 堆栈信息:{}", emailTitle, ExceptionUtil.stacktraceToString(e));
+                        status = 0;
+                        errMsg = "内部错误";
+                    }
                 }
-                try {
-                    emailFileList.addAll(this.parseZipEmail(emailDto));
-                } catch (IOException e) {
-                    log.error("压缩包解压失败:{}", ExceptionUtil.stacktraceToString(e));
-                    EmailParseInfoDO fail = buildEmailParseInfo(mailboxInfoDTO.getAccount(),
-                            dto.getEmailType(), emailInfo, emailDto.getFileSize());
-                    fail.setFailReason("压缩包解压失败");
-                    fail.setParseStatus(EmailParseStatusConst.FAIL);
-                    fail.setEmailKey(emailEntry.getKey());
-                    this.emailParseInfoMapper.insert(fail);
-                } catch (Exception e) {
-                    log.error("堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+                // 重新判断类型
+                this.recheckEmailType(emailTitle, emailFileList);
+                Iterator<EmailZipFileDTO> entryIterator = emailFileList.iterator();
+                while (entryIterator.hasNext()) {
+                    EmailZipFileDTO entry = entryIterator.next();
+                    if (!emailTypes.contains(entry.getEmailType())) {
+                        log.warn("当前邮件{} 中的报告{} 的类型{} 不在支持的任务类型{} 中,不用执行解析逻辑。",
+                                entry.getEmailTitle(), entry.getFilename(), entry.getEmailType(), emailTypes);
+                        entryIterator.remove();
+                    }
+                    ReportParserFileType fileType = ReportParserFileType.getBySuffix(entry.getExtName());
+                    if (fileType == null) {
+                        log.warn("当前邮件{} 中的文件{} 是不支持的文件格式{} 中,不用执行解析逻辑。",
+                                entry.getEmailTitle(), entry.getFilepath(), entry.getExtName());
+                        entryIterator.remove();
+                    }
                 }
             }
-            // 重新判断类型
-            this.recheckEmailType(emailTitle, emailFileList);
-            Iterator<EmailZipFileDTO> entryIterator = emailFileList.iterator();
-            while (entryIterator.hasNext()) {
-                EmailZipFileDTO entry = entryIterator.next();
-                if (!emailTypes.contains(entry.getEmailType())) {
-                    log.warn("当前邮件{} 文件{} 的类型{} 不在支持的任务类型{} 中,不用执行解析逻辑。",
-                            entry.getEmailTitle(), entry.getFilepath(), entry.getEmailType(), emailTypes);
-                    entryIterator.remove();
-                }
+            // 保存邮件信息
+            EmailParseInfoDO emailDo = this.buildEmailParseInfo(mailboxInfoDTO.getAccount(), emailInfo, totalSize);
+            emailDo.setEmailKey(emailEntry.getKey());
+            emailDo.setParseStatus(status);
+            emailDo.setFailReason(errMsg);
+            Integer emailId = this.saveEmailParseInfo(emailDo);
+            // 保存附件(解压后的)
+            for (EmailZipFileDTO zipFile : emailFileList) {
+                EmailFileInfoDO emailFile = this.saveEmailFileInfo(emailId, zipFile.getFilename(), zipFile.getFilepath());
+                zipFile.setFileId(emailFile.getId());
+            }
+            if (CollUtil.isNotEmpty(emailFileList)) {
+                // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
+                this.saveRelatedTable(emailId, emailInfo);
+                log.info("结束邮件解析 -> 邮箱信息:{},开始时间:{},结束时间:{}", emailEntry.getValue(),
+                        DateUtil.format(startDate, DateConst.YYYY_MM_DD_HH_MM_SS), DateUtil.format(endDate, DateConst.YYYY_MM_DD_HH_MM_SS));
             }
-
-            // 保存相关信息 -> 邮件信息表,邮件文件表,邮件净值表,邮件规模表,基金净值表
-            saveRelatedTable(emailEntry.getKey(), mailboxInfoDTO.getAccount(), emailInfo);
-            log.info("结束邮件解析 -> 邮箱信息:{},开始时间:{},结束时间:{}", emailEntry.getValue(),
-                    DateUtil.format(startDate, DateConst.YYYY_MM_DD_HH_MM_SS), DateUtil.format(endDate, DateConst.YYYY_MM_DD_HH_MM_SS));
         }
     }
 
@@ -278,33 +323,20 @@ public class EmailParseService {
     /**
      * 邮件附件解析并保存结果数据
      *
-     * @param emailKey     没封邮件的uuid
-     * @param emailAddress 发送人地址
-     * @param emailInfo    邮件信息
+     * @param emailId   邮件数据ID
+     * @param emailInfo 邮件信息
      */
-    public void saveRelatedTable(String emailKey, String emailAddress, EmailInfoDTO emailInfo) {
-        // 附件文件检查
-        Long totalSize = this.checkEmailFileInfo(emailInfo);
-        if (totalSize == null) {
-            return;
-        }
+    public void saveRelatedTable(Integer emailId, EmailInfoDTO emailInfo) {
         // 解析并保存数据
         List<ParseResult<ReportData>> dataList = ListUtil.list(true);
-        Integer emailId = this.parseResults(null, emailKey, emailAddress, totalSize, emailInfo, dataList);
+        this.parseResults(emailInfo, dataList);
 
         String failReason = null;
         int emailParseStatus = EmailParseStatusConst.SUCCESS;
         // 报告邮件有一条失败就表示整个邮件解析失败
         if (CollUtil.isNotEmpty(dataList)) {
-            // ai解析结果
-            List<ReportData> aiParaseList = dataList.stream().map(ParseResult::getData)
-                    .filter(Objects::nonNull).filter(e -> Objects.equals(true, e.getAiParse())).toList();
-            if (CollUtil.isNotEmpty(aiParaseList)) {
-                for (ReportData data : aiParaseList) {
-                    this.emailFileInfoMapper.updateAiParseByFileId(data.getBaseInfo().getFileId(),
-                            data.getAiParse(), data.getAiFileId());
-                }
-            }
+            List<EmailFileInfoDO> entityList = this.buildEmailFileInfo(dataList);
+            this.emailFileInfoMapper.batchUpdateByFileId(entityList);
             long failNum = dataList.stream().filter(e -> !Objects.equals(EmailParseStatusConst.SUCCESS, e.getStatus())).count();
             if (failNum > 0) {
                 emailParseStatus = EmailParseStatusConst.FAIL;
@@ -314,6 +346,20 @@ public class EmailParseService {
         this.emailParseInfoMapper.updateParseStatus(emailId, emailParseStatus, failReason);
     }
 
+    private List<EmailFileInfoDO> buildEmailFileInfo(List<ParseResult<ReportData>> dataList) {
+        List<EmailFileInfoDO> entityList = ListUtil.list(false);
+        for (ParseResult<ReportData> result : dataList) {
+            EmailFileInfoDO entity = new EmailFileInfoDO();
+            entity.setId(result.getData().getBaseInfo().getFileId());
+            entity.setParseStatus(result.getStatus());
+            entity.setFailReason(result.getMsg());
+            entity.setAiParse(result.getData().getAiParse());
+            entity.setAiFileId(result.getData().getAiFileId());
+            entityList.add(entity);
+        }
+        return entityList;
+    }
+
     /**
      * 上传文件解析并返回解析状态
      *
@@ -343,12 +389,19 @@ public class EmailParseService {
         // 重新判断类型
         this.recheckEmailType(emailTitle, dtos);
         EmailInfoDTO emailInfo = new EmailInfoDTO(emailTitle, dtos);
-        // 附件文件检查
-        Long totalSize = this.checkEmailFileInfo(emailInfo);
-        if (totalSize == null) {
-            return null;
+//        // 附件文件检查
+//        Long totalSize = this.checkEmailFileInfo(emailInfo);
+//        if (totalSize == null) {
+//            return null;
+//        }
+        Long totalSize = dtos.stream().map(EmailZipFileDTO::getFileSize).reduce(0L, Long::sum);
+        EmailParseInfoDO emailDo = this.buildEmailParseInfo("upload", emailInfo, totalSize);
+        Integer emailId = this.saveEmailParseInfo(emailDo);
+        for (EmailZipFileDTO zipFile : dtos) {
+            EmailFileInfoDO emailFile = this.saveEmailFileInfo(emailId, zipFile.getFilename(), zipFile.getFilepath());
+            zipFile.setFileId(emailFile.getId());
         }
-        this.parseResults(-1, null, null, totalSize, emailInfo, dataList);
+        this.parseResults(emailInfo, dataList);
         List<UploadReportResult> resultList = ListUtil.list(false);
         for (ParseResult<ReportData> result : dataList) {
             ReportData data = result.getData();
@@ -382,9 +435,8 @@ public class EmailParseService {
      * 邮件信息前置处理,在解析操作执行之前的过滤逻辑和校验逻辑。返回所有附件大小汇总
      *
      * @param emailInfo 邮件信息(包含所有解压后的文件)
-     * @return 所有附件大小汇总,为null说明没有文件需要上传
      */
-    private Long checkEmailFileInfo(EmailInfoDTO emailInfo) {
+    private void checkEmailFileInfo(EmailInfoDTO emailInfo) {
         String emailTitle = emailInfo.getEmailTitle();
         List<EmailZipFileDTO> dtos = emailInfo.getEmailFileList();
         // 如果压缩包里面既有pdf又有其他格式的文件,说明其他格式的文件是不需要解析的
@@ -437,45 +489,34 @@ public class EmailParseService {
         }
         if (CollUtil.isEmpty(dtos)) {
             log.info("邮件{} 所有文件都已经解析成功过,不能重复解析了", emailTitle);
-            return null;
+            return;
         }
         if (log.isInfoEnabled()) {
             log.info("邮件{} 还有报告待解析:\n{}", emailTitle, dtos);
         }
-        return totalSize;
     }
 
     /**
      * 邮件信息保存+附件解析
      *
-     * @param emailId      邮件ID,上传解析时一定是-1
-     * @param emailKey     邮件uuid(邮箱下载解析时)
-     * @param emailAddress 接收人地址(邮箱下载解析时)
-     * @param totalSize    所有附件大小汇总
-     * @param emailInfo    邮件信息,包含附件
-     * @param resultList   解析结果
-     * @return 邮件数据ID
+     * @param emailInfo  邮件信息,包含附件
+     * @param resultList 解析结果
      */
-    private Integer parseResults(Integer emailId,
-                                 String emailKey,
-                                 String emailAddress,
-                                 long totalSize,
-                                 EmailInfoDTO emailInfo,
-                                 List<ParseResult<ReportData>> resultList) {
+    private void parseResults(EmailInfoDTO emailInfo,
+                              List<ParseResult<ReportData>> resultList) {
         String emailTitle = emailInfo.getEmailTitle();
+        String senderEmail = emailInfo.getSenderEmail();
         List<EmailZipFileDTO> dtos = emailInfo.getEmailFileList();
-        if (emailId == null) {
-            // 保存邮件信息
-            Integer emailType = dtos.get(0).getEmailType();
-            EmailParseInfoDO emailParseInfoDO = this.buildEmailParseInfo(emailAddress, emailType, emailInfo, totalSize);
-            emailParseInfoDO.setEmailKey(emailKey);
-            emailId = this.saveEmailParseInfo(emailParseInfoDO);
+        if (CollUtil.isEmpty(dtos)) {
+            return;
         }
+        // 附件文件检查
+        this.checkEmailFileInfo(emailInfo);
         // 解析邮件报告
         for (EmailZipFileDTO zipFile : dtos) {
-            EmailFileInfoDO emailFile = this.saveEmailFileInfo(emailId, zipFile.getFilename(), zipFile.getFilepath());
+//            EmailFileInfoDO emailFile = this.saveEmailFileInfo(emailId, zipFile.getFilename(), zipFile.getFilepath());
             // 解析并保存报告
-            ParseResult<ReportData> parseResult = this.parseReportAndHandleResult(emailTitle, emailFile.getId(), zipFile);
+            ParseResult<ReportData> parseResult = this.parseReportAndHandleResult(emailTitle, senderEmail, zipFile);
             if (!Objects.equals(1, parseResult.getStatus())) {
                 log.error(parseResult.getMsg());
             }
@@ -485,20 +526,19 @@ public class EmailParseService {
             parseResult.getData().setReportPath(zipFile.getFilepath());
             resultList.add(parseResult);
         }
-        return emailId;
     }
 
     /**
      * 解析报告并保存解析结果
      *
      * @param emailTitle 邮件主题
-     * @param fileId     当前文件数据库ID
      * @param zipFile    当前报告的路径信息
      * @return /
      */
     private ParseResult<ReportData> parseReportAndHandleResult(String emailTitle,
-                                                               Integer fileId,
+                                                               String senderEmail,
                                                                EmailZipFileDTO zipFile) {
+        Integer fileId = zipFile.getFileId();
         Integer emailType = zipFile.getEmailType();
         String fileName = zipFile.getFilename();
         String filepath = zipFile.getFilepath();
@@ -618,7 +658,7 @@ public class EmailParseService {
                 }
             }
             // ocr信息提取(印章、联系人、基金名称和产品代码)
-            reportData = this.ocrReportData(fileId, reportType, reportData, fileName, images);
+            reportData = this.ocrReportData(fileId, reportType, reportData, fileName, senderEmail, images);
             if (log.isInfoEnabled()) {
                 log.info("报告{} 解析耗时{}ms,结果是:{}", fileName, (System.currentTimeMillis() - start), reportData);
             }
@@ -690,6 +730,7 @@ public class EmailParseService {
                                      ReportType reportType,
                                      ReportData reportData,
                                      String fileName,
+                                     String senderEmail,
                                      List<String> images) {
         if (CollUtil.isEmpty(images)) {
             return reportData;
@@ -710,14 +751,16 @@ public class EmailParseService {
                 log.error("报告{} OCR识别印章和联系人出错:{}", fileName, e.getMessage());
             }
             // ocr识别尾页是否包含印章和联系人信息
-            if (parseRes != null) {
-                if (reportData.getBaseInfo() != null) {
+            if (parseRes != null && reportData.getBaseInfo() != null) {
+                if (TG_EMAIL_LIST.contains(senderEmail)) {
+                    reportData.getBaseInfo().setWithSeals(true);
+                } else {
                     reportData.getBaseInfo().setWithSeals(parseRes.getWithSeals());
-                    reportData.getBaseInfo().setWithContacts(parseRes.getWithContacts());
                     if (fileName.contains("用印") && !Objects.equals(true, reportData.getBaseInfo().getWithSeals())) {
                         reportData.getBaseInfo().setWithSeals(true);
                     }
                 }
+                reportData.getBaseInfo().setWithContacts(parseRes.getWithContacts());
             }
             // 首页和尾页不相等时解析首页的数据
             if (images.size() != 1) {
@@ -853,10 +896,19 @@ public class EmailParseService {
         EmailFileInfoDO emailFileInfoDO = buildEmailFileInfoDO(emailId, fileName, filePath);
         emailFileInfoDO.setAiFileId(null);
         if (emailFileInfoDO.getId() != null) {
-            emailFileInfoMapper.updateTimeById(null, new Date());
+            this.emailFileInfoMapper.updateTimeById(emailFileInfoDO.getId(), new Date());
             return emailFileInfoDO;
         }
-        emailFileInfoMapper.insert(emailFileInfoDO);
+
+        LambdaQueryWrapper<EmailFileInfoDO> wrapper = Wrappers.lambdaQuery(EmailFileInfoDO.class)
+                .eq(EmailFileInfoDO::getEmailId, emailId)
+                .eq(EmailFileInfoDO::getFileName, fileName)
+                .eq(EmailFileInfoDO::getFilePath, filePath);
+        List<EmailFileInfoDO> tempList = this.emailFileInfoMapper.selectList(wrapper);
+        if (CollUtil.isNotEmpty(tempList)) {
+            return tempList.get(0);
+        }
+        this.emailFileInfoMapper.insertById(emailFileInfoDO);
         return emailFileInfoDO;
     }
 
@@ -880,15 +932,26 @@ public class EmailParseService {
         }
         // 重新邮件功能 -> 修改解析时间和更新时间
         if (emailParseInfoDO.getId() != null) {
-            emailParseInfoMapper.updateParseTime(emailParseInfoDO.getId(), emailParseInfoDO.getParseDate());
+            this.emailParseInfoMapper.updateParseTime(emailParseInfoDO.getId(), emailParseInfoDO.getParseDate());
             return emailParseInfoDO.getId();
         }
-        emailParseInfoMapper.insert(emailParseInfoDO);
+
+        LambdaQueryWrapper<EmailParseInfoDO> wrapper = Wrappers.lambdaQuery(EmailParseInfoDO.class)
+                .eq(EmailParseInfoDO::getEmailTitle, emailParseInfoDO.getEmailTitle())
+                .eq(EmailParseInfoDO::getSenderEmail, emailParseInfoDO.getSenderEmail())
+                .eq(EmailParseInfoDO::getEmailDate, emailParseInfoDO.getEmailDate())
+                .eq(EmailParseInfoDO::getEmail, emailParseInfoDO.getEmail())
+                .orderByDesc(EmailParseInfoDO::getId);
+        List<EmailParseInfoDO> tempList = this.emailParseInfoMapper.selectList(wrapper);
+        if (CollUtil.isNotEmpty(tempList)) {
+            this.emailParseInfoMapper.update(emailParseInfoDO, wrapper);
+            return tempList.get(0).getId();
+        }
+        this.emailParseInfoMapper.insertAndId(emailParseInfoDO);
         return emailParseInfoDO.getId();
     }
 
-    private EmailParseInfoDO buildEmailParseInfo(String emailAddress, Integer emailType,
-                                                 EmailInfoDTO emailInfo, long totalSize) {
+    private EmailParseInfoDO buildEmailParseInfo(String emailAddress, EmailInfoDTO emailInfo, long totalSize) {
         EmailParseInfoDO emailParseInfoDO = new EmailParseInfoDO();
         emailParseInfoDO.setId(null);
         emailParseInfoDO.setSenderEmail(emailInfo.getSenderEmail());
@@ -896,7 +959,6 @@ public class EmailParseService {
         emailParseInfoDO.setEmailDate(DateUtil.parse(emailInfo.getEmailDate(), DateConst.YYYY_MM_DD_HH_MM_SS));
         emailParseInfoDO.setParseDate(new Date());
         emailParseInfoDO.setEmailTitle(emailInfo.getEmailTitle());
-        emailParseInfoDO.setEmailType(emailType);
         emailParseInfoDO.setParseStatus(EmailParseStatusConst.SUCCESS);
         emailParseInfoDO.setAttrSize(totalSize);
         emailParseInfoDO.setIsvalid(1);

+ 13 - 1
mo-daq/src/main/resources/mapper/EmailFileInfoMapper.xml

@@ -15,7 +15,7 @@
         <result column="updatetime" property="updateTime"/>
     </resultMap>
 
-    <insert id="insert" parameterType="com.smppw.modaq.domain.entity.EmailFileInfoDO" useGeneratedKeys="true"
+    <insert id="insertById" parameterType="com.smppw.modaq.domain.entity.EmailFileInfoDO" useGeneratedKeys="true"
             keyProperty="id" keyColumn="id">
         insert into mo_email_file_info(email_id, file_name, file_path,
                                               isvalid, creatorid, createtime, updaterid, updatetime)
@@ -235,6 +235,18 @@
           and id = #{fileId}
     </update>
 
+    <update id="batchUpdateByFileId">
+        <foreach collection="entityList" item="entity">
+            update mo_email_file_info
+            set ai_file_id = #{entity.aiFileId},
+                ai_parse = #{entity.aiParse},
+                parse_status = #{entity.parseStatus},
+                fail_reason = #{entity.failReason},
+                updatetime = now()
+            where id = #{entity.id};
+        </foreach>
+    </update>
+
     <select id="getLetterFilenameSuccessCount" resultType="int">
         select count(1)
         from mo_email_file_info a

+ 10 - 10
mo-daq/src/main/resources/mapper/EmailParseInfoMapper.xml

@@ -22,7 +22,7 @@
     </resultMap>
 
 
-    <insert id="insert" parameterType="com.smppw.modaq.domain.entity.EmailParseInfoDO" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
+    <insert id="insertAndId" parameterType="com.smppw.modaq.domain.entity.EmailParseInfoDO" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
         insert into mo_email_parse_info(email,email_key, sender_email, email_date, parse_date, email_title, email_type, parse_status, fail_reason,
                                         attr_size,isvalid, creatorid, createtime, updaterid, updatetime)
         values (#{itemDo.email}, #{itemDo.emailKey}, #{itemDo.senderEmail}, #{itemDo.emailDate}, #{itemDo.parseDate}, #{itemDo.emailTitle}, #{itemDo.emailType}, #{itemDo.parseStatus},
@@ -256,13 +256,13 @@
 <!--        limit 1-->
 <!--    </select>-->
 
-    <select id="countEmailByInfoAndStatus" resultType="java.lang.Integer">
-        select count(1)
-        from mo_email_parse_info t
-        where t.sender_email = #{senderAddress}
-          and t.email = #{emailAddress}
-          and t.email_date = #{emailDate}
-          and t.email_title = #{emailTitle}
-          and t.parse_status = 1
-    </select>
+<!--    <select id="countEmailByInfoAndStatus" resultType="java.lang.Integer">-->
+<!--        select count(1)-->
+<!--        from mo_email_parse_info t-->
+<!--        where t.sender_email = #{entity.senderAddress}-->
+<!--          and t.email = #{entity.email}-->
+<!--          and t.email_date = #{entity.emailDate}-->
+<!--          and t.email_title = #{entity.emailTitle}-->
+<!--          and t.parse_status = 1-->
+<!--    </select>-->
 </mapper>