Sfoglia il codice sorgente

清除看课日志数据

wjj 2 settimane fa
parent
commit
3a87dad615

+ 18 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -2240,6 +2240,24 @@ public class Task {
         }
         }
     }
     }
 
 
+    //定时清除看课记录日志
+    public void cleanupWatchLog(){
+        logger.info("开始执行数据清理任务...");
+        try {
+            long oldDataCount = fsCourseWatchLogService.getOldDataCount();
+            logger.info("一个月前的数据量: {} 条", oldDataCount);
+
+            if (oldDataCount > 0) {
+                int deletedCount = fsCourseWatchLogService.deleteOldDataBatch();
+                logger.info("数据清理完成,共删除 {} 条数据", deletedCount);
+            } else {
+                logger.info("没有需要清理的数据");
+            }
+        } catch (Exception e) {
+            logger.error("数据清理任务执行失败", e);
+        }
+    }
+
     public void obtainSopInfoData() {
     public void obtainSopInfoData() {
         List<SopOrderLog> sopOrderLogs = sopOrderLogMapper.queryUnsentSOPData();
         List<SopOrderLog> sopOrderLogs = sopOrderLogMapper.queryUnsentSOPData();
         if (CollectionUtils.isEmpty(sopOrderLogs)) {
         if (CollectionUtils.isEmpty(sopOrderLogs)) {

+ 25 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -11,12 +11,14 @@ import com.fs.course.vo.*;
 import com.fs.im.dto.OpenImBatchResponseDataDTO;
 import com.fs.im.dto.OpenImBatchResponseDataDTO;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwExternalContact;
 import com.fs.sop.vo.QwRatingVO;
 import com.fs.sop.vo.QwRatingVO;
+import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Update;
 import org.apache.ibatis.annotations.Update;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
@@ -557,4 +559,27 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
      * 查询训练营看课人数
      * 查询训练营看课人数
      */
      */
     Integer getUserCountByCampId(@Param("trainingCampId") Long trainingCampId);
     Integer getUserCountByCampId(@Param("trainingCampId") Long trainingCampId);
+
+
+    @Select("SELECT log_id FROM fs_course_watch_log WHERE create_time < #{cutoffTime} LIMIT 1000")
+    List<Long> selectDelOldDataIds(@Param("cutoffTime") LocalDateTime cutoffTime);
+
+    /**
+     * 批量删除数据
+     */
+    @Delete({
+            "<script>",
+            "DELETE FROM fs_course_watch_log WHERE log_id IN ",
+            "<foreach collection='ids' item='id' open='(' separator=',' close=')'>",
+            "#{id}",
+            "</foreach>",
+            "</script>"
+    })
+    int batchDelLog(@Param("ids") List<Long> ids);
+
+    /**
+     * 统计一个月前的数据总量(可选)
+     */
+    @Select("SELECT COUNT(*) FROM fs_course_watch_log WHERE create_time < #{cutoffTime}")
+    long countOldData(@Param("cutoffTime") LocalDateTime cutoffTime);
 }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java

@@ -135,4 +135,8 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
     void scheduleBatchUpdateToDatabaseIsOpen();
     void scheduleBatchUpdateToDatabaseIsOpen();
 
 
     List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(FsCourseWatchLogListParam param);
     List<FsCourseWatchLogListVO> selectFsCourseWatchLogListVOexport(FsCourseWatchLogListParam param);
+
+    int deleteOldDataBatch();
+
+    long getOldDataCount();
 }
 }

+ 42 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.core.redis.RedisCache;
@@ -1136,4 +1137,45 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return list;
         return list;
     }
     }
 
 
+    @Transactional
+    @Override
+    public int deleteOldDataBatch() {
+        int totalDeleted = 0;
+        LocalDateTime cutoffTime = LocalDateTime.now().minusMonths(1);
+        while (true) {
+            // 1. 查询需要删除的数据ID(每次1000条)
+            List<Long> idsToDelete = baseMapper.selectDelOldDataIds(cutoffTime);
+
+            // 2. 如果没有数据可删除,则退出循环
+            if (CollectionUtils.isEmpty(idsToDelete)) {
+                break;
+            }
+
+            // 3. 执行批量删除
+            int deletedCount = baseMapper.batchDelLog(idsToDelete);
+            totalDeleted += deletedCount;
+
+            // 4. 如果删除的数量小于1000,说明已删除完毕
+            if (deletedCount < 1000) {
+                break;
+            }
+
+            // 5. 短暂休眠,避免对数据库造成过大压力
+            try {
+                Thread.sleep(5000);
+            } catch (InterruptedException e) {
+                Thread.currentThread().interrupt();
+                break;
+            }
+        }
+
+        return totalDeleted;
+    }
+
+    @Override
+    public long getOldDataCount() {
+        LocalDateTime cutoffTime = LocalDateTime.now().minusMonths(1);
+        return baseMapper.countOldData(cutoffTime);
+    }
+
 }
 }