浏览代码

合并代码

wangzaijun 7 月之前
父节点
当前提交
e68864e67b
共有 53 个文件被更改,包括 937 次插入137 次删除
  1. 38 0
      service-base/src/main/java/com/simuwang/base/common/enums/Frequency.java
  2. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/AssetMapper.java
  3. 4 0
      service-base/src/main/java/com/simuwang/base/mapper/DeletionInfoMapper.java
  4. 3 1
      service-base/src/main/java/com/simuwang/base/mapper/EmailFileInfoMapper.java
  5. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/EmailFundNavMapper.java
  6. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/FundAliasMapper.java
  7. 2 0
      service-base/src/main/java/com/simuwang/base/mapper/FundInfoMapper.java
  8. 4 0
      service-base/src/main/java/com/simuwang/base/mapper/NavMapper.java
  9. 18 0
      service-base/src/main/java/com/simuwang/base/mapper/TradeDateMapper.java
  10. 12 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailConfigDO.java
  11. 3 2
      service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailSendHistoryDO.java
  12. 1 1
      service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFileInfoDO.java
  13. 3 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFundAssetDO.java
  14. 4 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFundNavDO.java
  15. 90 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/EmailParseDetailDO.java
  16. 2 2
      service-base/src/main/java/com/simuwang/base/pojo/dos/FundReportFrequencyDO.java
  17. 75 0
      service-base/src/main/java/com/simuwang/base/pojo/dos/TradeDateDO.java
  18. 29 0
      service-base/src/main/java/com/simuwang/base/pojo/dto/query/ParseDetailPageQuery.java
  19. 5 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/EmailFundAssetVO.java
  20. 9 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/EmailFundNavVO.java
  21. 22 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/EmailParseDetailVO.java
  22. 4 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/FundAliasVO.java
  23. 25 0
      service-base/src/main/java/com/simuwang/base/pojo/vo/FundInfoSearchVO.java
  24. 5 0
      service-base/src/main/resources/mapper/AssetMapper.xml
  25. 2 2
      service-base/src/main/resources/mapper/CompanyEmailConfigMapper.xml
  26. 11 18
      service-base/src/main/resources/mapper/CompanyEmailHistoryMapper.xml
  27. 10 0
      service-base/src/main/resources/mapper/DeletionInfoMapper.xml
  28. 28 2
      service-base/src/main/resources/mapper/EmailFileInfoMapper.xml
  29. 21 5
      service-base/src/main/resources/mapper/EmailFundAssetMapper.xml
  30. 48 28
      service-base/src/main/resources/mapper/EmailFundNavMapper.xml
  31. 1 1
      service-base/src/main/resources/mapper/EmailTypeRuleMapper.xml
  32. 6 0
      service-base/src/main/resources/mapper/FundAliasMapper.xml
  33. 3 0
      service-base/src/main/resources/mapper/FundInfoMapper.xml
  34. 11 0
      service-base/src/main/resources/mapper/NavMapper.xml
  35. 23 0
      service-base/src/main/resources/mapper/TradeDateMapper.xml
  36. 2 2
      service-daq/src/main/java/com/simuwang/daq/service/EmailParseService.java
  37. 87 42
      service-daq/src/main/java/com/simuwang/daq/service/ValuationEmailParser.java
  38. 2 2
      service-deploy/src/main/test/java/com/simuwang/datadaq/DataTrusteeApplicationTests.java
  39. 6 5
      service-manage/src/main/java/com/simuwang/manage/api/company/CompanyEmailSendHistoryController.java
  40. 4 7
      service-manage/src/main/java/com/simuwang/manage/api/distribution/DistributionController.java
  41. 14 1
      service-manage/src/main/java/com/simuwang/manage/api/fund/FunAliasController.java
  42. 3 2
      service-manage/src/main/java/com/simuwang/manage/api/fund/FundInformationController.java
  43. 3 0
      service-manage/src/main/java/com/simuwang/manage/init/QuartzConfig.java
  44. 2 1
      service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailSendHistoryService.java
  45. 3 0
      service-manage/src/main/java/com/simuwang/manage/service/FundAliasService.java
  46. 2 1
      service-manage/src/main/java/com/simuwang/manage/service/FundInformationService.java
  47. 7 8
      service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailSendHistoryServiceImpl.java
  48. 3 0
      service-manage/src/main/java/com/simuwang/manage/service/impl/DistributionServiceImpl.java
  49. 15 0
      service-manage/src/main/java/com/simuwang/manage/service/impl/FundAliasServiceImpl.java
  50. 12 2
      service-manage/src/main/java/com/simuwang/manage/service/impl/FundInformationServiceImpl.java
  51. 3 0
      service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailDetailServiceImpl.java
  52. 4 2
      service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailServiceImpl.java
  53. 237 0
      service-manage/src/main/java/com/simuwang/manage/task/FundDeletionTask.java

+ 38 - 0
service-base/src/main/java/com/simuwang/base/common/enums/Frequency.java

@@ -0,0 +1,38 @@
+package com.simuwang.base.common.enums;
+
+import java.util.stream.Stream;
+import java.util.zip.Inflater;
+
+/**
+ * FileName: Frequency
+ * Author:   chenjianhua
+ * Date:     2024/9/18 23:19
+ * Description: ${DESCRIPTION}
+ */
+public enum Frequency {
+
+    DAY(1, "日频"),WEEK(2, "周频"),MONTH(3, "月频"),QUARTER(4,"季频"),
+    HALF_YEAR(5,"半年"),YEAR(6,"年频"),OTHER(-1,"无固定");
+
+    private Integer code;
+
+    private String info;
+
+    Frequency(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public static Frequency getFrequencyByCode(Integer code) {
+        return Stream.of(Frequency.values()).filter(e -> e.code.equals(code)).findFirst().orElse(null);
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}
+

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/AssetMapper.java

@@ -19,4 +19,6 @@ public interface AssetMapper {
     AssetDO queryFundAsset(AssetDO fundAssetVO);
     AssetDO queryFundAsset(AssetDO fundAssetVO);
 
 
     void deleteAsset(@Param("fundId") String fundId, @Param("priceDate") String priceDate);
     void deleteAsset(@Param("fundId") String fundId, @Param("priceDate") String priceDate);
+
+    List<AssetDO> selectAssetByFundId(@Param("fundId")String fundId);
 }
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/mapper/DeletionInfoMapper.java

@@ -35,4 +35,8 @@ public interface DeletionInfoMapper {
     void updateRemark(@Param("fundId") String fundId, @Param("deletionType") Integer deletionType, @Param("remark")String remark);
     void updateRemark(@Param("fundId") String fundId, @Param("deletionType") Integer deletionType, @Param("remark")String remark);
 
 
     List<FundDeletionInfoDO> selectFundDeletionInfoVOList(@Param("fundIdList") List<String> fundIdList);
     List<FundDeletionInfoDO> selectFundDeletionInfoVOList(@Param("fundIdList") List<String> fundIdList);
+
+    DeletionInfoDO getDeletionInfoDO(DeletionInfoDO deletionInfoDO);
+
+    void saveDeletionInfoDO(DeletionInfoDO deletionInfoDO);
 }
 }

+ 3 - 1
service-base/src/main/java/com/simuwang/base/mapper/EmailFileInfoMapper.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.mapper;
 package com.simuwang.base.mapper;
 
 
 import com.simuwang.base.pojo.dos.EmailFileInfoDO;
 import com.simuwang.base.pojo.dos.EmailFileInfoDO;
+import com.simuwang.base.pojo.dos.EmailParseDetailDO;
 import com.simuwang.base.pojo.dto.query.EmailFileQuery;
 import com.simuwang.base.pojo.dto.query.EmailFileQuery;
 import com.simuwang.base.pojo.dto.query.FundFilePageQuery;
 import com.simuwang.base.pojo.dto.query.FundFilePageQuery;
 import com.simuwang.base.pojo.vo.EmailParseDetailVO;
 import com.simuwang.base.pojo.vo.EmailParseDetailVO;
@@ -17,12 +18,13 @@ public interface EmailFileInfoMapper {
     Integer insert(@Param("itemDo") EmailFileInfoDO emailFileInfoDO);
     Integer insert(@Param("itemDo") EmailFileInfoDO emailFileInfoDO);
 
 
     EmailFileInfoDO getEmailFileById(@Param("id") Integer fileId);
     EmailFileInfoDO getEmailFileById(@Param("id") Integer fileId);
+    List<EmailFileInfoDO> getEmailFileByEmailId(@Param("emailId") Integer emailId);
 
 
     List<EmailFileInfoDO> queryByEmailId(@Param("emailId") Integer emailId);
     List<EmailFileInfoDO> queryByEmailId(@Param("emailId") Integer emailId);
 
 
     List<FundFileInfoVO> searchFundFileInfo(FundFilePageQuery fundFilePageQuery);
     List<FundFileInfoVO> searchFundFileInfo(FundFilePageQuery fundFilePageQuery);
 
 
-    List<EmailParseDetailVO> searchEmailDetailById(EmailFileQuery emailFileQuery);
+    List<EmailParseDetailDO> searchEmailDetailById(EmailFileQuery emailFileQuery);
 
 
     long countFundFileInfo(FundFilePageQuery fundFilePageQuery);
     long countFundFileInfo(FundFilePageQuery fundFilePageQuery);
 
 

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/EmailFundNavMapper.java

@@ -26,4 +26,6 @@ public interface EmailFundNavMapper {
     List<EmailFundNavDO> selectNotMappingNav(@Param("fundName") String sourceFundName);
     List<EmailFundNavDO> selectNotMappingNav(@Param("fundName") String sourceFundName);
 
 
     void batchUpdate(@Param("navList") List<EmailFundNavDO> fundNavDOList);
     void batchUpdate(@Param("navList") List<EmailFundNavDO> fundNavDOList);
+
+    String getMaxPriceDate(@Param("fundName")String sourceFundName);
 }
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/FundAliasMapper.java

@@ -25,4 +25,6 @@ public interface FundAliasMapper {
     void saveFundAlias(FundAliasDO fundAliasDO);
     void saveFundAlias(FundAliasDO fundAliasDO);
 
 
     void insert(@Param("fundName") String fundName, @Param("registerNumber") String registerNumber);
     void insert(@Param("fundName") String fundName, @Param("registerNumber") String registerNumber);
+
+    void batchDelete(@Param("idList") List<Integer> idList);
 }
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/FundInfoMapper.java

@@ -37,4 +37,6 @@ public interface FundInfoMapper {
     String queryFundIdByName(@Param("fundName") String fundName);
     String queryFundIdByName(@Param("fundName") String fundName);
 
 
     String getCompanyNameByFundId(@Param("fundId") String fundId);
     String getCompanyNameByFundId(@Param("fundId") String fundId);
+
+    String getInceptionDateByFundId(@Param("fundId")String fundId);
 }
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/mapper/NavMapper.java

@@ -22,4 +22,8 @@ public interface NavMapper {
     void updateNav(NavDO navDO);
     void updateNav(NavDO navDO);
 
 
     void deleteNav(@Param("fundId")String fundId, @Param("priceDate")String priceDate);
     void deleteNav(@Param("fundId")String fundId, @Param("priceDate")String priceDate);
+
+    List<String> getAllFundId();
+
+    List<NavDO> selectNavByFundId(@Param("fundId")String fundId);
 }
 }

+ 18 - 0
service-base/src/main/java/com/simuwang/base/mapper/TradeDateMapper.java

@@ -0,0 +1,18 @@
+package com.simuwang.base.mapper;
+
+import com.simuwang.base.pojo.dos.TradeDateDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * FileName: TradeDateMapper
+ * Author:   chenjianhua
+ * Date:     2024/9/18 23:08
+ * Description: ${DESCRIPTION}
+ */
+@Mapper
+public interface TradeDateMapper {
+    List<TradeDateDO> selectTradeDate(@Param("startDate") String inceptionDate,@Param("endDate")  String today);
+}

+ 12 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailConfigDO.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import lombok.Data;
 import lombok.Data;
 
 
 import java.util.Date;
 import java.util.Date;
@@ -72,4 +73,15 @@ public class CompanyEmailConfigDO {
      */
      */
     @TableField(value = "updatetime")
     @TableField(value = "updatetime")
     private Date updateTime;
     private Date updateTime;
+
+    public CompanyEmailConfigVO toVO() {
+        CompanyEmailConfigVO vo = new CompanyEmailConfigVO();
+        vo.setEmail(this.getEmail());
+        vo.setCompanyId(this.getCompanyId());
+        vo.setOpenStatus(this.getOpenStatus());
+        vo.setSendRemark(this.getRemark());
+        vo.setCompanyName(this.getCompanyName());
+        vo.setId(this.getId());
+        return vo;
+    }
 }
 }

+ 3 - 2
service-base/src/main/java/com/simuwang/base/pojo/dos/CompanyEmailSendHistoryDO.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import lombok.Data;
 import lombok.Data;
@@ -41,7 +42,7 @@ public class CompanyEmailSendHistoryDO {
     /**
     /**
      * 发送时间
      * 发送时间
      */
      */
-    private String sendTime;
+    private Date sendTime;
     /**
     /**
      * 发送备注
      * 发送备注
      */
      */
@@ -75,7 +76,7 @@ public class CompanyEmailSendHistoryDO {
         vo.setSendRemark(this.getSendRemark());
         vo.setSendRemark(this.getSendRemark());
         vo.setSendStatus(this.getSendStatus());
         vo.setSendStatus(this.getSendStatus());
         vo.setCompanyName(this.getCompanyName());
         vo.setCompanyName(this.getCompanyName());
-        vo.setSendTime(this.getSendTime());
+        vo.setSendTime(this.getSendTime()==null?null: DateUtils.format(this.getSendTime(),DateUtils.YYYY_MM_DD_HH_MM_SS));
         return vo;
         return vo;
     }
     }
 }
 }

+ 1 - 1
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFileInfoDO.java

@@ -68,7 +68,7 @@ public class EmailFileInfoDO {
         vo.setFilePath(this.filePath);
         vo.setFilePath(this.filePath);
         vo.setFileName(this.fileName);
         vo.setFileName(this.fileName);
         vo.setFundId(this.fundId);
         vo.setFundId(this.fundId);
-        vo.setEmailId(this.id);
+        vo.setId(this.id);
         return vo;
         return vo;
     }
     }
 }
 }

+ 3 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFundAssetDO.java

@@ -94,6 +94,8 @@ public class EmailFundAssetDO {
     @TableField(value = "updatetime")
     @TableField(value = "updatetime")
     private Date updateTime;
     private Date updateTime;
 
 
+    private String emailTitle;
+
     public EmailFundAssetVO toVo() {
     public EmailFundAssetVO toVo() {
         EmailFundAssetVO vo = new EmailFundAssetVO();
         EmailFundAssetVO vo = new EmailFundAssetVO();
         vo.setId(this.id);
         vo.setId(this.id);
@@ -106,6 +108,7 @@ public class EmailFundAssetDO {
         vo.setUpdateTime(DateUtils.format(this.updateTime, DateUtils.YYYY_MM_DD_HH_MM_SS));
         vo.setUpdateTime(DateUtils.format(this.updateTime, DateUtils.YYYY_MM_DD_HH_MM_SS));
         vo.setAssetNet(this.assetNet);
         vo.setAssetNet(this.assetNet);
         vo.setAssetShare(this.assetShare);
         vo.setAssetShare(this.assetShare);
+        vo.setEmailTitle(this.emailTitle);
         return vo;
         return vo;
     }
     }
 }
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailFundNavDO.java

@@ -90,11 +90,15 @@ public class EmailFundNavDO {
     @TableField(value = "updatetime")
     @TableField(value = "updatetime")
     private Date updateTime;
     private Date updateTime;
 
 
+    private String emailTitle;
+
     public EmailFundNavVO toVo() {
     public EmailFundNavVO toVo() {
         EmailFundNavVO vo = new EmailFundNavVO();
         EmailFundNavVO vo = new EmailFundNavVO();
         vo.setId(this.id);
         vo.setId(this.id);
         vo.setFundId(this.fundId);
         vo.setFundId(this.fundId);
         vo.setFundName(this.fundName);
         vo.setFundName(this.fundName);
+        vo.setFileId(this.fileId);
+        vo.setEmailTitle(this.emailTitle);
         vo.setRegisterNumber(this.registerNumber);
         vo.setRegisterNumber(this.registerNumber);
         vo.setPriceDate(this.priceDate==null?null:DateUtils.format(this.priceDate, DateUtils.YYYY_MM_DD));
         vo.setPriceDate(this.priceDate==null?null:DateUtils.format(this.priceDate, DateUtils.YYYY_MM_DD));
         vo.setCumulativeNavWithdrawal(this.cumulativeNavWithdrawal);
         vo.setCumulativeNavWithdrawal(this.cumulativeNavWithdrawal);

+ 90 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailParseDetailDO.java

@@ -0,0 +1,90 @@
+package com.simuwang.base.pojo.dos;
+
+import com.simuwang.base.common.util.DateUtils;
+import com.simuwang.base.pojo.vo.EmailParseDetailVO;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * FileName: EmailParseDetailDO
+ * Author:   chenjianhua
+ * Date:     2024/9/18 18:38
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class EmailParseDetailDO {
+    /**
+     * 邮件解析的基金名称
+     */
+    private String fundId;
+    /**
+     * 邮件解析的基金名称
+     */
+    private String fundName;
+    /**
+     * 邮件解析的备案编码
+     */
+    private String registerNumber;
+    /**
+     * 净值日期
+     */
+    private String priceDate;
+    /**
+     * 单位净值
+     */
+    private BigDecimal nav;
+    /**
+     * 累计单位净值
+     */
+    private BigDecimal cumulativeNavWithdrawal;
+    /**
+     * 资产份额
+     */
+    private BigDecimal assetShare;
+    /**
+     * 资产净值(基金规模)
+     */
+    private BigDecimal assetNet;
+    /**
+     * 净值入库情况 0-未入库,1-入库
+     */
+    private Integer navIsStored;
+    /**
+     * 净值异常情况:1-无异常,2-净值缺失,3-未匹配基金,4-净值<=0,5-资产净值<=0
+     */
+    private Integer navExceptionStatus;
+
+    /**
+     * 规模入库情况 0-未入库,1-入库
+     */
+    private Integer assetIsStored;
+    /**
+     * 规模异常情况:1-无异常,2-资产净值<=0
+     */
+    private Integer assetExceptionStatus;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    public EmailParseDetailVO toVO() {
+        EmailParseDetailVO vo = new EmailParseDetailVO();
+        vo.setFundId(this.fundId);
+        vo.setFundName(this.fundName);
+        vo.setRegisterNumber(this.registerNumber);
+        vo.setPriceDate(this.priceDate);
+        vo.setNav(this.nav);
+        vo.setCumulativeNavWithdrawal(this.cumulativeNavWithdrawal);
+        vo.setAssetNet(this.assetNet);
+        vo.setAssetShare(this.assetShare);
+        vo.setUpdateTime(DateUtils.format(this.updateTime,DateUtils.YYYY_MM_DD_HH_MM_SS));
+        vo.setNavIsStored(this.navIsStored);
+        vo.setNavExceptionStatus(this.navExceptionStatus);
+        vo.setAssetIsStored(this.assetIsStored);
+        vo.setAssetExceptionStatus(this.assetExceptionStatus);
+        return vo;
+    }
+}

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

@@ -28,12 +28,12 @@ public class FundReportFrequencyDO {
     @TableField(value = "fund_id")
     @TableField(value = "fund_id")
     private String fundId;
     private String fundId;
     /**
     /**
-     * 净值报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频
+     * 净值报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频,-1无固定
      */
      */
     @TableField(value = "nav_frequency")
     @TableField(value = "nav_frequency")
     private Integer navFrequency;
     private Integer navFrequency;
     /**
     /**
-     * 规模报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频
+     * 规模报送频率,1-日频,2-周频,3-月频,4-季频,5-半年,6-年频,-1无固定
      */
      */
     @TableField(value = "asset_frequency")
     @TableField(value = "asset_frequency")
     private Integer assetFrequency;
     private Integer assetFrequency;

+ 75 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/TradeDateDO.java

@@ -0,0 +1,75 @@
+package com.simuwang.base.pojo.dos;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * FileName: TradeDateDO
+ * Author:   chenjianhua
+ * Date:     2024/9/18 23:02
+ * Description: ${DESCRIPTION}
+ */
+@Data
+@TableName("pvn_trade_date")
+public class TradeDateDO {
+    /**
+     * 主键Id
+     */
+    @TableId(value = "id")
+    private Integer id;
+    /**
+     * 交易日
+     */
+    @TableField(value = "trade_date")
+    private Date tradeDate;
+    /**
+     * 截止年份
+     */
+    @TableField(value = "end_year")
+    private String endYear;
+    /**
+     * 年月
+     */
+    @TableField(value = "yearmonth")
+    private String yearmonth;
+    /**
+     * 全年第几周
+     */
+    @TableField(value = "week_of_year")
+    private Integer weekOfYear;
+    /**
+     * 年周
+     */
+    @TableField(value = "year_week")
+    private Integer yearWeek;
+    /**
+     * 周的第几天
+     */
+    @TableField(value = "day_of_week")
+    private Integer dayOfWeek;
+    /**
+     * 是否为交易日
+     */
+    @TableField(value = "isholiday")
+    private Integer isholiday;
+    /**
+     * 是否有效:0-无效,1-有效
+     */
+    @TableField(value = "isvalid")
+    private Integer isvalid;
+    /**
+     * 创建时间
+     */
+    @TableField(value = "createtime")
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updatetime")
+    private Date updateTime;
+}

+ 29 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/query/ParseDetailPageQuery.java

@@ -39,6 +39,11 @@ public class ParseDetailPageQuery extends PageQuery {
      */
      */
     private Integer isStore;
     private Integer isStore;
 
 
+    /**
+     * 邮件标题
+     */
+    private String emailTitle;
+
     public String getFundName() {
     public String getFundName() {
         return fundName;
         return fundName;
     }
     }
@@ -78,4 +83,28 @@ public class ParseDetailPageQuery extends PageQuery {
     public void setIsStore(Integer isStore) {
     public void setIsStore(Integer isStore) {
         this.isStore = isStore;
         this.isStore = isStore;
     }
     }
+
+    public String getUpdateStartDate() {
+        return updateStartDate;
+    }
+
+    public void setUpdateStartDate(String updateStartDate) {
+        this.updateStartDate = updateStartDate;
+    }
+
+    public String getUpdateEndDate() {
+        return updateEndDate;
+    }
+
+    public void setUpdateEndDate(String updateEndDate) {
+        this.updateEndDate = updateEndDate;
+    }
+
+    public String getEmailTitle() {
+        return emailTitle;
+    }
+
+    public void setEmailTitle(String emailTitle) {
+        this.emailTitle = emailTitle;
+    }
 }
 }

+ 5 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/EmailFundAssetVO.java

@@ -60,4 +60,9 @@ public class EmailFundAssetVO {
      * 匹配的基金名称
      * 匹配的基金名称
      */
      */
     private String targetFundName;
     private String targetFundName;
+
+    /**
+     * 邮件标题
+     */
+    private String emailTitle;
 }
 }

+ 9 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/EmailFundNavVO.java

@@ -15,6 +15,10 @@ public class EmailFundNavVO {
      */
      */
     private String fundId;
     private String fundId;
     /**
     /**
+     * 文件id
+     */
+    private Integer fileId;
+    /**
      * 邮件解析的基金名称
      * 邮件解析的基金名称
      */
      */
     private String fundName;
     private String fundName;
@@ -57,4 +61,9 @@ public class EmailFundNavVO {
      *  更新日期
      *  更新日期
      */
      */
     private String upateTime;
     private String upateTime;
+
+    /**
+     * 邮件标题
+     */
+    private String emailTitle;
 }
 }

+ 22 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/EmailParseDetailVO.java

@@ -38,5 +38,27 @@ public class EmailParseDetailVO {
      * 资产净值(基金规模)
      * 资产净值(基金规模)
      */
      */
     private BigDecimal assetNet;
     private BigDecimal assetNet;
+    /**
+     * 净值入库情况 0-未入库,1-入库
+     */
+    private Integer navIsStored;
+    /**
+     * 净值异常情况:1-无异常,2-净值缺失,3-未匹配基金,4-净值<=0,5-资产净值<=0
+     */
+    private Integer navExceptionStatus;
+
+    /**
+     * 规模入库情况 0-未入库,1-入库
+     */
+    private Integer assetIsStored;
+    /**
+     * 规模异常情况:1-无异常,2-资产净值<=0
+     */
+    private Integer assetExceptionStatus;
+
+    /**
+     * 更新时间
+     */
+    private String updateTime;
 
 
 }
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/FundAliasVO.java

@@ -47,4 +47,8 @@ public class FundAliasVO {
      * 管理人
      * 管理人
      */
      */
     private String companyName;
     private String companyName;
+    /**
+     * 最新净值日期
+     */
+    private String priceDate;
 }
 }

+ 25 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/FundInfoSearchVO.java

@@ -0,0 +1,25 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * FileName: FundInfoSearchVO
+ * Author:   chenjianhua
+ * Date:     2024/9/18 17:54
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class FundInfoSearchVO {
+    /**
+     * 基金ID
+     */
+    private String fundId;
+    /**
+     * 基金名称
+     */
+    private String fundName;
+    /**
+     * 备案编码
+     */
+    private String registerNumber;
+}

+ 5 - 0
service-base/src/main/resources/mapper/AssetMapper.xml

@@ -57,5 +57,10 @@
                isvalid, creatorid, createtime, updaterid, updatetime
                isvalid, creatorid, createtime, updaterid, updatetime
         from PPW_EMAIL.asset where isvalid=1 and fund_id=#{fundId} and price_date=#{priceDate}
         from PPW_EMAIL.asset where isvalid=1 and fund_id=#{fundId} and price_date=#{priceDate}
     </select>
     </select>
+    <select id="selectAssetByFundId" resultMap="BaseResultMap">
+        select id,fund_id,price_date,asset_net,asset_share,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.asset where isvalid=1 and fund_id=#{fundId}
+    </select>
 
 
 </mapper>
 </mapper>

+ 2 - 2
service-base/src/main/resources/mapper/CompanyEmailConfigMapper.xml

@@ -58,7 +58,7 @@
         <result column="isvalid" property="isvalid"/>
         <result column="isvalid" property="isvalid"/>
     </resultMap>
     </resultMap>
     <sql id="selectCompanyEmailConfigDo">
     <sql id="selectCompanyEmailConfigDo">
-        select company_id, company_name, email, open_status,remark, creatorid, createtime, updaterid, updatetime,isvalid
+        select id,company_id, company_name, email, open_status,remark, creatorid, createtime, updaterid, updatetime,isvalid
         from PPW_EMAIL.company_email_config
         from PPW_EMAIL.company_email_config
     </sql>
     </sql>
     <!-- 查询条件 -->
     <!-- 查询条件 -->
@@ -100,6 +100,6 @@
     </select>
     </select>
     <select id="selectEmailConfig"  resultMap="BaseResultMap">
     <select id="selectEmailConfig"  resultMap="BaseResultMap">
         select id,company_id,company_name,email,open_status,remark from
         select id,company_id,company_name,email,open_status,remark from
-            PPW_EMAIL.company_email_config where isvalid =1 and company_id=#{companyId} and email=#{email}
+            PPW_EMAIL.company_email_config where isvalid =1 and company_id=#{companyId} and email=#{email} limit 1
     </select>
     </select>
 </mapper>
 </mapper>

+ 11 - 18
service-base/src/main/resources/mapper/CompanyEmailHistoryMapper.xml

@@ -33,18 +33,16 @@
             cec.id,
             cec.id,
             cec.company_id,
             cec.company_id,
             c.company_name,
             c.company_name,
-            listagg(cec.email,',') as email,
-            DATE_FORMAT(max(cesh.send_time),'%Y-%m-%d %H:%i:%s') as send_time,
-            cesh.send_remark,
-            cesh.send_status
+            cec.email,
+            maxce.send_time,
+            maxce.send_remark,
+            maxce.send_status
         FROM
         FROM
         PPW_EMAIL.company_email_config cec
         PPW_EMAIL.company_email_config cec
         JOIN PPW_EMAIL.pvn_company_info c
         JOIN PPW_EMAIL.pvn_company_info c
         ON cec.company_id = c.company_id
         ON cec.company_id = c.company_id
-        LEFT JOIN PPW_EMAIL.company_email_send_history cesh
-        ON cec.email = cesh.email AND cesh.isvalid = 1
-        LEFT JOIN (select me.email as email,max(me.send_time) as send_time from PPW_EMAIL.company_email_send_history me where isvalid =1 group by me.email) maxce
-        ON cesh.email = maxce.email
+        LEFT JOIN (select me.email as email,max(me.send_time) as send_time,me.company_id,me.send_remark,me.send_status from PPW_EMAIL.company_email_send_history me where isvalid =1 group by me.email,me.company_id) maxce
+        ON cec.email = maxce.email and cec.company_id = maxce.company_id
         WHERE cec.isvalid = 1 and c.isvalid=1
         WHERE cec.isvalid = 1 and c.isvalid=1
         <if test="companyName != null and companyName !=''">
         <if test="companyName != null and companyName !=''">
             and (c.company_name like concat('%',#{companyName},'%') or c.company_short_name like concat('%',#{companyName},'%') or c.register_number like concat('%',#{companyName},'%'))
             and (c.company_name like concat('%',#{companyName},'%') or c.company_short_name like concat('%',#{companyName},'%') or c.register_number like concat('%',#{companyName},'%'))
@@ -53,25 +51,21 @@
             and cec.email like concat('%',#{email},'%')
             and cec.email like concat('%',#{email},'%')
         </if>
         </if>
         <if test="sendStatus != null">
         <if test="sendStatus != null">
-            and cesh.send_status=#{sendStatus}
+            and maxce.send_status=#{sendStatus}
         </if>
         </if>
-        group by cec.company_id
         limit #{offset},#{pageSize}
         limit #{offset},#{pageSize}
     </select>
     </select>
 
 
     <select id="countCompanyEmailList" resultType="java.lang.Long"
     <select id="countCompanyEmailList" resultType="java.lang.Long"
             parameterType="com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery">
             parameterType="com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery">
-        select count(*) from (
         SELECT
         SELECT
         count(cec.company_id)
         count(cec.company_id)
-        FROM
+        from
         PPW_EMAIL.company_email_config cec
         PPW_EMAIL.company_email_config cec
         JOIN PPW_EMAIL.pvn_company_info c
         JOIN PPW_EMAIL.pvn_company_info c
         ON cec.company_id = c.company_id
         ON cec.company_id = c.company_id
-        LEFT JOIN PPW_EMAIL.company_email_send_history cesh
-        ON cec.email = cesh.email AND cesh.isvalid = 1
-        LEFT JOIN (select me.email as email,max(me.send_time) as send_time from PPW_EMAIL.company_email_send_history me where isvalid =1 group by me.email) maxce
-        ON cesh.email = maxce.email
+        LEFT JOIN (select me.email as email,max(me.send_time) as send_time,me.company_id,me.send_remark,me.send_status from PPW_EMAIL.company_email_send_history me where isvalid =1 group by me.email,me.company_id) maxce
+        ON cec.email = maxce.email and cec.company_id = maxce.company_id
         WHERE cec.isvalid = 1 and c.isvalid=1
         WHERE cec.isvalid = 1 and c.isvalid=1
         <if test="companyName != null and companyName !=''">
         <if test="companyName != null and companyName !=''">
             and (c.company_name like concat('%',#{companyName},'%') or c.company_short_name like concat('%',#{companyName},'%') or c.register_number like concat('%',#{companyName},'%'))
             and (c.company_name like concat('%',#{companyName},'%') or c.company_short_name like concat('%',#{companyName},'%') or c.register_number like concat('%',#{companyName},'%'))
@@ -80,9 +74,8 @@
             and cec.email like concat('%',#{email},'%')
             and cec.email like concat('%',#{email},'%')
         </if>
         </if>
         <if test="sendStatus != null">
         <if test="sendStatus != null">
-            and cesh.send_status=#{sendStatus}
+            and maxce.send_status=#{sendStatus}
         </if>
         </if>
-        group by cec.company_id) a
     </select>
     </select>
 
 
     <select id="searchEmailHistory" resultMap="BaseResultMap">
     <select id="searchEmailHistory" resultMap="BaseResultMap">

+ 10 - 0
service-base/src/main/resources/mapper/DeletionInfoMapper.xml

@@ -16,6 +16,10 @@
         <result column="updaterid" property="updaterId"/>
         <result column="updaterid" property="updaterId"/>
         <result column="updatetime" property="updateTime"/>
         <result column="updatetime" property="updateTime"/>
     </resultMap>
     </resultMap>
+    <insert id="saveDeletionInfoDO" parameterType="com.simuwang.base.pojo.dos.DeletionInfoDO">
+        insert into PPW_EMAIL.deletion_info(fund_id,deletion_type,deletion_date,isvalid,createtime,updatetime)
+        values (#{fundId},#{deletionType},#{deletionDate},#{isvalid},#{createTime},#{updateTime})
+    </insert>
     <update id="update" parameterType="com.simuwang.base.pojo.dos.FundDeletionInfoDO">
     <update id="update" parameterType="com.simuwang.base.pojo.dos.FundDeletionInfoDO">
         update PPW_EMAIL.deletion_info set fund_id=#{fundId},deletion_type=#{deletionType},deletion_date=#{deletionDate},remark=#{remark},updatetime=#{updateTime}
         update PPW_EMAIL.deletion_info set fund_id=#{fundId},deletion_type=#{deletionType},deletion_date=#{deletionDate},remark=#{remark},updatetime=#{updateTime}
         where id=#{id} and isvalid=1
         where id=#{id} and isvalid=1
@@ -191,5 +195,11 @@
             </foreach>
             </foreach>
         </if>
         </if>
     </select>
     </select>
+    <select id="getDeletionInfoDO" resultType="com.simuwang.base.pojo.dos.DeletionInfoDO"
+            parameterType="com.simuwang.base.pojo.dos.DeletionInfoDO">
+        select id,fund_id,deletion_type,deletion_date,remark,isvalid,creatorid,updaterid,createtime,updatetime
+        from PPW_EMAIL.deletion_info where isvalid=1
+        and fund_id=#{fundId} and deletion_date=#{deletionDate} and deletion_type=#{deletionType}
+    </select>
 
 
 </mapper>
 </mapper>

+ 28 - 2
service-base/src/main/resources/mapper/EmailFileInfoMapper.xml

@@ -28,6 +28,13 @@
         from PPW_EMAIL.email_file_info where id=#{id} and isvalid=1
         from PPW_EMAIL.email_file_info where id=#{id} and isvalid=1
     </select>
     </select>
 
 
+    <select id="getEmailFileByEmailId" resultMap="BaseResultMap"
+            parameterType="java.lang.Integer">
+        select id ,email_id, file_name, file_path,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.email_file_info where email_id=#{emailId} and isvalid=1
+    </select>
+
     <select id="queryByEmailId" resultMap="BaseResultMap">
     <select id="queryByEmailId" resultMap="BaseResultMap">
         select id, file_name, file_path
         select id, file_name, file_path
         from PPW_EMAIL.email_file_info
         from PPW_EMAIL.email_file_info
@@ -53,7 +60,7 @@
         limit #{offset},#{pageSize}
         limit #{offset},#{pageSize}
     </select>
     </select>
 
 
-    <resultMap id="BaseDetailMap" type="com.simuwang.base.pojo.vo.EmailParseDetailVO">
+    <resultMap id="BaseDetailMap" type="com.simuwang.base.pojo.dos.EmailParseDetailDO">
         <result column="fund_id" property="fundId"/>
         <result column="fund_id" property="fundId"/>
         <result column="fund_name" property="fundName"/>
         <result column="fund_name" property="fundName"/>
         <result column="register_number" property="registerNumber"/>
         <result column="register_number" property="registerNumber"/>
@@ -62,6 +69,11 @@
         <result column="cumulative_nav_withdrawal" property="cumulativeNavWithdrawal"/>
         <result column="cumulative_nav_withdrawal" property="cumulativeNavWithdrawal"/>
         <result column="asset_net" property="assetNet"/>
         <result column="asset_net" property="assetNet"/>
         <result column="asset_share" property="assetShare"/>
         <result column="asset_share" property="assetShare"/>
+        <result column="nav_is_stored" property="navIsStored"/>
+        <result column="nav_exception_status" property="navExceptionStatus"/>
+        <result column="asset_is_stored" property="assetIsStored"/>
+        <result column="asset_exception_status" property="assetExceptionStatus"/>
+        <result column="updatetime" property="updateTime"/>
     </resultMap>
     </resultMap>
     <select id="searchEmailDetailById" resultMap="BaseDetailMap">
     <select id="searchEmailDetailById" resultMap="BaseDetailMap">
         SELECT distinct
         SELECT distinct
@@ -72,7 +84,21 @@
             nav.nav,
             nav.nav,
             nav.cumulative_nav_withdrawal,
             nav.cumulative_nav_withdrawal,
             asset.asset_net,
             asset.asset_net,
-            asset.asset_share
+            asset.asset_share,
+            nav.is_stored as nav_is_stored,
+            nav.exception_status as nav_exception_status,
+            asset.is_stored as asset_is_stored,
+            asset.exception_status as asset_exception_status,
+            case
+            when nav.updatetime is null then
+            asset.updatetime
+            when asset.updatetime is null then
+            nav.updatetime
+            when nav.updatetime >= asset.updatetime then
+                nav.updatetime
+            else
+                asset.updatetime
+         end as updatetime
         FROM
         FROM
             PPW_EMAIL.EMAIL_FILE_INFO efi
             PPW_EMAIL.EMAIL_FILE_INFO efi
                 LEFT JOIN PPW_EMAIL.email_fund_nav nav
                 LEFT JOIN PPW_EMAIL.email_fund_nav nav

+ 21 - 5
service-base/src/main/resources/mapper/EmailFundAssetMapper.xml

@@ -17,6 +17,7 @@
         <result column="createtime" property="createTime"/>
         <result column="createtime" property="createTime"/>
         <result column="updaterid" property="updaterId"/>
         <result column="updaterid" property="updaterId"/>
         <result column="updatetime" property="updateTime"/>
         <result column="updatetime" property="updateTime"/>
+        <result column="email_title" property="emailTitle"/>
     </resultMap>
     </resultMap>
 
 
     <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.EmailFundAssetDO">
     <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.EmailFundAssetDO">
@@ -41,8 +42,13 @@
     </update>
     </update>
     <select id="searchAssetDetail" resultMap="BaseResultMap"
     <select id="searchAssetDetail" resultMap="BaseResultMap"
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
-        select distinct id,fund_id, fund_name,register_number,price_date,asset_net,asset_share,is_stored,exception_status,updatetime
-        from PPW_EMAIL.email_fund_asset asset where isvalid=1
+        select distinct asset.id,asset.fund_id, asset.fund_name,asset.register_number,asset.price_date,asset.asset_net,asset.asset_share,asset.is_stored,asset.exception_status,asset.updatetime,parse.email_title
+        from PPW_EMAIL.email_fund_asset asset
+        join PPW_EMAIL.email_file_info file
+        on asset.file_id = file.id
+        join PPW_EMAIL.email_parse_info parse
+        on file.email_id = parse.id
+        where asset.isvalid=1 and file.isvalid=1 and parse.isvalid=1
         <if test="fundName != null and fundName !=''">
         <if test="fundName != null and fundName !=''">
             and asset.fund_name like concat('%',#{fundName},'%')
             and asset.fund_name like concat('%',#{fundName},'%')
         </if>
         </if>
@@ -64,15 +70,22 @@
         <if test="isStore != null">
         <if test="isStore != null">
             and asset.is_stored = #{isStore}
             and asset.is_stored = #{isStore}
         </if>
         </if>
+        <if test="emailTitle != null and emailTitle != ''">
+            and parse.email_title like concat('%',#{emailTitle},'%')
+        </if>
         order by asset.fund_name desc,asset.price_date desc
         order by asset.fund_name desc,asset.price_date desc
         limit #{offset},#{pageSize}
         limit #{offset},#{pageSize}
     </select>
     </select>
     <select id="countAssetDetail" resultType="java.lang.Long"
     <select id="countAssetDetail" resultType="java.lang.Long"
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
         select count(1) from (
         select count(1) from (
-        select distinct id,fund_id, fund_name,register_number,price_date,asset_net,asset_share,is_stored,exception_status,
-         updatetime
-        from PPW_EMAIL.email_fund_asset asset where isvalid=1
+        select distinct asset.id
+        from PPW_EMAIL.email_fund_asset asset
+        join PPW_EMAIL.email_file_info file
+        on asset.file_id = file.id
+        join PPW_EMAIL.email_parse_info parse
+        on file.email_id = parse.id
+        where asset.isvalid=1 and file.isvalid=1 and parse.isvalid=1
         <if test="fundName != null and fundName !=''">
         <if test="fundName != null and fundName !=''">
             and asset.fund_name like concat('%',#{fundName},'%')
             and asset.fund_name like concat('%',#{fundName},'%')
         </if>
         </if>
@@ -94,6 +107,9 @@
         <if test="isStore != null">
         <if test="isStore != null">
             and asset.is_stored = #{isStore}
             and asset.is_stored = #{isStore}
         </if>
         </if>
+        <if test="emailTitle != null and emailTitle != ''">
+            and parse.email_title like concat('%',#{emailTitle},'%')
+        </if>
         )a
         )a
     </select>
     </select>
     <select id="countNoStoreAsset" resultType="java.lang.Integer" parameterType="java.lang.String">
     <select id="countNoStoreAsset" resultType="java.lang.Integer" parameterType="java.lang.String">

+ 48 - 28
service-base/src/main/resources/mapper/EmailFundNavMapper.xml

@@ -17,6 +17,7 @@
         <result column="createtime" property="createTime"/>
         <result column="createtime" property="createTime"/>
         <result column="updaterid" property="updaterId"/>
         <result column="updaterid" property="updaterId"/>
         <result column="updatetime" property="updateTime"/>
         <result column="updatetime" property="updateTime"/>
+        <result column="email_title" property="emailTitle"/>
     </resultMap>
     </resultMap>
 
 
     <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.EmailFundNavDO">
     <insert id="batchInsert" parameterType="com.simuwang.base.pojo.dos.EmailFundNavDO">
@@ -46,7 +47,7 @@
         update PPW_EMAIL.email_fund_nav nav set isvalid = 0,updatetime=sysdate() where file_id=#{fileId}
         update PPW_EMAIL.email_fund_nav nav set isvalid = 0,updatetime=sysdate() where file_id=#{fileId}
     </delete>
     </delete>
     <select id="searchNavDetail" resultMap="BaseResultMap">
     <select id="searchNavDetail" resultMap="BaseResultMap">
-        SELECT distinct nav.id,
+        SELECT distinct nav.id,nav.file_id,
             nav.fund_id,
             nav.fund_id,
             nav.fund_name,
             nav.fund_name,
             nav.register_number,
             nav.register_number,
@@ -55,10 +56,15 @@
             nav.cumulative_nav_withdrawal,
             nav.cumulative_nav_withdrawal,
             nav.exception_status,
             nav.exception_status,
             nav.is_stored,
             nav.is_stored,
-            nav.updatetime
+            nav.updatetime,
+            parse.email_title
         FROM
         FROM
             PPW_EMAIL.email_fund_nav nav
             PPW_EMAIL.email_fund_nav nav
-        WHERE nav.isvalid = 1
+            join PPW_EMAIL.email_file_info file
+                on nav.file_id = file.id
+            join PPW_EMAIL.email_parse_info parse
+                on file.email_id = parse.id
+        WHERE nav.isvalid = 1  and file.isvalid=1 and parse.isvalid=1
         <if test="fundName != null and fundName !=''">
         <if test="fundName != null and fundName !=''">
             and nav.fund_name like concat('%',#{fundName},'%')
             and nav.fund_name like concat('%',#{fundName},'%')
         </if>
         </if>
@@ -80,13 +86,16 @@
         <if test="isStore != null">
         <if test="isStore != null">
             and nav.is_stored = #{isStore}
             and nav.is_stored = #{isStore}
         </if>
         </if>
+        <if test="emailTitle != null and emailTitle != ''">
+            and parse.email_title like concat('%',#{emailTitle},'%')
+        </if>
         order by nav.fund_name desc,nav.price_date desc
         order by nav.fund_name desc,nav.price_date desc
         limit #{offset},#{pageSize}
         limit #{offset},#{pageSize}
     </select>
     </select>
     <select id="countNavDetail" resultType="java.lang.Long"
     <select id="countNavDetail" resultType="java.lang.Long"
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
             parameterType="com.simuwang.base.pojo.dto.query.ParseDetailPageQuery">
         select count(1) from (
         select count(1) from (
-            SELECT distinct nav.id,
+            SELECT distinct nav.id,nav.file_id,
             nav.fund_id,
             nav.fund_id,
             nav.fund_name,
             nav.fund_name,
             nav.register_number,
             nav.register_number,
@@ -96,30 +105,37 @@
             nav.exception_status,
             nav.exception_status,
             nav.is_stored,
             nav.is_stored,
             nav.updatetime
             nav.updatetime
-            FROM
-            PPW_EMAIL.email_fund_nav nav
-            WHERE nav.isvalid = 1
-            <if test="fundName != null and fundName !=''">
-                and nav.fund_name like concat('%',#{fundName},'%')
-            </if>
-            <if test="priceStartDate != null and priceStartDate !=''">
-                and nav.price_date >= #{priceStartDate}
-            </if>
-            <if test="priceEndDate != null and priceEndDate !=''">
-                and nav.price_date  <![CDATA[ <= ]]> #{priceEndDate}
-            </if>
-            <if test="exceptionStatus != null">
-                and nav.exception_status = #{exceptionStatus}
-            </if>
-            <if test="updateStartDate != null and updateStartDate !=''">
-                and nav.updatetime  <![CDATA[ >= ]]> #{updateStartDate}
-            </if>
-            <if test="updateEndDate != null and updateEndDate !=''">
-                and nav.updatetime  <![CDATA[ <= ]]> #{updateEndDate}
-            </if>
-            <if test="isStore != null">
-                and nav.is_stored = #{isStore}
-            </if>
+        FROM
+        PPW_EMAIL.email_fund_nav nav
+        join PPW_EMAIL.email_file_info file
+        on nav.file_id = file.id
+        join PPW_EMAIL.email_parse_info parse
+        on file.email_id = parse.id
+        WHERE nav.isvalid = 1  and file.isvalid=1 and parse.isvalid=1
+        <if test="fundName != null and fundName !=''">
+            and nav.fund_name like concat('%',#{fundName},'%')
+        </if>
+        <if test="priceStartDate != null and priceStartDate !=''">
+            and nav.price_date >= #{priceStartDate}
+        </if>
+        <if test="priceEndDate != null and priceEndDate !=''">
+            and nav.price_date  <![CDATA[ <= ]]> #{priceEndDate}
+        </if>
+        <if test="exceptionStatus != null">
+            and nav.exception_status = #{exceptionStatus}
+        </if>
+        <if test="updateStartDate != null and updateStartDate !=''">
+            and nav.updatetime  <![CDATA[ >= ]]> #{updateStartDate}
+        </if>
+        <if test="updateEndDate != null and updateEndDate !=''">
+            and nav.updatetime  <![CDATA[ <= ]]> #{updateEndDate}
+        </if>
+        <if test="isStore != null">
+            and nav.is_stored = #{isStore}
+        </if>
+        <if test="emailTitle != null and emailTitle != ''">
+            and parse.email_title like concat('%',#{emailTitle},'%')
+        </if>
         ) a
         ) a
     </select>
     </select>
     <select id="countNoStoreNav" resultType="java.lang.Integer" parameterType="java.lang.String">
     <select id="countNoStoreNav" resultType="java.lang.Integer" parameterType="java.lang.String">
@@ -153,6 +169,10 @@
         where nav.isvalid =1 and nav.exception_status=3
         where nav.isvalid =1 and nav.exception_status=3
           and nav.fund_name=#{fundName}
           and nav.fund_name=#{fundName}
     </select>
     </select>
+    <select id="getMaxPriceDate" resultType="java.lang.String" parameterType="java.lang.String">
+        select max(nav.price_date) from PPW_EMAIL.email_fund_nav nav where nav.isvalid =1 and nav.exception_status=3
+                                                                        and nav.fund_name=#{fundName}
+    </select>
 
 
 
 
 </mapper>
 </mapper>

+ 1 - 1
service-base/src/main/resources/mapper/EmailTypeRuleMapper.xml

@@ -19,7 +19,7 @@
         where isvalid = 1 limit 1
         where isvalid = 1 limit 1
     </select>
     </select>
     <select id="searchEmailType" resultMap="BaseResultMap">
     <select id="searchEmailType" resultMap="BaseResultMap">
-        select id,nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime from PPW_EMAIL.email_type_rule where isvalid =1
+        select id,nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime from PPW_EMAIL.email_type_rule where isvalid =1 limit 1
     </select>
     </select>
     <insert id="saveEmailType">
     <insert id="saveEmailType">
         insert into PPW_EMAIL.email_type_rule(nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime)
         insert into PPW_EMAIL.email_type_rule(nav,valuation,report,isvalid,creatorid,createtime,updaterid,updatetime)

+ 6 - 0
service-base/src/main/resources/mapper/FundAliasMapper.xml

@@ -18,6 +18,12 @@
         update PPW_EMAIL.fund_alias set target_fund_id=#{targetFundId},target_fund_name=#{targetFundName},target_register_number=#{targetRegisterNumber},updatetime=#{updateTime}
         update PPW_EMAIL.fund_alias set target_fund_id=#{targetFundId},target_fund_name=#{targetFundName},target_register_number=#{targetRegisterNumber},updatetime=#{updateTime}
         where isvalid =1 and id=#{id}
         where isvalid =1 and id=#{id}
     </update>
     </update>
+    <update id="batchDelete">
+        update PPW_EMAIL.fund_alias set isvalid=0,updatetime=sysdate() where isvalid =1 and id in
+        <foreach collection="idList" index="index" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+    </update>
 
 
     <select id="queryFundByNameAndRegisterNumber" resultMap="BaseResultMap">
     <select id="queryFundByNameAndRegisterNumber" resultMap="BaseResultMap">
         select target_fund_id, target_fund_name, target_register_number
         select target_fund_id, target_fund_name, target_register_number

+ 3 - 0
service-base/src/main/resources/mapper/FundInfoMapper.xml

@@ -156,5 +156,8 @@
         join PPW_EMAIL.pvn_fund_info info on info.trust_id=c.company_id
         join PPW_EMAIL.pvn_fund_info info on info.trust_id=c.company_id
         where info.fund_id=#{fundId} and info.isvalid=1 and c.isvalid=1
         where info.fund_id=#{fundId} and info.isvalid=1 and c.isvalid=1
     </select>
     </select>
+    <select id="getInceptionDateByFundId" resultType="java.lang.String" parameterType="java.lang.String">
+        select inception_date from PPW_EMAIL.pvn_fund_info where fund_id=#{fundId} and isvalid=1
+    </select>
 
 
 </mapper>
 </mapper>

+ 11 - 0
service-base/src/main/resources/mapper/NavMapper.xml

@@ -79,6 +79,17 @@
           and fund_id = #{fundId}
           and fund_id = #{fundId}
           and price_date=#{priceDate}
           and price_date=#{priceDate}
     </select>
     </select>
+    <select id="getAllFundId" resultType="java.lang.String">
+        select distinct fund_id from PPW_EMAIL.nav where isvalid=1
+    </select>
+    <select id="selectNavByFundId" resultMap="BaseResultMap"
+            parameterType="java.lang.String">
+        SELECT id, fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+               isvalid, creatorid, createtime, updaterid, updatetime
+        from PPW_EMAIL.nav
+        where isvalid = 1
+          and fund_id = #{fundId}
+    </select>
 
 
 
 
 </mapper>
 </mapper>

+ 23 - 0
service-base/src/main/resources/mapper/TradeDateMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.simuwang.base.mapper.TradeDateMapper">
+    <resultMap id="BaseResultMap" type="com.simuwang.base.pojo.dos.TradeDateDO">
+        <id column="id" property="id"/>
+        <result column="trade_date" property="tradeDate"/>
+        <result column="end_year" property="endYear"/>
+        <result column="yearmonth" property="yearmonth"/>
+        <result column="week_of_year" property="weekOfYear"/>
+        <result column="year_week" property="yearWeek"/>
+        <result column="day_of_week" property="dayOfWeek"/>
+        <result column="isholiday" property="isholiday"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="createtime" property="createTime"/>
+        <result column="updatetime" property="updateTime"/>
+    </resultMap>
+    <select id="selectTradeDate" resultMap="BaseResultMap">
+        select id,trade_date,end_year,yearmonth,week_of_year,year_week,day_of_week,isholiday,isvalid,createtime,updatetime
+        from PPW_EMAIL.pvn_trade_date where isvalid=1 and isholiday=0 and trade_date>=#{startDate} and trade_date <![CDATA[ <= ]]> #{endDate}
+    </select>
+
+
+</mapper>

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

@@ -156,8 +156,8 @@ public class EmailParseService {
             saveNavAndAssetNet(fileId, fundNavDTOList, parseDate);
             saveNavAndAssetNet(fileId, fundNavDTOList, parseDate);
         }
         }
 
 
-        // 更新邮件解析结果 -> 存在一条成功解析的净值数据就认为解析成功
-        long successNavCount = fileNameNavMap.values().stream().flatMap(List::stream).filter(e -> e.getParseStatus().equals(NavParseStatusConst.SUCCESS)).count();
+        // 更新邮件解析结果 -> 当【净值日期】和【备案编码/基金名称】能正常解读,即识别为【成功】
+        long successNavCount = fileNameNavMap.values().stream().flatMap(List::stream).filter(Objects::nonNull).count();
         emailParseStatus = successNavCount >= 1 ? EmailParseStatusConst.SUCCESS : EmailParseStatusConst.FAIL;
         emailParseStatus = successNavCount >= 1 ? EmailParseStatusConst.SUCCESS : EmailParseStatusConst.FAIL;
         emailParseInfoMapper.updateParseStatus(emailId, emailParseStatus);
         emailParseInfoMapper.updateParseStatus(emailId, emailParseStatus);
     }
     }

+ 87 - 42
service-daq/src/main/java/com/simuwang/daq/service/ValuationEmailParser.java

@@ -15,10 +15,7 @@ import com.simuwang.base.pojo.valuation.ValuationNeedParseParam;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.io.File;
 import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -45,33 +42,76 @@ public class ValuationEmailParser extends AbstractEmailParser {
     @Override
     @Override
     public List<EmailFundNavDTO> parse(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
     public List<EmailFundNavDTO> parse(EmailContentInfoDTO emailContentInfoDTO, Map<String, List<String>> emailFieldMap) {
         List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
         List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
-        boolean isSatisfiedParse  = emailContentInfoDTO != null && StrUtil.isNotBlank(emailContentInfoDTO.getFilePath())
-                && (ExcelUtil.isExcel(emailContentInfoDTO.getFileName()) || ExcelUtil.isPdf(emailContentInfoDTO.getFileName()));
+        boolean isSatisfiedParse = emailContentInfoDTO != null && StrUtil.isNotBlank(emailContentInfoDTO.getFileName())
+                && (ExcelUtil.isExcel(emailContentInfoDTO.getFileName()) || ExcelUtil.isPdf(emailContentInfoDTO.getFileName()) || ExcelUtil.isZip(emailContentInfoDTO.getFileName()));
         if (!isSatisfiedParse) {
         if (!isSatisfiedParse) {
             return emailFundNavDTOList;
             return emailFundNavDTOList;
         }
         }
         List<ValuationNeedParseParam> valuationNeedParseParams = buildValuationNeedParseParam(emailContentInfoDTO);
         List<ValuationNeedParseParam> valuationNeedParseParams = buildValuationNeedParseParam(emailContentInfoDTO);
         List<AssetsValuationResult.Record> recordList = valuationParseService.parseValuationExcel(valuationNeedParseParams);
         List<AssetsValuationResult.Record> recordList = valuationParseService.parseValuationExcel(valuationNeedParseParams);
         if (CollUtil.isNotEmpty(recordList)) {
         if (CollUtil.isNotEmpty(recordList)) {
-            List<AssetsValuationResult.Record> parseSucessList = recordList.stream()
+            List<AssetsValuationResult.Record> parseSuccessList = recordList.stream()
                     .filter(e -> e.getSuccess() == 1 || (StrUtil.isNotBlank(e.getMsg()) && "未匹配基金".equals(e.getMsg()))).collect(Collectors.toList());
                     .filter(e -> e.getSuccess() == 1 || (StrUtil.isNotBlank(e.getMsg()) && "未匹配基金".equals(e.getMsg()))).collect(Collectors.toList());
-            EmailFundNavDTO fundNavDTO = convertToFundNavDTO(parseSucessList);
-            Optional.ofNullable(fundNavDTO).ifPresent(emailFundNavDTOList::add);
+            List<EmailFundNavDTO> fundNavDTOList = convertToFundNavDTO(parseSuccessList);
+            Optional.ofNullable(fundNavDTOList).ifPresent(emailFundNavDTOList::addAll);
         }
         }
         return emailFundNavDTOList;
         return emailFundNavDTOList;
     }
     }
 
 
     private List<ValuationNeedParseParam> buildValuationNeedParseParam(EmailContentInfoDTO emailContentInfoDTO) {
     private List<ValuationNeedParseParam> buildValuationNeedParseParam(EmailContentInfoDTO emailContentInfoDTO) {
-        // pdf格式文件转成excel
-        File file = new File(emailContentInfoDTO.getFilePath());
-        ValuationNeedParseParam parseParam = new ValuationNeedParseParam();
-        parseParam.setFile(file);
-        parseParam.setFileUrl(emailContentInfoDTO.getFilePath());
-        parseParam.setOriginFileName(emailContentInfoDTO.getFileName());
-        parseParam.setFundId(null);
-        parseParam.setFromEmail(1);
-        transformPdfToExcel(parseParam);
-        return ListUtil.toList(parseParam);
+        String fileName = emailContentInfoDTO.getFileName();
+        String filePath = emailContentInfoDTO.getFilePath();
+        if (StrUtil.isNotBlank(fileName) && ExcelUtil.isZip(fileName)) {
+            List<String> filePathList = compressedFile(filePath, fileName);
+            if (CollUtil.isEmpty(filePathList)) {
+                return CollUtil.newArrayList();
+            }
+            List<ValuationNeedParseParam> parseParamList = CollUtil.newArrayList();
+            for (String path : filePathList) {
+                ValuationNeedParseParam parseParam = new ValuationNeedParseParam();
+                parseParam.setFile(new File(path));
+                parseParam.setFileUrl(path);
+                parseParam.setOriginFileName(fileName);
+                parseParam.setFundId(null);
+                parseParam.setFromEmail(1);
+                // pdf格式文件转成excel
+                transformPdfToExcel(parseParam);
+                parseParamList.add(parseParam);
+            }
+            return parseParamList;
+        } else {
+            File file = new File(filePath);
+            ValuationNeedParseParam parseParam = new ValuationNeedParseParam();
+            parseParam.setFile(file);
+            parseParam.setFileUrl(filePath);
+            parseParam.setOriginFileName(fileName);
+            parseParam.setFundId(null);
+            parseParam.setFromEmail(1);
+            // pdf格式文件转成excel
+            transformPdfToExcel(parseParam);
+            return ListUtil.toList(parseParam);
+        }
+    }
+
+    private List<String> compressedFile(String filePath, String fileName) {
+        List<String> filePathList = CollUtil.newArrayList();
+        String destPath = filePath.substring(0, filePath.indexOf(fileName)) + fileName.replaceAll(".zip", "").replaceAll(".ZIP", "");
+        List<String> compressedFiles = ExcelUtil.extractCompressedFiles(filePath, destPath);
+        for (String path : compressedFiles) {
+            boolean isSatisfiedParse = ExcelUtil.isExcel(path) || ExcelUtil.isPdf(path) || ExcelUtil.isZip(path);
+            if (!isSatisfiedParse) {
+                continue;
+            }
+            if (ExcelUtil.isZip(path)) {
+                filePathList.addAll(compressedFile(path, new File(path).getName()));
+            }
+            File file = new File(path);
+            if (file.isDirectory()) {
+                filePathList.addAll(Arrays.stream(Objects.requireNonNull(file.list())).toList());
+            }
+            filePathList.add(path);
+        }
+        return filePathList;
     }
     }
 
 
     private void transformPdfToExcel(ValuationNeedParseParam valuationNeedParseParam) {
     private void transformPdfToExcel(ValuationNeedParseParam valuationNeedParseParam) {
@@ -91,31 +131,36 @@ public class ValuationEmailParser extends AbstractEmailParser {
         valuationNeedParseParam.setFile(toExcelDTO != null ? toExcelDTO.getExcelFile() : null);
         valuationNeedParseParam.setFile(toExcelDTO != null ? toExcelDTO.getExcelFile() : null);
     }
     }
 
 
-    private EmailFundNavDTO convertToFundNavDTO(List<AssetsValuationResult.Record> parseSucessList) {
-        if (CollUtil.isEmpty(parseSucessList)) {
+    private List<EmailFundNavDTO> convertToFundNavDTO(List<AssetsValuationResult.Record> parseSuccessList) {
+        if (CollUtil.isEmpty(parseSuccessList)) {
             return null;
             return null;
         }
         }
-        String fundName = parseSucessList.stream().map(AssetsValuationResult.Record::getParseValuationInfo)
-                .filter(Objects::nonNull).map(ParseValuationInfo::getFundName).distinct().findFirst().orElse(null);
-        String registerNumber = parseSucessList.stream().map(AssetsValuationResult.Record::getParseValuationInfo)
-                .filter(Objects::nonNull).map(ParseValuationInfo::getRegisterNumber).distinct().findFirst().orElse(null);
-        String valuationDate = parseSucessList.stream().map(AssetsValuationResult.Record::getDate).filter(Objects::nonNull).distinct().findFirst().orElse(null);
-        String nav = parseSucessList.stream().map(AssetsValuationResult.Record::getNav).filter(Objects::nonNull).distinct().findFirst().orElse(null);
-        String cumulativeNavWithdrawal = parseSucessList.stream().map(AssetsValuationResult.Record::getCumulativeNavWithdrawal).filter(Objects::nonNull).distinct().findFirst().orElse(null);
-        String assetNet = parseSucessList.stream().map(AssetsValuationResult.Record::getAssetNet).filter(Objects::nonNull).distinct().findFirst().orElse(null);
-        String assetShare = parseSucessList.stream().map(AssetsValuationResult.Record::getAssetShare).filter(Objects::nonNull).distinct().findFirst().orElse(null);
-        List<String> fundIdList = parseSucessList.stream().map(AssetsValuationResult.Record::getFundId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+        List<EmailFundNavDTO> emailFundNavDTOList = CollUtil.newArrayList();
+        Map<String, List<AssetsValuationResult.Record>> dateSuccessRecordMap = parseSuccessList.stream().collect(Collectors.groupingBy(AssetsValuationResult.Record::getDate));
+        for (Map.Entry<String, List<AssetsValuationResult.Record>> successRecordEntry : dateSuccessRecordMap.entrySet()) {
+            String date = successRecordEntry.getKey();
+            List<AssetsValuationResult.Record> recordList = successRecordEntry.getValue();
+            String fundName = recordList.stream().map(AssetsValuationResult.Record::getParseValuationInfo)
+                    .filter(Objects::nonNull).map(ParseValuationInfo::getFundName).distinct().findFirst().orElse(null);
+            String registerNumber = recordList.stream().map(AssetsValuationResult.Record::getParseValuationInfo)
+                    .filter(Objects::nonNull).map(ParseValuationInfo::getRegisterNumber).distinct().findFirst().orElse(null);
+            String nav = recordList.stream().map(AssetsValuationResult.Record::getNav).filter(Objects::nonNull).distinct().findFirst().orElse(null);
+            String cumulativeNavWithdrawal = recordList.stream().map(AssetsValuationResult.Record::getCumulativeNavWithdrawal).filter(Objects::nonNull).distinct().findFirst().orElse(null);
+            String assetNet = recordList.stream().map(AssetsValuationResult.Record::getAssetNet).filter(Objects::nonNull).distinct().findFirst().orElse(null);
+            String assetShare = recordList.stream().map(AssetsValuationResult.Record::getAssetShare).filter(Objects::nonNull).distinct().findFirst().orElse(null);
+            List<String> fundIdList = recordList.stream().map(AssetsValuationResult.Record::getFundId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 
 
-        EmailFundNavDTO fundNavDTO = new EmailFundNavDTO();
-        fundNavDTO.setFundName(fundName);
-        fundNavDTO.setRegisterNumber(registerNumber);
-        fundNavDTO.setPriceDate(valuationDate);
-        fundNavDTO.setNav(nav);
-        fundNavDTO.setCumulativeNavWithdrawal(cumulativeNavWithdrawal);
-        fundNavDTO.setAssetNet(assetNet);
-        fundNavDTO.setAssetShare(assetShare);
-        fundNavDTO.setFundIdList(fundIdList);
-        return fundNavDTO;
+            EmailFundNavDTO fundNavDTO = new EmailFundNavDTO();
+            fundNavDTO.setFundName(fundName);
+            fundNavDTO.setRegisterNumber(registerNumber);
+            fundNavDTO.setPriceDate(date);
+            fundNavDTO.setNav(nav);
+            fundNavDTO.setCumulativeNavWithdrawal(cumulativeNavWithdrawal);
+            fundNavDTO.setAssetNet(assetNet);
+            fundNavDTO.setAssetShare(assetShare);
+            fundNavDTO.setFundIdList(fundIdList);
+            emailFundNavDTOList.add(fundNavDTO);
+        }
+        return emailFundNavDTOList;
     }
     }
-
 }
 }

+ 2 - 2
service-deploy/src/main/test/java/com/simuwang/datadaq/DataTrusteeApplicationTests.java

@@ -37,8 +37,8 @@ class DataTrusteeApplicationTests {
         emailInfoDTO.setProtocol("imap");
         emailInfoDTO.setProtocol("imap");
         Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap();
         Map<Integer, List<String>> emailTypeMap = MapUtil.newHashMap();
         emailTypeMap.put(1, List.of("净值"));
         emailTypeMap.put(1, List.of("净值"));
-        Date startDate = DateUtil.parse("2024-09-14 10:10:00", DateConst.YYYY_MM_DD_HH_MM_SS);
-        Date endDate = DateUtil.parse("2024-09-14 12:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date startDate = DateUtil.parse("2024-09-19 09:20:00", DateConst.YYYY_MM_DD_HH_MM_SS);
+        Date endDate = DateUtil.parse("2024-09-19 16:00:00", DateConst.YYYY_MM_DD_HH_MM_SS);
         try {
         try {
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate);
             emailParseService.parseEmail(emailInfoDTO, startDate, endDate);
         } catch (Exception e) {
         } catch (Exception e) {

+ 6 - 5
service-manage/src/main/java/com/simuwang/manage/api/company/CompanyEmailSendHistoryController.java

@@ -7,6 +7,7 @@ import com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery;
 import com.simuwang.base.pojo.vo.*;
 import com.simuwang.base.pojo.vo.*;
 import com.simuwang.manage.service.CompanyEmailConfigService;
 import com.simuwang.manage.service.CompanyEmailConfigService;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
+import com.smppw.common.pojo.ResultVo;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -52,14 +53,14 @@ public class CompanyEmailSendHistoryController{
 
 
 
 
     /**
     /**
-     * 根据公司ID查询邮箱配置信息
-     * @param companyEmailHistoryPageQuery 公司ID
+     * 根据ID查询邮箱配置信息
+     * @param idVO
      * @return
      * @return
      */
      */
     @RequestMapping("search-email-config")
     @RequestMapping("search-email-config")
-    public MybatisPage<CompanyEmailConfigVO> searchEmailConfig(CompanyEmailHistoryPageQuery companyEmailHistoryPageQuery){
-        MybatisPage<CompanyEmailConfigVO> result = companyEmailSendHistoryService.searchEmailConfig(companyEmailHistoryPageQuery);
-        return result;
+    public ResultVo<CompanyEmailConfigVO> searchEmailConfig(IdVO idVO){
+        CompanyEmailConfigVO configVO = companyEmailSendHistoryService.searchEmailConfig(idVO);
+        return ResultVo.ok(configVO);
     }
     }
 
 
     /**
     /**

+ 4 - 7
service-manage/src/main/java/com/simuwang/manage/api/distribution/DistributionController.java

@@ -8,10 +8,7 @@ import com.simuwang.base.pojo.vo.IdListVO;
 import com.simuwang.manage.service.DistributionService;
 import com.simuwang.manage.service.DistributionService;
 import com.smppw.common.pojo.ResultVo;
 import com.smppw.common.pojo.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
 /**
 /**
@@ -57,8 +54,8 @@ public class DistributionController {
      * @param idListVO
      * @param idListVO
      * @return
      * @return
      */
      */
-    @RequestMapping("delete-distribution")
-    public boolean deleteDistribution(IdListVO idListVO) {
+    @PostMapping("delete-distribution")
+    public boolean deleteDistribution(@RequestBody IdListVO idListVO) {
         distributionService.deleteDistribution(idListVO);
         distributionService.deleteDistribution(idListVO);
         return true;
         return true;
     }
     }
@@ -69,7 +66,7 @@ public class DistributionController {
      * @param file
      * @param file
      * @return
      * @return
      */
      */
-    @RequestMapping("upload-distribution")
+    @PostMapping("upload-distribution")
     public ResultVo uploadDistribution(@RequestParam(value = "file") MultipartFile file) {
     public ResultVo uploadDistribution(@RequestParam(value = "file") MultipartFile file) {
         ResultVo vo = distributionService.uploadDistribution(file);
         ResultVo vo = distributionService.uploadDistribution(file);
         return vo;
         return vo;

+ 14 - 1
service-manage/src/main/java/com/simuwang/manage/api/fund/FunAliasController.java

@@ -3,6 +3,7 @@ package com.simuwang.manage.api.fund;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.vo.FundAliasVO;
 import com.simuwang.base.pojo.vo.FundAliasVO;
+import com.simuwang.base.pojo.vo.IdListVO;
 import com.simuwang.base.pojo.vo.IdVO;
 import com.simuwang.base.pojo.vo.IdVO;
 import com.simuwang.manage.service.FundAliasService;
 import com.simuwang.manage.service.FundAliasService;
 import com.smppw.common.pojo.ResultVo;
 import com.smppw.common.pojo.ResultVo;
@@ -45,7 +46,7 @@ public class FunAliasController {
     }
     }
 
 
     /**
     /**
-     * 根据ID查询基金别名
+     * 保存基金别名
      * @param fundAliasVO
      * @param fundAliasVO
      * @return
      * @return
      */
      */
@@ -55,4 +56,16 @@ public class FunAliasController {
         return ResultVo.ok(true);
         return ResultVo.ok(true);
     }
     }
 
 
+    /**
+     * 删除基金别名
+     * @param idListVO
+     * @return
+     */
+    @PostMapping("/delete-fund-alias")
+    public ResultVo deleteFundAlias(@RequestBody IdListVO idListVO){
+        fundAliasService.deleteFundAlias(idListVO);
+        return ResultVo.ok(true);
+    }
+
+
 }
 }

+ 3 - 2
service-manage/src/main/java/com/simuwang/manage/api/fund/FundInformationController.java

@@ -5,6 +5,7 @@ import com.simuwang.base.pojo.dto.query.FundFilePageQuery;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
 import com.simuwang.base.pojo.vo.FundFileInfoVO;
 import com.simuwang.base.pojo.vo.FundFileInfoVO;
+import com.simuwang.base.pojo.vo.FundInfoSearchVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
 import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
 import com.simuwang.manage.service.EmailFundInfoService;
 import com.simuwang.manage.service.EmailFundInfoService;
@@ -43,8 +44,8 @@ public class FundInformationController{
      * @return
      * @return
      */
      */
     @RequestMapping("search-info")
     @RequestMapping("search-info")
-    public MybatisPage<Map<String,String>> searchFundInfo(FundInputPageQuery fundInputPageQuery){
-        MybatisPage<Map<String,String>> result = fundInformationService.searchFundInfo(fundInputPageQuery);
+    public MybatisPage<FundInfoSearchVO> searchFundInfo(FundInputPageQuery fundInputPageQuery){
+        MybatisPage<FundInfoSearchVO> result = fundInformationService.searchFundInfo(fundInputPageQuery);
         return result;
         return result;
     }
     }
 
 

+ 3 - 0
service-manage/src/main/java/com/simuwang/manage/init/QuartzConfig.java

@@ -70,6 +70,9 @@ public class QuartzConfig implements ApplicationRunner {
                 paramDTO.setProtocol(mailboxInfoDO.getProtocol());
                 paramDTO.setProtocol(mailboxInfoDO.getProtocol());
                 quartzBean.setJobParam(JSON.toJSONString(paramDTO));
                 quartzBean.setJobParam(JSON.toJSONString(paramDTO));
                 QuartzUtils.createScheduleJob(scheduler,quartzBean);
                 QuartzUtils.createScheduleJob(scheduler,quartzBean);
+                if(mailboxInfoDO.getOpenStatus() == null){
+                    continue;
+                }
                 if(mailboxInfoDO.getOpenStatus().equals(OpenStatusType.YES.getCode())){
                 if(mailboxInfoDO.getOpenStatus().equals(OpenStatusType.YES.getCode())){
                     QuartzUtils.resumeScheduleJob(scheduler,quartzBean.getJobName(),quartzBean.getGroupName());
                     QuartzUtils.resumeScheduleJob(scheduler,quartzBean.getJobName(),quartzBean.getGroupName());
                 }else{
                 }else{

+ 2 - 1
service-manage/src/main/java/com/simuwang/manage/service/CompanyEmailSendHistoryService.java

@@ -5,6 +5,7 @@ import com.simuwang.base.pojo.dto.query.CompanyEmailHistoryPageQuery;
 import com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery;
 import com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
+import com.simuwang.base.pojo.vo.IdVO;
 
 
 import java.util.List;
 import java.util.List;
 
 
@@ -22,5 +23,5 @@ public interface CompanyEmailSendHistoryService {
 
 
     void deleteEmailHistory(List<Integer> idList);
     void deleteEmailHistory(List<Integer> idList);
 
 
-    MybatisPage<CompanyEmailConfigVO> searchEmailConfig(CompanyEmailHistoryPageQuery companyEmailHistoryPageQuery);
+    CompanyEmailConfigVO searchEmailConfig(IdVO idVO);
 }
 }

+ 3 - 0
service-manage/src/main/java/com/simuwang/manage/service/FundAliasService.java

@@ -3,6 +3,7 @@ package com.simuwang.manage.service;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.vo.FundAliasVO;
 import com.simuwang.base.pojo.vo.FundAliasVO;
+import com.simuwang.base.pojo.vo.IdListVO;
 
 
 /**
 /**
  * FileName: FunAliasService
  * FileName: FunAliasService
@@ -16,4 +17,6 @@ public interface FundAliasService {
     FundAliasVO searchFundAliasById(Integer id);
     FundAliasVO searchFundAliasById(Integer id);
 
 
     void saveFundAlias(FundAliasVO fundAliasVO);
     void saveFundAlias(FundAliasVO fundAliasVO);
+
+    void deleteFundAlias(IdListVO idListVO);
 }
 }

+ 2 - 1
service-manage/src/main/java/com/simuwang/manage/service/FundInformationService.java

@@ -3,6 +3,7 @@ package com.simuwang.manage.service;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
+import com.simuwang.base.pojo.vo.FundInfoSearchVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 
 
 import java.util.List;
 import java.util.List;
@@ -15,7 +16,7 @@ import java.util.Map;
  * Description: ${DESCRIPTION}
  * Description: ${DESCRIPTION}
  */
  */
 public interface FundInformationService {
 public interface FundInformationService {
-    MybatisPage<Map<String,String>> searchFundInfo(FundInputPageQuery fundInputPageQuery);
+    MybatisPage<FundInfoSearchVO> searchFundInfo(FundInputPageQuery fundInputPageQuery);
 
 
     MybatisPage<FundInformationVO> searchFundInfoList(FundInfoPageQuery fundInfoPageQuery);
     MybatisPage<FundInformationVO> searchFundInfoList(FundInfoPageQuery fundInfoPageQuery);
 }
 }

+ 7 - 8
service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailSendHistoryServiceImpl.java

@@ -3,12 +3,14 @@ package com.simuwang.manage.service.impl;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.mapper.CompanyEmailConfigMapper;
 import com.simuwang.base.mapper.CompanyEmailConfigMapper;
 import com.simuwang.base.mapper.CompanyEmailSendHistoryMapper;
 import com.simuwang.base.mapper.CompanyEmailSendHistoryMapper;
+import com.simuwang.base.pojo.dos.CompanyEmailConfigDO;
 import com.simuwang.base.pojo.dos.CompanyEmailSendHistoryDO;
 import com.simuwang.base.pojo.dos.CompanyEmailSendHistoryDO;
 import com.simuwang.base.pojo.dos.sys.SysRoleUserDO;
 import com.simuwang.base.pojo.dos.sys.SysRoleUserDO;
 import com.simuwang.base.pojo.dto.query.CompanyEmailHistoryPageQuery;
 import com.simuwang.base.pojo.dto.query.CompanyEmailHistoryPageQuery;
 import com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery;
 import com.simuwang.base.pojo.dto.query.CompanyEmailPageQuery;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
 import com.simuwang.base.pojo.vo.CompanyEmailSendHistoryVO;
+import com.simuwang.base.pojo.vo.IdVO;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
 import com.simuwang.manage.service.CompanyEmailSendHistoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -34,9 +36,6 @@ public class CompanyEmailSendHistoryServiceImpl implements CompanyEmailSendHisto
     public MybatisPage<CompanyEmailSendHistoryVO> searchCompanyEmail(CompanyEmailPageQuery companyEmailPageQuery) {
     public MybatisPage<CompanyEmailSendHistoryVO> searchCompanyEmail(CompanyEmailPageQuery companyEmailPageQuery) {
         List<CompanyEmailSendHistoryDO> dataList = companyEmailSendHistoryMapper.searchCompanyEmailList(companyEmailPageQuery);
         List<CompanyEmailSendHistoryDO> dataList = companyEmailSendHistoryMapper.searchCompanyEmailList(companyEmailPageQuery);
         List<CompanyEmailSendHistoryVO> voList = dataList.stream().map(CompanyEmailSendHistoryDO::toVo).collect(Collectors.toList());
         List<CompanyEmailSendHistoryVO> voList = dataList.stream().map(CompanyEmailSendHistoryDO::toVo).collect(Collectors.toList());
-        for(CompanyEmailSendHistoryVO vo : voList){
-            vo.setEmail(vo.getEmail().replaceAll(",",";"));
-        }
         long total = companyEmailSendHistoryMapper.countCompanyEmailList(companyEmailPageQuery);
         long total = companyEmailSendHistoryMapper.countCompanyEmailList(companyEmailPageQuery);
         return MybatisPage.of(total, voList);
         return MybatisPage.of(total, voList);
     }
     }
@@ -50,7 +49,7 @@ public class CompanyEmailSendHistoryServiceImpl implements CompanyEmailSendHisto
     }
     }
 
 
     @Override
     @Override
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void deleteEmail(List<String> companyIdList) {
     public void deleteEmail(List<String> companyIdList) {
         for(String companyId : companyIdList){
         for(String companyId : companyIdList){
             List<String> emailList = companyEmailConfigMapper.searchEmailByCompanyId(companyId);
             List<String> emailList = companyEmailConfigMapper.searchEmailByCompanyId(companyId);
@@ -69,9 +68,9 @@ public class CompanyEmailSendHistoryServiceImpl implements CompanyEmailSendHisto
     }
     }
 
 
     @Override
     @Override
-    public MybatisPage<CompanyEmailConfigVO> searchEmailConfig(CompanyEmailHistoryPageQuery companyEmailHistoryPageQuery) {
-        List<CompanyEmailConfigVO> emailList = companyEmailConfigMapper.searchEmailConfig(companyEmailHistoryPageQuery);
-        long total = companyEmailConfigMapper.countEmailConfig(companyEmailHistoryPageQuery);
-        return MybatisPage.of(total,emailList);
+    public CompanyEmailConfigVO searchEmailConfig(IdVO idVO) {
+        CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(idVO.getId());
+        CompanyEmailConfigVO configVO = configDO.toVO();
+        return configVO;
     }
     }
 }
 }

+ 3 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/DistributionServiceImpl.java

@@ -91,6 +91,9 @@ public class DistributionServiceImpl implements DistributionService {
             distributionDO.setCreateTime(DateUtils.getNowDate());
             distributionDO.setCreateTime(DateUtils.getNowDate());
             distributionMapper.saveDistribution(distributionDO);
             distributionMapper.saveDistribution(distributionDO);
         }
         }
+        if(distributionVO.getNav() == null){
+            return vo;
+        }
         //保存净值
         //保存净值
         NavDO navDO = new NavDO();
         NavDO navDO = new NavDO();
         navDO.setFundId(distributionVO.getFundId());
         navDO.setFundId(distributionVO.getFundId());

+ 15 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/FundAliasServiceImpl.java

@@ -1,6 +1,7 @@
 package com.simuwang.manage.service.impl;
 package com.simuwang.manage.service.impl;
 
 
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.common.support.MybatisPage;
+import com.simuwang.base.common.util.StringUtil;
 import com.simuwang.base.mapper.CompanyInformationMapper;
 import com.simuwang.base.mapper.CompanyInformationMapper;
 import com.simuwang.base.mapper.EmailFundAssetMapper;
 import com.simuwang.base.mapper.EmailFundAssetMapper;
 import com.simuwang.base.mapper.EmailFundNavMapper;
 import com.simuwang.base.mapper.EmailFundNavMapper;
@@ -8,6 +9,7 @@ import com.simuwang.base.mapper.FundAliasMapper;
 import com.simuwang.base.pojo.dos.FundAliasDO;
 import com.simuwang.base.pojo.dos.FundAliasDO;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.dto.query.FundAliasPageQuery;
 import com.simuwang.base.pojo.vo.FundAliasVO;
 import com.simuwang.base.pojo.vo.FundAliasVO;
+import com.simuwang.base.pojo.vo.IdListVO;
 import com.simuwang.manage.service.EmailFundAssetService;
 import com.simuwang.manage.service.EmailFundAssetService;
 import com.simuwang.manage.service.EmailFundNavService;
 import com.simuwang.manage.service.EmailFundNavService;
 import com.simuwang.manage.service.EmailFundInfoService;
 import com.simuwang.manage.service.EmailFundInfoService;
@@ -63,6 +65,8 @@ public class FundAliasServiceImpl implements FundAliasService {
             if(vo.getTargetFundId() !=null){
             if(vo.getTargetFundId() !=null){
                 vo.setCompanyName(companyInformationMapper.getCompanyNameByFundId(vo.getTargetFundId()));
                 vo.setCompanyName(companyInformationMapper.getCompanyNameByFundId(vo.getTargetFundId()));
             }
             }
+            //最新净值日期
+            vo.setPriceDate(emailFundNavMapper.getMaxPriceDate(vo.getSourceFundName()));
         }
         }
         long total = fundAliasMapper.countFundAlias(fundAliasPageQuery);
         long total = fundAliasMapper.countFundAlias(fundAliasPageQuery);
         return MybatisPage.of(total,fundAliasVOList);
         return MybatisPage.of(total,fundAliasVOList);
@@ -71,6 +75,9 @@ public class FundAliasServiceImpl implements FundAliasService {
     @Override
     @Override
     public FundAliasVO searchFundAliasById(Integer id) {
     public FundAliasVO searchFundAliasById(Integer id) {
         FundAliasDO fundAliasDO = fundAliasMapper.searchFundAliasById(id);
         FundAliasDO fundAliasDO = fundAliasMapper.searchFundAliasById(id);
+        if(StringUtil.isNull(fundAliasDO)){
+            return null;
+        }
         return fundAliasDO.toVo();
         return fundAliasDO.toVo();
     }
     }
 
 
@@ -93,4 +100,12 @@ public class FundAliasServiceImpl implements FundAliasService {
         //处理采集数据,将采集的数据入库
         //处理采集数据,将采集的数据入库
         emailFundInfoService.reparseValuationFile(fundAliasVO.getSourceFundName());
         emailFundInfoService.reparseValuationFile(fundAliasVO.getSourceFundName());
     }
     }
+
+    @Override
+    public void deleteFundAlias(IdListVO idListVO) {
+        List<Integer> idList = idListVO.getIdList();
+        if(idList.size() > 0){
+            fundAliasMapper.batchDelete(idList);
+        }
+    }
 }
 }

+ 12 - 2
service-manage/src/main/java/com/simuwang/manage/service/impl/FundInformationServiceImpl.java

@@ -4,11 +4,13 @@ import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.mapper.FundInfoMapper;
 import com.simuwang.base.mapper.FundInfoMapper;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
 import com.simuwang.base.pojo.dto.query.FundInputPageQuery;
+import com.simuwang.base.pojo.vo.FundInfoSearchVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import com.simuwang.manage.service.FundInformationService;
 import com.simuwang.manage.service.FundInformationService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -23,10 +25,18 @@ public class FundInformationServiceImpl implements FundInformationService {
     @Autowired
     @Autowired
     private FundInfoMapper fundInfoMapper;
     private FundInfoMapper fundInfoMapper;
     @Override
     @Override
-    public MybatisPage<Map<String,String>> searchFundInfo(FundInputPageQuery fundInputPageQuery) {
+    public MybatisPage<FundInfoSearchVO> searchFundInfo(FundInputPageQuery fundInputPageQuery) {
         List<Map<String,String>> fundInfoList = fundInfoMapper.searchFundInfoByKeyword(fundInputPageQuery);
         List<Map<String,String>> fundInfoList = fundInfoMapper.searchFundInfoByKeyword(fundInputPageQuery);
+        List<FundInfoSearchVO> fundInfoSearchVOList = new ArrayList<>();
+        for(Map<String,String> map : fundInfoList){
+            FundInfoSearchVO vo = new FundInfoSearchVO();
+            vo.setFundId(map.get("fundId"));
+            vo.setFundName(map.get("fundShortName"));
+            vo.setRegisterNumber(map.get("registerNumber"));
+            fundInfoSearchVOList.add(vo);
+        }
         long total = fundInfoMapper.countFundInfoByKeyword(fundInputPageQuery);
         long total = fundInfoMapper.countFundInfoByKeyword(fundInputPageQuery);
-        return MybatisPage.of(total,fundInfoList);
+        return MybatisPage.of(total,fundInfoSearchVOList);
     }
     }
 
 
     @Override
     @Override

+ 3 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailDetailServiceImpl.java

@@ -33,6 +33,9 @@ public class ParseEmailDetailServiceImpl implements ParseEmailDetailService {
 
 
     @Autowired
     @Autowired
     private EmailFundAssetMapper emailFundAssetMapper;
     private EmailFundAssetMapper emailFundAssetMapper;
+
+    @Autowired
+    private EmailParseInfoMapper emailParseInfoMapper;
     @Override
     @Override
     public MybatisPage<EmailFundNavVO> searchNavDetail(ParseDetailPageQuery parseDetailPageQuery) {
     public MybatisPage<EmailFundNavVO> searchNavDetail(ParseDetailPageQuery parseDetailPageQuery) {
         List<EmailFundNavDO> dataList = emailFundNavMapper.searchNavDetail(parseDetailPageQuery);
         List<EmailFundNavDO> dataList = emailFundNavMapper.searchNavDetail(parseDetailPageQuery);

+ 4 - 2
service-manage/src/main/java/com/simuwang/manage/service/impl/ParseEmailServiceImpl.java

@@ -8,6 +8,7 @@ import com.simuwang.base.mapper.EmailFileInfoMapper;
 import com.simuwang.base.mapper.EmailParseInfoMapper;
 import com.simuwang.base.mapper.EmailParseInfoMapper;
 import com.simuwang.base.mapper.EmailTypeRuleMapper;
 import com.simuwang.base.mapper.EmailTypeRuleMapper;
 import com.simuwang.base.pojo.dos.EmailFileInfoDO;
 import com.simuwang.base.pojo.dos.EmailFileInfoDO;
+import com.simuwang.base.pojo.dos.EmailParseDetailDO;
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
 import com.simuwang.base.pojo.dos.EmailParseInfoDO;
 import com.simuwang.base.pojo.dos.EmailTypeRuleDO;
 import com.simuwang.base.pojo.dos.EmailTypeRuleDO;
 import com.simuwang.base.pojo.dto.query.EmailFileQuery;
 import com.simuwang.base.pojo.dto.query.EmailFileQuery;
@@ -91,7 +92,7 @@ public class ParseEmailServiceImpl implements ParseEmailService {
         List<EmailParseInfoVO> emailParseInfoVOList = emailParseInfoDOList.stream()
         List<EmailParseInfoVO> emailParseInfoVOList = emailParseInfoDOList.stream()
                 .map(EmailParseInfoDO::toVO).collect(Collectors.toList());
                 .map(EmailParseInfoDO::toVO).collect(Collectors.toList());
         for(EmailParseInfoVO vo : emailParseInfoVOList){
         for(EmailParseInfoVO vo : emailParseInfoVOList){
-            List<EmailFileInfoDO> emailFileInfoList = emailFileInfoMapper.queryByEmailId(vo.getId());
+            List<EmailFileInfoDO> emailFileInfoList = emailFileInfoMapper.getEmailFileByEmailId(vo.getId());
             List<EmailFileInfoVO> emailFileInfoVOList = emailFileInfoList.stream().map(EmailFileInfoDO::toVO).collect(Collectors.toList());
             List<EmailFileInfoVO> emailFileInfoVOList = emailFileInfoList.stream().map(EmailFileInfoDO::toVO).collect(Collectors.toList());
             vo.setEmailFileInfoList(emailFileInfoVOList);
             vo.setEmailFileInfoList(emailFileInfoVOList);
         }
         }
@@ -133,7 +134,8 @@ public class ParseEmailServiceImpl implements ParseEmailService {
     @Override
     @Override
     public MybatisPage<EmailParseDetailVO> searchEmailDetailById(EmailFileQuery emailFileQuery) {
     public MybatisPage<EmailParseDetailVO> searchEmailDetailById(EmailFileQuery emailFileQuery) {
         //根据邮件ID获取附件信息
         //根据邮件ID获取附件信息
-        List<EmailParseDetailVO> result = emailFileInfoMapper.searchEmailDetailById(emailFileQuery);
+        List<EmailParseDetailDO> dataList = emailFileInfoMapper.searchEmailDetailById(emailFileQuery);
+        List<EmailParseDetailVO> result = dataList.stream().filter(e -> StringUtil.isNotNull(e)).map(EmailParseDetailDO::toVO).collect(Collectors.toList());
         long total = emailFileInfoMapper.countEmailDetailById(emailFileQuery);
         long total = emailFileInfoMapper.countEmailDetailById(emailFileQuery);
         return MybatisPage.of(total,result);
         return MybatisPage.of(total,result);
     }
     }

+ 237 - 0
service-manage/src/main/java/com/simuwang/manage/task/FundDeletionTask.java

@@ -0,0 +1,237 @@
+package com.simuwang.manage.task;
+
+import cn.hutool.core.date.DateUtil;
+import com.simuwang.base.common.enums.DeletionType;
+import com.simuwang.base.common.enums.Frequency;
+import com.simuwang.base.common.util.DateUtils;
+import com.simuwang.base.common.util.StringUtil;
+import com.simuwang.base.mapper.*;
+import com.simuwang.base.pojo.dos.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * FileName: FundDeletionTask
+ * Author:   chenjianhua
+ * Date:     2024/9/18 22:43
+ * Description: ${DESCRIPTION}
+ */
+@EnableScheduling
+@Component
+public class FundDeletionTask {
+
+    @Autowired
+    private NavMapper navMapper;
+
+    @Autowired
+    private AssetMapper assetMapper;
+
+    @Autowired
+    private FundInfoMapper fundInfoMapper;
+
+    @Autowired
+    private FundReportFrequencyMapper fundReportFrequencyMapper;
+
+    @Autowired
+    private TradeDateMapper tradeDateMapper;
+
+    @Autowired
+    private DeletionInfoMapper deletionInfoMapper;
+    @Scheduled(cron = "0 0 5,12,20 * * ?")
+    public void computeDeletion(){
+        List<String> fundIdList = navMapper.getAllFundId();
+        for(String fundId : fundIdList){
+            String inceptionDate = fundInfoMapper.getInceptionDateByFundId(fundId);
+            if(inceptionDate == null){
+                continue;
+            }
+            String today = DateUtils.getAroundToday(0);
+            //获取基金对应的净值报送频率
+            FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
+            if(StringUtil.isNull(fundReportFrequencyDO)){
+                continue;
+            }
+            List<NavDO> navDOList = navMapper.selectNavByFundId(fundId);
+            List<AssetDO> assetDOList = assetMapper.selectAssetByFundId(fundId);
+            //查询成立日到今天为止的交易日集合
+            List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
+            navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
+            assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
+        }
+    }
+
+    private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
+        if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
+            Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
+            for(String tradeDate : tradeListMap.keySet()){
+                if(navListMap.containsKey(tradeDate)){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
+            }
+        }
+        if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
+            Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<Integer,List<AssetDO>> weekNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : navListMap.keySet()){
+                Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    List<AssetDO> navDOS = weekNavListMap.get(weekOfYear);
+                    navDOS.addAll(navListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,navDOS);
+                }else{
+                    List<AssetDO> navDOS = new ArrayList<>();
+                    navDOS.addAll(navListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,navDOS);
+                }
+            }
+            Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
+            for(Integer weekOfYear : tradeListMap.keySet()){
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    continue;
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+            }
+        }
+        if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
+            Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<String,List<AssetDO>> monthNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : navListMap.keySet()){
+                String yearMonth = priceDate.substring(0,7);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    List<AssetDO> navDOS = monthNavListMap.get(yearMonth);
+                    navDOS.addAll(navListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,navDOS);
+                }else{
+                    List<AssetDO> navDOS = new ArrayList<>();
+                    navDOS.addAll(navListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,navDOS);
+                }
+            }
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
+            for(String yearMonth : tradeListMap.keySet()){
+                if(monthNavListMap.containsKey(yearMonth)){
+                    continue;
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
+            }
+        }
+    }
+
+    private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
+        //只处理日月季频率
+        if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
+            Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
+            for(String tradeDate : tradeListMap.keySet()){
+                if(navListMap.containsKey(tradeDate)){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+            }
+        }
+        if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
+            Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<Integer,List<NavDO>> weekNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : navListMap.keySet()){
+                Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    List<NavDO> navDOS = weekNavListMap.get(weekOfYear);
+                    navDOS.addAll(navListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,navDOS);
+                }else{
+                    List<NavDO> navDOS = new ArrayList<>();
+                    navDOS.addAll(navListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,navDOS);
+                }
+            }
+            Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
+            for(Integer weekOfYear : tradeListMap.keySet()){
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    continue;
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+            }
+        }
+        if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
+            Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<String,List<NavDO>> monthNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : navListMap.keySet()){
+                String yearMonth = priceDate.substring(0,7);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    List<NavDO> navDOS = monthNavListMap.get(yearMonth);
+                    navDOS.addAll(navListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,navDOS);
+                }else{
+                    List<NavDO> navDOS = new ArrayList<>();
+                    navDOS.addAll(navListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,navDOS);
+                }
+            }
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
+            for(String yearMonth : tradeListMap.keySet()){
+                if(monthNavListMap.containsKey(yearMonth)){
+                    continue;
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+            }
+        }
+    }
+
+    private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
+        if(tradeDate == null){
+            return;
+        }
+        DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+        deletionInfoDO.setFundId(fundId);
+        deletionInfoDO.setDeletionDate(tradeDate);
+        deletionInfoDO.setDeletionType(code);
+        DeletionInfoDO oldDeletionDO = deletionInfoMapper.getDeletionInfoDO(deletionInfoDO);
+        if(StringUtil.isNull(oldDeletionDO)){
+            deletionInfoDO.setIsvalid(1);
+            deletionInfoDO.setUpdateTime(DateUtils.getNowDate());
+            deletionInfoDO.setCreateTime(DateUtils.getNowDate());
+            deletionInfoMapper.saveDeletionInfoDO(deletionInfoDO);
+        }
+    }
+}