fuliqi
2024-11-01 b91945ea32378a71d1e57356af6e16703a1ceaa7
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -1,5 +1,6 @@
package com.ycl.platform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.pagehelper.Page;
@@ -12,7 +13,11 @@
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
import com.ycl.platform.domain.result.UY.*;
import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO;
import com.ycl.platform.domain.vo.DataCenter.MonitorQualifyResultVO;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import com.ycl.platform.domain.vo.PointDetailVO;
import com.ycl.platform.domain.vo.home.HomeFaceVO;
import com.ycl.platform.mapper.ImageResourceSecurityDetailMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.platform.service.*;
@@ -20,12 +25,16 @@
import com.ycl.system.page.PageUtil;
import com.ycl.utils.DateUtils;
import com.ycl.utils.MongoUtil;
import com.ycl.utils.bean.BeanUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import enumeration.general.AreaDeptEnum;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections.CollectionUtils;
import org.bson.Document;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextCriteria;
@@ -35,6 +44,7 @@
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -67,23 +77,81 @@
     */
    @Override
    public Result videoPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        params.setDeptTag(-1);
        params.setDeviceType(1);
        // 统计设备数量
        Integer distinctCount = pointMapper.distinctCount(params);
        Date now = new Date();
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        /** 查询当天在线率 */
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getSiteOnline)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -91,7 +159,7 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(distinctCount + "",this.remove0(onlineRate)));
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -104,23 +172,80 @@
     */
    @Override
    public Result deptVideoPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("deptTag").is(Boolean.TRUE));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        // 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        params.setDeptTag(1);
        params.setDeviceType(1);
        Integer distinctCount = pointMapper.distinctCount(params);
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMinistrySiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -129,8 +254,8 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(distinctCount + "", this.remove0(onlineRate)));
        map.put("list",resultList);
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -142,22 +267,80 @@
     */
    @Override
    public Result videoImportantPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("importantTag").is(Boolean.TRUE));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        params.setDeptTag(3);
        params.setDeviceType(1);
        // 统计设备数量
        Integer distinctCount = pointMapper.distinctCount(params);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        Date now = new Date();
        // 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeySiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -166,7 +349,7 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(distinctCount + "", this.remove0(onlineRate)));
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -179,8 +362,17 @@
     */
    @Override
    public Result videoImportantPointImageOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("importantCommandImageTag").is(Boolean.TRUE));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
@@ -188,14 +380,64 @@
        params.setDeptTag(4);
        params.setDeviceType(1);
        // 统计设备数量
        Integer distinctCount = pointMapper.distinctCount(params);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        Date now = new Date();
        // 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyCommandImageOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -204,7 +446,7 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(distinctCount + "", this.remove0(onlineRate)));
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -218,34 +460,40 @@
    @Override
    public Result videoOneMachineDocumentRegister(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
        and.andOperator(andCriteria);
        query = Query.query(and);
        long total = mongoTemplate.count(query, MonitorQualifyResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitorQualifyResult> resultList = mongoTemplate.find(query, MonitorQualifyResult.class);
        List<MonitorQualifyResultVO> resultVOS = new ArrayList<>();
        for (MonitorQualifyResult result : resultList) {
            MonitorQualifyResultVO vo = MonitorQualifyResult.getVO(result);
            resultVOS.add(vo);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("ip.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList1);
        setTag(params, dList1);
        Document totalFilter = new Document("$and",dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        setTag(params, dList2);
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -264,11 +512,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMonitorRegistration)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -279,7 +527,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
@@ -292,34 +540,99 @@
    @Override
    public Result videoOneMachineDocumentQualified(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                andCriteria.add(Criteria.where("serialNumber.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("name.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("civilCode.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("integrated_device.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("jkdwlx.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("latitude.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("longitude.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("macdz.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("name.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("sbzt.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("sxjcjqy.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("sxjgnlx.error").is(Boolean.FALSE));
                Criteria and2 = new Criteria();
                and2.andOperator(andCriteria);
                query = Query.query(and2);
            }else if(params.getOption() ==-1){
                Criteria c1 = Criteria.where("serialNumber.error").is(Boolean.TRUE);
                Criteria c2 = Criteria.where("name.error").is(Boolean.TRUE);
                Criteria c3 = Criteria.where("civilCode.error").is(Boolean.TRUE);
                Criteria c4 = Criteria.where("integrated_device.error").is(Boolean.TRUE);
                Criteria c5 = Criteria.where("jkdwlx.error").is(Boolean.TRUE);
                Criteria c6 = Criteria.where("latitude.error").is(Boolean.TRUE);
                Criteria c7 = Criteria.where("longitude.error").is(Boolean.TRUE);
                Criteria c8 = Criteria.where("macdz.error").is(Boolean.TRUE);
                Criteria c9 = Criteria.where("name.error").is(Boolean.TRUE);
                Criteria c10 = Criteria.where("sbzt.error").is(Boolean.TRUE);
                Criteria c11 = Criteria.where("sxjcjqy.error").is(Boolean.TRUE);
                Criteria c12 = Criteria.where("sxjgnlx.error").is(Boolean.TRUE);
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        long total = mongoTemplate.count(query, MonitorQualifyResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitorQualifyResult> resultList = mongoTemplate.find(query, MonitorQualifyResult.class);
        List<MonitorQualifyResultVO> resultVOS = new ArrayList<>();
        for (MonitorQualifyResult result : resultList) {
            MonitorQualifyResultVO vo = MonitorQualifyResult.getVO(result);
            resultVOS.add(vo);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("ip.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList1);
        setTag(params, dList1);
        Document totalFilter = new Document("$and",dList1);
        //合格数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        dList2.add(new Document("serialNumber.error",Boolean.FALSE));
        dList2.add(new Document("name.error",Boolean.FALSE));
        dList2.add(new Document("civilCode.error",Boolean.FALSE));
        dList2.add(new Document("integrated_device.error",Boolean.FALSE));
        dList2.add(new Document("jkdwlx.error",Boolean.FALSE));
        dList2.add(new Document("latitude.error",Boolean.FALSE));
        dList2.add(new Document("longitude.error",Boolean.FALSE));
        dList2.add(new Document("macdz.error",Boolean.FALSE));
        dList2.add(new Document("name.error",Boolean.FALSE));
        dList2.add(new Document("sbzt.error",Boolean.FALSE));
        dList2.add(new Document("sxjcjqy.error",Boolean.FALSE));
        dList2.add(new Document("sxjgnlx.error",Boolean.FALSE));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        Document qualifyFilter = new Document("$and",dList2);
        //不合格数
        List<Document> dList3  = new ArrayList<>(2);
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("serialNumber.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("name.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("civilCode.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("integrated_device.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("jkdwlx.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("name.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("sbzt.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("sxjcjqy.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("sxjgnlx.error", new Document("$eq", Boolean.TRUE)));
        Document errorFilter = new Document("$or", errorConditions);
        dList3.add(errorFilter);
        Document unQualifyFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(totalFilter, qualifyFilter, unQualifyFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -338,11 +651,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMonitorQualification)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -353,47 +666,50 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
    /**
     * 视频:档案考核比
     *
     * 档案留存总量:mongo存的所有去重后的档案
     * 当日档案:当日的档案
     * 档案考核比 = 当日档案/档案留存总量
     * @param params
     * @return
     * @return1
     */
    @Override
    public Result videoAssessmentFileRatio(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        long total = mongoTemplate.count(query, MonitorQualifyResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitorQualifyResult> resultList = mongoTemplate.find(query, MonitorQualifyResult.class);
        List<MonitorQualifyResultVO> resultVOS = new ArrayList<>();
        for (MonitorQualifyResult result : resultList) {
            MonitorQualifyResultVO vo = MonitorQualifyResult.getVO(result);
            resultVOS.add(vo);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("ip.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList1);
        DataCenterQuery totalParams = new DataCenterQuery();
        BeanUtils.copyProperties(params,totalParams);
        totalParams.setStartTime(null);
        setTag(totalParams, dList1);
        Document totalFilter = new Document("$and",dList1);
        //当日档案数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        setTag(params, dList2);
        Document newFilter = new Document("$and",dList2);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -412,10 +728,22 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        rList.add("0%");
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getArchivesRate)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getArchivesRate).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
@@ -428,12 +756,20 @@
    @Override
    public Result videoAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params,"createTime", likeFileds, null);
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item->{
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
@@ -459,12 +795,11 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -472,7 +807,15 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        //加一个总数
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", resultCount);
        map.put("list", resultList);
@@ -488,12 +831,20 @@
    @Override
    public Result deptVideoAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params,"createTime", likeFileds, 1);
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, 1);
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item->{
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
@@ -501,8 +852,8 @@
        List<String> resultCount = status.stream().map(item -> {
            List<Document> dList = new ArrayList<>(4);
            dList.add(new Document("deptTag", new Document("$eq", Boolean.TRUE)));
            dList.add(new Document("recordStatus",  new Document("$eq", item)));
            setTag(params,dList);
            dList.add(new Document("recordStatus", new Document("$eq", item)));
            setTag(params, dList);
            Document filter = new Document("$and", dList);
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -521,11 +872,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMinistryVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -533,6 +884,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        //加一个总数
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", resultCount);
@@ -549,12 +906,20 @@
    @Override
    public Result videoImportantPointAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params,"createTime", likeFileds, 3);
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, 3);
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item->{
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
@@ -563,7 +928,7 @@
            List<Document> dList = new ArrayList<>(4);
            dList.add(new Document("importantTag", new Document("$eq", Boolean.TRUE)));
            dList.add(new Document("recordStatus", new Document("$eq", item)));
            setTag(params,dList);
            setTag(params, dList);
            Document filter = new Document("$and", dList);
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -582,11 +947,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -594,6 +959,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        //加一个总数
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", resultCount);
@@ -602,7 +973,7 @@
    }
    /**
     * 视频:标注正确率
     * 视频:标注正确率(暂停)
     *
     * @param params
     * @return
@@ -635,37 +1006,97 @@
    @Override
    public Result videoImportantPointLabelingAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceNo", "osdName");
        Query query = MongoUtil.getQuery(params,"checkTime", likeFileds, 3);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, 3);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        //下拉框标注正确查询条件
        if (params.getOption() != null) {
            if(params.getOption()==1) {
                andCriteria.add(Criteria.where("osdNameCorrect").is(1));
                andCriteria.add(Criteria.where("osdTimeCorrect").is(1));
                andCriteria.add(Criteria.where("osdProvinceCorrect").is(1));
                andCriteria.add(Criteria.where("osdCityCorrect").is(1));
                andCriteria.add(Criteria.where("osdPartCorrect").is(1));
                Criteria and2 = new Criteria();
                and2.andOperator(andCriteria);
                query = Query.query(and2);
            }else if(params.getOption()==-1){
                // 使用$or条件连接多个字段检查,每个字段检查是否等于-1
                Criteria c1 = Criteria.where("osdNameCorrect").is(-1);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(-1);
                Criteria c3 = Criteria.where("osdProvinceCorrect").is(-1);
                Criteria c4 = Criteria.where("osdCityCorrect").is(-1);
                Criteria c5 = Criteria.where("osdPartCorrect").is(-1);
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }else {
                Criteria c1 = Criteria.where("osdNameCorrect").is(0);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(0);
                Criteria c3 = Criteria.where("osdProvinceCorrect").is(0);
                Criteria c4 = Criteria.where("osdCityCorrect").is(0);
                Criteria c5 = Criteria.where("osdPartCorrect").is(0);
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        long total = mongoTemplate.count(query, OsdCheckResult.class);
        MongoUtil.setPage(query, params, "checkTime");
        List<OsdCheckResult> resultList = mongoTemplate.find(query, OsdCheckResult.class);
        for (OsdCheckResult osdCheckResult : resultList) {
            OsdCheckResult.getText(osdCheckResult);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("osd_check_result");
        //总数
        List<Document> dList = new ArrayList<>(2);
        dList.add(new Document("importantTag", Boolean.TRUE));
        setTag(params, dList);
        Document osdFilter = new Document("$and", dList);
        //正常数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("importantTag", Boolean.TRUE));
        dList1.add(new Document("osdNameCorrect", new Document("$eq", 1)));
        setTag(params,dList1);
        dList1.add(new Document("osdTimeCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdProvinceCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdCityCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdPartCorrect", new Document("$eq", 1)));
        setTag(params, dList1);
        Document osdCorrectFilter = new Document("$and", dList1);
        //异常数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("importantTag", Boolean.TRUE));
        dList2.add(new Document("osdNameCorrect", new Document("$eq", -1)));
        setTag(params,dList2);
        Document importantTagCondition = new Document("importantTag", Boolean.TRUE);
        dList2.add(importantTagCondition);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("osdNameCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdTimeCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdProvinceCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdCityCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdPartCorrect", new Document("$eq", -1)));
        Document errorFilter = new Document("$or", errorConditions);
        dList2.add(errorFilter);
        Document osdErrorFilter = new Document("$and", dList2);
        //TODO:未知数  新增0的状态
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("importantTag", Boolean.TRUE));
        dList3.add(new Document("osdTimeCorrect", new Document("$eq", 1)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("importantTag", Boolean.TRUE));
        dList4.add(new Document("osdTimeCorrect", new Document("$eq", -1)));
        setTag(params,dList4);
        Document osdNameFilter = new Document("$and", dList1);
        Document osdNameErrFilter = new Document("$and", dList2);
        Document osdTimeFilter = new Document("$and", dList3);
        Document osdTimeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(osdNameFilter, osdNameErrFilter, osdTimeFilter, osdTimeErrFilter);
        dList3.add(importantTagCondition);
        List<Document> unknownConditions = new ArrayList<>();
        unknownConditions.add(new Document("osdNameCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdTimeCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdProvinceCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdCityCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdPartCorrect", new Document("$eq", 0)));
        // 使用$or逻辑组合剩余的条件
        Document unknownFilter = new Document("$or", unknownConditions);
        dList3.add(unknownFilter);
        Document osdUnknownFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter,osdUnknownFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -684,11 +1115,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyAnnotationAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -737,29 +1168,74 @@
     */
    @Override
    public Result videoImportantPointCheckTimeAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceNo", "osdName");
        Query query = MongoUtil.getQuery(params,"checkTime", likeFileds, 3);
        Query query = MongoUtil.getQuery(params, "checkTime", likeFileds, 3);
        //下拉框标注正确查询条件
        if (params.getOption() != null) {
            if(params.getOption()==1) {
               query.addCriteria(Criteria.where("osdTimeCorrect").is(1));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("osdTimeCorrect").is(-1));
            }else {
                query.addCriteria(Criteria.where("osdTimeCorrect").is(0));
            }
        }
        long total = mongoTemplate.count(query, OsdCheckResult.class);
        MongoUtil.setPage(query, params, "checkTime");
        List<OsdCheckResult> resultList = mongoTemplate.find(query, OsdCheckResult.class);
        for (OsdCheckResult osdCheckResult : resultList) {
            OsdCheckResult.getText(osdCheckResult);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("osd_check_result");
        //总数
        List<Document> dList = new ArrayList<>(2);
        dList.add(new Document("importantTag", Boolean.TRUE));
        setTag(params, dList);
        Document osdFilter = new Document("$and", dList);
        //正常数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("importantTag", Boolean.TRUE));
        dList1.add(new Document("osdNameCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdTimeCorrect", new Document("$eq", 1)));
        setTag(params,dList1);
        dList1.add(new Document("osdProvinceCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdCityCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdPartCorrect", new Document("$eq", 1)));
        setTag(params, dList1);
        Document osdCorrectFilter = new Document("$and", dList1);
        //异常数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("importantTag", Boolean.TRUE));
        dList2.add(new Document("osdTimeCorrect", new Document("$eq", -1)));
        setTag(params,dList2);
        Document osdTimeFilter = new Document("$and", dList1);
        Document osdTimeErrFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(osdTimeFilter, osdTimeErrFilter);
        Document importantTagCondition = new Document("importantTag", Boolean.TRUE);
        dList2.add(importantTagCondition);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("osdNameCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdTimeCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdProvinceCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdCityCorrect", new Document("$eq", -1)));
        errorConditions.add(new Document("osdPartCorrect", new Document("$eq", -1)));
        Document errorFilter = new Document("$or", errorConditions);
        dList2.add(errorFilter);
        Document osdErrorFilter = new Document("$and", dList2);
        //TODO:未知数  新增0的状态
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params,dList3);
        dList3.add(importantTagCondition);
        List<Document> unknownConditions = new ArrayList<>();
        unknownConditions.add(new Document("osdNameCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdTimeCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdProvinceCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdCityCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdPartCorrect", new Document("$eq", 0)));
        // 使用$or逻辑组合剩余的条件
        Document unknownFilter = new Document("$or", unknownConditions);
        dList3.add(unknownFilter);
        Document osdUnknownFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter,osdUnknownFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -778,11 +1254,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -808,36 +1284,39 @@
    public Result vehicleViewDockStable(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //加DataType为车辆
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_CAR));
        if(params.getOption()!=null){
            if(ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Normal));
            }else if(ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Null));
            }else if(ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Descent));
            }else if(ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Low));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDataMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDataMonitorResult> resultList = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
        resultList.forEach(item ->item.setResultTypeText(item.getResultTypeText()));
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("importantTag", Boolean.TRUE));
        dList1.add(new Document("resultType", new Document("$eq", 1)));
        setTag(params,dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("importantTag", Boolean.TRUE));
        dList2.add(new Document("resultType", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("resultType", new Document("$eq", 1)));
        dList2.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("importantTag", Boolean.TRUE));
        dList3.add(new Document("resultType", new Document("$eq", 3)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("importantTag", Boolean.TRUE));
        dList4.add(new Document("resultType", new Document("$eq", 4)));
        setTag(params,dList4);
        Document normalFilter = new Document("$and", dList1);
        dList3.add(new Document("resultType", new Document("$eq", 2)));
        dList3.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList3);
        Document noDataFilter = new Document("$and", dList2);
        Document trFilter = new Document("$and", dList3);
        Document littleFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(normalFilter, noDataFilter, trFilter, littleFilter);
        List<Document> lists = Arrays.asList(noDataFilter, trFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -855,17 +1334,32 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        matchConditions.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int dataCount = 0;
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
        }
        rList.add(0,dataCount+"");
        List<CheckIndexCar> carList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getViewConnectStability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
        if (CollectionUtils.isNotEmpty(carList)) {
            BigDecimal sum = carList.stream().map(CheckIndexCar::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(carList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        rList.add(this.remove0(onlineRate));
@@ -883,23 +1377,81 @@
     */
    @Override
    public Result vehiclePointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查车辆设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        //系统ping的结果
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        params.setDeptTag(-1);
        params.setDeviceType(2);
        // 统计设备数量
        Integer distinctCount = pointMapper.distinctCount(params);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        Date now = new Date();
        // 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getSiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -908,7 +1460,7 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(distinctCount + "", this.remove0(onlineRate)));
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -922,33 +1474,45 @@
    @Override
    public Result vehicleNetDeviceDirectoryConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        // 1/2/3 视频/车辆/人脸
        Pattern pattern = Pattern.compile(".*2.*");
        andCriteria.add(Criteria.where("sxjgnlx.value").regex(pattern));
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
        and.andOperator(andCriteria);
        query = Query.query(and);
        long total = mongoTemplate.count(query, MonitorQualifyResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitorQualifyResult> resultList = mongoTemplate.find(query, MonitorQualifyResult.class);
        // 统计数量
        List<MonitorQualifyResultVO> resultVOS = new ArrayList<>();
        for (MonitorQualifyResult result : resultList) {
            MonitorQualifyResultVO vo = MonitorQualifyResult.getVO(result);
            resultVOS.add(vo);
        }
        //统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("ip.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList1);
        setTag(params, dList1);
        dList1.add(new Document("sxjgnlx.value", new Document("$regex", ".*2.*")));
        Document totalFilter = new Document("$and",dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        setTag(params, dList2);
        dList2.add(new Document("sxjgnlx.value", new Document("$regex", ".*2.*")));
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -967,11 +1531,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getDeviceDirectoryConsistent)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -982,7 +1546,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
@@ -995,7 +1559,23 @@
    @Override
    public Result vehicleCollectionConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "crossName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                query.addCriteria(Criteria.where("lalType").is(ApiConstants.HK_Info_LayType_Normal));
                query.addCriteria(Criteria.where("gbCodeType").is(ApiConstants.HK_Info_GbCodeType_Normal));
            }else if(params.getOption() ==-1){
                Criteria lalType = Criteria.where("lalType").ne(ApiConstants.HK_Info_LayType_Normal);
                Criteria gbCodeType = Criteria.where("gbCodeType").ne(ApiConstants.HK_Info_GbCodeType_Normal);
                Criteria orOperator = new Criteria().orOperator(lalType, gbCodeType);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        long total = mongoTemplate.count(query, CrossDetailResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
@@ -1006,23 +1586,23 @@
        MongoCollection<Document> collection = database.getCollection("hk_cross_detail");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("lalType", new Document("$eq", 1)));
        setTag(params,dList1);
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("lalType", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("lalType", new Document("$eq", 1)));
        dList2.add(new Document("gbCodeType", new Document("$eq", 1)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("lalType", new Document("$eq", 3)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("lalType", new Document("$eq", 4)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("lalType",new Document("$ne",1)));
        errorConditions.add(new Document("gbCodeType",new Document("$ne",1)));
        Document errorDoc = new Document("$or",errorConditions);
        dList3.add(errorDoc);
        Document totalFilter = new Document("$and", dList1);
        Document correctFilter = new Document("$and", dList2);
        Document errorFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(totalFilter, correctFilter, errorFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1041,11 +1621,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleInformationCollectionAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1070,7 +1650,15 @@
    public Result vehicleCollectionDataIntegrity(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            //主要属性不完整
            if(params.getOption()==1){
                 query.addCriteria(Criteria.where("noIntegrityCount").gt(0));
            }else if(params.getOption()==-1){
                //属性不完整
                query.addCriteria(Criteria.where("mainNoIntegrityCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, DataIntegrityMonitoringResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<DataIntegrityMonitoringResult> resultList = mongoTemplate.find(query, DataIntegrityMonitoringResult.class);
@@ -1079,11 +1667,33 @@
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_data_integrity_monitoring");
        Date now = new Date();
        //抓拍量求和
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                        .append("noIntegrityCount", new Document("$sum", "$noIntegrityCount"))
                        .append("mainNoIntegrityCount", new Document("$sum", "$mainNoIntegrityCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int dataCount = 0;
        int noIntegrityCount = 0;
        int mainNoIntegrityCount = 0;
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
            noIntegrityCount = doc.getInteger("noIntegrityCount");
            mainNoIntegrityCount = doc.getInteger("mainNoIntegrityCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleCaptureIntegrity)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1091,9 +1701,13 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        List<String> countList = new ArrayList<>();
        countList.add(dataCount+"");
        countList.add(noIntegrityCount+"");
        countList.add(mainNoIntegrityCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", countList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1108,16 +1722,49 @@
    public Result vehicleCollectionDataCaptured(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            //主要属性不一致
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //重要属性不一致
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, AttrRecognitionMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<AttrRecognitionMonitorResult> resultList = mongoTemplate.find(query, AttrRecognitionMonitorResult.class);
        Date now = new Date();
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_attr_recognition_monitor");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$sampleCount"))
                        .append("majorDiffCount", new Document("$sum", "$majorDiffCount"))
                        .append("importantDiffCount", new Document("$sum", "$importantDiffCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int majorDiffCount = 0;
        int importantDiffCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            majorDiffCount = doc.getInteger("majorDiffCount");
            importantDiffCount = doc.getInteger("importantDiffCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleCaptureAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1125,8 +1772,14 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        List<String> countList = new ArrayList<>();
        countList.add(sampleCount+"");
        countList.add(majorDiffCount+"");
        countList.add(importantDiffCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", countList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1141,30 +1794,46 @@
    public Result vehicleClockAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            //当日时钟异常
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, VehicleDeviceInspectionResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<VehicleDeviceInspectionResult> resultList = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
            SnapClockVO vo = VehicleDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        setTag(params,dList1);
        dList1.add(new Document("snapClock.todayClockResult", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("snapResult", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("snapClock.todayClockResult", new Document("$eq", 0)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        setTag(params,dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        dList3.add(new Document("snapClock.allClockResult", new Document("$eq", 1)));
        setTag(params, dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("snapClock.allClockResult", new Document("$eq", 0)));
        setTag(params, dList4);
        Document todayFilter = new Document("$and", dList1);
        Document todayErrFilter = new Document("$and", dList2);
        Document allFilter = new Document("$and", dList3);
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1183,11 +1852,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1198,7 +1867,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVos);
        return Result.ok().data(map).total(total);
    }
@@ -1212,17 +1881,58 @@
    public Result vehicleTimelyUploadAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_CAR));
        if(params.getOption()!=null){
            //正常
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDelayMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDelayMonitorResult> resultList = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshop_delay_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        setTag(params, dList1);
        dList1.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_CAR)));
        Document allFilter = new Document("$and", dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_CAR)));
        dList2.add(new Document("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
                    new Document("$match", filter),
                    // $group 去重
                    new Document("$group", new Document("_id", "$externalIndexCode")),
                    new Document("$count", "uniqueDeviceIds")
            );
            // 执行聚合查询并获取结果
            AggregateIterable<Document> result = collection.aggregate(pipeline);
            Integer uniqueDeviceIdCount = 0;
            for (Document doc : result) {
                uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
                break; // 不需要继续遍历,因为 $count 只会产生一个结果
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1230,8 +1940,9 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", rList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1246,17 +1957,44 @@
    public Result vehicleUrlAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("expCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("expCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, PicAccessResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        query.with(Sort.by(Sort.Order.desc("expCount")));
        List<PicAccessResult> resultList = mongoTemplate.find(query, PicAccessResult.class);
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_pic_access");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$sampleCount"))
                        .append("expCount", new Document("$sum", "$expCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleUrlAvailability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1264,8 +2002,13 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        List<String> rList = new ArrayList<>();
        rList.add(sampleCount+"");
        rList.add(expCount+"");
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", rList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1280,17 +2023,48 @@
    public Result vehicleBigImgAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, VehicleDeviceSamplingResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        query.with(Sort.by(Sort.Order.desc("bigUseful.bigPicExpCount")));
        List<VehicleDeviceSamplingResult> resultList = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
            BigPicUsefulVO picVO = VehicleDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$bigUseful.sampleCount"))
                        .append("expCount", new Document("$sum", "$bigUseful.bigPicExpCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehiclePictureAvailability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1298,9 +2072,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
@@ -1314,32 +2091,39 @@
    public Result faceViewDockStable(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //加DataType为车辆
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_FACE));
        if(params.getOption()!=null){
            if(ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Normal));
            }else if(ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Null));
            }else if(ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Descent));
            }else if(ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())){
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Low));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDataMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDataMonitorResult> resultList = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
        resultList.forEach(item ->item.setResultTypeText(item.getResultTypeText()));
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("resultType", new Document("$eq", 1)));
        setTag(params,dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("resultType", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("resultType", new Document("$eq", 1)));
        dList2.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("resultType", new Document("$eq", 3)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("resultType", new Document("$eq", 4)));
        setTag(params,dList4);
        Document normalFilter = new Document("$and", dList1);
        dList3.add(new Document("resultType", new Document("$eq", 2)));
        dList3.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList3);
        Document noDataFilter = new Document("$and", dList2);
        Document trFilter = new Document("$and", dList3);
        Document littleFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(normalFilter, noDataFilter, trFilter, littleFilter);
        List<Document> lists = Arrays.asList(noDataFilter, trFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1357,12 +2141,28 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        //抓拍量求和
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        matchConditions.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_FACE)));
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int dataCount = 0;
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
        }
        rList.add(0,dataCount+"");
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getViewConnectStability)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1385,23 +2185,79 @@
     */
    @Override
    public Result facePointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no","ip");
        Query query = MongoUtil.getQuery(params,TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查人脸设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Face + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
        });
        params.setDeptTag(-1);
        params.setDeviceType(3);
        // 统计设备数量
        Integer distinctCount = pointMapper.distinctCount(params);
        Date now = new Date();
// 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
        int offlineCount = 0;
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Face + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
        } else if (params.getDataType() == 2) {
            criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        }
        // 构建match操作
        MatchOperation match = Aggregation.match(
                new Criteria().andOperator(criteriaList.toArray(new Criteria[0]))
        );
        GroupOperation group = Aggregation.group()
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Online)).then(1).otherwise(0)).as("onlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Offline)).then(1).otherwise(0)).as("offlineCount")
                .sum(ConditionalOperators.when(Criteria.where("online").is(ApiConstants.UY_OnlineSite_Unknown)).then(1).otherwise(0)).as("unknownCount");
        // 将匹配阶段和分组阶段组合起来
        Aggregation aggregation = Aggregation.newAggregation(match, group);
        // 执行聚合查询
        AggregationResults<Map> results = mongoTemplate.aggregate(aggregation, "t_monitor_online", Map.class); // 替换为你的集合名称
        for (Map<String, Object> result : results.getMappedResults()) {
            offlineCount = (Integer) result.getOrDefault("offlineCount", 0L);
            unknownCount = (Integer) result.getOrDefault("unknownCount", 0L);
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getSiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1409,11 +2265,9 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        List<String> rList = new ArrayList<>(2);
        rList.add(distinctCount + "");
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1426,34 +2280,46 @@
     */
    @Override
    public Result faceDirectoryConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("serialNumber.showValue", "ip.showValue", "name.showValue");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        // 1/2/3 视频/车辆/人脸
        Pattern pattern = Pattern.compile(".*3.*");
        andCriteria.add(Criteria.where("sxjgnlx.value").regex(pattern));
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
        and.andOperator(andCriteria);
        query = Query.query(and);
        long total = mongoTemplate.count(query, MonitorQualifyResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitorQualifyResult> resultList = mongoTemplate.find(query, MonitorQualifyResult.class);
        List<MonitorQualifyResultVO> resultVOS = new ArrayList<>();
        for (MonitorQualifyResult result : resultList) {
            MonitorQualifyResultVO vo = MonitorQualifyResult.getVO(result);
            resultVOS.add(vo);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("ip.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList1);
        setTag(params, dList1);
        dList1.add(new Document("sxjgnlx.value", new Document("$regex", ".*3.*")));
        Document totalFilter = new Document("$and",dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("macdz.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("latitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("longitude.error", new Document("$eq", Boolean.TRUE)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        setTag(params, dList2);
        dList2.add(new Document("sxjgnlx.value", new Document("$regex", ".*3.*")));
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1472,11 +2338,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getDeviceDirectoryConsistent)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1487,7 +2353,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
@@ -1500,33 +2366,50 @@
    @Override
    public Result faceCollectionConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "crossName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
                query.addCriteria(Criteria.where("lalType").is(ApiConstants.HK_Info_LayType_Normal));
                query.addCriteria(Criteria.where("gbCodeType").is(ApiConstants.HK_Info_GbCodeType_Normal));
            }else if(params.getOption() ==-1){
                Criteria lalType = Criteria.where("lalType").ne(ApiConstants.HK_Info_LayType_Normal);
                Criteria gbCodeType = Criteria.where("gbCodeType").ne(ApiConstants.HK_Info_GbCodeType_Normal);
                Criteria orOperator = new Criteria().orOperator(lalType, gbCodeType);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        long total = mongoTemplate.count(query, CrossDetailResult.class);
        long total = mongoTemplate.count(query, MonitoringDetailResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<CrossDetailResult> resultList = mongoTemplate.find(query, CrossDetailResult.class);
        List<MonitoringDetailResult> resultList = mongoTemplate.find(query, MonitoringDetailResult.class);
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_cross_detail");
        MongoCollection<Document> collection = database.getCollection("hk_monitoring_detail");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("lalType", new Document("$eq", 1)));
        setTag(params,dList1);
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("lalType", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("lalType", new Document("$eq", 1)));
        dList2.add(new Document("gbCodeType", new Document("$eq", 1)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("lalType", new Document("$eq", 3)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("lalType", new Document("$eq", 4)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("lalType",new Document("$ne",1)));
        errorConditions.add(new Document("gbCodeType",new Document("$ne",1)));
        Document errorDoc = new Document("$or",errorConditions);
        dList3.add(errorDoc);
        Document totalFilter = new Document("$and", dList1);
        Document correctFilter = new Document("$and", dList2);
        Document errorFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(totalFilter, correctFilter, errorFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1545,11 +2428,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceInformationCollectionAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1574,56 +2457,50 @@
    public Result faceImgQualification(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "cameraName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        long total = mongoTemplate.count(query, MonitoringDetailResult.class);
        if(params.getOption()!=null){
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceSamplingResult.class);
        query.with(Sort.by(Sort.Order.desc("faceEligibility.unfaceEligCount")));
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitoringDetailResult> resultList = mongoTemplate.find(query, MonitoringDetailResult.class);
        List<FaceDeviceSamplingResult> resultList = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getEligeVO(item);
            voList.add(picVO);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_monitoring_detail");
        MongoCollection<Document> collection = database.getCollection("hk_face_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$faceEligibility.sampleCount"))
                        .append("expCount", new Document("$sum", "$faceEligibility.unfaceEligCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("lalType", new Document("$eq", 1)));
        setTag(params,dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("lalType", new Document("$eq", 2)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("lalType", new Document("$eq", 3)));
        setTag(params,dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("lalType", new Document("$eq", 4)));
        setTag(params,dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
                    new Document("$match", filter),
                    // $group 去重
                    new Document("$group", new Document("_id", "$externalIndexCode")),
                    new Document("$count", "uniqueDeviceIds")
            );
            // 执行聚合查询并获取结果
            AggregateIterable<Document> result = collection.aggregate(pipeline);
            Integer uniqueDeviceIdCount = 0;
            for (Document doc : result) {
                uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
                break; // 不需要继续遍历,因为 $count 只会产生一个结果
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureQualification)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1631,10 +2508,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        rList.add(this.remove0(onlineRate));
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
@@ -1648,29 +2527,47 @@
    public Result faceCapturesImagesAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            //当日时钟异常
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceInspectionResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceInspectionResult> resultList = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
            SnapClockVO vo = FaceDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        MongoCollection<Document> collection = database.getCollection("hk_face_device_inspection");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        setTag(params,dList1);
        dList1.add(new Document("snapClock.todayClockResult", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("snapResult", new Document("$eq", 2)));
        setTag(params,dList2);
        dList2.add(new Document("snapClock.todayClockResult", new Document("$eq", 0)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        setTag(params,dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        dList3.add(new Document("snapClock.allClockResult", new Document("$eq", 1)));
        setTag(params, dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("snapClock.allClockResult", new Document("$eq", 0)));
        setTag(params, dList4);
        Document todayFilter = new Document("$and", dList1);
        Document todayErrFilter = new Document("$and", dList2);
        Document allFilter = new Document("$and", dList3);
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1689,11 +2586,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1704,7 +2601,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVos);
        return Result.ok().data(map).total(total);
    }
@@ -1718,29 +2615,34 @@
    public Result faceTimelyUpload(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        long total = mongoTemplate.count(query, FaceDeviceInspectionResult.class);
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_FACE));
        if(params.getOption()!=null){
            //正常
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDelayMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceInspectionResult> resultList = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
        // 统计数量
        List<SnapshotDelayMonitorResult> resultList = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
        // 统计数
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        MongoCollection<Document> collection = database.getCollection("hk_snapshop_delay_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        setTag(params,dList1);
        setTag(params, dList1);
        dList1.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_FACE)));
        Document allFilter = new Document("$and", dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("snapResult", new Document("$eq", 2)));
        setTag(params,dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        setTag(params,dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        dList2.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_FACE)));
        dList2.add(new Document("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1759,11 +2661,12 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1788,17 +2691,50 @@
    public Result faceAvailabilityOfLargeImg(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceSamplingResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        query.with(Sort.by(Sort.Order.desc("bigUseful.bigPicExpCount")));
        List<FaceDeviceSamplingResult> resultList = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
        // 统计数
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_face_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$bigUseful.sampleCount"))
                        .append("expCount", new Document("$sum", "$bigUseful.bigPicExpCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        // 统计数
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureAvailability)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1806,12 +2742,15 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
    /**
     * 视频:视频图像资源安全管理
     *
@@ -1833,6 +2772,7 @@
    /**
     * 删除尾部的0
     *
     * @param rate
     * @return
     */
@@ -1843,6 +2783,7 @@
    /**
     * 设置标签搜索条件
     *
     * @param params
     * @param dList
     */
@@ -1852,5 +2793,9 @@
        } else if (params.getDataType().equals(2)) {
            dList.add(new Document("deptTag", new Document("$eq", Boolean.TRUE)));
        }
        Document mongoCreateTimeRange = new Document();
        if (params.getStartTime()!=null) mongoCreateTimeRange.append("$gte", params.getStartTime());
        if (params.getEndTime()!=null) mongoCreateTimeRange .append("$lt", params.getEndTime());
        dList.add(new Document("mongoCreateTime", mongoCreateTimeRange));
    }
}