From efdfa6f00cfa7972daedd688c9bc664686d79705 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Sat, 29 Mar 2025 10:51:08 +0800 Subject: [PATCH] =?UTF-8?q?study-video-time=20=E6=9C=80=E5=90=8E=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=97=B6=E9=97=B4=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/school/study/api/StudyCourseTask.java | 17 ++++++++++++----- .../school/study/service/IStudyService.java | 3 ++- .../study/service/impl/StudyServiceImpl.java | 10 +++++++--- 3 files changed, 21 insertions(+), 9 deletions(-) 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..6a335430 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,11 +330,15 @@ 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时间格式 + // 20250303 优化 多次更新改一次更新 // 更新Redis中的最后活跃时间(带30秒过期) redisTemplate.opsForValue().set( "studyContentId:" + studyContentId + ":last_active", - String.valueOf(lastStudyTime), + value, Duration.ofSeconds(2592000) ); // Duration.ofDays(30) 也就是 2592000秒 @@ -342,7 +346,7 @@ public class StudyServiceImpl implements IStudyService{ @Override @Transactional - public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,String aid) { + public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,LocalDateTime timestamp) { // 更新最后的学习时间点 LocalDateTime now=LocalDateTime.now(); UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class); @@ -350,7 +354,7 @@ 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()); }