FundDeletionTask.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 5,12,20 * * ?")
  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. distributionDeletion(fundId,navDOList);
  57. }
  58. }
  59. private void distributionDeletion(String fundId, List<NavDO> navDOList) {
  60. }
  61. private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
  62. if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  63. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  64. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
  65. for(String tradeDate : tradeListMap.keySet()){
  66. if(navListMap.containsKey(tradeDate)){
  67. deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  68. continue;
  69. }
  70. //写入缺失信息表
  71. saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
  72. }
  73. }
  74. if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  75. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  76. TreeMap<Integer,List<AssetDO>> weekNavListMap = new TreeMap<>();
  77. //按周数整合
  78. for(String priceDate : navListMap.keySet()){
  79. Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
  80. if(weekNavListMap.containsKey(weekOfYear)){
  81. List<AssetDO> assetDOS = weekNavListMap.get(weekOfYear);
  82. assetDOS.addAll(navListMap.get(priceDate));
  83. weekNavListMap.put(weekOfYear,assetDOS);
  84. }else{
  85. List<AssetDO> navDOS = new ArrayList<>();
  86. navDOS.addAll(navListMap.get(priceDate));
  87. weekNavListMap.put(weekOfYear,navDOS);
  88. }
  89. }
  90. Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
  91. for(Integer weekOfYear : tradeListMap.keySet()){
  92. if(weekNavListMap.containsKey(weekOfYear)){
  93. List<AssetDO> assetDOS = weekNavListMap.get(weekOfYear);
  94. String tradeDate = DateUtils.format(assetDOS.get(assetDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD);
  95. deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  96. continue;
  97. }
  98. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  99. List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
  100. String tradeDate = null;
  101. if(tradeDateDOS.size() > 0){
  102. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  103. }
  104. //写入缺失信息表
  105. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  106. }
  107. }
  108. if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
  109. Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  110. TreeMap<String,List<AssetDO>> monthNavListMap = new TreeMap<>();
  111. //按周数整合
  112. for(String priceDate : navListMap.keySet()){
  113. String yearMonth = priceDate.substring(0,7);
  114. if(monthNavListMap.containsKey(yearMonth)){
  115. List<AssetDO> navDOS = monthNavListMap.get(yearMonth);
  116. navDOS.addAll(navListMap.get(priceDate));
  117. monthNavListMap.put(yearMonth,navDOS);
  118. }else{
  119. List<AssetDO> navDOS = new ArrayList<>();
  120. navDOS.addAll(navListMap.get(priceDate));
  121. monthNavListMap.put(yearMonth,navDOS);
  122. }
  123. }
  124. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
  125. for(String yearMonth : tradeListMap.keySet()){
  126. if(monthNavListMap.containsKey(yearMonth)){
  127. List<AssetDO> assetDOS = monthNavListMap.get(yearMonth);
  128. String tradeDate = DateUtils.format(assetDOS.get(assetDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD);
  129. deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  130. continue;
  131. }
  132. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  133. List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
  134. String tradeDate = null;
  135. if(tradeDateDOS.size() > 0){
  136. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  137. }
  138. //写入缺失信息表
  139. saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
  140. }
  141. }
  142. }
  143. private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
  144. //只处理日月季频率
  145. if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  146. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  147. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
  148. for(String tradeDate : tradeListMap.keySet()){
  149. if(navListMap.containsKey(tradeDate)){
  150. deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  151. continue;
  152. }
  153. //写入缺失信息表
  154. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  155. }
  156. }
  157. if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  158. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  159. TreeMap<Integer,List<NavDO>> weekNavListMap = new TreeMap<>();
  160. //按周数整合
  161. for(String priceDate : navListMap.keySet()){
  162. Integer weekOfYear = DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD));
  163. if(weekNavListMap.containsKey(weekOfYear)){
  164. List<NavDO> navDOS = weekNavListMap.get(weekOfYear);
  165. navDOS.addAll(navListMap.get(priceDate));
  166. weekNavListMap.put(weekOfYear,navDOS);
  167. }else{
  168. List<NavDO> navDOS = new ArrayList<>();
  169. navDOS.addAll(navListMap.get(priceDate));
  170. weekNavListMap.put(weekOfYear,navDOS);
  171. }
  172. }
  173. Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getWeekOfYear()));
  174. for(Integer weekOfYear : tradeListMap.keySet()){
  175. if(weekNavListMap.containsKey(weekOfYear)){
  176. List<NavDO> navDOS = weekNavListMap.get(weekOfYear);
  177. String tradeDate = DateUtils.format(navDOS.get(navDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD);
  178. deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  179. continue;
  180. }
  181. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  182. List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
  183. String tradeDate = null;
  184. if(tradeDateDOS.size() > 0){
  185. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  186. }
  187. //写入缺失信息表
  188. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  189. }
  190. }
  191. if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
  192. Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
  193. TreeMap<String,List<NavDO>> monthNavListMap = new TreeMap<>();
  194. //按周数整合
  195. for(String priceDate : navListMap.keySet()){
  196. String yearMonth = priceDate.substring(0,7);
  197. if(monthNavListMap.containsKey(yearMonth)){
  198. List<NavDO> navDOS = monthNavListMap.get(yearMonth);
  199. navDOS.addAll(navListMap.get(priceDate));
  200. monthNavListMap.put(yearMonth,navDOS);
  201. }else{
  202. List<NavDO> navDOS = new ArrayList<>();
  203. navDOS.addAll(navListMap.get(priceDate));
  204. monthNavListMap.put(yearMonth,navDOS);
  205. }
  206. }
  207. Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
  208. for(String yearMonth : tradeListMap.keySet()){
  209. if(monthNavListMap.containsKey(yearMonth)){
  210. List<NavDO> navDOS = monthNavListMap.get(yearMonth);
  211. String tradeDate = DateUtils.format(navDOS.get(navDOS.size()-1).getPriceDate(),DateUtils.YYYY_MM_DD);
  212. deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo());
  213. continue;
  214. }
  215. //不包含的话,默认取每周的最后一个交易日作为周净值日期
  216. List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
  217. String tradeDate = null;
  218. if(tradeDateDOS.size() > 0){
  219. tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
  220. }
  221. //写入缺失信息表
  222. saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
  223. }
  224. }
  225. }
  226. private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
  227. if(tradeDate == null){
  228. return;
  229. }
  230. DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
  231. deletionInfoDO.setFundId(fundId);
  232. deletionInfoDO.setDeletionDate(tradeDate);
  233. deletionInfoDO.setDeletionType(code);
  234. DeletionInfoDO oldDeletionDO = deletionInfoMapper.getDeletionInfoDO(deletionInfoDO);
  235. if(StringUtil.isNull(oldDeletionDO)){
  236. deletionInfoDO.setIsvalid(1);
  237. deletionInfoDO.setUpdateTime(DateUtils.getNowDate());
  238. deletionInfoDO.setCreateTime(DateUtils.getNowDate());
  239. deletionInfoMapper.saveDeletionInfoDO(deletionInfoDO);
  240. }
  241. }
  242. }