From cdf5d2a052f32878060a69c6958939e2925f9cbe Mon Sep 17 00:00:00 2001 From: hui Date: Tue, 21 Jan 2025 18:08:33 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E6=A1=88=E4=BE=8B=E6=98=BE=E7=A4=BAnull=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/module/boecase/api/CasesApi.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index 2a566250..263ece20 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -140,6 +140,9 @@ public class CasesApi extends ApiBaseController { List cases = views.getList(); if (CollUtil.isNotEmpty(cases)) { for (Cases c : cases) { + if ("null".equals(c.getSummary())) { + c.setSummary(null); + } StringBuffer stringBuffer = new StringBuffer(); List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); if (caseId != null && !caseId.isEmpty()) { From f7dcda551d147fb2251fbbfb07e4033c0b3e8266 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Sat, 22 Feb 2025 13:12:31 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/data/outside/OutSideDataServiceImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java index e9c33361..0c46ec81 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java @@ -123,9 +123,13 @@ public class OutSideDataServiceImpl implements IOutSideDataService { user.setId(getNodeText(result.get("userId")));//最新接口变化,id改成userId String band=getNodeText(result.get("bandCode")); if(StringUtils.isNotBlank(band) && band.length()>4) { - String bandNum=band.substring(4); - user.setBandLevel(Integer.valueOf(bandNum)); - }else { + try { + String bandNum=band.substring(4); + user.setBandLevel(Integer.valueOf(bandNum)); + } catch (NumberFormatException e) { + user.setBandLevel(0); + } + }else { user.setBandLevel(0); } user.setAvatar(getNodeText(result.get("avatar"))); From 2919fceef1fbe79859bfb6154f44083ded2efeae Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Tue, 25 Feb 2025 17:35:47 +0800 Subject: [PATCH 3/5] =?UTF-8?q?boenewlogin=20band=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/outside/OutSideDataServiceImpl.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java index 0c46ec81..f7325d98 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/data/outside/OutSideDataServiceImpl.java @@ -122,17 +122,20 @@ public class OutSideDataServiceImpl implements IOutSideDataService { //这里应该是单独的线程去处理 user.setId(getNodeText(result.get("userId")));//最新接口变化,id改成userId String band=getNodeText(result.get("bandCode")); - if(StringUtils.isNotBlank(band) && band.length()>4) { - try { + try { + if(StringUtils.isNotBlank(band) && band.length()>4 && band.contains("band")) { String bandNum=band.substring(4); user.setBandLevel(Integer.valueOf(bandNum)); - } catch (NumberFormatException e) { + }else if (StringUtils.isNotBlank(band) && band.length()>4 && band.contains("Level")) { + String bandNum=band.substring(5); + user.setBandLevel(Integer.valueOf(bandNum)); + }else { user.setBandLevel(0); } - }else { - user.setBandLevel(0); - } - user.setAvatar(getNodeText(result.get("avatar"))); + } catch (NumberFormatException e) { + user.setBandLevel(0); + } + user.setAvatar(getNodeText(result.get("avatar"))); user.setCode(getNodeText(result.get("userNo"))); if(StringUtils.isBlank(user.getCode())) { From 81ea19f0f381f8208555191e6018a0dd70620ae5 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 3 Mar 2025 17:49:49 +0800 Subject: [PATCH 4/5] =?UTF-8?q?study-video-time=20redis=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../school/study/api/StudyCourseTask.java | 98 +++++++++++++++++++ .../school/study/service/IStudyService.java | 1 + .../study/service/impl/StudyServiceImpl.java | 22 ++++- 3 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java 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 new file mode 100644 index 00000000..e26b3a4a --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseTask.java @@ -0,0 +1,98 @@ +package com.xboe.school.study.api; + +import com.xboe.school.study.service.IStudyService; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * @author by lyc + * @date 2025/3/3 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class StudyCourseTask { + + private final IStudyService studyService; + private final StringRedisTemplate redisTemplate; + + /** + * 定时任务 + * 获取redis 中学习结束的数据更新入库 + * */ + @XxlJob("saveStudyCourseItemLastTime") + public void saveStudyCourseItemLastTime() { + // 1. 定义匹配模式(匹配所有目标key) + final String KEY_PATTERN = "studyContentId:*:last_active"; + + // 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秒 + if (ttl <= 2590200) { + try { + // 6. 提取studyContentId + String[] parts = redisKey.split(":"); + if (parts.length < 2) continue; + String studyContentId = parts[1]; + + // 7. 获取存储的时间点(示例逻辑) + String lastStudyTimeStr = redisTemplate.opsForValue().get(redisKey); + if (lastStudyTimeStr == null) continue; + int lastStudyTime = Integer.parseInt(lastStudyTimeStr); + + // 8. 更新数据库(调用已有服务方法) + studyService.updateStudyCourseItemLastTime(studyContentId, lastStudyTime, "system_job"); + + // 9. 删除Redis键(原子操作) + redisTemplate.delete(redisKey); + + log.info("处理成功 key: {}, lastStudyTime: {}", redisKey, lastStudyTime); + } catch (Exception e) { + log.error("处理失败 key: {}", redisKey, e); + } + } + + } + cursor.close(); + } catch (Exception e) { + log.error("定时任务执行异常", e); + } + + /* // 新增日志逻辑 + if (ttl <= 172800) { + studyService.saveCourseExpireLog( + studyContentId, + lastStudyTime, + redisKey, + ttl, + "system_job" + ); + }*/ + + } + + + +} 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 2d25fd37..043e7efa 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 @@ -99,4 +99,5 @@ public interface IStudyService { List getList(String courseId, String contentId, String name, Integer status); + void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime, String systemJob); } 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 9351fdd1..3abe0b9d 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 @@ -1,5 +1,6 @@ package com.xboe.school.study.service.impl; +import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -15,6 +16,7 @@ import com.xboe.school.study.entity.StudyCourse; import com.xboe.system.user.entity.User; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import com.xboe.common.OrderCondition; @@ -51,7 +53,10 @@ public class StudyServiceImpl implements IStudyService{ @Autowired UserDao userDao; - + @Autowired + StringRedisTemplate redisTemplate; + + @Override public StudyCourseItem checkHas(String studyId,String contentId) { List items = scItemDao.findList(FieldFilters.eq("studyId", studyId),FieldFilters.eq("contentId", contentId)); @@ -324,8 +329,20 @@ public class StudyServiceImpl implements IStudyService{ // 更新 前端传输已学习时长 @Override - @Transactional public void updateLastTime(String studyContentId, int lastStudyTime,String aid) { + // 20250303 优化 多次更新改一次更新 + // 更新Redis中的最后活跃时间(带30秒过期) + redisTemplate.opsForValue().set( + "studyContentId:" + studyContentId + ":last_active", + String.valueOf(lastStudyTime), + Duration.ofSeconds(2592000) + ); +// Duration.ofDays(30) 也就是 2592000秒 + } + + @Override + @Transactional + public void updateStudyCourseItemLastTime(String studyContentId, int lastStudyTime,String aid) { // 更新最后的学习时间点 LocalDateTime now=LocalDateTime.now(); UpdateBuilder update=UpdateBuilder.from(StudyCourseItem.class); @@ -335,7 +352,6 @@ public class StudyServiceImpl implements IStudyService{ update.addUpdateField("lastStudyTime", lastStudyTime); update.addUpdateField("lastTime", now); scItemDao.update(update.builder()); - //增加用户的学习时长,在api中调用 } @Override From a79f6b43b2d91dd73cacaa5bfa6e93129f7f5607 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Mon, 10 Mar 2025 14:22:03 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java | 2 ++ .../src/main/java/com/xboe/school/study/api/StudyCourseApi.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java index c39b69a9..5c242900 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java @@ -262,11 +262,13 @@ public class ThirdApi { } public List getStudyCourseList(String studyId, String courseId, String token) { + log.info(" 1 在线课学习记录 studyId = "+ studyId + " ,courseId = " + courseId ); StudyCourseVo studyCourseVo = new StudyCourseVo(); studyCourseVo.setStudyId(studyId); studyCourseVo.setCourseId(courseId); ProjectStudyDto projectStudyDto = new ProjectStudyDto(); BeanUtil.copyProperties(studyCourseVo, studyCourseVo); + log.info(" 1 在线课学习记录 studyId = "+ projectStudyDto.getStudyId() + " ,courseId = " + projectStudyDto.getCourseId() ); projectRemoteClient.updateStudyStatus(projectStudyDto); return new ArrayList<>(); } 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 8663e426..20c2fc82 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 @@ -343,6 +343,8 @@ public class StudyCourseApi extends ApiBaseController{ } //追加学习时长 studyService.appendStudyDuration(sci.getStudyId(),item.getId(),sci.getContentId(),sci.getDuration()); + + log.info(" 1 在线课学习记录 sci.getStudyId() = "+ sci.getStudyId() + " , sci.getCourseId() = " + sci.getCourseId() ); List allUserList = thirdApi.getStudyCourseList(sci.getStudyId() ,sci.getCourseId(), token); log.info("在线课学习记录"+allUserList); return success(item.getId());