集成QuerySDL
parent
4e8002c4f9
commit
762bd28b8b
@ -0,0 +1,20 @@
|
|||||||
|
package com.baiye.config;
|
||||||
|
|
||||||
|
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import javax.persistence.EntityManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author YQY
|
||||||
|
* @Date 2023/7/4
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
public class JPAQueryFactoryConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
|
||||||
|
return new JPAQueryFactory(entityManager);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,308 @@
|
|||||||
|
package com.baiye.module.dao;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.baiye.constant.DefaultNumberConstants;
|
||||||
|
import com.baiye.constant.KeyFieldConstants;
|
||||||
|
import com.baiye.exception.BadRequestException;
|
||||||
|
import com.baiye.feign.TaskClient;
|
||||||
|
import com.baiye.model.dto.ClueDto;
|
||||||
|
import com.baiye.model.dto.ClueQueryCriteria;
|
||||||
|
import com.baiye.model.entity.QBaseClueMiddle;
|
||||||
|
import com.baiye.model.vo.ResSourceLabel;
|
||||||
|
import com.baiye.module.entity.QClue;
|
||||||
|
import com.baiye.module.entity.QClueMiddle;
|
||||||
|
import com.baiye.module.entity.QClueTalk;
|
||||||
|
import com.baiye.util.RedisUtils;
|
||||||
|
import com.baiye.util.ValidationUtil;
|
||||||
|
import com.querydsl.core.BooleanBuilder;
|
||||||
|
import com.querydsl.core.types.Expression;
|
||||||
|
import com.querydsl.core.types.Projections;
|
||||||
|
import com.querydsl.core.types.dsl.Expressions;
|
||||||
|
import com.querydsl.jpa.impl.JPAQuery;
|
||||||
|
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author YQY
|
||||||
|
* @Date 2023/7/4
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class ClueQueryDSL {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private JPAQueryFactory jpaQueryFactory;
|
||||||
|
@Resource
|
||||||
|
private RedisUtils redisUtils;
|
||||||
|
@Resource
|
||||||
|
private TaskClient taskClient;
|
||||||
|
|
||||||
|
private final QClue qClue = QClue.clue;
|
||||||
|
private final QClueMiddle qClueMiddle = QClueMiddle.clueMiddle;
|
||||||
|
private final QClueTalk qClueTalk = QClueTalk.clueTalk;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联合查询"crm"线索
|
||||||
|
*/
|
||||||
|
public List<ClueDto> getCRMClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
|
||||||
|
JPAQuery<ClueDto> query =
|
||||||
|
jpaQueryFactory.select(
|
||||||
|
Projections.bean(
|
||||||
|
ClueDto.class,
|
||||||
|
cluePojo(DefaultNumberConstants.ONE_NUMBER)
|
||||||
|
)).from(qClue)
|
||||||
|
.innerJoin(qClueMiddle)
|
||||||
|
.on(qClue.id.eq(qClueMiddle.clueId))
|
||||||
|
.where(this.builder(clueQueryCriteria, DefaultNumberConstants.ONE_NUMBER))
|
||||||
|
.orderBy(qClue.createTime.desc(), qClue.id.desc());
|
||||||
|
if (pageable != null) {
|
||||||
|
query.offset((long) pageable.getPageNumber() * pageable.getPageSize()).limit(pageable.getPageSize());
|
||||||
|
}
|
||||||
|
return this.dataHandle(query.fetch(), clueQueryCriteria.getIsAdmin());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联合分页查询"crm"线索的"总条数"
|
||||||
|
*/
|
||||||
|
public Long getCRMCount(ClueQueryCriteria clueQueryCriteria) {
|
||||||
|
return jpaQueryFactory.select(
|
||||||
|
QClue.clue.count()
|
||||||
|
).from(QClue.clue)
|
||||||
|
.innerJoin(QClueMiddle.clueMiddle)
|
||||||
|
.on(QClue.clue.id.eq(QClueMiddle.clueMiddle.clueId))
|
||||||
|
.where(this.builder(clueQueryCriteria, DefaultNumberConstants.ONE_NUMBER))
|
||||||
|
.fetchOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联合查询"拓客"线索
|
||||||
|
*/
|
||||||
|
public List<ClueDto> getTalkClueList(ClueQueryCriteria clueQueryCriteria, Pageable pageable) {
|
||||||
|
JPAQuery<ClueDto> query =
|
||||||
|
jpaQueryFactory.select(
|
||||||
|
Projections.bean(
|
||||||
|
ClueDto.class,
|
||||||
|
cluePojo(DefaultNumberConstants.TWO_NUMBER)
|
||||||
|
)).from(qClue)
|
||||||
|
.innerJoin(qClueTalk)
|
||||||
|
.on(qClue.id.eq(qClueTalk.clueId))
|
||||||
|
.where(this.builder(clueQueryCriteria, DefaultNumberConstants.TWO_NUMBER))
|
||||||
|
.orderBy(qClue.createTime.desc(), qClue.id.desc());
|
||||||
|
if (pageable != null) {
|
||||||
|
query.offset((long) pageable.getPageNumber() * pageable.getPageSize()).limit(pageable.getPageSize());
|
||||||
|
}
|
||||||
|
return this.dataHandle(query.fetch(), clueQueryCriteria.getIsAdmin());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 联合分页查询"拓客"线索的"总条数"
|
||||||
|
*/
|
||||||
|
public Long getTalkCount(ClueQueryCriteria clueQueryCriteria) {
|
||||||
|
return jpaQueryFactory.select(
|
||||||
|
QClue.clue.count()
|
||||||
|
).from(QClue.clue)
|
||||||
|
.innerJoin(QClueTalk.clueTalk)
|
||||||
|
.on(QClue.clue.id.eq(QClueTalk.clueTalk.clueId))
|
||||||
|
.where(this.builder(clueQueryCriteria, DefaultNumberConstants.TWO_NUMBER))
|
||||||
|
.fetchOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表字段映射
|
||||||
|
*
|
||||||
|
* @param type 1:crm中间表映射 2:拓客线索中间表映射
|
||||||
|
*/
|
||||||
|
public Expression<?>[] cluePojo(Integer type) {
|
||||||
|
QBaseClueMiddle qBaseClueMiddle;
|
||||||
|
if (type == DefaultNumberConstants.ONE_NUMBER) qBaseClueMiddle = qClueMiddle._super;
|
||||||
|
else qBaseClueMiddle = qClueTalk._super;
|
||||||
|
|
||||||
|
Expression<?>[] expressions = new Expression[]{
|
||||||
|
qBaseClueMiddle.clueStage, qBaseClueMiddle.clueStageTime, qBaseClueMiddle.clueCallStatus, qBaseClueMiddle.organizeId,
|
||||||
|
qBaseClueMiddle.memberId, qBaseClueMiddle.taskId, qBaseClueMiddle.memberStatus, qBaseClueMiddle.sourceLabel, qBaseClueMiddle.labelTime,
|
||||||
|
qBaseClueMiddle.newestCallTime, qBaseClueMiddle.remark, qBaseClueMiddle.publicPoolStatus, qBaseClueMiddle.turnoverAmount, qBaseClueMiddle.clueType
|
||||||
|
};
|
||||||
|
Expression<?>[] clueExpressions = new Expression[]{
|
||||||
|
qClue.id, qClue.audioUrl, qClue.gender, qClue.name, qClue.nid, qClue.wx, qClue.routeId,
|
||||||
|
qClue.amount, qClue.collectTime, qClue.address, qClue.platform, qClue.recordId, qClue.createBy,
|
||||||
|
qClue.createTime, qClue.updateTime, qClue.isEncryption, qClue.tag
|
||||||
|
};
|
||||||
|
Expression<?>[] allData = ArrayUtil.addAll(expressions, clueExpressions);
|
||||||
|
if (type == DefaultNumberConstants.TWO_NUMBER) {
|
||||||
|
Expression<?>[] talkArr = new Expression[]{qClueTalk.isFreeze};
|
||||||
|
allData = ArrayUtil.addAll(allData, talkArr);
|
||||||
|
}
|
||||||
|
return allData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建查询条件
|
||||||
|
*
|
||||||
|
* @param type 1:crm中间表 2:拓客线索中间表
|
||||||
|
*/
|
||||||
|
private BooleanBuilder builder(ClueQueryCriteria clueQuery, Integer type) {
|
||||||
|
Integer memberStatus = clueQuery.getMemberStatus();
|
||||||
|
Boolean isAdmin = clueQuery.getIsAdmin();
|
||||||
|
List<Timestamp> newestCallTimeList = clueQuery.getNewestCallTime();
|
||||||
|
List<Timestamp> createTime = clueQuery.getCreateTime();
|
||||||
|
|
||||||
|
QBaseClueMiddle qBaseClueMiddle;
|
||||||
|
if (type == DefaultNumberConstants.ONE_NUMBER)
|
||||||
|
qBaseClueMiddle = qClueMiddle._super;
|
||||||
|
else
|
||||||
|
qBaseClueMiddle = qClueTalk._super;
|
||||||
|
|
||||||
|
BooleanBuilder builder = new BooleanBuilder();
|
||||||
|
if (clueQuery.getId() != null) {
|
||||||
|
builder.and(qClue.id.eq(clueQuery.getId()));
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(clueQuery.getNid())) {
|
||||||
|
builder.and(qClue.nid.eq(clueQuery.getNid()));
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotBlank(clueQuery.getName())) {
|
||||||
|
builder.and(qClue.name.like("%".concat(clueQuery.getName()).concat("%")));
|
||||||
|
}
|
||||||
|
if (clueQuery.getRouteId() != null) {
|
||||||
|
builder.and(qClue.routeId.eq(clueQuery.getRouteId()));
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(clueQuery.getRouteIdList())) {
|
||||||
|
builder.and(qClue.routeId.in(clueQuery.getRouteIdList()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getUserId() != null) {
|
||||||
|
builder.and(qClue.createBy.eq(clueQuery.getUserId()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getMemberId() != null && !isAdmin) {
|
||||||
|
builder.and(qBaseClueMiddle.memberId.eq(clueQuery.getMemberId()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getUserIdList() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.memberId.in(clueQuery.getUserIdList()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getOrganizeId() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.organizeId.eq(clueQuery.getOrganizeId()));
|
||||||
|
}
|
||||||
|
if (memberStatus != null) {
|
||||||
|
if (isAdmin) {
|
||||||
|
if (memberStatus == 0) {
|
||||||
|
builder.and(qBaseClueMiddle.memberId.isNull());
|
||||||
|
}
|
||||||
|
if (memberStatus > 0) {
|
||||||
|
builder.and(qBaseClueMiddle.memberId.isNotNull());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
builder.and(qBaseClueMiddle.memberStatus.eq(memberStatus));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotEmpty(clueQuery.getLabel())) {
|
||||||
|
builder.and(Expressions.booleanTemplate("LOWER({0}) LIKE LOWER({1})", qBaseClueMiddle.sourceLabel, "%" + clueQuery.getLabel() + "%"));
|
||||||
|
}
|
||||||
|
if (clueQuery.getClueCallStatus() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.clueCallStatus.eq(clueQuery.getClueCallStatus()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getClueStage() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.clueStage.eq(clueQuery.getClueStage()));
|
||||||
|
}
|
||||||
|
if (createTime != null && createTime.size() == 2) {
|
||||||
|
Date createTimeBegin = new Date(createTime.get(0).getTime());
|
||||||
|
Date createTimeEnd = new Date(createTime.get(1).getTime());
|
||||||
|
builder.and(qBaseClueMiddle.createTime.between(createTimeBegin, createTimeEnd));
|
||||||
|
}
|
||||||
|
if (newestCallTimeList != null && newestCallTimeList.size() == 2) {
|
||||||
|
Date beginTime = new Date(newestCallTimeList.get(0).getTime());
|
||||||
|
Date endTime = new Date(newestCallTimeList.get(1).getTime());
|
||||||
|
builder.and(qBaseClueMiddle.newestCallTime.between(beginTime, endTime));
|
||||||
|
}
|
||||||
|
if (clueQuery.getClueType() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.clueType.eq(clueQuery.getClueType()));
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(clueQuery.getClueTypes())) {
|
||||||
|
builder.and(qBaseClueMiddle.clueType.in(clueQuery.getClueTypes()));
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(clueQuery.getTaskIds())) {
|
||||||
|
builder.and(qBaseClueMiddle.taskId.in(clueQuery.getTaskIds()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getPublicPoolStatus() != null) {
|
||||||
|
builder.and(qBaseClueMiddle.publicPoolStatus.eq(clueQuery.getPublicPoolStatus()));
|
||||||
|
}
|
||||||
|
if (clueQuery.getIsFreeze() != null) {
|
||||||
|
builder.and(qClueTalk.isFreeze.eq(clueQuery.getIsFreeze()));
|
||||||
|
}
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询结果 数据处理(手机号解密...)
|
||||||
|
*/
|
||||||
|
private List<ClueDto> dataHandle(List<ClueDto> result, boolean isAdmin) {
|
||||||
|
for (ClueDto clueDto : result) {
|
||||||
|
//查看任务是否需要加密显示资源
|
||||||
|
String taskEncryption = String.valueOf(redisUtils.get(KeyFieldConstants.TASK_ENCRYPTION_KEY + clueDto.getTaskId()));
|
||||||
|
if (StringUtils.isBlank(taskEncryption) || taskEncryption.equals("null")) {
|
||||||
|
ResponseEntity<Map<String, Object>> response = taskClient.findRedisTask(clueDto.getTaskId(), 1);
|
||||||
|
if (response.getStatusCode().value() != 200) {
|
||||||
|
throw new BadRequestException("获取加密信息错误");
|
||||||
|
}
|
||||||
|
taskEncryption = String.valueOf(Objects.requireNonNull(response.getBody()).get(KeyFieldConstants.TASK_ENCRYPTION_KEY));
|
||||||
|
}
|
||||||
|
int encryption = ValidationUtil.isInteger(taskEncryption)
|
||||||
|
? Integer.parseInt(taskEncryption) : DefaultNumberConstants.ZERO_NUMBER;
|
||||||
|
//处理手机号显示是否用****隐藏,管理员查看任务下的资源不需要加密(isAdmin控制)
|
||||||
|
String nid = clueDto.getNid();
|
||||||
|
if (StringUtils.isNotBlank(nid)) {
|
||||||
|
//投流线索 返回处理
|
||||||
|
Integer clueType = clueDto.getClueType();
|
||||||
|
if (clueType != null && clueType == 4) {
|
||||||
|
clueDto.setNid(RandomUtil.randomString(22));
|
||||||
|
} else if (clueType != null && clueType == 5
|
||||||
|
&& encryption > DefaultNumberConstants.ZERO_NUMBER) {
|
||||||
|
nid = Integer.parseInt(taskEncryption) == DefaultNumberConstants.ONE_NUMBER
|
||||||
|
? nid.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")
|
||||||
|
: RandomUtil.randomString(22);
|
||||||
|
clueDto.setNid(nid);
|
||||||
|
} else {
|
||||||
|
//查看资源是否需要加密显示-任务是否需要加密(注:资源加密 > 任务加密优先级)
|
||||||
|
if (clueDto.getIsEncryption() != null && clueDto.getIsEncryption() == 1) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder(nid);
|
||||||
|
nid = stringBuilder.replace(3, 7, "****").toString();
|
||||||
|
} else {
|
||||||
|
if (!isAdmin && (taskEncryption.equals("1"))) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder(nid);
|
||||||
|
nid = stringBuilder.replace(3, 7, "****").toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clueDto.setNid(nid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询资源标签(2023/07/05 暂不使用)
|
||||||
|
*/
|
||||||
|
public List<ResSourceLabel> findSourceLabel(List<Long> clueIds) {
|
||||||
|
return jpaQueryFactory.select(
|
||||||
|
Projections.bean(
|
||||||
|
ResSourceLabel.class,
|
||||||
|
qClue.nid,
|
||||||
|
qClue.createTime,
|
||||||
|
qClue.name,
|
||||||
|
qClueMiddle.clueId,
|
||||||
|
qClueMiddle.remark,
|
||||||
|
qClueMiddle.sourceLabel,
|
||||||
|
qClueMiddle.clueStage
|
||||||
|
)).from(qClue)
|
||||||
|
.innerJoin(qClueMiddle)
|
||||||
|
.on(qClue.id.eq(qClueMiddle.clueId))
|
||||||
|
.where(qClueMiddle.clueId.in(clueIds))
|
||||||
|
.fetch();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue