From 7a697ff6041b46b72a63e0ea89443d5cddaa2761 Mon Sep 17 00:00:00 2001 From: Boolean Date: Thu, 22 Jun 2023 15:10:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E5=91=98=E6=A1=88=E4=BE=8B=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/boecase/api/CasesApi.java | 3 +- .../boecase/dao/CasesMajorTypeRepoDao.java | 16 +++ .../module/boecase/dao/CasesRecordDao.java | 3 +- .../xboe/module/boecase/dto/CasePageVo.java | 2 +- .../com/xboe/module/boecase/dto/PageDto.java | 4 +- .../service/impl/CasesServiceImpl.java | 107 ++++++++++++++++-- .../com/xboe/orm/CustomFieldInFilter.java | 26 +++++ .../src/main/resources/log/logback-dev.xml | 2 +- .../dao/CasesMajorTypeRepoDaoTest.java | 28 +++++ .../boecase/dao/CasesRecordDaoTest.java | 21 ++++ .../service/impl/CasesServiceImplTest.java | 32 ++++++ 11 files changed, 227 insertions(+), 17 deletions(-) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDao.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/orm/CustomFieldInFilter.java create mode 100644 servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDaoTest.java create mode 100644 servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesRecordDaoTest.java create mode 100644 servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java 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 3da88829..e7d7160d 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 @@ -17,6 +17,7 @@ import com.xboe.module.dict.entity.DictItem; import com.xboe.module.excel.ExportsExcelSenderUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -104,7 +105,7 @@ public class CasesApi extends ApiBaseController { } @PostMapping("/queryListV2") - public JsonResponse> queryCaseBreV2(@RequestBody CasePageVo req){ + public JsonResponse> queryCaseBreV2(@Validated CasePageVo req){ String type = req.getType(); PageList views = null; if (type.equals("recommend")) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDao.java new file mode 100644 index 00000000..a865d3ac --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDao.java @@ -0,0 +1,16 @@ +package com.xboe.module.boecase.dao; + +import com.xboe.module.boecase.entity.CasesMajorType; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface CasesMajorTypeRepoDao extends JpaRepository, JpaSpecificationExecutor { + + @Query(nativeQuery = true, value = "select * from boe_cases_major_type as c where major_id in (:marjorIds) group by c.case_id") + List findCasesBy(List marjorIds); +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java index 24a92f4b..941dafbd 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java @@ -18,6 +18,7 @@ import org.springframework.stereotype.Repository; @Repository public interface CasesRecordDao extends JpaRepository, JpaSpecificationExecutor { + @Query(nativeQuery = true, value = "select b.* from boe_cases_recommend_push_record a LEFT JOIN boe_cases b on. a.case_id = b.id and b.deleted=false " + " where a.deleted=false and a.push_user_id= :#{#condition.userId}" + " and if(:#{#condition.keyWord} is not null,b.title like CONCAT('%',:#{#condition.keyWord},'%')" + @@ -28,7 +29,7 @@ public interface CasesRecordDao extends JpaRepository, JpaSpecifi " or b.keyword4 like CONCAT('%',:#{#condition.keyWord},'%')" + " or b.keyword5 like CONCAT('%',:#{#condition.keyWord},'%'),1=1)" + " and if(:#{#condition.years} is not null ,YEAR(b.sys_create_time) in (:#{#condition.years}),1=1 )" + - " and if(:#{#condition.majorType} is nto null ,b.major_type = :#{#condition.majorType},1=1) " + + " and if(:#{#condition.majorType} is not null ,b.major_type = :#{#condition.majorType},1=1) " + " and if(:#{#condition.org1} is not null,b.org_domain_parent in (:#{#condition.org1}),1=1)" + " and if(:#{#condition.org2} is not null,b.org_domain_parent2 in (:#{#condition.org2}),1=1)" + " and if(:#{#condition.org3} is not null,b.org_domain_parent3 in (:#{#condition.org3}),1=1)" + 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 c3a615a5..5e2024fe 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 @@ -41,7 +41,7 @@ public class CasePageVo extends PageDto { private String authorName; - private List years; + private List years; /** * 已经返回给前端的案例需要过滤掉 diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/PageDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/PageDto.java index c62be937..fee85f15 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/PageDto.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dto/PageDto.java @@ -5,6 +5,6 @@ import lombok.Data; @Data public class PageDto { - private int pageIndex = 1; - private int pageSize = 10; + private Integer pageIndex = 1; + private Integer pageSize = 10; } 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 50f65a04..b1893848 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 @@ -1,5 +1,8 @@ package com.xboe.module.boecase.service.impl; +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.PageList; import com.xboe.common.utils.IDGenerator; @@ -7,6 +10,7 @@ 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.dto.*; import com.xboe.module.boecase.entity.Cases; @@ -14,6 +18,7 @@ import com.xboe.module.boecase.entity.CasesMajorType; import com.xboe.module.boecase.service.ICasesService; import com.xboe.module.dict.dao.SysDictionaryDao; import com.xboe.module.dict.entity.DictItem; +import com.xboe.orm.CustomFieldInFilter; import com.xboe.school.vo.CasesVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -22,11 +27,15 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import javax.annotation.Resource; +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.stream.Collectors; @Slf4j @Service @@ -45,6 +54,12 @@ public class CasesServiceImpl implements ICasesService { @Resource private CasesRecordDao casesRecordDao; + @Resource + private CasesMajorTypeRepoDao casesMajorTypeRepoDao; + + @PersistenceContext + private EntityManager entityManager; + /** * 案例分页查询,用于门户的查询 */ @@ -84,11 +99,7 @@ public class CasesServiceImpl implements ICasesService { filters.add(FieldFilters.isNotNull("filePath")); filters.add(FieldFilters.ne("filePath", "")); -// if(StringUtil.isNotBlank(caseVo.getMajorType())){ -// filters.add(FieldFilters.eq("majorType",caseVo.getMajorType())); -// } if (StringUtil.isNotBlank(caseVo.getMajorType())) { - QueryBuilder from = QueryBuilder.from(CasesMajorType.class); //前端直接字符串拼接传,后端转化数组 if (caseVo.getMajorType().contains(",")) { @@ -165,13 +176,87 @@ public class CasesServiceImpl implements ICasesService { */ @Override public PageList queryPageCasesV2(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; + + String keyword = caseVo.getKeyWord(); + QueryBuilder query=QueryBuilder.from(Cases.class); + PageList page=null; + List filters = 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())); + likes.add(FieldFilters.like("keyword2", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); + likes.add(FieldFilters.like("keyword3", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); + likes.add(FieldFilters.like("keyword4", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); + likes.add(FieldFilters.like("keyword5", LikeMatchMode.ANYWHERE, caseVo.getKeyWord())); + List notInIds = caseVo.getNotInIds(); + if (CollUtil.isNotEmpty(notInIds)) { + filters.add(FieldFilters.notIn("id", notInIds)); + } + + 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(FieldFilters.isNotNull("filePath")); + filters.add(FieldFilters.ne("filePath","")); + + 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()); + query.addFilter(FieldFilters.in("id",caseIds)); + }else { + return page; + } + } + + 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(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())); + } + 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"); + } + + query.addFilters(filters); + query.addOrder(order); + query.addOrder(OrderCondition.rand()); + query.setPageIndex(caseVo.getPageIndex()); + query.setPageSize(caseVo.getPageSize()); + page = casesDao.findPage(query.builder()); + + return page; } @Override diff --git a/servers/boe-server-all/src/main/java/com/xboe/orm/CustomFieldInFilter.java b/servers/boe-server-all/src/main/java/com/xboe/orm/CustomFieldInFilter.java new file mode 100644 index 00000000..997edcf7 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/orm/CustomFieldInFilter.java @@ -0,0 +1,26 @@ +package com.xboe.orm; + +import com.xboe.common.beans.KeyValue; +import com.xboe.core.orm.impl.FieldInFilter; + +import java.util.Collection; + +public class CustomFieldInFilter extends FieldInFilter { + + private String param; + + public CustomFieldInFilter(String name,String param, Collection values) { + super(name, values); + this.param = param; + } + + @Override + public String getNamed(String name, int order) { + return super.getNamed(param, order); + } + + @Override + public String getNamed(String pre, String name, int order) { + return super.getNamed(pre, param, order); + } +} diff --git a/servers/boe-server-all/src/main/resources/log/logback-dev.xml b/servers/boe-server-all/src/main/resources/log/logback-dev.xml index 1d75bbe3..00672a79 100644 --- a/servers/boe-server-all/src/main/resources/log/logback-dev.xml +++ b/servers/boe-server-all/src/main/resources/log/logback-dev.xml @@ -1,7 +1,7 @@ - + diff --git a/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDaoTest.java b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDaoTest.java new file mode 100644 index 00000000..38a3d4d3 --- /dev/null +++ b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesMajorTypeRepoDaoTest.java @@ -0,0 +1,28 @@ +package com.xboe.module.boecase.dao; + +import com.xboe.module.boecase.entity.CasesMajorType; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("dev") +class CasesMajorTypeRepoDaoTest { + + @Autowired + private CasesMajorTypeRepoDao casesMajorTypeRepoDao; + + @Test + void findCasesBy() { + ArrayList params = new ArrayList<>(); + params.add("27737267694995149"); + List majorTypes = casesMajorTypeRepoDao.findCasesBy(params); + System.out.println(majorTypes); + } +} \ No newline at end of file diff --git a/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesRecordDaoTest.java b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesRecordDaoTest.java new file mode 100644 index 00000000..5dec4da4 --- /dev/null +++ b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/dao/CasesRecordDaoTest.java @@ -0,0 +1,21 @@ +package com.xboe.module.boecase.dao; + +import com.xboe.module.boecase.dto.CasePageVo; +import com.xboe.module.boecase.entity.Cases; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.test.context.ActiveProfiles; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("dev") +class CasesRecordDaoTest { + + @Autowired + private CasesRecordDao casesRecordDao; + +} \ No newline at end of file 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 new file mode 100644 index 00000000..83a6610e --- /dev/null +++ b/servers/boe-server-all/src/test/java/com/xboe/module/boecase/service/impl/CasesServiceImplTest.java @@ -0,0 +1,32 @@ +package com.xboe.module.boecase.service.impl; + +import cn.hutool.core.collection.ListUtil; +import com.xboe.common.PageList; +import com.xboe.module.boecase.dto.CasePageVo; +import com.xboe.module.boecase.entity.Cases; +import com.xboe.module.boecase.service.ICasesService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("dev") +class CasesServiceImplTest { + + @Autowired + private ICasesService casesService; + + @Test + void queryPageCasesV2() { + CasePageVo pageVo = new CasePageVo(); +// pageVo.setYears(ListUtil.toList(2023)); + pageVo.setPageIndex(1); + pageVo.setPageSize(10); + pageVo.setExcellent(Boolean.TRUE); + PageList casesV2 = casesService.queryPageCasesV2(pageVo); + System.out.println(casesV2); + } +} \ No newline at end of file