Pārlūkot izejas kodu

feat:邮件解析-兼容读取到的日期单元格为数值的情况

mozuwen 6 mēneši atpakaļ
vecāks
revīzija
9c9c855a30

+ 12 - 0
service-base/src/main/java/com/simuwang/base/common/util/ExcelUtil.java

@@ -24,6 +24,8 @@ import java.io.*;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.text.NumberFormat;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -437,4 +439,14 @@ public class ExcelUtil {
         return count == 1 ? EmailDataDirectionConst.COLUMN_DIRECTION_TYPE : EmailDataDirectionConst.ROW_DIRECTION_TYPE;
     }
 
+    // Excel 的起始日期是 1900 年 1 月 1 日
+    private static final LocalDate EXCEL_EPOCH_DATE = LocalDate.of(1900, 1, 1);
+
+
+    public static String convertExcelDateToString(String dateNum) {
+        LocalDate startDate = LocalDate.of(1900, 1, 1);
+        LocalDate localDate = startDate.plusDays(Math.round(Double.valueOf(dateNum) - 2));
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        return localDate.format(formatter);
+    }
 }

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

@@ -653,4 +653,10 @@ public class StringUtil {
             return false;
         }
     }
+
+    public static boolean compare2NumericValue(String value) {
+        int parsedInt = Integer.parseInt(value);
+        // 52962==2044-12-31
+        return parsedInt <= 52962;
+    }
 }

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

@@ -12,6 +12,7 @@ import com.simuwang.base.common.conts.EmailFieldConst;
 import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.common.util.ExcelUtil;
 import com.simuwang.base.common.util.NavDataUtil;
+import com.simuwang.base.common.util.StringUtil;
 import com.simuwang.base.mapper.EmailTemplateApplicationRuleMapper;
 import com.simuwang.base.mapper.EmailTemplateDataRuleMapper;
 import com.simuwang.base.mapper.EmailTemplateMappingMapper;
@@ -193,9 +194,13 @@ public class EmailTemplateService {
                     String fieldName = fieldEntry.getKey();
                     int columnIndex = fieldEntry.getValue().getValue();
                     Cell cell = row.getCell(columnIndex);
+                    String value = ExcelUtil.getCellValue(cell);
                     String fieldRule = fieldPatternMap.get(fieldName);
-                    String cellValue = getValueByPattern(ExcelUtil.getCellValue(cell), fieldRule);
-
+                    boolean isDateFormat = fieldName.equals(EmailFieldConst.PRICE_DATE) && StringUtil.isNumeric(value) && StrUtil.isNotBlank(value) &&  StringUtil.compare2NumericValue(value);
+                    if (isDateFormat) {
+                        value = ExcelUtil.convertExcelDateToString(value);
+                    }
+                    String cellValue = getValueByPattern(value, fieldRule);
                     BigDecimal unitConvert = fieldUnitConvertMap.get(fieldName);
                     cellValue = getValueAfterUnitConvert(cellValue, unitConvert);
                     fieldValueMap.put(fieldName, cellValue);

+ 10 - 1
service-daq/src/main/java/com/simuwang/daq/service/NavEmailParser.java

@@ -292,7 +292,12 @@ 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(DateUtils.stringToDate(fieldValueMap.get(EmailFieldConst.PRICE_DATE)));
+        String priceDate = fieldValueMap.get(EmailFieldConst.PRICE_DATE);
+        boolean isDateFormat = StrUtil.isNotBlank(priceDate) && StringUtil.isNumeric(priceDate) && StringUtil.compare2NumericValue(priceDate);
+        if (isDateFormat) {
+            priceDate = ExcelUtil.convertExcelDateToString(priceDate);
+        }
+        fundNavDTO.setPriceDate(priceDate);
         fundNavDTO.setNav(fieldValueMap.get(EmailFieldConst.NAV));
         fundNavDTO.setCumulativeNavWithdrawal(fieldValueMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL));
 
@@ -320,6 +325,10 @@ 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;
+        boolean isDateFormat = StrUtil.isNotBlank(priceDate) && StringUtil.isNumeric(priceDate) && StringUtil.compare2NumericValue(priceDate);
+        if (isDateFormat) {
+            priceDate = ExcelUtil.convertExcelDateToString(priceDate);
+        }
         priceDate = DateUtils.stringToDate(priceDate);
 
         // 份额基金净值文件格式