diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java index 5a344186..9236c855 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java @@ -10,6 +10,8 @@ import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -33,7 +35,7 @@ public class StudyCourseTask { public void saveStudyCourseItemLastTime() { // 1. 定义匹配模式(匹配所有目标key) final String KEY_PATTERN = "studyContentId:*:last_active"; - + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); // 2. 使用SCAN安全遍历(避免阻塞) ScanOptions options = ScanOptions.scanOptions() .match(KEY_PATTERN) @@ -59,12 +61,17 @@ public class StudyCourseTask { String studyContentId = parts[1]; // 7. 获取存储的时间点(示例逻辑) - String lastStudyTimeStr = redisTemplate.opsForValue().get(redisKey); - if (lastStudyTimeStr == null) continue; - int lastStudyTime = Integer.parseInt(lastStudyTimeStr); + String redisValue = redisTemplate.opsForValue().get(redisKey); + if (redisValue == null) continue; + String[] partValues = redisValue.split("&"); + int lastStudyTime = Integer.parseInt(partValues[0]); + LocalDateTime timestamp = null; + if (partValues.length >= 2){ + timestamp = LocalDateTime.parse(partValues[1], formatter); + } // 8. 更新数据库(调用已有服务方法) - studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, "system_job"); + studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, timestamp); // 9. 删除Redis键(原子操作) redisTemplate.delete(redisKey); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java index 043e7efa..5dcce229 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java @@ -1,5 +1,6 @@ package com.xboe.school.study.service; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -99,5 +100,5 @@ public interface IStudyService { List getList(String courseId, String contentId, String name, Integer status); - void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, String systemJob); + void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, LocalDateTime timestamp); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index 3abe0b9d..39aadb6b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -330,19 +330,25 @@ public class StudyServiceImpl implements IStudyService{ // 更新 前端传输已学习时长 @Override public void updateLastTime(String studyContentId, int lastStudyTime,String aid) { + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + String value = lastStudyTime + "&" + now.format(formatter); // 使用ISO8601时间格式 + log.info("-study-video-time-----value = " + value); // 20250303 优化 多次更新改一次更新 // 更新Redis中的最后活跃时间(带30秒过期) redisTemplate.opsForValue().set( "studyContentId:" + studyContentId + ":last_active", - String.valueOf(lastStudyTime), + value, Duration.ofSeconds(2592000) ); + log.info("-study-video-time-redis保存---value = " + value); // Duration.ofDays(30) 也就是 2592000秒 } @Override @Transactional - public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,String aid) { + public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,LocalDateTime timestamp) { + log.info("-study-video-time-定时---studyContentId = " + studyContentId + ",lastStudyTime = " + lastStudyTime + ", timestamp = " + timestamp); // 更新最后的学习时间点 LocalDateTime now=LocalDateTime.now(); UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class); @@ -350,8 +356,9 @@ public class StudyServiceImpl implements IStudyService{ //只记录时间长的时候的处理 update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime)); update.addUpdateField("lastStudyTime", lastStudyTime); - update.addUpdateField("lastTime", now); + update.addUpdateField("lastTime", timestamp==null ? now : timestamp); scItemDao.update(update.builder()); + log.info("-study-video-time-mysql保存---studyContentId = " + studyContentId); } @Override