Преглед изворни кода

feat:报告解析目前对接python

wangzaijun пре 7 месеци
родитељ
комит
d08e335ce0

+ 4 - 0
service-base/src/main/java/com/simuwang/base/config/DaqProperties.java

@@ -37,6 +37,10 @@ public class DaqProperties {
      */
     private String tokenSecret;
     /**
+     * 报告解析的python接口地址
+     */
+    private String pyBaseUrl = "http://localhost:8080";
+    /**
      * 基于rsa的加解密方式
      */
     private SecurityRsa securityRsa;

+ 4 - 0
service-daq/pom.xml

@@ -27,6 +27,10 @@
             <groupId>technology.tabula</groupId>
             <artifactId>tabula</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-http</artifactId>
+        </dependency>
     </dependencies>
 
 <!--    <build>-->

+ 96 - 3
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -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;
+        }
+    }
 }

+ 30 - 0
service-daq/src/main/java/com/simuwang/daq/service/ReportEmailParser.java

@@ -0,0 +1,30 @@
+package com.simuwang.daq.service;
+
+import cn.hutool.core.collection.ListUtil;
+import com.simuwang.base.common.conts.EmailTypeConst;
+import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
+import com.simuwang.base.pojo.dto.EmailFundNavDTO;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wangzaijun
+ * @date 2024/9/25 14:52
+ * @description 报告的解析逻辑,目前先调用python接口
+ */
+@Component
+public class ReportEmailParser extends AbstractEmailParser {
+
+    @Override
+    public boolean isSupport(Integer emailType) {
+        return EmailTypeConst.REPORT_EMAIL_TYPE.equals(emailType);
+    }
+
+    @Override
+    public List<EmailFundNavDTO> parse(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
+        // 目前啥也不做,调用python的逻辑在EmailParseService里写死,等java的逻辑完成后注释掉python逻辑
+        return ListUtil.empty();
+    }
+}

+ 1 - 0
service-deploy/src/main/resources/application.yml

@@ -83,6 +83,7 @@ simuwang:
   # token过期时间,单位:分钟
   token-expire: 1440
   token-secret: qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfghjklzxcvbnm12
+  py-base-url: "http://192.168.0.81:8088"
   # rsa 公钥私钥配置
   security-rsa:
     public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwkwNdpXpmeF7eFO/SMfkvwGM2ZWcToh/IyHjigzJgM4l68Jf+gaIKzDwxQl4S7phYTSavi4er1MfFHDqbX6XSQs9L2t3XNYvRrTxGZ9jY2cA9xpzXnQ152EPU+ENbqfqmtaQ/FFmCqaDCAVaXXsumdBPul2x7ufzrHeU1EkU7/QIDAQAB

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

@@ -24,9 +24,9 @@ public class ApplicationTest {
     @Test
     public void test() {
         MailboxInfoDTO emailInfoDTO = new MailboxInfoDTO();
-        emailInfoDTO.setUserId(2395446);
-        emailInfoDTO.setAccount("mozuwen@simuwang.com");
-        emailInfoDTO.setPassword("Mzw@0306");
+        emailInfoDTO.setUserId(2374315);
+        emailInfoDTO.setAccount("wangzaijun@simuwang.com");
+        emailInfoDTO.setPassword("WZJ2twy1314");
         emailInfoDTO.setHost("imap.exmail.qq.com");
         emailInfoDTO.setPort("993");
         emailInfoDTO.setProtocol("imap");
@@ -37,8 +37,8 @@ public class ApplicationTest {
 //        emailInfoDTO.setPort("993");
 //        emailInfoDTO.setProtocol("imap");
 
-        Date startDate = DateUtil.parse("2024-09-20 09:02:00", DateConst.YYYY_MM_DD_HH_MM_SS);
-        Date endDate = DateUtil.parse("2024-09-20 10:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date startDate = DateUtil.parse("2024-09-25 16:20:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date endDate = DateUtil.parse("2024-09-25 17:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate);
         } catch (Exception e) {