Browse Source

feat:设计榜单结果输出表和调整基金净值明细表净值的输出规则

mozuwen 5 months ago
parent
commit
53776c7cec

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

@@ -53,5 +53,5 @@ public interface DeletionInfoMapper {
 
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
 
-    List<FundDeletionInfoDO> getFundNavDeletion(@Param("deletionType") Integer deletionType);
+    List<FundDeletionInfoDO> getFundNavDeletion(@Param("deletionType") Integer deletionType,@Param("startDate") String startDate,@Param("endDate") String endDate);
 }

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

@@ -31,5 +31,5 @@ public interface NavMapper {
 
     Long countNavTotal();
 
-    List<NavDO> queryAllNav();
+    List<NavDO> queryAllNav(@Param("startDate") String startDate,@Param("endDate") String endDate);
 }

+ 15 - 0
service-base/src/main/java/com/simuwang/base/mapper/RcCompetitionCalcDateMapper.java

@@ -0,0 +1,15 @@
+package com.simuwang.base.mapper;
+
+import com.simuwang.base.pojo.dos.RcCompetitionCalcDateDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface RcCompetitionCalcDateMapper {
+
+    List<RcCompetitionCalcDateDO> getCalcDateByCompetitionId(@Param("competitionId") Integer competitionId);
+
+    List<RcCompetitionCalcDateDO>  queryByPriod(@Param("periodList") List<String> periodList, @Param("competitionId") Integer competitionId);
+}

+ 16 - 0
service-base/src/main/java/com/simuwang/base/mapper/RcCompetitionTaskDateMapper.java

@@ -0,0 +1,16 @@
+package com.simuwang.base.mapper;
+
+import com.simuwang.base.pojo.dos.RcCompetitionTaskDateDO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface RcCompetitionTaskDateMapper {
+
+    List<RcCompetitionTaskDateDO> queryByNavDetailDate(@Param("date") String date, @Param("competitionId") Integer competitionId);
+
+    List<RcCompetitionTaskDateDO> queryByNavDeletionDate(@Param("date") String date, @Param("competitionId") Integer competitionId);
+
+}

+ 48 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/RcCompetitionCalcDateDO.java

@@ -0,0 +1,48 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+@Data
+public class RcCompetitionCalcDateDO {
+
+    /**
+     * 主键Id
+     */
+    private Integer id;
+
+    /**
+     * 大赛ID
+     */
+    private Integer competitionId;
+
+    /**
+     * 计算时段,年份-月份:月度,年份季度:季度,all:总榜单,2years:两年榜,fir_halfyear:上半年,sec_halfyear:下半年
+     */
+    private String priod;
+
+    /**
+     * 计算日期
+     */
+    private String calcDate;
+
+    /**
+     * 开始时间
+     */
+    private String beginDate;
+
+    /**
+     * 结束时间
+     */
+    private String endDate;
+
+    /**
+     * 开始月
+     */
+    private String startMonth;
+
+    /**
+     * 截止月
+     */
+    private String endMonth;
+
+}

+ 36 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/RcCompetitionTaskDateDO.java

@@ -0,0 +1,36 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+@Data
+public class RcCompetitionTaskDateDO {
+    /**
+     * 主键Id
+     */
+    private Integer id;
+
+    /**
+     * 大赛ID
+     */
+    private Integer competitionId;
+
+    /**
+     * 基金净值明细输出日期
+     */
+    private String navDetailDate;
+
+    /**
+     * 基金净值缺失明细输出日期
+     */
+    private String navDeletionDate;
+
+    /**
+     *
+     */
+    private String priodDate;
+
+    /**
+     * 输出榜单:年份-月份:月度,年份季度:季度,all:总榜单,2years:两年榜,fir_halfyear:上半年,sec_halfyear:下半年
+     */
+    private String priod;
+}

+ 7 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/FundNavDataDTO.java

@@ -1,5 +1,6 @@
 package com.simuwang.base.pojo.dto;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.HeadFontStyle;
@@ -71,4 +72,10 @@ public class FundNavDataDTO {
     @ColumnWidth(15)
     @ExcelProperty("资产净值")
     private String asset;
+
+    /**
+     * 榜单周期
+     */
+    @ExcelIgnore
+    private String priod;
 }

+ 7 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/FundNavDeletionDTO.java

@@ -1,5 +1,6 @@
 package com.simuwang.base.pojo.dto;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ColumnWidth;
 import com.alibaba.excel.annotation.write.style.HeadFontStyle;
@@ -64,4 +65,10 @@ public class FundNavDeletionDTO {
     @ColumnWidth(15)
     @ExcelProperty("缺失日期")
     private String date;
+
+    /**
+     * 榜单周期
+     */
+    @ExcelIgnore
+    private String priod;
 }

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

@@ -289,9 +289,12 @@
     </update>
 
     <select id="getFundNavDeletion" resultMap="BaseMap">
-        select fund_id, deletion_date
-        from deletion_info
-        where isvalid = 1
-          and deletion_type = #{deletionType}
+        select t1.fund_id, t1.deletion_date
+        from deletion_info t1
+            join rc_competition_apply t2 on t1.fund_id = t2.product_code and t2.isvalid=1
+        where t1.isvalid = 1
+          and t1.deletion_type = #{deletionType}
+        and t1.deletion_date >= #{startDate}
+          and t1.deletion_date <![CDATA[ <= ]]> #{endDate}
     </select>
 </mapper>

+ 2 - 0
service-base/src/main/resources/mapper/NavMapper.xml

@@ -106,5 +106,7 @@
         SELECT fund_id, price_date, nav, cumulative_nav, cumulative_nav_withdrawal
         from nav
         where isvalid = 1
+          and price_date >= #{startDate}
+          and price_date <![CDATA[ <= ]]> #{endDate}
     </select>
 </mapper>

+ 32 - 0
service-base/src/main/resources/mapper/RzCompetitionCalcDateMapper.xml

@@ -0,0 +1,32 @@
+<?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.simuwang.base.mapper.RcCompetitionCalcDateMapper">
+    <select id="getCalcDateByCompetitionId" resultType="com.simuwang.base.pojo.dos.RcCompetitionCalcDateDO">
+        SELECT competition_id as competitionId,
+               priod,
+               calc_date      as calcDate,
+               begin_date     as beginDate,
+               end_date       as endDate,
+               start_month    as startDate,
+               end_month      as endMonth
+        FROM rc_competition_calc_date
+        WHERE isvalid = 1
+          AND competition_id = #{competitionId}
+    </select>
+
+    <select id="queryByPriod" resultType="com.simuwang.base.pojo.dos.RcCompetitionCalcDateDO">
+        SELECT competition_id as competitionId,
+               priod,
+               calc_date      as calcDate,
+               begin_date     as beginDate,
+               end_date       as endDate
+        FROM rc_competition_calc_date
+        WHERE isvalid = 1
+          AND competition_id = #{competitionId}
+        and priod in
+            <foreach collection="periodList" index="index" item="period" open="(" separator="," close=")">
+                #{period}
+            </foreach>
+    </select>
+
+</mapper>

+ 29 - 0
service-base/src/main/resources/mapper/RzCompetitionTaskDateMapper.xml

@@ -0,0 +1,29 @@
+<?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.simuwang.base.mapper.RcCompetitionTaskDateMapper">
+    <resultMap id="baseResultMap" type="com.simuwang.base.pojo.dos.RcCompetitionTaskDateDO">
+        <id column="id" property="id"/>
+        <result column="competition_id" property="competitionId"/>
+        <result column="nav_detail_date" property="navDetailDate"/>
+        <result column="nav_deletion_date" property="navDeletionDate"/>
+        <result column="priod_date" property="priodDate"/>
+        <result column="priod" property="priod"/>
+    </resultMap>
+
+    <select id="queryByNavDetailDate" resultMap="baseResultMap">
+        SELECT competition_id, nav_detail_date, nav_deletion_date, priod, priod_date
+        FROM `rc_competition_task_date`
+        WHERE isvalid = 1
+          AND competition_id = #{competitionId}
+          and nav_detail_date = #{date}
+    </select>
+
+    <select id="queryByNavDeletionDate" resultMap="baseResultMap">
+        SELECT competition_id, nav_detail_date, nav_deletion_date, priod, priod_date
+        FROM `rc_competition_task_date`
+        WHERE isvalid = 1
+          AND competition_id = #{competitionId}
+          and nav_deletion_date = #{date}
+    </select>
+
+</mapper>

+ 4 - 3
service-manage/src/main/java/com/simuwang/manage/service/competition/FundNavService.java

@@ -10,17 +10,18 @@ public interface FundNavService {
 
     /**
      * 获取基金净值数据
+     * @param competitionId 大赛id(区分不同大赛)
      *
      * @return 基金净值数据
      */
-    List<FundNavDataDTO> getFungNavData();
+    List<FundNavDataDTO> getFungNavData(Integer competitionId);
 
     /**
      * 获取基金净值缺失明细数据
-     *
+     * @param competitionId 大赛id(区分不同大赛)
      * @return 基金净值缺失明细数据
      */
-    List<FundNavDeletionDTO> getFundNavDeletion();
+    List<FundNavDeletionDTO> getFundNavDeletion(Integer competitionId);
 
     /**
      * 获取大赛榜单结果

+ 98 - 41
service-manage/src/main/java/com/simuwang/manage/service/competition/FundNavServiceImpl.java

@@ -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;
+    }
+
 }

+ 5 - 1
service-manage/src/main/java/com/simuwang/manage/service/competition/FzzqCompetitionResultServiceService.java

@@ -2,6 +2,7 @@ package com.simuwang.manage.service.competition;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
+import com.simuwang.base.config.CompetitionConfig;
 import com.simuwang.base.mapper.RzFzzq2ResultMapper;
 import com.simuwang.base.pojo.dto.competition.CompetitionBaseResultDTO;
 import com.simuwang.base.pojo.dto.competition.FzzqCompetitionResultDTO;
@@ -25,9 +26,11 @@ public class FzzqCompetitionResultServiceService extends AbstractCompetitionResu
         STRATEGY_ID_NAME_MAP.put(5, "复合策略");
     }
 
+    private final CompetitionConfig competitionConfig;
     private final RzFzzq2ResultMapper fzzq2ResultMapper;
 
-    public FzzqCompetitionResultServiceService(RzFzzq2ResultMapper fzzq2ResultMapper) {
+    public FzzqCompetitionResultServiceService(CompetitionConfig competitionConfig, RzFzzq2ResultMapper fzzq2ResultMapper) {
+        this.competitionConfig = competitionConfig;
         this.fzzq2ResultMapper = fzzq2ResultMapper;
     }
 
@@ -38,6 +41,7 @@ public class FzzqCompetitionResultServiceService extends AbstractCompetitionResu
 
     @Override
     protected List<? extends CompetitionBaseResultDTO> getCompetitionResult() {
+        Integer competitionId = competitionConfig.getId();
         List<FzzqCompetitionResultDTO> competitionResultDTOList = fzzq2ResultMapper.getResult();
         if (CollUtil.isEmpty(competitionResultDTOList)) {
             return CollUtil.newArrayList();

+ 53 - 43
service-manage/src/main/java/com/simuwang/manage/task/CompetitionTask.java

@@ -7,10 +7,10 @@ import com.alibaba.excel.EasyExcel;
 import com.simuwang.base.common.conts.DateConst;
 import com.simuwang.base.common.util.EmailUtil;
 import com.simuwang.base.config.CompetitionConfig;
-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.MailboxInfoDTO;
+import com.simuwang.base.pojo.dto.competition.CompetitionBaseResultDTO;
 import com.simuwang.manage.service.EmailSystemConfigService;
 import com.simuwang.manage.service.competition.FundNavService;
 import org.slf4j.Logger;
@@ -21,6 +21,8 @@ import org.springframework.stereotype.Component;
 import java.io.File;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Component
 public class CompetitionTask {
@@ -40,71 +42,79 @@ public class CompetitionTask {
 
     /**
      * 输出基金净值采集结果明细任务
-     * 每周五 18:00 执行
+     * 每天10:00,15:00执行任务
      */
-    //@Scheduled(cron = "0 0 18 ? * 5")
+    @Scheduled(cron = "0/10 * * * * ?")
     public void fundNavDataTask() {
-        List<FundNavDataDTO> navDataDTOList = fundNavService.getFungNavData();
+        List<FundNavDataDTO> navDataDTOList = fundNavService.getFungNavData(competitionConfig.getId());
         if (CollUtil.isEmpty(navDataDTOList)) {
             return;
         }
-        String filePath = competitionConfig.getDirectory() + "基金净值采集结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
-        EasyExcel.write(filePath, FundNavDataDTO.class)
-                .sheet("基金净值采集结果明细")
-                .doWrite(navDataDTOList);
-        log.info("基金净值采集结果明细表格已输出 -> 文件:{}", filePath);
+        Map<String, List<FundNavDataDTO>> periodNavDataMap = navDataDTOList.stream().collect(Collectors.groupingBy(FundNavDataDTO::getPriod));
+        for (Map.Entry<String, List<FundNavDataDTO>> periodNavDataEntry : periodNavDataMap.entrySet()) {
+            String period = periodNavDataEntry.getKey();
+            List<FundNavDataDTO> fundNavDataDTOList = periodNavDataEntry.getValue();
+            String filePath = competitionConfig.getDirectory() + period + "_榜单_基金净值采集结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
+            EasyExcel.write(filePath, FundNavDataDTO.class)
+                    .sheet("基金净值采集结果明细")
+                    .doWrite(fundNavDataDTOList);
+            log.info("基金净值采集结果明细表格已输出 -> 文件:{}", filePath);
 
-        Integer method = competitionConfig.getMethod();
-        // 通过邮件发送"基金净值采集结果明细表格"
-        if (method == 1) {
-            MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
-            String receivingMailbox = emailSystemConfigService.getRecipientEmail();
-            try {
-                EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值采集结果明细", "", "基金净值采集结果明细");
-                log.info("基金净值采集结果明细表 -> 邮件已发送");
-            } catch (Exception e) {
-                log.error("邮件发送基金净值采集结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+            Integer method = competitionConfig.getMethod();
+            // 通过邮件发送"基金净值采集结果明细表格"
+            if (method == 2) {
+                MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
+                String receivingMailbox = emailSystemConfigService.getRecipientEmail();
+                try {
+                    EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值采集结果明细", "", period + "基金净值采集结果明细");
+                    log.info("基金净值采集结果明细表 -> 邮件已发送");
+                } catch (Exception e) {
+                    log.error("邮件发送基金净值采集结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+                }
             }
         }
     }
 
     /**
      * 输出基金净值缺失明细任务
-     * 每周五 18:00 执行
+     * 每天10:00,15:00执行任务
      */
-   // @Scheduled(cron = "0 0 18 ? * 5")
+    @Scheduled(cron = "0 0 10,15 * * ?")
     public void navDeletionTask() {
-        List<FundNavDeletionDTO> navDeletionDTOList = fundNavService.getFundNavDeletion();
-        String filePath = competitionConfig.getDirectory() + "基金净值缺失明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
-        EasyExcel.write(filePath, FundNavDeletionDTO.class)
-                .sheet("基金净值缺失明细")
-                .doWrite(navDeletionDTOList);
-        log.info("基金净值缺失明细表格已输出 -> 文件:{}", filePath);
-
-        Integer method = competitionConfig.getMethod();
-        // 通过邮件发送"基金净值采集结果明细表格"
-        if (method == 1) {
-            MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
-            String recipientEmail = emailSystemConfigService.getRecipientEmail();
-            try {
-                EmailUtil.senEmail(mailboxInfoDTO, recipientEmail, new File(filePath), "基金净值缺失明细", "", "基金净值缺失明细");
-                log.info("基金净值缺失明细表 -> 邮件已发送");
-            } catch (Exception e) {
-                log.error("邮件发送基金净值缺失明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+        List<FundNavDeletionDTO> navDeletionDTOList = fundNavService.getFundNavDeletion(competitionConfig.getId());
+        if (CollUtil.isEmpty(navDeletionDTOList)) {
+            return;
+        }
+        Map<String, List<FundNavDeletionDTO>> periodNavDeletionMap = navDeletionDTOList.stream().collect(Collectors.groupingBy(FundNavDeletionDTO::getPriod));
+        for (Map.Entry<String, List<FundNavDeletionDTO>> periodNavDeletionEntry : periodNavDeletionMap.entrySet()) {
+            String period = periodNavDeletionEntry.getKey();
+            List<FundNavDeletionDTO> fundNavDeletionDTOList = periodNavDeletionEntry.getValue();
+            String filePath = competitionConfig.getDirectory() + period + "_榜单_基金净值缺失明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
+            EasyExcel.write(filePath, FundNavDeletionDTO.class)
+                    .sheet("基金净值缺失明细")
+                    .doWrite(fundNavDeletionDTOList);
+            // 通过邮件发送"基金净值采集结果明细表格"
+            if (competitionConfig.getMethod() == 2) {
+                MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
+                String recipientEmail = emailSystemConfigService.getRecipientEmail();
+                try {
+                    EmailUtil.senEmail(mailboxInfoDTO, recipientEmail, new File(filePath), "基金净值缺失明细", "", period + "_榜单_基金净值缺失明细");
+                    log.info("基金净值缺失明细表 -> 邮件已发送");
+                } catch (Exception e) {
+                    log.error("邮件发送基金净值缺失明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
+                }
             }
         }
     }
 
-   // @Scheduled(cron = "0/10 * * * * ?")
+    @Scheduled(cron = "0 0 10,15 * * ?")
     public void competitionResultTask() {
-        Integer competitionId = competitionConfig.getId();
-        String competitionName = competitionConfig.getName();
-        List<? extends CompetitionBaseResultDTO> competitionResultDTOList = fundNavService.getCompetitionResult(competitionId);
+        List<? extends CompetitionBaseResultDTO> competitionResultDTOList = fundNavService.getCompetitionResult(competitionConfig.getId());
         if (CollUtil.isEmpty(competitionResultDTOList)) {
             return;
         }
         Class<? extends CompetitionBaseResultDTO> aClass = competitionResultDTOList.get(0).getClass();
-        String filePath = competitionConfig.getDirectory() + competitionName+ "_基金净值衍生指标及排名结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
+        String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_基金净值衍生指标及排名结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
         EasyExcel.write(filePath, aClass)
                 .sheet("基金净值衍生指标及排名结果明细")
                 .doWrite(competitionResultDTOList);