فهرست منبع

feat:获取公募基金申赎费率的实现

mozuwen 1 سال پیش
والد
کامیت
472e48ec1e

+ 77 - 5
src/main/java/com/smppw/analysis/application/service/info/FundInfoService.java

@@ -6,12 +6,10 @@ import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.smppw.analysis.application.dto.info.*;
-import com.smppw.analysis.domain.dataobject.FundArchivesInfoDO;
-import com.smppw.analysis.domain.dataobject.FundFeeDo;
-import com.smppw.analysis.domain.dataobject.ManualFundNoticeInfoDO;
-import com.smppw.analysis.domain.dataobject.FundSimilarDo;
+import com.smppw.analysis.domain.dataobject.*;
 import com.smppw.analysis.domain.dto.info.*;
 import com.smppw.analysis.domain.dto.performance.IndicatorParams;
 import com.smppw.analysis.domain.manager.performance.Performance;
@@ -23,11 +21,11 @@ import com.smppw.analysis.domain.service.NavService;
 import com.smppw.analysis.infrastructure.utils.StringUtil;
 import com.smppw.common.pojo.IStrategy;
 import com.smppw.common.pojo.NewSubStrategy;
+import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcPropertyDto;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcTimeRangeDto;
 import com.smppw.common.pojo.enums.*;
-import com.smppw.constants.Consts;
 import com.smppw.constants.DateConst;
 import com.smppw.core.IndicatorService;
 import com.smppw.utils.BigDecimalUtils;
@@ -39,6 +37,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.RoundingMode;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -300,4 +299,77 @@ public class FundInfoService {
         return fundFeeDo;
     }
 
+    public ManualFundFeeInfoVO getMfFundFee(String fundId) {
+        List<ManualFundFeeDo> dataList = this.baseInfoService.getManualFundFee(fundId);
+        ManualFundFeeInfoVO result = new ManualFundFeeInfoVO();
+        // 数据库 费率 类型与中文映射
+        Map<String, String> typeMapper = MapUtil.builder("10210", "认购金额").put("11210", "申购金额").put("11010", "申购金额")
+                .put("12200", "持有期限").put("12000", "持有期限").build();
+        // 费率类型 与 单位映射
+        Map<String, String> unitMapper = MapUtil.builder("10210", "万元").put("11210", "万元").put("11010", "万元")
+                .put("12200", "日").put("12000", "日").build();
+        // 记录映射函数,返回一个包含最大最小的范围
+        Function<ManualFundFeeDo, ValueLabelVO> function = e -> {
+            ValueLabelVO vo = new ValueLabelVO();
+            vo.setValue(e.getChargeRateDes());
+            String label = typeMapper.get(e.getChargeRateType());
+            // 最小值不为0和null时,设置为起始数据
+            if (e.getStDivStand1() != null && !Double.valueOf(0.0d).equals(e.getStDivStand1())) {
+                label = NumberUtil.roundStr(e.getStDivStand1(), 0) + unitMapper.get(e.getChargeRateType()) + " <= " + label;
+            }
+            // 最大值不为null时设置截止范围数据
+            if (e.getEnDivStand1() != null) {
+                label += " < " + NumberUtil.roundStr(e.getEnDivStand1(), 0) + unitMapper.get(e.getChargeRateType());
+            }
+            vo.setLabel(label);
+            return vo;
+        };
+        // 认购费
+        List<ValueLabelVO> subscriptionFee = this.handleFee(dataList, "10210", function);
+        result.setSubscriptionFee(subscriptionFee);
+        // 申购费,先取场外
+        List<ValueLabelVO> applyFee = this.handleFee(dataList, "11210", function);
+        if (applyFee.isEmpty()) {
+            applyFee = this.handleFee(dataList, "11010", function);
+        }
+        result.setApplyFee(applyFee);
+        // 赎回费,先取场外
+        List<ValueLabelVO> redemptionFee = this.handleFee(dataList, "12200", function);
+        if (redemptionFee.isEmpty()) {
+            redemptionFee = this.handleFee(dataList, "12000", function);
+        }
+        result.setRedemptionFee(redemptionFee);
+        // 管理费、托管费和营销费
+        result.setManagementFeeTrust(this.handleOneFee(dataList, "15000", ManualFundFeeDo::getChargeRateDes));
+        result.setManagementFeeBank(this.handleOneFee(dataList, "16000", ManualFundFeeDo::getChargeRateDes));
+        result.setSaleFee(this.handleOneFee(dataList, "19000", ManualFundFeeDo::getChargeRateDes));
+        return result;
+    }
+
+    /**
+     * 费率处理工具,返回一个列表
+     *
+     * @param dataList 费率数据
+     * @param type     过滤的关键字
+     * @param function 转换函数
+     * @param <T>      类型参数
+     * @return /
+     */
+    private <T> List<T> handleFee(List<ManualFundFeeDo> dataList, String type, Function<ManualFundFeeDo, T> function) {
+        return dataList.stream().filter(e -> type.equals(e.getChargeRateType())).map(function).collect(Collectors.toList());
+    }
+
+    /**
+     * 费率处理工具,返回一个对象
+     *
+     * @param dataList 费率数据
+     * @param type     过滤的关键字
+     * @param function 转换函数
+     * @param <T>      类型参数
+     * @return /
+     */
+    private <T> T handleOneFee(List<ManualFundFeeDo> dataList, String type, Function<ManualFundFeeDo, T> function) {
+        return this.handleFee(dataList, type, function).stream().findFirst().orElse(null);
+    }
+
 }

+ 13 - 5
src/main/java/com/smppw/analysis/client/FundApi.java

@@ -2,10 +2,7 @@ package com.smppw.analysis.client;
 
 import com.smppw.analysis.application.dto.info.*;
 import com.smppw.analysis.application.service.info.FundInfoService;
-import com.smppw.analysis.domain.dto.info.FundBaseFeeVO;
-import com.smppw.analysis.domain.dto.info.FundSimilarVO;
-import com.smppw.analysis.domain.dto.info.ManualFundInvestInfoVO;
-import com.smppw.analysis.domain.dto.info.ManualFundNoticeInfoVO;
+import com.smppw.analysis.domain.dto.info.*;
 import com.smppw.common.pojo.ResultVo;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -71,7 +68,7 @@ public class FundApi {
     }
 
     /**
-     * 基金费率信息
+     * 私募基金费率信息
      *
      * @param refId 基金id
      * @return 基金费率信息
@@ -81,4 +78,15 @@ public class FundApi {
         return ResultVo.ok(this.service.getFundFee(refId));
     }
 
+    /**
+     * 公募基金费率信息
+     *
+     * @param refId 基金id
+     * @return 基金费率信息
+     */
+    @GetMapping("mf-fee")
+    public ResultVo<ManualFundFeeInfoVO> mFFundFee(String refId) {
+        return ResultVo.ok(this.service.getMfFundFee(refId));
+    }
+
 }

+ 45 - 0
src/main/java/com/smppw/analysis/domain/dataobject/ManualFundFeeDo.java

@@ -0,0 +1,45 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 公募基金费率信息
+ */
+@Data
+public class ManualFundFeeDo {
+
+    /**
+     * 基金id
+     */
+    private String fundId;
+    /**
+     * 费率类别
+     * 10210 - 认购费场外前端
+     * 11010 - 日常申购费前端
+     * 11210 - 日常申购费场外前端
+     * 12000 - 日常赎回费
+     * 12200 - 日常赎回费场外
+     * 15000 - 管理费
+     * 16000 - 托管费
+     * 19000 - 营销费
+     */
+    private String chargeRateType;
+
+    /**
+     * 费率描述
+     */
+    private String chargeRateDes;
+
+    /**
+     * 费率划分标准范围Ⅰ起始数值
+     */
+    private Double stDivStand1;
+
+    /**
+     * 费率划分标准范围Ⅰ截止数值
+     */
+    private Double enDivStand1;
+
+}

+ 1 - 1
src/main/java/com/smppw/analysis/domain/dto/info/FundBaseFeeVO.java

@@ -5,7 +5,7 @@ import lombok.Data;
 /**
  * @author mozuwen
  * @date 2023/8/9 11:25
- * @description 基金费率信息
+ * @description 私募基金费率信息
  */
 @Data
 public class FundBaseFeeVO {

+ 46 - 0
src/main/java/com/smppw/analysis/domain/dto/info/ManualFundFeeInfoVO.java

@@ -0,0 +1,46 @@
+package com.smppw.analysis.domain.dto.info;
+
+import com.smppw.common.pojo.ValueLabelVO;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 公募基金费率信息
+ */
+@Data
+public class ManualFundFeeInfoVO {
+
+    /**
+     * 认购费
+     */
+    private List<ValueLabelVO> subscriptionFee;
+
+    /**
+     * 申购费
+     */
+    private List<ValueLabelVO> applyFee;
+
+    /**
+     * 赎回费
+     */
+    private List<ValueLabelVO> redemptionFee;
+
+    /**
+     * 管理费
+     */
+    private String managementFeeTrust;
+
+    /**
+     * 托管费
+     */
+    private String managementFeeBank;
+
+    /**
+     * 营销费
+     */
+    private String saleFee;
+
+}

+ 24 - 0
src/main/java/com/smppw/analysis/domain/mapper/MfChargeRateMapper.java

@@ -0,0 +1,24 @@
+package com.smppw.analysis.domain.mapper;
+
+import com.smppw.analysis.domain.dataobject.ManualFundFeeDo;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 14:30
+ * @description 公募基金费率信息Mapper
+ */
+@Repository
+public interface MfChargeRateMapper {
+
+    /**
+     * 获取公募基金费率信息
+     *
+     * @param fundId 基金id
+     * @return 公募基金费率信息
+     */
+    List<ManualFundFeeDo> getManualFundFee(String fundId);
+
+}

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

@@ -121,4 +121,14 @@ public interface BaseInfoService {
      * @return 基金的申赎费率信息
      */
     FundFeeDo getFundFee(String fundId);
+
+
+    /**
+     * 获取公募基金费率信息
+     *
+     * @param fundId 基金id
+     * @return 公募基金费率信息
+     */
+    List<ManualFundFeeDo> getManualFundFee(String fundId);
+
 }

+ 10 - 1
src/main/java/com/smppw/analysis/domain/service/impl/BaseInfoServiceImpl.java

@@ -17,6 +17,7 @@ import com.smppw.analysis.domain.dto.info.FundSimilarParams;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
 import com.smppw.analysis.domain.gateway.CacheGateway;
+import com.smppw.analysis.domain.mapper.MfChargeRateMapper;
 import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.RedisConst;
@@ -65,10 +66,12 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
     private final FundAnnounceDao fundAnnounceDao;
     private final FundArchivesDao fundArchivesDao;
     private ApplicationContext applicationContext;
+    private final MfChargeRateMapper mfChargeRateMapper;
 
     public BaseInfoServiceImpl(AnalysisProperty property, CacheFactory factory, RankFactory rankFactory,
                                IndexesProfileDao indexesProfileDao, RongzhiIndexNavDao rongzhiIndexNavDao,
-                               FundInformationDao fundInformationDao, FundAnnounceDao fundAnnounceDao, FundArchivesDao fundArchivesDao) {
+                               FundInformationDao fundInformationDao, FundAnnounceDao fundAnnounceDao,
+                               FundArchivesDao fundArchivesDao, MfChargeRateMapper mfChargeRateMapper) {
         this.rankDao = rankFactory.getInstance(property.getDataSource());
         this.cacheGateway = factory.getCacheGateway(property.getCacheType());
         this.indexesProfileDao = indexesProfileDao;
@@ -76,6 +79,7 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
         this.fundInformationDao = fundInformationDao;
         this.fundAnnounceDao = fundAnnounceDao;
         this.fundArchivesDao = fundArchivesDao;
+        this.mfChargeRateMapper = mfChargeRateMapper;
     }
 
     @Override
@@ -280,6 +284,11 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
         return fundInformationDao.getFundFee(fundId);
     }
 
+    @Override
+    public List<ManualFundFeeDo> getManualFundFee(String fundId) {
+        return mfChargeRateMapper.getManualFundFee(fundId);
+    }
+
     /**
      * 把指定类型的标的的名称映射查询出来
      *

+ 18 - 0
src/main/resources/mapping/MfChargeRetMapper.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.mapper.MfChargeRateMapper">
+
+    <select id="getManualFundFee" resultType="com.smppw.analysis.domain.dataobject.ManualFundFeeDo">
+        select fund_id          as fundId,
+               charge_rate_type as chargeRateType,
+               charge_rate_des  as chargeRateDes,
+               st_div_stand1    as stDivStand1,
+               en_div_stand1    as enDivStand1
+        from rz_hfdb_core.mf_charge_rate
+        where fund_id = #{fundId}
+          and charge_rate_type in (10210, 11010, 11210, 12000, 12200, 15000, 16000, 19000)
+          and isvalid = 1
+          and if_executed = 1
+    </select>
+
+</mapper>