소스 검색

feat:邮件解析-兼容日期格式

mozuwen 9 달 전
부모
커밋
120d847551

+ 26 - 0
service-base/src/main/java/com/simuwang/base/common/util/DateUtils.java

@@ -1,5 +1,8 @@
 package com.simuwang.base.common.util;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.simuwang.base.common.conts.DateConst;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
 
@@ -7,8 +10,10 @@ import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.*;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 时间工具类
@@ -32,6 +37,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
             "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
             "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
 
+    private static final List<String> DATE_FORMATS = Arrays.asList("yyyy-MM-dd","yyyy-M-d","yyyy-MM-d","yyyy-M-dd",
+            "yyyy/MM/dd", "yyyy/M/d","yyyy/MM/d","yyyy/M/dd",
+            "yyyyMMdd");
     /**
      * 获取当前Date型日期
      * 
@@ -215,4 +223,22 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
         return Date.from(zdt.toInstant());
     }
+
+    public static String stringToDate(String dateString) {
+        if (StrUtil.isBlank(dateString)) {
+            return null;
+        }
+        dateString = dateString.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "-");
+        for (String format : DATE_FORMATS) {
+            SimpleDateFormat sdf = new SimpleDateFormat(format);
+            // 设置严格模式
+            sdf.setLenient(false);
+            try {
+                Date parse = sdf.parse(dateString);
+                return DateUtil.format(parse, DateConst.YYYY_MM_DD);
+            } catch (Exception e) {
+            }
+        }
+        return null;
+    }
 }

+ 2 - 3
service-base/src/main/java/com/simuwang/base/common/util/NavDataUtil.java

@@ -11,9 +11,8 @@ public class NavDataUtil {
 
     public static boolean navDataFormatCheck(EmailFundNavDTO fundNavDTO) {
         // 净值日期格式校验
-        boolean isvalidDate = StringUtil.isValidDate(fundNavDTO.getPriceDate());
-        if (!isvalidDate) {
-            log.warn("净值日期格式不正确 -> 解析到的数据:{}", fundNavDTO);
+        if (StrUtil.isBlank(fundNavDTO.getPriceDate())) {
+            log.warn("净值日期为空 -> 解析到的数据:{}", fundNavDTO);
             return false;
         }
         if(StrUtil.isBlank(fundNavDTO.getFundName()) && StrUtil.isBlank(fundNavDTO.getRegisterNumber())){

+ 0 - 22
service-base/src/main/java/com/simuwang/base/common/util/StringUtil.java

@@ -2,8 +2,6 @@ package com.simuwang.base.common.util;
 
 import cn.hutool.core.util.StrUtil;
 
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
 import java.util.List;
 
 import cn.hutool.core.text.StrFormatter;
@@ -15,8 +13,6 @@ import java.util.*;
 
 public class StringUtil {
 
-    private static final List<String> DATE_FORMATS = Arrays.asList("yyyy-MM-dd", "yyyy/MM/dd", "yyyyMMdd");
-
     /** 空字符串 */
     private static final String NULLSTR = "";
     private static final int STRING_BUILDER_SIZE = 256;
@@ -37,24 +33,6 @@ public class StringUtil {
         return value.replaceAll(regex, "");
     }
 
-    public static boolean isValidDate(String dateString) {
-        if (StrUtil.isBlank(dateString)) {
-            return false;
-        }
-        dateString = dateString.replaceAll("年", "-").replaceAll("月", "-").replaceAll("日", "-");
-        for (String format : DATE_FORMATS) {
-            SimpleDateFormat sdf = new SimpleDateFormat(format);
-            // 设置严格模式
-            sdf.setLenient(false);
-            try {
-                sdf.parse(dateString);
-                return true;
-            } catch (Exception e) {
-            }
-        }
-        return false;
-    }
-
     public static boolean isNumeric(String value) {
         if (StrUtil.isBlank(value)) {
             return false;

+ 16 - 22
service-daq/src/main/java/com/simuwang/daq/service/NavEmailParser.java

@@ -1,14 +1,14 @@
 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.lang.Pair;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
-import com.simuwang.base.common.conts.DateConst;
 import com.simuwang.base.common.conts.EmailDataDirectionConst;
 import com.simuwang.base.common.conts.EmailFieldConst;
 import com.simuwang.base.common.conts.EmailTypeConst;
+import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.common.util.ExcelUtil;
 import com.simuwang.base.common.util.StringUtil;
 import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
@@ -162,7 +162,7 @@ public class NavEmailParser extends AbstractEmailParser {
             return CollUtil.newArrayList();
         }
         // 2.解析sheet中的净值数据
-        List<EmailFundNavDTO> emailFundNavDTOList = parseSheetData(sheet, fieldPositionMap, null);
+        List<EmailFundNavDTO> emailFundNavDTOList = parseSheetData(filePath, sheet, fieldPositionMap, null);
         // 3.校验净值数据格式
         if (CollUtil.isNotEmpty(emailFundNavDTOList)) {
             emailFundNavDTOList = emailFundNavDTOList.stream().filter(super::dataFormat).collect(Collectors.toList());
@@ -188,12 +188,13 @@ public class NavEmailParser extends AbstractEmailParser {
     /**
      * 根据字段所在表格的位置提取净值数据
      *
+     * @param filePath         文件路径·
      * @param sheet            表格中的sheet页
      * @param fieldPositionMap 字段所在表格中的位置
      * @param direction        表格数据的形式:1-行,2-列
      * @return 净值数据
      */
-    private List<EmailFundNavDTO> parseSheetData(Sheet sheet, Map<String, Pair<Integer, Integer>> fieldPositionMap, Integer direction) {
+    private List<EmailFundNavDTO> parseSheetData(String filePath, Sheet sheet, Map<String, Pair<Integer, Integer>> fieldPositionMap, Integer direction) {
         List<EmailFundNavDTO> fundNavDTOList = CollUtil.newArrayList();
         // 通过表头所在位置判断是行数据还是列数据
         Integer dataDirectionType = direction != null ? direction : ExcelUtil.detectDataDirection(fieldPositionMap);
@@ -208,7 +209,11 @@ public class NavEmailParser extends AbstractEmailParser {
             // 遍历可能的数据行
             for (int rowNum = initRow + 1; rowNum <= lastRowNum; rowNum++) {
                 Row sheetRow = sheet.getRow(rowNum);
-                Optional.ofNullable(readSheetRowData(sheetRow, fieldColumnMap)).ifPresent(fundNavDTOList::addAll);
+                try {
+                    Optional.ofNullable(readSheetRowData(sheetRow, fieldColumnMap)).ifPresent(fundNavDTOList::addAll);
+                } catch (Exception e) {
+                    log.error("读取行数据报错 -> 行号:{},文件路径:{},堆栈信息:{}", rowNum, filePath, ExceptionUtil.stacktraceToString(e));
+                }
             }
         }
         if (dataDirectionType.equals(EmailDataDirectionConst.COLUMN_DIRECTION_TYPE)) {
@@ -264,10 +269,9 @@ public class NavEmailParser extends AbstractEmailParser {
                     priceDateMap.put(1, date);
                     continue;
                 }
-                boolean isValidDate = StringUtil.isValidDate(cellValue);
-                if (isValidDate) {
-                    String date = cellValue.replaceAll("年", "-").replaceAll("月", "-");
-                    priceDateMap.put(2, date);
+                String priceDate = DateUtils.stringToDate(cellValue);
+                if (StrUtil.isNotBlank(priceDate)) {
+                    priceDateMap.put(2, priceDate);
                 }
             }
         }
@@ -285,7 +289,7 @@ public class NavEmailParser extends AbstractEmailParser {
         EmailFundNavDTO fundNavDTO = new EmailFundNavDTO();
         fundNavDTO.setFundName(fieldValueMap.get(EmailFieldConst.FUND_NAME));
         fundNavDTO.setRegisterNumber(fieldValueMap.get(EmailFieldConst.REGISTER_NUMBER));
-        fundNavDTO.setPriceDate(fieldValueMap.get(EmailFieldConst.PRICE_DATE));
+        fundNavDTO.setPriceDate(DateUtils.stringToDate(fieldValueMap.get(EmailFieldConst.PRICE_DATE)));
         fundNavDTO.setNav(fieldValueMap.get(EmailFieldConst.NAV));
         fundNavDTO.setCumulativeNavWithdrawal(fieldValueMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL));
 
@@ -316,18 +320,13 @@ public class NavEmailParser extends AbstractEmailParser {
         EmailFundNavDTO emailFundNavDTO = new EmailFundNavDTO();
         String priceDate = columnFieldMap.get(EmailFieldConst.PRICE_DATE) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PRICE_DATE)) != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PRICE_DATE))) : null;
-        priceDate = StringUtil.isValidDate(priceDate) ? priceDate : null;
+        priceDate = DateUtils.stringToDate(priceDate);
+
         // 份额基金净值文件格式
         long parentFiledCount = columnFieldMap.keySet().stream().filter(e -> e.contains("parent")).count();
         if (parentFiledCount >= 1) {
             Optional.ofNullable(buildParentNav(sheetRow, columnFieldMap, priceDate)).ifPresent(fundNavDTOList::add);
         }
-        // 正常净值文件格式
-        if (StrUtil.isNotBlank(priceDate) && !priceDate.contains("-")) {
-            // 处理日期yyyyMMdd格式 -> 转成yyyy-MM-dd
-            priceDate = priceDate.replace("年", "").replace("月", "").replace("日", "");
-            priceDate = DateUtil.format(DateUtil.parse(priceDate, DateConst.YYYYMMDD), DateConst.YYYY_MM_DD);
-        }
         emailFundNavDTO.setPriceDate(priceDate);
         String fundName = ExcelUtil.getPriorityFieldValue(sheetRow, columnFieldMap.get(EmailFieldConst.LEVEL_FUND_NAME), columnFieldMap.get(EmailFieldConst.FUND_NAME));
         emailFundNavDTO.setFundName(fundName);
@@ -361,11 +360,6 @@ public class NavEmailParser extends AbstractEmailParser {
         if (StrUtil.isBlank(nav) && StrUtil.isBlank(cumulativeNavWithdrawal)) {
             return null;
         }
-        if (StrUtil.isNotBlank(priceDate) && !priceDate.contains("-")) {
-            // 处理日期yyyyMMdd格式 -> 转成yyyy-MM-dd
-            priceDate = priceDate.replace("年", "").replace("月", "").replace("日", "");
-            priceDate = DateUtil.format(DateUtil.parse(priceDate, DateConst.YYYYMMDD), DateConst.YYYY_MM_DD);
-        }
         emailFundNavDTO.setPriceDate(priceDate);
         String fundName = columnFieldMap.get(EmailFieldConst.PARENT_FUND_NAME) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_FUND_NAME)).getStringCellValue() != null ?
                 ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.PARENT_FUND_NAME))) : null;

+ 13 - 1
service-deploy/src/test/java/com/simuwang/ApplicationTest.java

@@ -3,6 +3,7 @@ package com.simuwang;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
 import com.simuwang.base.common.conts.DateConst;
+import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
 import com.simuwang.daq.service.EmailParseApiService;
 import com.simuwang.daq.service.EmailParseService;
@@ -10,6 +11,7 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.util.ArrayList;
 import java.util.Date;
 
 @SpringBootTest(classes = Application.class)
@@ -53,6 +55,16 @@ public class ApplicationTest {
 
     @Test
     public void testReparseFile() {
-        emailParseApiService.reparseFile(ListUtil.toList(40,43));
+        emailParseApiService.reparseFile(ListUtil.toList(40, 43));
+    }
+
+    @Test
+    public void testDateFormat() {
+        ArrayList<String> list = ListUtil.toList("20240705", "2024年07月05日", "2024年7月5日", "2024-07-05", "2024-7-5", "2024/07/05", "2024/7/5", "20240712",
+                "2024年07月12日", "2024年7月12日", "2024-07-12", "2024-7-12", "2024/07/12", "2024/7/12", "20241005", "2024年10月05日", "2024年10月5日", "2024-10-05", "2024-10-5", "2024/10/05", "2024/10/5");
+        for (String dateString : list) {
+            String date = DateUtils.stringToDate(dateString);
+            System.out.println(dateString + ": -> " + date);
+        }
     }
 }