浏览代码

完成common-info接口

wangzaijun 1 年之前
父节点
当前提交
3eab1f401f
共有 22 个文件被更改,包括 459 次插入174 次删除
  1. 4 7
      src/main/java/com/smppw/analysis/application/dto/info/HeadInfoReq.java
  2. 0 65
      src/main/java/com/smppw/analysis/application/dto/info/PubilclyCurrencyFundHeadInfoVO.java
  3. 18 74
      src/main/java/com/smppw/analysis/application/service/info/FundInfoService.java
  4. 180 0
      src/main/java/com/smppw/analysis/application/service/info/GlobalService.java
  5. 32 8
      src/main/java/com/smppw/analysis/client/FundApi.java
  6. 13 0
      src/main/java/com/smppw/analysis/domain/dataobject/CommonIndexDO.java
  7. 17 0
      src/main/java/com/smppw/analysis/domain/dto/info/HeadInfoParams.java
  8. 11 7
      src/main/java/com/smppw/analysis/application/dto/info/HeadInfoVO.java
  9. 10 1
      src/main/java/com/smppw/analysis/application/dto/info/PrivatelyFundHeadInfoVO.java
  10. 33 0
      src/main/java/com/smppw/analysis/domain/dto/info/PubliclyCurrencyFundHeadInfoVO.java
  11. 11 2
      src/main/java/com/smppw/analysis/application/dto/info/PubilclyFundHeadInfoVO.java
  12. 13 0
      src/main/java/com/smppw/analysis/domain/manager/info/HeadInfo.java
  13. 28 0
      src/main/java/com/smppw/analysis/domain/manager/info/HeadInfoFactory.java
  14. 15 0
      src/main/java/com/smppw/analysis/domain/manager/info/handler/PrivatelyFundHeadInfo.java
  15. 16 0
      src/main/java/com/smppw/analysis/domain/manager/info/handler/PubliclyFundHeadInfo.java
  16. 1 1
      src/main/java/com/smppw/analysis/domain/manager/performance/handler/CorrelationHandler.java
  17. 16 0
      src/main/java/com/smppw/analysis/domain/mapper/core/CommonIndexMapper.java
  18. 8 0
      src/main/java/com/smppw/analysis/domain/service/BaseInfoService.java
  19. 2 3
      src/main/java/com/smppw/analysis/domain/service/NavService.java
  20. 13 0
      src/main/java/com/smppw/analysis/domain/service/impl/BaseInfoServiceImpl.java
  21. 4 6
      src/main/java/com/smppw/analysis/domain/service/impl/NavServiceImpl.java
  22. 14 0
      src/main/resources/mapping/core/CommonIndex.xml

+ 4 - 7
src/main/java/com/smppw/analysis/application/dto/info/HeadInfoReq.java

@@ -1,23 +1,20 @@
 package com.smppw.analysis.application.dto.info;
 
 import com.smppw.analysis.application.dto.BaseReq;
+import com.smppw.analysis.domain.dto.info.HeadInfoParams;
 import lombok.Getter;
 import lombok.Setter;
 
 @Setter
 @Getter
-public class HeadInfoReq extends BaseReq<Object> {
+public class HeadInfoReq extends BaseReq<HeadInfoParams> {
     /**
      * 标的id
      */
     private String secId;
-    /**
-     * 策略,核心策略,默认All,基金不传或传All
-     */
-    private String strategy;
 
     @Override
-    public Object convert() {
-        return null;
+    public HeadInfoParams convert() {
+        return new HeadInfoParams(this.getSecId());
     }
 }

+ 0 - 65
src/main/java/com/smppw/analysis/application/dto/info/PubilclyCurrencyFundHeadInfoVO.java

@@ -1,65 +0,0 @@
-package com.smppw.analysis.application.dto.info;
-
-import com.smppw.common.pojo.ValueLabelVO;
-import lombok.Getter;
-import lombok.Setter;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * @author wangzaijun
- * @date 2023/8/7 16:41
- * @description 货币型公募基金 头部
- */
-@Setter
-@Getter
-public class PubilclyCurrencyFundHeadInfoVO {
-    /**
-     * 基金管理人ID
-     */
-    private String trustId;
-    /**
-     * 基金管理人
-     */
-    private String trustName;
-    /**
-     * 基金经理 id:名称
-     */
-    private List<ValueLabelVO> managers;
-    /**
-     * 基金状态值
-     */
-    private String fundStatusValue;
-    /**
-     * 基金规模---仅仅公募用
-     */
-    private String fundSize;
-
-    /**
-     * 基金规模日期---基金公募用(货币型)
-     */
-    private String fundSizeDate;
-
-    /**
-     * 基金规模--仅仅公募用--单位
-     */
-    private String fundSizeUnit;
-    /**
-     * 是否货币型公募基金
-     */
-    private Integer isCurrency;
-    /**
-     * 7日年化收益
-     */
-    private BigDecimal profitSevenDayAnnual;
-    /**
-     * 百份、万份、百万份收益
-     */
-    private BigDecimal retPerUnit;
-
-    /**
-     * 单位- 1:百份  2:万份  3:百万份
-     */
-    private String publicWorthUnit;
-}

+ 18 - 74
src/main/java/com/smppw/analysis/application/service/info/FundInfoService.java

@@ -7,16 +7,13 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.StrUtil;
-import com.smppw.analysis.application.dto.info.*;
+import com.smppw.analysis.application.dto.info.FundSimilarReq;
+import com.smppw.analysis.application.dto.info.ManualFundNoticeReq;
 import com.smppw.analysis.domain.dataobject.FundArchivesInfoDO;
 import com.smppw.analysis.domain.dataobject.FundFeeDo;
-import com.smppw.analysis.domain.dataobject.ManualFundNoticeInfoDO;
 import com.smppw.analysis.domain.dataobject.FundSimilarDo;
+import com.smppw.analysis.domain.dataobject.ManualFundNoticeInfoDO;
 import com.smppw.analysis.domain.dto.info.*;
-import com.smppw.analysis.domain.dto.performance.IndicatorParams;
-import com.smppw.analysis.domain.manager.performance.Performance;
-import com.smppw.analysis.domain.manager.performance.PerformanceConstants;
-import com.smppw.analysis.domain.manager.performance.PerformanceFactory;
 import com.smppw.analysis.domain.service.BaseIndicatorServiceV2;
 import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.domain.service.NavService;
@@ -26,8 +23,10 @@ import com.smppw.common.pojo.NewSubStrategy;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcPropertyDto;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcTimeRangeDto;
-import com.smppw.common.pojo.enums.*;
-import com.smppw.constants.Consts;
+import com.smppw.common.pojo.enums.Frequency;
+import com.smppw.common.pojo.enums.NavType;
+import com.smppw.common.pojo.enums.TimeRange;
+import com.smppw.common.pojo.enums.Visibility;
 import com.smppw.constants.DateConst;
 import com.smppw.core.IndicatorService;
 import com.smppw.utils.BigDecimalUtils;
@@ -43,21 +42,9 @@ import java.util.stream.Collectors;
 
 @Service
 public class FundInfoService {
-    private final NavService navService;
-    private final PerformanceFactory factory;
-    private final BaseInfoService baseInfoService;
-    private final BaseIndicatorServiceV2 baseIndicatorServiceV2;
     private static final Map<String, String> ACCRUED_FREQUENCY = MapUtil.newHashMap();
     private static final Map<String, String> ACCRUED_METHOD = MapUtil.newHashMap();
 
-    public FundInfoService(NavService navService, PerformanceFactory factory,
-                           BaseInfoService baseInfoService, BaseIndicatorServiceV2 baseIndicatorServiceV2) {
-        this.factory = factory;
-        this.navService = navService;
-        this.baseInfoService = baseInfoService;
-        this.baseIndicatorServiceV2 = baseIndicatorServiceV2;
-    }
-
     static {
         ACCRUED_FREQUENCY.put("1", "月");
         ACCRUED_FREQUENCY.put("2", "季");
@@ -69,59 +56,16 @@ public class FundInfoService {
         ACCRUED_METHOD.put("3", "单客户高水位");
     }
 
-    public PrivatelyFundHeadInfoVO headInfo(HeadInfoReq params) {
-        return new PrivatelyFundHeadInfoVO();
-    }
-
-    public CommonInfoVO commonInfo(CommonInfoReq params) {
-//        CommonInfoVO res = new CommonInfoVO();
-//        IStrategy strategy = StrategyHandleUtils.getStrategy(params.getStrategy());
-//        String secId = params.getSecId();
-//        Byte raiseType = null;
-//        List<Frequency> result = CollectionUtil.newArrayList();
-//        String fundType = this.baseInfoService.getFundType(secId);
-//        List<IStrategy> originStrategy = CollectionUtil.newArrayList();
-//        // 获取频率
-//        CmBigDataFundInfoDo fundHeadInfo = fundHeadInfoBaseService.getFundHeadInfo(secId);
-//        if (fundHeadInfo == null) {
-//            throw new APIException("");
-//        }
-//        raiseType = fundHeadInfo.getRaiseType();
-//        Frequency navFrequency = fundInformationDao.getNavFrequency(secId);
-//        result.add(navFrequency);
-//        // 将频率转换一道 取最小频率
-//        List<Frequency> frequencies = fundInformationDao.toFrequencyList(result);
-//        if (raiseType == 2) {
-//            frequencies.removeIf(p -> p.getId() == Frequency.Default.getId());
-//        }
-//        List<ValueLabelVO> frequencyValueLabel = trans2ValueLabel(frequencies);
-//        res.setFrequency(frequencyValueLabel);
-//        // 净值类型
-//        List<ValueLabelVO> navType = Arrays.stream(NavType.values())
-//                .filter(p -> !NavType.All.equals(p) && !NavType.UnitAndCumulativeNav.equals(p))
-//                .map(p -> new ValueLabelVO(p.name(), p.getDesc())).collect(Collectors.toList());
-//        res.setNavType(navType);
-//        // 策略曲线
-//        RaiseType realRaiseType = RaiseType.getRaiseType(raiseType);
-//        handleTimeRange(strategy, res, secId, companyOrManager, realRaiseType);
-//        // 获取常用指数
-////        List<ValueLabelVO> benchmarkList = userCommonIndexService.getByUser(-1);
-////        handleBenchmark(strategy, res, secId, fundType, originStrategy, companyOrManager, benchmarkList);
-        return new CommonInfoVO();
-    }
+    private final NavService navService;
+    private final BaseInfoService baseInfoService;
+    private final BaseIndicatorServiceV2 baseIndicatorServiceV2;
 
-    @SuppressWarnings("unchecked")
-    public HeadIndicatorVO headIndicator(HeadIndicatorReq req) {
-        IndicatorParams params = req.convert();
-        Performance<IndicatorParams, Map<String, Object>> instance = this.factory.getInstance(PerformanceConstants.INDICATOR);
-        Map<String, Object> dataset = instance.execute(params);
-        Map<String, Object> indicatorMap = MapUtil.get(dataset, req.getSecId(), Map.class);
-        HeadIndicatorVO vo = new HeadIndicatorVO();
-        vo.setAnnualReturn(MapUtil.getStr(indicatorMap, Indicator.AnnualReturn.name()));
-        vo.setAnnualStdDev(MapUtil.getStr(indicatorMap, Indicator.AnnualStdDev.name()));
-        vo.setMaxDrawdown(MapUtil.getStr(indicatorMap, Indicator.MaxDrawdown.name()));
-        vo.setSharpeRatio(MapUtil.getStr(indicatorMap, Indicator.SharpeRatio.name()));
-        return vo;
+    public FundInfoService(NavService navService,
+                           BaseInfoService baseInfoService,
+                           BaseIndicatorServiceV2 baseIndicatorServiceV2) {
+        this.navService = navService;
+        this.baseInfoService = baseInfoService;
+        this.baseIndicatorServiceV2 = baseIndicatorServiceV2;
     }
 
     /**
@@ -134,7 +78,7 @@ public class FundInfoService {
         List<String> refIds = ListUtil.toLinkedList(req.getRefId());
         IStrategy strategy = StrategyHandleUtils.getStrategy(req.getStrategy());
         Map<String, List<DateValue>> secNavMap = this.navService.getSecIdDateValueNavListMapByDb(refIds,
-                null, null, Visibility.Both, NavType.CumulativeNav, MapUtil.empty());
+                null, null, Visibility.Both, NavType.CumulativeNav);
         List<IndicatorCalcTimeRangeDto> secTimeRanges = IndicatorService.getInstance().getSecTimeRange(req.getRefId(), Frequency.Monthly, secNavMap);
         String startDate = null;
         String endDate = null;
@@ -155,7 +99,7 @@ public class FundInfoService {
             refIds.addAll(fundIds);
         }
         Map<String, List<DateValue>> allNavMap = this.navService.getSecIdDateValueNavListMapByDb(refIds,
-                startDate, endDate, Visibility.Both, NavType.CumulativeNav, MapUtil.empty());
+                startDate, endDate, Visibility.Both, NavType.CumulativeNav);
         Map<String, List<IndicatorCalcPropertyDto>> multiSecRetListNew = this.baseIndicatorServiceV2.getMultiSecRetListNew(
                 refIds, ListUtil.empty(), Frequency.Monthly, Frequency.Daily, startDate, endDate, false, params.getBenchmarkId(),
                 params.getRaiseType(), strategy, Visibility.Both, NavType.CumulativeNav, allNavMap);

+ 180 - 0
src/main/java/com/smppw/analysis/application/service/info/GlobalService.java

@@ -0,0 +1,180 @@
+package com.smppw.analysis.application.service.info;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.smppw.analysis.application.dto.info.*;
+import com.smppw.analysis.domain.dto.info.HeadInfoParams;
+import com.smppw.analysis.domain.dto.info.HeadInfoVO;
+import com.smppw.analysis.domain.dto.info.PrivatelyFundHeadInfoVO;
+import com.smppw.analysis.domain.dto.info.PubliclyFundHeadInfoVO;
+import com.smppw.analysis.domain.dto.performance.IndicatorParams;
+import com.smppw.analysis.domain.manager.info.HeadInfoFactory;
+import com.smppw.analysis.domain.manager.performance.Performance;
+import com.smppw.analysis.domain.manager.performance.PerformanceConstants;
+import com.smppw.analysis.domain.manager.performance.PerformanceFactory;
+import com.smppw.analysis.domain.service.BaseInfoService;
+import com.smppw.analysis.domain.service.NavService;
+import com.smppw.analysis.infrastructure.exception.APIException;
+import com.smppw.common.pojo.IStrategy;
+import com.smppw.common.pojo.ValueLabelVO;
+import com.smppw.common.pojo.dto.DateValue;
+import com.smppw.common.pojo.dto.calc.IndicatorCalcTimeRangeDto;
+import com.smppw.common.pojo.enums.*;
+import com.smppw.constants.SecType;
+import com.smppw.core.IndicatorService;
+import com.smppw.utils.StrategyHandleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class GlobalService {
+    private final NavService navService;
+    private final BaseInfoService baseInfoService;
+    private final HeadInfoFactory headInfoFactory;
+    private final PerformanceFactory performanceFactory;
+
+    public GlobalService(NavService navService,
+                         BaseInfoService baseInfoService,
+                         HeadInfoFactory headInfoFactory,
+                         PerformanceFactory performanceFactory) {
+        this.navService = navService;
+        this.baseInfoService = baseInfoService;
+        this.headInfoFactory = headInfoFactory;
+        this.performanceFactory = performanceFactory;
+    }
+
+    public HeadInfoVO headInfo(HeadInfoReq req) {
+        HeadInfoParams params = req.convert();
+        String secType = this.baseInfoService.getSecType(req.getSecId());
+        return this.headInfoFactory.getInstance(secType).get(params);
+    }
+
+    public CommonInfoVO commonInfo(CommonInfoReq params) {
+        String secType = this.baseInfoService.getSecType(params.getSecId());
+        CommonInfoVO res = new CommonInfoVO();
+        String secId = params.getSecId();
+        List<Frequency> result = CollectionUtil.newArrayList();
+        // 获取频率
+        HeadInfoVO fundHeadInfo = this.headInfoFactory.getInstance(secType).get(new HeadInfoParams(secId));
+        if (fundHeadInfo == null) {
+            throw new APIException("");
+        }
+        String raiseType = fundHeadInfo.getRaiseType();
+        result.add(this.baseInfoService.getNavFrequency(secId));
+        // 将频率转换一道 取最小频率
+        List<Frequency> frequencies = this.toFrequencyList(result);
+        if (Objects.equals("2", raiseType)) {
+            frequencies.removeIf(p -> p.getId() == Frequency.Default.getId());
+        }
+        List<ValueLabelVO> frequencyValueLabel = this.trans2ValueLabel(frequencies);
+        res.setFrequency(frequencyValueLabel);
+        // 净值类型
+        List<ValueLabelVO> navType = Arrays.stream(NavType.values())
+                .filter(p -> !NavType.All.equals(p) && !NavType.UnitAndCumulativeNav.equals(p))
+                .map(p -> new ValueLabelVO(p.name(), p.getDesc())).collect(Collectors.toList());
+        res.setNavType(navType);
+        handleTimeRange(res, secId);
+        // 获取常用指数
+        List<ValueLabelVO> benchmarkList = baseInfoService.getCommonIndexList();
+        handleBenchmark(res, secType, benchmarkList, fundHeadInfo);
+        return new CommonInfoVO();
+    }
+
+    @SuppressWarnings("unchecked")
+    public HeadIndicatorVO headIndicator(HeadIndicatorReq req) {
+        IndicatorParams params = req.convert();
+        Performance<IndicatorParams, Map<String, Object>> instance = this.performanceFactory.getInstance(PerformanceConstants.INDICATOR);
+        Map<String, Object> dataset = instance.execute(params);
+        Map<String, Object> indicatorMap = MapUtil.get(dataset, req.getSecId(), Map.class);
+        HeadIndicatorVO vo = new HeadIndicatorVO();
+        vo.setAnnualReturn(MapUtil.getStr(indicatorMap, Indicator.AnnualReturn.name()));
+        vo.setAnnualStdDev(MapUtil.getStr(indicatorMap, Indicator.AnnualStdDev.name()));
+        vo.setMaxDrawdown(MapUtil.getStr(indicatorMap, Indicator.MaxDrawdown.name()));
+        vo.setSharpeRatio(MapUtil.getStr(indicatorMap, Indicator.SharpeRatio.name()));
+        return vo;
+    }
+
+    private List<Frequency> toFrequencyList(List<Frequency> value) {
+        if (CollectionUtil.isEmpty(value))
+            return CollectionUtil.newArrayList(Frequency.Default);
+        if (value.contains(Frequency.Daily))
+            return CollectionUtil.newArrayList(Frequency.Default, Frequency.Daily, Frequency.Weekly, Frequency.Monthly);
+        if (value.contains(Frequency.Weekly))
+            return CollectionUtil.newArrayList(Frequency.Default, Frequency.Weekly, Frequency.Monthly);
+        if (value.contains(Frequency.Monthly))
+            return CollectionUtil.newArrayList(Frequency.Default, Frequency.Monthly);
+        return CollectionUtil.newArrayList(Frequency.Default);
+    }
+
+    private List<ValueLabelVO> trans2ValueLabel(List<Frequency> frequencies) {
+        List<ValueLabelVO> res = CollectionUtil.newArrayList();
+        for (Frequency frequency : frequencies) {
+            res.add(new ValueLabelVO(frequency.name(), frequency.getDesc()));
+        }
+        return res;
+    }
+
+    private void handleTimeRange(CommonInfoVO vo, String secId) {
+        List<String> refIds = ListUtil.toLinkedList(secId);
+        String endDate = null;
+        String startDate = null;
+        Frequency navFrequency = this.baseInfoService.getNavFrequency(secId);
+        Map<String, List<DateValue>> allNavMap = this.navService.getSecIdDateValueNavListMapByDb(refIds, null, null, Visibility.Both, NavType.CumulativeNav);
+        List<IndicatorCalcTimeRangeDto> secTimeRanges = IndicatorService.getInstance().getSecTimeRange(secId, navFrequency, allNavMap);
+        Map<String, String> timeRangeMap = MapUtil.newHashMap();
+        for (IndicatorCalcTimeRangeDto timeRange : secTimeRanges) {
+            if (StringUtils.isEmpty(endDate)) {
+                endDate = timeRange.getEndDate();
+            }
+            if (TimeRange.FromSetup == timeRange.getTimeRange()) {
+                startDate = timeRange.getStartDate();
+            }
+            timeRangeMap.put(timeRange.getTimeRange().name(), timeRange.getStartDate());
+        }
+        vo.setTimeRangeMap(timeRangeMap);
+        vo.setEndDate(endDate);
+        vo.setStartDate(startDate);
+    }
+
+    private void handleBenchmark(CommonInfoVO res, String fundType, List<ValueLabelVO> benchmarkList, HeadInfoVO headInfoVO) {
+        String benchmarkId = null;
+        ValueLabelVO valueLabelVO;
+        // 基金有对应策略的指数
+        if (fundType.equals(SecType.PRIVATELY_OFFERED_FUND) || fundType.equals(SecType.PRIVATE_FUND)) {
+            PrivatelyFundHeadInfoVO fundHeadInfo = (PrivatelyFundHeadInfoVO) headInfoVO;
+            benchmarkId = fundHeadInfo.getPrimaryBenchmarkId();
+            valueLabelVO = new ValueLabelVO(benchmarkId, fundHeadInfo.getPrimaryBenchmarkName());
+        } else if (fundType.equals(SecType.PUBLICLY_OFFERED_FUNDS)) {
+            // 公募需要特殊处理
+            PubliclyFundHeadInfoVO fundHeadInfo = (PubliclyFundHeadInfoVO) headInfoVO;
+            Integer subStrategyId = fundHeadInfo.getSubstrategyId();
+            IStrategy iStrategy = StrategyHandleUtils.getStrategyById(subStrategyId);
+            benchmarkId = iStrategy.getBenchmark();
+            if (StrUtil.isBlank(benchmarkId)) {
+                benchmarkId = fundHeadInfo.getPrimaryBenchmarkId();
+                valueLabelVO = new ValueLabelVO(benchmarkId, fundHeadInfo.getPrimaryBenchmarkName());
+            } else {
+                Map<String, String> querySecName = this.baseInfoService.querySecName(ListUtil.of(iStrategy.getBenchmark()));
+                String indexName = querySecName.get(iStrategy.getBenchmark());
+                valueLabelVO = new ValueLabelVO(benchmarkId, indexName);
+            }
+        } else {
+            valueLabelVO = new ValueLabelVO();
+        }
+        if (CollectionUtil.isNotEmpty(benchmarkList)) {
+            Optional<ValueLabelVO> contains = benchmarkList.stream().filter(p -> p.getValue().equals(valueLabelVO.getValue())).findFirst();
+            if (contains.isEmpty()) {
+                benchmarkList.add(0, valueLabelVO);
+            }
+        } else {
+            benchmarkList.add(valueLabelVO);
+        }
+        res.setBenchmarkId(benchmarkId);
+        res.setUsefulBenchmark(benchmarkList);
+    }
+}

+ 32 - 8
src/main/java/com/smppw/analysis/client/FundApi.java

@@ -2,10 +2,8 @@ package com.smppw.analysis.client;
 
 import com.smppw.analysis.application.dto.info.*;
 import com.smppw.analysis.application.service.info.FundInfoService;
-import com.smppw.analysis.domain.dto.info.FundBaseFeeVO;
-import com.smppw.analysis.domain.dto.info.FundSimilarVO;
-import com.smppw.analysis.domain.dto.info.ManualFundInvestInfoVO;
-import com.smppw.analysis.domain.dto.info.ManualFundNoticeInfoVO;
+import com.smppw.analysis.application.service.info.GlobalService;
+import com.smppw.analysis.domain.dto.info.*;
 import com.smppw.common.pojo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,26 +21,52 @@ import java.util.List;
 @RequestMapping("/v1/api/fund")
 public class FundApi {
     private final FundInfoService service;
+    private final GlobalService globalService;
 
-    public FundApi(FundInfoService service) {
+    public FundApi(FundInfoService service, GlobalService globalService) {
         this.service = service;
+        this.globalService = globalService;
     }
 
+    /**
+     * 标的头部信息接口
+     *
+     * @param params 请求参数
+     * @return /
+     */
     @GetMapping("head-info")
     public ResultVo<? extends HeadInfoVO> headInfo(HeadInfoReq params) {
-        return ResultVo.ok(this.service.headInfo(params));
+        return ResultVo.ok(this.globalService.headInfo(params));
     }
 
+    /**
+     * 统一设置接口,返回所有标的的统一设置,包括时段、净值频率等
+     *
+     * @param params /
+     * @return /
+     */
     @GetMapping("common-info")
     public ResultVo<CommonInfoVO> commonInfo(CommonInfoReq params) {
-        return ResultVo.ok(this.service.commonInfo(params));
+        return ResultVo.ok(this.globalService.commonInfo(params));
     }
 
+    /**
+     * 头部指标计算接口
+     *
+     * @param params 请求参数
+     * @return /
+     */
     @GetMapping("head-indicator")
     public ResultVo<HeadIndicatorVO> headIndicator(HeadIndicatorReq params) {
-        return ResultVo.ok(this.service.headIndicator(params));
+        return ResultVo.ok(this.globalService.headIndicator(params));
     }
 
+    /**
+     * 相似产品(私募基金)
+     *
+     * @param params /
+     * @return /
+     */
     @GetMapping("similar")
     public ResultVo<List<FundSimilarVO>> similar(FundSimilarReq params) {
         return ResultVo.ok(this.service.getFundSimilarList(params));

+ 13 - 0
src/main/java/com/smppw/analysis/domain/dataobject/CommonIndexDO.java

@@ -0,0 +1,13 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class CommonIndexDO {
+    private Integer id;
+    private Integer userid;
+    private String indexId;
+    private String indexName;
+}

+ 17 - 0
src/main/java/com/smppw/analysis/domain/dto/info/HeadInfoParams.java

@@ -0,0 +1,17 @@
+package com.smppw.analysis.domain.dto.info;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class HeadInfoParams {
+    /**
+     * 标的id
+     */
+    private String secId;
+}

+ 11 - 7
src/main/java/com/smppw/analysis/application/dto/info/HeadInfoVO.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.application.dto.info;
+package com.smppw.analysis.domain.dto.info;
 
 import com.smppw.common.pojo.ValueLabelVO;
 import lombok.Getter;
@@ -11,9 +11,9 @@ import lombok.Setter;
  */
 @Setter
 @Getter
-public abstract class HeadInfoVO {
+public class HeadInfoVO {
     /**
-     * 基金id,'HF'开头(后加36进制编码格式,不足8位长度左补零) 例:HF00000001
+     * id,'HF'开头(后加36进制编码格式,不足8位长度左补零) 例:HF00000001
      */
     private String refId;
     /**
@@ -21,11 +21,11 @@ public abstract class HeadInfoVO {
      */
     private String detailId;
     /**
-     * 基金中文简称
+     * 中文简称
      */
     private String refShortName;
     /**
-     * 基金中文全称
+     * 中文全称
      */
     private String refName;
     /**
@@ -51,7 +51,7 @@ public abstract class HeadInfoVO {
     /**
      * 一级策略id
      */
-    private String strategyId;
+    private Integer strategyId;
     /**
      * 一级策略名称
      */
@@ -59,7 +59,7 @@ public abstract class HeadInfoVO {
     /**
      * 二级策略id
      */
-    private String substrategyId;
+    private Integer substrategyId;
     /**
      * 二级策略名称
      */
@@ -80,4 +80,8 @@ public abstract class HeadInfoVO {
      * 是否小于500万
      */
     private ValueLabelVO lowerThanFiveMillionLabel;
+
+    public String getStrategySummaryName() {
+        return this.getStrategy() + "" + this.getSubstrategy();
+    }
 }

+ 10 - 1
src/main/java/com/smppw/analysis/application/dto/info/PrivatelyFundHeadInfoVO.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.application.dto.info;
+package com.smppw.analysis.domain.dto.info;
 
 import com.smppw.common.pojo.ValueLabelVO;
 import lombok.Getter;
@@ -55,4 +55,13 @@ public class PrivatelyFundHeadInfoVO extends HeadInfoVO {
      * 累计净值
      */
     private String cumulativeNavWithdrawal;
+
+    /**
+     * 融智策略基准id
+     */
+    private String primaryBenchmarkId;
+    /**
+     * 融智策略基准名称
+     */
+    private String primaryBenchmarkName;
 }

+ 33 - 0
src/main/java/com/smppw/analysis/domain/dto/info/PubliclyCurrencyFundHeadInfoVO.java

@@ -0,0 +1,33 @@
+package com.smppw.analysis.domain.dto.info;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wangzaijun
+ * @date 2023/8/7 16:41
+ * @description 货币型公募基金 头部
+ */
+@Setter
+@Getter
+public class PubliclyCurrencyFundHeadInfoVO extends PubliclyFundHeadInfoVO {
+    /**
+     * 是否货币型公募基金
+     */
+    private Integer isCurrency;
+    /**
+     * 7日年化收益
+     */
+    private BigDecimal profitSevenDayAnnual;
+    /**
+     * 百份、万份、百万份收益
+     */
+    private BigDecimal retPerUnit;
+
+    /**
+     * 单位- 1:百份  2:万份  3:百万份
+     */
+    private String publicWorthUnit;
+}

+ 11 - 2
src/main/java/com/smppw/analysis/application/dto/info/PubilclyFundHeadInfoVO.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.application.dto.info;
+package com.smppw.analysis.domain.dto.info;
 
 import com.smppw.common.pojo.ValueLabelVO;
 import lombok.Getter;
@@ -13,7 +13,7 @@ import java.util.List;
  */
 @Setter
 @Getter
-public class PubilclyFundHeadInfoVO {
+public class PubliclyFundHeadInfoVO extends HeadInfoVO {
     /**
      * 基金管理人ID
      */
@@ -46,4 +46,13 @@ public class PubilclyFundHeadInfoVO {
      * 累计净值
      */
     private String cumulativeNavWithdrawal;
+    /**
+     * 融智策略基准id
+     */
+    private String primaryBenchmarkId;
+
+    /**
+     * 融智策略基准名称
+     */
+    private String primaryBenchmarkName;
 }

+ 13 - 0
src/main/java/com/smppw/analysis/domain/manager/info/HeadInfo.java

@@ -0,0 +1,13 @@
+package com.smppw.analysis.domain.manager.info;
+
+import com.smppw.analysis.domain.dto.info.HeadInfoParams;
+import com.smppw.analysis.domain.dto.info.HeadInfoVO;
+
+/**
+ * @author wangzaijun
+ * @date 2023/8/10 15:04
+ * @description head-info接口特殊处理,支持多种标的
+ */
+public interface HeadInfo<R extends HeadInfoVO> {
+    R get(HeadInfoParams params);
+}

+ 28 - 0
src/main/java/com/smppw/analysis/domain/manager/info/HeadInfoFactory.java

@@ -0,0 +1,28 @@
+package com.smppw.analysis.domain.manager.info;
+
+import cn.hutool.core.map.MapUtil;
+import com.smppw.analysis.domain.dto.info.HeadInfoVO;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Component
+public class HeadInfoFactory {
+    private final static HeadInfo<HeadInfoVO> DEFAULT = p -> null;
+
+    private static final Map<String, HeadInfo<?>> HEAD_INFO_MAP = MapUtil.newConcurrentHashMap(8);
+
+    public HeadInfoFactory(Map<String, HeadInfo<?>> component) {
+        HEAD_INFO_MAP.putAll(component);
+    }
+
+    @SuppressWarnings("unchecked")
+    public <R extends HeadInfoVO> HeadInfo<R> getInstance(String key) {
+        HeadInfo<?> instance = HEAD_INFO_MAP.getOrDefault(key, DEFAULT);
+        try {
+            return (HeadInfo<R>) instance;
+        } catch (Exception e) {
+            return (HeadInfo<R>) DEFAULT;
+        }
+    }
+}

+ 15 - 0
src/main/java/com/smppw/analysis/domain/manager/info/handler/PrivatelyFundHeadInfo.java

@@ -0,0 +1,15 @@
+package com.smppw.analysis.domain.manager.info.handler;
+
+import com.smppw.analysis.domain.dto.info.HeadInfoParams;
+import com.smppw.analysis.domain.dto.info.PrivatelyFundHeadInfoVO;
+import com.smppw.analysis.domain.manager.info.HeadInfo;
+import com.smppw.constants.SecType;
+import org.springframework.stereotype.Component;
+
+@Component(SecType.PRIVATELY_OFFERED_FUND)
+public class PrivatelyFundHeadInfo implements HeadInfo<PrivatelyFundHeadInfoVO> {
+    @Override
+    public PrivatelyFundHeadInfoVO get(HeadInfoParams params) {
+        return new PrivatelyFundHeadInfoVO();
+    }
+}

+ 16 - 0
src/main/java/com/smppw/analysis/domain/manager/info/handler/PubliclyFundHeadInfo.java

@@ -0,0 +1,16 @@
+package com.smppw.analysis.domain.manager.info.handler;
+
+import com.smppw.analysis.domain.dto.info.HeadInfoParams;
+import com.smppw.analysis.domain.dto.info.PubliclyFundHeadInfoVO;
+import com.smppw.analysis.domain.manager.info.HeadInfo;
+import com.smppw.constants.SecType;
+import org.springframework.stereotype.Component;
+
+@Component(SecType.PUBLICLY_OFFERED_FUNDS)
+public class PubliclyFundHeadInfo implements HeadInfo<PubliclyFundHeadInfoVO> {
+    @Override
+    public PubliclyFundHeadInfoVO get(HeadInfoParams params) {
+        // todo 如果是货币则返回货币类的头部信息
+        return new PubliclyFundHeadInfoVO();
+    }
+}

+ 1 - 1
src/main/java/com/smppw/analysis/domain/manager/performance/handler/CorrelationHandler.java

@@ -44,7 +44,7 @@ public class CorrelationHandler extends AbstractSingleSecPerformance<Correlation
         List<String> refIds = params.getRefIds();
         String fundId = refIds.get(0);
         Map<String, List<DateValue>> allNavMap = this.navService.getSecIdDateValueNavListMapByDb(refIds,
-                params.getStartDate(), params.getEndDate(), Visibility.Both, params.getNavType(), MapUtil.empty());
+                params.getStartDate(), params.getEndDate(), Visibility.Both, params.getNavType());
         List<IndicatorCalcTimeRangeDto> secTimeRanges = IndicatorService.getInstance().getSecTimeRange(fundId, params.getFrequency(), allNavMap);
         List<String> secIds = this.getSecIdsByParams(params);
         List<String> indexIds = CollectionUtil.subtractToList(secIds, refIds);

+ 16 - 0
src/main/java/com/smppw/analysis/domain/mapper/core/CommonIndexMapper.java

@@ -0,0 +1,16 @@
+package com.smppw.analysis.domain.mapper.core;
+
+import com.smppw.analysis.domain.dataobject.CommonIndexDO;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author wangzaijun
+ * @date 2023/8/10 15:36
+ * @description 常用指数
+ */
+@Repository
+public interface CommonIndexMapper {
+    List<CommonIndexDO> selectList();
+}

+ 8 - 0
src/main/java/com/smppw/analysis/domain/service/BaseInfoService.java

@@ -2,6 +2,7 @@ package com.smppw.analysis.domain.service;
 
 import com.smppw.analysis.domain.dataobject.*;
 import com.smppw.analysis.domain.dto.info.FundSimilarParams;
+import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
 
@@ -15,6 +16,13 @@ import java.util.Map;
  */
 public interface BaseInfoService {
     /**
+     * 常用指数
+     *
+     * @return /
+     */
+    List<ValueLabelVO> getCommonIndexList();
+
+    /**
      * 获取排名期
      *
      * @return /

+ 2 - 3
src/main/java/com/smppw/analysis/domain/service/NavService.java

@@ -12,7 +12,7 @@ public interface NavService {
                                                                            String startDate, String endDate, NavType navType, Visibility visibility);
 
     Map<String, List<DateValue>> getSecIdDateValueNavListMapByDb(List<String> allSecIdList, String startDate, String endDate
-            , Visibility visibility, NavType navType, Map<String, Boolean> secIfExtractMap);
+            , Visibility visibility, NavType navType);
 
     Map<String, List<DateValue>> getRongzhiIndexNavMap(List<String> rongzhiIndexIdList, String startDate, String endDate, NavType navType);
 
@@ -20,6 +20,5 @@ public interface NavService {
 
     Map<String, List<DateValue>> getPubliclyOfferedFundNavMap(List<String> fundIdList, String startDate, String endDate, NavType navType, Visibility visibility);
 
-    Map<String, List<DateValue>> getPrivatelyOfferedFundNavMap(List<String> fundIdList, String startDate, String endDate, NavType navType, Visibility visibility
-            , Map<String, Boolean> secIfExtractMap);
+    Map<String, List<DateValue>> getPrivatelyOfferedFundNavMap(List<String> fundIdList, String startDate, String endDate, NavType navType, Visibility visibility);
 }

+ 13 - 0
src/main/java/com/smppw/analysis/domain/service/impl/BaseInfoServiceImpl.java

@@ -17,11 +17,13 @@ import com.smppw.analysis.domain.dto.info.FundSimilarParams;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.gateway.CacheGateway;
+import com.smppw.analysis.domain.mapper.core.CommonIndexMapper;
 import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.RedisConst;
 import com.smppw.common.cache.CaffeineLocalCache;
 import com.smppw.common.pojo.IStrategy;
+import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
 import com.smppw.common.pojo.enums.strategy.Strategy;
@@ -30,6 +32,7 @@ import com.smppw.utils.StrategyHandleUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.lang.NonNull;
@@ -57,6 +60,7 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
     public static final String AP = "AP";
     private static final Map<String, Boolean> INDEX_EXIST = MapUtil.newConcurrentHashMap();
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     private final RankDao rankDao;
     private final CacheGateway<Object> cacheGateway;
     private final IndexesProfileDao indexesProfileDao;
@@ -66,6 +70,9 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
     private final FundArchivesDao fundArchivesDao;
     private ApplicationContext applicationContext;
 
+    @Autowired
+    private CommonIndexMapper commonIndexMapper;
+
     public BaseInfoServiceImpl(AnalysisProperty property, CacheFactory factory, RankFactory rankFactory,
                                IndexesProfileDao indexesProfileDao, RongzhiIndexNavDao rongzhiIndexNavDao,
                                FundInformationDao fundInformationDao, FundAnnounceDao fundAnnounceDao, FundArchivesDao fundArchivesDao) {
@@ -84,6 +91,12 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
     }
 
     @Override
+    public List<ValueLabelVO> getCommonIndexList() {
+        List<CommonIndexDO> dataList = this.commonIndexMapper.selectList();
+        return dataList.stream().map(e -> new ValueLabelVO(e.getIndexId(), e.getIndexName())).collect(Collectors.toList());
+    }
+
+    @Override
     public String getLatestRankRat() {
         return this.rankDao.getRankDate();
     }

+ 4 - 6
src/main/java/com/smppw/analysis/domain/service/impl/NavServiceImpl.java

@@ -5,7 +5,6 @@ import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.domain.service.NavService;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.dto.NavDto;
-import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.NavType;
 import com.smppw.common.pojo.enums.Visibility;
 import com.smppw.constants.SecType;
@@ -151,7 +150,7 @@ public class NavServiceImpl implements NavService {
         Map<String, List<DateValue>> allSecNavListMap = new HashMap<>();
 
         //取DB
-        Map<String, List<DateValue>> secNavListMapDbData = getSecIdDateValueNavListMapByDb(secIds, startDate, endDate, visibility, navType, secIfExtractMap);
+        Map<String, List<DateValue>> secNavListMapDbData = getSecIdDateValueNavListMapByDb(secIds, startDate, endDate, visibility, navType);
         allSecNavListMap.putAll(secNavListMapDbData);
 
         //将取DB的标的的净值存进redis
@@ -162,7 +161,7 @@ public class NavServiceImpl implements NavService {
 
     @Override
     public Map<String, List<DateValue>> getSecIdDateValueNavListMapByDb(List<String> allSecIdList, String startDate, String endDate
-            ,Visibility visibility, NavType navType, Map<String, Boolean> secIfExtractMap) {
+            , Visibility visibility, NavType navType) {
 
         Map<String, List<DateValue>> allNavMap = new HashMap<>();
 
@@ -172,7 +171,7 @@ public class NavServiceImpl implements NavService {
         //1.市场私募净值
         List<String> marketPrivateFundIdList = secIdTypeMap.get(SecType.PRIVATELY_OFFERED_FUND);
         if (marketPrivateFundIdList != null && marketPrivateFundIdList.size() > 0) {
-            Map<String, List<DateValue>> privatelyOfferedFundNavMap = getPrivatelyOfferedFundNavMap(marketPrivateFundIdList, startDate, endDate, navType, visibility, secIfExtractMap);
+            Map<String, List<DateValue>> privatelyOfferedFundNavMap = getPrivatelyOfferedFundNavMap(marketPrivateFundIdList, startDate, endDate, navType, visibility);
             allNavMap.putAll(privatelyOfferedFundNavMap);
         }
 
@@ -231,8 +230,7 @@ public class NavServiceImpl implements NavService {
     }
 
     @Override
-    public Map<String, List<DateValue>> getPrivatelyOfferedFundNavMap(List<String> fundIdList, String startDate, String endDate, NavType navType, Visibility visibility
-            , Map<String, Boolean> secIfExtractMap) {
+    public Map<String, List<DateValue>> getPrivatelyOfferedFundNavMap(List<String> fundIdList, String startDate, String endDate, NavType navType, Visibility visibility) {
 
         //不取费后净值的ID
         List<String> notAccfilterFundIdList = new ArrayList<>();

+ 14 - 0
src/main/resources/mapping/core/CommonIndex.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.smppw.analysis.domain.mapper.core.CommonIndexMapper">
+    <select id="selectList" resultType="com.smppw.analysis.domain.dataobject.CommonIndexDO">
+        select a.id,
+               a.userid,
+               a.index_id as indexId,
+               a.index_name as indexName
+        from user_common_index a
+        where a.userid = -1
+          and a.isvalid = 1
+        order by a.id
+    </select>
+</mapper>