|
@@ -3,6 +3,7 @@ package com.simuwang.task;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.exceptions.ExceptionUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
@@ -89,41 +90,51 @@ public class CompetitionIndicatorCalcTask {
|
|
|
}
|
|
|
|
|
|
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)) {
|
|
|
- log.info("当前榜单周期内基金净值点位不够计算指标 -> beginDate:{},endDate:{}", beginDate, endDate);
|
|
|
- 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);
|
|
|
-
|
|
|
- // 计算指标
|
|
|
- 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);
|
|
|
+ try {
|
|
|
+ String beginDate = calcDateDO.getBeginDate();
|
|
|
+ String endDate = calcDateDO.getEndDate();
|
|
|
+ // 基金净值数据(同时判断基金净值是否满足参与榜单)
|
|
|
+ List<NavDO> navDOList = getSevNav(competitionId, beginDate, endDate);
|
|
|
+ if (CollUtil.isEmpty(navDOList)) {
|
|
|
+ log.info("当前榜单周期内基金净值点位不够计算指标 -> beginDate:{},endDate:{}", beginDate, endDate);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("基金净值个数:{}", navDOList);
|
|
|
+ List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).filter(StrUtil::isNotBlank).distinct().toList();
|
|
|
+ log.info("参与指标计算的基金id:{}", fundIdList);
|
|
|
+ Map<String, List<DateValue>> allNavMap = getSecNavMap(navDOList);
|
|
|
+ // 基金-基准映射关系
|
|
|
+ List<FundInfoDO> fundInfoDOList = fundInfoMapper.queryFundInfoByFundId(fundIdList);
|
|
|
+ log.info("基金信息:{}", fundInfoDOList);
|
|
|
+ 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);
|
|
|
+ log.info("计算指标参数:{}", req);
|
|
|
+ // 计算指标
|
|
|
+ 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());
|
|
|
+ log.info("资产规模:{}", fundIdAssetMap);
|
|
|
+ // 绘制到指标结果表:fund_indicator
|
|
|
+ List<FundIndicatorDO> fundIndicatorDOList = convertToFundIndicatorDo(competitionId, calcDateDO, fundIdAssetMap, secMultipleTimeRangeIndicator);
|
|
|
+ if (CollUtil.isNotEmpty(fundIndicatorDOList)) {
|
|
|
+ log.info("绘制到指标结果表:fund_indicator数量:{}", fundIndicatorDOList.size());
|
|
|
+ fundIndicatorMapper.batchInsertOrUpdate(fundIndicatorDOList);
|
|
|
+ }
|
|
|
+ // 发布计算排名事件
|
|
|
+ calcFundRankPublisher.publishEvent(new CalcFundRankEventDO(competitionId, calcDateDO.getPriod(), allNavMap));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("指标计算报错 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
+ log.error("competitionId:{},calcDateDO:{}", competitionId, calcDateDO);
|
|
|
}
|
|
|
- // 发布计算排名事件
|
|
|
- calcFundRankPublisher.publishEvent(new CalcFundRankEventDO(competitionId, calcDateDO.getPriod(), allNavMap));
|
|
|
}
|
|
|
|
|
|
private List<FundIndicatorDO> convertToFundIndicatorDo(Integer competitionId, RcCompetitionCalcDateDO calcDateDO, Map<String, BigDecimal> fundIdAssetMap,
|