Browse Source

feat:增加绘制指标和计算排名的日志输出

mozuwen 5 months ago
parent
commit
5c49217033

+ 2 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/FundInfoDO.java

@@ -7,6 +7,7 @@ import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.pojo.vo.FundInfoVO;
 import com.simuwang.base.pojo.vo.FundInformationVO;
 import lombok.Data;
+import lombok.ToString;
 
 import java.util.Date;
 
@@ -17,6 +18,7 @@ import java.util.Date;
  * Description: ${DESCRIPTION}
  */
 @Data
+@ToString
 @TableName("pvn_fund_info")
 public class FundInfoDO {
     /**

+ 2 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/RcCompetitionCalcDateDO.java

@@ -1,8 +1,10 @@
 package com.simuwang.base.pojo.dos;
 
 import lombok.Data;
+import lombok.ToString;
 
 @Data
+@ToString
 public class RcCompetitionCalcDateDO {
 
     /**

+ 45 - 34
service-calc/src/main/java/com/simuwang/task/CompetitionIndicatorCalcTask.java

@@ -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,

+ 22 - 8
service-manage/src/main/java/com/simuwang/manage/service/competition/CalcFundRankService.java

@@ -3,6 +3,7 @@ package com.simuwang.manage.service.competition;
 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;
@@ -13,6 +14,8 @@ import com.simuwang.base.pojo.dos.*;
 import com.simuwang.base.pojo.dto.FundScoreRankDTO;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.utils.BigDecimalUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import java.lang.reflect.Field;
@@ -23,6 +26,8 @@ import java.util.stream.Collectors;
 @Service
 public class CalcFundRankService {
 
+    private final static Logger log = LoggerFactory.getLogger(CalcFundRankService.class);
+
     private final FundIndicatorMapper fundIndicatorMapper;
     private final RcCompetitionApplyMapper competitionApplyMapper;
     private final FundRatingRuleMapper fundRatingRuleMapper;
@@ -56,19 +61,28 @@ public class CalcFundRankService {
         Map<Integer, List<FundIndicatorDO>> strategyIndicatorMap = fundIndicatorList.stream().collect(Collectors.groupingBy(k -> fundIdStrategyMap.get(k.getFundId())));
         List<FundScoreRankDTO> fundScoreRankDTOList = CollUtil.newArrayList();
         for (Map.Entry<Integer, List<FundIndicatorDO>> strategyIndicatorEntry : strategyIndicatorMap.entrySet()) {
-            List<FundIndicatorDO> indicatorDOList = strategyIndicatorEntry.getValue();
-            Integer strategyId = strategyIndicatorEntry.getKey();
-            List<FundRatingRuleDO> ruleDOList = strategyRatingRuleMap.get(strategyId);
-            // 计算综合得分和排名
-            List<FundScoreRankDTO> scoreRankDTOList = calculateScoreAndRank(indicatorDOList, ruleDOList);
-            scoreRankDTOList.forEach(e -> e.setStrategyId(strategyId));
-            fundScoreRankDTOList.addAll(scoreRankDTOList);
+            try {
+                List<FundIndicatorDO> indicatorDOList = strategyIndicatorEntry.getValue();
+                Integer strategyId = strategyIndicatorEntry.getKey();
+                List<FundRatingRuleDO> ruleDOList = strategyRatingRuleMap.get(strategyId);
+                // 计算综合得分和排名
+                List<FundScoreRankDTO> scoreRankDTOList = calculateScoreAndRank(indicatorDOList, ruleDOList);
+                scoreRankDTOList.forEach(e -> e.setStrategyId(strategyId));
+                fundScoreRankDTOList.addAll(scoreRankDTOList);
+            } catch (Exception e) {
+                log.error("计算综合得分和排名出错 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+            }
         }
         if (CollUtil.isEmpty(fundScoreRankDTOList)) {
+            log.info("基金综合得分和排名为空,无需绘制榜单结果表");
             return;
         }
         // 绘制榜单结果表
-        saveCompetitionResult(competitionId, period, fundIndicatorList, fundScoreRankDTOList, competitionApplyDOList, calcFundRankEventDO.getFundIdNavMap());
+        try {
+            saveCompetitionResult(competitionId, period, fundIndicatorList, fundScoreRankDTOList, competitionApplyDOList, calcFundRankEventDO.getFundIdNavMap());
+        } catch (Exception e) {
+            log.error("绘制榜单结果表出错 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+        }
     }
 
     private void saveCompetitionResult(Integer competitionId, String period, List<FundIndicatorDO> fundIndicatorList, List<FundScoreRankDTO> fundScoreRankDTOList,