FundDeletionTask.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.simuwang.manage.task;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.simuwang.base.common.enums.DeletionType;
  4. import com.simuwang.base.common.enums.Frequency;
  5. import com.simuwang.base.common.util.DateUtils;
  6. import com.simuwang.base.common.util.StringUtil;
  7. import com.simuwang.base.mapper.*;
  8. import com.simuwang.base.pojo.dos.*;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.scheduling.annotation.EnableScheduling;
  11. import org.springframework.scheduling.annotation.Scheduled;
  12. import org.springframework.stereotype.Component;
  13. import java.util.*;
  14. import java.util.stream.Collectors;
  15. /**
  16. * FileName: FundDeletionTask
  17. * Author: chenjianhua
  18. * Date: 2024/9/18 22:43
  19. * Description: ${DESCRIPTION}
  20. */
  21. @EnableScheduling
  22. @Component
  23. public class FundDeletionTask {
  24. @Autowired
  25. private NavMapper navMapper;
  26. @Autowired
  27. private AssetMapper assetMapper;
  28. @Autowired
  29. private FundInfoMapper fundInfoMapper;
  30. @Autowired
  31. private FundReportFrequencyMapper fundReportFrequencyMapper;
  32. @Autowired
  33. private TradeDateMapper tradeDateMapper;
  34. @Autowired
  35. private DeletionInfoMapper deletionInfoMapper;
  36. @Scheduled(cron = "0 0/1 * * * ?")
  37. public void computeDeletion(){
  38. List<String> fundIdList = navMapper.getAllFundId();
  39. for(String fundId : fundIdList){
  40. String inceptionDate = fundInfoMapper.getInceptionDateByFundId(fundId);
  41. if(inceptionDate == null){
  42. continue;
  43. }
  44. String today = DateUtils.getAroundToday(0);
  45. //获取基金对应的净值报送频率
  46. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  47. if(StringUtil.isNull(fundReportFrequencyDO)){
  48. continue;
  49. }
  50. List<NavDO> navDOList = navMapper.selectNavByFundId(fundId);
  51. List<AssetDO> assetDOList = assetMapper.selectAssetByFundId(fundId);
  52. //查询成立日到今天为止的交易日集合
  53. List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
  54. navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
  55. assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
  56. }
  57. }
  58. private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
  59. if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  60. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  61. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
  62. for(String tradeDate : tradeListMap.keySet()){
  63. if(navListMap.containsKey(tradeDate)){
  64. continue;
  65. }
  66. //写入缺失信息表
  67. saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
  68. }
  69. }
  70. if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  71. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  72. TreeMap<Integer,List<AssetDO>> weekNavListMap = new TreeMap<>();
  73. //按周数整合
  74. for(String priceDate : navListMap.keySet()){
  75. Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
  76. if(weekNavListMap.containsKey(weekOfYear)){
  77. List<AssetDO> navDOS = weekNavListMap.get(weekOfYear);
  78. navDOS.addAll(navListMap.get(priceDate));
  79. weekNavListMap.put(weekOfYear,navDOS);
  80. }else{
  81. List<AssetDO> navDOS = new ArrayList<>();
  82. navDOS.addAll(navListMap.get(priceDate));
  83. weekNavListMap.put(weekOfYear,navDOS);
  84. }
  85. }
  86. Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
  87. for(Integer weekOfYear : tradeListMap.keySet()){
  88. if(weekNavListMap.containsKey(weekOfYear)){
  89. continue;
  90. }
  91. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  92. List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
  93. String tradeDate = null;
  94. if(tradeDateDOS.size() > 0){
  95. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  96. }
  97. //写入缺失信息表
  98. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  99. }
  100. }
  101. if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  102. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  103. TreeMap<String,List<AssetDO>> monthNavListMap = new TreeMap<>();
  104. //按周数整合
  105. for(String priceDate : navListMap.keySet()){
  106. String yearMonth = priceDate.substring(0,7);
  107. if(monthNavListMap.containsKey(yearMonth)){
  108. List<AssetDO> navDOS = monthNavListMap.get(yearMonth);
  109. navDOS.addAll(navListMap.get(priceDate));
  110. monthNavListMap.put(yearMonth,navDOS);
  111. }else{
  112. List<AssetDO> navDOS = new ArrayList<>();
  113. navDOS.addAll(navListMap.get(priceDate));
  114. monthNavListMap.put(yearMonth,navDOS);
  115. }
  116. }
  117. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
  118. for(String yearMonth : tradeListMap.keySet()){
  119. if(monthNavListMap.containsKey(yearMonth)){
  120. continue;
  121. }
  122. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  123. List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
  124. String tradeDate = null;
  125. if(tradeDateDOS.size() > 0){
  126. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  127. }
  128. //写入缺失信息表
  129. saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
  130. }
  131. }
  132. }
  133. private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
  134. //只处理日月季频率
  135. if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  136. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  137. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
  138. for(String tradeDate : tradeListMap.keySet()){
  139. if(navListMap.containsKey(tradeDate)){
  140. continue;
  141. }
  142. //写入缺失信息表
  143. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  144. }
  145. }
  146. if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  147. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  148. TreeMap<Integer,List<NavDO>> weekNavListMap = new TreeMap<>();
  149. //按周数整合
  150. for(String priceDate : navListMap.keySet()){
  151. Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
  152. if(weekNavListMap.containsKey(weekOfYear)){
  153. List<NavDO> navDOS = weekNavListMap.get(weekOfYear);
  154. navDOS.addAll(navListMap.get(priceDate));
  155. weekNavListMap.put(weekOfYear,navDOS);
  156. }else{
  157. List<NavDO> navDOS = new ArrayList<>();
  158. navDOS.addAll(navListMap.get(priceDate));
  159. weekNavListMap.put(weekOfYear,navDOS);
  160. }
  161. }
  162. Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
  163. for(Integer weekOfYear : tradeListMap.keySet()){
  164. if(weekNavListMap.containsKey(weekOfYear)){
  165. continue;
  166. }
  167. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  168. List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
  169. String tradeDate = null;
  170. if(tradeDateDOS.size() > 0){
  171. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  172. }
  173. //写入缺失信息表
  174. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  175. }
  176. }
  177. if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  178. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  179. TreeMap<String,List<NavDO>> monthNavListMap = new TreeMap<>();
  180. //按周数整合
  181. for(String priceDate : navListMap.keySet()){
  182. String yearMonth = priceDate.substring(0,7);
  183. if(monthNavListMap.containsKey(yearMonth)){
  184. List<NavDO> navDOS = monthNavListMap.get(yearMonth);
  185. navDOS.addAll(navListMap.get(priceDate));
  186. monthNavListMap.put(yearMonth,navDOS);
  187. }else{
  188. List<NavDO> navDOS = new ArrayList<>();
  189. navDOS.addAll(navListMap.get(priceDate));
  190. monthNavListMap.put(yearMonth,navDOS);
  191. }
  192. }
  193. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
  194. for(String yearMonth : tradeListMap.keySet()){
  195. if(monthNavListMap.containsKey(yearMonth)){
  196. continue;
  197. }
  198. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  199. List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
  200. String tradeDate = null;
  201. if(tradeDateDOS.size() > 0){
  202. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  203. }
  204. //写入缺失信息表
  205. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  206. }
  207. }
  208. }
  209. private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
  210. if(tradeDate == null){
  211. return;
  212. }
  213. DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
  214. deletionInfoDO.setFundId(fundId);
  215. deletionInfoDO.setDeletionDate(tradeDate);
  216. deletionInfoDO.setDeletionType(code);
  217. DeletionInfoDO oldDeletionDO = deletionInfoMapper.getDeletionInfoDO(deletionInfoDO);
  218. if(StringUtil.isNull(oldDeletionDO)){
  219. deletionInfoDO.setIsvalid(1);
  220. deletionInfoDO.setUpdateTime(DateUtils.getNowDate());
  221. deletionInfoDO.setCreateTime(DateUtils.getNowDate());
  222. deletionInfoMapper.saveDeletionInfoDO(deletionInfoDO);
  223. }
  224. }
  225. }