|
@@ -2,6 +2,7 @@ package com.simuwang.daq.service;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
+import cn.hutool.core.exceptions.ExceptionUtil;
|
|
import cn.hutool.core.lang.Pair;
|
|
import cn.hutool.core.lang.Pair;
|
|
import cn.hutool.core.map.MapUtil;
|
|
import cn.hutool.core.map.MapUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
@@ -15,6 +16,8 @@ import com.simuwang.base.pojo.dto.EmailFundNavDTO;
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
|
|
+import org.apache.poi.ss.usermodel.Workbook;
|
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
import org.jsoup.Jsoup;
|
|
import org.jsoup.Jsoup;
|
|
import org.jsoup.nodes.Document;
|
|
import org.jsoup.nodes.Document;
|
|
import org.jsoup.nodes.Element;
|
|
import org.jsoup.nodes.Element;
|
|
@@ -24,6 +27,8 @@ import org.slf4j.LoggerFactory;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.File;
|
|
import java.io.File;
|
|
|
|
+import java.io.FileOutputStream;
|
|
|
|
+import java.io.OutputStream;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
@@ -56,7 +61,7 @@ public class NavEmailParser extends AbstractEmailParser {
|
|
String emailContent = emailContentInfoDTO.getEmailContent();
|
|
String emailContent = emailContentInfoDTO.getEmailContent();
|
|
// 1.解析邮件正文
|
|
// 1.解析邮件正文
|
|
if (StrUtil.isNotBlank(emailContent)) {
|
|
if (StrUtil.isNotBlank(emailContent)) {
|
|
- emailFundNavDTOList = parseEmailContent(emailContent, emailFieldMap);
|
|
|
|
|
|
+ emailFundNavDTOList = parseEmailContent(emailContentInfoDTO, emailContent, emailFieldMap);
|
|
}
|
|
}
|
|
// 2.解析邮件excel附件
|
|
// 2.解析邮件excel附件
|
|
if (StrUtil.isNotBlank(emailContentInfoDTO.getFilePath()) && ExcelUtil.isExcel(emailContentInfoDTO.getFileName())) {
|
|
if (StrUtil.isNotBlank(emailContentInfoDTO.getFilePath()) && ExcelUtil.isExcel(emailContentInfoDTO.getFileName())) {
|
|
@@ -186,12 +191,12 @@ public class NavEmailParser extends AbstractEmailParser {
|
|
fundNavDTO.setNav(fieldValueMap.get(EmailFieldConst.NAV));
|
|
fundNavDTO.setNav(fieldValueMap.get(EmailFieldConst.NAV));
|
|
fundNavDTO.setCumulativeNavWithdrawal(fieldValueMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL));
|
|
fundNavDTO.setCumulativeNavWithdrawal(fieldValueMap.get(EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL));
|
|
String assetNet = fieldValueMap.get(EmailFieldConst.ASSET_NET);
|
|
String assetNet = fieldValueMap.get(EmailFieldConst.ASSET_NET);
|
|
- if (StrUtil.isBlank(assetNet) || !StrUtil.isNumeric(assetNet)) {
|
|
|
|
|
|
+ if (StrUtil.isBlank(assetNet)) {
|
|
assetNet = null;
|
|
assetNet = null;
|
|
}
|
|
}
|
|
fundNavDTO.setAssetNet(assetNet);
|
|
fundNavDTO.setAssetNet(assetNet);
|
|
String assetShares = fieldValueMap.get(EmailFieldConst.ASSET_NET);
|
|
String assetShares = fieldValueMap.get(EmailFieldConst.ASSET_NET);
|
|
- if (StrUtil.isBlank(assetShares) || !StrUtil.isNumeric(assetShares)) {
|
|
|
|
|
|
+ if (StrUtil.isBlank(assetShares)) {
|
|
assetShares = null;
|
|
assetShares = null;
|
|
}
|
|
}
|
|
fundNavDTO.setAssetShare(assetShares);
|
|
fundNavDTO.setAssetShare(assetShares);
|
|
@@ -238,13 +243,13 @@ public class NavEmailParser extends AbstractEmailParser {
|
|
emailFundNavDTO.setVirtualNav(virtualNav);
|
|
emailFundNavDTO.setVirtualNav(virtualNav);
|
|
String assetNet = columnFieldMap.get(EmailFieldConst.ASSET_NET) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET)) != null ?
|
|
String assetNet = columnFieldMap.get(EmailFieldConst.ASSET_NET) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET)) != null ?
|
|
ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET))) : null;
|
|
ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_NET))) : null;
|
|
- if (StrUtil.isBlank(assetNet) || !StrUtil.isNumeric(assetNet)) {
|
|
|
|
|
|
+ if (StrUtil.isBlank(assetNet)) {
|
|
assetNet = null;
|
|
assetNet = null;
|
|
}
|
|
}
|
|
emailFundNavDTO.setAssetNet(assetNet);
|
|
emailFundNavDTO.setAssetNet(assetNet);
|
|
String assetShares = columnFieldMap.get(EmailFieldConst.ASSET_SHARE) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE)) != null ?
|
|
String assetShares = columnFieldMap.get(EmailFieldConst.ASSET_SHARE) != null && sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE)) != null ?
|
|
ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE))) : null;
|
|
ExcelUtil.getCellValue(sheetRow.getCell(columnFieldMap.get(EmailFieldConst.ASSET_SHARE))) : null;
|
|
- if (StrUtil.isBlank(assetShares) || !StrUtil.isNumeric(assetShares)) {
|
|
|
|
|
|
+ if (StrUtil.isBlank(assetShares)) {
|
|
assetShares = null;
|
|
assetShares = null;
|
|
}
|
|
}
|
|
emailFundNavDTO.setAssetShare(assetShares);
|
|
emailFundNavDTO.setAssetShare(assetShares);
|
|
@@ -406,24 +411,44 @@ public class NavEmailParser extends AbstractEmailParser {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * 解析邮件正文
|
|
|
|
- *
|
|
|
|
- * @param emailContent 邮件excel附件地址
|
|
|
|
- * @param emailFieldMap 邮件字段识别规则映射表
|
|
|
|
- * @return 解析到的净值数据
|
|
|
|
- */
|
|
|
|
- private List<EmailFundNavDTO> parseEmailContent(String emailContent, Map<String, List<String>> emailFieldMap) {
|
|
|
|
- List<EmailFundNavDTO> fundNavDTOList = CollUtil.newArrayList();
|
|
|
|
|
|
+ private List<EmailFundNavDTO> parseEmailContent(EmailContentInfoDTO emailContentInfoDTO, String emailContent, Map<String, List<String>> emailFieldMap) {
|
|
Document doc = Jsoup.parse(emailContent);
|
|
Document doc = Jsoup.parse(emailContent);
|
|
Element table = doc.select("table").first();
|
|
Element table = doc.select("table").first();
|
|
Elements rows = table.select("tr");
|
|
Elements rows = table.select("tr");
|
|
- for (Element row : rows) {
|
|
|
|
- Elements cells = row.select("td");
|
|
|
|
- int cellSize = cells.size();
|
|
|
|
- // todo 后续补充
|
|
|
|
|
|
+ String excelFilePath = "/data/file/content/" + emailContentInfoDTO.getEmailDate().substring(0, 10).replaceAll("-","")
|
|
|
|
+ + "/" + emailContentInfoDTO.getFileName().replace(".html", ".xlsx");
|
|
|
|
+ File savefile = new File(excelFilePath);
|
|
|
|
+ if (!savefile.exists()) {
|
|
|
|
+ if (!savefile.getParentFile().exists()) {
|
|
|
|
+ savefile.getParentFile().mkdirs();
|
|
|
|
+ savefile.getParentFile().setExecutable(true);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- return fundNavDTOList;
|
|
|
|
|
|
+ try (OutputStream outputStream = new FileOutputStream(savefile)) {
|
|
|
|
+ // 创建一个新的Excel工作簿
|
|
|
|
+ Workbook workbook = new XSSFWorkbook();
|
|
|
|
+ Sheet sheet = workbook.createSheet("Sheet1");
|
|
|
|
+ writeDataToSheet(sheet, rows);
|
|
|
|
+ // 将Excel工作簿写入输出流
|
|
|
|
+ workbook.write(outputStream);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("解析正文报错 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
+ }
|
|
|
|
+ return parseExcelFile(excelFilePath, emailFieldMap);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void writeDataToSheet(Sheet sheet, Elements rows) {
|
|
|
|
+ int rowSize = rows.size();
|
|
|
|
+ for (int rowNum = 0; rowNum < rowSize; rowNum++) {
|
|
|
|
+ Row sheetRow = sheet.createRow(rowNum);
|
|
|
|
+
|
|
|
|
+ Element elementRow = rows.get(rowNum);
|
|
|
|
+ Elements cells = elementRow.select("td");
|
|
|
|
+ int cellSize = cells.size();
|
|
|
|
+ for (int cellNum = 0; cellNum< cellSize; cellNum++) {
|
|
|
|
+ Cell sheetRowCell = sheetRow.createCell(cellNum);
|
|
|
|
+ sheetRowCell.setCellValue(cells.get(cellNum).text());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|