From d74864fb938883b9c2b69abaf8b3ff740f03d930 Mon Sep 17 00:00:00 2001
From: fuliqi <fuliqi@qq.com>
Date: 星期三, 23 十月 2024 10:22:14 +0800
Subject: [PATCH] 数据中心各种在线率优化

---
 ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java |  368 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 322 insertions(+), 46 deletions(-)

diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
index 7c0f34a..f0c00c6 100644
--- a/ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
+++ b/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;
@@ -20,12 +21,14 @@
 import com.ycl.system.page.PageUtil;
 import com.ycl.utils.DateUtils;
 import com.ycl.utils.MongoUtil;
+import constant.ApiConstants;
 import constant.CheckConstants;
 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;
@@ -69,15 +72,24 @@
     public Result videoPointOnlineRate(DataCenterQuery params) {
         List<String> likeFileds = Arrays.asList("name", "no", "ip");
         Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
-        System.out.println("鏌ヨ鏉′欢"+query.toString());
+        //鏌ヨ棰戣澶�
+        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 (null != item.getPingOnline() && item.getPingOnline()) {
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
                 item.setPingOnlineStr("鍦ㄧ嚎");
-            } else {
+            } else if(!item.getPingOnline()){
                 item.setPingOnlineStr("绂荤嚎");
             }
             if(1== item.getOnline() ){
@@ -90,13 +102,59 @@
         });
         params.setDeptTag(-1);
         params.setDeviceType(1);
-        // 缁熻璁惧鏁伴噺
-        Integer distinctCount = pointMapper.distinctCount(params);
 
-        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
-                .select(CheckIndexVideo::getSiteOnline)
-                .between(CheckIndexVideo::getCreateTime,  params.getStartTime(),  params.getEndTime())
-                .list();
+        //鍗$墖缁熻
+        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;
+        }
+        /** 鏌ヨ褰撳ぉ鍦ㄧ嚎鐜� */
+        // 鍒涘缓涓�涓猀ueryWrapper瀹炰緥
+        QueryWrapper<CheckIndexVideo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().select(CheckIndexVideo::getSiteOnline) // 閫夋嫨瑕佹煡璇㈢殑瀛楁
+                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime()); // 璁剧疆鏃堕棿鑼冨洿鏉′欢
+        if (params.getDataType() == 0) {
+            //鍖哄幙
+            queryWrapper.lambda().eq(CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_County);
+        }else if(params.getDataType() == 1){
+            //鐪佸巺
+            queryWrapper.lambda().eq(CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province);
+        }else if(params.getDataType() == 2){
+            //鍏畨閮�
+            queryWrapper.lambda().eq(CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept);
+        }
+        // 浣跨敤QueryWrapper鎵ц鏌ヨ
+        List<CheckIndexVideo> videoList = checkIndexVideoService.getBaseMapper().selectList(queryWrapper);
+
         BigDecimal onlineRate = BigDecimal.ZERO;
         if (CollectionUtils.isNotEmpty(videoList)) {
             BigDecimal sum = videoList.stream().map(CheckIndexVideo::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -104,7 +162,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);
     }
@@ -119,14 +177,25 @@
     public Result deptVideoPointOnlineRate(DataCenterQuery params) {
         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 (null != item.getPingOnline() && item.getPingOnline()) {
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
                 item.setPingOnlineStr("鍦ㄧ嚎");
-            } else {
+            } else if(!item.getPingOnline()){
                 item.setPingOnlineStr("绂荤嚎");
             }
             if (1 == item.getOnline()) {
@@ -138,10 +207,43 @@
             }
         });
         // 缁熻璁惧鏁伴噺
+        //鍗$墖缁熻
+        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);
-
         List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                 .select(CheckIndexVideo::getMinistrySiteOnline)
                 .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
@@ -154,7 +256,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);
     }
@@ -169,18 +271,27 @@
     public Result videoImportantPointOnlineRate(DataCenterQuery params) {
         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 (null != item.getPingOnline() && item.getPingOnline()) {
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
                 item.setPingOnlineStr("鍦ㄧ嚎");
-            } else {
+            } else if(!item.getPingOnline()){
                 item.setPingOnlineStr("绂荤嚎");
             }
             if (1 == item.getOnline()) {
@@ -191,11 +302,46 @@
                 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))
+                .between(CheckIndexVideo::getCreateTime, params.getStartTime(),  params.getEndTime())
                 .list();
         BigDecimal onlineRate = BigDecimal.ZERO;
         if (CollectionUtils.isNotEmpty(videoList)) {
@@ -204,7 +350,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);
     }
@@ -219,6 +365,15 @@
     public Result videoImportantPointImageOnlineRate(DataCenterQuery params) {
         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);
@@ -226,12 +381,12 @@
 
         params.setDeptTag(4);
         params.setDeviceType(1);
-        // 缁熻璁惧鏁伴噺
-        Integer distinctCount = pointMapper.distinctCount(params);
         resultList.forEach(item -> {
-            if (null != item.getPingOnline() && item.getPingOnline()) {
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
                 item.setPingOnlineStr("鍦ㄧ嚎");
-            } else {
+            } else if(!item.getPingOnline()){
                 item.setPingOnlineStr("绂荤嚎");
             }
             if (1 == item.getOnline()) {
@@ -242,11 +397,47 @@
                 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))
+                .between(CheckIndexVideo::getCreateTime, params.getStartTime(),  params.getEndTime())
                 .list();
         BigDecimal onlineRate = BigDecimal.ZERO;
         if (CollectionUtils.isNotEmpty(videoList)) {
@@ -255,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);
     }
@@ -936,6 +1127,14 @@
     public Result vehiclePointOnlineRate(DataCenterQuery params) {
         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);
@@ -943,12 +1142,12 @@
         List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
         params.setDeptTag(-1);
         params.setDeviceType(2);
-        // 缁熻璁惧鏁伴噺
-        Integer distinctCount = pointMapper.distinctCount(params);
         resultList.forEach(item -> {
-            if (null != item.getPingOnline() && item.getPingOnline()) {
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
                 item.setPingOnlineStr("鍦ㄧ嚎");
-            } else {
+            } else if(!item.getPingOnline()){
                 item.setPingOnlineStr("绂荤嚎");
             }
             if (1 == item.getOnline()) {
@@ -959,6 +1158,43 @@
                 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_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)
@@ -971,7 +1207,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);
     }
@@ -1450,15 +1686,25 @@
     public Result facePointOnlineRate(DataCenterQuery params) {
         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 (null != item.getPingOnline() && item.getPingOnline()) {
-                item.setOnlineStr("鍦ㄧ嚎");
-            } else {
-                item.setOnlineStr("绂荤嚎");
+            if(item.getPingOnline() ==null){
+                item.setPingOnlineStr("鏈煡");
+            } else if (item.getPingOnline()) {
+                item.setPingOnlineStr("鍦ㄧ嚎");
+            } else if(!item.getPingOnline()){
+                item.setPingOnlineStr("绂荤嚎");
             }
             if (1 == item.getOnline()) {
                 item.setOnlineStr("鍦ㄧ嚎");
@@ -1470,14 +1716,46 @@
         });
         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))
+                .between(CheckIndexFace::getCreateTime, params.getStartTime(),  params.getEndTime())
                 .list();
         BigDecimal onlineRate = BigDecimal.ZERO;
         if (CollectionUtils.isNotEmpty(videoList)) {
@@ -1485,11 +1763,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);
     }

--
Gitblit v1.8.0