|
@@ -1,16 +1,14 @@
|
|
|
package com.simuwang.manage.service.impl;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import com.simuwang.base.common.conts.DateConst;
|
|
|
-import com.simuwang.base.mapper.AssetMapper;
|
|
|
-import com.simuwang.base.mapper.FundInfoMapper;
|
|
|
-import com.simuwang.base.mapper.NavMapper;
|
|
|
-import com.simuwang.base.pojo.dos.AssetDO;
|
|
|
-import com.simuwang.base.pojo.dos.FundInfoDO;
|
|
|
-import com.simuwang.base.pojo.dos.NavDO;
|
|
|
+import com.simuwang.base.mapper.*;
|
|
|
+import com.simuwang.base.pojo.dos.*;
|
|
|
import com.simuwang.base.pojo.dto.FundNavDataDTO;
|
|
|
+import com.simuwang.base.pojo.dto.FundNavDeletionDTO;
|
|
|
import com.simuwang.manage.service.FundNavService;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
@@ -27,11 +25,16 @@ public class FundNavServiceImpl implements FundNavService {
|
|
|
private final NavMapper navMapper;
|
|
|
private final FundInfoMapper fundInfoMapper;
|
|
|
private final AssetMapper assetMapper;
|
|
|
+ private final DeletionInfoMapper deletionInfoMapper;
|
|
|
+ private final TradeDateMapper tradeDateMapper;
|
|
|
|
|
|
- public FundNavServiceImpl(NavMapper navMapper, FundInfoMapper fundInfoMapper, AssetMapper assetMapper) {
|
|
|
+ public FundNavServiceImpl(NavMapper navMapper, FundInfoMapper fundInfoMapper,
|
|
|
+ AssetMapper assetMapper, DeletionInfoMapper deletionInfoMapper, TradeDateMapper tradeDateMapper) {
|
|
|
this.navMapper = navMapper;
|
|
|
this.fundInfoMapper = fundInfoMapper;
|
|
|
this.assetMapper = assetMapper;
|
|
|
+ this.deletionInfoMapper = deletionInfoMapper;
|
|
|
+ this.tradeDateMapper = tradeDateMapper;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -63,11 +66,58 @@ public class FundNavServiceImpl implements FundNavService {
|
|
|
return navDataDTOList;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<FundNavDeletionDTO> getFundNavDeletion() {
|
|
|
+ List<FundNavDeletionDTO> navDeletionDTOList = CollUtil.newArrayList();
|
|
|
+ // 缺失类型-1对应全部,1-净值缺失,2-对应规模缺失,3-对应分红缺失,5-估值缺失
|
|
|
+ List<FundDeletionInfoDO> deletionInfoDOList = deletionInfoMapper.getFundNavDeletion(1);
|
|
|
+ if (CollUtil.isEmpty(deletionInfoDOList)) {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+ return navDeletionDTOList;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<FundNavDeletionDTO> buildFundNavDeletionDTO(FundAndCompanyInfoDO fundAndCompanyInfoDO, List<FundDeletionInfoDO> fundDeletionInfoDOList, Map<String, TradeDateDO> tradeDateDoMap) {
|
|
|
+ String fundName = fundAndCompanyInfoDO.getFundName();
|
|
|
+ String trustName = fundAndCompanyInfoDO.getCompanyName();
|
|
|
+ String registerNumber = fundAndCompanyInfoDO.getRegisterNumber();
|
|
|
+ return fundDeletionInfoDOList.stream().map(e -> {
|
|
|
+ FundNavDeletionDTO fundNavDeletionDTO = new FundNavDeletionDTO();
|
|
|
+ fundNavDeletionDTO.setTrustName(trustName);
|
|
|
+ fundNavDeletionDTO.setFundName(fundName);
|
|
|
+ fundNavDeletionDTO.setRegisterNumber(registerNumber);
|
|
|
+ TradeDateDO tradeDateDO = tradeDateDoMap.get(e.getDeletionDate());
|
|
|
+ fundNavDeletionDTO.setYear(tradeDateDO != null ? tradeDateDO.getEndYear() : null);
|
|
|
+ fundNavDeletionDTO.setWeek(tradeDateDO != null ? String.valueOf(tradeDateDO.getWeekOfYear()) : null);
|
|
|
+ fundNavDeletionDTO.setDate(e.getDeletionDate());
|
|
|
+ return fundNavDeletionDTO;
|
|
|
+ }).sorted(Comparator.comparing(FundNavDeletionDTO::getFundName).thenComparing(FundNavDeletionDTO::getDate)).toList();
|
|
|
+ }
|
|
|
+
|
|
|
private List<FundNavDataDTO> buildFundNavDataDTO(FundInfoDO fundInfoDO, List<NavDO> fundNavDoList, List<AssetDO> fundAssetDoList) {
|
|
|
String fundName = fundInfoDO.getFundName();
|
|
|
String registerNumber = fundInfoDO.getRegisterNumber();
|
|
|
- Map<String, BigDecimal> priceDateAssetMap = fundAssetDoList.stream()
|
|
|
- .collect(Collectors.toMap(k -> DateUtil.format(k.getPriceDate(), DateConst.YYYY_MM_DD), AssetDO::getAssetNet));
|
|
|
+ Map<String, BigDecimal> priceDateAssetMap = MapUtil.newHashMap();
|
|
|
+ if (CollUtil.isNotEmpty(fundAssetDoList)) {
|
|
|
+ priceDateAssetMap = fundAssetDoList.stream().collect(Collectors.toMap(k -> DateUtil.format(k.getPriceDate(), DateConst.YYYY_MM_DD), AssetDO::getAssetNet));
|
|
|
+ }
|
|
|
+ Map<String, BigDecimal> finalPriceDateAssetMap = priceDateAssetMap;
|
|
|
return fundNavDoList.stream().map(e -> {
|
|
|
FundNavDataDTO fundNavDataDTO = new FundNavDataDTO();
|
|
|
fundNavDataDTO.setFundName(fundName);
|
|
@@ -76,10 +126,23 @@ public class FundNavServiceImpl implements FundNavService {
|
|
|
fundNavDataDTO.setPriceDate(priceDate);
|
|
|
fundNavDataDTO.setNav(e.getNav() != null ? String.valueOf(e.getNav()) : null);
|
|
|
fundNavDataDTO.setCumulativeNavWithdrawal(e.getCumulativeNavWithdrawal() != null ? String.valueOf(e.getCumulativeNavWithdrawal()) : null);
|
|
|
- BigDecimal asset = priceDateAssetMap.get(priceDate) != null ? priceDateAssetMap.get(priceDate).setScale(2, RoundingMode.HALF_UP) : null;
|
|
|
+ BigDecimal asset = finalPriceDateAssetMap.get(priceDate) != null ? finalPriceDateAssetMap.get(priceDate).setScale(2, RoundingMode.HALF_UP) : null;
|
|
|
fundNavDataDTO.setAsset(asset != null ? String.valueOf(asset) : null);
|
|
|
return fundNavDataDTO;
|
|
|
- }).sorted(Comparator.comparing(FundNavDataDTO::getPriceDate)).toList();
|
|
|
+ }).sorted(Comparator.comparing(FundNavDataDTO::getFundName).thenComparing(FundNavDataDTO::getPriceDate)).toList();
|
|
|
}
|
|
|
|
|
|
+ private Map<String, TradeDateDO> getYearAndWeekOfDate(List<String> dateList) {
|
|
|
+ Map<String, TradeDateDO> tradeDateDoMap = MapUtil.newHashMap();
|
|
|
+ if (CollUtil.isEmpty(dateList)) {
|
|
|
+ return tradeDateDoMap;
|
|
|
+ }
|
|
|
+ List<TradeDateDO> tradeDateDOList = CollUtil.newArrayList();
|
|
|
+ List<List<String>> partition = ListUtil.partition(dateList, 500);
|
|
|
+ partition.forEach(e -> tradeDateDOList.addAll(tradeDateMapper.queryByDate(dateList)));
|
|
|
+ if (CollUtil.isNotEmpty(tradeDateDOList)) {
|
|
|
+ tradeDateDoMap = tradeDateDOList.stream().collect(Collectors.toMap(k -> DateUtil.format(k.getTradeDate(), DateConst.YYYY_MM_DD), v -> v));
|
|
|
+ }
|
|
|
+ return tradeDateDoMap;
|
|
|
+ }
|
|
|
}
|