Browse Source

冲突解决

wangzaijun 1 year ago
parent
commit
7dd1694e58

+ 85 - 8
src/main/java/com/smppw/analysis/application/service/info/FundInfoService.java

@@ -9,12 +9,10 @@ import cn.hutool.core.text.CharSequenceUtil;
 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.dto.info.FundSimilarParams;
-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.analysis.domain.dto.performance.IndicatorParams;
 import com.smppw.analysis.domain.manager.performance.Performance;
 import com.smppw.analysis.domain.manager.performance.PerformanceConstants;
@@ -22,21 +20,25 @@ import com.smppw.analysis.domain.manager.performance.PerformanceFactory;
 import com.smppw.analysis.domain.service.BaseIndicatorServiceV2;
 import com.smppw.analysis.domain.service.BaseInfoService;
 import com.smppw.analysis.domain.service.NavService;
+import com.smppw.analysis.infrastructure.utils.StringUtil;
 import com.smppw.common.pojo.IStrategy;
 import com.smppw.common.pojo.NewSubStrategy;
 import com.smppw.common.pojo.dto.DateValue;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcPropertyDto;
 import com.smppw.common.pojo.dto.calc.IndicatorCalcTimeRangeDto;
 import com.smppw.common.pojo.enums.*;
+import com.smppw.constants.Consts;
+import com.smppw.constants.DateConst;
 import com.smppw.core.IndicatorService;
+import com.smppw.utils.BigDecimalUtils;
 import com.smppw.utils.CalcUtils;
 import com.smppw.utils.NavUtil;
 import com.smppw.utils.StrategyHandleUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
+import java.math.RoundingMode;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -45,6 +47,8 @@ public class FundInfoService {
     private final PerformanceFactory factory;
     private final BaseInfoService baseInfoService;
     private final BaseIndicatorServiceV2 baseIndicatorServiceV2;
+    private static final Map<String, String> ACCRUED_FREQUENCY = MapUtil.newHashMap();
+    private static final Map<String, String> ACCRUED_METHOD = MapUtil.newHashMap();
 
     public FundInfoService(NavService navService, PerformanceFactory factory,
                            BaseInfoService baseInfoService, BaseIndicatorServiceV2 baseIndicatorServiceV2) {
@@ -54,6 +58,17 @@ public class FundInfoService {
         this.baseIndicatorServiceV2 = baseIndicatorServiceV2;
     }
 
+    static {
+        ACCRUED_FREQUENCY.put("1", "月");
+        ACCRUED_FREQUENCY.put("2", "季");
+        ACCRUED_FREQUENCY.put("3", "半年");
+        ACCRUED_FREQUENCY.put("4", "年");
+        ACCRUED_FREQUENCY.put("0", "不固定");
+        ACCRUED_METHOD.put("1", "高水位");
+        ACCRUED_METHOD.put("2", "高水位+赎回时补充");
+        ACCRUED_METHOD.put("3", "单客户高水位");
+    }
+
     public PrivatelyFundHeadInfoVO headInfo(HeadInfoReq params) {
         return new PrivatelyFundHeadInfoVO();
     }
@@ -215,7 +230,7 @@ public class FundInfoService {
     public ManualFundInvestInfoVO investInfo(String refId) {
         ManualFundInvestInfoVO fundInvestInfoVO = new ManualFundInvestInfoVO();
         FundArchivesInfoDO fundArchivesInfo = this.baseInfoService.queryFundArchives(refId);
-        if(fundArchivesInfo==null){
+        if (fundArchivesInfo == null) {
             return fundInvestInfoVO;
         }
         fundInvestInfoVO.setInvestmentObjective(fundArchivesInfo.getInvestmentObjective());
@@ -223,4 +238,66 @@ public class FundInfoService {
         fundInvestInfoVO.setInvestmentScope(fundArchivesInfo.getInvestmentScope());
         return fundInvestInfoVO;
     }
+
+    public FundBaseFeeVO getFundFee(String refId) {
+        FundFeeDo fundFee = this.baseInfoService.getFundFee(refId);
+        DateFormatUtils.format(new Date(), DateConst.YYYY, TimeZone.getDefault());
+        //数字格式处理
+        FundFeeDo fundFees = numberFormat(fundFee);
+        FundBaseFeeVO fee = BeanUtil.copyProperties(fundFees, FundBaseFeeVO.class);
+        String frequency = Optional.ofNullable(fundFees.getAccruedFrequency()).map(e -> StrUtil.subBetween(e, "[", "]"))
+                .map(e -> StrUtil.split(e, ",")).orElse(ListUtil.empty()).stream().filter(StrUtil::isNotBlank)
+                .map(ACCRUED_FREQUENCY::get).collect(Collectors.joining(","));
+        fee.setAccruedFrequency(frequency);
+        String method = Optional.ofNullable(fundFees.getAccruedMethod()).map(e -> StrUtil.subBetween(e, "[", "]"))
+                .map(e -> StrUtil.split(e, ",")).orElse(ListUtil.empty()).stream().filter(StrUtil::isNotBlank)
+                .map(ACCRUED_METHOD::get).collect(Collectors.joining(","));
+        fee.setAccruedMethod(method);
+        return fee;
+    }
+
+    private FundFeeDo numberFormat(FundFeeDo fundFees) {
+        FundFeeDo fundFeeDo = fundFees;
+        String minInvestmentShare = fundFees.getMinInvestmentShare();
+        fundFeeDo.setMinInvestmentShare(minInvestmentShare != null && StringUtil.isNumeric(minInvestmentShare) ? BigDecimalUtils.toBigDecimal(minInvestmentShare)
+                .setScale(2, RoundingMode.HALF_DOWN) + "万" : minInvestmentShare);
+
+        String managementFeeBank = fundFees.getManagementFeeBank();
+        fundFeeDo.setManagementFeeBank(managementFeeBank != null && StringUtil.isNumeric(managementFeeBank) ? BigDecimalUtils.toBigDecimal(managementFeeBank)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : managementFeeBank);
+
+        String subscriptionFee = fundFees.getSubscriptionFee();
+        fundFeeDo.setSubscriptionFee(subscriptionFee != null && StringUtil.isNumeric(subscriptionFee) ? BigDecimalUtils.toBigDecimal(subscriptionFee)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : subscriptionFee);
+
+        String redemptionFee = fundFees.getRedemptionFee();
+        fundFeeDo.setRedemptionFee(redemptionFee != null && StringUtil.isNumeric(redemptionFee) ? BigDecimalUtils.toBigDecimal(redemptionFee)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : redemptionFee);
+
+        String managementFee = fundFees.getManagementFee();
+        fundFeeDo.setManagementFee(managementFee != null && StringUtil.isNumeric(managementFee) ? BigDecimalUtils.toBigDecimal(managementFee)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : managementFee);
+
+        String managementFeeConsult = fundFees.getManagementFeeConsult();
+        fundFeeDo.setManagementFeeConsult(managementFeeConsult != null && StringUtil.isNumeric(managementFeeConsult) ? BigDecimalUtils.toBigDecimal(managementFeeConsult)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : managementFeeConsult);
+
+        String performanceFee = fundFees.getPerformanceFee();
+        fundFeeDo.setPerformanceFee(performanceFee != null && StringUtil.isNumeric(performanceFee) ? BigDecimalUtils.toBigDecimal(performanceFee)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : performanceFee);
+
+        String guardLine = fundFees.getGuardLine();
+        fundFeeDo.setGuardLine(guardLine != null && StringUtil.isNumeric(guardLine) ? BigDecimalUtils.toBigDecimal(guardLine)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : guardLine);
+
+        String subsequentInvestmentShare = fundFees.getSubsequentInvestmentShare();
+        fundFeeDo.setSubsequentInvestmentShare(subsequentInvestmentShare != null && StringUtil.isNumeric(subsequentInvestmentShare) ? BigDecimalUtils.toBigDecimal(subsequentInvestmentShare)
+                .setScale(2, RoundingMode.HALF_DOWN) + "万" : subsequentInvestmentShare);
+
+        String stopLossLine = fundFees.getStopLossLine();
+        fundFeeDo.setStopLossLine(stopLossLine != null && StringUtil.isNumeric(stopLossLine) ? BigDecimalUtils.toBigDecimal(stopLossLine)
+                .setScale(2, RoundingMode.HALF_DOWN) + "%" : stopLossLine);
+        return fundFeeDo;
+    }
+
 }

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

@@ -2,6 +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;
@@ -59,7 +60,7 @@ public class FundApi {
     }
 
     /**
-     * 基金投资类信息说明
+     * 公募基金投资类信息说明
      *
      * @param refId 基金id
      * @return 投资类信息说明
@@ -69,4 +70,15 @@ public class FundApi {
         return ResultVo.ok(service.investInfo(refId));
     }
 
+    /**
+     * 基金费率信息
+     *
+     * @param refId 基金id
+     * @return 基金费率信息
+     */
+    @GetMapping("fee")
+    public ResultVo<FundBaseFeeVO> fee(String refId) {
+        return ResultVo.ok(this.service.getFundFee(refId));
+    }
+
 }

+ 5 - 4
src/main/java/com/smppw/analysis/domain/dao/FundInformationDao.java

@@ -1,10 +1,7 @@
 package com.smppw.analysis.domain.dao;
 
 import cn.hutool.core.map.MapUtil;
-import com.smppw.analysis.domain.dataobject.FundFrequencyDo;
-import com.smppw.analysis.domain.dataobject.FundInformationDo;
-import com.smppw.analysis.domain.dataobject.FundSimilarDo;
-import com.smppw.analysis.domain.dataobject.MonetaryFundProfitDO;
+import com.smppw.analysis.domain.dataobject.*;
 import com.smppw.analysis.domain.mapper.core.FundFrequencyDoMapper;
 import com.smppw.analysis.domain.mapper.core.FundInformationDoMapper;
 import com.smppw.analysis.domain.mapper.core.MonetaryFundProfitMapper;
@@ -79,4 +76,8 @@ public class FundInformationDao {
     public List<FundSimilarDo> getSameStrategyFundIds(Map<String, Object> params) {
         return this.fundInformationDoMapper.getSameStrategyFundIds(params);
     }
+
+    public FundFeeDo getFundFee(String fundId) {
+        return this.fundInformationDoMapper.getFundFee(fundId);
+    }
 }

+ 128 - 0
src/main/java/com/smppw/analysis/domain/dataobject/FundFeeDo.java

@@ -0,0 +1,128 @@
+package com.smppw.analysis.domain.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 11:25
+ * @description 基金费率信息
+ */
+@Data
+public class FundFeeDo {
+
+    /**
+     * 基金id
+     */
+    private String fundId;
+
+    /**
+     * 认购起点
+     */
+    private String minInvestmentShare;
+
+    /**
+     * 封闭期
+     */
+    private String lockupPeriod;
+
+    /**
+     * 认购费率
+     */
+    private String subscriptionFee;
+
+    /**
+     *
+     */
+    private String subscriptionFeeNote;
+
+    /**
+     * 赎回费率
+     */
+    private String redemptionFee;
+
+    /**
+     * 赎回费率说明
+     */
+    private String redemptionFeeNote;
+
+    /**
+     * 存续期限
+     */
+    private String duration;
+
+    /**
+     * 托管费
+     */
+    private String managementFeeBank;
+
+    /**
+     * 投资顾问管理费
+     */
+    private String managementFeeConsult;
+
+    /**
+     * 开放日
+     */
+    private String openDay;
+
+    /**
+     * 管理费率
+     */
+    private String managementFee;
+
+    /**
+     * 业绩报酬计提率
+     */
+    private String performanceFee;
+
+    /**
+     * 业绩报酬说明
+     */
+    private String performanceFeeNote;
+
+    /**
+     * 业绩报酬计提对象
+     */
+    private String accruedWay;
+
+    /**
+     * 业绩报酬计提方式
+     */
+    private String accruedMethod;
+
+    /**
+     * 业绩报酬计提频率
+     */
+    private String accruedFrequency;
+
+    /**
+     * 预警线
+     */
+    private String guardLine;
+
+    /**
+     * 业绩锁定期
+     */
+    private String lockPeriod;
+
+    /**
+     * 赎回日
+     */
+    private String redemptionDay;
+
+    /**
+     * 基础货币
+     */
+    private String baseCurrency;
+
+    /**
+     * 追加起点
+     */
+    private String subsequentInvestmentShare;
+
+    /**
+     * 止损线
+     */
+    private String stopLossLine;
+
+}

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

@@ -0,0 +1,128 @@
+package com.smppw.analysis.domain.dto.info;
+
+import lombok.Data;
+
+/**
+ * @author mozuwen
+ * @date 2023/8/9 11:25
+ * @description 基金费率信息
+ */
+@Data
+public class FundBaseFeeVO {
+
+    /**
+     * 基金id
+     */
+    private String fundId;
+
+    /**
+     * 认购起点
+     */
+    private String minInvestmentShare;
+
+    /**
+     * 封闭期
+     */
+    private String lockupPeriod;
+
+    /**
+     * 托管费
+     */
+    private String managementFeeBank;
+
+    /**
+     * 投资顾问管理费
+     */
+    private String managementFeeConsult;
+
+    /**
+     * 认购费率
+     */
+    private String subscriptionFee;
+
+    /**
+     *
+     */
+    private String subscriptionFeeNote;
+
+    /**
+     * 赎回费率
+     */
+    private String redemptionFee;
+
+    /**
+     * 赎回费率说明
+     */
+    private String redemptionFeeNote;
+
+    /**
+     * 存续期限
+     */
+    private String duration;
+
+    /**
+     * 开放日
+     */
+    private String openDay;
+
+    /**
+     * 管理费率
+     */
+    private String managementFee;
+
+    /**
+     * 业绩报酬计提率
+     */
+    private String performanceFee;
+
+    /**
+     * 业绩报酬说明
+     */
+    private String performanceFeeNote;
+
+    /**
+     * 业绩报酬计提对象
+     */
+    private String accruedWay;
+
+    /**
+     * 业绩报酬计提方式
+     */
+    private String accruedMethod;
+
+    /**
+     * 业绩报酬计提频率
+     */
+    private String accruedFrequency;
+
+    /**
+     * 预警线
+     */
+    private String guardLine;
+
+    /**
+     * 业绩锁定期
+     */
+    private String lockPeriod;
+
+    /**
+     * 赎回日
+     */
+    private String redemptionDay;
+
+    /**
+     * 基础货币
+     */
+    private String baseCurrency;
+
+    /**
+     * 追加起点
+     */
+    private String subsequentInvestmentShare;
+
+    /**
+     * 止损线
+     */
+    private String stopLossLine;
+
+}

+ 9 - 0
src/main/java/com/smppw/analysis/domain/mapper/core/FundInformationDoMapper.java

@@ -1,5 +1,6 @@
 package com.smppw.analysis.domain.mapper.core;
 
+import com.smppw.analysis.domain.dataobject.FundFeeDo;
 import com.smppw.analysis.domain.dataobject.FundInformationDo;
 import com.smppw.analysis.domain.dataobject.FundSimilarDo;
 import org.apache.ibatis.annotations.Param;
@@ -51,4 +52,12 @@ public interface FundInformationDoMapper {
      * @return /
      */
     List<FundSimilarDo> getSameStrategyFundIds(Map<String, Object> params);
+
+    /**
+     * 获取基金的申赎费率信息
+     * @param fundId 基金id
+     * @return 基金的申赎费率信息
+     */
+    FundFeeDo getFundFee(String fundId);
+
 }

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

@@ -1,9 +1,6 @@
 package com.smppw.analysis.domain.service;
 
-import com.smppw.analysis.domain.dataobject.FundArchivesInfoDO;
-import com.smppw.analysis.domain.dataobject.FundSimilarDo;
-import com.smppw.analysis.domain.dataobject.ManualFundNoticeInfoDO;
-import com.smppw.analysis.domain.dataobject.MonetaryFundProfitDO;
+import com.smppw.analysis.domain.dataobject.*;
 import com.smppw.analysis.domain.dto.info.FundSimilarParams;
 import com.smppw.common.pojo.enums.Frequency;
 import com.smppw.common.pojo.enums.Indicator;
@@ -117,4 +114,11 @@ public interface BaseInfoService {
      */
     FundArchivesInfoDO queryFundArchives(String fundId);
 
+    /**
+     * 获取基金的申赎费率信息
+     *
+     * @param fundId 基金id
+     * @return 基金的申赎费率信息
+     */
+    FundFeeDo getFundFee(String fundId);
 }

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

@@ -12,6 +12,7 @@ import com.smppw.analysis.domain.dataobject.FundArchivesInfoDO;
 import com.smppw.analysis.domain.dataobject.FundSimilarDo;
 import com.smppw.analysis.domain.dataobject.ManualFundNoticeInfoDO;
 import com.smppw.analysis.domain.dataobject.MonetaryFundProfitDO;
+import com.smppw.analysis.domain.dataobject.*;
 import com.smppw.analysis.domain.dto.info.FundSimilarParams;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
@@ -274,6 +275,11 @@ public class BaseInfoServiceImpl implements BaseInfoService, ApplicationContextA
         return fundArchivesDao.getFundArchives(fundId);
     }
 
+    @Override
+    public FundFeeDo getFundFee(String fundId) {
+        return fundInformationDao.getFundFee(fundId);
+    }
+
     /**
      * 把指定类型的标的的名称映射查询出来
      *

+ 20 - 0
src/main/java/com/smppw/analysis/infrastructure/utils/StringUtil.java

@@ -0,0 +1,20 @@
+package com.smppw.analysis.infrastructure.utils;
+
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.StrUtil;
+
+public class StringUtil {
+
+    /**
+     * 判断字符串是不是数字型字符串
+     *
+     * @param str 待判断的字符串
+     * @return true or false
+     */
+    public static boolean isNumeric(String str) {
+        if (StrUtil.isBlank(str)) {
+            return false;
+        }
+        return BooleanUtil.isTrue(str.matches("-?[0-9]+.?[0-9]*"));
+    }
+}

+ 56 - 0
src/main/resources/mapping/core/FundInformationDoMapper.xml

@@ -282,4 +282,60 @@
           and c.absrank_1y <![CDATA[<=]]> #{rankNum}
             limit #{rankNum}
     </select>
+
+    <select id="getFundFee" resultType="com.smppw.analysis.domain.dataobject.FundFeeDo">
+        select t1.fund_id  as `fundId`,
+            IF(t2.min_investment_share = -1, '管理人未设置',concat(t2.min_investment_share)) as `minInvestmentShare`
+             , IF(t1.lockup_period = -1, '不确定', concat(t1.lockup_period, '月')) as `lockupPeriod`
+             , IF(t2.subscription_fee = -1, '管理人未设置',
+                  t2.subscription_fee)                                            as `subscriptionFee`
+             , t2.subscription_fee_note                                           as `subscriptionFeeNote`
+             , IF(t2.redemption_fee = -1, '管理人未设置',
+                  t2.redemption_fee)                                              as `redemptionFee`
+             , t2.redemption_fee_note                                             as `redemptionFeeNote`
+             , case t1.duration
+                   when -1 then '不确定'
+                   when 0 then '无固定期限'
+                   when 999999 then '永续'
+                   else concat(t1.duration, '月') end                              as `duration`
+             , t1.open_day                                                         as `openDay`
+             , IF(t2.managementfee_bank = -1, '管理人未设置',
+                  t2.managementfee_bank)                                          as `managementfeeBank`
+             , IF(t2.managementfee_consult = -1, '管理人未设置',
+                  t2.managementfee_consult)                                       as `managementfeeConsult`
+             , IF(t2.managementfee_trust  =-1.000000,  '管理人未设置',
+                  t2.managementfee_trust)                                          as `managementFee`
+             , IF(t2.performance_fee = -1, '管理人未设置',
+                  t2.performance_fee)                                             as `performanceFee`
+             , t2.performance_fee_note                                            as `performanceFeeNote`
+             , case t2.accrued_way
+                   when 1 then '份额计提'
+                   when 2 then '净值计提'
+                   when 3
+                       then '混合' end                                             as `accruedWay`
+             , t2.accrued_method                                                  as `accruedMethod`
+             , t2.accrued_frequency                                               as `accruedFrequency`
+             , IF(t2.guard_line   =-1,  '管理人未设置',
+                  t2.guard_line )                     as `guardLine`
+             , case t1.lock_period
+                   when -1 then '不确定'
+                   when 0 then '无锁定期'
+                   else (IF(t1.lock_period_unit = 1, concat(t1.lockup_period, '天'),
+                            concat(t1.lockup_period, '月'))) end                    as `lockPeriod`
+             , t1.redemption_day                                                    as `redemptionDay`
+             , CASE t1.base_currency
+                   WHEN 1 THEN '人民币'
+                   WHEN 2 THEN '港币'
+                   WHEN 3 THEN '美元'
+                   WHEN 4 THEN '份'
+                   ELSE '其他'
+            END                                                                    AS `baseCurrency`
+             , t2.subsequent_investment_share                                     as `subsequentInvestmentShare`
+             , IF(t2.stop_loss_line   =-1,  '管理人未设置',
+                  t2.stop_loss_line   )                                                as `stopLossLine`
+        from  rz_hfdb_core.`fund_information` t1
+                  inner join rz_hfdb_core.fund_rate_mapping t2 on t1.fund_id = t2.fund_id
+        where t1.fund_id = #{fundId}
+    </select>
+
 </mapper>