瀏覽代碼

feat: 估值表缺失计算开发

chenjianhua 6 月之前
父節點
當前提交
45c450fdde

+ 2 - 1
service-base/src/main/java/com/simuwang/base/common/enums/DeletionType.java

@@ -11,7 +11,8 @@ import java.util.stream.Stream;
 public enum DeletionType {
 public enum DeletionType {
     //单位分红/拆分比例
     //单位分红/拆分比例
     NAV_DELETION(1, "净值缺失"), ASSET_DELETION(2, "规模缺失"),
     NAV_DELETION(1, "净值缺失"), ASSET_DELETION(2, "规模缺失"),
-    DISTRIBUTION_DELETION(3, "分红缺失"), NO_DELETION(4, "已补充"),EXIST_SPLIT(4, "存在拆分");
+    DISTRIBUTION_DELETION(3, "分红缺失"), NO_DELETION(4, "已补充"),
+    EXIST_SPLIT(4, "存在拆分"), VALUATION_DELETION(5, "估值缺失");
 
 
     private final Integer code;
     private final Integer code;
     private final String info;
     private final String info;

+ 1 - 1
service-base/src/main/java/com/simuwang/base/mapper/DeletionInfoMapper.java

@@ -49,7 +49,7 @@ public interface DeletionInfoMapper {
 
 
     void deleteDeletionRemark(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType, @Param("tradeDate")String tradeDate);
     void deleteDeletionRemark(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType, @Param("tradeDate")String tradeDate);
 
 
-    void deleteDistributeDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
+    void deleteDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
 
 
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
 }
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/mapper/ValuationTableMapper.java

@@ -4,6 +4,8 @@ import com.simuwang.base.pojo.dos.ValuationTableDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 
 
+import java.util.List;
+
 @Mapper
 @Mapper
 public interface ValuationTableMapper {
 public interface ValuationTableMapper {
 
 
@@ -14,4 +16,6 @@ public interface ValuationTableMapper {
     void updateUpdateAnalyzed(@Param("fundId") String fundId,
     void updateUpdateAnalyzed(@Param("fundId") String fundId,
                               @Param("valuationDate") String valuationDate, @Param("hasStock") Integer hasStock,
                               @Param("valuationDate") String valuationDate, @Param("hasStock") Integer hasStock,
                               @Param("hasBond") Integer hasBond, @Param("hasFuture") Integer hasFuture);
                               @Param("hasBond") Integer hasBond, @Param("hasFuture") Integer hasFuture);
+
+    List<ValuationTableDO> selectValuationTableByFundId(@Param("fundId")String fundId);
 }
 }

+ 1 - 1
service-base/src/main/resources/mapper/DeletionInfoMapper.xml

@@ -57,7 +57,7 @@
             and deletion_date=#{tradeDate}
             and deletion_date=#{tradeDate}
         </if>
         </if>
     </delete>
     </delete>
-    <delete id="deleteDistributeDeletion">
+    <delete id="deleteDeletion">
         update PPW_EMAIL.deletion_info  set isvalid=0,updatetime=sysdate() where isvalid=1 and fund_id=#{fundId} and deletion_type=#{deletionType} and remark is null
         update PPW_EMAIL.deletion_info  set isvalid=0,updatetime=sysdate() where isvalid=1 and fund_id=#{fundId} and deletion_type=#{deletionType} and remark is null
     </delete>
     </delete>
     <select id="searchDeletionList" resultMap="BaseResultMap"
     <select id="searchDeletionList" resultMap="BaseResultMap"

+ 4 - 0
service-base/src/main/resources/mapper/ValuationTableMapper.xml

@@ -34,6 +34,10 @@
         set isvalid = 0
         set isvalid = 0
         where file_id = #{fileId}
         where file_id = #{fileId}
     </update>
     </update>
+    <select id="selectValuationTableByFundId" resultMap="BaseResultMap"
+            parameterType="java.lang.String">
+        select distinct fund_id,valuation_date from PPW_EMAIL.valuation_table where fund_id=#{fundId} and isvalid=1
+    </select>
 
 
     <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.simuwang.base.pojo.dos.ValuationTableDO" useGeneratedKeys="true">
     <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.simuwang.base.pojo.dos.ValuationTableDO" useGeneratedKeys="true">
         <!--@mbg.generated-->
         <!--@mbg.generated-->

+ 144 - 3
service-manage/src/main/java/com/simuwang/manage/service/impl/DeletionServiceImpl.java

@@ -39,6 +39,9 @@ public class DeletionServiceImpl implements DeletionService {
     private FundInfoMapper fundInfoMapper;
     private FundInfoMapper fundInfoMapper;
 
 
     @Autowired
     @Autowired
+    private ValuationTableMapper valuationTableMapper;
+
+    @Autowired
     private AssetMapper assetMapper;
     private AssetMapper assetMapper;
 
 
     @Autowired
     @Autowired
@@ -139,6 +142,7 @@ public class DeletionServiceImpl implements DeletionService {
         }
         }
         List<NavDO> navDOList = navMapper.selectNavByFundId(fundId);
         List<NavDO> navDOList = navMapper.selectNavByFundId(fundId);
         List<AssetDO> assetDOList = assetMapper.selectAssetByFundId(fundId);
         List<AssetDO> assetDOList = assetMapper.selectAssetByFundId(fundId);
+        List<ValuationTableDO> valuationTableDOList = valuationTableMapper.selectValuationTableByFundId(fundId);
         //查询成立日到今天为止的交易日集合
         //查询成立日到今天为止的交易日集合
         List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
         List<TradeDateDO> tradeDateDOList = tradeDateMapper.selectTradeDate(inceptionDate,today);
         if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.NAV_DELETION.getCode())){
         if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.NAV_DELETION.getCode())){
@@ -147,10 +151,13 @@ public class DeletionServiceImpl implements DeletionService {
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
         }else if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.DISTRIBUTION_DELETION.getCode())){
         }else if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.DISTRIBUTION_DELETION.getCode())){
             distributionDeletion(fundId,navDOList);
             distributionDeletion(fundId,navDOList);
+        }else if(deletionDownParam.getDeletionType() != null && deletionDownParam.getDeletionType().equals(DeletionType.VALUATION_DELETION.getCode())){
+             valuationDeletion(fundId,valuationTableDOList,tradeDateDOList,fundReportFrequencyDO);
         }else{
         }else{
             navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
             navDeletion(fundId,navDOList,tradeDateDOList,fundReportFrequencyDO);
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
             assetDeletion(fundId,assetDOList,tradeDateDOList,fundReportFrequencyDO);
             distributionDeletion(fundId,navDOList);
             distributionDeletion(fundId,navDOList);
+            valuationDeletion(fundId,valuationTableDOList,tradeDateDOList,fundReportFrequencyDO);
         }
         }
 
 
     }
     }
@@ -160,7 +167,7 @@ public class DeletionServiceImpl implements DeletionService {
             return;
             return;
         }
         }
         //将现有数据无效掉
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
         //查询是否存在拆分
         //查询是否存在拆分
         List<DistributionDO> distributionDOS = distributionMapper.getDistributionByFundId(fundId, DistributeType.DIVIDENDS_SPLIT);
         List<DistributionDO> distributionDOS = distributionMapper.getDistributionByFundId(fundId, DistributeType.DIVIDENDS_SPLIT);
         if(distributionDOS.size() > 0){
         if(distributionDOS.size() > 0){
@@ -202,7 +209,7 @@ public class DeletionServiceImpl implements DeletionService {
 
 
     private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
     private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
             Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
             Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
             Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
             Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
@@ -336,7 +343,7 @@ public class DeletionServiceImpl implements DeletionService {
 
 
     private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
     private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
         //将现有数据无效掉
-        deletionInfoMapper.deleteDistributeDeletion(fundId,DeletionType.NAV_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.NAV_DELETION.getCode());
         //只处理日月季频率
         //只处理日月季频率
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
             Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
             Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -468,6 +475,140 @@ public class DeletionServiceImpl implements DeletionService {
         }
         }
     }
     }
 
 
+    private void valuationDeletion(String fundId,List<ValuationTableDO> valuationTableDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
+        //将现有数据无效掉
+        deletionInfoMapper.deleteDeletion(fundId,DeletionType.VALUATION_DELETION.getCode());
+        //只处理日月季频率
+        if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<ValuationTableDO>> valuationListMap = valuationTableDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
+            for(String tradeDate : tradeListMap.keySet()){
+                if(valuationListMap.containsKey(tradeDate)){
+                    deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    continue;
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+        if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<ValuationTableDO>> valuationListMap = valuationTableDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<Integer,List<ValuationTableDO>> weekNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : valuationListMap.keySet()){
+                Integer weekOfYear = Integer.parseInt(priceDate.substring(0,4)+DateUtil.weekOfYear(DateUtils.parse(priceDate,DateUtils.YYYY_MM_DD)));;
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    List<ValuationTableDO> valuationDOS = weekNavListMap.get(weekOfYear);
+                    valuationDOS.addAll(valuationListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,valuationDOS);
+                }else{
+                    List<ValuationTableDO> valuationDOS = new ArrayList<>();
+                    valuationDOS.addAll(valuationListMap.get(priceDate));
+                    weekNavListMap.put(weekOfYear,valuationDOS);
+                }
+            }
+            Map<Integer,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearWeek()));
+            for(Integer weekOfYear : tradeListMap.keySet()){
+                List<ValuationTableDO> valuationDOS = weekNavListMap.get(weekOfYear);
+                if(weekNavListMap.containsKey(weekOfYear)){
+                    for(TradeDateDO tradeDateDO : tradeListMap.get(weekOfYear)){
+                        String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
+                        deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    }
+                    continue;
+                }else{
+                    //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
+                    if(StringUtil.isNotEmpty(valuationDOS)){
+                        for(int idx=0;idx < valuationDOS.size()-1 ; idx++){
+                            ValuationTableDO valautionDO = valuationDOS.get(idx);
+                            String tradeDate = DateUtils.format(valautionDO.getValuationDate(),DateUtils.YYYY_MM_DD);
+                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                        }
+                    }
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(weekOfYear);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+        if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
+            Map<String,List<ValuationTableDO>> valuationListMap = valuationTableDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
+            TreeMap<String,List<ValuationTableDO>> monthNavListMap = new TreeMap<>();
+            //按周数整合
+            for(String priceDate : valuationListMap.keySet()){
+                String yearMonth = priceDate.substring(0,7);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    List<ValuationTableDO> valuationTableDOS = monthNavListMap.get(yearMonth);
+                    valuationTableDOS.addAll(valuationListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,valuationTableDOS);
+                }else{
+                    List<ValuationTableDO> valuationTableDOS = new ArrayList<>();
+                    valuationTableDOS.addAll(valuationListMap.get(priceDate));
+                    monthNavListMap.put(yearMonth,valuationTableDOS);
+                }
+            }
+            Map<String,List<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> e.getYearmonth()));
+            for(String yearMonth : tradeListMap.keySet()){
+                //本月的数据不考虑
+                String thisMonth = DateUtils.format(new Date(),DateUtils.YYYY_MM);
+                if(yearMonth.equals(thisMonth)){
+                    continue;
+                }
+                List<ValuationTableDO> valuationTableDOS = monthNavListMap.get(yearMonth);
+                if(monthNavListMap.containsKey(yearMonth)){
+                    for(TradeDateDO tradeDateDO : tradeListMap.get(yearMonth)){
+                        String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
+                        deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    }
+                    continue;
+                }else{
+                    //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
+                    if(StringUtil.isNotEmpty(valuationTableDOS)){
+                        for(ValuationTableDO valuationTableDO : valuationTableDOS){
+                            String tradeDate = DateUtils.format(valuationTableDO.getValuationDate(),DateUtils.YYYY_MM_DD);
+                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                        }
+                    }
+
+                }
+                //不包含的话,默认取每周的最后一个交易日作为周净值日期
+                List<TradeDateDO> tradeDateDOS = tradeListMap.get(yearMonth);
+                String tradeDate = null;
+                if(tradeDateDOS.size() > 0){
+                    tradeDate = DateUtils.format(tradeDateDOS.get(tradeDateDOS.size()-1).getTradeDate(),DateUtils.YYYY_MM_DD);
+                }
+                if(tradeDateDOList.size() <= 3){
+                    continue;
+                }
+                TradeDateDO tradeDateDO = tradeDateDOList.get(tradeDateDOList.size()-3);
+                if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
+                    continue;
+                }
+                //写入缺失信息表
+                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+            }
+        }
+    }
+
     private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
     private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
         if(tradeDate == null){
         if(tradeDate == null){
             return;
             return;