|
@@ -7,12 +7,16 @@ import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.http.HttpUtil;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
|
import com.simuwang.base.common.conts.EmailParseStatusConst;
|
|
|
import com.simuwang.base.common.conts.NavParseStatusConst;
|
|
|
import com.simuwang.base.common.conts.EmailTypeConst;
|
|
|
import com.simuwang.base.common.util.EmailUtil;
|
|
|
import com.simuwang.base.common.util.FileUtil;
|
|
|
+import com.simuwang.base.config.DaqProperties;
|
|
|
import com.simuwang.base.config.EmailRuleConfig;
|
|
|
import com.simuwang.base.mapper.*;
|
|
|
import com.simuwang.base.pojo.dos.*;
|
|
@@ -49,6 +53,8 @@ public class EmailParseService {
|
|
|
@Value("${email.file.path}")
|
|
|
private String path;
|
|
|
|
|
|
+ private final String pyBaseUrl;
|
|
|
+
|
|
|
private final EmailTypeRuleMapper emailTypeRuleMapper;
|
|
|
private final EmailRuleConfig emailRuleConfig;
|
|
|
private final EmailFieldMappingMapper emailFieldMapper;
|
|
@@ -67,7 +73,7 @@ public class EmailParseService {
|
|
|
EmailParseInfoMapper emailParseInfoMapper, EmailFileInfoMapper emailFileInfoMapper,
|
|
|
EmailFundNavMapper emailFundNavMapper, EmailFundAssetMapper emailFundAssetMapper,
|
|
|
AssetMapper assetMapper, NavMapper navMapper, FundService fundService,
|
|
|
- FundAliasMapper fundAliasMapper) {
|
|
|
+ FundAliasMapper fundAliasMapper, DaqProperties properties) {
|
|
|
this.emailTypeRuleMapper = emailTypeRuleMapper;
|
|
|
this.emailRuleConfig = emailRuleConfig;
|
|
|
this.emailFieldMapper = emailFieldMapper;
|
|
@@ -80,6 +86,8 @@ public class EmailParseService {
|
|
|
this.navMapper = navMapper;
|
|
|
this.fundService = fundService;
|
|
|
this.fundAliasMapper = fundAliasMapper;
|
|
|
+
|
|
|
+ this.pyBaseUrl = properties.getPyBaseUrl();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -143,15 +151,23 @@ public class EmailParseService {
|
|
|
EmailParseInfoDO emailParseInfoDO = buildEmailParseInfo(emailId, emailAddress, senderEmail, emailDate, emailTitle, emailType, emailParseStatus, parseDate);
|
|
|
emailId = saveEmailParseInfo(emailParseInfoDO);
|
|
|
|
|
|
+ // python 报告解析接口结果
|
|
|
+ List<PythonData> dataList = ListUtil.list(false);
|
|
|
for (Map.Entry<EmailContentInfoDTO, List<EmailFundNavDTO>> fileNameNavEntry : fileNameNavMap.entrySet()) {
|
|
|
// 保存邮件文件表
|
|
|
EmailContentInfoDTO emailContentInfoDTO = fileNameNavEntry.getKey();
|
|
|
- Integer fileId = saveEmailFileInfo(emailId, emailContentInfoDTO.getFileId(), emailContentInfoDTO.getFileName(), emailContentInfoDTO.getFilePath(), parseDate);
|
|
|
+ String fileName = emailContentInfoDTO.getFileName();
|
|
|
+ Integer fileId = saveEmailFileInfo(emailId, emailContentInfoDTO.getFileId(), fileName, emailContentInfoDTO.getFilePath(), parseDate);
|
|
|
|
|
|
List<EmailFundNavDTO> fundNavDTOList = fileNameNavEntry.getValue();
|
|
|
- if (CollUtil.isEmpty(fundNavDTOList)) {
|
|
|
+ if (CollUtil.isEmpty(fundNavDTOList) && !Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType)) {
|
|
|
continue;
|
|
|
}
|
|
|
+ // python接口解析结果
|
|
|
+ PythonData data = this.requestPyAndResult(fileId, emailContentInfoDTO);
|
|
|
+ if (data != null) {
|
|
|
+ dataList.add(data);
|
|
|
+ }
|
|
|
for (EmailFundNavDTO fundNavDTO : fundNavDTOList) {
|
|
|
// 设置净值数据的解析状态
|
|
|
setNavParseStatus(fundNavDTO, emailTitle);
|
|
@@ -163,9 +179,48 @@ public class EmailParseService {
|
|
|
// 更新邮件解析结果 -> 当【净值日期】和【备案编码/基金名称】能正常解读,即识别为【成功】
|
|
|
long successNavCount = fileNameNavMap.values().stream().flatMap(List::stream).filter(Objects::nonNull).count();
|
|
|
emailParseStatus = successNavCount >= 1 ? EmailParseStatusConst.SUCCESS : EmailParseStatusConst.FAIL;
|
|
|
+ // 报告邮件有一条成功就表示整体成功
|
|
|
+ if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType) && CollUtil.isNotEmpty(dataList)) {
|
|
|
+ long count = dataList.stream().map(PythonData::getStatus).filter(e -> Objects.equals(1, e)).count();
|
|
|
+ emailParseStatus = count >= 1 ? EmailParseStatusConst.SUCCESS : EmailParseStatusConst.FAIL;
|
|
|
+ }
|
|
|
emailParseInfoMapper.updateParseStatus(emailId, emailParseStatus);
|
|
|
}
|
|
|
|
|
|
+ private PythonData requestPyAndResult(int fileId, EmailContentInfoDTO emailContentInfoDTO) {
|
|
|
+ String fileName = emailContentInfoDTO.getFileName();
|
|
|
+ Integer emailType = emailContentInfoDTO.getEmailType();
|
|
|
+ PythonData data = null;
|
|
|
+ if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType)) {
|
|
|
+ if (StrUtil.isBlank(fileName)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ int type = 0;
|
|
|
+ if (fileName.contains("季报")) {
|
|
|
+ type = 1;
|
|
|
+ } else if (fileName.contains("年报")) {
|
|
|
+ type = 2;
|
|
|
+ }
|
|
|
+ String api = "/api/v1/parse/amac_report";
|
|
|
+ Map<String, Object> params = MapUtil.newHashMap(8);
|
|
|
+ params.put("file_id", fileId);
|
|
|
+ params.put("file_path", emailContentInfoDTO.getFilePath());
|
|
|
+ params.put("file_name", fileName);
|
|
|
+ params.put("file_type", type);
|
|
|
+ try {
|
|
|
+ String body = HttpUtil.post(this.pyBaseUrl + api, params);
|
|
|
+ JSONObject obj = JSONUtil.parseObj(body);
|
|
|
+ if (obj.containsKey("data") && !obj.getJSONObject("data").isEmpty()) {
|
|
|
+ data = JSONUtil.toBean(obj.getJSONObject("data"), PythonData.class);
|
|
|
+ data.setFileId(fileId);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
private void saveNavAndAssetNet(Integer fileId, List<EmailFundNavDTO> fundNavDTOList, Date parseDate) {
|
|
|
if (CollUtil.isEmpty(fundNavDTOList)) {
|
|
|
return;
|
|
@@ -606,4 +661,42 @@ public class EmailParseService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private static class PythonData {
|
|
|
+ private Integer fileId;
|
|
|
+ private Integer status;
|
|
|
+ private String msg;
|
|
|
+ private String register_number;
|
|
|
+
|
|
|
+ public Integer getFileId() {
|
|
|
+ return fileId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setFileId(Integer fileId) {
|
|
|
+ this.fileId = fileId;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Integer getStatus() {
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setStatus(Integer status) {
|
|
|
+ this.status = status;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getMsg() {
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setMsg(String msg) {
|
|
|
+ this.msg = msg;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getRegister_number() {
|
|
|
+ return register_number;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setRegister_number(String register_number) {
|
|
|
+ this.register_number = register_number;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|