package com.ycl.utils;
|
|
import com.ycl.platform.domain.query.DataCenterQuery;
|
import org.springframework.data.domain.Sort;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.data.mongodb.core.query.TextCriteria;
|
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.StringUtils;
|
|
import java.lang.reflect.Field;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.regex.Pattern;
|
import java.util.stream.Collectors;
|
|
/**
|
* mongo工具类
|
*
|
* @author:xp
|
* @date:2024/8/2 15:18
|
*/
|
public class MongoUtil {
|
|
/**
|
* 构造数据中心搜索的条件
|
*
|
* @param params 数据中心请求参数
|
* @param timeFiled 时间字段是哪一个
|
* @param dataAuth 点位类型:null 所有 1 部级 2 省厅 3 重点 4 重点指挥 5 是否新设备
|
* @param likeFileds 使用like查询的字段
|
*/
|
public static Query getQuery(DataCenterQuery params, String timeFiled, List<String> likeFileds, Integer dataAuth) {
|
// 关键字
|
List<Criteria> likeList = null;
|
if (StringUtils.hasText(params.getKeyword()) && !CollectionUtils.isEmpty(likeFileds)) {
|
// 转义
|
String keyword = Pattern.quote(params.getKeyword());
|
likeList = likeFileds.stream().map(filed -> {
|
return Criteria.where(filed).regex(".*?" + keyword + ".*");
|
}).collect(Collectors.toList());
|
}
|
// 将like字段or起来
|
Criteria or = null;
|
if (! CollectionUtils.isEmpty(likeList)) {
|
or = new Criteria();
|
or.orOperator(likeList);
|
}
|
|
Criteria tag = null;
|
// in
|
if (Objects.nonNull(dataAuth)) {
|
switch (dataAuth) {
|
case 1:
|
tag = Criteria.where("deptTag").is(Boolean.TRUE);
|
break;
|
case 2:
|
tag = Criteria.where("provinceTag").is(Boolean.TRUE);
|
break;
|
case 3:
|
tag = Criteria.where("importantTag").is(Boolean.TRUE);
|
break;
|
case 4:
|
tag = Criteria.where("importantCommandImageTag").is(Boolean.TRUE);
|
break;
|
case 5:
|
tag = Criteria.where("newDevice").is(Boolean.TRUE);
|
break;
|
default:
|
break;
|
}
|
}
|
|
// 时间
|
Criteria time = Criteria.where(timeFiled).gte(params.getStartTime()).lte(params.getEndTime());
|
|
// 数据类型
|
Criteria dType = null;
|
if (params.getDataType().equals(1)) {
|
dType = Criteria.where("provinceTag").is(Boolean.TRUE);
|
}else if(params.getDataType().equals(2)){
|
dType = Criteria.where("deptTag").is(Boolean.TRUE);
|
}
|
|
// 将查询条件and起来
|
Criteria and = new Criteria();
|
List<Criteria> qList = new ArrayList<>(3);
|
qList.add(time);
|
if (Objects.nonNull(tag)) {
|
qList.add(tag);
|
}
|
if (Objects.nonNull(or)) {
|
qList.add(or);
|
}
|
if (Objects.nonNull(dType)) {
|
qList.add(dType);
|
}
|
and.andOperator(qList);
|
// 返回查询
|
return Query.query(and);
|
}
|
|
|
public static Query getQueryDataCenter(String deptCode, DataCenterQuery params, String timeFiled, List<String> likeFileds, Integer dataAuth,String fieldName) {
|
// 关键字模糊查询条件
|
List<Criteria> likeList = null;
|
if (StringUtils.hasText(params.getKeyword()) && !CollectionUtils.isEmpty(likeFileds)) {
|
// 转义特殊字符
|
String keyword = Pattern.quote(params.getKeyword());
|
likeList = likeFileds.stream()
|
.map(filed -> Criteria.where(filed).regex(".*?" + keyword + ".*"))
|
.collect(Collectors.toList());
|
}
|
|
// 将模糊查询字段用OR连接
|
Criteria or = null;
|
if (!CollectionUtils.isEmpty(likeList)) {
|
or = new Criteria();
|
or.orOperator(likeList);
|
}
|
|
// 数据权限标签条件
|
Criteria tag = null;
|
if (Objects.nonNull(dataAuth)) {
|
switch (dataAuth) {
|
case 1: tag = Criteria.where("deptTag").is(Boolean.TRUE); break;
|
case 2: tag = Criteria.where("provinceTag").is(Boolean.TRUE); break;
|
case 3: tag = Criteria.where("importantTag").is(Boolean.TRUE); break;
|
case 4: tag = Criteria.where("importantCommandImageTag").is(Boolean.TRUE); break;
|
case 5: tag = Criteria.where("newDevice").is(Boolean.TRUE); break;
|
default: break;
|
}
|
}
|
|
// 时间范围条件
|
Criteria time = Criteria.where(timeFiled).gte(params.getStartTime()).lte(params.getEndTime());
|
|
// 数据类型条件
|
Criteria dType = null;
|
if (params.getDataType().equals(1)) {
|
dType = Criteria.where("provinceTag").is(Boolean.TRUE);
|
} else if(params.getDataType().equals(2)) {
|
dType = Criteria.where("deptTag").is(Boolean.TRUE);
|
}
|
Criteria noStartsWithDept = null;
|
if("no".equals(fieldName)){
|
// 新增:no字段以deptCode开头的条件
|
|
if (StringUtils.hasText(deptCode)) {
|
// 使用正则表达式匹配开头,并转义特殊字符
|
noStartsWithDept = Criteria.where("no").regex("^" + Pattern.quote(deptCode));
|
}
|
}else if ("deviceNo".equals(fieldName)){
|
// 新增:no字段以deptCode开头的条件
|
if (StringUtils.hasText(deptCode)) {
|
// 使用正则表达式匹配开头,并转义特殊字符
|
noStartsWithDept = Criteria.where("deviceNo").regex("^" + Pattern.quote(deptCode));
|
}
|
}
|
|
|
// 将所有条件用AND连接
|
Criteria and = new Criteria();
|
List<Criteria> criteriaList = new ArrayList<>();
|
criteriaList.add(time); // 时间条件必须存在
|
|
// 可选条件
|
if (Objects.nonNull(tag)) criteriaList.add(tag);
|
if (Objects.nonNull(or)) criteriaList.add(or);
|
if (Objects.nonNull(dType)) criteriaList.add(dType);
|
if (Objects.nonNull(noStartsWithDept)) criteriaList.add(noStartsWithDept); // 新增条件
|
|
and.andOperator(criteriaList);
|
|
return Query.query(and);
|
}
|
|
|
|
/**
|
* 构造数据中心搜索的条件
|
*
|
* @param query 查询条件
|
* @param timeFiled 时间字段是哪一个
|
* @param params 请求参数
|
*/
|
public static void setPage(Query query,DataCenterQuery params, String timeFiled) {
|
// 排序分页
|
query.with(Sort.by(Sort.Order.desc(timeFiled))).skip(params.getSkipNum()).limit(Math.toIntExact(params.getPageSize()));
|
}
|
|
/**
|
* 构造数据中心搜索的条件
|
*
|
* @param query 查询条件
|
* @param timeFiled 时间字段是哪一个
|
* @param params 请求参数
|
*/
|
public static void setNoPage(Query query,DataCenterQuery params, String timeFiled) {
|
// 排序分页
|
query.with(Sort.by(Sort.Order.desc(timeFiled))).skip(params.getSkipNum());
|
}
|
/**
|
* 构造数据中心搜索的条件
|
*
|
* @param params 数据中心请求参数
|
* @param timeFiled 时间字段是哪一个
|
* @param dataAuth 点位类型:null 所有 1 部级 2 省厅 3 重点 4 重点指挥 5 是否新设备
|
* @param likeFileds 使用like查询的字段
|
*/
|
public static List<Criteria> getAndCriteria(DataCenterQuery params, String timeFiled, List<String> likeFileds, Integer dataAuth) {
|
// 关键字
|
List<Criteria> likeList = null;
|
if (StringUtils.hasText(params.getKeyword()) && !CollectionUtils.isEmpty(likeFileds)) {
|
// 转义
|
String keyword = Pattern.quote(params.getKeyword());
|
likeList = likeFileds.stream().map(filed -> {
|
return Criteria.where(filed).regex(".*?" + keyword + ".*");
|
}).collect(Collectors.toList());
|
}
|
// 将like字段or起来
|
Criteria or = null;
|
if (! CollectionUtils.isEmpty(likeList)) {
|
or = new Criteria();
|
or.orOperator(likeList);
|
}
|
|
Criteria tag = null;
|
// in
|
if (Objects.nonNull(dataAuth)) {
|
switch (dataAuth) {
|
case 1:
|
tag = Criteria.where("deptTag").is(Boolean.TRUE);
|
break;
|
case 2:
|
tag = Criteria.where("provinceTag").is(Boolean.TRUE);
|
break;
|
case 3:
|
tag = Criteria.where("importantTag").is(Boolean.TRUE);
|
break;
|
case 4:
|
tag = Criteria.where("importantCommandImageTag").is(Boolean.TRUE);
|
break;
|
case 5:
|
tag = Criteria.where("newDevice").is(Boolean.TRUE);
|
break;
|
default:
|
break;
|
}
|
}
|
|
// 时间
|
Criteria time = Criteria.where(timeFiled).gte(params.getStartTime()).lte(params.getEndTime());
|
|
// 数据类型
|
Criteria dType = null;
|
if (params.getDataType().equals(1)) {
|
dType = Criteria.where("provinceTag").is(Boolean.TRUE);
|
}else if(params.getDataType().equals(2)){
|
dType = Criteria.where("deptTag").is(Boolean.TRUE);
|
}
|
|
List<Criteria> qList = new ArrayList<>(3);
|
qList.add(time);
|
if (Objects.nonNull(tag)) {
|
qList.add(tag);
|
}
|
if (Objects.nonNull(or)) {
|
qList.add(or);
|
}
|
if (Objects.nonNull(dType)) {
|
qList.add(dType);
|
}
|
|
// 返回查询
|
return qList;
|
}
|
|
public static List<Criteria> getAndCriteriaDateCenter(String deptCode,DataCenterQuery params, String timeFiled, List<String> likeFileds, Integer dataAuth) {
|
// 关键字
|
List<Criteria> likeList = null;
|
if (StringUtils.hasText(params.getKeyword()) && !CollectionUtils.isEmpty(likeFileds)) {
|
// 转义
|
String keyword = Pattern.quote(params.getKeyword());
|
likeList = likeFileds.stream().map(filed -> {
|
return Criteria.where(filed).regex(".*?" + keyword + ".*");
|
}).collect(Collectors.toList());
|
}
|
// 将like字段or起来
|
Criteria or = null;
|
if (! CollectionUtils.isEmpty(likeList)) {
|
or = new Criteria();
|
or.orOperator(likeList);
|
}
|
|
Criteria tag = null;
|
// in
|
if (Objects.nonNull(dataAuth)) {
|
switch (dataAuth) {
|
case 1:
|
tag = Criteria.where("deptTag").is(Boolean.TRUE);
|
break;
|
case 2:
|
tag = Criteria.where("provinceTag").is(Boolean.TRUE);
|
break;
|
case 3:
|
tag = Criteria.where("importantTag").is(Boolean.TRUE);
|
break;
|
case 4:
|
tag = Criteria.where("importantCommandImageTag").is(Boolean.TRUE);
|
break;
|
case 5:
|
tag = Criteria.where("newDevice").is(Boolean.TRUE);
|
break;
|
default:
|
break;
|
}
|
}
|
|
// 时间
|
Criteria time = Criteria.where(timeFiled).gte(params.getStartTime()).lte(params.getEndTime());
|
|
// 数据类型
|
Criteria dType = null;
|
if (params.getDataType().equals(1)) {
|
dType = Criteria.where("provinceTag").is(Boolean.TRUE);
|
}else if(params.getDataType().equals(2)){
|
dType = Criteria.where("deptTag").is(Boolean.TRUE);
|
}
|
// 新增:no字段以deptCode开头的条件
|
Criteria noStartsWithDept = null;
|
if (StringUtils.hasText(deptCode)) {
|
// 使用正则表达式匹配开头,并转义特殊字符
|
noStartsWithDept = Criteria.where("deviceNo").regex("^" + Pattern.quote(deptCode));
|
}
|
|
List<Criteria> qList = new ArrayList<>(4);
|
|
|
qList.add(time);
|
if (Objects.nonNull(tag)) {
|
qList.add(tag);
|
}
|
if (Objects.nonNull(or)) {
|
qList.add(or);
|
}
|
if (Objects.nonNull(dType)) {
|
qList.add(dType);
|
}
|
if (Objects.nonNull(noStartsWithDept)) qList.add(noStartsWithDept);
|
|
// 返回查询
|
return qList;
|
}
|
}
|