Преглед на файлове

业绩走势接口、头部指标计算

wangzaijun преди 1 година
родител
ревизия
9e9279d0a5
променени са 29 файла, в които са добавени 2626 реда и са изтрити 316 реда
  1. 2 0
      readme.md
  2. 18 0
      src/main/java/com/smppw/analysis/application/dto/HeadIndicatorParams.java
  3. 30 0
      src/main/java/com/smppw/analysis/application/dto/HeadIndicatorVO.java
  4. 1 1
      src/main/java/com/smppw/analysis/application/dto/RateRiskIndicatorParams.java
  5. 58 0
      src/main/java/com/smppw/analysis/application/service/CommonService.java
  6. 12 18
      src/main/java/com/smppw/analysis/application/service/PerformanceService.java
  7. 22 4
      src/main/java/com/smppw/analysis/client/FundApi.java
  8. 21 93
      src/main/java/com/smppw/analysis/domain/dao/FundInformationDao.java
  9. 30 0
      src/main/java/com/smppw/analysis/domain/dao/IndexesProfileDao.java
  10. 6 4
      src/main/java/com/smppw/analysis/domain/dao/RongzhiIndexNavDao.java
  11. 1246 0
      src/main/java/com/smppw/analysis/domain/entity/FundInformationDo.java
  12. 188 0
      src/main/java/com/smppw/analysis/domain/entity/IndexesProfileDo.java
  13. 26 0
      src/main/java/com/smppw/analysis/domain/event/CacheEventListener.java
  14. 24 0
      src/main/java/com/smppw/analysis/domain/event/SaveCacheEvent.java
  15. 29 0
      src/main/java/com/smppw/analysis/domain/gateway/CacheGateway.java
  16. 23 0
      src/main/java/com/smppw/analysis/domain/gateway/CacheVO.java
  17. 19 0
      src/main/java/com/smppw/analysis/domain/service/BaseInfoService.java
  18. 0 10
      src/main/java/com/smppw/analysis/domain/service/SecTypeService.java
  19. 182 0
      src/main/java/com/smppw/analysis/domain/service/impl/BaseInfoServiceImpl.java
  20. 6 6
      src/main/java/com/smppw/analysis/domain/service/impl/NavServiceImpl.java
  21. 0 105
      src/main/java/com/smppw/analysis/domain/service/impl/SecTypeServiceImpl.java
  22. 105 72
      src/main/java/com/smppw/analysis/infrastructure/cache/RedisService.java
  23. 71 0
      src/main/java/com/smppw/analysis/infrastructure/persistence/FundInformationDoMapper.java
  24. 34 0
      src/main/java/com/smppw/analysis/infrastructure/persistence/IndexesProfileDoMapper.java
  25. 1 1
      src/main/java/com/smppw/analysis/infrastructure/tasks/NonTradingDayTask.java
  26. 1 1
      src/main/java/com/smppw/analysis/infrastructure/tasks/RiskOfFreeIdTask.java
  27. 1 1
      src/main/java/com/smppw/analysis/infrastructure/tasks/TrendDateTask.java
  28. 352 0
      src/main/resources/mapping/FundInformationDoMapper.xml
  29. 118 0
      src/main/resources/mapping/IndexesProfileDoMapper.xml

+ 2 - 0
readme.md

@@ -1,6 +1,8 @@
 # 数据分析-详情页通用服务 (开发前必读)
 springboot3+redis+mybatis的一个标的详情页通用服务
 
+**所有来到这里的标的都是有效的!!!**
+
 ### 项目背景与目标
 > 本项目是一个使标的(基金、机构、经理、指数、组合)详情页最大化通用的项目,尽最大可能做到详情页所有组件接口不依赖
 > 非core库数据,如果存在依赖的其他外部数据源考虑是否业务相关。

+ 18 - 0
src/main/java/com/smppw/analysis/application/dto/HeadIndicatorParams.java

@@ -0,0 +1,18 @@
+package com.smppw.analysis.application.dto;
+
+import com.smppw.common.pojo.IStrategy;
+import com.smppw.common.pojo.enums.Frequency;
+import com.smppw.common.pojo.enums.NavType;
+import com.smppw.common.pojo.enums.RaiseType;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+public class HeadIndicatorParams {
+    private String secId;
+    private NavType navType;
+    private Frequency frequency;
+    private RaiseType raiseType;
+    private IStrategy strategy;
+}

+ 30 - 0
src/main/java/com/smppw/analysis/application/dto/HeadIndicatorVO.java

@@ -0,0 +1,30 @@
+package com.smppw.analysis.application.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author wangzaijun
+ * @date 2023/8/3 18:45
+ * @description 头部成立以来指标
+ */
+@Setter
+@Getter
+public class HeadIndicatorVO {
+    /**
+     * 成立以来年化收益率
+     */
+    private String annualReturn;
+    /**
+     * 成立以来年化波动率
+     */
+    private String annualStdDev;
+    /**
+     * 成立以来最大回撤
+     */
+    private String maxDrawdown;
+    /**
+     * 成立以来夏普
+     */
+    private String sharpeRatio;
+}

+ 1 - 1
src/main/java/com/smppw/analysis/application/dto/RateRiskIndicatorParams.java

@@ -10,7 +10,7 @@ import lombok.Setter;
  */
 @Setter
 @Getter
-public class RateRiskIndicatorParams extends BaseParams {
+public class IndicatorParams extends BaseParams {
     private String riskOfFreeId;
     private Double riskOfFreeValue;
     private Boolean calcExtraRet;

+ 58 - 0
src/main/java/com/smppw/analysis/application/service/CommonService.java

@@ -0,0 +1,58 @@
+package com.smppw.analysis.application.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.MapUtil;
+import com.smppw.analysis.application.dto.HeadIndicatorParams;
+import com.smppw.analysis.application.dto.HeadIndicatorVO;
+import com.smppw.analysis.application.dto.IndicatorParams;
+import com.smppw.common.pojo.enums.Indicator;
+import com.smppw.common.pojo.enums.TimeRange;
+import com.smppw.constants.Consts;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class CommonService {
+    private final PerformanceService performanceService;
+
+    public CommonService(PerformanceService performanceService) {
+        this.performanceService = performanceService;
+    }
+
+    public HeadIndicatorVO getIndicator(HeadIndicatorParams params) {
+        HeadIndicatorVO vo = new HeadIndicatorVO();
+        // 构建参数体
+        IndicatorParams param = prepareParams(params);
+        List<Indicator> indicators = ListUtil.of(Indicator.AnnualReturn, Indicator.AnnualStdDev, Indicator.MaxDrawdown, Indicator.SharpeRatio);
+        List<Indicator> geoIndicators = ListUtil.of(Indicator.IntervalReturn);
+        Map<String, Object> dataset = performanceService.calcIndicators(param, indicators, geoIndicators);
+        Map<String, Object> indicatorMap = MapUtil.get(dataset, params.getSecId(), Map.class);
+        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 null;
+    }
+
+    private IndicatorParams prepareParams(HeadIndicatorParams params) {
+        IndicatorParams rateRiskIndicatorParams = new IndicatorParams();
+        rateRiskIndicatorParams.setSecIds(CollectionUtil.newArrayList());
+        rateRiskIndicatorParams.setFundId(CollectionUtil.newArrayList(params.getSecId()));
+        rateRiskIndicatorParams.setBenchmarkId(Consts.BENCHMARK);
+        rateRiskIndicatorParams.setNavType(params.getNavType());
+        rateRiskIndicatorParams.setRaiseType(params.getRaiseType());
+        rateRiskIndicatorParams.setStrategy(params.getStrategy().getStrategyOriginName());
+        rateRiskIndicatorParams.setCalcExtraRet(false);
+        rateRiskIndicatorParams.setRiskOfFreeId(Consts.RISK_OF_FREE);
+        rateRiskIndicatorParams.setTimeRange(TimeRange.FromSetup);
+        rateRiskIndicatorParams.setFrequency(params.getFrequency());
+        rateRiskIndicatorParams.setStartDate(Consts.START_DATE);
+        rateRiskIndicatorParams.setEndDate(DateUtil.formatDate(new Date()));
+        return rateRiskIndicatorParams;
+    }
+}

+ 12 - 18
src/main/java/com/smppw/analysis/application/service/PerformanceService.java

@@ -7,12 +7,11 @@ import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.smppw.analysis.application.dto.BaseParams;
-import com.smppw.analysis.application.dto.RateRiskIndicatorParams;
+import com.smppw.analysis.application.dto.IndicatorParams;
 import com.smppw.analysis.application.dto.TrendParams;
 import com.smppw.analysis.domain.service.BaseIndicatorServiceV2;
 import com.smppw.common.exception.APIException;
 import com.smppw.common.exception.DataException;
-import com.smppw.common.pojo.CommonData;
 import com.smppw.common.pojo.IStrategy;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcIndexDataDto;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcPropertyDto;
@@ -22,7 +21,6 @@ import com.smppw.common.pojo.dto.indicator.DateIntervalDto;
 import com.smppw.common.pojo.enums.*;
 import com.smppw.constants.Consts;
 import com.smppw.core.reta.calc.PerformanceConsistency;
-import com.smppw.utils.CommonUtil;
 import com.smppw.utils.StrategyHandleUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,11 +40,11 @@ public class PerformanceService {
         this.baseIndicatorServiceV2 = baseIndicatorServiceV2;
     }
 
-    public Map<String, Object> calcIndicators(RateRiskIndicatorParams params) {
+    public Map<String, Object> calcIndicators(IndicatorParams params) {
         return this.calcIndicators(params, ListUtil.toList(Indicator.INDICATOR_TYPE_ARRAY), ListUtil.toList(Indicator.RISK_TABLE_EXCESS_INDICATOR_ARRAY));
     }
 
-    public Map<String, Object> calcIndicators(RateRiskIndicatorParams params, List<Indicator> indicators, List<Indicator> geoIndicators) {
+    public Map<String, Object> calcIndicators(IndicatorParams params, List<Indicator> indicators, List<Indicator> geoIndicators) {
         try {
             // 1.参数处理
             this.checkParams(params);
@@ -99,12 +97,7 @@ public class PerformanceService {
             }
 
             // 返回结果对象构建
-            Map<String, Object> dataset = MapUtil.builder(valuesMap).putAll(indexValuesMap).build();
-            Map<String, Object> extInfos = MapUtil.<String, Object>builder("endDate", params.getStartDate() + "~" + params.getEndDate()).build();
-//            Map<String, String> productNameMapping = this.secId2NameService.query(secIds);
-            Map<String, String> productNameMapping = MapUtil.newHashMap(); // todo
-            CommonData<Map<String, Object>> data = CommonData.<Map<String, Object>>builder().dataset(dataset).productNameMapping(productNameMapping).extInfos(extInfos).build();
-            return CommonUtil.covertToMap(data, "endDate");
+            return MapUtil.builder(valuesMap).putAll(indexValuesMap).build();
         } catch (Exception e) {
             e.printStackTrace();
             logger.error(String.format("基金收益风险指标计算错误:%s", e.getMessage()));
@@ -112,10 +105,15 @@ public class PerformanceService {
         return MapUtil.newHashMap();
     }
 
-    protected CommonData<Map<String, List<Map<String, Object>>>> handleTrends(TrendParams params, List<TrendType> trendTypes, List<TrendType> indexTrendTypes, String masterId) {
+    public Map<String, Object> trend(TrendParams params) {
+        List<TrendType> trendTypes = ListUtil.toList(TrendType.Ret, TrendType.Nav, TrendType.ExtraNav, TrendType.OrigNav, TrendType.ExtraRetAri, TrendType.NetValueChange, TrendType.ExtraRetGeo, TrendType.DrawdownTrend);
+        List<TrendType> indexTrendTypes = ListUtil.toList(TrendType.Ret, TrendType.OrigNav);
+        return this.handleTrends(params, trendTypes, indexTrendTypes);
+    }
+
+    public Map<String, Object> handleTrends(TrendParams params, List<TrendType> trendTypes, List<TrendType> indexTrendTypes) {
         // 1、参数处理
         this.checkParams(params);
-        boolean multiSec = params.multiSec();
         List<String> refIds = params.getFundId();
         List<String> secIds = this.getSecIdsByParams(params);
         List<String> indexIds = CollectionUtil.subtractToList(secIds, refIds);
@@ -148,10 +146,6 @@ public class PerformanceService {
             Map<TrendType, List<Double>> tempTrendTypeListMap = Optional.ofNullable(dto).map(IndicatorCalcPropertyDto::getSecData).map(IndicatorCalcSecDataDto::getTrendValueMap).orElse(MapUtil.empty());
             trendListMap.put(refId, MapUtil.<String, Object>builder().put("dates", tempDateList).put("trend", tempTrendTypeListMap).build());
             dataListMap.put(refId, this.buildDateValue(tempDateList, tempTrendTypeListMap, trendTypes));
-            if (masterId == null && multiSec) {
-                // 多标的的 走势图 不绘制基准走势
-                continue;
-            }
             // 指数净值和收益序列
             Map<String, Map<TrendType, List<Double>>> tempIndexTrendTypeListMap = Optional.ofNullable(dto).map(IndicatorCalcPropertyDto::getIndexData).map(IndicatorCalcIndexDataDto::getIndexTrendValueMap).orElse(MapUtil.empty());
             for (String indexId : indexIds) {
@@ -186,7 +180,7 @@ public class PerformanceService {
 //            extInfos.putAll(extInfos1);
 //            dataset.putAll(indexDataListMap);
 //        }
-        return CommonData.<Map<String, List<Map<String, Object>>>>builder().dataset(dataset).build();
+        return MapUtil.newHashMap();
     }
 
     /**

+ 22 - 4
src/main/java/com/smppw/analysis/client/FundApi.java

@@ -1,6 +1,10 @@
 package com.smppw.analysis.client;
 
-import com.smppw.analysis.application.dto.RateRiskIndicatorParams;
+import com.smppw.analysis.application.dto.HeadIndicatorParams;
+import com.smppw.analysis.application.dto.HeadIndicatorVO;
+import com.smppw.analysis.application.dto.IndicatorParams;
+import com.smppw.analysis.application.dto.TrendParams;
+import com.smppw.analysis.application.service.CommonService;
 import com.smppw.analysis.application.service.PerformanceService;
 import com.smppw.common.pojo.vo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,15 +16,29 @@ import java.util.Map;
 @RestController
 @RequestMapping("/v1/api/fund")
 public class FundApi {
+    private final CommonService commonService;
     private final PerformanceService performanceService;
 
-    public FundApi(PerformanceService performanceService) {
+    public FundApi(CommonService commonService, PerformanceService performanceService) {
+        this.commonService = commonService;
         this.performanceService = performanceService;
     }
 
-    @GetMapping("/indicators")
-    public ResultVo<Map<String, Object>> indicator(RateRiskIndicatorParams params) {
+    @GetMapping("/indicator")
+    public ResultVo<Map<String, Object>> indicator(IndicatorParams params) {
         Map<String, Object> data = this.performanceService.calcIndicators(params);
         return ResultVo.ok(data);
     }
+
+    @GetMapping("/trend")
+    public ResultVo<Map<String, Object>> trend(TrendParams params) {
+        Map<String, Object> data = this.performanceService.trend(params);
+        return ResultVo.ok(data);
+    }
+
+    @GetMapping("/head/indicator")
+    public ResultVo<HeadIndicatorVO> headIndicator(HeadIndicatorParams params) {
+        HeadIndicatorVO indicator = this.commonService.getIndicator(params);
+        return ResultVo.ok(indicator);
+    }
 }

+ 21 - 93
src/main/java/com/smppw/analysis/domain/dao/FundInformationDao.java

@@ -1,120 +1,48 @@
 package com.smppw.analysis.domain.dao;
 
 import com.smppw.analysis.domain.entity.FundFrequencyDo;
-import com.smppw.analysis.domain.service.SecTypeService;
+import com.smppw.analysis.domain.entity.FundInformationDo;
 import com.smppw.analysis.infrastructure.persistence.FundFrequencyDoMapper;
+import com.smppw.analysis.infrastructure.persistence.FundInformationDoMapper;
 import com.smppw.common.pojo.enums.Frequency;
-import com.smppw.constants.SecType;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 @Component
 public class FundInformationDao {
-    private final SecTypeService secTypeService;
     private final FundFrequencyDoMapper fundFrequencyDoMapper;
+    private final FundInformationDoMapper fundInformationDoMapper;
 
-    public FundInformationDao(SecTypeService secTypeService, FundFrequencyDoMapper fundFrequencyDoMapper) {
-        this.secTypeService = secTypeService;
+    public FundInformationDao(FundFrequencyDoMapper fundFrequencyDoMapper, FundInformationDoMapper fundInformationDoMapper) {
         this.fundFrequencyDoMapper = fundFrequencyDoMapper;
+        this.fundInformationDoMapper = fundInformationDoMapper;
     }
 
-    public Frequency getNavFrequency(String secId) {
-        Frequency frequency;
-        String fundType = secTypeService.getFundType(secId);
-        if (SecType.PRIVATELY_OFFERED_FUND.equals(fundType) ||
-                SecType.PUBLICLY_OFFERED_FUNDS.equals(fundType) ||
-                SecType.INDEX_FUND.equals(fundType) ||
-                SecType.RONGZHI_INDEX.equals(fundType)) {
-            String freq = fundFrequencyDoMapper.getNavFrequencyByFundId(secId);
-            if ("天".equals(freq)) {
+    public Map<String, Frequency> getNavFrequency(List<String> secIdList) {
+        Map<String, Frequency> secFrequencyMap = new HashMap<>();
+        List<FundFrequencyDo> fundFrequencyDos = fundFrequencyDoMapper.getNavFrequencyByFundIdList(secIdList);
+        for (FundFrequencyDo fundFrequencyDo : fundFrequencyDos) {
+            String frequencyStr = fundFrequencyDo.getNavFrequency();
+            Frequency frequency = Frequency.Monthly;
+            if ("天".equals(frequencyStr)) {
                 frequency = Frequency.Daily;
-            } else if ("周".equals(freq)) {
+            } else if ("周".equals(frequencyStr)) {
                 frequency = Frequency.Weekly;
-            } else {
-                frequency = Frequency.Monthly;
             }
-        } else {
-            frequency = Frequency.Daily;
+            secFrequencyMap.put(fundFrequencyDo.getFundId(), frequency);
         }
-        return frequency;
+        return secFrequencyMap;
     }
 
-    public Map<String, Frequency> getNavFrequency(List<String> secIdList) {
-        Map<String, Frequency> secFrequencyMap = new HashMap<>();
-
-        Map<String, List<String>> secIdTypeMap = secTypeService.getSecIdTypeMap(secIdList);
-
-        List<String> marketIdList = new ArrayList<>();
-        List<String> marketPublicFundIdList = secIdTypeMap.get(SecType.PUBLICLY_OFFERED_FUNDS);
-        List<String> marketPrivateFundIdList = secIdTypeMap.get(SecType.PRIVATELY_OFFERED_FUND);
-        List<String> marketIndexIdList = secIdTypeMap.get(SecType.INDEX_FUND);
-        List<String> marketRongzhiIndexIdList = secIdTypeMap.get(SecType.RONGZHI_INDEX);
-        List<String> marketCompanyIdList = secIdTypeMap.get(SecType.COMPANY);
-        List<String> marketManagerIdList = secIdTypeMap.get(SecType.MANAGER);
-        if (marketPublicFundIdList != null) {
-            marketIdList.addAll(marketPublicFundIdList);
-        }
-        if (marketPrivateFundIdList != null) {
-            marketIdList.addAll(marketPrivateFundIdList);
-        }
-        if (marketIndexIdList != null) {
-            marketIdList.addAll(marketIndexIdList);
-        }
-        if (marketRongzhiIndexIdList != null) {
-            marketIdList.addAll(marketRongzhiIndexIdList);
-        }
-        if (marketCompanyIdList != null) {
-            marketIdList.addAll(marketCompanyIdList);
-        }
-        if (marketManagerIdList != null) {
-            marketIdList.addAll(marketManagerIdList);
-        }
-
-        if (marketIdList.size() > 0) {
-            List<FundFrequencyDo> fundFrequencyDos = fundFrequencyDoMapper.getNavFrequencyByFundIdList(marketIdList);
-            for (FundFrequencyDo fundFrequencyDo : fundFrequencyDos) {
-                String frequencyStr = fundFrequencyDo.getNavFrequency();
-                Frequency frequency = Frequency.Monthly;
-                if ("天".equals(frequencyStr)) {
-                    frequency = Frequency.Daily;
-                } else if ("周".equals(frequencyStr)) {
-                    frequency = Frequency.Weekly;
-                }
-                secFrequencyMap.put(fundFrequencyDo.getFundId(), frequency);
-            }
+    public Map<String, String> getMarketFundIdNameMap(List<String> fundIdList) {
+        List<FundInformationDo> fundInformationDos = fundInformationDoMapper.listFundInfo(fundIdList);
+        Map<String, String> fundIdNameMap = new HashMap<>();
+        for (FundInformationDo fundInformationDo : fundInformationDos) {
+            fundIdNameMap.put(fundInformationDo.getFundId(), fundInformationDo.getFundShortName());
         }
-
-//        List<String> privateIdList = new ArrayList<>();
-//        List<String> privateFundIdList = secIdTypeMap.get(SecType.PRIVATE_FUND);
-//        List<String> factorIdList = secIdTypeMap.get(SecType.FACTOR);
-//        List<String> udfIndexIdList = secIdTypeMap.get(SecType.UDF_INDEX);
-//        if (privateFundIdList != null) {
-//            privateIdList.addAll(privateFundIdList);
-//        }
-//        if (factorIdList != null) {
-//            privateIdList.addAll(factorIdList);
-//        }
-//        if (udfIndexIdList != null) {
-//            privateIdList.addAll(udfIndexIdList);
-//        }
-//        if (privateIdList != null && privateIdList.size() > 0) {
-//            List<CmFundFrequencyDo> cmFundFrequencyDos = cmFundFrequencyDoMapper.getNavFrequencyByFundIdList(privateIdList);
-//            for (CmFundFrequencyDo cmFundFrequencyDo : cmFundFrequencyDos) {
-//                String frequencyStr = cmFundFrequencyDo.getNavFrequency();
-//                Frequency frequency = Frequency.Monthly;
-//                if ("天".equals(frequencyStr)) {
-//                    frequency = Frequency.Daily;
-//                } else if ("周".equals(frequencyStr)) {
-//                    frequency = Frequency.Weekly;
-//                }
-//                secFrequencyMap.put(cmFundFrequencyDo.getFundId(), frequency);
-//            }
-//        }
-
-        return secFrequencyMap;
+        return fundIdNameMap;
     }
 }

+ 30 - 0
src/main/java/com/smppw/analysis/domain/dao/IndexesProfileDao.java

@@ -0,0 +1,30 @@
+package com.smppw.analysis.domain.dao;
+
+import com.smppw.analysis.domain.entity.IndexesProfileDo;
+import com.smppw.analysis.infrastructure.persistence.IndexesProfileDoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class IndexesProfileDao {
+
+    @Autowired
+    private IndexesProfileDoMapper indexesProfileDoMapper;
+
+    public Map<String, String> getFundIdNameMap(List<String> indexIdList) {
+        List<IndexesProfileDo> fundInformationDos = indexesProfileDoMapper.listFundIdAndFundShortName(indexIdList);
+        Map<String, String> fundIdNameMap = new HashMap<>();
+        for (IndexesProfileDo fundInformationDo : fundInformationDos) {
+            fundIdNameMap.put(fundInformationDo.getIndexId(), fundInformationDo.getIndexShortName());
+        }
+        return fundIdNameMap;
+    }
+
+    public List<IndexesProfileDo> listInfoByIndexIdList(List<String> indexIdList) {
+        return indexesProfileDoMapper.listInfoByIndexIdList(indexIdList);
+    }
+}

+ 6 - 4
src/main/java/com/smppw/analysis/domain/dao/RongzhiIndexNavDao.java

@@ -8,10 +8,7 @@ import com.smppw.utils.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Repository
 public class RongzhiIndexNavDao {
@@ -19,6 +16,11 @@ public class RongzhiIndexNavDao {
     @Autowired
     private IndexesRzIndexDoMapper indexesRzIndexDoMapper;
 
+    public Boolean isExist(String indexId) {
+        Integer exist = this.indexesRzIndexDoMapper.isExist(indexId);
+        return Objects.equals(1, exist);
+    }
+
     public Map<String, List<NavDto>> getNav(List<String> indexIdList, String startDate, String endDate, boolean needUpdateAndCreateTime) {
         List<IndexesRzIndexDo> navDoList = indexesRzIndexDoMapper.listNavByTimeInterval(indexIdList, startDate, endDate, needUpdateAndCreateTime);
         return navDoListToNavDtoMap(navDoList);

Файловите разлики са ограничени, защото са твърде много
+ 1246 - 0
src/main/java/com/smppw/analysis/domain/entity/FundInformationDo.java


+ 188 - 0
src/main/java/com/smppw/analysis/domain/entity/IndexesProfileDo.java

@@ -0,0 +1,188 @@
+package com.smppw.analysis.domain.entity;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+    * 指数基本信息表
+    */
+@Data
+public class IndexesProfileDo {
+    /**
+    * id
+    */
+    private Integer id;
+
+    /**
+    * 指数Id
+    */
+    private String indexId;
+
+    /**
+    * 指数类型,见池库基础参数表
+    */
+    private Integer indexType;
+
+    /**
+    * 指数二级类型,见池库基础参数表
+    */
+    private Integer indexTypeSecond;
+
+    /**
+    * 指数三级类型,见池库基础参数表
+    */
+    private Integer indexTypeThird;
+
+    /**
+    * 指数类型:1-对冲基金指数、2-信心指数、3-公募基金指数、4-沪深港股票指数、5-全球股票指数、6-金汇期指、7-无风险利率、-1-其他
+    */
+    private Integer indexTypeId;
+
+    /**
+    * 指数代码
+    */
+    private String indexCode;
+
+    /**
+    * 指数中文全称
+    */
+    private String indexName;
+
+    /**
+    * 指数中文简称
+    */
+    private String indexShortName;
+
+    /**
+    * 1-中国,2-全球
+    */
+    private Integer indexAreaFlag;
+
+    /**
+    * 指数提供机构ID
+    */
+    private String indexFamilyId;
+
+    /**
+    * 指数发布周期,1-日度、2-周、3-月度、4-季度、5-半年度、6-年度
+
+    */
+    private Integer pricingFrequency;
+
+    /**
+    * 指数基期,指数开始日期
+    */
+    private Date inceptionDate;
+
+    /**
+    * 指数基点
+    */
+    private BigDecimal indexInitialValue;
+
+    /**
+    * 计算指数所使用的货币,1-人民币、2-港币、3-美元、4-新加坡元、-1-不详
+    */
+    private Integer baseCurrency;
+
+    /**
+    * 编制指数所使用的计算方法
+    */
+    private String calculationMethod;
+
+    /**
+    * 计算成份基金权重的方法
+    */
+    private String weightingScheme;
+
+    /**
+    * 成份基金筛选方法
+    */
+    private String selectionScheme;
+
+    /**
+    * 指数重构周期,1-周、2-月度、3-季度、4-半年度、5-年度、-1-其他
+    */
+    private Integer reconstitutionFrequency;
+
+    /**
+    * 指数调整周期,1-周、2-月度、3-季度、4-半年度、5-年度、-1-其他
+    */
+    private Integer rebalanceFrequency;
+
+    /**
+    * 是否可见:1-是,0-否
+    */
+    private Byte isvisible;
+
+    /**
+    * 创建者Id,默认第一次创建者名称,创建后不变更
+    */
+    private Integer creatorid;
+
+    /**
+    * 创建时间,默认第一次创建的getdate()时间
+    */
+    private Date createtime;
+
+    /**
+    * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+    */
+    private Integer updaterid;
+
+    /**
+    * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+    */
+    private Date updatetime;
+
+    /**
+    * 记录的有效性;1-有效;0-无效;
+    */
+    private Byte isvalid;
+
+    /**
+    * 质检员ID
+    */
+    private String qc;
+
+    /**
+    * 质检日期
+    */
+    private Date qcdate;
+
+    /**
+    * 质检状态
+    */
+    private Integer qcstate;
+
+    /**
+    * 审核人员ID
+    */
+    private String auditor;
+
+    /**
+    * 审核时间
+    */
+    private Date auditdate;
+
+    /**
+    * 审核状态
+    */
+    private Integer auditstate;
+
+    /**
+    * 质检员意见
+    */
+    private String qcremark;
+
+    /**
+    * 审核员意见
+    */
+    private String auditremark;
+
+    /**
+    * 备注
+    */
+    private String remark;
+}

+ 26 - 0
src/main/java/com/smppw/analysis/domain/event/CacheEventListener.java

@@ -0,0 +1,26 @@
+package com.smppw.analysis.domain.event;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.smppw.analysis.domain.gateway.CacheGateway;
+import com.smppw.analysis.domain.gateway.CacheVO;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CacheEventListener {
+    @EventListener(value = {SaveCacheEvent.class})
+    public void saveCache(SaveCacheEvent<Object> event) {
+        CacheGateway<Object> cacheGateway = event.getCacheGateway();
+        CacheVO<Object> cacheTarget = event.getCacheTarget();
+        CacheVO.CacheType type = cacheTarget.getType();
+        if (type == CacheVO.CacheType.HASH) {
+            Object value = cacheTarget.getValue();
+            JSONObject entries = JSONUtil.parseObj(JSONUtil.toJsonStr(value));
+            cacheGateway.hset(cacheTarget.getKey(), entries);
+        } else if (type == CacheVO.CacheType.STR) {
+            cacheGateway.set(cacheTarget.getKey(), cacheTarget.getValue());
+        }
+        cacheGateway.expire(cacheTarget.getKey(), cacheTarget.getTtl(), cacheTarget.getTimeUnit());
+    }
+}

+ 24 - 0
src/main/java/com/smppw/analysis/domain/event/SaveCacheEvent.java

@@ -0,0 +1,24 @@
+package com.smppw.analysis.domain.event;
+
+import com.smppw.analysis.domain.gateway.CacheGateway;
+import com.smppw.analysis.domain.gateway.CacheVO;
+import org.springframework.context.ApplicationEvent;
+
+public class SaveCacheEvent<T> extends ApplicationEvent {
+    private final CacheVO<T> cacheTarget;
+    private final CacheGateway<Object> cacheGateway;
+
+    public SaveCacheEvent(Object source, CacheGateway<Object> cacheGateway, CacheVO<T> cacheTarget) {
+        super(source);
+        this.cacheTarget = cacheTarget;
+        this.cacheGateway = cacheGateway;
+    }
+
+    public CacheVO<T> getCacheTarget() {
+        return cacheTarget;
+    }
+
+    public CacheGateway<Object> getCacheGateway() {
+        return cacheGateway;
+    }
+}

+ 29 - 0
src/main/java/com/smppw/analysis/domain/gateway/CacheGateway.java

@@ -0,0 +1,29 @@
+package com.smppw.analysis.domain.gateway;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public interface CacheGateway<V> {
+    Boolean hasKey(String key);
+
+    boolean expire(String key, long ttl, TimeUnit timeUnit);
+
+    boolean set(String key, V value);
+
+    boolean set(String key, V value, long ttl, TimeUnit timeUnit);
+
+    V get(String key);
+
+    void delete(List<String> keys);
+
+    boolean hset(String key, Map<String, V> values);
+
+    boolean hset(String key, String item, V value);
+
+    boolean hset(String key, String item, V value, long ttl, TimeUnit timeUnit);
+
+    Map<String, V> hget(String key);
+
+    V hget(String key, String item);
+}

+ 23 - 0
src/main/java/com/smppw/analysis/domain/gateway/CacheVO.java

@@ -0,0 +1,23 @@
+package com.smppw.analysis.domain.gateway;
+
+import lombok.*;
+
+import java.util.concurrent.TimeUnit;
+
+@Setter
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class CacheVO<V> {
+    private CacheType type;
+    private String key;
+    private V value;
+    private long ttl;
+    private TimeUnit timeUnit;
+
+    // 仅支持str、hash
+    public enum CacheType {
+        STR, HASH
+    }
+}

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

@@ -0,0 +1,19 @@
+package com.smppw.analysis.domain.service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wangzaijun
+ * @date 2023/8/3 15:42
+ * @description 基础信息服务
+ */
+public interface BaseInfoService {
+    String getFundType(String fundId);
+
+    Map<String, List<String>> getTypeSecMap(List<String> secIdList);
+
+    Map<String, String> querySecType(List<String> secIdList);
+
+    Map<String, String> querySecName(List<String> allSecIdList);
+}

+ 0 - 10
src/main/java/com/smppw/analysis/domain/service/SecTypeService.java

@@ -1,10 +0,0 @@
-package com.smppw.analysis.domain.service;
-
-import java.util.List;
-import java.util.Map;
-
-public interface SecTypeService {
-    String getFundType(String fundId);
-
-    Map<String, List<String>> getSecIdTypeMap(List<String> secIdList);
-}

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

@@ -0,0 +1,182 @@
+package com.smppw.analysis.domain.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
+import com.smppw.analysis.domain.dao.FundInformationDao;
+import com.smppw.analysis.domain.dao.IndexesProfileDao;
+import com.smppw.analysis.domain.dao.RongzhiIndexNavDao;
+import com.smppw.analysis.domain.event.SaveCacheEvent;
+import com.smppw.analysis.domain.gateway.CacheGateway;
+import com.smppw.analysis.domain.gateway.CacheVO;
+import com.smppw.analysis.domain.service.BaseInfoService;
+import com.smppw.common.cache.CaffeineLocalCache;
+import com.smppw.common.pojo.enums.strategy.Strategy;
+import com.smppw.constants.SecType;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@Service
+public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextAware {
+    public static final String HF = "HF";
+    public static final String MF = "MF";
+    public static final String CF = "CF";
+    public static final String FA = "FA";
+    public static final String CI = "CI";
+    public static final String CO = "CO";
+    public static final String PL = "PL";
+    public static final String PO = "PO";
+    public static final String IN = "IN";
+    public static final String AP = "AP";
+    private static final Map<String, Boolean> INDEX_EXIST = MapUtil.newConcurrentHashMap();
+
+    private final CacheGateway<Object> cacheGateway;
+    private final IndexesProfileDao indexesProfileDao;
+    private final RongzhiIndexNavDao rongzhiIndexNavDao;
+    private final FundInformationDao fundInformationDao;
+    private ApplicationContext applicationContext;
+
+    public BaseInfoServiceImpl(CacheGateway<Object> cacheGateway, IndexesProfileDao indexesProfileDao,
+                               RongzhiIndexNavDao rongzhiIndexNavDao, FundInformationDao fundInformationDao) {
+        this.cacheGateway = cacheGateway;
+        this.indexesProfileDao = indexesProfileDao;
+        this.rongzhiIndexNavDao = rongzhiIndexNavDao;
+        this.fundInformationDao = fundInformationDao;
+    }
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        this.applicationContext = applicationContext;
+    }
+
+    @Override
+    public String getFundType(String fundId) {
+        if (fundId == null) {
+            return null;
+        }
+        if (fundId.startsWith(HF)) {
+            return SecType.PRIVATELY_OFFERED_FUND;
+        } else if (fundId.startsWith(MF)) {
+            return SecType.PUBLICLY_OFFERED_FUNDS;
+        } else if (fundId.startsWith(CF)) {
+            return SecType.PRIVATE_FUND;
+        } else if (fundId.startsWith(FA)) {
+            return SecType.FACTOR;
+        } else if (fundId.startsWith(CI)) {
+            return SecType.UDF_INDEX;
+        } else if (fundId.startsWith(CO)) {
+            return SecType.COMPANY;
+        } else if (fundId.startsWith(PL)) {
+            return SecType.MANAGER;
+        } else if (fundId.startsWith(PO)) {
+            return SecType.COMBINATION;
+        } else if (StrUtil.isNumeric(fundId)) {
+            if (Strategy.isStrategy(fundId)) {
+                return SecType.STRATEGY;
+            }
+        } else if (fundId.startsWith(IN)) {
+            List<String> thirdIndexes = CaffeineLocalCache.getThirdIndexes();
+            if (thirdIndexes != null && thirdIndexes.contains(fundId)) {
+                return SecType.THIRD_INDEX_FUND;
+            }
+            List<String> riskOfFreeIdList = CaffeineLocalCache.getRiskOfFreeId();
+            if (riskOfFreeIdList != null && riskOfFreeIdList.contains(fundId)) {
+                return SecType.RISK_OF_FREE;
+            }
+            Boolean isExist = INDEX_EXIST.get(fundId);
+            if (isExist == null) {
+                isExist = rongzhiIndexNavDao.isExist(fundId);
+                INDEX_EXIST.put(fundId, isExist);
+            }
+            if (isExist) {
+                return SecType.INDEX_FUND;
+            } else {
+                return SecType.RONGZHI_INDEX;
+            }
+        } else if (fundId.startsWith(AP)) {
+            return SecType.ADVISORY_POOL_CURVE;
+        }
+        return null;
+    }
+
+    @Override
+    public Map<String, List<String>> getTypeSecMap(List<String> secIdList) {
+        Map<String, List<String>> secIdTypeMap = new HashMap<>(10);
+        for (String secId : secIdList) {
+            String secIdType = getFundType(secId);
+            if (secIdTypeMap.containsKey(secIdType)) {
+                List<String> list = secIdTypeMap.get(secIdType);
+                list.add(secId);
+            } else {
+                List<String> list = new ArrayList<>();
+                list.add(secId);
+                secIdTypeMap.put(secIdType, list);
+            }
+        }
+        return secIdTypeMap;
+    }
+
+    @Override
+    public Map<String, String> querySecType(List<String> secIdList) {
+        if (CollUtil.isEmpty(secIdList)) {
+            return MapUtil.newHashMap(8);
+        }
+        return secIdList.stream().collect(Collectors.toMap(e -> e, this::getFundType));
+    }
+
+    @Override
+    public Map<String, String> querySecName(List<String> allSecIdList) {
+        if (CollUtil.isEmpty(allSecIdList)) {
+            return MapUtil.empty();
+        }
+        int size = allSecIdList.size();
+        String key = "info:secName";
+        Map<String, Object> hget = this.cacheGateway.hget(key);
+        Map<Boolean, List<String>> redisSecMap = allSecIdList.stream().collect(Collectors.groupingBy(hget::containsKey));
+        List<String> redisSecIds = redisSecMap.get(Boolean.TRUE);
+        List<String> noRedisSecIds = redisSecMap.get(Boolean.FALSE);
+        Map<String, Object> secNameMap = MapUtil.newHashMap(size, false);
+        if (CollUtil.isNotEmpty(noRedisSecIds)) {
+            Map<String, List<String>> typeSecMap = this.getTypeSecMap(noRedisSecIds);
+            // 市场基金
+            List<String> marketFundIds = ListUtil.list(true);
+            CollUtil.addAllIfNotContains(marketFundIds, typeSecMap.getOrDefault(SecType.PRIVATELY_OFFERED_FUND, ListUtil.empty()));
+            CollUtil.addAllIfNotContains(marketFundIds, typeSecMap.getOrDefault(SecType.PUBLICLY_OFFERED_FUNDS, ListUtil.empty()));
+            if (CollUtil.isNotEmpty(marketFundIds)) {
+                Map<String, String> marketFundIdNameMap = fundInformationDao.getMarketFundIdNameMap(marketFundIds);
+                secNameMap.putAll(marketFundIdNameMap);
+            }
+            // 市场指数
+            List<String> marketIndexIds = ListUtil.list(true);
+            CollUtil.addAllIfNotContains(marketIndexIds, typeSecMap.getOrDefault(SecType.INDEX_FUND, ListUtil.empty()));
+            CollUtil.addAllIfNotContains(marketIndexIds, typeSecMap.getOrDefault(SecType.RONGZHI_INDEX, ListUtil.empty()));
+            CollUtil.addAllIfNotContains(marketIndexIds, typeSecMap.getOrDefault(SecType.THIRD_INDEX_FUND, ListUtil.empty()));
+            if (CollUtil.isNotEmpty(marketIndexIds)) {
+                Map<String, String> marketFundIdNameMap = indexesProfileDao.getFundIdNameMap(marketIndexIds);
+                secNameMap.putAll(marketFundIdNameMap);
+            }
+            // todo 其他(机构、经理、组合)
+            // 推送事件,存缓存
+            CacheVO<Map<String, Object>> vo = CacheVO.<Map<String, Object>>builder().key(key)
+                    .type(CacheVO.CacheType.HASH).value(secNameMap).ttl(1).timeUnit(TimeUnit.DAYS).build();
+            this.applicationContext.publishEvent(new SaveCacheEvent<>(this, this.cacheGateway, vo));
+        }
+        // 解决乱序问题
+        Map<String, String> result = MapUtil.newHashMap(size, true);
+        for (String secId : allSecIdList) {
+            String name = redisSecIds.contains(secId) ? MapUtil.getStr(hget, secId) : MapUtil.getStr(secNameMap, secId);
+            result.put(secId, name);
+        }
+        return result;
+    }
+}

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

@@ -1,8 +1,8 @@
 package com.smppw.analysis.domain.service.impl;
 
 import com.smppw.analysis.domain.dao.*;
+import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.domain.service.NavService;
-import com.smppw.analysis.domain.service.SecTypeService;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.dto.NavDto;
 import com.smppw.common.pojo.enums.Frequency;
@@ -27,7 +27,7 @@ public class NavServiceImpl implements NavService {
 //    private RedissonClient redissonClient;
 //
     @Autowired
-    private SecTypeService secTypeService;
+    private BaseInfoService baseInfoService;
     //
 //    @Autowired
 //    private FundInformationDao fundInformationDao;
@@ -39,7 +39,7 @@ public class NavServiceImpl implements NavService {
     private PrivatelyOfferedFundNavDao privatelyOfferedFundNavDao;
     @Autowired
     private PubliclyOfferedFundNavDao publiclyOfferedFundNavDao;
-//
+    //
 //    @Autowired
 //    private CombinationNavDao combinationNavDao;
     //
@@ -51,7 +51,7 @@ public class NavServiceImpl implements NavService {
 //
     @Autowired
     private MarketIndexNavDao marketIndexNavDao;
-//
+    //
 //    @Autowired
 //    private UdfIndexNavDao udfIndexNavDao;
 //
@@ -68,7 +68,7 @@ public class NavServiceImpl implements NavService {
 //    private ThirdIndexNavDao thirdIndexNavDao;
     @Autowired
     private RongzhiIndexNavDao rongzhiIndexNavDao;
-//
+    //
 //    @Autowired
 //    private CmFittedAccruedCurveDao cmFittedAccruedCurveDao;
 //
@@ -168,7 +168,7 @@ public class NavServiceImpl implements NavService {
         Map<String, List<DateValue>> allNavMap = new HashMap<>();
 
         //对secId进行分类
-        Map<String, List<String>> secIdTypeMap = secTypeService.getSecIdTypeMap(allSecIdList);
+        Map<String, List<String>> secIdTypeMap = baseInfoService.getTypeSecMap(allSecIdList);
 
         //1.市场私募净值
         List<String> marketPrivateFundIdList = secIdTypeMap.get(SecType.PRIVATELY_OFFERED_FUND);

+ 0 - 105
src/main/java/com/smppw/analysis/domain/service/impl/SecTypeServiceImpl.java

@@ -1,105 +0,0 @@
-package com.smppw.analysis.domain.service.impl;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import com.smppw.analysis.infrastructure.persistence.IndexesRzIndexDoMapper;
-import com.smppw.analysis.domain.service.SecTypeService;
-import com.smppw.common.cache.CaffeineLocalCache;
-import com.smppw.common.pojo.enums.strategy.Strategy;
-import com.smppw.constants.SecType;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Rain
- * @date 2023/3/16 10:03
- * @description
- */
-@Service
-public class SecTypeServiceImpl implements SecTypeService {
-    public static final String HF = "HF";
-    public static final String MF = "MF";
-    public static final String CF = "CF";
-    public static final String FA = "FA";
-    public static final String CI = "CI";
-    public static final String CO = "CO";
-    public static final String PL = "PL";
-    public static final String PO = "PO";
-    public static final String IN = "IN";
-    public static final String AP = "AP";
-    private static final Map<String, Integer> INDEX_EXIST = MapUtil.newConcurrentHashMap();
-    @Autowired
-    private IndexesRzIndexDoMapper indexesRzIndexDoMapper;
-
-    @Override
-    public String getFundType(String fundId) {
-        if (fundId == null) {
-            return null;
-        }
-        if (fundId.startsWith(HF)) {
-            return SecType.PRIVATELY_OFFERED_FUND;
-        } else if (fundId.startsWith(MF)) {
-            return SecType.PUBLICLY_OFFERED_FUNDS;
-        } else if (fundId.startsWith(CF)) {
-            return SecType.PRIVATE_FUND;
-        } else if (fundId.startsWith(FA)) {
-            return SecType.FACTOR;
-        } else if (fundId.startsWith(CI)) {
-            return SecType.UDF_INDEX;
-        } else if (fundId.startsWith(CO)) {
-            return SecType.COMPANY;
-        } else if (fundId.startsWith(PL)) {
-            return SecType.MANAGER;
-        } else if (fundId.startsWith(PO)) {
-            return SecType.COMBINATION;
-        } else if (StrUtil.isNumeric(fundId)) {
-            if (Strategy.isStrategy(fundId)) {
-                return SecType.STRATEGY;
-            }
-        } else if (fundId.startsWith(IN)) {
-            List<String> thirdIndexes = CaffeineLocalCache.getThirdIndexes();
-            if (thirdIndexes != null && thirdIndexes.contains(fundId)) {
-                return SecType.THIRD_INDEX_FUND;
-            }
-            List<String> riskOfFreeIdList = CaffeineLocalCache.getRiskOfFreeId();
-            if (riskOfFreeIdList != null && riskOfFreeIdList.contains(fundId)) {
-                return SecType.RISK_OF_FREE;
-            }
-            Integer isExist = INDEX_EXIST.get(fundId);
-            if (isExist == null) {
-                isExist = indexesRzIndexDoMapper.isExist(fundId);
-                INDEX_EXIST.put(fundId, isExist);
-            }
-            if (isExist.compareTo(0) == 0) {
-                return SecType.INDEX_FUND;
-            } else {
-                return SecType.RONGZHI_INDEX;
-            }
-        } else if (fundId.startsWith(AP)) {
-            return SecType.ADVISORY_POOL_CURVE;
-        }
-        return null;
-    }
-
-    @Override
-    public Map<String, List<String>> getSecIdTypeMap(List<String> secIdList) {
-        Map<String, List<String>> secIdTypeMap = new HashMap<>(10);
-        for (String secId : secIdList) {
-            String secIdType = getFundType(secId);
-            if (secIdTypeMap.containsKey(secIdType)) {
-                List<String> list = secIdTypeMap.get(secIdType);
-                list.add(secId);
-            } else {
-                List<String> list = new ArrayList<>();
-                list.add(secId);
-                secIdTypeMap.put(secIdType, list);
-            }
-        }
-        return secIdTypeMap;
-    }
-}

+ 105 - 72
src/main/java/com/smppw/analysis/infrastructure/cache/RedisService.java

@@ -1,8 +1,9 @@
-package com.smppw.analysis.infrastructure.cache;
+package com.smppw.analysis.infrastructure.gatewayimpl;
 
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
+import com.smppw.analysis.domain.gateway.CacheGateway;
 import org.springframework.dao.DataAccessException;
 import org.springframework.data.redis.connection.RedisConnection;
 import org.springframework.data.redis.core.HashOperations;
@@ -16,13 +17,13 @@ import org.springframework.util.CollectionUtils;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
-@Component
-public class RedisService {
+@Component("cache-redis")
+public class RedisCacheGateway implements CacheGateway<Object> {
     private final RedisTemplate<String, Object> _redisTemplate;
     private final HashOperations<String, String, Object> _hashOperations;
     private final HashMapper<Object, String, Object> _hashMapper;
 
-    public RedisService(RedisTemplate<String, Object> _redisTemplate) {
+    public RedisCacheGateway(RedisTemplate<String, Object> _redisTemplate) {
         this._redisTemplate = _redisTemplate;
         this._hashOperations = _redisTemplate.opsForHash();
         this._hashMapper = new Jackson2HashMapper(true);
@@ -38,10 +39,10 @@ public class RedisService {
      * @param time 时间(秒)
      * @return /
      */
-    public boolean expire(String key, long time) {
+    public boolean expire(String key, long time, TimeUnit timeUnit) {
         try {
             if (time > 0) {
-                _redisTemplate.expire(key, time, TimeUnit.SECONDS);
+                _redisTemplate.expire(key, time, timeUnit);
             }
             return true;
         } catch (Exception e) {
@@ -73,6 +74,17 @@ public class RedisService {
         return _redisTemplate.hasKey(key);
     }
 
+    @Override
+    public void delete(List<String> keys) {
+        if (keys != null && keys.size() > 0) {
+            if (keys.size() == 1) {
+                _redisTemplate.delete(keys.get(0));
+            } else {
+                _redisTemplate.delete(keys);
+            }
+        }
+    }
+
     /**
      * 删除缓存
      *
@@ -139,6 +151,16 @@ public class RedisService {
         }
     }
 
+    public boolean set(String key, Object value, long ttl, TimeUnit timeUnit) {
+        try {
+            _redisTemplate.opsForValue().set(key, value, ttl, timeUnit);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
     /**
      * Description: 如果key存在, 则返回false, 如果不存在,
      * 则将key=value放入redis中, 并返回true
@@ -204,6 +226,17 @@ public class RedisService {
 
     // ================================Map=================================
 
+    @Override
+    public boolean hset(String key, Map<String, Object> values) {
+        try {
+            _redisTemplate.opsForHash().putAll(key, values);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
     /**
      * HashGet
      *
@@ -221,8 +254,8 @@ public class RedisService {
      * @param key 键
      * @return 对应的多个键值
      */
-    public Map<Object, Object> hmget(String key) {
-        return _redisTemplate.opsForHash().entries(key);
+    public Map<String, Object> hget(String key) {
+        return _redisTemplate.<String, Object>opsForHash().entries(key);
     }
 
     /**
@@ -293,48 +326,48 @@ public class RedisService {
         }
     }
 
-    /**
-     * HashSet 并设置时间
-     *
-     * @param key  键
-     * @param map  对应多个键值
-     * @param time 时间(秒)
-     * @return true成功 false失败
-     */
-    public boolean hmset(String key, Map<String, Object> map, long time) {
-        try {
-            _redisTemplate.opsForHash().putAll(key, map);
-            if (time > 0) {
-                expire(key, time);
-            }
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
-
-    /**
-     * 使用hset对指定键放入对象的所有值,并设置过期时间
-     *
-     * @param key     键
-     * @param v_obj   对象
-     * @param <T>对象类型
-     * @return 是否成功
-     */
-    public <T> boolean hmsetObject(String key, T v_obj, long time) {
-        try {
-            Map<String, Object> mappedHash = _hashMapper.toHash(v_obj);
-            _hashOperations.putAll(key, mappedHash);
-            if (time > 0) {
-                expire(key, time);
-            }
-            return true;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return false;
-        }
-    }
+//    /**
+//     * HashSet 并设置时间
+//     *
+//     * @param key  键
+//     * @param map  对应多个键值
+//     * @param time 时间(秒)
+//     * @return true成功 false失败
+//     */
+//    public boolean hmset(String key, Map<String, Object> map, long time) {
+//        try {
+//            _redisTemplate.opsForHash().putAll(key, map);
+//            if (time > 0) {
+//                expire(key, time);
+//            }
+//            return true;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return false;
+//        }
+//    }
+//
+//    /**
+//     * 使用hset对指定键放入对象的所有值,并设置过期时间
+//     *
+//     * @param key     键
+//     * @param v_obj   对象
+//     * @param <T>对象类型
+//     * @return 是否成功
+//     */
+//    public <T> boolean hmsetObject(String key, T v_obj, long time) {
+//        try {
+//            Map<String, Object> mappedHash = _hashMapper.toHash(v_obj);
+//            _hashOperations.putAll(key, mappedHash);
+//            if (time > 0) {
+//                expire(key, time);
+//            }
+//            return true;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return false;
+//        }
+//    }
 
     /**
      * 向一张hash表中放入数据,如果不存在将创建
@@ -363,11 +396,11 @@ public class RedisService {
      * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
      * @return true 成功 false失败
      */
-    public boolean hset(String key, String item, Object value, long time) {
+    public boolean hset(String key, String item, Object value, long time, TimeUnit timeUnit) {
         try {
             _redisTemplate.opsForHash().put(key, item, value);
             if (time > 0) {
-                expire(key, time);
+                expire(key, time, timeUnit);
             }
             return true;
         } catch (Exception e) {
@@ -469,26 +502,26 @@ public class RedisService {
         }
     }
 
-    /**
-     * 将set数据放入缓存
-     *
-     * @param key    键
-     * @param time   时间(秒)
-     * @param values 值 可以是多个
-     * @return 成功个数
-     */
-    public Long sSetAndTime(String key, long time, Object... values) {
-        try {
-            Long count = _redisTemplate.opsForSet().add(key, values);
-            if (time > 0) {
-                expire(key, time);
-            }
-            return count;
-        } catch (Exception e) {
-            e.printStackTrace();
-            return 0L;
-        }
-    }
+//    /**
+//     * 将set数据放入缓存
+//     *
+//     * @param key    键
+//     * @param time   时间(秒)
+//     * @param values 值 可以是多个
+//     * @return 成功个数
+//     */
+//    public Long sSetAndTime(String key, long time, Object... values) {
+//        try {
+//            Long count = _redisTemplate.opsForSet().add(key, values);
+//            if (time > 0) {
+//                expire(key, time);
+//            }
+//            return count;
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            return 0L;
+//        }
+//    }
 
     /**
      * 获取set缓存的长度

+ 71 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/FundInformationDoMapper.java

@@ -0,0 +1,71 @@
+package com.smppw.analysis.infrastructure.persistence;
+
+import com.smppw.analysis.domain.entity.FundInformationDo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public interface FundInformationDoMapper {
+
+    List<String> listFundIdByFundIdListAndVisibilityId(@Param("fundIdList") List<String> fundIdList, @Param("visibilityId") int visibilityId);
+
+    /**
+     * 私募管理人:获取基金id
+     *
+     * @param fundIdList   基金ids
+     * @param visibilityId 是否可见
+     * @return /
+     */
+    List<String> listFundIdByFundIdsAndVisibilityIdForInvestAdvisor(@Param("fundIdList") List<String> fundIdList, @Param("visibilityId") int visibilityId);
+
+    List<FundInformationDo> listFundInfo(@Param("fundIdList") List<String> fundIdList);
+
+
+    List<Map<String, String>> getFundFrequency(@Param("fundIds") List<String> marketIndexList);
+
+    /**
+     * 获取基金经理的主要投资策略种类和为主的投资策略
+     *
+     * @param managerId 基金经理id
+     * @return 基金经理的主要投资策略种类和为主的投资策略
+     */
+    List<Map<String, Object>> getManagerFundFeature(@Param("managerId") String managerId);
+
+    /**
+     * 获取市场基金的名字
+     *
+     * @param fundId 基金id
+     * @return 市场基金的名字
+     */
+    FundInformationDo getFundByFundId(@Param("fundId") String fundId);
+
+    List<Map<String, String>> getFundInfos(@Param("fundIdList") List<String> fundIdList);
+
+    List<Map<String, String>> getFundRet(@Param("fundIdList") List<String> fundIdList);
+
+    String getMaxFundEndDate(@Param("fundIdList") List<String> fundIdList);
+
+    /**
+     * 获取机构下的基金id
+     *
+     * @param companyId 机构id
+     * @return 基金id
+     */
+    List<String> listFundIdByCompanyId(@Param("companyId") String companyId);
+
+    /**
+     * 获取基金经理或高管历史任职机构id
+     *
+     * @param personnelIdList 机构id
+     * @return 基金经理或高管历史任职机构id
+     */
+    List<String> listCompanyIdByPersonnelId(@Param("personnelIdList") List<String> personnelIdList);
+
+    List<Map<String, Object>> listFundInfoByCompanyId(String companyId);
+
+    List<Map<String, Object>> listFundRegisterNumber(List<String> fundIdList);
+
+}

+ 34 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/IndexesProfileDoMapper.java

@@ -0,0 +1,34 @@
+package com.smppw.analysis.infrastructure.persistence;
+
+
+import com.smppw.analysis.domain.entity.IndexesProfileDo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface IndexesProfileDoMapper {
+
+    List<String> listThirdIndexes();
+
+    List<IndexesProfileDo> listFundIdAndFundShortName(@Param("indexIdList") List<String> indexIdList);
+
+    List<IndexesProfileDo> listInfoByIndexIdList(@Param("indexIdList") List<String> indexIdList);
+
+    /**
+     * 获取指数名称
+     *
+     * @param indexId 指数id
+     * @return 指数名称
+     */
+    String getIndexNameByIndexId(@Param("indexId") String indexId);
+
+    /**
+     * 获取策略对应的指数id
+     *
+     * @param strategyId 策略id
+     * @return /
+     */
+    String getStrategyIndexId(Integer strategyId);
+}

+ 1 - 1
src/main/java/com/smppw/analysis/infrastructure/tasks/NonTradingDayTask.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.infrastructure.tasks;
+package com.smppw.analysis.infrastructure.task;
 
 import com.smppw.analysis.infrastructure.persistence.IndexesTradeDateDoMapper;
 import com.smppw.common.cache.CaffeineLocalCache;

+ 1 - 1
src/main/java/com/smppw/analysis/infrastructure/tasks/RiskOfFreeIdTask.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.infrastructure.tasks;
+package com.smppw.analysis.infrastructure.task;
 
 import com.smppw.analysis.infrastructure.persistence.DepositNavDoMapper;
 import com.smppw.common.cache.CaffeineLocalCache;

+ 1 - 1
src/main/java/com/smppw/analysis/infrastructure/tasks/TrendDateTask.java

@@ -1,4 +1,4 @@
-package com.smppw.analysis.infrastructure.tasks;
+package com.smppw.analysis.infrastructure.task;
 
 import com.smppw.analysis.infrastructure.persistence.IndexesTradeDateDoMapper;
 import com.smppw.common.cache.CaffeineLocalCache;

+ 352 - 0
src/main/resources/mapping/FundInformationDoMapper.xml

@@ -0,0 +1,352 @@
+<?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.infrastructure.persistence.FundInformationDoMapper">
+    <resultMap id="BaseResultMap" type="com.smppw.analysis.domain.entity.FundInformationDo">
+        <!--@mbg.generated-->
+        <!--@Table fund_information-->
+        <id column="id" property="id"/>
+        <result column="p_fund_id" property="pFundId"/>
+        <result column="fund_id" property="fundId"/>
+        <result column="fund_name" property="fundName"/>
+        <result column="fund_short_name" property="fundShortName"/>
+        <result column="fund_structure" property="fundStructure"/>
+        <result column="fund_type" property="fundType"/>
+        <result column="public_fund_type" property="publicFundType"/>
+        <result column="pub_fund_type" property="pubFundType"/>
+        <result column="pub_sub_fund_type" property="pubSubFundType"/>
+        <result column="fund_characteristic" property="fundCharacteristic"/>
+        <result column="base_currency" property="baseCurrency"/>
+        <result column="inception_date" property="inceptionDate"/>
+        <result column="domicile" property="domicile"/>
+        <result column="primary_benchmark_id" property="primaryBenchmarkId"/>
+        <result column="secondary_benchmark" property="secondaryBenchmark"/>
+        <result column="lockup_period" property="lockupPeriod"/>
+        <result column="lockup_period_unit" property="lockupPeriodUnit"/>
+        <result column="lockup_period2" property="lockupPeriod2"/>
+        <result column="lock_period" property="lockPeriod"/>
+        <result column="lock_period_unit" property="lockPeriodUnit"/>
+        <result column="open_day" property="openDay"/>
+        <result column="redemption_day" property="redemptionDay"/>
+        <result column="duration" property="duration"/>
+        <result column="initial_unit_value" property="initialUnitValue"/>
+        <result column="investment_scope" property="investmentScope"/>
+        <result column="investment_objective" property="investmentObjective"/>
+        <result column="fund_portfolio" property="fundPortfolio"/>
+        <result column="investment_restriction" property="investmentRestriction"/>
+        <result column="fund_investment_philosophy" property="fundInvestmentPhilosophy"/>
+        <result column="fund_strategy_description" property="fundStrategyDescription"/>
+        <result column="investment_process" property="investmentProcess"/>
+        <result column="advisor_id" property="advisorId"/>
+        <result column="custodian_id" property="custodianId"/>
+        <result column="broker_id" property="brokerId"/>
+        <result column="broker_future_id" property="brokerFutureId"/>
+        <result column="liquidation_agency_id" property="liquidationAgencyId"/>
+        <result column="trust_id" property="trustId"/>
+        <result column="administrator_id" property="administratorId"/>
+        <result column="legal_counsel_id" property="legalCounselId"/>
+        <result column="auditor_id" property="auditorId"/>
+        <result column="general_service_id" property="generalServiceId"/>
+        <result column="issuer_id" property="issuerId"/>
+        <result column="nav_frequency" property="navFrequency"/>
+        <result column="performance_disclosure_mark" property="performanceDisclosureMark"/>
+        <result column="performance_disclosure_type" property="performanceDisclosureType"/>
+        <result column="IsVisible" property="isvisible"/>
+        <result column="manager_type" property="managerType"/>
+        <result column="begin_member_cnt" property="beginMemberCnt"/>
+        <result column="register_period" property="registerPeriod"/>
+        <result column="zjx_last_info_update_time" property="zjxLastInfoUpdateTime"/>
+        <result column="special_tips" property="specialTips"/>
+        <result column="amac_url" property="amacUrl"/>
+        <result column="raise_type" property="raiseType"/>
+        <result column="risk_return_desc" property="riskReturnDesc"/>
+        <result column="creatorid" property="creatorid"/>
+        <result column="createtime" property="createtime"/>
+        <result column="updaterid" property="updaterid"/>
+        <result column="updatetime" property="updatetime"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="register_number" property="registerNumber"/>
+        <result column="istiered" property="istiered"/>
+        <result column="istiered_desc" property="istieredDesc"/>
+        <result column="register_date" property="registerDate"/>
+        <result column="is_ranking" property="isRanking"/>
+        <result column="is_rating" property="isRating"/>
+        <result column="nav_source" property="navSource"/>
+        <result column="contract_name" property="contractName"/>
+        <result column="contract_path" property="contractPath"/>
+        <result column="is_authorized" property="isAuthorized"/>
+        <result column="is_in_research" property="isInResearch"/>
+        <result column="visible_ctrl" property="visibleCtrl"/>
+        <result column="is_nav_visible" property="isNavVisible"/>
+        <result column="is_nav_visible_org" property="isNavVisibleOrg"/>
+        <result column="is_fee_before" property="isFeeBefore"/>
+        <result column="is_deduct_reward" property="isDeductReward"/>
+        <result column="valuation_institution_id" property="valuationInstitutionId"/>
+        <result column="trust_register_number" property="trustRegisterNumber"/>
+        <result column="is_consignment" property="isConsignment"/>
+        <result column="is_qdii" property="isQdii"/>
+        <result column="is_exclusive" property="isExclusive"/>
+        <result column="is_show_independent" property="isShowIndependent"/>
+        <result column="trust_apply_register_date" property="trustApplyRegisterDate"/>
+        <result column="trust_publicity_date" property="trustPublicityDate"/>
+        <result column="trust_main_industry" property="trustMainIndustry"/>
+        <result column="trust_property_application" property="trustPropertyApplication"/>
+        <result column="trust_function" property="trustFunction"/>
+        <result column="is_amac_show" property="isAmacShow"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id,
+        p_fund_id,
+        fund_id,
+        fund_name,
+        fund_short_name,
+        fund_structure,
+        fund_type,
+        public_fund_type,
+        pub_fund_type,
+        pub_sub_fund_type,
+        fund_characteristic,
+        base_currency,
+        inception_date,
+        domicile,
+        primary_benchmark_id,
+        secondary_benchmark,
+        lockup_period,
+        lockup_period_unit,
+        lockup_period2,
+        lock_period,
+        lock_period_unit,
+        open_day,
+        redemption_day,
+        duration,
+        initial_unit_value,
+        investment_scope,
+        investment_objective,
+        fund_portfolio,
+        investment_restriction,
+        fund_investment_philosophy,
+        fund_strategy_description,
+        investment_process,
+        advisor_id,
+        custodian_id,
+        broker_id,
+        broker_future_id,
+        liquidation_agency_id,
+        trust_id,
+        administrator_id,
+        legal_counsel_id,
+        auditor_id,
+        general_service_id,
+        issuer_id,
+        nav_frequency,
+        performance_disclosure_mark,
+        performance_disclosure_type,
+        IsVisible,
+        manager_type,
+        begin_member_cnt,
+        register_period,
+        zjx_last_info_update_time,
+        special_tips,
+        amac_url,
+        raise_type,
+        risk_return_desc,
+        creatorid,
+        createtime,
+        updaterid,
+        updatetime,
+        isvalid,
+        register_number,
+        istiered,
+        istiered_desc,
+        register_date,
+        is_ranking,
+        is_rating,
+        nav_source,
+        contract_name,
+        contract_path,
+        is_authorized,
+        is_in_research,
+        visible_ctrl,
+        is_nav_visible,
+        is_nav_visible_org,
+        is_fee_before,
+        is_deduct_reward,
+        valuation_institution_id,
+        trust_register_number,
+        is_consignment,
+        is_qdii,
+        is_exclusive,
+        is_show_independent,
+        trust_apply_register_date,
+        trust_publicity_date,
+        trust_main_industry,
+        trust_property_application,
+        trust_function,
+        is_amac_show
+    </sql>
+
+    <select id="listFundIdByFundIdListAndVisibilityId" resultType="java.lang.String">
+        select distinct fund_id
+        from rz_hfdb_core.fund_information where is_nav_visible_org = #{visibilityId}
+                                             AND isvalid = 1
+                                             AND fund_id in
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="listFundIdByFundIdsAndVisibilityIdForInvestAdvisor" resultType="java.lang.String">
+        select distinct fund_id
+        from rz_hfdb_core.fund_information
+        where isvisible = 1
+        and is_nav_visible = #{visibilityId}
+        AND isvalid = 1
+        AND fund_id in
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="listFundInfo" resultMap="BaseResultMap">
+        select *
+        from rz_hfdb_core.fund_information where isvalid = 1
+                                             AND fund_id in
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="getFundFrequency" resultType="java.util.Map">
+        SELECT f.fund_id fundId, f.nav_frequency frequency, f.trust_id trustId
+        FROM rz_hfdb_core.fund_information f WHERE f.isvalid = 1
+                                               AND f.fund_id in
+        <foreach collection="fundIds" index="index" item="fundId" open="(" close=")" separator=",">
+            #{fundId}
+        </foreach>
+    </select>
+    <select id="getManagerFundFeature" resultType="java.util.Map">
+        SELECT ds.strategy_name, COUNT(t4.first_strategy) as countSum
+        FROM rz_hfdb_core.`fund_information` t1
+                 INNER JOIN rz_hfdb_core.`fund_status` t2 ON (t1.fund_id = t2.fund_id)
+                 INNER JOIN rz_hfdb_core.fund_manager_mapping t3 ON (t1.`fund_id` = t3.fund_id)
+                 INNER JOIN rz_hfdb_core.`fund_strategy` t4 ON t4.`fund_id` = t1.`fund_id`
+                 INNER JOIN rz_hfdb_core.dict_strategy ds on t4.first_strategy = ds.strategy_code and ds.isvalid = 1
+        WHERE (t1.fund_type NOT IN (5, -1, 9, 10, 11, 12, 13) OR t1.raise_type = 2)
+          AND t3.isvalid = 1
+          and t3.fund_manager_id = #{managerId}
+          AND t1.isvalid = 1
+          AND t3.isvisible = 1
+        group by t4.first_strategy
+        ORDER BY countSum desc
+    </select>
+    <select id="getFundByFundId" resultMap="BaseResultMap">
+        select *
+        from rz_hfdb_core.`fund_information`
+        where fund_id = #{fundId}
+          and isvalid = 1
+    </select>
+
+    <select id="getFundInfos" resultType="java.util.Map">
+        SELECT fi.fund_id,
+               fi.fund_name,
+               fi.fund_short_name,
+               date_format(fi.inception_date,'%Y-%m-%d') as inception_date,
+               fi.is_nav_visible AS is_nav_visible,
+               fi.isvisible AS is_visible,
+               fi.is_nav_visible_org AS is_nav_visible_org,
+               ci.company_id                             AS 'advisor_id',
+               ci.company_name                           AS 'advisor_name',
+               ci.company_short_name                     AS 'advisor_short_name',
+               mi.manager_name,
+               mi.manager_id
+        FROM rz_hfdb_core.fund_information fi
+                 LEFT JOIN rz_hfdb_core.fund_manager_mapping fm ON fi.fund_id = fm.fund_id AND fm.isvalid = 1
+                 LEFT JOIN rz_hfdb_core.company_information ci ON ci.company_id = fi.trust_id AND ci.isvalid = 1
+                 LEFT JOIN rz_combination_master.cm_big_data_manager_info mi
+                           ON fm.fund_manager_id = mi.manager_id WHERE fi.isvalid = 1
+                                                                   AND fi.fund_id in
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="getFundRet" resultType="java.util.Map">
+        SELECT p.fund_id,
+               date_format(p.price_date,'%Y-%m-%d') as price_date,
+               p.ret_incep,
+               p.ret_incep_a,
+               n.nav,
+               p.cumulative_nav,
+               p.ret_ytd,
+               p.ret_ytd_a,
+               p.ret_1m,
+               p.ret_1m_a,
+               p.ret_3m,
+               p.ret_3m_a,
+               p.ret_6m,
+               p.ret_6m_a,
+               p.ret_1y,
+               p.ret_1y_a,
+               p.ret_3y,
+               p.ret_3y_a
+        FROM rz_hfdb_core.fund_latest_nav_performance p
+                 LEFT JOIN rz_hfdb_core.nav n
+                           ON p.fund_id = n.fund_id AND p.price_date = n.price_date WHERE p.isvalid = 1
+                                                                                      AND p.fund_id IN
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="getMaxFundEndDate" resultType="java.lang.String">
+        SELECT max(price_date) AS 'end_date' FROM rz_hfdb_core.fund_latest_nav_performance p WHERE p.isvalid=1 AND p.fund_id IN
+        <foreach collection="fundIdList" item="fundId" index="index" open="(" separator="," close=")">
+            #{fundId}
+        </foreach>
+    </select>
+
+    <select id="listFundIdByCompanyId" resultType="java.lang.String">
+        select t1.fund_id
+        from fund_information t1
+                 left join company_information t2 on t1.trust_id = t2.company_id
+        where t1.isvalid = 1
+          and t2.company_id = #{companyId} and t2.isvalid=1
+        order by t1.createtime
+    </select>
+
+    <select id="listCompanyIdByPersonnelId" resultType="java.lang.String">
+        SELECT DISTINCT t2.company_id
+        FROM rz_hfdb_core.personnel_company_position_mapping t1
+        LEFT JOIN rz_hfdb_core.company_information t2
+        ON t1.company_id = t2.company_id AND t2.isvalid = 1
+        LEFT JOIN rz_hfdb_core.personnel_company_position_id_mapping t3
+        ON t3.`isvalid`=1 AND t3.`rec_id`=t1.id
+        LEFT JOIN rz_hfdb_core.d_position t4
+        ON t3.position_id=t4.id AND t4.`isvalid`=1
+        WHERE t1.isvalid = 1
+        AND t4.position_name REGEXP '总经理|董事|CEO|CFO|COO|CIO|投资经理|合规负责人|合规风控|监事|总监|法定代表人|法人|合伙人|创始人|总裁|主管|法人代表|基金经理'
+        and t1.personnel_id in
+        <foreach collection="personnelIdList" item="personnelId" index="index" open="(" separator="," close=")">
+            #{personnelId}
+        </foreach>
+    </select>
+    <select id="listFundInfoByCompanyId" resultType="java.util.Map" parameterType="java.lang.String">
+        select t1.fund_id as fundId,t1.fund_short_name as fundShortName,
+        t1.register_number as registerNumber
+        from fund_information t1
+        left join company_information t2 on t1.trust_id = t2.company_id
+        where t1.isvalid = 1
+        and t2.company_id = #{companyId} and t2.isvalid=1
+        order by t1.createtime
+
+    </select>
+    <select id="listFundRegisterNumber" resultType="java.util.Map">
+        select fund_id as fundId,register_number as registerNumber
+        from fund_information
+        where isvalid = 1 and fund_id in
+        <foreach collection="fundIdList" item="item" index="index" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+    </select>
+
+</mapper>

+ 118 - 0
src/main/resources/mapping/IndexesProfileDoMapper.xml

@@ -0,0 +1,118 @@
+<?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.infrastructure.persistence.IndexesProfileDoMapper">
+    <resultMap id="BaseResultMap" type="com.smppw.analysis.domain.entity.IndexesProfileDo">
+        <!--@mbg.generated-->
+        <!--@Table indexes_profile-->
+        <id column="id" property="id"/>
+        <result column="index_id" property="indexId"/>
+        <result column="index_type" property="indexType"/>
+        <result column="index_type_second" property="indexTypeSecond"/>
+        <result column="index_type_third" property="indexTypeThird"/>
+        <result column="index_type_id" property="indexTypeId"/>
+        <result column="index_code" property="indexCode"/>
+        <result column="index_name" property="indexName"/>
+        <result column="index_short_name" property="indexShortName"/>
+        <result column="index_area_flag" property="indexAreaFlag"/>
+        <result column="index_family_id" property="indexFamilyId"/>
+        <result column="pricing_frequency" property="pricingFrequency"/>
+        <result column="inception_date" property="inceptionDate"/>
+        <result column="index_initial_value" property="indexInitialValue"/>
+        <result column="base_currency" property="baseCurrency"/>
+        <result column="calculation_method" property="calculationMethod"/>
+        <result column="weighting_scheme" property="weightingScheme"/>
+        <result column="selection_scheme" property="selectionScheme"/>
+        <result column="reconstitution_frequency" property="reconstitutionFrequency"/>
+        <result column="rebalance_frequency" property="rebalanceFrequency"/>
+        <result column="isvisible" property="isvisible"/>
+        <result column="creatorid" property="creatorid"/>
+        <result column="createtime" property="createtime"/>
+        <result column="updaterid" property="updaterid"/>
+        <result column="updatetime" property="updatetime"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="qc" property="qc"/>
+        <result column="qcdate" property="qcdate"/>
+        <result column="qcstate" property="qcstate"/>
+        <result column="auditor" property="auditor"/>
+        <result column="auditdate" property="auditdate"/>
+        <result column="auditstate" property="auditstate"/>
+        <result column="qcremark" property="qcremark"/>
+        <result column="auditremark" property="auditremark"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id,
+        index_id,
+        index_type,
+        index_type_second,
+        index_type_third,
+        index_type_id,
+        index_code,
+        index_name,
+        index_short_name,
+        index_area_flag,
+        index_family_id,
+        pricing_frequency,
+        inception_date,
+        index_initial_value,
+        base_currency,
+        calculation_method,
+        weighting_scheme,
+        selection_scheme,
+        reconstitution_frequency,
+        rebalance_frequency,
+        isvisible,
+        creatorid,
+        createtime,
+        updaterid,
+        updatetime,
+        isvalid,
+        qc,
+        qcdate,
+        qcstate,
+        auditor,
+        auditdate,
+        auditstate,
+        qcremark,
+        auditremark,
+        remark
+    </sql>
+
+    <select id="listThirdIndexes" resultType="java.lang.String">
+        select distinct index_id
+        from indexes_profile
+        where index_type = 1
+          AND index_type_second = 111
+    </select>
+
+    <select id="listFundIdAndFundShortName" resultMap="BaseResultMap">
+        select index_id, index_short_name
+        from indexes_profile where isvalid = 1
+        AND index_id in
+        <foreach collection="indexIdList" item="indexId" index="index" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+    </select>
+
+    <select id="listInfoByIndexIdList" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List"/>
+        from rz_hfdb_core.indexes_profile
+        where index_id in
+        <foreach collection="indexIdList" index="index" item="indexId" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+    </select>
+
+    <select id="getIndexNameByIndexId" resultType="java.lang.String">
+        select index_name
+        from rz_hfdb_core.indexes_profile
+        where index_id = #{indexId}
+          and isvalid = 1
+    </select>
+
+    <select id="getStrategyIndexId" parameterType="int" resultType="string">
+        select a.index_id from indexes_profile a where a.index_type_second = 102 and a.remark = #{strategyId} and a.isvalid = 1 limit 1
+    </select>
+</mapper>