소스 검색

基金持仓分析接口迁移完成

wangzaijun 1 년 전
부모
커밋
b749be9718
23개의 변경된 파일2633개의 추가작업 그리고 622개의 파일을 삭제
  1. 53 0
      src/main/java/com/smppw/analysis/application/service/FundFuturesOptionService.java
  2. 76 0
      src/main/java/com/smppw/analysis/application/service/FuturePositionAnalysis.java
  3. 3 3
      src/main/java/com/smppw/analysis/application/service/position/AbstractAnalysisBizHandler.java
  4. 506 578
      src/main/java/com/smppw/analysis/application/service/position/bond/BondPositionService.java
  5. 2 2
      src/main/java/com/smppw/analysis/application/service/position/stock/IndustryAllocationBizHandler.java
  6. 2 2
      src/main/java/com/smppw/analysis/application/service/position/stock/NewLiquidityAllocationBizHandler.java
  7. 2 2
      src/main/java/com/smppw/analysis/application/service/position/stock/StockPerformanceAttributionBizHandler.java
  8. 2 2
      src/main/java/com/smppw/analysis/application/service/position/stock/StyleAllocationBizHandler.java
  9. 136 7
      src/main/java/com/smppw/analysis/client/FundPositionApi.java
  10. 321 0
      src/main/java/com/smppw/analysis/domain/entity/BondBasicInformationDO.java
  11. 85 0
      src/main/java/com/smppw/analysis/domain/entity/BondCreditGradingInfo.java
  12. 27 0
      src/main/java/com/smppw/analysis/domain/entity/BondIndustryInfo.java
  13. 1074 0
      src/main/java/com/smppw/analysis/domain/service/FundFuturesOptionBaseService.java
  14. 3 3
      src/main/java/com/smppw/analysis/domain/service/FundPositionAnalysisService.java
  15. 33 0
      src/main/java/com/smppw/analysis/infrastructure/consts/MapFieldConstants.java
  16. 0 23
      src/main/java/com/smppw/analysis/infrastructure/consts/WinRateBmk.java
  17. 11 0
      src/main/java/com/smppw/analysis/infrastructure/persistence/BaseUnderlyingMapper.java
  18. 25 0
      src/main/java/com/smppw/analysis/infrastructure/persistence/BondBasicInformationDOMapper.java
  19. 15 0
      src/main/java/com/smppw/analysis/infrastructure/persistence/PubliclyFundExtInfoMapper.java
  20. 85 0
      src/main/java/com/smppw/analysis/infrastructure/utils/BinarySearchUtil.java
  21. 15 0
      src/main/resources/mapping/BaseUnderlyingMapper.xml
  22. 79 0
      src/main/resources/mapping/BondBasicInformationDOMapper.xml
  23. 78 0
      src/main/resources/mapping/PubliclyFundExtInfoMapper.xml

+ 53 - 0
src/main/java/com/smppw/analysis/application/service/FundFuturesOptionService.java

@@ -0,0 +1,53 @@
+package com.smppw.analysis.application.service;
+
+import com.smppw.analysis.domain.service.FundFuturesOptionBaseService;
+import com.smppw.common.pojo.ResultVo;
+import com.smppw.common.pojo.enums.status.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * FileName: FundFuturesOptionService
+ * Author:   chenjianhua
+ * Date:     2023/6/8 14:11
+ * Description: ${DESCRIPTION}
+ */
+@Component
+public class FundFuturesOptionService {
+
+    @Autowired
+    private FundFuturesOptionBaseService fundFuturesOptionBaseService;
+
+    public ResultVo<Map<String, Object>> fundFuturesOption(Integer userId, String fundId, Integer optionType, Integer shType, String startDate, String endDate) {
+        Map<String, Object> result = fundFuturesOptionBaseService.fundFuturesOption(userId, fundId, optionType, shType, startDate, endDate);
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+
+    public ResultVo<Map<String, Object>> fundPositionAnalysis(Integer userId, String fundId, Integer optionType, Integer shType, String startDate, String endDate) {
+        Map<String, Object> result = fundFuturesOptionBaseService.fundPositionAnalysis(userId, fundId, optionType, shType, startDate, endDate);
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+
+    public ResultVo<Map<String, Object>> fundDerivativeLeverageMargin(Integer userId, String fundId, Integer shType, String startDate, String endDate) {
+        Map<String, Object> result = fundFuturesOptionBaseService.fundDerivativeLeverageMargin(userId, fundId, shType, startDate, endDate);
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+
+    public ResultVo<Map<String, Object>> fundPositionAnalysisLine(Integer userId, String fundId, Integer optionType, Integer shType, String startDate, String endDate) {
+        Map<String, Object> result = fundFuturesOptionBaseService.fundPositionAnalysisLine(userId, fundId, optionType, shType, startDate, endDate);
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+
+    public ResultVo<Map<String, Object>> fundFuturesOptionForBreed(Integer userId, String fundId, Integer optionType, Integer shType, String startDate, String endDate) {
+        Map<String, Object> result = fundFuturesOptionBaseService.fundFuturesOptionForBreed(userId, fundId, optionType, shType, startDate, endDate);
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+
+    public ResultVo<Map<String, List<String>>> fundFuturesOptionView() {
+        Map<String, List<String>> result = fundFuturesOptionBaseService.fundFuturesOptionView();
+        return new ResultVo<>(ResultCode.SUCCESS, result);
+    }
+}

+ 76 - 0
src/main/java/com/smppw/analysis/application/service/FuturePositionAnalysis.java

@@ -0,0 +1,76 @@
+package com.smppw.analysis.application.service;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.map.MapUtil;
+import com.smppw.analysis.application.dto.position.RefMarketValueRatio;
+import com.smppw.analysis.application.dto.position.future.MarginalRiskContribution;
+import com.smppw.analysis.application.dto.position.future.MarginalRiskContributionParams;
+import com.smppw.analysis.application.dto.position.future.MarginalRiskContributionVO;
+import com.smppw.analysis.application.service.position.BizHandler;
+import com.smppw.analysis.application.service.position.BizHandlerConstants;
+import com.smppw.analysis.application.service.position.BizHandlerFactor;
+import com.smppw.common.pojo.FundFuturesOption;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author wangzaijun
+ * @date 2023/6/6 14:41
+ * @description 基金持仓分析-期货tab
+ */
+@Component
+public class FuturePositionAnalysis {
+    private final BizHandlerFactor factor;
+
+    public FuturePositionAnalysis(BizHandlerFactor factor) {
+        this.factor = factor;
+    }
+
+    public Map<String, Object> riskCont(MarginalRiskContributionParams params) {
+        BizHandler<MarginalRiskContributionParams, List<MarginalRiskContributionVO>> bizHandler = this.factor.getBizHandlerInstance(BizHandlerConstants.MARGINAL_RISK_CONTRIBUTION);
+        List<MarginalRiskContributionVO> dataList = bizHandler.bizHandle(params);
+        if (CollUtil.isEmpty(dataList)) {
+            return MapUtil.empty();
+        }
+        Map<String, String> mapping = MapUtil.newHashMap(true);
+        mapping.put(FundFuturesOption.Bond.getNameEnDesc(), FundFuturesOption.Bond.getNameDesc());
+        mapping.put(FundFuturesOption.Product.getNameEnDesc(), FundFuturesOption.Product.getNameDesc());
+        mapping.put(FundFuturesOption.StockIndex.getNameEnDesc(), FundFuturesOption.StockIndex.getNameDesc());
+        Map<String, Object> dataset = MapUtil.newHashMap();
+        mapping.forEach((k, v) -> {
+            List<Map<String, Object>> tempList = ListUtil.list(true);
+            for (MarginalRiskContributionVO vo : dataList) {
+                List<MarginalRiskContribution> collect = vo.getRiskContList().stream().filter(e -> k.equals(e.getAsset().getValue())).collect(Collectors.toList());
+                Map<String, Object> data = MapUtil.newHashMap();
+                data.put("date", vo.getDate());
+                data.put("ratio", collect.stream().map(RefMarketValueRatio::getRatio).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
+                data.put("riskCont", collect.stream().map(MarginalRiskContribution::getRiskCont).reduce(BigDecimal::add).orElse(BigDecimal.ZERO));
+                tempList.add(data);
+            }
+            dataset.put(k, tempList);
+        });
+        Map<String, List<Map<String, Object>>> tableObj = MapUtil.newHashMap(true);
+        for (MarginalRiskContributionVO vo : dataList) {
+            List<Map<String, Object>> tempList = vo.getRiskContList().stream().map(e -> {
+                Map<String, Object> data = MapUtil.newHashMap(true);
+                String label = e.getRef().getLabel();
+                if (label.contains("票面利率") && label.contains("名义") && label.contains("国债")) {
+                    label = label.split("名义")[1];
+                }
+                data.put("name", label);
+                data.put("ratio", e.getRatio());
+                data.put("riskCont", e.getRiskCont());
+                return data;
+            }).collect(Collectors.toList());
+            tempList = tempList.stream().limit(10).collect(Collectors.toList());
+            tableObj.put(vo.getDate(), tempList);
+        }
+        return MapUtil.<String, Object>builder().put("dataset", dataset)
+                .put("productNameMapping", mapping).put("tableObj", tableObj).build();
+    }
+}

+ 3 - 3
src/main/java/com/smppw/analysis/application/service/position/AbstractAnalysisBizHandler.java

@@ -10,7 +10,7 @@ import com.smppw.analysis.domain.entity.IndexSecWeightInfoDO;
 import com.smppw.analysis.domain.entity.SwSecIndustryInfoDO;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
-import com.smppw.analysis.domain.service.FundPositionAnalysisService;
+import com.smppw.analysis.domain.service.PositionAnalysisService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.RedisConst;
 import com.smppw.analysis.infrastructure.exception.APIException;
@@ -34,10 +34,10 @@ import java.util.stream.Collectors;
  */
 public abstract class AbstractAnalysisBizHandler<P extends BaseAnalysisParams, R> extends AbstractNonSynthesizeBizHandler<P, R> {
     protected static final Executor DEFAULT_EXECUTOR = ForkJoinPool.commonPool();
-    protected final FundPositionAnalysisService analysisService;
+    protected final PositionAnalysisService analysisService;
 
     public AbstractAnalysisBizHandler(AnalysisProperty property, CacheFactory cacheFactory,
-                                      PositionLoadFactory factory, FundPositionAnalysisService analysisService) {
+                                      PositionLoadFactory factory, PositionAnalysisService analysisService) {
         super(property, cacheFactory, factory);
         this.analysisService = analysisService;
     }

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 506 - 578
src/main/java/com/smppw/analysis/application/service/position/bond/BondPositionService.java


+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/stock/IndustryAllocationBizHandler.java

@@ -10,7 +10,7 @@ import com.smppw.analysis.application.service.position.BizHandlerConstants;
 import com.smppw.analysis.application.service.position.PositionLoadFactory;
 import com.smppw.analysis.domain.entity.IndexSecWeightInfoDO;
 import com.smppw.analysis.domain.gateway.CacheFactory;
-import com.smppw.analysis.domain.service.FundPositionAnalysisService;
+import com.smppw.analysis.domain.service.PositionAnalysisService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.common.pojo.ValueLabelVO;
 import org.springframework.stereotype.Component;
@@ -30,7 +30,7 @@ import java.util.stream.Collectors;
 @Component(BizHandlerConstants.INDUSTRY_ALLOCATION)
 public class IndustryAllocationBizHandler extends AbstractAnalysisBizHandler<StockAllocationParams, List<StockAllocationVO>> {
     public IndustryAllocationBizHandler(AnalysisProperty property, CacheFactory cacheFactory,
-                                        PositionLoadFactory factory, FundPositionAnalysisService analysisService) {
+                                        PositionLoadFactory factory, PositionAnalysisService analysisService) {
         super(property, cacheFactory, factory, analysisService);
     }
 

+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/stock/NewLiquidityAllocationBizHandler.java

@@ -16,7 +16,7 @@ import com.smppw.analysis.domain.entity.IndexSecWeightInfoDO;
 import com.smppw.analysis.domain.entity.SecLiquidityInfoDO;
 import com.smppw.analysis.domain.entity.SecTurnoverInfoDO;
 import com.smppw.analysis.domain.gateway.CacheFactory;
-import com.smppw.analysis.domain.service.FundPositionAnalysisService;
+import com.smppw.analysis.domain.service.PositionAnalysisService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.constants.SecType;
@@ -36,7 +36,7 @@ public class NewLiquidityAllocationBizHandler extends AbstractAnalysisBizHandler
 
 
     public NewLiquidityAllocationBizHandler(AnalysisProperty property, CacheFactory cacheFactory,
-                                            PositionLoadFactory factory, FundPositionAnalysisService analysisService) {
+                                            PositionLoadFactory factory, PositionAnalysisService analysisService) {
         super(property, cacheFactory, factory, analysisService);
     }
 

+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/stock/StockPerformanceAttributionBizHandler.java

@@ -13,7 +13,7 @@ import com.smppw.analysis.domain.entity.IndexSecWeightInfoDO;
 import com.smppw.analysis.domain.entity.SecClosePriceDO;
 import com.smppw.analysis.domain.event.SaveCacheEvent;
 import com.smppw.analysis.domain.gateway.CacheFactory;
-import com.smppw.analysis.domain.service.FundPositionAnalysisService;
+import com.smppw.analysis.domain.service.PositionAnalysisService;
 import com.smppw.analysis.domain.service.NavService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.analysis.infrastructure.consts.RedisConst;
@@ -43,7 +43,7 @@ public class StockPerformanceAttributionBizHandler extends AbstractAnalysisBizHa
     private final NavService navService;
 
     public StockPerformanceAttributionBizHandler(AnalysisProperty property, CacheFactory cacheFactory,
-                                                 PositionLoadFactory factory, FundPositionAnalysisService analysisService, NavService navService) {
+                                                 PositionLoadFactory factory, PositionAnalysisService analysisService, NavService navService) {
         super(property, cacheFactory, factory, analysisService);
         this.navService = navService;
     }

+ 2 - 2
src/main/java/com/smppw/analysis/application/service/position/stock/StyleAllocationBizHandler.java

@@ -17,7 +17,7 @@ import com.smppw.analysis.application.service.position.PositionLoadFactory;
 import com.smppw.analysis.domain.entity.IndexSecWeightInfoDO;
 import com.smppw.analysis.domain.entity.SecStyleInfoDO;
 import com.smppw.analysis.domain.gateway.CacheFactory;
-import com.smppw.analysis.domain.service.FundPositionAnalysisService;
+import com.smppw.analysis.domain.service.PositionAnalysisService;
 import com.smppw.analysis.infrastructure.config.AnalysisProperty;
 import com.smppw.common.pojo.ValueLabelVO;
 import com.smppw.constants.Consts;
@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
 @Component(BizHandlerConstants.STYLE_ALLOCATION)
 public class StyleAllocationBizHandler extends AbstractAnalysisBizHandler<StockAllocationParams, List<StockAllocationVO>> {
     public StyleAllocationBizHandler(AnalysisProperty property, CacheFactory cacheFactory,
-                                     PositionLoadFactory factory, FundPositionAnalysisService analysisService) {
+                                     PositionLoadFactory factory, PositionAnalysisService analysisService) {
         super(property, cacheFactory, factory, analysisService);
     }
 

+ 136 - 7
src/main/java/com/smppw/analysis/client/FundPositionApi.java

@@ -1,13 +1,16 @@
 package com.smppw.analysis.client;
 
+import com.smppw.analysis.application.dto.position.bond.BondSortAllocationParam;
+import com.smppw.analysis.application.dto.position.future.MarginalRiskContributionParams;
 import com.smppw.analysis.application.dto.position.stock.*;
 import com.smppw.analysis.application.dto.position.synthesize.*;
+import com.smppw.analysis.application.service.FundFuturesOptionService;
+import com.smppw.analysis.application.service.FuturePositionAnalysis;
 import com.smppw.analysis.application.service.StockPositionAnalysis;
 import com.smppw.analysis.application.service.SynthesizePositionAnalysis;
+import com.smppw.analysis.application.service.position.bond.BondPositionService;
 import com.smppw.common.pojo.ResultVo;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.Map;
@@ -20,14 +23,21 @@ import java.util.Map;
 @RestController
 @RequestMapping("/v2/fund/position-analysis")
 public class FundPositionApi {
-    //    private final BondPositionAnalysis bond;
-    //    private final FuturePositionAnalysis future;
-    private final SynthesizePositionAnalysis synthesize;
+    //        private final BondPositionAnalysis bond;
     private final StockPositionAnalysis stock;
+    private final FuturePositionAnalysis future;
+    private final SynthesizePositionAnalysis synthesize;
+    private final BondPositionService bondPositionService;
+    private final FundFuturesOptionService fundFuturesOptionService;
 
-    public FundPositionApi(StockPositionAnalysis stock, SynthesizePositionAnalysis synthesize) {
+    public FundPositionApi(StockPositionAnalysis stock, FuturePositionAnalysis future,
+                           SynthesizePositionAnalysis synthesize, BondPositionService bondPositionService,
+                           FundFuturesOptionService fundFuturesOptionService) {
         this.stock = stock;
+        this.future = future;
         this.synthesize = synthesize;
+        this.bondPositionService = bondPositionService;
+        this.fundFuturesOptionService = fundFuturesOptionService;
     }
 
     /**
@@ -195,6 +205,125 @@ public class FundPositionApi {
         return ResultVo.ok(this.stock.getRiskExposure(params));
     }
 
+    /**
+     * 债券分类配置及明细  公募私募
+     *
+     * @param param /
+     * @return /
+     */
+    @GetMapping("bond/sort-allocation")
+    public ResultVo<Map<String, Object>> getBondSortAllocation(BondSortAllocationParam param) {
+        return ResultVo.ok(bondPositionService.getBondSortAllocation(param));
+    }
+
+    /**
+     * 债券集中度
+     *
+     * @param param /
+     * @return /
+     */
+    @GetMapping("bond/crn")
+    public ResultVo<Map<String, Object>> getBondConcentration(BondSortAllocationParam param) {
+        return ResultVo.ok(bondPositionService.getBondConcentration(param));
+    }
+
+    /**
+     * 债券信用评级
+     *
+     * @param param /
+     * @return /
+     */
+    @GetMapping("/bond/credit-grading")
+    public ResultVo<Map<String, Object>> getBondCreditGrading(BondSortAllocationParam param) {
+        return ResultVo.ok(bondPositionService.getBondCreditGrading(param));
+    }
+
+    /**
+     * @param fundId     基金ID
+     * @param optionType 板块类别
+     * @param shType     投机/套期 1-Speculation,2-Hedging
+     * @return
+     */
+    @RequestMapping(value = "/fund-futures-option", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> fundFuturesOption(@RequestParam("userId") Integer userId, @RequestParam("fundId") String fundId, @RequestParam("optionType") Integer optionType, @RequestParam(value = "shType", defaultValue = "1") Integer shType,
+                                                           @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
+        return fundFuturesOptionService.fundFuturesOption(userId, fundId, optionType, shType, startDate, endDate);
+    }
+
+
+    /**
+     * @param fundId     基金ID
+     * @param optionType 板块类别
+     * @param shType     投机/套期 1-Speculation,2-Hedging
+     * @return
+     */
+    @RequestMapping(value = "/fund-futures-option-breed", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> fundFuturesOptionForBreed(@RequestParam("userId") Integer userId, @RequestParam("fundId") String fundId, @RequestParam(value = "optionType", required = false) Integer optionType, @RequestParam(value = "shType", defaultValue = "1") Integer shType,
+                                                                   @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
+        return fundFuturesOptionService.fundFuturesOptionForBreed(userId, fundId, optionType, shType, startDate, endDate);
+    }
+
+    /**
+     * 板块持仓分析
+     *
+     * @param fundId
+     * @param optionType
+     * @param shType
+     * @return
+     */
+    @RequestMapping(value = "/fund-position-analysis", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> fundPositionAnalysis(@RequestParam("userId") Integer userId, @RequestParam("fundId") String fundId, @RequestParam("optionType") Integer optionType, @RequestParam(value = "shType", defaultValue = "1") Integer shType,
+                                                              @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
+        return fundFuturesOptionService.fundPositionAnalysis(userId, fundId, optionType, shType, startDate, endDate);
+    }
+
+    /**
+     * 板块持仓分析
+     *
+     * @param fundId
+     * @param optionType
+     * @param shType
+     * @return
+     */
+    @RequestMapping(value = "/fund-position-analysis-line", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> fundPositionAnalysisLine(@RequestParam("userId") Integer userId, @RequestParam("fundId") String fundId, @RequestParam(value = "optionType", required = false, defaultValue = "0") Integer optionType, @RequestParam(value = "shType", defaultValue = "1", required = false) Integer shType,
+                                                                  @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
+        return fundFuturesOptionService.fundPositionAnalysisLine(userId, fundId, optionType, shType, startDate, endDate);
+    }
+
+
+    /**
+     * 衍生品杠杆与保证金
+     *
+     * @param fundId
+     * @return
+     */
+    @RequestMapping(value = "/fund-derivative-leverage-margin", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> fundDerivativeLeverageMargin(@RequestParam("userId") Integer userId, @RequestParam("fundId") String fundId, @RequestParam(value = "shType", required = false) Integer shType,
+                                                                      @RequestParam("startDate") String startDate, @RequestParam("endDate") String endDate) {
+        return fundFuturesOptionService.fundDerivativeLeverageMargin(userId, fundId, shType, startDate, endDate);
+    }
+
+
+    /**
+     * 边际风险贡献
+     *
+     * @param params
+     * @return
+     */
+    @RequestMapping(value = "/fund-marginal-risk-contribution", method = RequestMethod.GET)
+    public ResultVo<Map<String, Object>> getFutureRiskCont(MarginalRiskContributionParams params) {
+        return ResultVo.ok(this.future.riskCont(params));
+    }
+
+    /**
+     * @return
+     */
+    @RequestMapping(value = "/fund-futures-option-view", method = RequestMethod.GET)
+    public ResultVo<Map<String, List<String>>> fundFuturesOptionView() {
+        return fundFuturesOptionService.fundFuturesOptionView();
+    }
+
 //    /**
 //     * 公募私募,债券-久期分析
 //     *

+ 321 - 0
src/main/java/com/smppw/analysis/domain/entity/BondBasicInformationDO.java

@@ -0,0 +1,321 @@
+package com.smppw.analysis.domain.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Rain
+ * @date 2023/6/12 10:56
+ * @description
+ */
+public class BondBasicInformationDO {
+    private Integer id;
+
+    /**
+     * 标的ID
+     */
+    private String secId;
+
+    /**
+     * 债券唯一标识
+     */
+    private String bondId;
+
+    /**
+     * 债券主代码
+     */
+    private Integer mainCode;
+
+    /**
+     * 债券全称
+     */
+    private String bondFullName;
+
+    /**
+     * base_underlying_information标识uni_code
+     */
+    private String bondUniCode;
+
+    /**
+     * 债券类型
+     */
+    private String bondType;
+
+    /**
+     * 债券种类
+     */
+    private Integer bondNature;
+
+    /**
+     * 发行日期
+     */
+    private Date inceptionDate;
+
+    /**
+     * 实际发行
+     * 量
+     */
+    private String issueSize;
+
+    /**
+     * 计息方式
+     */
+    private String couponType;
+
+    /**
+     * 计息方式:1-单利(固定利率),2-复利,3-浮动利率,4-累进利率,5-贴现,6-无序利率 7-零息债
+     */
+    private Integer compoundMethod;
+
+    /**
+     * 付息方式:1-每年付息 2-半年付息 3-到期一次还本付息 4-按季付息 5-按月付息
+     */
+    private Integer intPaymentMethod;
+
+    /**
+     * 票面利率
+     */
+    private BigDecimal nominalInterestRate;
+
+    /**
+     * 发行期限
+     */
+    private String maturity;
+
+    /**
+     * 起息日
+     */
+    private Date accrualStartDate;
+
+    /**
+     * 到期日
+     */
+    private Date maturityDate;
+
+    /**
+     * 债券信用评级
+     */
+    private String creditRating;
+
+    /**
+     * 发债主体信用评级
+     */
+    private String issuerCreditRating;
+
+    /**
+     * 记录的有效性;1-有效;0-无效;
+     */
+    private Byte isvalid;
+
+    /**
+     * 创建者Id,默认第一次创建者名称,创建后不变更
+     */
+    private Integer creatorid;
+
+    /**
+     * 创建时间,默认第一次创建的getdate()时间
+     */
+    private Date createtime;
+
+    /**
+     * 修改者Id;第一次创建时与Creator值相同,修改时与修改人值相同
+     */
+    private Integer updaterid;
+
+    /**
+     * 修改时间;第一次创建时与CreatTime值相同,修改时与修改时间相同
+     */
+    private Date updatetime;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getSecId() {
+        return secId;
+    }
+
+    public void setSecId(String secId) {
+        this.secId = secId;
+    }
+
+    public String getBondId() {
+        return bondId;
+    }
+
+    public void setBondId(String bondId) {
+        this.bondId = bondId;
+    }
+
+    public Integer getMainCode() {
+        return mainCode;
+    }
+
+    public void setMainCode(Integer mainCode) {
+        this.mainCode = mainCode;
+    }
+
+    public String getBondFullName() {
+        return bondFullName;
+    }
+
+    public void setBondFullName(String bondFullName) {
+        this.bondFullName = bondFullName;
+    }
+
+    public String getBondUniCode() {
+        return bondUniCode;
+    }
+
+    public void setBondUniCode(String bondUniCode) {
+        this.bondUniCode = bondUniCode;
+    }
+
+    public String getBondType() {
+        return bondType;
+    }
+
+    public void setBondType(String bondType) {
+        this.bondType = bondType;
+    }
+
+    public Integer getBondNature() {
+        return bondNature;
+    }
+
+    public void setBondNature(Integer bondNature) {
+        this.bondNature = bondNature;
+    }
+
+    public Date getInceptionDate() {
+        return inceptionDate;
+    }
+
+    public void setInceptionDate(Date inceptionDate) {
+        this.inceptionDate = inceptionDate;
+    }
+
+    public String getIssueSize() {
+        return issueSize;
+    }
+
+    public void setIssueSize(String issueSize) {
+        this.issueSize = issueSize;
+    }
+
+    public String getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(String couponType) {
+        this.couponType = couponType;
+    }
+
+    public Integer getCompoundMethod() {
+        return compoundMethod;
+    }
+
+    public void setCompoundMethod(Integer compoundMethod) {
+        this.compoundMethod = compoundMethod;
+    }
+
+    public Integer getIntPaymentMethod() {
+        return intPaymentMethod;
+    }
+
+    public void setIntPaymentMethod(Integer intPaymentMethod) {
+        this.intPaymentMethod = intPaymentMethod;
+    }
+
+    public BigDecimal getNominalInterestRate() {
+        return nominalInterestRate;
+    }
+
+    public void setNominalInterestRate(BigDecimal nominalInterestRate) {
+        this.nominalInterestRate = nominalInterestRate;
+    }
+
+    public String getMaturity() {
+        return maturity;
+    }
+
+    public void setMaturity(String maturity) {
+        this.maturity = maturity;
+    }
+
+    public Date getAccrualStartDate() {
+        return accrualStartDate;
+    }
+
+    public void setAccrualStartDate(Date accrualStartDate) {
+        this.accrualStartDate = accrualStartDate;
+    }
+
+    public Date getMaturityDate() {
+        return maturityDate;
+    }
+
+    public void setMaturityDate(Date maturityDate) {
+        this.maturityDate = maturityDate;
+    }
+
+    public String getCreditRating() {
+        return creditRating;
+    }
+
+    public void setCreditRating(String creditRating) {
+        this.creditRating = creditRating;
+    }
+
+    public String getIssuerCreditRating() {
+        return issuerCreditRating;
+    }
+
+    public void setIssuerCreditRating(String issuerCreditRating) {
+        this.issuerCreditRating = issuerCreditRating;
+    }
+
+    public Byte getIsvalid() {
+        return isvalid;
+    }
+
+    public void setIsvalid(Byte isvalid) {
+        this.isvalid = isvalid;
+    }
+
+    public Integer getCreatorid() {
+        return creatorid;
+    }
+
+    public void setCreatorid(Integer creatorid) {
+        this.creatorid = creatorid;
+    }
+
+    public Date getCreatetime() {
+        return createtime;
+    }
+
+    public void setCreatetime(Date createtime) {
+        this.createtime = createtime;
+    }
+
+    public Integer getUpdaterid() {
+        return updaterid;
+    }
+
+    public void setUpdaterid(Integer updaterid) {
+        this.updaterid = updaterid;
+    }
+
+    public Date getUpdatetime() {
+        return updatetime;
+    }
+
+    public void setUpdatetime(Date updatetime) {
+        this.updatetime = updatetime;
+    }
+}

+ 85 - 0
src/main/java/com/smppw/analysis/domain/entity/BondCreditGradingInfo.java

@@ -0,0 +1,85 @@
+package com.smppw.analysis.domain.entity;
+
+/**
+ * @author Rain
+ * @date 2023/6/13 11:26
+ * @description
+ */
+public class BondCreditGradingInfo {
+    /**
+     * 债券id
+     */
+    private String secId;
+    /**
+     * 债券主体id
+     */
+    private String mainCode;
+
+    /**
+     * 评级时间
+     */
+    private String crDate;
+
+    /**
+     * 评级编码
+     */
+    private String crCode;
+
+    /**
+     * 评级描述
+     */
+    private String crDesc;
+
+    /**
+     * 评级展望
+     */
+    private String crAnticipate;
+
+    public String getSecId() {
+        return secId;
+    }
+
+    public void setSecId(String secId) {
+        this.secId = secId;
+    }
+
+    public String getMainCode() {
+        return mainCode;
+    }
+
+    public void setMainCode(String mainCode) {
+        this.mainCode = mainCode;
+    }
+
+    public String getCrDate() {
+        return crDate;
+    }
+
+    public void setCrDate(String crDate) {
+        this.crDate = crDate;
+    }
+
+    public String getCrCode() {
+        return crCode;
+    }
+
+    public void setCrCode(String crCode) {
+        this.crCode = crCode;
+    }
+
+    public String getCrDesc() {
+        return crDesc;
+    }
+
+    public void setCrDesc(String crDesc) {
+        this.crDesc = crDesc;
+    }
+
+    public String getCrAnticipate() {
+        return crAnticipate;
+    }
+
+    public void setCrAnticipate(String crAnticipate) {
+        this.crAnticipate = crAnticipate;
+    }
+}

+ 27 - 0
src/main/java/com/smppw/analysis/domain/entity/BondIndustryInfo.java

@@ -0,0 +1,27 @@
+package com.smppw.analysis.domain.entity;
+
+/**
+ * @author Rain
+ * @date 2023/6/13 18:02
+ * @description
+ */
+public class BondIndustryInfo {
+    private String secId;
+    private String firstIndustryName;
+
+    public String getSecId() {
+        return secId;
+    }
+
+    public void setSecId(String secId) {
+        this.secId = secId;
+    }
+
+    public String getFirstIndustryName() {
+        return firstIndustryName;
+    }
+
+    public void setFirstIndustryName(String firstIndustryName) {
+        this.firstIndustryName = firstIndustryName;
+    }
+}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1074 - 0
src/main/java/com/smppw/analysis/domain/service/FundFuturesOptionBaseService.java


+ 3 - 3
src/main/java/com/smppw/analysis/domain/service/FundPositionAnalysisService.java

@@ -14,12 +14,12 @@ import java.util.List;
  * @description 基金持仓分析需要的所有mapper接口
  */
 @Service
-public class FundPositionAnalysisService {
+public class PositionAnalysisService {
     private final BaseUnderlyingMapper baseUnderlyingMapper;
     private final IndexesTradeDateDoMapper indexesTradeDateDoMapper;
 
-    public FundPositionAnalysisService(BaseUnderlyingMapper baseUnderlyingMapper,
-                                       IndexesTradeDateDoMapper indexesTradeDateDoMapper) {
+    public PositionAnalysisService(BaseUnderlyingMapper baseUnderlyingMapper,
+                                   IndexesTradeDateDoMapper indexesTradeDateDoMapper) {
         this.baseUnderlyingMapper = baseUnderlyingMapper;
         this.indexesTradeDateDoMapper = indexesTradeDateDoMapper;
     }

+ 33 - 0
src/main/java/com/smppw/analysis/infrastructure/consts/MapFieldConstants.java

@@ -0,0 +1,33 @@
+package com.smppw.analysis.infrastructure.consts;
+
+/**
+ * @author wangzaijun
+ * @date 2023/5/4 10:02
+ * @description map对象的key属性定义常量
+ */
+public class MapFieldConstants {
+    /**
+     * 详情页数据集字段
+     */
+    public static final String FIELD_DATASET = "dataset";
+    /**
+     * 详情页标的名称映射字段
+     */
+    public static final String FIELD_NAME_MAPPING = "productNameMapping";
+    /**
+     * 开始时间
+     */
+    public static final String FIELD_START_DATE = "startDate";
+    /**
+     * 结束时间
+     */
+    public static final String FIELD_END_DATE = "endDate";
+    /**
+     * 日期时间序列
+     */
+    public static final String FIELD_DATE_LIST = "dateList";
+    /**
+     * 日期
+     */
+    public static final String FIELD_DATE_KEY = "date";
+}

+ 0 - 23
src/main/java/com/smppw/analysis/infrastructure/consts/WinRateBmk.java

@@ -1,23 +0,0 @@
-package com.smppw.analysis.infrastructure.consts;
-
-import java.util.stream.Stream;
-
-/**
- * @author zhengsongliang
- */
-public enum WinRateBmk {
-	Benchmark(1), Zero(2),AssetModel(3);
-	private final int id;
-
-	WinRateBmk(int id) {
-		this.id = id;
-	}
-
-	public int getId() {
-		return id;
-	}
-
-	public static WinRateBmk getWinningRateBmk(int id) {
-		return Stream.of(WinRateBmk.values()).filter(e -> e.id == id).findFirst().orElse(null);
-	}
-}

+ 11 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/BaseUnderlyingMapper.java

@@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author wangzaijun
@@ -95,4 +96,14 @@ public interface BaseUnderlyingMapper {
     List<FutureDailyPriceDO> getFinanceSecClosePrice(@Param("secCodes") List<String> secCodes, @Param("startDate") String valuationDate, @Param("endDate") String endDate);
 
     List<ValueLabelVO> getOptionTypeList();
+
+    Map<String, String> getOptionTypeMap(@Param("tradingCode") String tradingCode);
+
+    List<Map<String, String>> getSecondOptionTypeByCode(@Param("tradingCode") String tradingCode);
+
+    List<Map<String, String>> fundFuturesOptionView();
+
+    List<ValueLabelVO> getOptionTypeAndTradeCode(String firstOptionType);
+
+    List<String> getSecondOptionType(String firstOptionType);
 }

+ 25 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/BondBasicInformationDOMapper.java

@@ -0,0 +1,25 @@
+package com.smppw.analysis.infrastructure.persistence;
+
+import com.smppw.analysis.domain.entity.BondBasicInformationDO;
+import com.smppw.analysis.domain.entity.BondCreditGradingInfo;
+import com.smppw.analysis.domain.entity.BondIndustryInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Rain
+ * @date 2023/6/12 10:56
+ * @description
+ */
+@Mapper
+public interface BondBasicInformationDOMapper {
+    List<BondBasicInformationDO> selectAllMappings();
+
+    List<BondBasicInformationDO> queryBondBasicInfo(@Param("idList") List<String> bondIdSet);
+
+    List<BondCreditGradingInfo> queryCreditGradingByBondId(@Param("idList") List<String> idList);
+
+    List<BondIndustryInfo> queryBondIndustry(@Param("idList") List<String> idList);
+}

+ 15 - 0
src/main/java/com/smppw/analysis/infrastructure/persistence/PubliclyFundExtInfoMapper.java

@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author wangzaijun
@@ -23,4 +24,18 @@ public interface PubliclyFundExtInfoMapper {
     List<PubliclyFundHolderInfoDO> mfHolderInfoList(@Param("fundId") String fundId, @Param("startDate") String startDate, @Param("endDate") String endDate);
 
     List<PubliclyFundStockChangeDO> mfStockChangeList(@Param("fundId") String fundId, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    // ------------ 期货的 ----------------------
+
+    Map<String, String> getOptionContract(@Param("securitiesCode") String securitiesCode, @Param("securitiesName") String securitiesName);
+
+    List<Map<String, Object>> getFundMargin(@Param("fundId")String fundId, @Param("startDate") String startDate,@Param("endDate") String endDate);
+
+    List<Map<String, String>> getFundDetailForFuture(@Param("securitiesCode")String securitiesCode, @Param("fundId")String fundId, @Param("valuationDate")String valuationDate);
+
+    List<FundPositionDetailDO> queryPositionDetailsFundMargin(@Param("fundId")String fundId,@Param("startDate") String startDate,@Param("endDate") String endDate);
+
+    List<FundPositionDetailDO> getMFFundPositionDetail(@Param("fundId")String fundId,@Param("startDate") String startDate,@Param("endDate") String endDate);
+
+    List<Map<String, Object>> getValuationDateNv(@Param("fundId")String fundId,@Param("startDate") String startDate,@Param("endDate") String endDate);
 }

+ 85 - 0
src/main/java/com/smppw/analysis/infrastructure/utils/BinarySearchUtil.java

@@ -0,0 +1,85 @@
+package com.smppw.analysis.infrastructure.utils;
+
+import java.util.List;
+import java.util.Objects;
+
+public class BinarySearchUtil {
+
+    /**
+     *
+     * @param dateList   从小到大的净值序列
+     * @param date  日期
+     * @return  小于等于 date 的 日期最大的净值
+     */
+    public static Integer getMostLeftLessNav(List<String> dateList, String date) {
+        if (dateList == null || dateList.size() == 0) {
+            return 0;
+        }
+        int L = 0;
+        int R = dateList.size() - 1;
+        int ans = -1;
+        while (L <= R) {
+            int mid = (L + R) / 2;
+            if (dateList.get(mid) !=null && dateList.get(mid).compareTo(date) <= 0) {
+                ans = mid;
+                L = mid + 1;
+            } else {
+                R = mid - 1;
+            }
+        }
+        return ans == -1 ? 0 : ans;
+    }
+
+    /**
+     *
+     * @param dateList   从小到大的净值序列
+     * @param date  日期
+     * @return  小于 date 的 日期最大的净值
+     */
+    public static Integer getMostLeftLessNotEqualsNav(List<String> dateList, String date) {
+        if (dateList == null || dateList.size() == 0) {
+            return 0;
+        }
+        int L = 0;
+        int R = dateList.size() - 1;
+        int ans = -1;
+        while (L <= R) {
+            int mid = (L + R) / 2;
+            if (dateList.get(mid) !=null && dateList.get(mid).compareTo(date) < 0) {
+                ans = mid;
+                L = mid + 1;
+            } else {
+                R = mid - 1;
+            }
+        }
+        return ans == -1 ? 0 : ans;
+    }
+
+
+    /**
+     *
+     * @param dateList   从小到大的净值序列
+     * @param date  日期
+     * @return  大于等于 date 的 日期最小的净值
+     */
+    public static Integer getMostRightThanNav(List<String> dateList, String date) {
+        if(dateList == null && Objects.requireNonNull(dateList).size() == 0){
+            return -1;
+        }else if(dateList.get(dateList.size()-1).compareTo(date) < 0){
+            return dateList.size() - 1;
+        }
+        int low = 0;
+        int high = dateList.size() - 1;
+        while(low < high){
+            //防止溢出
+            int mid = low + (high-low)/2;
+            if(dateList.get(mid).compareTo(date) < 0){
+                low = mid + 1;
+            }else{
+                high = mid;
+            }
+        }
+        return low;
+    }
+
+}

+ 15 - 0
src/main/resources/mapping/BaseUnderlyingMapper.xml

@@ -160,4 +160,19 @@
     <select id="getOptionTypeList" resultType="com.smppw.common.pojo.ValueLabelVO">
         select distinct a.trading_code as value, a.product_name as label from product_trading_mapping a where a.isvalid = 1
     </select>
+    <select id="getOptionTypeMap" resultType="java.util.Map" parameterType="java.lang.String">
+        select first_option_type,second_option_type,product_name,trading_code from product_trading_mapping where trading_code=#{tradingCode} and isvalid =1 limit 1
+    </select>
+    <select id="getSecondOptionTypeByCode" resultType="java.util.Map" parameterType="java.lang.String">
+        select first_option_type,second_option_type from product_trading_mapping where trading_code=#{tradingCode} and isvalid =1
+    </select>
+    <select id="fundFuturesOptionView" resultType="java.util.Map">
+        select second_option_type,product_name from product_trading_mapping where  isvalid =1 order by second_option_sort_id,sort_id
+    </select>
+    <select id="getOptionTypeAndTradeCode" resultType="com.smppw.common.pojo.ValueLabelVO">
+        select distinct a.trading_code as `value`, a.second_option_type as `label` from product_trading_mapping a where a.isvalid = 1 and first_option_type = #{firstOptionType}
+    </select>
+    <select id="getSecondOptionType" resultType="java.lang.String" parameterType="java.lang.String">
+        select distinct(second_option_type) from product_trading_mapping a where a.isvalid and first_option_type = "商品" order by a.second_option_sort_id
+    </select>
 </mapper>

+ 79 - 0
src/main/resources/mapping/BondBasicInformationDOMapper.xml

@@ -0,0 +1,79 @@
+<?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.BondBasicInformationDOMapper">
+  <resultMap id="BaseResultMap" type="com.smppw.analysis.domain.entity.BondBasicInformationDO">
+    <!--@mbg.generated-->
+    <!--@Table bond_basic_information-->
+    <id column="id" jdbcType="INTEGER" property="id" />
+    <result column="sec_id" jdbcType="VARCHAR" property="secId" />
+    <result column="bond_id" jdbcType="VARCHAR" property="bondId" />
+    <result column="main_code" jdbcType="INTEGER" property="mainCode" />
+    <result column="bond_full_name" jdbcType="VARCHAR" property="bondFullName" />
+    <result column="bond_uni_code" jdbcType="VARCHAR" property="bondUniCode" />
+    <result column="bond_type" jdbcType="VARCHAR" property="bondType" />
+    <result column="bond_nature" jdbcType="INTEGER" property="bondNature" />
+    <result column="inception_date" jdbcType="DATE" property="inceptionDate" />
+    <result column="issue_size" jdbcType="VARCHAR" property="issueSize" />
+    <result column="coupon_type" jdbcType="VARCHAR" property="couponType" />
+    <result column="compound_method" jdbcType="INTEGER" property="compoundMethod" />
+    <result column="int_payment_method" jdbcType="INTEGER" property="intPaymentMethod" />
+    <result column="nominal_interest_rate" jdbcType="DECIMAL" property="nominalInterestRate" />
+    <result column="maturity" jdbcType="VARCHAR" property="maturity" />
+    <result column="accrual_start_date" jdbcType="DATE" property="accrualStartDate" />
+    <result column="maturity_date" jdbcType="DATE" property="maturityDate" />
+    <result column="credit_rating" jdbcType="VARCHAR" property="creditRating" />
+    <result column="issuer_credit_rating" jdbcType="VARCHAR" property="issuerCreditRating" />
+    <result column="isvalid" jdbcType="TINYINT" property="isvalid" />
+    <result column="creatorid" jdbcType="INTEGER" property="creatorid" />
+    <result column="createtime" jdbcType="TIMESTAMP" property="createtime" />
+    <result column="updaterid" jdbcType="INTEGER" property="updaterid" />
+    <result column="updatetime" jdbcType="TIMESTAMP" property="updatetime" />
+  </resultMap>
+  <sql id="Base_Column_List">
+    <!--@mbg.generated-->
+    id, sec_id, bond_id, main_code, bond_full_name, bond_uni_code, bond_type, bond_nature, 
+    inception_date, issue_size, coupon_type, compound_method, int_payment_method, nominal_interest_rate, 
+    maturity, accrual_start_date, maturity_date, credit_rating, issuer_credit_rating, 
+    isvalid, creatorid, createtime, updaterid, updatetime
+  </sql>
+  
+  <select id="selectAllMappings" resultMap="BaseResultMap">
+    <!--@mbg.generated-->
+    select
+    sec_id, bond_nature
+    from rz_hfdb_core.bond_basic_information
+    where isvalid = 1
+  </select>
+
+  <select id="queryBondBasicInfo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from rz_hfdb_core.bond_basic_information
+    where isvalid = 1 and sec_id in
+    <foreach  collection="idList" item="secId" open="(" close=")" separator=",">
+      #{secId}
+    </foreach>
+    </select>
+
+  <select id="queryCreditGradingByBondId" resultType="com.smppw.analysis.domain.entity.BondCreditGradingInfo">
+    SELECT t1.sec_id as secId,t1.main_code as mainCode,t2.cr_date as crDate,t2.cr_code as crCode,
+    t2.cr_desc as crDesc ,t2.cr_anticipate as crAnticipate FROM rz_hfdb_core.bond_basic_information t1
+                    LEFT JOIN rz_hfdb_core.`bond_bd_credit_grading` t2 ON t1.`main_code` = t2.`main_code` AND t2.`isvalid` = 1
+    WHERE t1.isvalid =1 and  t1.`sec_id` IN
+    <foreach  collection="idList" item="secId" open="(" close=")" separator=",">
+      #{secId}
+    </foreach>
+    </select>
+
+  <select id="queryBondIndustry" resultType="com.smppw.analysis.domain.entity.BondIndustryInfo">
+    SELECT a.sec_id as secId, a.bond_full_name , c.first_industry_name as firstIndustryName, d.chi_name
+    FROM rz_hfdb_core.bond_basic_information a
+           JOIN rz_hfdb_core.bond_code b ON a.main_code = b.main_code
+           JOIN rz_hfdb_core.lc_exg_industry c ON b.company_code = c.company_code
+           JOIN rz_hfdb_core.nrz_lc_insti_archive d ON c.company_code = d.company_code
+    WHERE c.if_performed = 1 AND c.standard = 38 and a.isvalid = 1  and a.sec_id in
+    <foreach  collection="idList" item="secId" open="(" close=")" separator=",">
+      #{secId}
+    </foreach>
+  </select>
+</mapper>

+ 78 - 0
src/main/resources/mapping/PubliclyFundExtInfoMapper.xml

@@ -84,4 +84,82 @@
           and a.isvalid = 1
         order by a.report_date
     </select>
+
+    <select id="getOptionContract" resultType="java.util.Map" parameterType="java.lang.String">
+        SELECT DISTINCT ula_name,trading_code FROM  opt_option_contract WHERE ula_type IN (2,4) and (trading_code=#{securitiesCode} or contract_abbr=#{securitiesName}) and isvalid =1 limit 1
+    </select>
+
+    <select id="getFundMargin" resultType="java.util.Map">
+        select rin_of_margin ,mv_of_margin,report_date FROM rz_hfdb_core.mf_asset_allocation
+        WHERE fund_id =#{fundId}  AND  report_date between #{startDate} AND #{endDate} AND isvalid =1
+          AND (report_date like '%-06-%' or report_date like '%-12-%' )
+    </select>
+    <select id="getFundDetailForFuture" resultType="java.util.Map">
+        select a.securities_code as securitiesCode,
+               a.securities_name as securitiesName
+        from  rz_hfdb_core.fund_position_detail a where a.securities_code like concat('',#{securitiesCode},'%') AND a.fund_id = #{fundId}
+                                                    and a.valuation_date =#{valuationDate}
+                                                    and a.sec_type = 3
+                                                    AND a.source_table = 'MF_FundFuturesDetail'
+                                                    and a.isvalid = 1
+        ORDER BY a.securities_code DESC
+    </select>
+    <select id="queryPositionDetailsFundMargin" resultType="com.smppw.analysis.domain.entity.FundPositionDetailDO">
+        SELECT a.sec_id AS secId,
+               a.fund_id AS fundId,
+               a.valuation_date AS valuationDate,
+               a.securities_code AS securitiesCode,
+               a.securities_name AS securitiesName,
+               a.sec_type AS secType,
+               a.securities_amount AS securitiesAmount,
+               a.market_value AS marketValue,
+               a.market_value_ratio AS marketValueRatio,
+               a.shares_nature AS sharesNature
+        FROM rz_hfdb_core.fund_position_detail a
+        WHERE a.fund_id = #{fundId}
+          AND a.valuation_date between #{startDate} AND #{endDate}
+          AND (a.valuation_date like '%-06-%' or a.valuation_date like '%-12-%' )
+          AND a.sec_type = 3
+          AND a.source_table = 'MF_FundFuturesDetail'
+          and a.securities_code is not null
+          and a.securities_amount != 0
+      AND a.isvalid = 1
+        ORDER BY a.valuation_date
+    </select>
+    <select id="getMFFundPositionDetail" resultType="com.smppw.analysis.domain.entity.FundPositionDetailDO">
+        select a.sec_id as secId,
+               a.fund_id as fundId,
+               a.valuation_date as valuationDate,
+               a.securities_code as securitiesCode,
+               a.securities_name as securitiesName,
+               a.sec_type as secType,
+               a.securities_amount as securitiesAmount,
+               a.market_value as marketValue,
+               a.market_value_ratio as marketValueRatio,
+               b.securities_amount as airdropSecuritiesAmount,
+               b.market_value as airdropMarketValue,
+               b.market_value_ratio as airdropMarketValueRatio,
+               a.shares_nature as sharesNature
+        from rz_hfdb_core.fund_position_detail a
+                 left join rz_hfdb_core.fund_position_detail b on a.fund_id=b.fund_id and a.valuation_date=b.valuation_date and  b.sec_type = 3  AND b.source_table = 'MF_FundFuturesDetail'
+            and b.shares_nature != a.shares_nature
+    and a.securities_code=b.securities_code
+    and b.securities_amount != 0
+    and b.isvalid =1
+        where a.fund_id = #{fundId}
+          and a.valuation_date between #{startDate} and #{endDate}
+          AND (a.valuation_date like '%-06-%' or a.valuation_date like '%-12-%' )
+          and a.sec_type = 3
+          AND a.source_table = 'MF_FundFuturesDetail'
+          and a.isvalid = 1
+          and a.securities_amount != 0
+          and a.securities_code is not null
+          AND ((a.shares_nature =1 AND b.shares_nature =2 ) OR (a.shares_nature =2 AND b.fund_id IS NULL) OR a.shares_nature =1  )
+        order by a.valuation_date
+    </select>
+    <select id="getValuationDateNv" resultType="java.util.Map">
+        SELECT report_date as valuationDate,nv FROM rz_hfdb_core.mf_asset_allocation
+        WHERE fund_id =#{fundId}  AND  report_date between #{startDate} and #{endDate} AND isvalid =1
+          AND (report_date like '%-06-%' or report_date like '%-12-%' )
+    </select>
 </mapper>