Explorar el Código

fix:确认函类型识别的优先级提高到最高

wangzaijun hace 1 mes
padre
commit
bfcf856f59

+ 24 - 22
mo-daq/src/main/java/com/smppw/modaq/application/components/ReportParseUtils.java

@@ -370,7 +370,7 @@ public final class ReportParseUtils {
                             Matcher matcher = entry.getKey().matcher(str);
                             return matcher.find() ? entry.getValue().apply(matcher) : null;
                         })
-                        .filter(result -> result != null)
+                        .filter(Objects::nonNull)
                         .findFirst())
                 .orElse(null);
     }
@@ -378,36 +378,38 @@ public final class ReportParseUtils {
     /**
      * 匹配报告类型,如“季度”、“年度”
      *
-     * @param emailTYpe 邮件类型
+     * @param emailType 邮件类型
      * @param string    输入字符串
      * @return 匹配到的报告类型子字符串,如果没有匹配到则返回null
      */
-    public static ReportType matchReportType(Integer emailTYpe, String string) {
-        if (emailTYpe == null) {
+    public static ReportType matchReportType(Integer emailType, String string) {
+        if (emailType == null) {
             return null;
         }
         ReportType reportType = null;
-        if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailTYpe)) {
-            // 类型识别---先识别季度报告,没有季度再识别年度报告,最后识别月报
-            Pattern pattern = Pattern.compile("(\\d{1,2})月");  // xxxx_xx月
-            Matcher matcher = pattern.matcher(string);
-            if (StrUtil.containsAny(string, ReportType.QUARTERLY.getPatterns())) {
-                reportType = ReportType.QUARTERLY;
-            } else if (StrUtil.containsAny(string, ReportType.ANNUALLY.getPatterns())) {
-                reportType = ReportType.ANNUALLY;
-            } else if (StrUtil.containsAny(string, ReportType.MONTHLY.getPatterns())) {
-                reportType = ReportType.MONTHLY;
-            } else if (matcher.find()) {
-                // 特殊的月报(当季度->年度->月度报告无法识别时,如果包含“\\d{1,2}月”就说明也是月报)
-                reportType = ReportType.MONTHLY;
+        // 优先确认函、周报,然后才匹配定期报告,最后匹配其他观点
+        boolean isAmac = Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType);
+        if (!isAmac) {
+            if (Objects.equals(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE, emailType)
+                    || StrUtil.containsAny(string, ReportType.LETTER.getPatterns())) {
+                reportType = ReportType.LETTER;
+            } else if (StrUtil.containsAny(string, ReportType.WEEKLY.getPatterns())) {
+                reportType = ReportType.WEEKLY;
             }
             return reportType;
         }
-        //
-        if (StrUtil.containsAny(string, ReportType.LETTER.getPatterns())) {
-            reportType = ReportType.LETTER;
-        } else if (StrUtil.containsAny(string, ReportType.WEEKLY.getPatterns())) {
-            reportType = ReportType.WEEKLY;
+        // 类型识别---先识别季度报告,没有季度再识别年度报告,最后识别月报
+        Pattern pattern = Pattern.compile("(\\d{1,2})月");  // xxxx_xx月
+        Matcher matcher = pattern.matcher(string);
+        if (StrUtil.containsAny(string, ReportType.QUARTERLY.getPatterns())) {
+            reportType = ReportType.QUARTERLY;
+        } else if (StrUtil.containsAny(string, ReportType.ANNUALLY.getPatterns())) {
+            reportType = ReportType.ANNUALLY;
+        } else if (StrUtil.containsAny(string, ReportType.MONTHLY.getPatterns())) {
+            reportType = ReportType.MONTHLY;
+        } else if (matcher.find()) {
+            // 特殊的月报(当季度->年度->月度报告无法识别时,如果包含“\\d{1,2}月”就说明也是月报)
+            reportType = ReportType.MONTHLY;
         } else if (StrUtil.containsAny(string, ReportType.OTHER.getPatterns())) {
             reportType = ReportType.OTHER;
         }

+ 11 - 1
mo-daq/src/main/java/com/smppw/modaq/application/task/ParseSchedulerTask.java

@@ -32,7 +32,7 @@ public class ParseSchedulerTask {
     @PostConstruct
     public void executeOnStartup() {
 //        try {
-//            // 定期报告从 我的文件夹.报告公告 文件夹获取邮件
+//            // 定期报告从 其他文件夹/报告公告 文件夹获取邮件
 //            this.emailParseApiService.parseEmail(
 //                    DateUtil.parseDateTime("2025-05-12 10:24:00"),
 //                    DateUtil.parseDateTime("2025-05-12 10:25:00"),
@@ -40,6 +40,16 @@ public class ParseSchedulerTask {
 //        } catch (Exception e) {
 //            logger.error(ExceptionUtil.getMessage(e));
 //        }
+
+        try {
+            // 确认函从 INBOX 文件夹获取邮件
+            this.emailParseApiService.parseEmail(
+                    DateUtil.parseDateTime("2025-05-12 10:20:00"),
+                    DateUtil.parseDateTime("2025-05-12 10:21:00"),
+                    null, ListUtil.of(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE));
+        } catch (Exception e) {
+            logger.error(ExceptionUtil.getMessage(e));
+        }
     }
 
     /**

+ 8 - 11
mo-daq/src/main/java/com/smppw/modaq/domain/service/EmailParseService.java

@@ -372,9 +372,6 @@ public class EmailParseService {
         String registerNumber = ReportParseUtils.matchFundCode(fileName);
         // 类型识别---先识别季度报告,没有季度再识别年度报告,最后识别月报
         ReportType reportType = ReportParseUtils.matchReportType(emailType, fileName);
-        if (Objects.equals(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE, emailType)) {
-            reportType = ReportType.LETTER;
-        }
         if (reportType == null) {
             reportType = ReportParseUtils.matchReportType(emailType, emailTitle);
             if (log.isDebugEnabled()) {
@@ -553,19 +550,19 @@ public class EmailParseService {
 
     public Map<Integer, List<String>> getEmailType() {
         Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap(3, true);
-        // 定期报告的类型判断
+        // 1.确认函
+        emailTypeMap.put(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE,
+                ListUtil.toList(ReportType.LETTER.getPatterns()));
+        // 2.周报
+        emailTypeMap.put(EmailTypeConst.REPORT_WEEKLY_TYPE,
+                ListUtil.toList(ReportType.WEEKLY.getPatterns()));
+        // 3.定期报告的类型判断
         List<String> types = ListUtil.list(true);
         CollUtil.addAll(types, ReportType.QUARTERLY.getPatterns());
         CollUtil.addAll(types, ReportType.ANNUALLY.getPatterns());
         CollUtil.addAll(types, ReportType.MONTHLY.getPatterns());
         emailTypeMap.put(EmailTypeConst.REPORT_EMAIL_TYPE, types);
-        // 确认函
-        emailTypeMap.put(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE,
-                ListUtil.toList(ReportType.LETTER.getPatterns()));
-        // 周报
-        emailTypeMap.put(EmailTypeConst.REPORT_WEEKLY_TYPE,
-                ListUtil.toList(ReportType.WEEKLY.getPatterns()));
-        // 其他
+        // 4.其他
         emailTypeMap.put(EmailTypeConst.REPORT_OTHER_TYPE,
                 ListUtil.toList(ReportType.OTHER.getPatterns()));
         return emailTypeMap;

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

@@ -37,15 +37,15 @@ public class MoDaqApplicationTests {
 
     @Test
     public void reportTest() {
-        MailboxInfoDTO emailInfoDTO = this.buildMailbox("**@simuwang.com", "**");
-        Date startDate = DateUtil.parse("2025-05-10 15:40:00", DateConst.YYYY_MM_DD_HH_MM_SS);
-        Date endDate = DateUtil.parse("2025-05-10 17:59:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        MailboxInfoDTO emailInfoDTO = this.buildMailbox("wangzaijun@simuwang.com", "WZJ2twy1314");
+        Date startDate = DateUtil.parse("2025-05-13 16:50:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date endDate = DateUtil.parse("2025-05-13 16:53:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
             List<String> folderNames = ListUtil.list(false);
 //            folderNames.add("其他文件夹/报告公告");
             folderNames.add("INBOX");
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate,
-                    folderNames, EmailTypeConst.REPORT_EMAIL_TYPES);
+                    folderNames, ListUtil.of(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE));
         } catch (Exception e) {
             throw new RuntimeException(e);
         }