Browse Source

fix: 缺失计算代码优化

chenjianhua 6 months ago
parent
commit
679c861fe2

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

@@ -37,7 +37,7 @@ public interface DeletionInfoMapper {
 
     List<FundDeletionInfoDO> selectFundDeletionInfoVOList(@Param("fundId") String fundId,@Param("deletionType") Integer deletionType);
 
-    DeletionInfoDO getDeletionInfoDO(DeletionInfoDO deletionInfoDO);
+    List<DeletionInfoDO> getDeletionInfoDO(@Param("fundId") String funId,@Param("deletionType")Integer code,@Param("list")List<String> tradeDateList);
 
     void saveDeletionInfoDO(DeletionInfoDO deletionInfoDO);
 
@@ -47,9 +47,15 @@ public interface DeletionInfoMapper {
 
     void updateSendStatusByFundId(@Param("fundIdList")List<String> fundIdList);
 
-    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("list")List<String> tradeDate);
 
     void deleteDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
 
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
+
+    void batchUpdateDeletionInfoDO(@Param("itemDoList") List<DeletionInfoDO> oldDeletionDOList);
+
+    void batchSaveDeletionInfoDO(@Param("itemDoList")List<DeletionInfoDO> insertDeletionInfoDO);
+
+    void batchUpdateRemark(@Param("itemDoList")List<DeletionInfoDO> batchUpdateDeletionInfoDO);
 }

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

@@ -21,6 +21,13 @@
         insert into PPW_EMAIL.deletion_info(fund_id,deletion_type,deletion_date,isvalid,createtime,updatetime,is_send)
         values (#{fundId},#{deletionType},#{deletionDate},#{isvalid},#{createTime},#{updateTime},#{isSend})
     </insert>
+    <insert id="batchSaveDeletionInfoDO">
+        insert into PPW_EMAIL.deletion_info(fund_id,deletion_type,deletion_date,isvalid,createtime,updatetime,is_send)
+        values
+        <foreach collection="itemDoList" item="itemDo" index="index" separator=",">
+            (#{itemDo.fundId},#{itemDo.deletionType},#{itemDo.deletionDate},#{itemDo.isvalid},#{itemDo.createTime},#{itemDo.updateTime},#{itemDo.isSend})
+        </foreach>
+    </insert>
     <update id="update" parameterType="com.simuwang.base.pojo.dos.FundDeletionInfoDO">
         update PPW_EMAIL.deletion_info set fund_id=#{fundId},deletion_type=#{deletionType},deletion_date=#{deletionDate},remark=#{remark},updatetime=#{updateTime}
         where id=#{id} and isvalid=1
@@ -53,9 +60,10 @@
     </update>
     <delete id="deleteDeletionRemark">
         update PPW_EMAIL.deletion_info  set isvalid=0,updatetime=sysdate() where isvalid=1 and fund_id=#{fundId} and deletion_type=#{deletionType}
-        <if test="tradeDate != null and tradeDate !=''">
-            and deletion_date=#{tradeDate}
-        </if>
+        and deletion_date in
+        <foreach item="tradeDate" collection="list" open="(" separator="," close=")">
+            #{tradeDate}
+        </foreach>
     </delete>
     <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
@@ -256,7 +264,10 @@
     <select id="getDeletionInfoDO" resultType="com.simuwang.base.pojo.dos.DeletionInfoDO"
             parameterType="com.simuwang.base.pojo.dos.DeletionInfoDO">
         select id,fund_id,deletion_type,deletion_date,remark,isvalid,creatorid,updaterid,createtime,updatetime
-        from PPW_EMAIL.deletion_info where fund_id=#{fundId} and deletion_date=#{deletionDate} and deletion_type=#{deletionType} limit 1
+        from PPW_EMAIL.deletion_info where fund_id=#{fundId} and deletion_type=#{deletionType} and deletion_date in
+        <foreach item="tradeDate" collection="list" open="(" separator="," close=")">
+            #{tradeDate}
+        </foreach>
     </select>
 
     <resultMap id="BaseEmailMap" type="com.simuwang.base.pojo.dos.EmailDeletionInfoDO">
@@ -290,5 +301,34 @@
     <update id="updateDeletionInfoDO">
         update PPW_EMAIL.deletion_info d set isvalid=1,updatetime=sysdate() where id=#{id}
     </update>
+    <update id="batchUpdateDeletionInfoDO">
+        <foreach collection="itemDoList" item="itemDo" index="index" open="" close="" separator=";">
+            update PPW_EMAIL.deletion_info
+            <set>
+                fund_id=#{itemDo.fundId},
+                deletion_type = #{itemDo.deletionType},
+                deletion_date=#{itemDo.deletionDate},
+                remark=#{itemDo.remark},
+                updatetime=sysdate(),
+                isvalid=#{itemDo.isvalid},
+                updaterid=#{itemDo.updaterId}
+            </set>
+            where id=#{itemDo.id}
+        </foreach>
+    </update>
+    <update id="batchUpdateRemark">
+        <foreach collection="itemDoList" item="itemDo" index="index" open="" close="" separator=";">
+            update PPW_EMAIL.deletion_info set remark=#{itemDo.remark},updaterid=#{itemDo.updaterId} where isvalid=1 and remark is null
+            <if test="itemDo.fundId != null and itemDo.fundId !=''">
+                and fund_id=#{itemDo.fundId}
+            </if>
+            <if test="itemDo.deletionType != null and itemDo.deletionType !=''">
+                and deletion_type=#{itemDo.deletionType}
+            </if>
+            <if test="itemDo.deletionDate != null and itemDo.deletionDate !=''">
+                and deletion_date=#{itemDo.deletionDate}
+            </if>
+        </foreach>
+    </update>
 
 </mapper>

+ 210 - 51
service-manage/src/main/java/com/simuwang/manage/service/impl/DeletionServiceImpl.java

@@ -172,6 +172,7 @@ public class DeletionServiceImpl implements DeletionService {
         }
         BigDecimal threshold = new BigDecimal(0.0035);
         BigDecimal preDifference = new BigDecimal(0);
+        List<String> tradeDateList = new ArrayList<>();
         for(int navIdx=0;navIdx < navDOList.size() ;navIdx++){
             NavDO navDO = navDOList.get(navIdx);
             //获取当前净值日期下的分红总和
@@ -196,21 +197,24 @@ public class DeletionServiceImpl implements DeletionService {
                     }
                     tradeDate = DateUtils.format(navDOList.get(navIdx-1).getPriceDate(),DateUtils.YYYY_MM_DD)+"~"+DateUtils.format(navDO.getPriceDate(),DateUtils.YYYY_MM_DD);
                 }
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.DISTRIBUTION_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
             preDifference = difference;
         }
+        saveDeletionInfoDO(fundId,tradeDateList,DeletionType.DISTRIBUTION_DELETION.getCode());
     }
 
     private void assetDeletion(String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
         deletionInfoMapper.deleteDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
+        List<String> tradeDateList = new ArrayList<>();
         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<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
+            List<String> updateTradeDateList = new ArrayList<>();
             for(String tradeDate : tradeListMap.keySet()){
                 if(navListMap.containsKey(tradeDate)){
-                    deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    updateTradeDateList.add(tradeDate);
                     continue;
                 }
                 if(tradeDateDOList.size() <= 3){
@@ -220,9 +224,22 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            if(updateTradeDateList.size() > 0){
+                List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                for(String tradeDate : updateTradeDateList){
+                    DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                    deletionInfoDO.setFundId(fundId);
+                    deletionInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
+                    deletionInfoDO.setDeletionDate(tradeDate);
+                    deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                    batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                }
+                deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
+            }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.ASSET_DELETION.getCode());
         }
         if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
             Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -244,18 +261,33 @@ public class DeletionServiceImpl implements DeletionService {
             for(Integer weekOfYear : tradeListMap.keySet()){
                 List<AssetDO> assetDOS = weekNavListMap.get(weekOfYear);
                 if(weekNavListMap.containsKey(weekOfYear)){
+                    List<String> updateTradeDateList = new ArrayList<>();
                     for(TradeDateDO tradeDateDO : tradeListMap.get(weekOfYear)){
                         String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
-                        deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                        updateTradeDateList.add(tradeDate);
+                    }
+                    if(updateTradeDateList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : updateTradeDateList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     if(StringUtil.isNotEmpty(assetDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(int idx=0;idx < assetDOS.size()-1 ; idx++){
                             AssetDO assetDO = assetDOS.get(idx);
                             String tradeDate = DateUtils.format(assetDO.getPriceDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.ASSET_DELETION.getCode(),deleteTradeDateList);
                     }
 
                 }
@@ -273,9 +305,10 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.ASSET_DELETION.getCode());
         }
         if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
             Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -302,18 +335,33 @@ public class DeletionServiceImpl implements DeletionService {
                 }
                 List<AssetDO> assetDOS = monthNavListMap.get(yearMonth);
                 if(monthNavListMap.containsKey(yearMonth)){
+                    List<String> updateTradeDateList = new ArrayList<>();
                     for(TradeDateDO tradeDateDO : tradeListMap.get(yearMonth)){
                         String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
-                        deletionInfoMapper.updateRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                        updateTradeDateList.add(tradeDate);
+                    }
+                    if(updateTradeDateList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : updateTradeDateList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     if(StringUtil.isNotEmpty(assetDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(int idx=0;idx < assetDOS.size()-1 ; idx++){
                             AssetDO assetDO = assetDOS.get(idx);
                             String tradeDate = DateUtils.format(assetDO.getPriceDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.ASSET_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.ASSET_DELETION.getCode(),deleteTradeDateList);
                     }
 
                 }
@@ -330,22 +378,25 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.ASSET_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.ASSET_DELETION.getCode());
         }
     }
 
     private void navDeletion(String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
         deletionInfoMapper.deleteDeletion(fundId,DeletionType.NAV_DELETION.getCode());
+        List<String> tradeDateList = new ArrayList<>();
         //只处理日月季频率
         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<TradeDateDO>> tradeListMap = tradeDateDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getTradeDate(),DateUtils.YYYY_MM_DD)));
+            List<String> updateTradeDateList = new ArrayList<>();
             for(String tradeDate : tradeListMap.keySet()){
                 if(navListMap.containsKey(tradeDate)){
-                    deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    updateTradeDateList.add(tradeDate);
                     continue;
                 }
                 if(tradeDateDOList.size() <= 3){
@@ -355,9 +406,22 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+                tradeDateList.add(tradeDate);
+            }
+            if(updateTradeDateList.size() > 0){
+                List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                for(String tradeDate : updateTradeDateList){
+                    DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                    deletionInfoDO.setFundId(fundId);
+                    deletionInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
+                    deletionInfoDO.setDeletionDate(tradeDate);
+                    deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                    batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                }
+                deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.NAV_DELETION.getCode());
         }
         if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
             Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -379,19 +443,34 @@ public class DeletionServiceImpl implements DeletionService {
             for(Integer weekOfYear : tradeListMap.keySet()){
                 List<NavDO> navDOS = weekNavListMap.get(weekOfYear);
                 if(weekNavListMap.containsKey(weekOfYear)){
+                    List<String> deleteTradeDateList = new ArrayList<>();
                     for(TradeDateDO tradeDateDO : tradeListMap.get(weekOfYear)){
                         String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
-                        deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                        deleteTradeDateList.add(tradeDate);
+                    }
+                    if(deleteTradeDateList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : deleteTradeDateList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
                     if(StringUtil.isNotEmpty(navDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(int idx=0;idx < navDOS.size()-1 ; idx++){
                             NavDO navDO = navDOS.get(idx);
                             String tradeDate = DateUtils.format(navDO.getPriceDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.NAV_DELETION.getCode(),deleteTradeDateList);
                     }
                 }
                 //不包含的话,默认取每周的最后一个交易日作为周净值日期
@@ -407,9 +486,10 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.NAV_DELETION.getCode());
         }
         if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
             Map<String,List<NavDO>> navListMap = navDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -436,18 +516,33 @@ public class DeletionServiceImpl implements DeletionService {
                 }
                 List<NavDO> navDOS = monthNavListMap.get(yearMonth);
                 if(monthNavListMap.containsKey(yearMonth)){
+                    List<String> batchUpdateTradeList = new ArrayList<>();
                     for(TradeDateDO tradeDateDO : tradeListMap.get(yearMonth)){
                         String tradeDate = DateUtils.format(tradeDateDO.getTradeDate(),DateUtils.YYYY_MM_DD);
-                        deletionInfoMapper.updateRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                        batchUpdateTradeList.add(tradeDate);
+                    }
+                    if(batchUpdateTradeList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : batchUpdateTradeList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
                     if(StringUtil.isNotEmpty(navDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(NavDO navDO : navDOS){
                             String tradeDate = DateUtils.format(navDO.getPriceDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.NAV_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.NAV_DELETION.getCode(),deleteTradeDateList);
                     }
 
                 }
@@ -464,22 +559,25 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.NAV_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.NAV_DELETION.getCode());
         }
     }
 
     private void valuationDeletion(String fundId,List<FundPositionDetailDO> fundPositionDetailDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
         deletionInfoMapper.deleteDeletion(fundId,DeletionType.VALUATION_DELETION.getCode());
+        List<String> tradeDateList = new ArrayList<>();
         //只处理日月季频率
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
             Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.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)));
+            List<String> batchUpdateTrade = new ArrayList<>();
             for(String tradeDate : tradeListMap.keySet()){
                 if(valuationListMap.containsKey(tradeDate)){
-                    deletionInfoMapper.updateRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate,DeletionType.NO_DELETION.getInfo(),null);
+                    batchUpdateTrade.add(tradeDate);
                     continue;
                 }
                 if(tradeDateDOList.size() <= 3){
@@ -489,9 +587,22 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+                tradeDateList.add(tradeDate);
+            }
+            if(batchUpdateTrade.size() > 0){
+                List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                for(String tradeDate : batchUpdateTrade){
+                    DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                    deletionInfoDO.setFundId(fundId);
+                    deletionInfoDO.setDeletionType(DeletionType.VALUATION_DELETION.getCode());
+                    deletionInfoDO.setDeletionDate(tradeDate);
+                    deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                    batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                }
+                deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.VALUATION_DELETION.getCode());
         }
         if(Frequency.WEEK == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
             Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
@@ -513,19 +624,34 @@ public class DeletionServiceImpl implements DeletionService {
             for(Integer weekOfYear : tradeListMap.keySet()){
                 List<FundPositionDetailDO> valuationDOS = weekNavListMap.get(weekOfYear);
                 if(weekNavListMap.containsKey(weekOfYear)){
+                    List<String> batchUpdateTradeList = new ArrayList<>();
                     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);
+                        batchUpdateTradeList.add(tradeDate);
+                    }
+                    if(batchUpdateTradeList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : batchUpdateTradeList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.VALUATION_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
                     if(StringUtil.isNotEmpty(valuationDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(int idx=0;idx < valuationDOS.size()-1 ; idx++){
                             FundPositionDetailDO valautionDO = valuationDOS.get(idx);
                             String tradeDate = DateUtils.format(valautionDO.getValuationDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),deleteTradeDateList);
                     }
                 }
                 //不包含的话,默认取每周的最后一个交易日作为周净值日期
@@ -541,9 +667,10 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.VALUATION_DELETION.getCode());
         }
         if(Frequency.MONTH == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){
             Map<String,List<FundPositionDetailDO>> valuationListMap = fundPositionDetailDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getValuationDate(),DateUtils.YYYY_MM_DD)));
@@ -570,18 +697,33 @@ public class DeletionServiceImpl implements DeletionService {
                 }
                 List<FundPositionDetailDO> fundPositionDetailDOS = monthNavListMap.get(yearMonth);
                 if(monthNavListMap.containsKey(yearMonth)){
+                    List<String> batchUpdateTradeList = new ArrayList<>();
                     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);
+                        batchUpdateTradeList.add(tradeDate);
+                    }
+                    if(batchUpdateTradeList.size() > 0){
+                        List<DeletionInfoDO> batchUpdateDeletionInfoDO = new ArrayList<>();
+                        for(String tradeDate : batchUpdateTradeList){
+                            DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                            deletionInfoDO.setFundId(fundId);
+                            deletionInfoDO.setDeletionType(DeletionType.VALUATION_DELETION.getCode());
+                            deletionInfoDO.setDeletionDate(tradeDate);
+                            deletionInfoDO.setRemark(DeletionType.NO_DELETION.getInfo());
+                            batchUpdateDeletionInfoDO.add(deletionInfoDO);
+                        }
+                        deletionInfoMapper.batchUpdateRemark(batchUpdateDeletionInfoDO);
                     }
                     continue;
                 }else{
                     //防止频率变更导致数据异常,需要把当前日期下所在的频率全部无效掉
                     if(StringUtil.isNotEmpty(fundPositionDetailDOS)){
+                        List<String> deleteTradeDateList = new ArrayList<>();
                         for(FundPositionDetailDO fundPositionDetailDO : fundPositionDetailDOS){
                             String tradeDate = DateUtils.format(fundPositionDetailDO.getValuationDate(),DateUtils.YYYY_MM_DD);
-                            deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),tradeDate);
+                            deleteTradeDateList.add(tradeDate);
                         }
+                        deletionInfoMapper.deleteDeletionRemark(fundId,DeletionType.VALUATION_DELETION.getCode(),deleteTradeDateList);
                     }
 
                 }
@@ -598,31 +740,48 @@ public class DeletionServiceImpl implements DeletionService {
                 if(tradeDateDO.getTradeDate().compareTo(DateUtils.parse(tradeDate,DateUtils.YYYY_MM_DD)) < 0){
                     continue;
                 }
-                //写入缺失信息表
-                saveDeletionInfoDO(fundId,tradeDate,DeletionType.VALUATION_DELETION.getCode());
+                tradeDateList.add(tradeDate);
             }
+            //写入缺失信息表
+            saveDeletionInfoDO(fundId,tradeDateList,DeletionType.VALUATION_DELETION.getCode());
         }
     }
 
-    private void saveDeletionInfoDO(String fundId, String tradeDate, Integer code) {
-        if(tradeDate == null){
+    private void saveDeletionInfoDO(String fundId, List<String> tradeDateList, Integer code) {
+        if(tradeDateList.size() < 1){
             return;
         }
-        DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
-        deletionInfoDO.setFundId(fundId);
-        deletionInfoDO.setDeletionDate(tradeDate);
-        deletionInfoDO.setDeletionType(code);
-        DeletionInfoDO oldDeletionDO = deletionInfoMapper.getDeletionInfoDO(deletionInfoDO);
-        if(StringUtil.isNull(oldDeletionDO)){
-            deletionInfoDO.setIsvalid(1);
-            deletionInfoDO.setIsSend(0);
-            deletionInfoDO.setUpdateTime(DateUtils.getNowDate());
-            deletionInfoDO.setCreateTime(DateUtils.getNowDate());
-            deletionInfoMapper.saveDeletionInfoDO(deletionInfoDO);
-        }else{
-            oldDeletionDO.setIsvalid(1);
-            oldDeletionDO.setUpdateTime(DateUtils.getNowDate());
-            deletionInfoMapper.updateDeletionInfoDO(oldDeletionDO);
+        List<DeletionInfoDO> oldDeletionDOList = deletionInfoMapper.getDeletionInfoDO(fundId,code,tradeDateList);
+        if(oldDeletionDOList != null && oldDeletionDOList.size() > 0){
+            for(DeletionInfoDO oldDeletionDO : oldDeletionDOList){
+                oldDeletionDO.setIsvalid(1);
+                oldDeletionDO.setUpdateTime(DateUtils.getNowDate());
+            }
+            deletionInfoMapper.batchUpdateDeletionInfoDO(oldDeletionDOList);
+        }
+
+        List<String> oldTradeDateList = oldDeletionDOList.stream().map(e -> e.getDeletionDate()).collect(Collectors.toList());
+        List<String> insertTradeDateList = new ArrayList<>();
+        for(String tradeDate : tradeDateList){
+            if(oldTradeDateList.contains(tradeDate)){
+                continue;
+            }
+            insertTradeDateList.add(tradeDate);
+        }
+        if(insertTradeDateList.size() > 0){
+            List<DeletionInfoDO> insertDeletionInfoDO = new ArrayList<>();
+            for(String tradeDate : insertTradeDateList){
+                DeletionInfoDO deletionInfoDO = new DeletionInfoDO();
+                deletionInfoDO.setFundId(fundId);
+                deletionInfoDO.setDeletionType(code);
+                deletionInfoDO.setDeletionDate(tradeDate);
+                deletionInfoDO.setIsvalid(1);
+                deletionInfoDO.setIsSend(0);
+                deletionInfoDO.setUpdateTime(DateUtils.getNowDate());
+                deletionInfoDO.setCreateTime(DateUtils.getNowDate());
+                insertDeletionInfoDO.add(deletionInfoDO);
+            }
+            deletionInfoMapper.batchSaveDeletionInfoDO(insertDeletionInfoDO);
         }
     }
 }