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 404e6a30..4123186e 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 @@ -14,6 +14,7 @@ import com.xboe.module.boecase.service.ICasesRecommendPushRecordService; import com.xboe.module.boecase.vo.CaseExportVo; import com.xboe.module.boecase.vo.CaseRankingVo; import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo; +import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo; import com.xboe.module.dict.entity.DictItem; import com.xboe.module.excel.ExportsExcelSenderUtil; @@ -739,16 +740,21 @@ public class CasesApi extends ApiBaseController { /** * 查询收藏 + * @param pageIndex + * @param pageSize + * @param orderField + * @param orderAsc + * @return */ @SuppressWarnings("unchecked") @GetMapping("/queryFavoriteCaseOfIndex") - public JsonResponse> queryFavoriteCaseOfIndex(@RequestParam(required = false,defaultValue = "1") Integer pageIndex, + public JsonResponse> queryFavoriteCaseOfIndex(@RequestParam(required = false,defaultValue = "1") Integer pageIndex, @RequestParam(required = false,defaultValue = "5") Integer pageSize, @RequestParam(required = false) String orderField, @RequestParam(required = false) Boolean orderAsc) { // String accountId = this.getCurrent().getAccountId(); String accountId = "965342027497607168"; - PageList casesList = casesService.queryFavoriteCaseOfIndex(pageIndex,pageSize,accountId,orderField,orderAsc); + PageList casesList = casesService.queryFavoriteCaseOfIndex(pageIndex,pageSize,accountId,orderField,orderAsc); return success(casesList); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java index ab5bf945..8e2db196 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java @@ -6,6 +6,7 @@ import com.xboe.module.boecase.dto.*; import com.xboe.module.boecase.entity.Cases; import com.xboe.module.boecase.vo.CaseRankingVo; import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo; +import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo; import com.xboe.module.dict.entity.DictItem; import com.xboe.module.interaction.dto.FavoriteCaseDto; import com.xboe.school.vo.CasesVo; @@ -132,6 +133,6 @@ public interface ICasesService{ List queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId); - PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc); + PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc); } 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 582d88ba..ba20a630 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 @@ -21,9 +21,9 @@ import com.xboe.module.boecase.service.ICasesService; import com.xboe.module.boecase.vo.CaseRankingVo; import com.xboe.module.boecase.vo.CaseViewRankingItemVo; import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo; +import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo; import com.xboe.module.dict.dao.SysDictionaryDao; import com.xboe.module.dict.entity.DictItem; -import com.xboe.module.interaction.dto.FavoriteCaseDto; import com.xboe.module.interaction.entity.Favorites; import com.xboe.orm.CustomFieldInFilter; import com.xboe.school.vo.CasesVo; @@ -31,6 +31,7 @@ import com.xboe.standard.enums.BoedxResourceType; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -44,7 +45,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -329,12 +329,129 @@ public class CasesServiceImpl implements ICasesService { casesList.forEach(it->{ it.setBreCommend(0); }); - casesList = addTags(casesList, caseVo.getUserId()); + casesList = caseListCommonHandle(casesList, caseVo.getUserId()); page.setList(casesList); return page; } + + + @Override + public PageList queryRecommendPageCasesV2(CasePageVo caseVo) { + + PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex() - 1, caseVo.getPageSize()); + + + String majorType = caseVo.getMajorType(); + if (StringUtil.isNotBlank(majorType)) { + List casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ",")); + if (CollUtil.isNotEmpty(casesTypes)) { + List caseIds = casesTypes.stream().map(CasesMajorType::getCaseId).collect(Collectors.toList()); + caseVo.setCaseIds(caseIds); + } else { + return null; + } + } + + List orgDomainDtos = caseVo.getOrgDomainDtos(); + List level1 = new ArrayList<>(); + List level2 = new ArrayList<>(); + List level3 = new ArrayList<>(); + if (CollUtil.isNotEmpty(orgDomainDtos)) { + for (int i = 0; i < orgDomainDtos.size(); i++) { + OrgDomainDto domainDto = orgDomainDtos.get(i); + List orgDomainParent2 = domainDto.getChildren(); + if (CollUtil.isNotEmpty(orgDomainParent2)) { + for (OrgDomainDto orgDomainDto : orgDomainParent2) { + List orgDomainParent3 = orgDomainDto.getChildren(); + if (CollUtil.isNotEmpty(orgDomainParent3)) { + List parent = orgDomainParent3.stream().map(OrgDomainDto::getParent).collect(Collectors.toList()); + level3.addAll(parent); + } else { + String parent = orgDomainDto.getParent(); + level2.add(parent); + } + } + } else { + String orgDomainParent = domainDto.getParent(); + level1.add(orgDomainParent); + } + } + } + caseVo.setOrg1(level1); + caseVo.setOrg2(level2); + caseVo.setOrg3(level3); + + Page cases = casesRecordDao.queryList(pageRequest,caseVo); + PageList pageList = new PageList<>(); + pageList.setCount((int) cases.getTotalElements()); + pageList.setPageSize(cases.getSize()); + List content = cases.getContent(); + + caseListCommonHandle(content, caseVo.getUserId()); + + pageList.setList(content); + return pageList; + } + + private List caseListCommonHandle(List casesList, String accountId) { + if (CollUtil.isEmpty(casesList)) { + return casesList; + } + //1.推荐案例数据处理 + recommendCasesDataHandle(casesList, accountId); + //2.标签处理,添加作者标签和新的案例标签 + addAuthorTagAndCaseNewTag(casesList); + + return casesList; + } + + private void recommendCasesDataHandle(List casesList, String accountId) { + if (StrUtil.isNotBlank(accountId)) { + List caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList()); + QueryBuilder queryBuilder = QueryBuilder.from(CasesRecommendPushRecord.class) + .addField("new CasesRecommendPushRecord(id,recommendId,caseId)") + .addFilters(Arrays.asList( + FieldFilters.eq("pushUserId", accountId), + FieldFilters.in("caseId", caseIdList), + FieldFilters.eq("pushStatus", 3), + FieldFilters.eq("deleted", Boolean.FALSE) + )) + .addOrder("sysCreateTime", OrderDirection.DESC) + .addGroupBy("caseId"); + + List pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder()); + + if (CollUtil.isNotEmpty(pushRecords)) { + List rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList()); + QueryBuilder builder = QueryBuilder.from(CasesRecommend.class) + .addField("new CasesRecommend(id,recommendOrgName,recommendTime)") + .addFilters(Arrays.asList( + FieldFilters.eq("deleted", Boolean.FALSE), + FieldFilters.in("id", rIds) + )); + + List recommands = casesRecommendDao.findList(builder.builder()); + if (CollUtil.isNotEmpty(recommands)) { + Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item -> item)); + casesList.forEach(it -> { + CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId())); + if (Objects.nonNull(one)) { + CasesRecommend recommend = collect.get(one.getRecommendId()); + it.setBreCommend(1); + it.setRefId(one.getId()); + it.setRecommendOrgName(recommend.getRecommendOrgName()); + it.setSysCreateTime(recommend.getRecommendTime()); + } else { + it.setBreCommend(0); + } + }); + } + } + } + } + /** * 添加案例标签、作者标签(最佳案例N篇、上榜浏览量TOP榜单N次)、案例标签(xx分类浏览量TOP、最佳案例) */ @@ -395,65 +512,6 @@ public class CasesServiceImpl implements ICasesService { }); } - - @Override - public PageList queryRecommendPageCasesV2(CasePageVo caseVo) { - - PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex() - 1, caseVo.getPageSize()); - - - String majorType = caseVo.getMajorType(); - if (StringUtil.isNotBlank(majorType)) { - List casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ",")); - if (CollUtil.isNotEmpty(casesTypes)) { - List caseIds = casesTypes.stream().map(CasesMajorType::getCaseId).collect(Collectors.toList()); - caseVo.setCaseIds(caseIds); - } else { - return null; - } - } - - List orgDomainDtos = caseVo.getOrgDomainDtos(); - List level1 = new ArrayList<>(); - List level2 = new ArrayList<>(); - List level3 = new ArrayList<>(); - if (CollUtil.isNotEmpty(orgDomainDtos)) { - for (int i = 0; i < orgDomainDtos.size(); i++) { - OrgDomainDto domainDto = orgDomainDtos.get(i); - List orgDomainParent2 = domainDto.getChildren(); - if (CollUtil.isNotEmpty(orgDomainParent2)) { - for (OrgDomainDto orgDomainDto : orgDomainParent2) { - List orgDomainParent3 = orgDomainDto.getChildren(); - if (CollUtil.isNotEmpty(orgDomainParent3)) { - List parent = orgDomainParent3.stream().map(OrgDomainDto::getParent).collect(Collectors.toList()); - level3.addAll(parent); - } else { - String parent = orgDomainDto.getParent(); - level2.add(parent); - } - } - } else { - String orgDomainParent = domainDto.getParent(); - level1.add(orgDomainParent); - } - } - } - caseVo.setOrg1(level1); - caseVo.setOrg2(level2); - caseVo.setOrg3(level3); - - Page cases = casesRecordDao.queryList(pageRequest,caseVo); - PageList pageList = new PageList<>(); - pageList.setCount((int) cases.getTotalElements()); - pageList.setPageSize(cases.getSize()); - List content = cases.getContent(); - - addTags(content, caseVo.getUserId()); - - pageList.setList(content); - return pageList; - } - public static void main(String[] args) { String rename = "a.name".replaceAll("\\.", ""); @@ -949,7 +1007,7 @@ public class CasesServiceImpl implements ICasesService { builder.addFilter(FieldFilters.in("id", ids)); builder.addFields("new Cases(id,title,summary,coverUrl,authorId,authorName,sysCreateTime,breCommend,views,comments,praises,shares,favorites,deleted,sysCreateBy,sysCreateAid)"); List cases = casesDao.findList(builder.builder()); - cases = addTags(cases, accountId); + cases = caseListCommonHandle(cases, accountId); return cases; } @@ -1169,7 +1227,7 @@ public class CasesServiceImpl implements ICasesService { // 缓存不存在数据,数据库中不存在数据,重建缓存 List serializedCases = casesList.stream().map(item -> JSONUtil.toJsonStr(item)).collect(Collectors.toList()); stringRedisTemplate.opsForList().rightPushAll(cacheKey, serializedCases); - stringRedisTemplate.expire(cacheKey, 10000, TimeUnit.SECONDS); + stringRedisTemplate.expire(cacheKey, 600, TimeUnit.SECONDS); return casesList; } return Collections.emptyList(); @@ -1192,67 +1250,11 @@ public class CasesServiceImpl implements ICasesService { query.addFilter(FieldFilters.eq("deleted",false)); List casesList = casesDao.findList(query.builder()); - casesList = addTags(casesList, accountId); + casesList = caseListCommonHandle(casesList, accountId); return casesList; } - private List addTags(List casesList, String accountId) { - if (CollUtil.isEmpty(casesList)) { - return casesList; - } - //1.推荐案例处理,获取的数据主要用于生成推荐案例标签 - recommendCasesTagDataHandle(casesList, accountId); - //2.标签处理,添加作者标签和新的案例标签 - addAuthorTagAndCaseNewTag(casesList); - - return casesList; - } - - private void recommendCasesTagDataHandle(List casesList, String accountId) { - if (StrUtil.isNotBlank(accountId)) { - List caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList()); - QueryBuilder queryBuilder = QueryBuilder.from(CasesRecommendPushRecord.class) - .addField("new CasesRecommendPushRecord(id,recommendId,caseId)") - .addFilters(Arrays.asList( - FieldFilters.eq("pushUserId", accountId), - FieldFilters.in("caseId", caseIdList), - FieldFilters.eq("pushStatus", 3), - FieldFilters.eq("deleted", Boolean.FALSE) - )) - .addOrder("sysCreateTime", OrderDirection.DESC) - .addGroupBy("caseId"); - - List pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder()); - - if (CollUtil.isNotEmpty(pushRecords)) { - List rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList()); - QueryBuilder builder = QueryBuilder.from(CasesRecommend.class) - .addField("new CasesRecommend(id,recommendOrgName,recommendTime)") - .addFilters(Arrays.asList( - FieldFilters.eq("deleted", Boolean.FALSE), - FieldFilters.in("id", rIds) - )); - - List recommands = casesRecommendDao.findList(builder.builder()); - if (CollUtil.isNotEmpty(recommands)) { - Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item -> item)); - casesList.forEach(it -> { - CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId())); - if (Objects.nonNull(one)) { - CasesRecommend recommend = collect.get(one.getRecommendId()); - it.setBreCommend(1); - it.setRefId(one.getId()); - it.setRecommendOrgName(recommend.getRecommendOrgName()); - it.setSysCreateTime(recommend.getRecommendTime()); - } else { - it.setBreCommend(0); - } - }); - } - } - } - } @Override @@ -1358,7 +1360,7 @@ public class CasesServiceImpl implements ICasesService { } @Override - public PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc) { + public PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc) { String from = Favorites.class.getSimpleName()+" f,"+ Cases.class.getSimpleName()+" c"; QueryBuilder builder = QueryBuilder.from(from); builder.addFields("f.id","f.sysCreateTime","c"); @@ -1394,25 +1396,27 @@ public class CasesServiceImpl implements ICasesService { } List list = pageFields.getList(); + // 提取出 Cases 对象,添加标签 - List casesList = list.stream().map(o -> (Cases) o[2]).collect(Collectors.toList()); - casesList = addTags(casesList, accountId); - Map caseMap = casesList.stream().collect(Collectors.toMap(Cases::getId, Function.identity())); + List casesList = list.stream().map(o -> { + Cases cases = (Cases) o[2]; + FavoriteCaseOfIndexVo favoriteCaseOfIndexVo = new FavoriteCaseOfIndexVo(); + BeanUtils.copyProperties(cases, favoriteCaseOfIndexVo); + favoriteCaseOfIndexVo.setFavoriteId(o[0].toString()); + favoriteCaseOfIndexVo.setFavoriteTime(LocalDateTime.parse(o[1].toString())); + return favoriteCaseOfIndexVo; + }).collect(Collectors.toList()); - PageList favoriteCaseDtoPageList = new PageList<>(); - favoriteCaseDtoPageList.setList(new ArrayList<>()); - favoriteCaseDtoPageList.setPageSize(pageSize); - favoriteCaseDtoPageList.setCount(pageFields.getCount()); - for (Object[] o: list) { - FavoriteCaseDto favoriteCaseDto = new FavoriteCaseDto(); - favoriteCaseDto.setId(o[0].toString()); - favoriteCaseDto.setTime(LocalDateTime.parse(o[1].toString())); - Cases cases = caseMap.get(((Cases) o[2]).getId()); - favoriteCaseDto.setCases(cases); - favoriteCaseDtoPageList.getList().add(favoriteCaseDto); - } + casesList = caseListCommonHandle(casesList, accountId); - return favoriteCaseDtoPageList; + List collect = casesList.stream().map(cases -> (FavoriteCaseOfIndexVo) cases).collect(Collectors.toList()); + + PageList favoriteCaseOfIndexVoPageList = new PageList<>(); + favoriteCaseOfIndexVoPageList.setList(collect); + favoriteCaseOfIndexVoPageList.setPageSize(pageSize); + favoriteCaseOfIndexVoPageList.setCount(pageFields.getCount()); + + return favoriteCaseOfIndexVoPageList; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java new file mode 100644 index 00000000..54f3e052 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java @@ -0,0 +1,18 @@ +package com.xboe.module.boecase.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xboe.module.boecase.entity.Cases; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FavoriteCaseOfIndexVo extends Cases{ + + + private String favoriteId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime favoriteTime; + +}