Browse Source

Merge remote-tracking branch 'origin/develop' into future_excel_1012

wangzaijun 6 months ago
parent
commit
fbd57693bd

+ 2 - 1
service-base/src/main/java/com/simuwang/base/common/enums/DeletionType.java

@@ -11,7 +11,8 @@ import java.util.stream.Stream;
 public enum DeletionType {
     //单位分红/拆分比例
     NAV_DELETION(1, "净值缺失"), ASSET_DELETION(2, "规模缺失"),
-    DISTRIBUTION_DELETION(3, "分红缺失"), NO_DELETION(4, "已补充"),EXIST_SPLIT(4, "存在拆分");
+    DISTRIBUTION_DELETION(3, "分红缺失"), NO_DELETION(4, "已补充"),
+    EXIST_SPLIT(4, "存在拆分"), VALUATION_DELETION(5, "估值缺失");
 
     private final Integer code;
     private final String info;

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

@@ -49,7 +49,7 @@ public interface DeletionInfoMapper {
 
     void deleteDeletionRemark(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType, @Param("tradeDate")String tradeDate);
 
-    void deleteDistributeDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
+    void deleteDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
 
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
 }

+ 1 - 0
service-base/src/main/java/com/simuwang/base/mapper/FundPositionDetailMapper.java

@@ -13,4 +13,5 @@ public interface FundPositionDetailMapper {
 
     int insertMulti(@Param("details") List<FundPositionDetailDO> segment);
 
+    List<FundPositionDetailDO> fundPositionDetailByFundId(@Param("fundId")String fundId);
 }

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

@@ -4,6 +4,8 @@ import com.simuwang.base.pojo.dos.ValuationTableDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 @Mapper
 public interface ValuationTableMapper {
 
@@ -14,4 +16,6 @@ public interface ValuationTableMapper {
     void updateUpdateAnalyzed(@Param("fundId") String fundId,
                               @Param("valuationDate") String valuationDate, @Param("hasStock") Integer hasStock,
                               @Param("hasBond") Integer hasBond, @Param("hasFuture") Integer hasFuture);
+
+    List<ValuationTableDO> selectValuationTableByFundId(@Param("fundId")String fundId);
 }

+ 13 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/query/DataboardQuery.java

@@ -11,6 +11,11 @@ public class DataboardQuery {
      * 邮箱地址
      */
     private String email;
+
+    /**
+     * 发送邮箱地址
+     */
+    private String senderEmail;
     /**
      * 邮箱类型
      */
@@ -55,4 +60,12 @@ public class DataboardQuery {
     public void setEndDate(String endDate) {
         this.endDate = endDate;
     }
+
+    public String getSenderEmail() {
+        return senderEmail;
+    }
+
+    public void setSenderEmail(String senderEmail) {
+        this.senderEmail = senderEmail;
+    }
 }

+ 5 - 3
service-base/src/main/java/com/simuwang/base/pojo/vo/EmailParseFailAnalysisVO.java

@@ -2,6 +2,8 @@ package com.simuwang.base.pojo.vo;
 
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * FileName: EmailParseFailAnalysisVO
  * Author:   chenjianhua
@@ -13,13 +15,13 @@ public class EmailParseFailAnalysisVO {
     /**
      * 净值类型邮件返回结构
      */
-    private NavFailAnalysisVO navFailAnalysisVO;
+    private List<NameValueVO> navFailAnalysisVO;
     /**
      * 估值表类型邮件返回结构
      */
-    private ValuationFailAnalysisVO valuationFailAnalysisVO;
+    private List<NameValueVO> valuationFailAnalysisVO;
     /**
      * 报告类型邮件返回结构
      */
-    private ReportFailAnalysisVO reportFailAnalysisVO;
+    private List<NameValueVO> reportFailAnalysisVO;
 }

+ 16 - 0
service-base/src/main/java/com/simuwang/base/pojo/vo/NameValueVO.java

@@ -0,0 +1,16 @@
+package com.simuwang.base.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * FileName: NameValueVO
+ * Author:   chenjianhua
+ * Date:     2024/10/14 17:20
+ * Description: ${DESCRIPTION}
+ */
+@Data
+public class NameValueVO {
+    private Long value;
+
+    private String name;
+}

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

@@ -57,7 +57,7 @@
             and deletion_date=#{tradeDate}
         </if>
     </delete>
-    <delete id="deleteDistributeDeletion">
+    <delete id="deleteDeletion">
         update PPW_EMAIL.deletion_info  set isvalid=0,updatetime=sysdate() where isvalid=1 and fund_id=#{fundId} and deletion_type=#{deletionType} and remark is null
     </delete>
     <select id="searchDeletionList" resultMap="BaseResultMap"

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

@@ -167,10 +167,14 @@
         <if test="email !=null and email !=''">
             and email like concat('%',#{email},'%')
         </if>
+        <if test="senderEmail !=null and senderEmail !=''">
+            and sender_email like concat('%',#{senderEmail},'%')
+        </if>
         <if test="emailType !=null">
             and email_type = #{emailType}
         </if>
         group by parse_status
+        order by parse_status
     </select>
     <select id="searchEmailTypeCount" resultType="java.util.Map"
             parameterType="com.simuwang.base.pojo.dto.query.DataboardQuery">
@@ -185,10 +189,11 @@
         <if test="email !=null and email !=''">
             and email like concat('%',#{email},'%')
         </if>
-        <if test="emailType !=null">
-            and email_type = #{emailType}
+        <if test="senderEmail !=null and senderEmail !=''">
+            and sender_email like concat('%',#{senderEmail},'%')
         </if>
         group by email_type
+        order by email_type
     </select>
     <select id="countpdfNoData" resultType="java.lang.Long">
         select count(1) from PPW_EMAIL.email_parse_info
@@ -202,6 +207,9 @@
         <if test="item.email !=null and item.email !=''">
             and email like concat('%',#{item.email},'%')
         </if>
+        <if test="item.senderEmail !=null and item.senderEmail !=''">
+            and sender_email like concat('%',#{item.senderEmail},'%')
+        </if>
         <if test="item.emailType !=null">
             and email_type = #{item.emailType}
         </if>

+ 4 - 0
service-base/src/main/resources/mapper/FundPositionDetailMapper.xml

@@ -35,6 +35,10 @@
         where fund_id = #{fundId}
           and valuation_date = #{valuationDate}
     </delete>
+    <select id="fundPositionDetailByFundId" resultMap="BaseResultMap"
+            parameterType="java.lang.String">
+        select distinct fund_id,valuation_date from PPW_EMAIL.fund_position_detail where fund_id=#{fundId} and isvalid=1
+    </select>
 
     <insert id="insertMulti" parameterType="com.simuwang.base.pojo.dos.FundPositionDetailDO">
         INSERT INTO PPW_EMAIL.fund_position_detail (

+ 4 - 0
service-base/src/main/resources/mapper/ValuationTableMapper.xml

@@ -34,6 +34,10 @@
         set isvalid = 0
         where file_id = #{fileId}
     </update>
+    <select id="selectValuationTableByFundId" resultMap="BaseResultMap"
+            parameterType="java.lang.String">
+        select distinct fund_id,valuation_date from PPW_EMAIL.valuation_table where fund_id=#{fundId} and isvalid=1 and valuation_date is not null
+    </select>
 
     <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.simuwang.base.pojo.dos.ValuationTableDO" useGeneratedKeys="true">
         <!--@mbg.generated-->

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

@@ -846,7 +846,14 @@ public class EmailParseService {
                 // 2.邮件只有正文
                 if (content instanceof String) {
                     EmailContentInfoDTO emailContentInfoDTO = new EmailContentInfoDTO();
-                    emailContentInfoDTO.setEmailContent(content.toString());
+                    try{
+                        //获取邮件编码
+                        String contentType = message.getContentType();
+                        contentType = contentType.substring(contentType.indexOf("charset=")+8,contentType.length());
+                        emailContentInfoDTO.setEmailContent(new String(content.toString().getBytes(contentType),"UTF-8"));
+                    }catch (Exception e){
+                        emailContentInfoDTO.setEmailContent(content.toString());
+                    }
                     emailContentInfoDTO.setEmailDate(emailDateStr);
                     emailContentInfoDTO.setEmailTitle(message.getSubject());
                     String fileName = message.getSubject() + DateUtil.format(emailDate, DateConst.YYYYMMDDHHMMSS24);
@@ -900,82 +907,133 @@ public class EmailParseService {
         }
         return null;
     }
-    public EmailParseCountBoardVO searchEmailCount(DataboardQuery databoardQuery) {
+    public List<NameValueVO> searchEmailCount(DataboardQuery databoardQuery) {
         List<Map<String, Object>> dataList = emailParseInfoMapper.searchEmailDataBoard(databoardQuery);
-        EmailParseCountBoardVO result = new EmailParseCountBoardVO();
-        Integer total = 0;
+        List<NameValueVO> result = new ArrayList<>();
+        Long total = 0L;
         for(Map<String, Object> data : dataList){
+            NameValueVO vo = new NameValueVO();
             if(1 == ((Integer)data.get("parse_status")).intValue()){
-                result.setSuccess(((Long)data.get("total")).intValue());
+                vo.setValue((Long) data.get("total"));
+                vo.setName("解析成功");
             }else{
-                result.setFail(((Long)data.get("total")).intValue());
+                vo.setValue((Long) data.get("total"));
+                vo.setName("解析失败");
             }
-            total+=((Long)data.get("total")).intValue();
+            total+=(Long)data.get("total");
+            result.add(vo);
         }
-        result.setTotal(total);
+        NameValueVO vo = new NameValueVO();
+        vo.setName("解析总数");
+        vo.setValue(total);
+        result.add(vo);
         return result;
     }
 
-    public EmailParseTypeBoardVO searchEmailTypeCount(DataboardQuery databoardQuery) {
+    public List<NameValueVO> searchEmailTypeCount(DataboardQuery databoardQuery) {
         //邮件类型,1-净值,2-估值表,3-定期报告
         List<Map<String, Object>> dataList = emailParseInfoMapper.searchEmailTypeCount(databoardQuery);
-        EmailParseTypeBoardVO result = new EmailParseTypeBoardVO();
+        List<NameValueVO> result = new ArrayList<>();
         Integer total = 0;
         for(Map<String, Object> data : dataList){
+            NameValueVO vo = new NameValueVO();
             Integer emailType = (Integer) data.get("email_type");
             Long totalType = (Long)data.get("total");
             if(1 == emailType){
-                result.setNav(totalType.intValue());
+                vo.setName("净值规模");
+                vo.setValue(totalType);
             }else if(2 == emailType){
-                result.setValuation(totalType.intValue());
+                vo.setName("估值表");
+                vo.setValue(totalType);
             }else{
-                result.setReport(totalType.intValue());
+                vo.setName("定期报告");
+                vo.setValue(totalType);
             }
-            total+=totalType.intValue();
+            result.add(vo);
         }
-        result.setTotal(total);
         return result;
     }
 
     public EmailParseFailAnalysisVO parseFailAnalysis(DataboardQuery databoardQuery) {
-        EmailParseFailAnalysisVO emailParseFailAnalysisVO = new EmailParseFailAnalysisVO();
-        if(databoardQuery.getEmailType() == null || databoardQuery.getEmailType().equals(1)){
-            NavFailAnalysisVO navFailAnalysisVO = new NavFailAnalysisVO();
-            Long pdfNoData = emailParseInfoMapper.countpdfNoData(databoardQuery,"无法从PDF文件中获取到数据");
-            navFailAnalysisVO.setPdfNoData(pdfNoData);
-            Long priceDateMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"缺少净值日期");
-            navFailAnalysisVO.setPriceDateMiss(priceDateMiss);
-            Long navMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"单位净值和累计净值和资产净值均缺失");
-            navFailAnalysisVO.setNavMiss(navMiss);
-            Long fundNameNumberMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"单位净值和累计净值和资产净值均缺失");
-            navFailAnalysisVO.setFundNameNumberMiss(fundNameNumberMiss);
-            emailParseFailAnalysisVO.setNavFailAnalysisVO(navFailAnalysisVO);
-        }else if(databoardQuery.getEmailType().equals(2)){
-            ValuationFailAnalysisVO valuationFailAnalysisVO = new ValuationFailAnalysisVO();
-            Long fileTypeError = emailParseInfoMapper.countpdfNoData(databoardQuery,"文件格式错误");
-            valuationFailAnalysisVO.setFileTypeError(fileTypeError);
-            Long columnMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"无市值列或无数量列");
-            valuationFailAnalysisVO.setColumnMiss(columnMiss);
-            Long numbericMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"非数值数据");
-            valuationFailAnalysisVO.setNumbericMiss(numbericMiss);
-            Long noData = emailParseInfoMapper.countpdfNoData(databoardQuery,"无数据");
-            valuationFailAnalysisVO.setNoData(noData);
-            Long templateError = emailParseInfoMapper.countpdfNoData(databoardQuery,"模板不支持");
-            valuationFailAnalysisVO.setTemplateError(templateError);
-            emailParseFailAnalysisVO.setValuationFailAnalysisVO(valuationFailAnalysisVO);
-        }else if(databoardQuery.getEmailType().equals(3)){
-            ReportFailAnalysisVO reportFailAnalysisVO = new ReportFailAnalysisVO();
-            Long scannedFile = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告为扫描件");
-            reportFailAnalysisVO.setScannedFile(scannedFile);
-            Long errorAmacFileType = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告不是基协统一格式");
-            reportFailAnalysisVO.setErrorAmacFileType(errorAmacFileType);
-            Long watermarkFileError = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告水印干扰导致部分没有解析");
-            reportFailAnalysisVO.setWatermarkFileError(watermarkFileError);
-            Long noReport = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告不是定期报告");
-            reportFailAnalysisVO.setNoReport(noReport);
-            emailParseFailAnalysisVO.setReportFailAnalysisVO(reportFailAnalysisVO);
-        }
-        return emailParseFailAnalysisVO;
+        EmailParseFailAnalysisVO result = new EmailParseFailAnalysisVO();
+        //净值规模
+        List<NameValueVO> navNameValueVOS = new ArrayList<>();
+        NameValueVO pdfNoDataVO = new NameValueVO();
+        databoardQuery.setEmailType(1);
+        Long pdfNoData = emailParseInfoMapper.countpdfNoData(databoardQuery,"无法从PDF文件中获取到数据");
+        pdfNoDataVO.setName("无法从PDF文件中获取到数据");
+        pdfNoDataVO.setValue(pdfNoData);
+        navNameValueVOS.add(pdfNoDataVO);
+        NameValueVO priceDateMissVO = new NameValueVO();
+        Long priceDateMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"缺少净值日期");
+        priceDateMissVO.setValue(priceDateMiss);
+        priceDateMissVO.setName("缺少净值日期");
+        navNameValueVOS.add(priceDateMissVO);
+        NameValueVO navMissVO = new NameValueVO();
+        Long navMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"单位净值和累计净值和资产净值均缺失");
+        navMissVO.setName("单位净值和累计净值和资产净值均缺失");
+        navMissVO.setValue(navMiss);
+        navNameValueVOS.add(navMissVO);
+        NameValueVO fundNameNumberMissVO = new NameValueVO();
+        Long fundNameNumberMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"基金名称和备案编码均缺失");
+        fundNameNumberMissVO.setName("基金名称和备案编码均缺失");
+        fundNameNumberMissVO.setValue(fundNameNumberMiss);
+        navNameValueVOS.add(fundNameNumberMissVO);
+        result.setNavFailAnalysisVO(navNameValueVOS);
+        //估值表规模
+        databoardQuery.setEmailType(2);
+        List<NameValueVO> valuationNameValueVOS = new ArrayList<>();
+        NameValueVO fileTypeErrorVO = new NameValueVO();
+        Long fileTypeError = emailParseInfoMapper.countpdfNoData(databoardQuery,"文件格式错误");
+        fileTypeErrorVO.setName("文件格式错误");
+        fileTypeErrorVO.setValue(fileTypeError);
+        valuationNameValueVOS.add(fileTypeErrorVO);
+        NameValueVO columnMissVO = new NameValueVO();
+        Long columnMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"无市值列或无数量列");
+        columnMissVO.setName("无市值列或无数量列");
+        columnMissVO.setValue(columnMiss);
+        valuationNameValueVOS.add(columnMissVO);
+        NameValueVO numbericMissVO = new NameValueVO();
+        Long numbericMiss = emailParseInfoMapper.countpdfNoData(databoardQuery,"非数值数据");
+        numbericMissVO.setName("非数值数据");
+        numbericMissVO.setValue(numbericMiss);
+        valuationNameValueVOS.add(numbericMissVO);
+        NameValueVO noDataVO = new NameValueVO();
+        Long noData = emailParseInfoMapper.countpdfNoData(databoardQuery,"无数据");
+        noDataVO.setValue(noData);
+        noDataVO.setName("无数据");
+        valuationNameValueVOS.add(noDataVO);
+        NameValueVO templateErrorVO = new NameValueVO();
+        Long templateError = emailParseInfoMapper.countpdfNoData(databoardQuery,"模板不支持");
+        templateErrorVO.setValue(templateError);
+        templateErrorVO.setName("模板不支持");
+        valuationNameValueVOS.add(templateErrorVO);
+        result.setValuationFailAnalysisVO(valuationNameValueVOS);
+        //定期报告
+        databoardQuery.setEmailType(3);
+        List<NameValueVO> reportNameValueVOS = new ArrayList<>();
+        NameValueVO scannedFileVO = new NameValueVO();
+        Long scannedFile = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告为扫描件");
+        scannedFileVO.setName("报告为扫描件");
+        scannedFileVO.setValue(scannedFile);
+        reportNameValueVOS.add(scannedFileVO);
+        NameValueVO errorAmacFileTypeVO = new NameValueVO();
+        Long errorAmacFileType = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告不是基协统一格式");
+        errorAmacFileTypeVO.setName("报告不是基协统一格式");
+        errorAmacFileTypeVO.setValue(errorAmacFileType);
+        reportNameValueVOS.add(errorAmacFileTypeVO);
+        NameValueVO watermarkFileErrorVO = new NameValueVO();
+        Long watermarkFileError = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告水印干扰导致部分没有解析");
+        watermarkFileErrorVO.setName("报告水印干扰导致部分没有解析");
+        watermarkFileErrorVO.setValue(watermarkFileError);
+        reportNameValueVOS.add(watermarkFileErrorVO);
+        NameValueVO noReportVO = new NameValueVO();
+        Long noReport = emailParseInfoMapper.countpdfNoData(databoardQuery,"报告不是定期报告");
+        noReportVO.setName("报告不是定期报告");
+        noReportVO.setValue(noReport);
+        reportNameValueVOS.add(noReportVO);
+        result.setReportFailAnalysisVO(reportNameValueVOS);
+        return result;
     }
 
     public EmailParseDataViewVO dataOverview(DataboardQuery databoardQuery) {

+ 6 - 8
service-manage/src/main/java/com/simuwang/manage/api/databoard/DataboardController.java

@@ -1,10 +1,7 @@
 package com.simuwang.manage.api.databoard;
 
 import com.simuwang.base.pojo.dto.query.DataboardQuery;
-import com.simuwang.base.pojo.vo.EmailParseCountBoardVO;
-import com.simuwang.base.pojo.vo.EmailParseDataViewVO;
-import com.simuwang.base.pojo.vo.EmailParseFailAnalysisVO;
-import com.simuwang.base.pojo.vo.EmailParseTypeBoardVO;
+import com.simuwang.base.pojo.vo.*;
 import com.simuwang.daq.service.EmailParseService;
 import com.simuwang.logging.SystemLog;
 import com.smppw.common.pojo.ResultVo;
@@ -12,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -35,8 +33,8 @@ public class DataboardController {
      */
     @SystemLog("邮件总数")
     @RequestMapping("/email-count")
-    public ResultVo<EmailParseCountBoardVO> emailCount(DataboardQuery databoardQuery){
-        EmailParseCountBoardVO data = emailParseService.searchEmailCount(databoardQuery);
+    public ResultVo<List<NameValueVO>> emailCount(DataboardQuery databoardQuery){
+        List<NameValueVO> data = emailParseService.searchEmailCount(databoardQuery);
         return new ResultVo<>(data);
     }
 
@@ -46,8 +44,8 @@ public class DataboardController {
      * @return
      */
     @RequestMapping("/email-type-count")
-    public ResultVo<EmailParseTypeBoardVO> emailTypeCount(DataboardQuery databoardQuery){
-        EmailParseTypeBoardVO data = emailParseService.searchEmailTypeCount(databoardQuery);
+    public ResultVo<List<NameValueVO>> emailTypeCount(DataboardQuery databoardQuery){
+        List<NameValueVO> data = emailParseService.searchEmailTypeCount(databoardQuery);
         return new ResultVo<>(data);
     }
 

+ 144 - 3
service-manage/src/main/java/com/simuwang/manage/service/impl/DeletionServiceImpl.java

@@ -39,6 +39,9 @@ public class DeletionServiceImpl implements DeletionService {
     private FundInfoMapper fundInfoMapper;
 
     @Autowired
+    private FundPositionDetailMapper fundPositionDetailMapper;
+
+    @Autowired
     private AssetMapper assetMapper;
 
     @Autowired
@@ -139,6 +142,7 @@ public class DeletionServiceImpl implements DeletionService {
         }
         List<NavDO> navDOList = navMapper.selectNavByFundId(fundId);
         List<AssetDO> assetDOList = assetMapper.selectAssetByFundId(fundId);
+        List<FundPositionDetailDO> fundPositionDetailDOList = fundPositionDetailMapper.fundPositionDetailByFundId(fundId);
         //查询成立日到今天为止的交易日集合
         List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
         if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.NAV_DELETION.getCode())){
@@ -147,10 +151,13 @@ public class DeletionServiceImpl implements DeletionService {
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
         }else if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.DISTRIBUTION_DELETION.getCode())){
             distributionDeletion(fundId,navDOList);
+        }else if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.VALUATION_DELETION.getCode())){
+             valuationDeletion(fundId,fundPositionDetailDOList,tradeDateDOList,fundReportFrequencyDO);
         }else{
             navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
             distributionDeletion(fundId,navDOList);
+            valuationDeletion(fundId,fundPositionDetailDOList,tradeDateDOList,fundReportFrequencyDO);
         }
 
     }
@@ -160,7 +167,7 @@ public class DeletionServiceImpl implements DeletionService {
             return;
         }
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
         //查询是否存在拆分
         List<DistributionDO> distributionDOS = distributionMapper.getDistributionByFundId(fundId, DistributeType.DIVIDENDS_SPLIT);
         if(distributionDOS.size() > 0){
@@ -202,7 +209,7 @@ public class DeletionServiceImpl implements DeletionService {
 
     private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
         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)));
@@ -336,7 +343,7 @@ public class DeletionServiceImpl implements DeletionService {
 
     private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.NAV_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.NAV_DELETION.getCode());
         //只处理日月季频率
         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)));
@@ -468,6 +475,140 @@ public class DeletionServiceImpl implements DeletionService {
         }
     }
 
+    private void valuationDeletion(String fundId,List<FundPositionDetailDO> fundPositionDetailDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
+        //将现有数据无效掉
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.VALUATION_DELETION.getCode());
+        //只处理日月季频率
+        if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),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(valuationListMap.containsKey(tradeDate)){
+                    deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    continue;
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+        if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<Integer,List<FundPositionDetailDO>> weekNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : valuationListMap.keySet()){
+                Integer weekOfYear = Integer.parseInt(priceDate.substring(0,4)+DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD)));;
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    List<FundPositionDetailDO> valuationDOS = weekNavListMap.get(weekOfYear);
+                    valuationDOS.addAll(valuationListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,valuationDOS);
+                }else{
+                    List<FundPositionDetailDO> valuationDOS = new ArrayList<>();
+                    valuationDOS.addAll(valuationListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,valuationDOS);
+                }
+            }
+            Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearWeek()));
+            for(Integer weekOfYear : tradeListMap.keySet()){
+                List<FundPositionDetailDO> valuationDOS = weekNavListMap.get(weekOfYear);
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    for(TradeDateDO tradeDateDO : tradeListMap.get(weekOfYear)){
+                        String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
+                        deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    }
+                    continue;
+                }else{
+                    //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
+                    if(StringUtil.isNotEmpty(valuationDOS)){
+                        for(int idx=0;idx < valuationDOS.size()-1 ; idx++){
+                            FundPositionDetailDO valautionDO = valuationDOS.get(idx);
+                            String tradeDate = DateUtils.format(valautionDO.getValuationDate(),DateUtils.YYYY_MM_DD);
+                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                        }
+                    }
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                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);
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+        if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<String,List<FundPositionDetailDO>> monthNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : valuationListMap.keySet()){
+                String yearMonth = priceDate.substring(0,7);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    List<FundPositionDetailDO> fundPositionDetailDOS = monthNavListMap.get(yearMonth);
+                    fundPositionDetailDOS.addAll(valuationListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,fundPositionDetailDOS);
+                }else{
+                    List<FundPositionDetailDO> fundPositionDetailDOS = new ArrayList<>();
+                    fundPositionDetailDOS.addAll(valuationListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,fundPositionDetailDOS);
+                }
+            }
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
+            for(String yearMonth : tradeListMap.keySet()){
+                //本月的数据不考虑
+                String thisMonth = DateUtils.format(new Date(),DateUtils.YYYY_MM);
+                if(yearMonth.equals(thisMonth)){
+                    continue;
+                }
+                List<FundPositionDetailDO> fundPositionDetailDOS = monthNavListMap.get(yearMonth);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    for(TradeDateDO tradeDateDO : tradeListMap.get(yearMonth)){
+                        String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
+                        deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    }
+                    continue;
+                }else{
+                    //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
+                    if(StringUtil.isNotEmpty(fundPositionDetailDOS)){
+                        for(FundPositionDetailDO fundPositionDetailDO : fundPositionDetailDOS){
+                            String tradeDate = DateUtils.format(fundPositionDetailDO.getValuationDate(),DateUtils.YYYY_MM_DD);
+                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                        }
+                    }
+
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                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);
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+    }
+
     private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
         if(tradeDate == null){
             return;

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

@@ -1,29 +1,18 @@
 package com.simuwang.manage.task;
 
-import cn.hutool.core.date.DateUtil;
-import com.simuwang.base.common.enums.DeletionType;
-import com.simuwang.base.common.enums.DistributeType;
-import com.simuwang.base.common.enums.Frequency;
 import com.simuwang.base.common.enums.TaskType;
 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 com.simuwang.base.pojo.dto.DeletionDownParam;
-import com.simuwang.base.pojo.dto.MailboxInfoDTO;
-import com.simuwang.daq.service.EmailParseApiServiceImpl;
 import com.simuwang.manage.service.DeletionService;
 import com.simuwang.shiro.utils.UserUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 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.math.BigDecimal;
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * FileName: FundDeletionTask