集成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