diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java index 243ae1eb..4d97d245 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java @@ -12,13 +12,16 @@ public class CaseScheduledTasks { @Resource private ICasesService casesService; - @Scheduled(cron = "0 0 1 1 * ?") // 每月的第一天的1:00执行 + /** + * 每月的第一天的1:00执行 + */ + @Scheduled(cron = "0 0 1 1 * ?") public void refreshViewsRankOfMajor() { casesService.refreshViewsRankOfMajor(); } /** - * 季初执行,cron表达式设置为每个季度的第一个月的第一天的特定时间。每个季度的第一个月是1月、4月、7月和10月: + * 季初第一天两点执行,cron表达式设置为每个季度的第一个月的第一天的特定时间。每个季度的第一个月是1月、4月、7月和10月: */ @Scheduled(cron = "0 0 2 1 1,4,7,10 ?") public void refreshLastQuarterStatistics() { 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 1fdce29b..a2a88716 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 @@ -132,25 +132,7 @@ public class CasesApi extends ApiBaseController { views = casesService.queryPageCasesV2(req); } - if (views != null) { - List cases = views.getList(); - if (CollUtil.isNotEmpty(cases)) { - for (Cases c : cases) { - StringBuffer stringBuffer = new StringBuffer(); - List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); - if (caseId != null && !caseId.isEmpty()) { - for (CasesMajorType cm : caseId) { - stringBuffer.append(cm.getMajorId()); - stringBuffer.append(","); - } - } - if (stringBuffer.length() > 0) { - stringBuffer.deleteCharAt(stringBuffer.length() - 1); - c.setMajorType(stringBuffer.toString()); - } - } - } - } else { + if (views == null) { views = new PageList(); views.setList(Collections.emptyList()); views.setPageSize(req.getPageSize()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java index 2ad38cb2..172b4512 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -15,7 +15,9 @@ import java.util.stream.Collectors; @Repository @Slf4j public class CasesRankDao extends BaseDao { - + /** + * 获取类别榜记录,默认按上榜时间降序排列 + */ public List findViewsRankRecordByCaseId(String caseId) { String sql = "SELECT bdmt.name,bcvr.rise_rank_time,bcvr.rank,bcvr.major_id \n" + @@ -24,8 +26,7 @@ public class CasesRankDao extends BaseDao { "JOIN boe_dict_major_type bdmt \n" + " ON bdmt.code = bcvr.major_id \n" + "WHERE bcvr.case_id = ?1 AND bcvr.deleted=0 AND bdmt.deleted=0\n" + - "ORDER BY bcvr.sys_update_time DESC \n" + - "LIMIT 2;"; + "ORDER BY bcvr.rise_rank_time DESC;"; List list = this.sqlFindList(sql, caseId); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index c723fe8f..6f3816d2 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -416,14 +416,36 @@ public class CasesServiceImpl implements ICasesService { if (CollUtil.isEmpty(casesList)) { return casesList; } + //1.推荐案例数据处理 recommendCasesDataHandle(casesList, accountId); //2.标签处理,添加作者标签和新的案例标签 addAuthorTagAndCaseNewTag(casesList); + //3.案例类型处理 + majorTypeHandle(casesList); return casesList; } + private void majorTypeHandle(List casesList) { + if (CollUtil.isNotEmpty(casesList)) { + for (Cases c : casesList) { + StringBuffer stringBuffer = new StringBuffer(); + List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); + if (caseId != null && !caseId.isEmpty()) { + for (CasesMajorType cm : caseId) { + stringBuffer.append(cm.getMajorId()); + stringBuffer.append(","); + } + } + if (stringBuffer.length() > 0) { + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + c.setMajorType(stringBuffer.toString()); + } + } + } + } + private void recommendCasesDataHandle(List casesList, String accountId) { if (StrUtil.isNotBlank(accountId)) { List caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList()); @@ -483,7 +505,7 @@ public class CasesServiceImpl implements ICasesService { caseList.forEach(e -> { - // 获取最新的两个浏览量上榜记录 + // 获取浏览量上榜记录 List viewsRankRecords = casesRankDao.findViewsRankRecordByCaseId(e.getId()); if (CollUtil.isNotEmpty(viewsRankRecords)) { // 拼接生成浏览量排行榜的标签 @@ -1231,7 +1253,7 @@ public class CasesServiceImpl implements ICasesService { @Override public void refreshLastQuarterStatistics() { log.info("开始执行每季案例相关定时任务"); - int i = casesDao.sqlUpdate("update boe_cases set last_quarter_views=views,last_quarter_praise=praise where deleted=0"); + int i = casesDao.sqlUpdate("update boe_cases set last_quarter_views=views,last_quarter_praises=praises where deleted=0"); log.info("每季案例相关定时任务执行完成,boe_cases更新数据量为条数为"+i); } @@ -1283,15 +1305,18 @@ public class CasesServiceImpl implements ICasesService { List> popularityOfMajor = casesRankDao.findPopularityOfMajor(pageSize, startTime, endTime, majorId); List caseIdList = popularityOfMajor.stream().map(map -> map.get("caseId").toString()).collect(Collectors.toList()); - Map collect = popularityOfMajor.stream().collect(Collectors.toMap(map -> map.get("caseId").toString(), map -> Integer.valueOf(map.get("rank").toString()))); QueryBuilder query = QueryBuilder.from(Cases.class); query.addFilter(FieldFilters.in("id",caseIdList)); query.addFilter(FieldFilters.eq("deleted",false)); List casesList = casesDao.findList(query.builder()); + //处理案例数据-通用操作 casesList = caseListCommonHandle(casesList, accountId); + //获取案例与排名的映射关系 + Map collect = popularityOfMajor.stream().collect(Collectors.toMap(map -> map.get("caseId").toString(), map -> Integer.valueOf(map.get("rank").toString()))); + //排序榜单案例顺序 Collections.sort(casesList, new Comparator() { @Override public int compare(Cases c1, Cases c2) { @@ -1300,6 +1325,26 @@ public class CasesServiceImpl implements ICasesService { return Integer.compare(order1, order2); } }); + + casesList.forEach(cases -> { + List viewRankTags = cases.getViewRankTags(); + + // 使用 Stream API 进行排序,保持其余元素的原始顺序 + List sortedList = viewRankTags.stream() + .sorted((o1, o2) -> { + // majorId 相等时放前面 + boolean o1Matches = o1.getMajorId().equals(majorId); + boolean o2Matches = o2.getMajorId().equals(majorId); + + if (o1Matches && !o2Matches) return -1; // o1是majorId, o2不是,o1排前 + if (!o1Matches && o2Matches) return 1; // o2是majorId, o1不是,o2排前 + return 0; // 如果两者都是或都不是majorId, 保持原有顺序 + }) + .collect(Collectors.toList()); + + // 更新原列表 + cases.setViewRankTags(sortedList); + }); return casesList; }