|
@@ -39,6 +39,9 @@ public class DeletionServiceImpl implements DeletionService {
|
|
|
private FundInfoMapper fundInfoMapper;
|
|
|
|
|
|
@Autowired
|
|
|
+ private ValuationTableMapper valuationTableMapper;
|
|
|
+
|
|
|
+ @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<ValuationTableDO> valuationTableDOList = valuationTableMapper.selectValuationTableByFundId(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,valuationTableDOList,tradeDateDOList,fundReportFrequencyDO);
|
|
|
}else{
|
|
|
navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
|
|
|
assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
|
|
|
distributionDeletion(fundId,navDOList);
|
|
|
+ valuationDeletion(fundId,valuationTableDOList,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<ValuationTableDO> valuationTableDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
|
|
|
+ //将现有数据无效掉
|
|
|
+ deletionInfoMapper.deleteDeletion(fundId,DeletionType.VALUATION_DELETION.getCode());
|
|
|
+ //只处理日月季频率
|
|
|
+ if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
|
|
|
+ Map<String,List<ValuationTableDO>> valuationListMap = valuationTableDOList.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<ValuationTableDO>> valuationListMap = valuationTableDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
|
|
|
+ TreeMap<Integer,List<ValuationTableDO>> 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<ValuationTableDO> valuationDOS = weekNavListMap.get(weekOfYear);
|
|
|
+ valuationDOS.addAll(valuationListMap.get(priceDate));
|
|
|
+ weekNavListMap.put(weekOfYear,valuationDOS);
|
|
|
+ }else{
|
|
|
+ List<ValuationTableDO> 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<ValuationTableDO> 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++){
|
|
|
+ ValuationTableDO 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<ValuationTableDO>> valuationListMap = valuationTableDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
|
|
|
+ TreeMap<String,List<ValuationTableDO>> monthNavListMap = new TreeMap<>();
|
|
|
+ //按周数整合
|
|
|
+ for(String priceDate : valuationListMap.keySet()){
|
|
|
+ String yearMonth = priceDate.substring(0,7);
|
|
|
+ if(monthNavListMap.containsKey(yearMonth)){
|
|
|
+ List<ValuationTableDO> valuationTableDOS = monthNavListMap.get(yearMonth);
|
|
|
+ valuationTableDOS.addAll(valuationListMap.get(priceDate));
|
|
|
+ monthNavListMap.put(yearMonth,valuationTableDOS);
|
|
|
+ }else{
|
|
|
+ List<ValuationTableDO> valuationTableDOS = new ArrayList<>();
|
|
|
+ valuationTableDOS.addAll(valuationListMap.get(priceDate));
|
|
|
+ monthNavListMap.put(yearMonth,valuationTableDOS);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ 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<ValuationTableDO> valuationTableDOS = 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(valuationTableDOS)){
|
|
|
+ for(ValuationTableDO valuationTableDO : valuationTableDOS){
|
|
|
+ String tradeDate = DateUtils.format(valuationTableDO.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;
|