Browse Source

收益风险指标接口完成,数据和pro一致

wangzaijun 1 year ago
parent
commit
8108a17205

+ 30 - 0
.logs/access_loglog

@@ -1,3 +1,33 @@
 127.0.0.1 - - [02/Aug/2023:11:19:37 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 500 7777
 127.0.0.1 - - [02/Aug/2023:11:21:14 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 500 7777
 127.0.0.1 - - [02/Aug/2023:11:28:01 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 500 7777
+127.0.0.1 - - [02/Aug/2023:11:49:21 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2797
+127.0.0.1 - - [02/Aug/2023:11:49:50 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2797
+127.0.0.1 - - [02/Aug/2023:14:14:13 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:14:40 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:15:55 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:16:36 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:17:39 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:35:05 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:36:20 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:40:51 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2797
+127.0.0.1 - - [02/Aug/2023:14:41:21 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2797
+127.0.0.1 - - [02/Aug/2023:14:42:36 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 -
+127.0.0.1 - - [02/Aug/2023:14:50:15 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:51:16 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:51:35 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:53:01 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 2
+127.0.0.1 - - [02/Aug/2023:14:54:30 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3426
+127.0.0.1 - - [02/Aug/2023:14:58:41 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Daliy&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 400 8201
+127.0.0.1 - - [02/Aug/2023:14:59:01 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Daily&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3433
+127.0.0.1 - - [02/Aug/2023:15:05:28 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Daily&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3433
+127.0.0.1 - - [02/Aug/2023:15:11:40 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 1024
+127.0.0.1 - - [02/Aug/2023:15:23:04 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3426
+127.0.0.1 - - [02/Aug/2023:16:18:26 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:20:36 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:30:34 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:33:59 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:39:23 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:44:04 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457
+127.0.0.1 - - [02/Aug/2023:16:53:00 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Default&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3462
+127.0.0.1 - - [02/Aug/2023:16:53:41 +0800] "GET /v1/api/fund/indicators?startDate=2020-12-28&endDate=2023-02-28&frequency=Weekly&benchmarkId=IN00000008&refIds=IN00000008&fundId=HF00003KW9&timeRange=Custom&riskOfFreeId=IN0000000M&raiseType=Private&strategy=Equity&navType=CumulativeNav&calcExtraRet=0&secIds=&userId=1196862 HTTP/1.1" 200 3457

BIN
libs/data-calc-0.1.1-SNAPSHOT.jar


+ 22 - 2
pom.xml

@@ -45,9 +45,9 @@
         <dependency>
             <groupId>com.smppw</groupId>
             <artifactId>data-calc</artifactId>
-            <version>1-0.SNAPSHOT</version>
+            <version>0.1.2-SNAPSHOT</version>
             <scope>system</scope>
-            <systemPath>${project.basedir}/libs/data-calc-0.1.1-SNAPSHOT.jar</systemPath>
+            <systemPath>${project.basedir}/libs/data-calc-0.1.2-SNAPSHOT.jar</systemPath>
         </dependency>
         <dependency>
             <groupId>cn.hutool</groupId>
@@ -59,6 +59,26 @@
             <artifactId>hutool-json</artifactId>
             <version>${hutool-version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+            <version>2.8.8</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>3.6.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>2.10.13</version>
+        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 5 - 0
readme.md

@@ -0,0 +1,5 @@
+### 数据分析,详情页通用服务
+
+
+##### 存在问题
+1、需要预刷新的数据(交易日、无风险利率)如何处理?在calc模块就刷新还是本服务,如果是本服务,那可能需要迁移咖啡因缓存到本服务,然后在calc去掉

+ 2 - 0
src/main/java/com/smppw/analysis/DataAnalysisApplication.java

@@ -3,7 +3,9 @@ package com.smppw.analysis;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
+@EnableScheduling
 @MapperScan("com.smppw.analysis.infrastructure.persistence")
 @SpringBootApplication
 public class DataAnalysisApplication {

+ 1 - 0
src/main/java/com/smppw/analysis/application/service/PerformanceService.java

@@ -102,6 +102,7 @@ public class PerformanceService {
             CommonData<Map<String, Object>> data = CommonData.<Map<String, Object>>builder().dataset(dataset).productNameMapping(productNameMapping).extInfos(extInfos).build();
             return CommonUtil.covertToMap(data, "endDate");
         } catch (Exception e) {
+            e.printStackTrace();
             logger.error(String.format("基金收益风险指标计算错误:%s", e.getMessage()));
         }
         return MapUtil.newHashMap();

+ 120 - 0
src/main/java/com/smppw/analysis/domain/dao/FundInformationDao.java

@@ -0,0 +1,120 @@
+package com.smppw.analysis.domain.dao;
+
+import com.smppw.analysis.domain.pojo.FundFrequencyDo;
+import com.smppw.analysis.domain.service.SecTypeService;
+import com.smppw.analysis.infrastructure.persistence.FundFrequencyDoMapper;
+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;
+
+    public FundInformationDao(SecTypeService secTypeService, FundFrequencyDoMapper fundFrequencyDoMapper) {
+        this.secTypeService = secTypeService;
+        this.fundFrequencyDoMapper = fundFrequencyDoMapper;
+    }
+
+    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)) {
+                frequency = Frequency.Daily;
+            } else if ("周".equals(freq)) {
+                frequency = Frequency.Weekly;
+            } else {
+                frequency = Frequency.Monthly;
+            }
+        } else {
+            frequency = Frequency.Daily;
+        }
+        return frequency;
+    }
+
+    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);
+            }
+        }
+
+//        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;
+    }
+}

+ 77 - 0
src/main/java/com/smppw/analysis/domain/pojo/FundFrequencyDo.java

@@ -0,0 +1,77 @@
+package com.smppw.analysis.domain.pojo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+    * 过程绘制基金频率表
+    */
+@Data
+public class FundFrequencyDo {
+    /**
+    * 主键id无意义
+    */
+    private Integer id;
+
+    /**
+    * 基金id
+    */
+    private String fundId;
+
+    /**
+    * 净值频率:日/周/月
+    */
+    private String navFrequency;
+
+    /**
+    * 基金净值数量
+    */
+    private Integer navCount;
+
+    /**
+    * 日频比率(净值/交易日)
+    */
+    private BigDecimal dailyRatio;
+
+    /**
+    * 周频比率(净值周/交易周)
+    */
+    private BigDecimal weeklyRatio;
+
+    /**
+    * 月频比率(净值月/交易月)
+    */
+    private BigDecimal monthlyRatio;
+
+    /**
+    * 季频比率(净值季/交易季)
+    */
+    private BigDecimal quartlyRatio;
+
+    /**
+    * 创建者Id,默认第一次创建者名称,创建后不变更
+    */
+    private Integer creatorid;
+
+    /**
+    * 创建时间,默认第一次创建的getdate()时间
+    */
+    private Date createtime;
+
+    /**
+    * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+    */
+    private Integer updaterid;
+
+    /**
+    * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+    */
+    private Date updatetime;
+
+    /**
+    * 记录的有效性;1-有效;0-无效;
+    */
+    private Integer isvalid;
+}

+ 16 - 21
src/main/java/com/smppw/analysis/domain/service/impl/BaseIndicatorServiceV2Impl.java

@@ -1,6 +1,7 @@
 package com.smppw.analysis.domain.service.impl;
 
 import cn.hutool.core.util.StrUtil;
+import com.smppw.analysis.domain.dao.FundInformationDao;
 import com.smppw.analysis.domain.service.BaseIndicatorServiceV2;
 import com.smppw.analysis.domain.service.NavService;
 import com.smppw.common.pojo.IStrategy;
@@ -13,17 +14,19 @@ import com.smppw.core.IndicatorService;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class BaseIndicatorServiceV2Impl implements BaseIndicatorServiceV2 {
     private final NavService navService;
+    private final FundInformationDao fundInformationDao;
 
-    public BaseIndicatorServiceV2Impl(NavService navService) {
+    public BaseIndicatorServiceV2Impl(NavService navService, FundInformationDao fundInformationDao) {
         this.navService = navService;
+        this.fundInformationDao = fundInformationDao;
     }
 
     @Override
@@ -37,36 +40,28 @@ public class BaseIndicatorServiceV2Impl implements BaseIndicatorServiceV2 {
         NavType navType = req.getNavType();
         String riskOfFreeId = req.getRiskOfFreeId();
 
-        List<String> benchmarkIdList = new ArrayList<>();
-        for (Map.Entry<String, String> secBenchmarkIdMapEntry : secBenchmarkIdMap.entrySet()) {
-            String benchmarkId = secBenchmarkIdMapEntry.getValue();
-            if (StrUtil.isNotEmpty(benchmarkId)) {
-                benchmarkIdList.add(benchmarkId);
-            }
-        }
+        List<String> benchmarkIdList = secBenchmarkIdMap.values().stream().distinct().collect(Collectors.toList());
         CurveType curveType = CurveType.getCurveType(raiseType, strategy);
         if (StrUtil.isNotEmpty(riskOfFreeId)) {
             benchmarkIdList.add(riskOfFreeId);
         }
         Map<String, List<DateValue>> allNavMap = navService.getSecIdDateValueNavListMapFromRedisAndDB(mainSecIdList, benchmarkIdList, indexIdList,
                 null, null, navType, visibility, curveType.getId(), strategy.getStrategyId(), new HashMap<>(), false);
-
-        return IndicatorService.getInstance().calcMultipleSecMultipleTimeRangeIndicator(req, allNavMap);
+        Map<String, Frequency> secFreqMap = this.fundInformationDao.getNavFrequency(mainSecIdList);
+        return IndicatorService.getInstance().calcMultipleSecMultipleTimeRangeIndicator(req, allNavMap, secFreqMap);
     }
 
     @Override
-    public Map<String, List<IndicatorCalcPropertyDto>> getMultipleSecTrend(List<String> mainSecIdList, Map<String, String> secBenchmarkIdMap, List<String> indexIdList, DateIntervalDto dateIntervalDto, Frequency frequency, BigDecimal fixedIncome, BigDecimal initValue, RaiseType raiseType, IStrategy strategy, Visibility visibility, NavType navType, List<TrendType> trendTypeV2List, Boolean ifExtract, Integer userId) {
-        List<String> benchmarkIdList = new ArrayList<>();
-        for (Map.Entry<String, String> secBenchmarkIdMapEntry : secBenchmarkIdMap.entrySet()) {
-            String benchmarkId = secBenchmarkIdMapEntry.getValue();
-            if (StrUtil.isNotEmpty(benchmarkId)) {
-                benchmarkIdList.add(benchmarkId);
-            }
-        }
+    public Map<String, List<IndicatorCalcPropertyDto>> getMultipleSecTrend(List<String> mainSecIdList, Map<String, String> secBenchmarkIdMap,
+                                                                           List<String> indexIdList, DateIntervalDto dateIntervalDto, Frequency frequency,
+                                                                           BigDecimal fixedIncome, BigDecimal initValue, RaiseType raiseType, IStrategy strategy,
+                                                                           Visibility visibility, NavType navType, List<TrendType> trendTypeV2List, Boolean ifExtract, Integer userId) {
+        List<String> benchmarkIdList = secBenchmarkIdMap.values().stream().distinct().collect(Collectors.toList());
         CurveType curveType = CurveType.getCurveType(raiseType, strategy);
         Map<String, List<DateValue>> allNavMap = navService.getSecIdDateValueNavListMapFromRedisAndDB(mainSecIdList, benchmarkIdList, indexIdList,
                 null, null, navType, visibility, curveType.getId(), strategy.getStrategyId(), new HashMap<>(), false);
-
-        return IndicatorService.getInstance().getMultipleSecTrend(mainSecIdList, secBenchmarkIdMap, indexIdList, dateIntervalDto, frequency, fixedIncome, initValue, trendTypeV2List, allNavMap);
+        Map<String, Frequency> secFreqMap = this.fundInformationDao.getNavFrequency(mainSecIdList);
+        return IndicatorService.getInstance().getMultipleSecTrend(mainSecIdList, secBenchmarkIdMap, indexIdList, dateIntervalDto, fixedIncome,
+                initValue, frequency, trendTypeV2List, secFreqMap, allNavMap);
     }
 }

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

@@ -146,13 +146,13 @@ public class NavServiceImpl implements NavService {
 //            }
 //        }
 
-        List<String> dbSecIds = new ArrayList<>();
-        Map<String, String> secKeyMap = new HashMap<>();
+//        List<String> dbSecIds = new ArrayList<>();
+//        Map<String, String> secKeyMap = new HashMap<>();
 
         Map<String, List<DateValue>> allSecNavListMap = new HashMap<>();
 
         //取DB
-        Map<String, List<DateValue>> secNavListMapDbData = getSecIdDateValueNavListMapByDb(dbSecIds, startDate, endDate, curveTypeId, strategyId, visibility, navType, secFrequencyMap, secIfExtractMap);
+        Map<String, List<DateValue>> secNavListMapDbData = getSecIdDateValueNavListMapByDb(secIds, startDate, endDate, curveTypeId, strategyId, visibility, navType, secFrequencyMap, secIfExtractMap);
         allSecNavListMap.putAll(secNavListMapDbData);
 
         //将取DB的标的的净值存进redis
@@ -252,10 +252,8 @@ public class NavServiceImpl implements NavService {
 //        }
 
         //取非费后净值
-        if (notAccfilterFundIdList.size() > 0) {
-            Map<String, List<NavDto>> fundIdNavDtoListMap = privatelyOfferedFundNavDao.getNav(notAccfilterFundIdList, startDate, endDate, navType, false);
-            allFundIdNavDtoListMap.putAll(fundIdNavDtoListMap);
-        }
+        Map<String, List<NavDto>> fundIdNavDtoListMap = privatelyOfferedFundNavDao.getNav(fundIdList, startDate, endDate, navType, false);
+        allFundIdNavDtoListMap.putAll(fundIdNavDtoListMap);
 
         return SecNavDtoListMapToSecDateValueListMap(navType, allFundIdNavDtoListMap);
     }

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

@@ -63,11 +63,11 @@ public class SecTypeServiceImpl implements SecTypeService {
             }
         } else if (fundId.startsWith(IN)) {
             List<String> thirdIndexes = CaffeineLocalCache.getThirdIndexes();
-            if (thirdIndexes.contains(fundId)) {
+            if (thirdIndexes != null && thirdIndexes.contains(fundId)) {
                 return SecType.THIRD_INDEX_FUND;
             }
             List<String> riskOfFreeIdList = CaffeineLocalCache.getRiskOfFreeId();
-            if (riskOfFreeIdList.contains(fundId)) {
+            if (riskOfFreeIdList != null && riskOfFreeIdList.contains(fundId)) {
                 return SecType.RISK_OF_FREE;
             }
             Integer isExist = INDEX_EXIST.get(fundId);

+ 14 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/FundFrequencyDoMapper.java

@@ -0,0 +1,14 @@
+package com.smppw.analysis.infrastructure.persistence;
+
+import com.smppw.analysis.domain.pojo.FundFrequencyDo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface FundFrequencyDoMapper {
+    String getNavFrequencyByFundId(@Param("secId") String secId);
+
+    List<FundFrequencyDo> getNavFrequencyByFundIdList(@Param("secIdList") List<String> secIdList);
+}

+ 85 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/IndexesTradeDateDoMapper.java

@@ -0,0 +1,85 @@
+package com.smppw.analysis.infrastructure.persistence;
+
+import com.smppw.common.pojo.IndexesTradeDateDo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 交易日历表mapper
+ *
+ * @author David
+ * @version 1.0
+ * @date 2023-04-24
+ */
+@Mapper
+public interface IndexesTradeDateDoMapper {
+    /**
+     * 获取最近的交日期,往前找
+     *
+     * @param tradeDate /
+     * @return /
+     */
+    String queryLatestTradeDate(String tradeDate);
+
+    /**
+     * 获取交易日历表中所有的日期对象,主要用于缓存使用
+     *
+     * @return List<IndexesTradeDateDo>
+     */
+    List<IndexesTradeDateDo> listNatureDays();
+
+    /**
+     * 获取所有的节假日日期
+     *
+     * @return List<String>
+     */
+    List<String> listHolidays();
+
+    /**
+     * 获取指定区间所有的节假日日期
+     *
+     * @param startDate 开始日期
+     * @param endDate   截止日期
+     * @return List<String>
+     */
+    List<String> listIntervalHolidays(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    /**
+     * 获取指定区间所有的交易日期
+     *
+     * @param startDate 开始日期
+     * @param endDate   截止日期
+     * @return List<String>
+     */
+    List<String> listTradeDates(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    /**
+     * 计算给定区间内交易日数量
+     *
+     * @param startDate 开始日期
+     * @param endDate   截止日期
+     * @return 数量
+     */
+    int countTradeDateDistance(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    /**
+     * 获取交易日
+     *
+     * @param startDate 开始日期
+     * @param endDate   截止日期
+     * @return /
+     */
+    List<IndexesTradeDateDo> listNatureDaysByCondition(@Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    /**
+     * 根据指定的区间和获取区间日期是否日、周、月进行取值
+     *
+     * @param startDate 开始日期
+     * @param endDate   结束日期
+     * @param frequency 获取的日期类型,1-日,2-is_weekend, 3-is_monthend
+     * @return 返回指定日期类型的日期列表
+     */
+    List<String> listTradeDatesByFrequency(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("frequency") Integer frequency);
+}

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

@@ -0,0 +1,33 @@
+package com.smppw.analysis.infrastructure.tasks;
+
+import com.smppw.analysis.infrastructure.persistence.IndexesTradeDateDoMapper;
+import com.smppw.common.cache.CaffeineLocalCache;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class NonTradingDayTask {
+
+    private static final Logger logger = LoggerFactory.getLogger(NonTradingDayTask.class);
+
+    @Autowired
+    private IndexesTradeDateDoMapper indexesTradeDateDoMapper;
+
+    /**
+     * 将非交易日日期放入本地缓存,启动后十秒,及之后每24小时执行一次
+     * 所有机器启动时均需加载,且执行间隔较长,不适宜用XxlJob进行管理
+     */
+    @Scheduled(initialDelay = 10000, fixedRate = 24 * 3600 * 1000)
+    public void cacheNonTradingDays() {
+        logger.info("start cacheNonTradingDays");
+        List<String> allHolidayDays = indexesTradeDateDoMapper.listHolidays();
+
+        CaffeineLocalCache.addNonTradingDay(allHolidayDays);
+        logger.info("finish cacheNonTradingDays");
+    }
+}

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

@@ -0,0 +1,24 @@
+package com.smppw.analysis.infrastructure.tasks;
+
+import com.smppw.analysis.infrastructure.persistence.DepositNavDoMapper;
+import com.smppw.common.cache.CaffeineLocalCache;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class RiskOfFreeIdTask {
+    @Autowired
+    private DepositNavDoMapper depositNavMasterMapper;
+
+    @Scheduled(initialDelay = 800, fixedRate = 24 * 3600 * 1000)
+    private void refreshDate() {
+
+        List<String> riskOfFreeIdList = depositNavMasterMapper.listRiskOfFreeId();
+
+        CaffeineLocalCache.cleanRiskOfFreeId();
+        CaffeineLocalCache.addRiskOfFreeId(riskOfFreeIdList);
+    }
+}

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

@@ -0,0 +1,97 @@
+package com.smppw.analysis.infrastructure.tasks;
+
+import com.smppw.analysis.infrastructure.persistence.IndexesTradeDateDoMapper;
+import com.smppw.common.cache.CaffeineLocalCache;
+import com.smppw.common.pojo.IndexesTradeDateDo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Repository;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Repository
+public class TrendDateTask {
+    private final static Logger logger = LoggerFactory.getLogger(TrendDateTask.class);
+
+    @Autowired
+    private IndexesTradeDateDoMapper indexesTradeDateDoMapper;
+
+    //刷期对应的年周, 月周 进缓存
+    @Scheduled(initialDelay = 1000, fixedRate = 24 * 3600 * 1000)
+    public void refreshData() {
+        long start = System.currentTimeMillis();
+        List<IndexesTradeDateDo> indexesTradeDateDoList = indexesTradeDateDoMapper.listNatureDays();
+        refreshYearWeekAndWeekOfMonth(indexesTradeDateDoList);
+        refreshYearMonth(indexesTradeDateDoList);
+        long end = System.currentTimeMillis();
+        if (logger.isDebugEnabled()) {
+            logger.debug("TrendDateTask execute cost: " + (end - start) + "s");
+        }
+    }
+
+    //刷期对应的年周, 月周 进缓存
+    private void refreshYearWeekAndWeekOfMonth(List<IndexesTradeDateDo> indexesTradeDateDoList) {
+        CaffeineLocalCache.cleanDateYearWeek();
+        CaffeineLocalCache.addDateYearWeek(indexesTradeDateDoList);
+
+        CaffeineLocalCache.cleanListInfoTrendDate();
+        CaffeineLocalCache.addListInfoTrendDate(indexesTradeDateDoList);
+
+        Map<String, String> dateCateMap = new HashMap<>();
+        List<IndexesTradeDateDo> yearWeekLastTradeDateList = new ArrayList<>();
+        Integer weekOfYear = null;
+        String yearmonth = null;
+        Integer weekOfMonth = 1;
+        for (IndexesTradeDateDo indexesTradeDateDo : indexesTradeDateDoList) {
+            Integer theWeekOfYear = indexesTradeDateDo.getWeekOfYear();
+            String theYearmonth = indexesTradeDateDo.getYearmonth();
+            if (weekOfYear == null) {
+                weekOfYear = theWeekOfYear;
+            }
+            if (yearmonth == null) {
+                yearmonth = theYearmonth;
+            }
+
+            if (weekOfYear != theWeekOfYear) {
+                if (!yearmonth.equals(theYearmonth)) {
+                    weekOfMonth = 1;
+                    yearmonth = theYearmonth;
+                } else {
+                    weekOfMonth++;
+                }
+                weekOfYear = theWeekOfYear;
+            }
+            dateCateMap.put(indexesTradeDateDo.getTradeDate(), yearmonth + "-" + weekOfMonth);
+
+            if (indexesTradeDateDo.getIsWeekend().compareTo(1) == 0) {
+                yearWeekLastTradeDateList.add(indexesTradeDateDo);
+            }
+        }
+        CaffeineLocalCache.cleanDateMonthWeek();
+        CaffeineLocalCache.addDateMonthWeek(dateCateMap);
+
+        CaffeineLocalCache.cleanYearWeekLastTradeDate();
+        CaffeineLocalCache.addYearWeekLastTradeDate(yearWeekLastTradeDateList);
+    }
+
+    // 刷新年月数据
+    private void refreshYearMonth(List<IndexesTradeDateDo> indexesTradeDateDoList) {
+        CaffeineLocalCache.cleanDateYearMonth();
+        CaffeineLocalCache.addDateYearMonth(indexesTradeDateDoList);
+        List<IndexesTradeDateDo> yearMonthLastTradeDateList = new ArrayList<>();
+        for (IndexesTradeDateDo indexesTradeDateDo : indexesTradeDateDoList) {
+            if (indexesTradeDateDo.getIsMonthend().compareTo(1) == 0) {
+                yearMonthLastTradeDateList.add(indexesTradeDateDo);
+            }
+        }
+
+        CaffeineLocalCache.cleanYearMonthLastTradeDate();
+        CaffeineLocalCache.addYearMonthLastTradeDate(yearMonthLastTradeDateList);
+    }
+
+}

+ 4 - 2
src/main/java/com/smppw/analysis/interfaces/FundApi.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil;
 import com.smppw.analysis.application.dto.RateRiskIndicatorParams;
 import com.smppw.analysis.application.service.PerformanceService;
 import com.smppw.common.pojo.enums.Indicator;
+import com.smppw.common.pojo.vo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -20,7 +21,8 @@ public class FundApi {
     }
 
     @GetMapping("/indicators")
-    public Map<String, Object> indicator(RateRiskIndicatorParams params) {
-        return this.performanceService.rateRiskIndicators(params, ListUtil.toList(Indicator.INDICATOR_TYPE_ARRAY), ListUtil.toList(Indicator.RISK_TABLE_EXCESS_INDICATOR_ARRAY));
+    public ResultVo<Map<String, Object>> indicator(RateRiskIndicatorParams params) {
+        Map<String, Object> data = this.performanceService.rateRiskIndicators(params, ListUtil.toList(Indicator.INDICATOR_TYPE_ARRAY), ListUtil.toList(Indicator.RISK_TABLE_EXCESS_INDICATOR_ARRAY));
+        return ResultVo.ok(data);
     }
 }

+ 6 - 0
src/main/resources/application.yaml

@@ -50,5 +50,11 @@ spring:
           max-active: 10 #最大连接数
           min-idle: 2    #最小空闲数
 
+# mybatis 配置
 mybatis:
   mapper-locations: classpath:mapping/**/*.xml
+
+# 打印一下sql日志
+logging:
+  level:
+    com.smppw.analysis.infrastructure.persistence: debug

+ 38 - 0
src/main/resources/mapping/FundFrequencyDoMapper.xml

@@ -0,0 +1,38 @@
+<?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.FundFrequencyDoMapper">
+  <resultMap id="BaseResultMap" type="com.smppw.analysis.domain.pojo.FundFrequencyDo">
+    <!--@mbg.generated-->
+    <!--@Table fund_frequency-->
+    <id column="id" property="id" />
+    <result column="fund_id" property="fundId" />
+    <result column="nav_frequency" property="navFrequency" />
+    <result column="nav_count" property="navCount" />
+    <result column="daily_ratio" property="dailyRatio" />
+    <result column="weekly_ratio" property="weeklyRatio" />
+    <result column="monthly_ratio" property="monthlyRatio" />
+    <result column="quartly_ratio" property="quartlyRatio" />
+    <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" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, fund_id, nav_frequency, nav_count, daily_ratio, weekly_ratio, monthly_ratio, 
+    quartly_ratio, creatorid, createtime, updaterid, updatetime, isvalid
+  </sql>
+
+  <select id="getNavFrequencyByFundId" resultType="java.lang.String">
+    select nav_frequency from fund_frequency where fund_id = #{secId} AND isvalid = 1
+  </select>
+
+  <select id="getNavFrequencyByFundIdList" resultMap="BaseResultMap">
+    select fund_id, nav_frequency from fund_frequency where fund_id in
+    <foreach collection="secIdList" item="secId" index="index" open="(" separator="," close=")">
+      #{secId}
+    </foreach>
+    AND isvalid = 1
+  </select>
+</mapper>

+ 103 - 0
src/main/resources/mapping/IndexesTradeDateDoMapper.xml

@@ -0,0 +1,103 @@
+<?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.IndexesTradeDateDoMapper">
+    <resultMap id="BaseResultMap" type="com.smppw.common.pojo.IndexesTradeDateDo">
+        <!--@mbg.generated-->
+        <!--@Table indexes_trade_date-->
+        <id column="id" property="id"/>
+        <result column="index_code" property="indexCode"/>
+        <result column="trade_date" property="tradeDate"/>
+        <result column="end_year" property="endYear"/>
+        <result column="week_of_year" property="weekOfYear"/>
+        <result column="year_week" property="yearWeek"/>
+        <result column="day_of_week" property="dayOfWeek"/>
+        <result column="week_begin" property="weekBegin"/>
+        <result column="week_end" property="weekEnd"/>
+        <result column="pre_year" property="preYear"/>
+        <result column="pre_week" property="preWeek"/>
+        <result column="isholiday" property="isholiday"/>
+        <result column="is_weekend" property="isWeekend"/>
+        <result column="is_monthend" property="isMonthend"/>
+        <result column="is_quarterend" property="isQuarterend"/>
+        <result column="is_yearend" property="isYearend"/>
+        <result column="isvalid" property="isvalid"/>
+        <result column="creatorid" property="creatorid"/>
+        <result column="createtime" property="createtime"/>
+        <result column="updaterid" property="updaterid"/>
+        <result column="updatetime" property="updatetime"/>
+        <result column="yearmonth" property="yearmonth"/>
+    </resultMap>
+    <sql id="Base_Column_List">
+        <!--@mbg.generated-->
+        id, index_code, trade_date, end_year, week_of_year, year_week, day_of_week, week_begin,
+        week_end, pre_year, pre_week, isholiday, is_weekend, is_monthend, is_quarterend,
+        is_yearend, isvalid, creatorid, createtime, updaterid, updatetime, yearmonth
+    </sql>
+
+    <select id="queryLatestTradeDate" resultType="string" parameterType="string">
+        select max(trade_date)
+        from indexes_trade_date
+        where isvalid = 1 and trade_date &lt;= #{tradeDate} and isholiday = 0
+    </select>
+
+    <select id="listNatureDays" resultMap="BaseResultMap">
+        select <include refid="Base_Column_List" />
+        from indexes_trade_date
+        where isvalid = 1
+        order by trade_date asc
+    </select>
+
+    <select id="listHolidays" resultType="java.lang.String">
+        SELECT t.trade_date
+        FROM indexes_trade_date t
+        WHERE t.isholiday = 1
+          AND t.isvalid = 1
+        GROUP BY t.trade_date
+        ORDER BY t.trade_date ASC
+    </select>
+    <select id="listIntervalHolidays" resultType="java.lang.String">
+        select trade_date
+        from indexes_trade_date
+        where isholiday = 1
+          and isvalid = 1
+          and trade_date between #{startDate} and #{endDate}
+        order by trade_date asc
+    </select>
+    <select id="listTradeDates" resultType="java.lang.String">
+        select trade_date
+        from indexes_trade_date
+        where isholiday = 0
+          and isvalid = 1
+          and trade_date between #{startDate} and #{endDate}
+        order by trade_date asc
+    </select>
+    <select id="countTradeDateDistance" resultType="java.lang.Integer">
+        select count(*)
+        from indexes_trade_date
+        where isholiday = 0
+          and isvalid = 1
+          and trade_date &gt; #{startDate} and trade_date &lt; #{endDate}
+    </select>
+
+    <select id="listNatureDaysByCondition" resultMap="BaseResultMap">
+        select <include refid="Base_Column_List" />
+        from rz_hfdb_core.indexes_trade_date
+        where isvalid = 1 and isholiday = 0
+            and trade_date &lt;= #{endDate} and trade_date &gt;= #{startDate}
+        order by trade_date
+    </select>
+    <select id="listTradeDatesByFrequency" resultType="java.lang.String">
+        select trade_date
+        from indexes_trade_date
+        where isholiday = 0
+          and isvalid = 1
+          and trade_date between #{startDate} and #{endDate}
+        <if test="frequency == 2">
+            and is_weekend = 1
+        </if>
+        <if test="frequency == 3">
+            and is_monthend = 1
+        </if>
+        order by trade_date asc
+    </select>
+</mapper>