学员案例列表查询逻辑优化

This commit is contained in:
Boolean
2023-06-22 15:10:04 +08:00
parent a6b8584fef
commit 7a697ff604
11 changed files with 227 additions and 17 deletions

View File

@@ -17,6 +17,7 @@ import com.xboe.module.dict.entity.DictItem;
import com.xboe.module.excel.ExportsExcelSenderUtil; import com.xboe.module.excel.ExportsExcelSenderUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -104,7 +105,7 @@ public class CasesApi extends ApiBaseController {
} }
@PostMapping("/queryListV2") @PostMapping("/queryListV2")
public JsonResponse<PageList<Cases>> queryCaseBreV2(@RequestBody CasePageVo req){ public JsonResponse<PageList<Cases>> queryCaseBreV2(@Validated CasePageVo req){
String type = req.getType(); String type = req.getType();
PageList<Cases> views = null; PageList<Cases> views = null;
if (type.equals("recommend")) { if (type.equals("recommend")) {

View File

@@ -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<CasesMajorType, String>, JpaSpecificationExecutor<CasesMajorType> {
@Query(nativeQuery = true, value = "select * from boe_cases_major_type as c where major_id in (:marjorIds) group by c.case_id")
List<CasesMajorType> findCasesBy(List<String> marjorIds);
}

View File

@@ -18,6 +18,7 @@ import org.springframework.stereotype.Repository;
@Repository @Repository
public interface CasesRecordDao extends JpaRepository<Cases, String>, JpaSpecificationExecutor<Cases> { public interface CasesRecordDao extends JpaRepository<Cases, String>, JpaSpecificationExecutor<Cases> {
@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 " + @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}" + " where a.deleted=false and a.push_user_id= :#{#condition.userId}" +
" and if(:#{#condition.keyWord} is not null,b.title like CONCAT('%',:#{#condition.keyWord},'%')" + " and if(:#{#condition.keyWord} is not null,b.title like CONCAT('%',:#{#condition.keyWord},'%')" +
@@ -28,7 +29,7 @@ public interface CasesRecordDao extends JpaRepository<Cases, String>, JpaSpecifi
" or b.keyword4 like CONCAT('%',:#{#condition.keyWord},'%')" + " or b.keyword4 like CONCAT('%',:#{#condition.keyWord},'%')" +
" or b.keyword5 like CONCAT('%',:#{#condition.keyWord},'%'),1=1)" + " 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.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.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.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)" + " and if(:#{#condition.org3} is not null,b.org_domain_parent3 in (:#{#condition.org3}),1=1)" +

View File

@@ -41,7 +41,7 @@ public class CasePageVo extends PageDto {
private String authorName; private String authorName;
private List<String> years; private List<Object> years;
/** /**
* 已经返回给前端的案例需要过滤掉 * 已经返回给前端的案例需要过滤掉

View File

@@ -5,6 +5,6 @@ import lombok.Data;
@Data @Data
public class PageDto { public class PageDto {
private int pageIndex = 1; private Integer pageIndex = 1;
private int pageSize = 10; private Integer pageSize = 10;
} }

View File

@@ -1,5 +1,8 @@
package com.xboe.module.boecase.service.impl; 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.OrderCondition;
import com.xboe.common.PageList; import com.xboe.common.PageList;
import com.xboe.common.utils.IDGenerator; import com.xboe.common.utils.IDGenerator;
@@ -7,6 +10,7 @@ import com.xboe.common.utils.StringUtil;
import com.xboe.core.orm.*; import com.xboe.core.orm.*;
import com.xboe.module.boecase.dao.CasesDao; import com.xboe.module.boecase.dao.CasesDao;
import com.xboe.module.boecase.dao.CasesMajorTypeDao; 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.CasesRecordDao;
import com.xboe.module.boecase.dto.*; import com.xboe.module.boecase.dto.*;
import com.xboe.module.boecase.entity.Cases; 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.boecase.service.ICasesService;
import com.xboe.module.dict.dao.SysDictionaryDao; import com.xboe.module.dict.dao.SysDictionaryDao;
import com.xboe.module.dict.entity.DictItem; import com.xboe.module.dict.entity.DictItem;
import com.xboe.orm.CustomFieldInFilter;
import com.xboe.school.vo.CasesVo; import com.xboe.school.vo.CasesVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -22,11 +27,15 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service @Service
@@ -45,6 +54,12 @@ public class CasesServiceImpl implements ICasesService {
@Resource @Resource
private CasesRecordDao casesRecordDao; 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.isNotNull("filePath"));
filters.add(FieldFilters.ne("filePath", "")); filters.add(FieldFilters.ne("filePath", ""));
// if(StringUtil.isNotBlank(caseVo.getMajorType())){
// filters.add(FieldFilters.eq("majorType",caseVo.getMajorType()));
// }
if (StringUtil.isNotBlank(caseVo.getMajorType())) { if (StringUtil.isNotBlank(caseVo.getMajorType())) {
QueryBuilder from = QueryBuilder.from(CasesMajorType.class); QueryBuilder from = QueryBuilder.from(CasesMajorType.class);
//前端直接字符串拼接传,后端转化数组 //前端直接字符串拼接传,后端转化数组
if (caseVo.getMajorType().contains(",")) { if (caseVo.getMajorType().contains(",")) {
@@ -165,13 +176,87 @@ public class CasesServiceImpl implements ICasesService {
*/ */
@Override @Override
public PageList<Cases> queryPageCasesV2(CasePageVo caseVo) { public PageList<Cases> queryPageCasesV2(CasePageVo caseVo) {
PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex(), caseVo.getPageSize());
Page<Cases> cases = casesRecordDao.queryList(pageRequest, caseVo); String keyword = caseVo.getKeyWord();
PageList<Cases> pageList = new PageList<>(); QueryBuilder query=QueryBuilder.from(Cases.class);
pageList.setCount((int) cases.getTotalElements()); PageList<Cases> page=null;
pageList.setPageSize(cases.getSize()); List<IFieldFilter> filters = new ArrayList<>();
pageList.setList(cases.getContent()); filters.add(FieldFilters.eq("deleted",false));
return pageList; List<IFieldFilter> likes=new ArrayList<IFieldFilter>();
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<Long> notInIds = caseVo.getNotInIds();
if (CollUtil.isNotEmpty(notInIds)) {
filters.add(FieldFilters.notIn("id", notInIds));
}
if(StringUtil.isNotBlank(caseVo.getKeyWord())) {
filters.add(FieldFilters.or(likes));
}
//创建时间过滤
List<Object> 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<CasesMajorType> casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ","));
if(CollUtil.isNotEmpty(casesTypes)){
List<String> 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 @Override

View File

@@ -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<Object> 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);
}
}

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="false"> <configuration debug="false" scan="false">
<springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/> <springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/>
<property name="log.path" value="/app/logs/${spring.application.name}"/> <property name="log.path" value="~/app/logs/${spring.application.name}"/>
<!-- 彩色日志格式 --> <!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN" <property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

View File

@@ -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<String> params = new ArrayList<>();
params.add("27737267694995149");
List<CasesMajorType> majorTypes = casesMajorTypeRepoDao.findCasesBy(params);
System.out.println(majorTypes);
}
}

View File

@@ -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;
}

View File

@@ -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<Cases> casesV2 = casesService.queryPageCasesV2(pageVo);
System.out.println(casesV2);
}
}