|
@@ -84,42 +84,45 @@ public class CompetitionIndicatorCalcTask {
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
for (RcCompetitionCalcDateDO calcDateDO : calcDateDOList) {
|
|
for (RcCompetitionCalcDateDO calcDateDO : calcDateDOList) {
|
|
- String beginDate = calcDateDO.getBeginDate();
|
|
|
|
- String endDate = calcDateDO.getEndDate();
|
|
|
|
- // 基金净值数据
|
|
|
|
- List<NavDO> navDOList = getSevNav(competitionId, beginDate, endDate);
|
|
|
|
- if (CollUtil.isEmpty(navDOList)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).filter(StrUtil::isNotBlank).distinct().toList();
|
|
|
|
- Map<String, List<DateValue>> allNavMap = getSecNavMap(navDOList);
|
|
|
|
- // 基金-基准映射关系
|
|
|
|
- List<FundInfoDO> fundInfoDOList = fundInfoMapper.queryFundInfoByFundId(fundIdList);
|
|
|
|
- Map<String, String> secBenchmarkIdMap = fundInfoDOList.stream().collect(Collectors.toMap(FundInfoDO::getFundId, FundInfoDO::getPrimaryBenchmarkId));
|
|
|
|
- // 基准净值数据
|
|
|
|
- List<String> indexIdList = fundInfoDOList.stream().map(FundInfoDO::getPrimaryBenchmarkId).distinct().toList();
|
|
|
|
- Map<String, List<DateValue>> benchmarkIdNavMap = getBenchmarkNavMap(indexIdList, beginDate, endDate);
|
|
|
|
- allNavMap.putAll(benchmarkIdNavMap);
|
|
|
|
- Map<String, Frequency> secFreqMap = fundIdList.stream().collect(Collectors.toMap(k -> k, v -> Frequency.Weekly));
|
|
|
|
- CalcMultipleSecMultipleTimeRangeIndicatorReq req = prepareIndicatorReq(fundIdList, secBenchmarkIdMap, indexIdList, beginDate, endDate);
|
|
|
|
|
|
+ calculateIndicator(competitionId, calcDateDO);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- // 计算指标
|
|
|
|
- IndicatorService indicatorService = IndicatorService.getInstance();
|
|
|
|
- Map<String, List<IndicatorCalcPropertyDto>> secMultipleTimeRangeIndicator = indicatorService.calcMultipleSecMultipleTimeRangeIndicator(req, allNavMap, secFreqMap);
|
|
|
|
- if (MapUtil.isEmpty(secMultipleTimeRangeIndicator)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- // 资产规模
|
|
|
|
- Map<String, BigDecimal> fundIdAssetMap = getFundAsset(fundIdList, beginDate, endDate, calcDateDO.getEndMonth());
|
|
|
|
- // 绘制到指标结果表:fund_indicator
|
|
|
|
- List<FundIndicatorDO> fundIndicatorDOList = convertToFundIndicatorDo(competitionId, calcDateDO, fundIdAssetMap, secMultipleTimeRangeIndicator);
|
|
|
|
- if (CollUtil.isNotEmpty(fundIndicatorDOList)) {
|
|
|
|
- fundIndicatorMapper.batchInsertOrUpdate(fundIndicatorDOList);
|
|
|
|
- }
|
|
|
|
|
|
+ public void calculateIndicator(Integer competitionId, RcCompetitionCalcDateDO calcDateDO) {
|
|
|
|
+ String beginDate = calcDateDO.getBeginDate();
|
|
|
|
+ String endDate = calcDateDO.getEndDate();
|
|
|
|
+ // 基金净值数据
|
|
|
|
+ List<NavDO> navDOList = getSevNav(competitionId, beginDate, endDate);
|
|
|
|
+ if (CollUtil.isEmpty(navDOList)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).filter(StrUtil::isNotBlank).distinct().toList();
|
|
|
|
+ Map<String, List<DateValue>> allNavMap = getSecNavMap(navDOList);
|
|
|
|
+ // 基金-基准映射关系
|
|
|
|
+ List<FundInfoDO> fundInfoDOList = fundInfoMapper.queryFundInfoByFundId(fundIdList);
|
|
|
|
+ Map<String, String> secBenchmarkIdMap = fundInfoDOList.stream().collect(Collectors.toMap(FundInfoDO::getFundId, FundInfoDO::getPrimaryBenchmarkId));
|
|
|
|
+ // 基准净值数据
|
|
|
|
+ List<String> indexIdList = fundInfoDOList.stream().map(FundInfoDO::getPrimaryBenchmarkId).distinct().toList();
|
|
|
|
+ Map<String, List<DateValue>> benchmarkIdNavMap = getBenchmarkNavMap(indexIdList, beginDate, endDate);
|
|
|
|
+ allNavMap.putAll(benchmarkIdNavMap);
|
|
|
|
+ Map<String, Frequency> secFreqMap = fundIdList.stream().collect(Collectors.toMap(k -> k, v -> Frequency.Weekly));
|
|
|
|
+ CalcMultipleSecMultipleTimeRangeIndicatorReq req = prepareIndicatorReq(fundIdList, secBenchmarkIdMap, indexIdList, beginDate, endDate);
|
|
|
|
|
|
- // 发布计算排名事件
|
|
|
|
- calcFundRankPublisher.publishEvent(new CalcFundRankEventDO(competitionId, calcDateDO.getPriod(), allNavMap));
|
|
|
|
|
|
+ // 计算指标
|
|
|
|
+ IndicatorService indicatorService = IndicatorService.getInstance();
|
|
|
|
+ Map<String, List<IndicatorCalcPropertyDto>> secMultipleTimeRangeIndicator = indicatorService.calcMultipleSecMultipleTimeRangeIndicator(req, allNavMap, secFreqMap);
|
|
|
|
+ if (MapUtil.isEmpty(secMultipleTimeRangeIndicator)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ // 资产规模
|
|
|
|
+ Map<String, BigDecimal> fundIdAssetMap = getFundAsset(fundIdList, beginDate, endDate, calcDateDO.getEndMonth());
|
|
|
|
+ // 绘制到指标结果表:fund_indicator
|
|
|
|
+ List<FundIndicatorDO> fundIndicatorDOList = convertToFundIndicatorDo(competitionId, calcDateDO, fundIdAssetMap, secMultipleTimeRangeIndicator);
|
|
|
|
+ if (CollUtil.isNotEmpty(fundIndicatorDOList)) {
|
|
|
|
+ fundIndicatorMapper.batchInsertOrUpdate(fundIndicatorDOList);
|
|
}
|
|
}
|
|
|
|
+ // 发布计算排名事件
|
|
|
|
+ calcFundRankPublisher.publishEvent(new CalcFundRankEventDO(competitionId, calcDateDO.getPriod(), allNavMap));
|
|
}
|
|
}
|
|
|
|
|
|
private List<FundIndicatorDO> convertToFundIndicatorDo(Integer competitionId, RcCompetitionCalcDateDO calcDateDO, Map<String, BigDecimal> fundIdAssetMap,
|
|
private List<FundIndicatorDO> convertToFundIndicatorDo(Integer competitionId, RcCompetitionCalcDateDO calcDateDO, Map<String, BigDecimal> fundIdAssetMap,
|
|
@@ -328,7 +331,7 @@ public class CompetitionIndicatorCalcTask {
|
|
}
|
|
}
|
|
|
|
|
|
private List<NavDO> getSevNav(Integer competitionId, String beginDate, String endDate) {
|
|
private List<NavDO> getSevNav(Integer competitionId, String beginDate, String endDate) {
|
|
- List<NavDO> navDOList = navMapper.queryAllNav(competitionId, beginDate, endDate);
|
|
|
|
|
|
+ List<NavDO> navDOList = navMapper.queryAllNav(competitionId);
|
|
// 过滤掉净值缺失的基金
|
|
// 过滤掉净值缺失的基金
|
|
List<FundDeletionInfoDO> fundNavDeletionList = deletionInfoMapper.getFundNavDeletion(1, competitionId, beginDate, endDate);
|
|
List<FundDeletionInfoDO> fundNavDeletionList = deletionInfoMapper.getFundNavDeletion(1, competitionId, beginDate, endDate);
|
|
if (CollUtil.isNotEmpty(fundNavDeletionList)) {
|
|
if (CollUtil.isNotEmpty(fundNavDeletionList)) {
|