From 50bdc39ce8fc5ecd760592092bc4d978d320f5bb Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 14 Apr 2025 14:08:01 +0800 Subject: [PATCH 01/15] =?UTF-8?q?appendtime=20=E4=BA=8E=20study-video-time?= =?UTF-8?q?=20=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/school/study/api/StudyCourseApi.java | 58 ++++++++++++++- .../school/study/api/StudyCourseTask.java | 68 ++++++++++++++++-- .../school/study/service/IStudyService.java | 4 ++ .../study/service/impl/StudyServiceImpl.java | 70 ++++++++++++++----- .../java/com/xboe/school/vo/StudyTimeVo.java | 19 +++++ 5 files changed, 196 insertions(+), 23 deletions(-) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/vo/StudyTimeVo.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 9f041064..1a5a1080 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -15,6 +15,7 @@ import com.xboe.constants.CacheName; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.service.IUserGroupService; import com.xboe.school.study.dao.StudyCourseDao; +import com.xboe.school.vo.StudyTimeVo; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -625,7 +626,7 @@ public class StudyCourseApi extends ApiBaseController{ @Deprecated @RequestMapping(value="/appendtime",method = {RequestMethod.GET,RequestMethod.POST}) public JsonResponse appendTime(StudyTime studyTime, HttpServletRequest request){ - + if(StringUtils.isBlank(studyTime.getStudyId())){ return error("参数错误"); } @@ -655,6 +656,61 @@ public class StudyCourseApi extends ApiBaseController{ return error("记录学习时长错误",e.getMessage()); } } + + /** + * appendtime 于 study-video-time 合并 + * */ + @RequestMapping(value="/updateStudyVideoTime",method = {RequestMethod.GET,RequestMethod.POST}) + public JsonResponse updateStudyVideoTime(StudyTimeVo studyTime, HttpServletRequest request){ + + // 0 study-video-time , 1 appendtime + if (studyTime.getType() == 0){ + if(StringUtils.isBlank(studyTime.getItemId())){ + return error("参数错误"); + } + if(studyTime.getVideoTime()==null){ + return error("无时间点"); + } + //检查是否已存在 + try { + studyService.updateLastTime(studyTime.getItemId(),studyTime.getVideoTime(), getCurrent().getAccountId()); + if (studyTime.getContentId() != null && studyTime.getCourseId() != null && studyTime.getProgressVideo() != null){ + contentService.updateProcessVideo(studyTime.getContentId(), studyTime.getCourseId(), studyTime.getProgressVideo()); + } + return success("true"); + }catch(Exception e) { + log.error("updateStudyVideoTime type =0 记录最后学习时间错误",e); + return error("updateStudyVideoTime type =0 记录最后学习时间失败 ",e.getMessage()); + } + }else if(studyTime.getType() == 1){ + if(StringUtils.isBlank(studyTime.getStudyId())){ + return error("参数错误"); + } + if(StringUtils.isBlank(studyTime.getCourseId())){ + return error("未指定课程"); + } + if(StringUtils.isBlank(studyTime.getContentId())){ + return error("未指定资源内容"); + } + + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + try { + studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getDuration(),studyTime.getCourseId()); + List allUserList = thirdApi.getStudyCourseList(studyTime.getStudyId() ,studyTime.getCourseId(), token); + log.info("updateStudyVideoTime type =1 在线课学习记录 = " + allUserList); + return success(studyTime.getId()); + }catch(Exception e) { + log.error("updateStudyVideoTime type =1 记录学习时长错误",e); + return error("updateStudyVideoTime type =1 记录学习时长错误 ",e.getMessage()); + } + }else{ + return error("type不能为空"); + } + } + /**获取最后一次的学习内容*/ @GetMapping("/last-study") 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 9236c855..a5b8d8c0 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 @@ -1,5 +1,7 @@ package com.xboe.school.study.api; +import com.xboe.api.ThirdApi; +import com.xboe.school.study.entity.StudyCourse; import com.xboe.school.study.service.IStudyService; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; @@ -10,8 +12,10 @@ import org.springframework.data.redis.core.ScanOptions; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -26,6 +30,8 @@ public class StudyCourseTask { private final IStudyService studyService; private final StringRedisTemplate redisTemplate; + @Resource + private ThirdApi thirdApi; /** * 定时任务 @@ -59,7 +65,6 @@ public class StudyCourseTask { String[] parts = redisKey.split(":"); if (parts.length < 2) continue; String studyContentId = parts[1]; - // 7. 获取存储的时间点(示例逻辑) String redisValue = redisTemplate.opsForValue().get(redisKey); if (redisValue == null) continue; @@ -69,19 +74,15 @@ public class StudyCourseTask { if (partValues.length >= 2){ timestamp = LocalDateTime.parse(partValues[1], formatter); } - // 8. 更新数据库(调用已有服务方法) studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, timestamp); - // 9. 删除Redis键(原子操作) redisTemplate.delete(redisKey); - log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, lastStudyTime); } catch (Exception e) { log.error("处理失败 key: {}", redisKey, e); } } - } cursor.close(); } catch (Exception e) { @@ -101,6 +102,63 @@ public class StudyCourseTask { } + public void saveStudyCourseItemLastTime1() { + // 1. 定义匹配模式(匹配所有目标key) + final String KEY_PATTERN = "studyId:*:courseId:*:courseContentId:*"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + // 2. 使用SCAN安全遍历(避免阻塞) + ScanOptions options = ScanOptions.scanOptions() + .match(KEY_PATTERN) + .count(100) // 分页大小 + .build(); + try (RedisConnection connection = Objects.requireNonNull(redisTemplate.getConnectionFactory()).getConnection()) { + Cursor cursor = connection.scan(options); + // 3. 遍历处理符合条件的key + while (cursor.hasNext()) { + String redisKey = new String(cursor.next()); + // 4. 获取剩余TTL(秒) + Long ttl = redisTemplate.getExpire(redisKey, TimeUnit.SECONDS); + + // 5. 过滤条件:剩余时间 >= 29天23小时30分钟(转换为秒) + // 总需时间 = (30天 - 30分钟) = 29天23小时30分钟 = 2590200秒 + // 5分钟 300秒 || 2592000 - 300 = 2591700 + if (ttl <= 2590200) { + try { + // 6. 提取studyContentId + String[] parts = redisKey.split(":"); + if (parts.length < 6) continue; + String studyId = parts[1]; + String courseId = parts[3]; + String courseContentId = parts[5]; + // 7. 获取存储的时间点(示例逻辑) + String redisValue = redisTemplate.opsForValue().get(redisKey); + if (redisValue == null) continue; + String[] partValues = redisValue.split("&"); + int duration = Integer.parseInt(partValues[0]); + LocalDateTime timestamp = null; + if (partValues.length >= 2){ + timestamp = LocalDateTime.parse(partValues[1], formatter); + } + // 8. 更新数据库(调用已有服务方法) + studyService.newAppendStudyDuration(studyId,null,courseContentId,duration,timestamp); + + List allUserList = thirdApi.getStudyCourseList(studyId , courseId, null); + log.info("处理成功 allUserList: {}", allUserList); + // 9. 删除Redis键(原子操作) + redisTemplate.delete(redisKey); + log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, duration); + } catch (Exception e) { + log.error("处理失败 key: {}", redisKey, e); + } + } + } + cursor.close(); + } catch (Exception e) { + log.error("定时任务执行异常", e); + } + + + } } 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 cc4a66e4..340865e0 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 @@ -101,4 +101,8 @@ public interface IStudyService { List getList(String courseId, String contentId, String name, Integer status); void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, LocalDateTime timestamp); + + void updateStudyDuration(String studyId,String studyItemId, String contentId, Integer duration,String courseId); + + void newAppendStudyDuration(String studyId, String studyItemId, String courseContentId, int duration, 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 589547d3..797b31a2 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 @@ -116,34 +116,69 @@ public class StudyServiceImpl implements IStudyService{ //增加内容的学习时长 if(StringUtils.isNotBlank(studyItemId)) { //直接根据id更新 -// String hql="Update StudyCourseItem set studyDuration=studyDuration+"+duration+",status=(case when status<2 then 2 else status end) where id=?1"; -// scItemDao.update(hql,studyItemId); String sql="Update boe_study_course_item set study_duration=study_duration+"+duration+",status=(case when status<2 then 2 else status end) where id=?1"; scItemDao.sqlUpdate(sql,studyItemId); - //scItemDao.updateMultiFieldById(studyItemId, UpdateBuilder.create("studyDuration", "studyDuration+"+duration,FieldUpdateType.EXPRESSION)); - + }else { - //根据学习id和课程内容id更新 -// scItemDao.update(UpdateBuilder.from(StudyCourseItem.class) -// .addUpdateField("studyDuration", "studyDuration+"+duration,FieldUpdateType.EXPRESSION) -// .addFilter(FieldFilters.eq("studyId", studyId)) -// .addFilter(FieldFilters.eq("contentId", courseContentId)) -// .builder()); -// -// String hql="Update StudyCourseItem set studyDuration=studyDuration+"+duration+",status=(case when status<2 then 2 else status end) where studyId=?1 and contentId=?2"; -// scItemDao.update(hql,studyId,courseContentId); String sql="Update boe_study_course_item set study_duration=study_duration+"+duration+",status=(case when status<2 then 2 else status end) where study_id=?1 and content_id=?2"; scItemDao.sqlUpdate(sql,studyId,courseContentId); } - //追加课程的学习时长 - //scDao.updateMultiFieldById(studyId, UpdateBuilder.create("totalDuration", "totalDuration+"+duration,FieldUpdateType.EXPRESSION)); - String sql="Update boe_study_course set total_duration=total_duration+"+duration+",status=(case when status<2 then 2 else status end),progress=(case when progress=0 then 1 else progress end),last_time = '"+LocalDateTime.now()+"' where id=?1"; scDao.sqlUpdate(sql,studyId); - } + @Override + @Transactional + public void newAppendStudyDuration(String studyId,String studyItemId,String courseContentId, int duration,LocalDateTime timestamp) { + + //增加内容的学习时长 + if(StringUtils.isNotBlank(studyItemId)) { + //直接根据id更新 + String sql="Update boe_study_course_item set study_duration=study_duration+"+duration+",status=(case when status<2 then 2 else status end) where id=?1"; + scItemDao.sqlUpdate(sql,studyItemId); + + }else { + String sql="Update boe_study_course_item set study_duration=study_duration+"+duration+",status=(case when status<2 then 2 else status end) where study_id=?1 and content_id=?2"; + scItemDao.sqlUpdate(sql,studyId,courseContentId); + } + + String sql="Update boe_study_course set total_duration=total_duration+"+duration+",status=(case when status<2 then 2 else status end),progress=(case when progress=0 then 1 else progress end),last_time = '"+timestamp+"' where id=?1"; + scDao.sqlUpdate(sql,studyId); + } + + // 更新 前端传输已学习时长 + @Override + public void updateStudyDuration(String studyId,String studyItemId,String courseContentId, Integer duration,String courseId) { + + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + + String key = "studyId:" + studyId + ":courseId:" + courseId + ":courseContentId:" + courseContentId; + String currentValue = redisTemplate.opsForValue().get(key); + int lastDuration = 0; + int sum = duration; + if (currentValue != null) { + String[] partValues = currentValue.split("&"); + lastDuration = Integer.parseInt(partValues[0]); + sum += lastDuration; + }; + + String value = sum + "&" + now.format(formatter); // 使用ISO8601时间格式 + log.info("-study-video-time-----value = " + value); + + // 20250303 优化 多次更新改一次更新 + // 更新Redis中的最后活跃时间(带30秒过期) + redisTemplate.opsForValue().set( + key, + value, + Duration.ofSeconds(2592000) + ); + log.info("- 合并 updateStudyDuration -redis保存---value = " + value); +// Duration.ofDays(30) 也就是 2592000秒 + } + + @Override @Transactional public void appendStudyDuration(StudyTime st) { @@ -357,6 +392,7 @@ public class StudyServiceImpl implements IStudyService{ log.info("-study-video-time-mysql保存---studyContentId = " + studyContentId); } + @Override public Map getLast(String aid) { //按lastTime排序,第一条,只是课件内容 diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/vo/StudyTimeVo.java b/servers/boe-server-all/src/main/java/com/xboe/school/vo/StudyTimeVo.java new file mode 100644 index 00000000..388c10d7 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/school/vo/StudyTimeVo.java @@ -0,0 +1,19 @@ +package com.xboe.school.vo; + +import com.xboe.school.study.entity.StudyTime; +import lombok.Data; + +/** appendtime 于 study-video-time 合并 + * appendtime 参数 StudyTime + * study-video-time 参数 是 StudyTimeVo + */ +@Data +public class StudyTimeVo extends StudyTime { + + private String itemId; + private Integer videoTime; +// private String contentId; // 已继承 +// private String courseId; // 已继承 + private Float progressVideo; + private Integer type; // 0 study-video-time , 1 appendtime +} From 1aca002b8fdf8f719a69cd9b0d06226a76a4c6d9 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 14 Apr 2025 16:10:18 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/study/api/StudyCourseTask.java | 91 ++++++++++++++++++- 1 file changed, 89 insertions(+), 2 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 a5b8d8c0..9b8de218 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 @@ -18,6 +18,7 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; /** * @author by lyc @@ -37,8 +38,8 @@ public class StudyCourseTask { * 定时任务 * 获取redis 中学习结束的数据更新入库 * */ - @XxlJob("saveStudyCourseItemLastTime") - public void saveStudyCourseItemLastTime() { + @XxlJob("saveStudyCourseItemLastTime2") + public void saveStudyCourseItemLastTime2() { // 1. 定义匹配模式(匹配所有目标key) final String KEY_PATTERN = "studyContentId:*:last_active"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); @@ -161,4 +162,90 @@ public class StudyCourseTask { } + + @XxlJob("saveStudyCourseItemLastTime") + public void saveStudyCourseItemLastTime() { + // 定义需要处理的键模式集合 + processKeys("studyContentId:*:last_active", this::handleLastActiveKey); + processKeys("studyId:*:courseId:*:courseContentId:*", this::handleDurationKey); + } + + private void processKeys(String keyPattern, BiConsumer keyHandler) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + ScanOptions options = ScanOptions.scanOptions() + .match(keyPattern) + .count(100) + .build(); + + try (RedisConnection connection = Objects.requireNonNull(redisTemplate.getConnectionFactory()).getConnection()) { + Cursor cursor = connection.scan(options); + while (cursor.hasNext()) { + String redisKey = new String(cursor.next()); + Long ttl = redisTemplate.getExpire(redisKey, TimeUnit.SECONDS); + + if (ttl != null && ttl <= 2590200) { + try { + String redisValue = redisTemplate.opsForValue().get(redisKey); + if (redisValue != null) { + // 调用对应的处理方法 + keyHandler.accept(redisKey, redisValue); + } + redisTemplate.delete(redisKey); + log.info("Key processed: {}", redisKey); + } catch (Exception e) { + log.error("Process failed [{}]", redisKey, e); + } + } + } + cursor.close(); + } catch (Exception e) { + log.error("Key processing error: {}", keyPattern, e); + } + } + + // 处理 last_active 类型键 + private void handleLastActiveKey(String redisKey, String redisValue) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); + String[] parts = redisKey.split(":"); + String studyContentId = parts[1]; + + String[] values = redisValue.split("&"); + int lastStudyTime = Integer.parseInt(values[0]); + LocalDateTime timestamp = values.length >= 2 ? + LocalDateTime.parse(values[1], formatter) : null; + + studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, timestamp); + } + + // 处理 duration 类型键 + private void handleDurationKey(String redisKey, String redisValue) { + String[] parts = redisKey.split(":"); + String studyId = parts[1]; + String courseId = parts[3]; + String courseContentId = parts[5]; + + String[] values = redisValue.split("&"); + int duration = Integer.parseInt(values[0]); + LocalDateTime timestamp = values.length >= 2 ? + LocalDateTime.parse(values[1], DateTimeFormatter.ISO_LOCAL_DATE_TIME) : null; + + studyService.newAppendStudyDuration(studyId, null, courseContentId, duration, timestamp); + + // 保留第三方调用 + List allUserList = thirdApi.getStudyCourseList(studyId, courseId, null); + log.info("Study records synced: {}", allUserList.size()); + } + + + + + + + + + + + + + } From 95312696f6e66c1f420b8daca2d9d910732bb6c4 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 17 Apr 2025 13:36:30 +0800 Subject: [PATCH 03/15] =?UTF-8?q?studyindex=E7=BC=93=E5=AD=98=E8=8E=B7?= =?UTF-8?q?=E5=8F=96duration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/study/service/impl/StudyServiceImpl.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 797b31a2..7898fe57 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 @@ -201,7 +201,17 @@ public class StudyServiceImpl implements IStudyService{ @Override public List findByStudyId(String studyId) { - return scItemDao.findList(OrderCondition.desc("lastTime"),FieldFilters.eq("studyId", studyId)); + List list = scItemDao.findList(OrderCondition.desc("lastTime"),FieldFilters.eq("studyId", studyId)); + for (StudyCourseItem item : list){ + String redisKey = "studyId:" + studyId + ":courseId:" + item.getCourseId() + ":courseContentId:" + item.getContentId(); + String redisValue = redisTemplate.opsForValue().get(redisKey); + if (redisValue != null) { + String[] values = redisValue.split("&"); + int duration = Integer.parseInt(values[0]); + item.setStudyDuration(duration); + } + } + return list; } @Override From 076b1828adf68bc5b0a232c2eaa15f7d20a7ceb3 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 09:16:47 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/school/study/api/StudyCourseApi.java | 39 ++++++++++++++++--- .../school/study/api/StudyCourseTask.java | 25 +++++++----- .../school/study/service/IStudyService.java | 2 +- .../study/service/impl/StudyServiceImpl.java | 10 ++--- 4 files changed, 55 insertions(+), 21 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 1a5a1080..2fff7035 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -660,8 +660,8 @@ public class StudyCourseApi extends ApiBaseController{ /** * appendtime 于 study-video-time 合并 * */ - @RequestMapping(value="/updateStudyVideoTime",method = {RequestMethod.GET,RequestMethod.POST}) - public JsonResponse updateStudyVideoTime(StudyTimeVo studyTime, HttpServletRequest request){ + /*@RequestMapping(value="/updateStudyVideoTime1",method = {RequestMethod.GET,RequestMethod.POST}) + public JsonResponse updateStudyVideoTime1(StudyTimeVo studyTime, HttpServletRequest request){ // 0 study-video-time , 1 appendtime if (studyTime.getType() == 0){ @@ -698,7 +698,7 @@ public class StudyCourseApi extends ApiBaseController{ token = request.getHeader("token"); } try { - studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getDuration(),studyTime.getCourseId()); + studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getVideoTime(),studyTime.getCourseId()); List allUserList = thirdApi.getStudyCourseList(studyTime.getStudyId() ,studyTime.getCourseId(), token); log.info("updateStudyVideoTime type =1 在线课学习记录 = " + allUserList); return success(studyTime.getId()); @@ -709,9 +709,38 @@ public class StudyCourseApi extends ApiBaseController{ }else{ return error("type不能为空"); } - } + }*/ + + @RequestMapping(value="/updateStudyVideoTime",method = {RequestMethod.GET,RequestMethod.POST}) + public JsonResponse updateStudyVideoTime(StudyTimeVo studyTime, HttpServletRequest request){ + try { + if(StringUtils.isBlank(studyTime.getItemId())){ + return error("参数错误"); + } + if(studyTime.getVideoTime()==null){ + return error("无时间点"); + } + if(StringUtils.isBlank(studyTime.getStudyId())){ + return error("参数错误"); + } + if(StringUtils.isBlank(studyTime.getCourseId())){ + return error("未指定课程"); + } + if(StringUtils.isBlank(studyTime.getContentId())){ + return error("未指定资源内容"); + } + studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getDuration(),studyTime.getCourseId()); + if (studyTime.getContentId() != null && studyTime.getCourseId() != null && studyTime.getProgressVideo() != null){ + contentService.updateProcessVideo(studyTime.getContentId(), studyTime.getCourseId(), studyTime.getProgressVideo()); + } + + } catch (Exception e) { + log.error("updateStudyVideoTime",e); + return error("学习时长记录失败",e.getMessage(),null); + } + return success("true"); + } - /**获取最后一次的学习内容*/ @GetMapping("/last-study") public JsonResponse> lastStudy(){ 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 9b8de218..4ce318e5 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 @@ -103,9 +103,11 @@ public class StudyCourseTask { } - public void saveStudyCourseItemLastTime1() { + + @XxlJob("saveStudyCourseItemLastTime") + public void saveStudyCourseItemLastTime() { // 1. 定义匹配模式(匹配所有目标key) - final String KEY_PATTERN = "studyId:*:courseId:*:courseContentId:*"; + final String KEY_PATTERN = "studyId:*:courseId:*:courseContentId:*:studyItemId:*"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); // 2. 使用SCAN安全遍历(避免阻塞) ScanOptions options = ScanOptions.scanOptions() @@ -128,27 +130,30 @@ public class StudyCourseTask { try { // 6. 提取studyContentId String[] parts = redisKey.split(":"); - if (parts.length < 6) continue; + if (parts.length < 7) continue; String studyId = parts[1]; String courseId = parts[3]; String courseContentId = parts[5]; + String studyItemId = parts[7]; // 7. 获取存储的时间点(示例逻辑) String redisValue = redisTemplate.opsForValue().get(redisKey); if (redisValue == null) continue; String[] partValues = redisValue.split("&"); - int duration = Integer.parseInt(partValues[0]); + int studyVideoTtime = Integer.parseInt(partValues[0]); + int appendtime = Integer.parseInt(partValues[1]); LocalDateTime timestamp = null; if (partValues.length >= 2){ - timestamp = LocalDateTime.parse(partValues[1], formatter); + timestamp = LocalDateTime.parse(partValues[2], formatter); } // 8. 更新数据库(调用已有服务方法) - studyService.newAppendStudyDuration(studyId,null,courseContentId,duration,timestamp); - + studyService.newAppendStudyDuration(studyId,null,courseContentId,appendtime,timestamp); + // 8. 更新数据库(调用已有服务方法) + studyService.updateStudyCourseItemLastTime(studyItemId, studyVideoTtime, timestamp); List allUserList = thirdApi.getStudyCourseList(studyId , courseId, null); log.info("处理成功 allUserList: {}", allUserList); // 9. 删除Redis键(原子操作) redisTemplate.delete(redisKey); - log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, duration); + log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, appendtime); } catch (Exception e) { log.error("处理失败 key: {}", redisKey, e); } @@ -163,8 +168,8 @@ public class StudyCourseTask { } - @XxlJob("saveStudyCourseItemLastTime") - public void saveStudyCourseItemLastTime() { + @XxlJob("saveStudyCourseItemLastTime1") + public void saveStudyCourseItemLastTime1() { // 定义需要处理的键模式集合 processKeys("studyContentId:*:last_active", this::handleLastActiveKey); processKeys("studyId:*:courseId:*:courseContentId:*", this::handleDurationKey); 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 340865e0..99341ed7 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 @@ -102,7 +102,7 @@ public interface IStudyService { void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, LocalDateTime timestamp); - void updateStudyDuration(String studyId,String studyItemId, String contentId, Integer duration,String courseId); + void updateStudyDuration(String studyId,String studyItemId, String contentId, Integer videoTime,String courseId); void newAppendStudyDuration(String studyId, String studyItemId, String courseContentId, int duration, 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 7898fe57..2051edb9 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 @@ -149,22 +149,22 @@ public class StudyServiceImpl implements IStudyService{ // 更新 前端传输已学习时长 @Override - public void updateStudyDuration(String studyId,String studyItemId,String courseContentId, Integer duration,String courseId) { + public void updateStudyDuration(String studyId,String studyItemId,String courseContentId, Integer videoTime,String courseId) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); - String key = "studyId:" + studyId + ":courseId:" + courseId + ":courseContentId:" + courseContentId; + String key = "studyId:" + studyId + ":courseId:" + courseId + ":courseContentId:" + courseContentId + ":studyItemId:" + studyItemId; String currentValue = redisTemplate.opsForValue().get(key); int lastDuration = 0; - int sum = duration; + int sum = 10; // 原appendtime改为固定10秒调用一次接口 if (currentValue != null) { String[] partValues = currentValue.split("&"); - lastDuration = Integer.parseInt(partValues[0]); + lastDuration = Integer.parseInt(partValues[1]); sum += lastDuration; }; - String value = sum + "&" + now.format(formatter); // 使用ISO8601时间格式 + String value = videoTime + "&" + sum + "&" + now.format(formatter); // study_video_time & appendtime & time log.info("-study-video-time-----value = " + value); // 20250303 优化 多次更新改一次更新 From 89481652967fe06a135eeef29ad4831c86b2d343 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 09:49:59 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E7=9A=84=E5=85=B6=E4=BB=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/school/study/api/StudyCourseApi.java | 6 +++--- .../xboe/school/study/service/impl/StudyServiceImpl.java | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 2fff7035..dd25e7e9 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -277,7 +277,7 @@ public class StudyCourseApi extends ApiBaseController{ } // 查询redis上面的key,并解析value获取到lastStudyTime - String lastActive = redisTemplate.opsForValue().get("studyContentId:" + item.getId() + ":last_active"); + /*String lastActive = redisTemplate.opsForValue().get("studyContentId:" + item.getId() + ":last_active"); if (StringUtil.isNotBlank(lastActive)) { String[] parts = lastActive.split("&"); if (parts.length == 2) { @@ -287,8 +287,8 @@ public class StudyCourseApi extends ApiBaseController{ item.setLastStudyTime(lastStudyTimeRedis); } } - } - + }*/ + item.setLastStudyTime(item.getStudyDuration()); BigDecimal lastStudyTime = new BigDecimal(item.getLastStudyTime()); BigDecimal duration = new BigDecimal(content.getDuration()); BigDecimal progress = lastStudyTime.divide(duration, 10, RoundingMode.HALF_UP); 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 2051edb9..773fd1d2 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 @@ -203,8 +203,10 @@ public class StudyServiceImpl implements IStudyService{ public List findByStudyId(String studyId) { List list = scItemDao.findList(OrderCondition.desc("lastTime"),FieldFilters.eq("studyId", studyId)); for (StudyCourseItem item : list){ - String redisKey = "studyId:" + studyId + ":courseId:" + item.getCourseId() + ":courseContentId:" + item.getContentId(); + String redisKey = "studyId:" + studyId + ":courseId:" + item.getCourseId() + ":courseContentId:" + item.getContentId() + ":studyItemId:" + item.getId(); + log.info("-- studyIndex -查询上次学习的是什么资源。查询用户的学习情况---------------- redisKey = " + redisKey); String redisValue = redisTemplate.opsForValue().get(redisKey); + log.info("-- studyIndex -查询上次学习的是什么资源。查询用户的学习情况---------------- redisValue = " + redisValue); if (redisValue != null) { String[] values = redisValue.split("&"); int duration = Integer.parseInt(values[0]); From 24011a4470078b69c3856831fc380428a7f927c8 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 10:06:53 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E7=9A=84=E5=85=B6=E4=BB=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/school/study/api/StudyCourseApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index dd25e7e9..87e5fae0 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -729,7 +729,7 @@ public class StudyCourseApi extends ApiBaseController{ if(StringUtils.isBlank(studyTime.getContentId())){ return error("未指定资源内容"); } - studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getDuration(),studyTime.getCourseId()); + studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getVideoTime(),studyTime.getCourseId()); if (studyTime.getContentId() != null && studyTime.getCourseId() != null && studyTime.getProgressVideo() != null){ contentService.updateProcessVideo(studyTime.getContentId(), studyTime.getCourseId(), studyTime.getProgressVideo()); } From 3e70e71e5adb53afbb9a476bf8554c8c59a692cb Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 10:19:06 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=BD=B1=E5=93=8D?= =?UTF-8?q?=E7=9A=84=E5=85=B6=E4=BB=96=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/school/study/api/StudyCourseApi.java | 2 +- .../com/xboe/school/study/service/impl/StudyServiceImpl.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 87e5fae0..dcbb169e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -288,7 +288,7 @@ public class StudyCourseApi extends ApiBaseController{ } } }*/ - item.setLastStudyTime(item.getStudyDuration()); + item.setLastStudyTime(item.getStudyDuration()==null? item.getLastStudyTime() : item.getStudyDuration()); BigDecimal lastStudyTime = new BigDecimal(item.getLastStudyTime()); BigDecimal duration = new BigDecimal(content.getDuration()); BigDecimal progress = lastStudyTime.divide(duration, 10, RoundingMode.HALF_UP); 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 773fd1d2..a4d50d06 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 @@ -203,6 +203,7 @@ public class StudyServiceImpl implements IStudyService{ public List findByStudyId(String studyId) { List list = scItemDao.findList(OrderCondition.desc("lastTime"),FieldFilters.eq("studyId", studyId)); for (StudyCourseItem item : list){ + log.info("-- studyIndex -查询上次学习的是什么资源。mysql查询---------------- item = " + item); String redisKey = "studyId:" + studyId + ":courseId:" + item.getCourseId() + ":courseContentId:" + item.getContentId() + ":studyItemId:" + item.getId(); log.info("-- studyIndex -查询上次学习的是什么资源。查询用户的学习情况---------------- redisKey = " + redisKey); String redisValue = redisTemplate.opsForValue().get(redisKey); From 00510562ca98503db8deb86f2d0245dab8d66481 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 10:40:50 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/school/study/api/StudyCourseTask.java | 2 ++ 1 file changed, 2 insertions(+) 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 4ce318e5..9eaffc1c 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 @@ -120,6 +120,7 @@ public class StudyCourseTask { // 3. 遍历处理符合条件的key while (cursor.hasNext()) { String redisKey = new String(cursor.next()); + log.info("-定时任务 saveStudyCourseItemLastTime ---redisKey = " + redisKey); // 4. 获取剩余TTL(秒) Long ttl = redisTemplate.getExpire(redisKey, TimeUnit.SECONDS); @@ -137,6 +138,7 @@ public class StudyCourseTask { String studyItemId = parts[7]; // 7. 获取存储的时间点(示例逻辑) String redisValue = redisTemplate.opsForValue().get(redisKey); + log.info("-定时任务 saveStudyCourseItemLastTime ---redisValue = " + redisValue); if (redisValue == null) continue; String[] partValues = redisValue.split("&"); int studyVideoTtime = Integer.parseInt(partValues[0]); From d938425151f3f11181a139456df4439762614855 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 10:54:36 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/school/study/api/StudyCourseApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index dcbb169e..fec2414d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -729,7 +729,7 @@ public class StudyCourseApi extends ApiBaseController{ if(StringUtils.isBlank(studyTime.getContentId())){ return error("未指定资源内容"); } - studyService.updateStudyDuration(studyTime.getStudyId(),null,studyTime.getContentId(),studyTime.getVideoTime(),studyTime.getCourseId()); + studyService.updateStudyDuration(studyTime.getStudyId(),studyTime.getItemId(),studyTime.getContentId(),studyTime.getVideoTime(),studyTime.getCourseId()); if (studyTime.getContentId() != null && studyTime.getCourseId() != null && studyTime.getProgressVideo() != null){ contentService.updateProcessVideo(studyTime.getContentId(), studyTime.getCourseId(), studyTime.getProgressVideo()); } From efc0605115c1a6033cb07d693a1e5d31d2062ae0 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 11:05:18 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/school/study/api/StudyCourseTask.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 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 9eaffc1c..b1e2beaa 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 @@ -149,8 +149,10 @@ public class StudyCourseTask { } // 8. 更新数据库(调用已有服务方法) studyService.newAppendStudyDuration(studyId,null,courseContentId,appendtime,timestamp); - // 8. 更新数据库(调用已有服务方法) - studyService.updateStudyCourseItemLastTime(studyItemId, studyVideoTtime, timestamp); + if (studyItemId != null){ + // 8. 更新数据库(调用已有服务方法) + studyService.updateStudyCourseItemLastTime(studyItemId, studyVideoTtime, timestamp); + } List allUserList = thirdApi.getStudyCourseList(studyId , courseId, null); log.info("处理成功 allUserList: {}", allUserList); // 9. 删除Redis键(原子操作) From 1039f80aec776ba05e8df6fc13ff1bde87e54434 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 18 Apr 2025 11:15:36 +0800 Subject: [PATCH 11/15] =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/school/study/api/StudyCourseTask.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 b1e2beaa..0e70daee 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 @@ -149,7 +149,9 @@ public class StudyCourseTask { } // 8. 更新数据库(调用已有服务方法) studyService.newAppendStudyDuration(studyId,null,courseContentId,appendtime,timestamp); - if (studyItemId != null){ + log.info("-定时任务 saveStudyCourseItemLastTime ---studyItemId = " + studyItemId); + if (studyItemId != null && !studyItemId.equals("null")){ + log.info("-定时任务 saveStudyCourseItemLastTime --- boolean studyItemId = " + (studyItemId != null)); // 8. 更新数据库(调用已有服务方法) studyService.updateStudyCourseItemLastTime(studyItemId, studyVideoTtime, timestamp); } From d1b6573c258dadd17aa018d2af42657720a041ab Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 21 Apr 2025 11:40:22 +0800 Subject: [PATCH 12/15] =?UTF-8?q?studyindex=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/study/api/StudyCourseApi.java | 13 ------------- .../school/study/service/impl/StudyServiceImpl.java | 3 ++- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index fec2414d..386a24d5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -276,19 +276,6 @@ public class StudyCourseApi extends ApiBaseController{ continue; } - // 查询redis上面的key,并解析value获取到lastStudyTime - /*String lastActive = redisTemplate.opsForValue().get("studyContentId:" + item.getId() + ":last_active"); - if (StringUtil.isNotBlank(lastActive)) { - String[] parts = lastActive.split("&"); - if (parts.length == 2) { - int lastStudyTimeRedis = Integer.parseInt(parts[0]); - log.info("study-video-time-redis获取---lastStudyTimeRedis = " + lastStudyTimeRedis); - if(lastStudyTimeRedis>0){ - item.setLastStudyTime(lastStudyTimeRedis); - } - } - }*/ - item.setLastStudyTime(item.getStudyDuration()==null? item.getLastStudyTime() : item.getStudyDuration()); BigDecimal lastStudyTime = new BigDecimal(item.getLastStudyTime()); BigDecimal duration = new BigDecimal(content.getDuration()); BigDecimal progress = lastStudyTime.divide(duration, 10, RoundingMode.HALF_UP); 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 a4d50d06..07261e5b 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 @@ -211,7 +211,8 @@ public class StudyServiceImpl implements IStudyService{ if (redisValue != null) { String[] values = redisValue.split("&"); int duration = Integer.parseInt(values[0]); - item.setStudyDuration(duration); +// item.setStudyDuration(duration); + item.setLastStudyTime(duration); } } return list; From eafe17b99adfa3e475cba01b5d9ebd448a4abf00 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 21 Apr 2025 13:46:55 +0800 Subject: [PATCH 13/15] =?UTF-8?q?studyindex=20=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/study/service/impl/StudyServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 07261e5b..5e556422 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 @@ -213,6 +213,7 @@ public class StudyServiceImpl implements IStudyService{ int duration = Integer.parseInt(values[0]); // item.setStudyDuration(duration); item.setLastStudyTime(duration); + log.info("-- studyIndex -----set 结果---------------- LastStudyTime = " + item.getLastStudyTime()); } } return list; From add1d6abb21edecc07e66badc655da58a94a2c81 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 21 Apr 2025 13:59:06 +0800 Subject: [PATCH 14/15] =?UTF-8?q?=E5=8F=96=E6=B6=88lastStudyTime=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/study/service/impl/StudyServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5e556422..428b859d 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 @@ -400,7 +400,7 @@ public class StudyServiceImpl implements IStudyService{ UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class); update.addFilter(FieldFilters.eq("id",studyContentId)); //只记录时间长的时候的处理 - update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime)); +// update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime)); update.addUpdateField("lastStudyTime", lastStudyTime); update.addUpdateField("lastTime", timestamp==null ? now : timestamp); scItemDao.update(update.builder()); From fb1d11ebab87beb3c53acb3315e3cc9837aa40e4 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 21 Apr 2025 15:18:48 +0800 Subject: [PATCH 15/15] =?UTF-8?q?=E5=8F=96=E6=B6=88lastStudyTime=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/study/service/impl/StudyServiceImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 428b859d..544a0a61 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 @@ -156,12 +156,17 @@ public class StudyServiceImpl implements IStudyService{ String key = "studyId:" + studyId + ":courseId:" + courseId + ":courseContentId:" + courseContentId + ":studyItemId:" + studyItemId; String currentValue = redisTemplate.opsForValue().get(key); - int lastDuration = 0; - int sum = 10; // 原appendtime改为固定10秒调用一次接口 + Integer lastDuration = 0; + Integer oldVideoTime = 0; + Integer sum = 10; // 原appendtime改为固定10秒调用一次接口 if (currentValue != null) { String[] partValues = currentValue.split("&"); + oldVideoTime = Integer.parseInt(partValues[0]); lastDuration = Integer.parseInt(partValues[1]); sum += lastDuration; + if(oldVideoTime > videoTime){ + videoTime = oldVideoTime;// 取最大值最终入库 + } }; String value = videoTime + "&" + sum + "&" + now.format(formatter); // study_video_time & appendtime & time @@ -211,7 +216,6 @@ public class StudyServiceImpl implements IStudyService{ if (redisValue != null) { String[] values = redisValue.split("&"); int duration = Integer.parseInt(values[0]); -// item.setStudyDuration(duration); item.setLastStudyTime(duration); log.info("-- studyIndex -----set 结果---------------- LastStudyTime = " + item.getLastStudyTime()); } @@ -400,7 +404,7 @@ public class StudyServiceImpl implements IStudyService{ UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class); update.addFilter(FieldFilters.eq("id",studyContentId)); //只记录时间长的时候的处理 -// update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime)); + update.addFilter(FieldFilters.lt("lastStudyTime", lastStudyTime)); update.addUpdateField("lastStudyTime", lastStudyTime); update.addUpdateField("lastTime", timestamp==null ? now : timestamp); scItemDao.update(update.builder());