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 e7d7160d..edbfb3f1 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 @@ -1,5 +1,6 @@ package com.xboe.module.boecase.api; +import cn.hutool.core.collection.CollUtil; import com.xboe.common.PageList; import com.xboe.common.Pagination; import com.xboe.common.utils.StringUtil; @@ -105,9 +106,10 @@ public class CasesApi extends ApiBaseController { } @PostMapping("/queryListV2") - public JsonResponse> queryCaseBreV2(@Validated CasePageVo req){ + public JsonResponse> queryCaseBreV2(@Validated @RequestBody CasePageVo req){ String type = req.getType(); - PageList views = null; + PageList views; + req.setUserId(getCurrent().getAccountId()); if (type.equals("recommend")) { views = casesService.queryRecommendPageCasesV2(req); } else { @@ -115,8 +117,9 @@ public class CasesApi extends ApiBaseController { } if(views!=null){ - if(views.getList()!=null && !views.getList().isEmpty()){ - for (Cases c:views.getList()) { + 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()){ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesRecommendApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesRecommendApi.java index e8027cc8..7ae3dd1e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesRecommendApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesRecommendApi.java @@ -198,7 +198,7 @@ public class CasesRecommendApi extends ApiBaseController { }).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(rows)) { // 通过工具类创建writer - try (ExcelWriter writer = ExcelUtil.getWriter(true); + try (ExcelWriter writer = ExcelUtil.getWriter(); // 输出流 ServletOutputStream servletOutputStream = response.getOutputStream() ) { @@ -213,9 +213,9 @@ public class CasesRecommendApi extends ApiBaseController { writer.setColumnWidth(5, 20); writer.setColumnWidth(6, 20); // 此处的response.setContentType 和教程里的不同 - response.setContentType("application/octet-stream"); + response.setContentType("application/vnd.ms-excel;charset=utf-8"); // filename就是表格的名字,这个无所谓,反正前端还会重命名 - response.setHeader("Content-Disposition", "attachment;filename=推荐信息.xlsx"); + response.setHeader("Content-Disposition", "attachment;filename=推荐信息.xls"); writer.flush(servletOutputStream, true); } catch (Exception e) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/CasePageVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/CasePageVo.java index 5e2024fe..085919c5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/CasePageVo.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/CasePageVo.java @@ -62,21 +62,21 @@ public class CasePageVo extends PageDto { public List getOrg1() { if (CollectionUtils.isNotEmpty(this.orgDomainDtos)) { - return orgDomainDtos.stream().map(OrgDomainDto::getOrgDomainParent).filter(StrUtil::isNotBlank).collect(Collectors.toList()); + return orgDomainDtos.stream().map(OrgDomainDto::getParent).filter(StrUtil::isNotBlank).collect(Collectors.toList()); } return null; } public List getOrg2() { if (CollectionUtils.isNotEmpty(this.orgDomainDtos)) { - return orgDomainDtos.stream().map(OrgDomainDto::getOrgDomainParent2).filter(StrUtil::isNotBlank).collect(Collectors.toList()); + return orgDomainDtos.stream().flatMap(it->it.getChildren().stream()).map(OrgDomainDto::getParent).filter(StrUtil::isNotBlank).collect(Collectors.toList()); } return null; } public List getOrg3() { if (CollectionUtils.isNotEmpty(this.orgDomainDtos)) { - return orgDomainDtos.stream().map(OrgDomainDto::getOrgDomainParent3).filter(StrUtil::isNotBlank).collect(Collectors.toList()); + return orgDomainDtos.stream().flatMap(it->it.getChildren().stream().flatMap(i->i.getChildren().stream())).map(OrgDomainDto::getParent).filter(StrUtil::isNotBlank).collect(Collectors.toList()); } return null; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/OrgDomainDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/OrgDomainDto.java index ee7f58c5..1036b47e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/OrgDomainDto.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/OrgDomainDto.java @@ -2,19 +2,17 @@ package com.xboe.module.boecase.dto; import lombok.Data; +import java.util.List; + @Data public class OrgDomainDto { /** * 组织领域1级 */ - private String orgDomainParent; + private String parent; /** - * 组织领域2级 + * 组织领域子级 */ - private String orgDomainParent2; - /** - * 组织领域3级 - */ - private String orgDomainParent3; + private List children; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java index 05039700..3c1e367b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java @@ -261,6 +261,9 @@ public class Cases extends BaseEntity { @Transient private List majorIds; + @Transient + private String recommendOrgName; + public Cases() { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java index bc4816e1..7d536917 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java @@ -46,9 +46,6 @@ public class CasesRecommend extends BaseEntity { /**查看率*/ @Column(name = "view_rate", length = 255) private String viewRate; - /**推荐组织ID*/ - @Column(name = "recommend_org_id", length = 20) - private String recommendOrgId; /**推荐组织名称*/ @Column(name = "recommend_org_name", length = 255) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommendPushRecord.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommendPushRecord.java index 8761d514..49b83179 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommendPushRecord.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommendPushRecord.java @@ -91,5 +91,11 @@ public class CasesRecommendPushRecord extends BaseEntity { @Column(name = "remark") private String remark; + public CasesRecommendPushRecord() { + } + public CasesRecommendPushRecord(String recommendId,String caseId) { + this.recommendId = recommendId; + this.caseId = caseId; + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesRecommendServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesRecommendServiceImpl.java index 69a6715b..a3fa701f 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesRecommendServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesRecommendServiceImpl.java @@ -61,7 +61,10 @@ public class CasesRecommendServiceImpl implements ICasesRecommendService { public void rePushOrWithdraw(CasesRecommendPushVo casesRecommendPushVo) { // 查询 CasesRecommend db = casesRecommendDao.get(casesRecommendPushVo.getCasesRecommendId()); - if (CasesPushStatusEnum.PUSH_SUCCESS.getStatus().equals(db.getPushProgress())){ + if (CasesPushStatusEnum.PUSH_SUCCESS.getStatus().equals(db.getPushProgress()) + || CasesPushStatusEnum.WAIT_PUSH.getStatus().equals(db.getPushProgress()) + || CasesPushStatusEnum.PUSH_ING.getStatus().equals(db.getPushProgress()) + ){ // 当为推送成功时为 iCasesRecommendPushRecordService.rePushOrWithdraw(true, casesRecommendPushVo.getCasesRecommendId()); db.setPushProgress(CasesPushStatusEnum.PUSH_REVOKE.getStatus()); 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 b1893848..2b70a315 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 @@ -4,17 +4,17 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.text.split.SplitIter; import cn.hutool.core.util.StrUtil; import com.xboe.common.OrderCondition; +import com.xboe.common.OrderDirection; import com.xboe.common.PageList; import com.xboe.common.utils.IDGenerator; import com.xboe.common.utils.StringUtil; import com.xboe.core.orm.*; -import com.xboe.module.boecase.dao.CasesDao; -import com.xboe.module.boecase.dao.CasesMajorTypeDao; -import com.xboe.module.boecase.dao.CasesMajorTypeRepoDao; -import com.xboe.module.boecase.dao.CasesRecordDao; +import com.xboe.module.boecase.dao.*; import com.xboe.module.boecase.dto.*; import com.xboe.module.boecase.entity.Cases; import com.xboe.module.boecase.entity.CasesMajorType; +import com.xboe.module.boecase.entity.CasesRecommend; +import com.xboe.module.boecase.entity.CasesRecommendPushRecord; import com.xboe.module.boecase.service.ICasesService; import com.xboe.module.dict.dao.SysDictionaryDao; import com.xboe.module.dict.entity.DictItem; @@ -22,6 +22,7 @@ import com.xboe.orm.CustomFieldInFilter; import com.xboe.school.vo.CasesVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; @@ -31,10 +32,8 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.Transactional; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -57,8 +56,11 @@ public class CasesServiceImpl implements ICasesService { @Resource private CasesMajorTypeRepoDao casesMajorTypeRepoDao; - @PersistenceContext - private EntityManager entityManager; + @Autowired + private CasesRecommendPushRecordDao casesRecommendPushRecordDao; + + @Autowired + private CasesRecommendDao casesRecommendDao; /** * 案例分页查询,用于门户的查询 @@ -178,11 +180,11 @@ public class CasesServiceImpl implements ICasesService { public PageList queryPageCasesV2(CasePageVo caseVo) { String keyword = caseVo.getKeyWord(); - QueryBuilder query=QueryBuilder.from(Cases.class); - PageList page=null; + QueryBuilder query = QueryBuilder.from(Cases.class); + PageList page = null; List filters = new ArrayList<>(); - filters.add(FieldFilters.eq("deleted",false)); - List likes=new ArrayList(); + filters.add(FieldFilters.eq("deleted", false)); + List likes = new ArrayList(); likes.add(FieldFilters.like("title", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); likes.add(FieldFilters.like("authorName", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); likes.add(FieldFilters.like("keyword1", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); @@ -195,58 +197,83 @@ public class CasesServiceImpl implements ICasesService { filters.add(FieldFilters.notIn("id", notInIds)); } - if(StringUtil.isNotBlank(caseVo.getKeyWord())) { + if (StringUtil.isNotBlank(caseVo.getKeyWord())) { filters.add(FieldFilters.or(likes)); } //创建时间过滤 List years = caseVo.getYears(); if (CollUtil.isNotEmpty(years)) { - filters.add(new CustomFieldInFilter("YEAR(sysCreateTime)","sysCreateTime",years)); + filters.add(new CustomFieldInFilter("YEAR(sysCreateTime)", "sysCreateTime", years)); } //增加只是查询有附件的 filters.add(FieldFilters.isNotNull("filePath")); - filters.add(FieldFilters.ne("filePath","")); + filters.add(FieldFilters.ne("filePath", "")); String majorType = caseVo.getMajorType(); - if(StringUtil.isNotBlank(majorType)){ + if (StringUtil.isNotBlank(majorType)) { List casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ",")); - if(CollUtil.isNotEmpty(casesTypes)){ + if (CollUtil.isNotEmpty(casesTypes)) { List caseIds = casesTypes.stream().map(CasesMajorType::getCaseId).collect(Collectors.toList()); - query.addFilter(FieldFilters.in("id",caseIds)); - }else { + query.addFilter(FieldFilters.in("id", caseIds)); + } else { return page; } } + List orgDomainDtos = caseVo.getOrgDomainDtos(); + IFieldFilter orgDomain = null; + if (CollUtil.isNotEmpty(orgDomainDtos)) { + for (int i = 0; i < orgDomainDtos.size(); i++) { + OrgDomainDto domainDto = orgDomainDtos.get(i); + String orgDomainParent = domainDto.getParent(); + IFieldFilter itemFilter = FieldFilters.eq("orgDomainParent", orgDomainParent); + List orgDomainParent2 = domainDto.getChildren(); + if (CollUtil.isNotEmpty(orgDomainParent2)) { + List seconds = orgDomainParent2.stream().map(OrgDomainDto::getParent).collect(Collectors.toList()); + IFieldFilter orgDomainParentFilter = FieldFilters.in("orgDomainParent2", seconds); + itemFilter = FieldFilters.and(itemFilter, orgDomainParentFilter); + } + for (OrgDomainDto orgDomainDto : orgDomainParent2) { + List orgDomainParent3 = orgDomainDto.getChildren(); + if (CollUtil.isNotEmpty(orgDomainParent3)) { + List thirds = orgDomainParent3.stream().map(OrgDomainDto::getParent).collect(Collectors.toList()); + IFieldFilter orgDomainParent3Filter = FieldFilters.eq("orgDomainParent3", thirds); + itemFilter = FieldFilters.and(itemFilter, orgDomainParent3Filter); + } + } - if(StringUtils.isNotBlank(caseVo.getCaseType())){ - filters.add(FieldFilters.eq("caseType",caseVo.getCaseType())); - } - if(caseVo.getBreCommend()!=null){ - if(!caseVo.getBreCommend()){ - filters.add(FieldFilters.eq("breCommend",0)); - }else { - filters.add(FieldFilters.eq("breCommend", 1)); + if (i == 0) { + orgDomain = itemFilter; + } else { + orgDomain = FieldFilters.or(orgDomain, itemFilter); + } } } - if(caseVo.getIsTop()!=null && caseVo.getIsTop()) { + if (Objects.nonNull(orgDomain)) { + filters.add(orgDomain); + } + + if (StringUtils.isNotBlank(caseVo.getCaseType())) { + filters.add(FieldFilters.eq("caseType", caseVo.getCaseType())); + } + if (caseVo.getIsTop() != null && caseVo.getIsTop()) { query.addOrder(OrderCondition.desc("isTop")); query.addOrder(OrderCondition.desc("topTime")); } //如果选择的是优秀案例,那么这里就按优秀案例的试试排序 - if(caseVo.getExcellent()!=null){ - filters.add(FieldFilters.eq("excellent",caseVo.getExcellent())); + if (caseVo.getExcellent() != null) { + filters.add(FieldFilters.eq("excellent", caseVo.getExcellent())); } - OrderCondition order=null; - if(StringUtils.isNotBlank(caseVo.getOrderField())) { - if(caseVo.getOrderAsc()==null || caseVo.getOrderAsc()) { - order=OrderCondition.asc(caseVo.getOrderField()); - }else { - order=OrderCondition.desc(caseVo.getOrderField()); + OrderCondition order = null; + if (StringUtils.isNotBlank(caseVo.getOrderField())) { + if (caseVo.getOrderAsc() == null || caseVo.getOrderAsc()) { + order = OrderCondition.asc(caseVo.getOrderField()); + } else { + order = OrderCondition.desc(caseVo.getOrderField()); } - }else { - order=OrderCondition.desc("sysCreateTime"); + } else { + order = OrderCondition.desc("sysCreateTime"); } query.addFilters(filters); @@ -255,19 +282,59 @@ public class CasesServiceImpl implements ICasesService { query.setPageIndex(caseVo.getPageIndex()); query.setPageSize(caseVo.getPageSize()); page = casesDao.findPage(query.builder()); + List list = page.getList(); + if (CollUtil.isNotEmpty(list)) { + List caseIds = list.stream().map(Cases::getId).collect(Collectors.toList()); + QueryBuilder recommendCasesQuery = QueryBuilder.from(CasesRecommendPushRecord.class); + recommendCasesQuery.addField("new CasesRecommendPushRecord(recommendId,caseId)"); + List subFilters = new ArrayList<>(); + subFilters.add(FieldFilters.eq("pushUserId", caseVo.getUserId())); + subFilters.add(FieldFilters.in("caseId", caseIds)); + subFilters.add(FieldFilters.eq("pushStatus", 4)); + subFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); + + QueryBuilder queryBuilder = recommendCasesQuery.addFilters(subFilters) + .addOrder("sysCreateTime", OrderDirection.DESC) + .addGroupBy("recommendId"); + List pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder()); + if (CollUtil.isNotEmpty(pushRecords)) { + List rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).collect(Collectors.toList()); + QueryBuilder builder = QueryBuilder.from(CasesRecommend.class); + builder.addField("new CasesRecommend(id,recommendOrgName)"); + List recommendFilters = new ArrayList<>(); + recommendFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); + recommendFilters.add(FieldFilters.in("id", rIds)); + builder.addFilters(recommendFilters); + List recommands = casesRecommendDao.findList(builder.builder()); + if (CollUtil.isNotEmpty(recommands)) { + Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), v -> v.getRecommendOrgName())); + list.forEach(it -> { + CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId())); + if (Objects.nonNull(one)) { + String recommendOrgName = collect.get(one.getRecommendId()); + it.setBreCommend(1); + it.setRecommendOrgName(recommendOrgName); + } else { + it.setBreCommend(0); + } + }); + } + } + + } return page; } @Override public PageList queryRecommendPageCasesV2(CasePageVo caseVo) { - PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex(), caseVo.getPageSize()); - Page cases = casesRecordDao.queryList(pageRequest, caseVo); - PageList pageList = new PageList<>(); - pageList.setCount((int) cases.getTotalElements()); - pageList.setPageSize(cases.getSize()); - pageList.setList(cases.getContent()); - return pageList; + PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex(), caseVo.getPageSize()); + Page cases = casesRecordDao.queryList(pageRequest, caseVo); + PageList pageList = new PageList<>(); + pageList.setCount((int) cases.getTotalElements()); + pageList.setPageSize(cases.getSize()); + pageList.setList(cases.getContent()); + return pageList; } /** diff --git a/servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java index 83a6610e..099018d4 100644 --- a/servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java +++ b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java @@ -25,6 +25,7 @@ class CasesServiceImplTest { // pageVo.setYears(ListUtil.toList(2023)); pageVo.setPageIndex(1); pageVo.setPageSize(10); + pageVo.setUserId("199"); pageVo.setExcellent(Boolean.TRUE); PageList casesV2 = casesService.queryPageCasesV2(pageVo); System.out.println(casesV2);