Browse Source

feat: 增加邮件类型,月度,年度,季度,分红公告,基金合同,变更公告

chenjianhua 4 months ago
parent
commit
f0960141aa

+ 22 - 2
service-base/src/main/java/com/simuwang/base/common/conts/EmailTypeConst.java

@@ -11,10 +11,30 @@ public class EmailTypeConst {
      * 估值表邮件类型
      */
     public final static Integer VALUATION_EMAIL_TYPE = 2;
+    /**
+     * 月度定期报告邮件类型
+     */
+    public final static Integer MONTH_REPORT_EMAIL_TYPE = 3;
+    /**
+     * 季度定期报告邮件类型
+     */
+    public final static Integer QUARTER_REPORT_EMAIL_TYPE = 4;
 
     /**
-     * 定期报告邮件类型
+     * 年度定期报告邮件类型
+     */
+    public final static Integer YEAR_REPORT_EMAIL_TYPE = 5;
+    /**
+     * 基金合同邮件类型
+     */
+    public final static Integer CONTRACT_EMAIL_TYPE = 6;
+    /**
+     * 分红公告邮件类型
+     */
+    public final static Integer DISTRIBUTION_EMAIL_TYPE = 7;
+    /**
+     * 变更公告邮件类型
      */
-    public final static Integer REPORT_EMAIL_TYPE = 3;
+    public final static Integer CHANGE_EMAIL_TYPE = 8;
 
 }

+ 31 - 2
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailTypeRuleDO.java

@@ -28,8 +28,37 @@ public class EmailTypeRuleDO {
     /**
      * 报告类型识别规则(多个以英文逗号隔开)
      */
-    @TableField(value = "report")
-    private String report;
+
+    /**
+     * 月度报告类型识别规则(多个以英文逗号隔开)
+     */
+    @TableField(value = "month_report")
+    private String monthReport;
+    /**
+     * 季度报告类型识别规则(多个以英文逗号隔开)
+     */
+    @TableField(value = "quarter_report")
+    private String quarterReport;
+    /**
+     * 年度报告类型识别规则(多个以英文逗号隔开)
+     */
+    @TableField(value = "year_report")
+    private String yearReport;
+    /**
+     * 基金合同(多个以英文逗号隔开)
+     */
+    @TableField(value = "contract")
+    private String contract;
+    /**
+     * 分红公告(多个以英文逗号隔开)
+     */
+    @TableField(value = "distribution")
+    private String distribution;
+    /**
+     * 变更公告(多个以英文逗号隔开)
+     */
+    @TableField(value = "change_report")
+    private String changeReport;
     /**
      * 记录的有效性;1-有效;0-无效;
      */

+ 22 - 2
service-base/src/main/java/com/simuwang/base/pojo/vo/EmailTypeRuleVO.java

@@ -17,7 +17,27 @@ public class EmailTypeRuleVO {
      */
     private String valuation;
     /**
-     * 报告类型识别规则(多个以英文逗号隔开)
+     * 月度报告类型识别规则(多个以英文逗号隔开)
      */
-    private String report;
+    private String monthReport;
+    /**
+     * 季度报告类型识别规则(多个以英文逗号隔开)
+     */
+    private String quarterReport;
+    /**
+     * 年度报告类型识别规则(多个以英文逗号隔开)
+     */
+    private String yearReport;
+    /**
+     * 基金合同(多个以英文逗号隔开)
+     */
+    private String contract;
+    /**
+     * 分红公告(多个以英文逗号隔开)
+     */
+    private String distribution;
+    /**
+     * 变更公告(多个以英文逗号隔开)
+     */
+    private String changeReport;
 }

+ 13 - 5
service-base/src/main/resources/mapper/daq/EmailTypeRuleMapper.xml

@@ -5,7 +5,12 @@
         <id column="id" property="id"/>
         <result column="nav" property="nav"/>
         <result column="valuation" property="valuation"/>
-        <result column="report" property="report"/>
+        <result column="month_report" property="monthReport"/>
+        <result column="quarter_report" property="quarterReport"/>
+        <result column="year_report" property="yearReport"/>
+        <result column="change_report" property="changeReport"/>
+        <result column="contract" property="contract"/>
+        <result column="distribution" property="distribution"/>
         <result column="isvalid" property="isvalid"/>
         <result column="creatorid" property="creatorId"/>
         <result column="createtime" property="createTime"/>
@@ -19,13 +24,16 @@
         where isvalid = 1 limit 1
     </select>
     <select id="searchEmailType" resultMap="BaseResultMap">
-        select id,nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime from email_type_rule where isvalid =1 limit 1
+        select id,nav,valuation,month_report,quarter_report,year_report,contract,change_report,distribution,isvalid,creatorid,createtime,updaterid,updatetime from email_type_rule where isvalid =1 limit 1
     </select>
     <insert id="saveEmailType">
-        insert into email_type_rule(nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime)
-        values (#{nav},#{valuation},#{report},1,#{creatorId},#{createTime},#{updaterId},#{updateTime})
+        insert into email_type_rule(nav,valuation,nav,valuation,month_report,quarter_report,year_report,contract,change_report,distribution,isvalid,creatorid,createtime,updaterid,updatetime)
+        values (#{nav},#{valuation},#{monthReport},#{quarterReport},#{yearReport},#{contract},#{changeReport},#{distribution},1,#{creatorId},#{createTime},#{updaterId},#{updateTime})
     </insert>
     <update id="updateEmailType">
-        update email_type_rule set nav=#{nav},valuation=#{valuation},report=#{report},updatetime=now(),updaterid=#{updaterId} where id=#{id} and isvalid =1
+        update email_type_rule set nav=#{nav},valuation=#{valuation},month_report=#{monthReport},
+                                   quarter_report=#{quarterReport},year_report=#{yearReport},contract=#{contract},
+                                   change_report=#{changeReport},distribution=#{distribution},
+                                   updatetime=now(),updaterid=#{updaterId} where id=#{id} and isvalid =1
     </update>
 </mapper>

+ 28 - 8
service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java

@@ -174,6 +174,10 @@ public class EmailParseService {
     public List<EmailFundNavDTO> parseEmail(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
         Integer emailType = emailContentInfoDTO.getEmailType();
         AbstractEmailParser emailParser = emailParserFactory.getInstance(emailType);
+        //目前分红合同,基金合同,变更公告不做解析
+        if(emailParser == null){
+            return new ArrayList<>();
+        }
         List<EmailFundNavDTO> emailFundNavDTOList = emailParser.parse(emailContentInfoDTO, emailFieldMap);
         //因为有些邮件是净值邮件,但标题是估值表的标题,会导致无法解析到数据,这里做个补丁如果估值表类型的邮件解析不到数据,就再使用净值解析逻辑处理一次
         if(EmailTypeConst.VALUATION_EMAIL_TYPE.equals(emailType)){
@@ -204,7 +208,9 @@ public class EmailParseService {
             // 保存邮件文件表
             EmailContentInfoDTO emailContentInfoDTO = fileNameNavEntry.getKey();
             String fileName = emailContentInfoDTO.getFileName();
-            if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType) && fileName.endsWith(".html")) {
+            //针对HTML,只解析净值规模和估值表类型的邮件,其余类型不解析
+            if (!Objects.equals(EmailTypeConst.NAV_EMAIL_TYPE, emailType)
+                    && !Objects.equals(EmailTypeConst.VALUATION_EMAIL_TYPE, emailType) && fileName.endsWith(".html")) {
                 continue;
             }
             Integer fileId = saveEmailFileInfo(emailId, emailContentInfoDTO.getFileId(), fileName, emailContentInfoDTO.getFilePath(), parseDate);
@@ -221,10 +227,14 @@ public class EmailParseService {
                 // 过滤出解析成功的数据
                 fundNavDTOList = fundNavDTOList.stream().filter(e -> e != null && StrUtil.isBlank(e.getFailReason())).toList();
             }
-            if (CollUtil.isEmpty(fundNavDTOList) && !Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType)) {
+            if (CollUtil.isEmpty(fundNavDTOList) && (!Objects.equals(EmailTypeConst.MONTH_REPORT_EMAIL_TYPE, emailType)
+                    ||!Objects.equals(EmailTypeConst.YEAR_REPORT_EMAIL_TYPE, emailType)
+                    ||!Objects.equals(EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE, emailType))) {
                 continue;
             }
-            if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType)) {
+            if (Objects.equals(EmailTypeConst.MONTH_REPORT_EMAIL_TYPE, emailType)
+                    ||Objects.equals(EmailTypeConst.YEAR_REPORT_EMAIL_TYPE, emailType)
+                    ||Objects.equals(EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE, emailType)) {
                 // 解析结果(可以从python获取或者自行解析)并保存报告
                 ParseResult<ReportData> parseResult = this.parseReportAndHandleResult(fileId, emailContentInfoDTO);
                 dataList.add(parseResult);
@@ -255,7 +265,9 @@ public class EmailParseService {
             }
         }
         // 报告邮件有一条失败就表示整个邮件解析失败
-        if (Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType) && CollUtil.isNotEmpty(dataList)) {
+        if ((Objects.equals(EmailTypeConst.MONTH_REPORT_EMAIL_TYPE, emailType)
+            || Objects.equals(EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE, emailType)
+            || Objects.equals(EmailTypeConst.YEAR_REPORT_EMAIL_TYPE, emailType)) && CollUtil.isNotEmpty(dataList)) {
             long sucNum = dataList.stream().filter(e -> Objects.equals(1, e.getStatus())).count();
             if (sucNum > 0) {
                 emailParseStatus = EmailParseStatusConst.SUCCESS;
@@ -454,7 +466,10 @@ public class EmailParseService {
         ParseResult<ReportData> result = new ParseResult<>();
         String fileName = emailContentInfoDTO.getFileName();
         Integer emailType = emailContentInfoDTO.getEmailType();
-        if (!Objects.equals(EmailTypeConst.REPORT_EMAIL_TYPE, emailType) || StrUtil.isBlank(fileName)) {
+        if (!Objects.equals(EmailTypeConst.MONTH_REPORT_EMAIL_TYPE, emailType)
+                ||!Objects.equals(EmailTypeConst.YEAR_REPORT_EMAIL_TYPE, emailType)
+                ||!Objects.equals(EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE, emailType)
+                || StrUtil.isBlank(fileName)) {
             result.setStatus(ReportParseStatus.NOT_A_REPORT.getCode());
             result.setMsg(ReportParseStatus.NOT_A_REPORT.getMsg());
             return result;
@@ -935,7 +950,12 @@ public class EmailParseService {
         String valuation = emailTypeRuleDO != null && StrUtil.isNotBlank(emailTypeRuleDO.getValuation()) ? emailTypeRuleDO.getValuation() : emailRuleConfig.getValuation();
         String report = emailTypeRuleDO != null && StrUtil.isNotBlank(emailTypeRuleDO.getReport()) ? emailTypeRuleDO.getReport() : emailRuleConfig.getReport();
         emailTypeMap.put(EmailTypeConst.VALUATION_EMAIL_TYPE, Arrays.stream(valuation.split(",")).toList());
-        emailTypeMap.put(EmailTypeConst.REPORT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.MONTH_REPORT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.YEAR_REPORT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.CONTRACT_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.DISTRIBUTION_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
+        emailTypeMap.put(EmailTypeConst.CHANGE_EMAIL_TYPE, Arrays.stream(report.split(",")).toList());
         emailTypeMap.put(EmailTypeConst.NAV_EMAIL_TYPE, Arrays.stream(nav.split(",")).toList());
         return emailTypeMap;
     }
@@ -1019,8 +1039,8 @@ public class EmailParseService {
                     emailContentInfoDTOList.add(emailContentInfoDTO);
                 }
                 if (CollUtil.isNotEmpty(emailContentInfoDTOList)) {
-                    // 估值表或定期报告邮件不展示正文html文件
-                    if (emailType.equals(EmailTypeConst.VALUATION_EMAIL_TYPE) || emailType.equals(EmailTypeConst.REPORT_EMAIL_TYPE)) {
+                    //除了净值规模,其余邮件类型不展示正文html文件
+                    if (!emailType.equals(EmailTypeConst.NAV_EMAIL_TYPE)) {
                         emailContentInfoDTOList = emailContentInfoDTOList.stream().filter(e -> !ExcelUtil.isHTML(e.getFilePath())).toList();
                     }
                     emailContentInfoDTOList.forEach(e -> {

+ 3 - 1
service-daq/src/main/java/com/simuwang/daq/service/ReportEmailParser.java

@@ -21,7 +21,9 @@ public class ReportEmailParser extends AbstractEmailParser {
 
     @Override
     public boolean isSupport(Integer emailType) {
-        return EmailTypeConst.REPORT_EMAIL_TYPE.equals(emailType);
+        return EmailTypeConst.MONTH_REPORT_EMAIL_TYPE.equals(emailType)
+                || EmailTypeConst.QUARTER_REPORT_EMAIL_TYPE.equals(emailType)
+                || EmailTypeConst.YEAR_REPORT_EMAIL_TYPE.equals(emailType);
     }
 
     @Override

+ 14 - 3
service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailServiceImpl.java

@@ -43,8 +43,13 @@ public class ParseEmailServiceImpl implements ParseEmailService {
         EmailTypeRuleDO  ruleDO = new EmailTypeRuleDO();
         ruleDO.setId(emailTypeRuleVO.getId());
         ruleDO.setNav(emailTypeRuleVO.getNav());
-        ruleDO.setReport(emailTypeRuleVO.getReport());
-        ruleDO.setValuation(emailTypeRuleVO.getValuation());
+        ruleDO.setMonthReport(emailTypeRuleVO.getMonthReport());
+        ruleDO.setQuarterReport(emailTypeRuleVO.getQuarterReport());
+        ruleDO.setYearReport(emailTypeRuleVO.getYearReport());
+        ruleDO.setYearReport(emailTypeRuleVO.getYearReport());
+        ruleDO.setDistribution(emailTypeRuleVO.getDistribution());
+        ruleDO.setContract(emailTypeRuleVO.getContract());
+        ruleDO.setChangeReport(emailTypeRuleVO.getChangeReport());
         ruleDO.setUpdateTime(new Date());
         if(ruleDO.getId() == null){
             ruleDO.setCreateTime(new Date());
@@ -64,7 +69,13 @@ public class ParseEmailServiceImpl implements ParseEmailService {
         emailTypeRuleVO.setId(emailTypeRuleDO.getId());
         emailTypeRuleVO.setNav(emailTypeRuleDO.getNav());
         emailTypeRuleVO.setValuation(emailTypeRuleDO.getValuation());
-        emailTypeRuleVO.setReport(emailTypeRuleDO.getReport());
+        emailTypeRuleVO.setMonthReport(emailTypeRuleDO.getMonthReport());
+        emailTypeRuleVO.setQuarterReport(emailTypeRuleDO.getQuarterReport());
+        emailTypeRuleVO.setYearReport(emailTypeRuleDO.getYearReport());
+        emailTypeRuleVO.setYearReport(emailTypeRuleDO.getYearReport());
+        emailTypeRuleVO.setDistribution(emailTypeRuleDO.getDistribution());
+        emailTypeRuleVO.setContract(emailTypeRuleDO.getContract());
+        emailTypeRuleVO.setChangeReport(emailTypeRuleDO.getChangeReport());
         return emailTypeRuleVO;
     }