瀏覽代碼

Merge branch 'develop' of http://112.74.196.215:3000/Tech2/data-analysis into develop

wangzaijun 1 年之前
父節點
當前提交
8255ead58a

+ 42 - 41
src/main/java/com/smppw/analysis/application/service/style/StyleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.smppw.analysis.application.service.style;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.NumberUtil;
@@ -7,12 +8,14 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
+import com.smppw.analysis.domain.dataobject.FundStyleStatsDO;
 import com.smppw.analysis.domain.dto.style.*;
 import com.smppw.analysis.domain.dto.style.py.PyReq;
 import com.smppw.analysis.domain.dto.style.py.PyReqBody;
 import com.smppw.analysis.domain.dto.style.py.PyReqParam;
 import com.smppw.analysis.domain.dto.style.py.PyResBody;
 import com.smppw.analysis.domain.service.BaseInfoService;
+import com.smppw.analysis.domain.service.FundStyleService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.*;
 import com.smppw.analysis.infrastructure.exception.APIException;
@@ -27,6 +30,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.nio.charset.Charset;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -144,10 +148,12 @@ public class StyleServiceImpl implements StyleService {
 
     private final String pyBaseUrl;
     private final BaseInfoService baseInfoService;
+    private final FundStyleService fundStyleService;
 
-    public StyleServiceImpl(AnalysisProperty property, BaseInfoService baseInfoService) {
+    public StyleServiceImpl(AnalysisProperty property, BaseInfoService baseInfoService, FundStyleService fundStyleService) {
         this.pyBaseUrl = property.getPyUrl();
         this.baseInfoService = baseInfoService;
+        this.fundStyleService = fundStyleService;
     }
 
     /**
@@ -1022,52 +1028,47 @@ public class StyleServiceImpl implements StyleService {
     @SuppressWarnings("unchecked")
     public Map<String, Object> rzStyle(RzStyleParams params) {
         try {
-//            List<Map<String, String>> initDataList = new RZTrendDao(this.jdbcTemplate, params.getSecId(), params.getStartDate(), params.getEndDate(),
-//                    params.getRaiseType(), Strategy.All).query();
-//            List<Map<String, Object>> dataset = ListUtil.list(true);
-//            for (Map<String, String> data : initDataList) {
-//                Map<String, Object> temp = MapUtil.newHashMap();
-//                temp.put("date", data.get("end_date"));
-//                temp.put("upside", data.get("upsidecapture_ratio"));
-//                temp.put("downside", data.get("downsidecapture_ratio"));
-//                temp.put("style", data.get("style_type"));
-//                dataset.add(temp);
-//            }
-//            Map<String, String> mapper = MapUtil.<String, String>builder(MapUtil.newHashMap(true))
-//                    .put("date", "时间").put("upside", "进攻能力").put("downside", "防御能力").put("style", "风格").build();
-//            Map<String, Object> chart1 = MapUtil.<String, Object>builder().put("dataset", dataset)
-//                    .put("chartProductNameMapping", mapper).put("tableProductNameMapping", mapper).build();
-//
-//            List<String> secIdList = ListUtil.list(true);
-//            List<String> fundBenchmarkList = ListUtil.toList(params.getSecId(), params.getBenchmarkId());
-//            List<String> unionIds = CollUtil.addAllIfNotContains(fundBenchmarkList, secIdList);
-//            Map<String, Object> rzTrend = this.globalService.getDataPoint(unionIds, params.getRaiseType(), params.getUserId());
-//            List<String> categories = MapUtil.get(rzTrend, "categories", List.class);
-//            List<List<Map<String, Object>>> datasetList = MapUtil.get(rzTrend, "dataset", List.class);
-//            Map<String, Object> dataset2 = MapUtil.newHashMap();
-//            for (int i = 0; i < categories.size(); i++) {
-//                List<Map<String, Object>> tempList = datasetList.get(i);
-//                List<Map<String, Object>> collect = tempList.stream().map(e -> {
-//                    List<Map<String, Object>> values = MapUtil.get(e, "values", List.class);
-//                    Map<String, Object> res = MapUtil.newHashMap();
-//                    res.put("id", e.get("id"));
-//                    res.put("type", e.get("type"));
-//                    res.put("value", values.get(0).get("value"));
-//                    return res;
-//                }).collect(Collectors.toList());
-//                dataset2.put(categories.get(i), collect);
-//            }
-//            Map<String, String> mapper2 = this.secId2NameService.query(categories);
-//            Map<String, Object> chart2 = MapUtil.<String, Object>builder().put("dataset", dataset2)
-//                    .put("chartProductNameMapping", mapper2).put("tableProductNameMapping", mapper2).build();
-//            return MapUtil.<String, Object>builder().put("chart1", chart1).put("chart2", chart2).build();
-            return null;
+            List<FundStyleStatsDO> fundStyleStatsList = fundStyleService.listFundStyleOverview(params.getSecId());
+            List<Map<String, Object>> dataset = ListUtil.list(true);
+            for (FundStyleStatsDO fundStyleStatsDO : fundStyleStatsList) {
+                Map<String, Object> tempMap = MapUtil.newHashMap();
+                tempMap.put("date", fundStyleStatsDO.getEndDate());
+                tempMap.put("upside", fundStyleStatsDO.getUpsideCaptureRatio1y());
+                tempMap.put("downside",fundStyleStatsDO.getDownsideCaptureRatio1y());
+                tempMap.put("style", handleFundStyle(fundStyleStatsDO.getUpsideCaptureRatio1y(),fundStyleStatsDO.getDownsideCaptureRatio1y()));
+                dataset.add(tempMap);
+            }
+            Map<String, String> mapper = MapUtil.<String, String>builder(MapUtil.newHashMap(true))
+                    .put("date", "时间").put("upside", "进攻能力").put("downside", "防御能力").put("style", "风格").build();
+            Map<String, Object> chart1 = MapUtil.<String, Object>builder().put("dataset", dataset)
+                    .put("chartProductNameMapping", mapper).put("tableProductNameMapping", mapper).build();
+
+            List<String> secIdList = ListUtil.list(true);
+            List<String> fundBenchmarkList = ListUtil.toList(params.getSecId(), params.getBenchmarkId());
+            List<String> unionIds = CollUtil.addAllIfNotContains(fundBenchmarkList, secIdList);
+            return MapUtil.<String, Object>builder().put("chart1", chart1).build();
+
         } catch (Exception e) {
             logger.error("风格总览计算错误" + e.getMessage());
             return MapUtil.empty();
         }
     }
 
+    private String handleFundStyle(BigDecimal upside, BigDecimal downside) {
+        String style;
+        BigDecimal standardLevel = BigDecimal.valueOf(0.5);
+        if (standardLevel.compareTo(upside) <= 0 && standardLevel.compareTo(downside) >= 0) {
+            style = "攻守兼备型";
+        } else if (standardLevel.compareTo(upside) > 0 && standardLevel.compareTo(downside) > 0) {
+            style = "防御型";
+        } else if (standardLevel.compareTo(upside) < 0 && standardLevel.compareTo(downside) < 0) {
+            style = "进攻型";
+        } else {
+            style = "风格不明显";
+        }
+        return style;
+    }
+
     /**
      * 成长价值和行业配置接口重构,支持基金、机构、经理、组合等
      *

+ 27 - 0
src/main/java/com/smppw/analysis/domain/dao/FundStyleDao.java

@@ -0,0 +1,27 @@
+package com.smppw.analysis.domain.dao;
+
+import com.smppw.analysis.domain.dataobject.FundStyleStatsDO;
+import com.smppw.analysis.domain.persistence.FundStyleStatsMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 基金风格ao
+ */
+@Service
+public class FundStyleDao {
+
+    private final FundStyleStatsMapper fundStyleStatsMapper;
+
+    public FundStyleDao(FundStyleStatsMapper fundStyleStatsMapper) {
+        this.fundStyleStatsMapper = fundStyleStatsMapper;
+    }
+
+    public List<FundStyleStatsDO> listFundStyleOverview(String fundId){
+        return fundStyleStatsMapper.listFundStyleOverview(fundId);
+    }
+
+}

+ 237 - 0
src/main/java/com/smppw/analysis/domain/dataobject/FundStyleStatsDO.java

@@ -0,0 +1,237 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 9:30
+ * @description 基金风格指标表DO
+ */
+@Data
+public class FundStyleStatsDO {
+
+    /**
+     * 主键id
+     */
+    private Integer id;
+
+    /**
+     * 基金id
+     */
+    private String fundId;
+
+    /**
+     * 今年以来的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRetYtd;
+
+    /**
+     * 最近半年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet6m;
+
+    /**
+     * 最近一年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet1y;
+
+    /**
+     * 最近两年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet2y;
+
+    /**
+     * 最近三年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet3y;
+
+    /**
+     * 最近四年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet4y;
+
+    /**
+     * 最近五年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet5y;
+
+    /**
+     * 最近十年的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRet10y;
+
+    /**
+     * 成立以来的上行捕获收益率
+     */
+    private BigDecimal upsideCaptureRetIncep;
+
+    /**
+     * 今年以来的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRetYtd;
+
+    /**
+     * 最近半年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet6m;
+
+    /**
+     * 最近一年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet1y;
+
+    /**
+     * 最近两年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet2y;
+
+    /**
+     * 最近三年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet3y;
+
+    /**
+     * 最近四年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet4y;
+
+    /**
+     * 最近五年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet5y;
+
+    /**
+     * 最近十年的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRet10y;
+
+    /**
+     * 成立以来的下行捕获收益率
+     */
+    private BigDecimal downsideCaptureRetIncep;
+
+    /**
+     * 今年以来的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatioYtd;
+
+    /**
+     * 最近半年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio6m;
+
+    /**
+     * 最近一年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio1y;
+
+    /**
+     * 最近两年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio2y;
+
+    /**
+     * 最近三年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio3y;
+
+    /**
+     * 最近四年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio4y;
+
+    /**
+     * 最近五年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio5y;
+
+    /**
+     * 最近十年的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatio10y;
+
+    /**
+     * 成立以来的上行捕获率
+     */
+    private BigDecimal upsideCaptureRatioIncep;
+
+    /**
+     * 今年以来的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatioYtd;
+
+    /**
+     * 最近半年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio6m;
+
+    /**
+     * 最近一年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio1y;
+
+    /**
+     * 最近两年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio2y;
+
+    /**
+     * 最近三年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio3y;
+
+    /**
+     * 最近四年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio4y;
+
+    /**
+     * 最近五年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio5y;
+
+    /**
+     * 最近十年的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatio10y;
+
+    /**
+     * 成立以来的下行捕获率
+     */
+    private BigDecimal downsideCaptureRatioIncep;
+
+    /**
+     * 截止日期
+     */
+    private String endDate;
+
+    /**
+     * 创建者id
+     */
+    private Integer creatorid;
+
+    /**
+     * 创建时间
+     */
+    private Date createtime;
+
+    /**
+     * 修改者id
+     */
+    private Integer updaterid;
+
+    /**
+     * 修改时间
+     */
+    private Date updatetime;
+
+    /**
+     * 记录的有效性;1-有效;0-无效;
+     */
+    private Integer isvalid;
+
+}
+

+ 25 - 0
src/main/java/com/smppw/analysis/domain/persistence/FundStyleStatsMapper.java

@@ -0,0 +1,25 @@
+package com.smppw.analysis.domain.persistence;
+
+import com.smppw.analysis.domain.dataobject.FundStyleStatsDO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 9:30
+ * @description 基金风格指标表Mapper
+ */
+@Repository
+public interface FundStyleStatsMapper {
+
+    /**
+     * 获取基金成立以来的风格总览
+     *
+     * @param fundId 基金id
+     * @return 基金成立以来的风格总览
+     */
+    List<FundStyleStatsDO> listFundStyleOverview(@Param("fundId") String fundId);
+
+}

+ 22 - 0
src/main/java/com/smppw/analysis/domain/service/FundStyleService.java

@@ -0,0 +1,22 @@
+package com.smppw.analysis.domain.service;
+
+import com.smppw.analysis.domain.dataobject.FundStyleStatsDO;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 基金风格domain服务层
+ */
+public interface FundStyleService {
+
+    /**
+     * 获取基金成立以来的风格总览
+     *
+     * @param fundId 基金id
+     * @return 基金成立以来的风格总览
+     */
+    List<FundStyleStatsDO> listFundStyleOverview(String fundId);
+
+}

+ 29 - 0
src/main/java/com/smppw/analysis/domain/service/impl/FundStyleServiceImpl.java

@@ -0,0 +1,29 @@
+package com.smppw.analysis.domain.service.impl;
+
+import com.smppw.analysis.domain.dao.FundStyleDao;
+import com.smppw.analysis.domain.dataobject.FundStyleStatsDO;
+import com.smppw.analysis.domain.service.FundStyleService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 基金风格domain服务实现层
+ */
+@Service
+public class FundStyleServiceImpl implements FundStyleService {
+
+    private final FundStyleDao fundStyleDao;
+
+    public FundStyleServiceImpl(FundStyleDao fundStyleDao) {
+        this.fundStyleDao = fundStyleDao;
+    }
+
+    @Override
+    public List<FundStyleStatsDO> listFundStyleOverview(String fundId) {
+        return fundStyleDao.listFundStyleOverview(fundId);
+    }
+
+}

+ 18 - 0
src/main/resources/mapping/FundStyleStatsMapper.xml

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.smppw.analysis.domain.persistence.FundStyleStatsMapper">
+
+    <select id="listFundStyleOverview" resultType="com.smppw.analysis.domain.dataobject.FundStyleStatsDO">
+        SELECT fund_id                  AS fundId,
+               end_date                 as endDate,
+               upsidecapture_ratio_1y   AS upsideCaptureRatio1y,
+               downsidecapture_ratio_1y AS downsideCaptureRatio1y
+        FROM rz_hfdb_core.`fund_style_stats` cfi
+        WHERE fund_id = #{fundId}
+          AND upsidecapture_ratio_1y IS NOT NULL
+          AND downsidecapture_ratio_1y IS NOT NULL
+          AND isvalid = 1
+        ORDER BY end_date
+    </select>
+
+</mapper>