|
@@ -7,15 +7,16 @@ import cn.hutool.core.map.MapUtil;
|
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
|
import com.simuwang.base.mapper.*;
|
|
|
import com.simuwang.base.pojo.dos.*;
|
|
|
-import com.simuwang.base.pojo.dto.competition.CompetitionBaseResultDTO;
|
|
|
import com.simuwang.base.pojo.dto.FundNavDataDTO;
|
|
|
import com.simuwang.base.pojo.dto.FundNavDeletionDTO;
|
|
|
+import com.simuwang.base.pojo.dto.competition.CompetitionBaseResultDTO;
|
|
|
import com.simuwang.base.pojo.dto.competition.ZhzqCompetitionResultDTO;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.util.Comparator;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -29,70 +30,102 @@ public class FundNavServiceImpl implements FundNavService {
|
|
|
private final DeletionInfoMapper deletionInfoMapper;
|
|
|
private final TradeDateMapper tradeDateMapper;
|
|
|
private final CompetitionFactory competitionFactory;
|
|
|
+ private final RcCompetitionTaskDateMapper competitionTaskDateMapper;
|
|
|
+ private final RcCompetitionCalcDateMapper competitionCalcDateMapper;
|
|
|
|
|
|
public FundNavServiceImpl(NavMapper navMapper, FundInfoMapper fundInfoMapper,
|
|
|
AssetMapper assetMapper, DeletionInfoMapper deletionInfoMapper,
|
|
|
- TradeDateMapper tradeDateMapper, CompetitionFactory competitionFactory) {
|
|
|
+ TradeDateMapper tradeDateMapper, CompetitionFactory competitionFactory,
|
|
|
+ RcCompetitionTaskDateMapper competitionTaskDateMapper, RcCompetitionCalcDateMapper competitionCalcDateMapper) {
|
|
|
this.navMapper = navMapper;
|
|
|
this.fundInfoMapper = fundInfoMapper;
|
|
|
this.assetMapper = assetMapper;
|
|
|
this.deletionInfoMapper = deletionInfoMapper;
|
|
|
this.tradeDateMapper = tradeDateMapper;
|
|
|
this.competitionFactory = competitionFactory;
|
|
|
+ this.competitionTaskDateMapper = competitionTaskDateMapper;
|
|
|
+ this.competitionCalcDateMapper = competitionCalcDateMapper;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<FundNavDataDTO> getFungNavData() {
|
|
|
+ public List<FundNavDataDTO> getFungNavData(Integer competitionId) {
|
|
|
List<FundNavDataDTO> navDataDTOList = CollUtil.newArrayList();
|
|
|
- List<NavDO> navDOList = navMapper.queryAllNav();
|
|
|
- if (CollUtil.isEmpty(navDOList)) {
|
|
|
+ String date = DateUtil.format(new Date(), DateConst.YYYY_MM_DD);
|
|
|
+ List<RcCompetitionTaskDateDO> taskDateDOList = competitionTaskDateMapper.queryByNavDetailDate(date, competitionId);
|
|
|
+ if (CollUtil.isEmpty(taskDateDOList)) {
|
|
|
return navDataDTOList;
|
|
|
}
|
|
|
- List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).distinct().toList();
|
|
|
- List<FundAndCompanyInfoDO> fundInfoCompanyNameList = fundInfoMapper.queryFundAndTrustByFundId(fundIdList);
|
|
|
- Map<String, FundAndCompanyInfoDO> fundIdCompanyNameMap = fundInfoCompanyNameList.stream().collect(Collectors.toMap(FundAndCompanyInfoDO::getFundId, v -> v));
|
|
|
-
|
|
|
- List<AssetDO> assetDOList = assetMapper.queryAssetByFundId(fundIdList);
|
|
|
- Map<String, List<AssetDO>> fundIdAssetMap = MapUtil.newHashMap();
|
|
|
- if (CollUtil.isNotEmpty(assetDOList)) {
|
|
|
- fundIdAssetMap = assetDOList.stream().collect(Collectors.groupingBy(AssetDO::getFundId));
|
|
|
- }
|
|
|
+ List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
|
+ List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
|
+ for (RcCompetitionCalcDateDO calcDateDO : calcDateDOList) {
|
|
|
+ String period = calcDateDO.getPriod();
|
|
|
+ String beginDate = calcDateDO.getBeginDate();
|
|
|
+ String endDate = calcDateDO.getEndDate();
|
|
|
+ List<NavDO> navDOList = navMapper.queryAllNav(beginDate, endDate);
|
|
|
+ if (CollUtil.isEmpty(navDOList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 过滤出周频的净值点
|
|
|
+ List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(beginDate, endDate);
|
|
|
+ navDOList = filterWeekFrequencyNav(navDOList, tradeDateDOList);
|
|
|
|
|
|
- Map<String, List<NavDO>> fundIdNavMap = navDOList.stream().collect(Collectors.groupingBy(NavDO::getFundId));
|
|
|
- for (Map.Entry<String, List<NavDO>> fundIdNavEntry : fundIdNavMap.entrySet()) {
|
|
|
- String fundId = fundIdNavEntry.getKey();
|
|
|
- List<NavDO> fundNavDoList = fundIdNavEntry.getValue();
|
|
|
- List<AssetDO> fundAssetDoList = fundIdAssetMap.get(fundId);
|
|
|
- FundAndCompanyInfoDO fundInfoDO = fundIdCompanyNameMap.get(fundId);
|
|
|
- List<FundNavDataDTO> fundNavDataDTOList = buildFundNavDataDTO(fundInfoDO, fundNavDoList, fundAssetDoList);
|
|
|
- navDataDTOList.addAll(fundNavDataDTOList);
|
|
|
+ List<String> fundIdList = navDOList.stream().map(NavDO::getFundId).distinct().toList();
|
|
|
+ List<FundAndCompanyInfoDO> fundInfoCompanyNameList = fundInfoMapper.queryFundAndTrustByFundId(fundIdList);
|
|
|
+ Map<String, FundAndCompanyInfoDO> fundIdCompanyNameMap = fundInfoCompanyNameList.stream().collect(Collectors.toMap(FundAndCompanyInfoDO::getFundId, v -> v));
|
|
|
+ List<AssetDO> assetDOList = assetMapper.queryAssetByFundId(fundIdList);
|
|
|
+ Map<String, List<AssetDO>> fundIdAssetMap = MapUtil.newHashMap();
|
|
|
+ if (CollUtil.isNotEmpty(assetDOList)) {
|
|
|
+ fundIdAssetMap = assetDOList.stream().collect(Collectors.groupingBy(AssetDO::getFundId));
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, List<NavDO>> fundIdNavMap = navDOList.stream().collect(Collectors.groupingBy(NavDO::getFundId));
|
|
|
+ for (Map.Entry<String, List<NavDO>> fundIdNavEntry : fundIdNavMap.entrySet()) {
|
|
|
+ String fundId = fundIdNavEntry.getKey();
|
|
|
+ List<NavDO> fundNavDoList = fundIdNavEntry.getValue();
|
|
|
+ List<AssetDO> fundAssetDoList = fundIdAssetMap.get(fundId);
|
|
|
+ FundAndCompanyInfoDO fundInfoDO = fundIdCompanyNameMap.get(fundId);
|
|
|
+ List<FundNavDataDTO> fundNavDataDTOList = buildFundNavDataDTO(fundInfoDO, fundNavDoList, fundAssetDoList);
|
|
|
+ fundNavDataDTOList.forEach(e -> e.setPriod(period));
|
|
|
+ navDataDTOList.addAll(fundNavDataDTOList);
|
|
|
+ }
|
|
|
}
|
|
|
return navDataDTOList;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<FundNavDeletionDTO> getFundNavDeletion() {
|
|
|
+ public List<FundNavDeletionDTO> getFundNavDeletion(Integer competitionId) {
|
|
|
List<FundNavDeletionDTO> navDeletionDTOList = CollUtil.newArrayList();
|
|
|
- // 缺失类型-1对应全部,1-净值缺失,2-对应规模缺失,3-对应分红缺失,5-估值缺失
|
|
|
- List<FundDeletionInfoDO> deletionInfoDOList = deletionInfoMapper.getFundNavDeletion(1);
|
|
|
- if (CollUtil.isEmpty(deletionInfoDOList)) {
|
|
|
+ String date = DateUtil.format(new Date(), DateConst.YYYY_MM_DD);
|
|
|
+ List<RcCompetitionTaskDateDO> taskDateDOList = competitionTaskDateMapper.queryByNavDeletionDate(date, competitionId);
|
|
|
+ if (CollUtil.isEmpty(taskDateDOList)) {
|
|
|
return navDeletionDTOList;
|
|
|
}
|
|
|
- List<String> fundIdList = deletionInfoDOList.stream().map(FundDeletionInfoDO::getFundId).distinct().toList();
|
|
|
- List<FundAndCompanyInfoDO> fundInfoCompanyNameList = fundInfoMapper.queryFundAndTrustByFundId(fundIdList);
|
|
|
- Map<String, FundAndCompanyInfoDO> fundIdCompanyNameMap = fundInfoCompanyNameList.stream().collect(Collectors.toMap(FundAndCompanyInfoDO::getFundId, v -> v));
|
|
|
-
|
|
|
- // 获取净值日期所在年和所在周
|
|
|
- List<String> dateList = deletionInfoDOList.stream().map(FundDeletionInfoDO::getDeletionDate).distinct().toList();
|
|
|
- Map<String, TradeDateDO> tradeDateDoMap = getYearAndWeekOfDate(dateList);
|
|
|
-
|
|
|
- Map<String, List<FundDeletionInfoDO>> fundIdDeletionInfoMap = deletionInfoDOList.stream().collect(Collectors.groupingBy(FundDeletionInfoDO::getFundId));
|
|
|
- for (Map.Entry<String, List<FundDeletionInfoDO>> fundIdDeletionInfoEntry : fundIdDeletionInfoMap.entrySet()) {
|
|
|
- String fundId = fundIdDeletionInfoEntry.getKey();
|
|
|
- List<FundDeletionInfoDO> fundDeletionInfoDOList = fundIdDeletionInfoEntry.getValue();
|
|
|
- FundAndCompanyInfoDO fundAndCompanyInfoDO = fundIdCompanyNameMap.get(fundId);
|
|
|
- List<FundNavDeletionDTO> fundNavDataDTOList = buildFundNavDeletionDTO(fundAndCompanyInfoDO, fundDeletionInfoDOList, tradeDateDoMap);
|
|
|
- navDeletionDTOList.addAll(fundNavDataDTOList);
|
|
|
+ List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
|
+ List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
|
+ for (RcCompetitionCalcDateDO calcDateDO : calcDateDOList) {
|
|
|
+ String period = calcDateDO.getPriod();
|
|
|
+ String beginDate = calcDateDO.getBeginDate();
|
|
|
+ String endDate = calcDateDO.getEndDate();
|
|
|
+ // 缺失类型-1对应全部,1-净值缺失,2-对应规模缺失,3-对应分红缺失,5-估值缺失
|
|
|
+ List<FundDeletionInfoDO> deletionInfoDOList = deletionInfoMapper.getFundNavDeletion(1, beginDate, endDate);
|
|
|
+ if (CollUtil.isEmpty(deletionInfoDOList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<String> fundIdList = deletionInfoDOList.stream().map(FundDeletionInfoDO::getFundId).distinct().toList();
|
|
|
+ List<FundAndCompanyInfoDO> fundInfoCompanyNameList = fundInfoMapper.queryFundAndTrustByFundId(fundIdList);
|
|
|
+ Map<String, FundAndCompanyInfoDO> fundIdCompanyNameMap = fundInfoCompanyNameList.stream().collect(Collectors.toMap(FundAndCompanyInfoDO::getFundId, v -> v));
|
|
|
+ // 获取净值日期所在年和所在周
|
|
|
+ List<String> dateList = deletionInfoDOList.stream().map(FundDeletionInfoDO::getDeletionDate).distinct().toList();
|
|
|
+ Map<String, TradeDateDO> tradeDateDoMap = getYearAndWeekOfDate(dateList);
|
|
|
+ Map<String, List<FundDeletionInfoDO>> fundIdDeletionInfoMap = deletionInfoDOList.stream().collect(Collectors.groupingBy(FundDeletionInfoDO::getFundId));
|
|
|
+ for (Map.Entry<String, List<FundDeletionInfoDO>> fundIdDeletionInfoEntry : fundIdDeletionInfoMap.entrySet()) {
|
|
|
+ String fundId = fundIdDeletionInfoEntry.getKey();
|
|
|
+ List<FundDeletionInfoDO> fundDeletionInfoDOList = fundIdDeletionInfoEntry.getValue();
|
|
|
+ FundAndCompanyInfoDO fundAndCompanyInfoDO = fundIdCompanyNameMap.get(fundId);
|
|
|
+ List<FundNavDeletionDTO> fundNavDataDTOList = buildFundNavDeletionDTO(fundAndCompanyInfoDO, fundDeletionInfoDOList, tradeDateDoMap);
|
|
|
+ fundNavDataDTOList.forEach(e -> e.setPriod(period));
|
|
|
+ navDeletionDTOList.addAll(fundNavDataDTOList);
|
|
|
+ }
|
|
|
}
|
|
|
return navDeletionDTOList;
|
|
|
}
|
|
@@ -167,4 +200,28 @@ public class FundNavServiceImpl implements FundNavService {
|
|
|
}
|
|
|
return tradeDateDoMap;
|
|
|
}
|
|
|
+
|
|
|
+ private List<NavDO> filterWeekFrequencyNav(List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList) {
|
|
|
+ List<NavDO> dataList = CollUtil.newArrayList();
|
|
|
+ if(CollUtil.isEmpty(navDOList)){
|
|
|
+ return dataList;
|
|
|
+ }
|
|
|
+ Map<Integer, List<TradeDateDO>> yearWeekTradeDateMap = tradeDateDOList.stream().collect(Collectors.groupingBy(TradeDateDO::getYearWeek));
|
|
|
+
|
|
|
+ Map<String, List<NavDO>> fundIdNavDoMap = navDOList.stream().collect(Collectors.groupingBy(NavDO::getFundId));
|
|
|
+ for (Map.Entry<String, List<NavDO>> fundIdNavDoEntry : fundIdNavDoMap.entrySet()) {
|
|
|
+ List<NavDO> navDoList = fundIdNavDoEntry.getValue();
|
|
|
+ for (Map.Entry<Integer, List<TradeDateDO>> yearWeekTradeDateEntry : yearWeekTradeDateMap.entrySet()) {
|
|
|
+ List<Date> tradeDateList = yearWeekTradeDateEntry.getValue().stream().map(TradeDateDO::getTradeDate).toList();
|
|
|
+ List<NavDO> collect = navDoList.stream().filter(e -> tradeDateList.contains(e.getPriceDate())).toList();
|
|
|
+ if(CollUtil.isEmpty(collect)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ NavDO navDO = collect.stream().max(Comparator.comparing(NavDO::getPriceDate)).orElse(null);
|
|
|
+ dataList.add(navDO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return dataList;
|
|
|
+ }
|
|
|
+
|
|
|
}
|