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 likeFileds, Integer dataAuth) { // 关键字 List 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 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 likeFileds, Integer dataAuth,String fieldName) { // 关键字模糊查询条件 List 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 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 getAndCriteria(DataCenterQuery params, String timeFiled, List likeFileds, Integer dataAuth) { // 关键字 List 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 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 getAndCriteriaDateCenter(String deptCode,DataCenterQuery params, String timeFiled, List likeFileds, Integer dataAuth) { // 关键字 List 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 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; } }