ycl-server/src/main/java/com/ycl/utils/MongoUtil.java
@@ -13,6 +13,8 @@
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * mongo工具类
@@ -26,40 +28,156 @@
     * 构造数据中心搜索的条件
     *
     * @param params 数据中心请求参数
     * @param gbFiled 国标码字段是哪一个
     * @param timeFiled 时间字段是哪一个
     * @param gbList 国标码
     * @param dataAuth 点位类型:null 所有  1 部级  2 省厅  3 重点  4 重点指挥  5 是否新设备
     * @param likeFileds 使用like查询的字段
     */
    public static Query getQuery(DataCenterQuery params, String gbFiled, String timeFiled, List<String> gbList) {
    public static Query getQuery(DataCenterQuery params, String timeFiled, List<String> likeFileds, Integer dataAuth) {
        // 关键字
        TextCriteria text = null;
        if (StringUtils.hasText(params.getKeyword())) {
            text = TextCriteria.forDefaultLanguage().matching(params.getKeyword());
        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 in = null;
        Criteria tag = null;
        // in
        if (! CollectionUtils.isEmpty(gbList)) {
            in = Criteria.where(gbFiled).in(gbList);
        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);
        if (Objects.nonNull(text)) {
            qList.add(Criteria.byExample(text));
        }
        if (Objects.nonNull(in)) {
            qList.add(in);
        }
        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);
    }
    /**
     * 构造数据中心搜索的条件
@@ -73,4 +191,167 @@
        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;
    }
}