1
0
فهرست منبع

fix: 缺失任务含净值和规模缺失计算

chenjianhua 7 ماه پیش
والد
کامیت
7fb27197a8

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

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

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

@@ -57,5 +57,10 @@
                isvalid, creatorid, createtime, updaterid, updatetime
         from PPW_EMAIL.asset where isvalid=1 and fund_id=#{fundId} and price_date=#{priceDate}
     </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>

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

@@ -198,7 +198,7 @@
     <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 remark is null
+        from PPW_EMAIL.deletion_info where isvalid=1
         and fund_id=#{fundId} and deletion_date=#{deletionDate} and deletion_type=#{deletionType}
     </select>
 

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

@@ -157,7 +157,7 @@
         where info.fund_id=#{fundId} and info.isvalid=1 and c.isvalid=1
     </select>
     <select id="getInceptionDateByFundId" resultType="java.lang.String" parameterType="java.lang.String">
-        select inception_date from PPW_EMAIL.pvn_company_info where fund_id=#{fundId} and isvalid=1
+        select inception_date from PPW_EMAIL.pvn_fund_info where fund_id=#{fundId} and isvalid=1
     </select>
 
 </mapper>

+ 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());
             distributionMapper.saveDistribution(distributionDO);
         }
+        if(distributionVO.getNav() == null){
+            return vo;
+        }
         //保存净值
         NavDO navDO = new NavDO();
         navDO.setFundId(distributionVO.getFundId());

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

@@ -1,101 +1,237 @@
-//package com.simuwang.manage.task;
-//
-//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.DeletionInfoDO;
-//import com.simuwang.base.pojo.dos.FundReportFrequencyDO;
-//import com.simuwang.base.pojo.dos.NavDO;
-//import com.simuwang.base.pojo.dos.TradeDateDO;
-//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.List;
-//import java.util.Map;
-//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 FundInfoMapper fundInfoMapper;
-//
-//    @Autowired
-//    private FundReportFrequencyMapper fundReportFrequencyMapper;
-//
-//    @Autowired
-//    private TradeDateMapper tradeDateMapper;
-//
-//    @Autowired
-//    private DeletionInfoMapper deletionInfoMapper;
-//    @Scheduled(cron = "0 0 0/2 * * ?")
-//    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<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
-//            //只处理日月季频率
-//            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)));
-//
-//                Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
-//                for(Integer weekOfYear : tradeListMap.keySet()){
-//                    if(navListMap.containsKey(tradeDate)){
-//                        continue;
-//                    }
-//                    //写入缺失信息表
-//                    saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
-//                }
-//            }
-//        }
-//    }
-//
-//    private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
-//        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);
-//        }
-//    }
-//}
+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/1 * * * ?")
+    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);
+        }
+    }
+}