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 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 navDOList = navMapper.selectNavByFundId(fundId); List assetDOList = assetMapper.selectAssetByFundId(fundId); //查询成立日到今天为止的交易日集合 List tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today); navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO); assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO); distributionDeletion(fundId,navDOList); } } private void distributionDeletion(String fundId, List navDOList) { } private void assetDeletion(String fundId, List assetDOList, List tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) { if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){ Map> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD))); for(String tradeDate : tradeListMap.keySet()){ if(navListMap.containsKey(tradeDate)){ deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //写入缺失信息表 saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode()); } } if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){ Map> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); TreeMap> weekNavListMap = new TreeMap<>(); //按周数整合 for(String priceDate : navListMap.keySet()){ Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD)); if(weekNavListMap.containsKey(weekOfYear)){ List assetDOS = weekNavListMap.get(weekOfYear); assetDOS.addAll(navListMap.get(priceDate)); weekNavListMap.put(weekOfYear,assetDOS); }else{ List navDOS = new ArrayList<>(); navDOS.addAll(navListMap.get(priceDate)); weekNavListMap.put(weekOfYear,navDOS); } } Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear())); for(Integer weekOfYear : tradeListMap.keySet()){ if(weekNavListMap.containsKey(weekOfYear)){ List assetDOS = weekNavListMap.get(weekOfYear); String tradeDate = DateUtils.format(assetDOS.get(assetDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD); deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //不包含的话,默认取每周的最后一个交易日作为周净值日期 List 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> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); TreeMap> monthNavListMap = new TreeMap<>(); //按周数整合 for(String priceDate : navListMap.keySet()){ String yearMonth = priceDate.substring(0,7); if(monthNavListMap.containsKey(yearMonth)){ List navDOS = monthNavListMap.get(yearMonth); navDOS.addAll(navListMap.get(priceDate)); monthNavListMap.put(yearMonth,navDOS); }else{ List navDOS = new ArrayList<>(); navDOS.addAll(navListMap.get(priceDate)); monthNavListMap.put(yearMonth,navDOS); } } Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth())); for(String yearMonth : tradeListMap.keySet()){ if(monthNavListMap.containsKey(yearMonth)){ List assetDOS = monthNavListMap.get(yearMonth); String tradeDate = DateUtils.format(assetDOS.get(assetDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD); deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //不包含的话,默认取每周的最后一个交易日作为周净值日期 List 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 navDOList, List tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) { //只处理日月季频率 if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){ Map> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD))); for(String tradeDate : tradeListMap.keySet()){ if(navListMap.containsKey(tradeDate)){ deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //写入缺失信息表 saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode()); } } if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){ Map> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); TreeMap> weekNavListMap = new TreeMap<>(); //按周数整合 for(String priceDate : navListMap.keySet()){ Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD)); if(weekNavListMap.containsKey(weekOfYear)){ List navDOS = weekNavListMap.get(weekOfYear); navDOS.addAll(navListMap.get(priceDate)); weekNavListMap.put(weekOfYear,navDOS); }else{ List navDOS = new ArrayList<>(); navDOS.addAll(navListMap.get(priceDate)); weekNavListMap.put(weekOfYear,navDOS); } } Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear())); for(Integer weekOfYear : tradeListMap.keySet()){ if(weekNavListMap.containsKey(weekOfYear)){ List navDOS = weekNavListMap.get(weekOfYear); String tradeDate = DateUtils.format(navDOS.get(navDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD); deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //不包含的话,默认取每周的最后一个交易日作为周净值日期 List 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> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD))); TreeMap> monthNavListMap = new TreeMap<>(); //按周数整合 for(String priceDate : navListMap.keySet()){ String yearMonth = priceDate.substring(0,7); if(monthNavListMap.containsKey(yearMonth)){ List navDOS = monthNavListMap.get(yearMonth); navDOS.addAll(navListMap.get(priceDate)); monthNavListMap.put(yearMonth,navDOS); }else{ List navDOS = new ArrayList<>(); navDOS.addAll(navListMap.get(priceDate)); monthNavListMap.put(yearMonth,navDOS); } } Map> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth())); for(String yearMonth : tradeListMap.keySet()){ if(monthNavListMap.containsKey(yearMonth)){ List navDOS = monthNavListMap.get(yearMonth); String tradeDate = DateUtils.format(navDOS.get(navDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD); deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo()); continue; } //不包含的话,默认取每周的最后一个交易日作为周净值日期 List 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); } } }