From cb415813de667096290d6bd0f924f5b523104117 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期一, 10 十一月 2025 17:41:04 +0800
Subject: [PATCH] 报备工单bug修改,定时任务在线问题修改新增导出扣分明细功能

---
 ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java |  179 +++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 106 insertions(+), 73 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 ff6e689..44192d5 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
@@ -1723,6 +1723,7 @@
      */
     @Override
     public Result videoOneMachineDocumentQualified(DataCenterQuery params) {
+        long startTime = System.currentTimeMillis();
         List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
         SysDept sysDept = getSysDeptByLoginUser();
         List<Criteria> andCriteria;
@@ -1781,99 +1782,131 @@
         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);
         }
-        // 缁熻鏁伴噺
+        long endTime =  System.currentTimeMillis();
+        // 缁熻鏁伴噺锛堟敼閫犲悗锛氫竴娆¤仛鍚堣繑鍥炴墍鏈夌粨鏋滐級
+        long startTime2 = System.currentTimeMillis();
         MongoDatabase database = mongoTemplate.getDb();
         MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
-        Document areDocument = null;
+
+// 1. 鏋勫缓鍏叡杩囨护鏉′欢锛坉eviceNo鍓嶇紑 + tag杩囨护锛�
+        List<Document> commonFilters = new ArrayList<>(2);
         if (areaDeptEnum != null) {
             String areaCodePrefix = areaDeptEnum.getCode();
-            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
+            commonFilters.add(new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix)));
         }
-        //鎬绘暟
-        List<Document> dList1 = new ArrayList<>(2);
-        if (areDocument != null){
-            dList1.add(areDocument);
-        }
-        setTag(params, dList1);
-        Document totalFilter = new Document("$and", dList1);
-        //list1
+        setTag(params, commonFilters); // 娣诲姞tag杩囨护鏉′欢
+        Document commonFilter = commonFilters.isEmpty() ? new Document() : new Document("$and", commonFilters);
 
-        //鍚堟牸鏁�
-        List<Document> dList2 = new ArrayList<>(2);
-        if (areDocument != null){
-            dList2.add(areDocument);
-        }
-        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);
-        Document qualifyFilter = new Document("$and", dList2);
-        //涓嶅悎鏍兼暟
-        List<Document> dList3 = new ArrayList<>(2);
-        if (areDocument != null){
-            dList3.add(areDocument);
-        }
-        setTag(params, dList3);
-        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);
+// 2. 鏋勫缓鍚堟牸/涓嶅悎鏍肩殑error鏉′欢锛堝鐢ㄥ師閫昏緫锛屽幓閲峮ame.error锛�
+// 鍚堟牸鏉′欢锛氭墍鏈塭rror涓篺alse
+        List<Document> qualifyErrorConditions = new ArrayList<>();
+        qualifyErrorConditions.add(new Document("serialNumber.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("name.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("civilCode.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("integrated_device.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("jkdwlx.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("latitude.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("longitude.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("macdz.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("sbzt.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("sxjcjqy.error", Boolean.FALSE));
+        qualifyErrorConditions.add(new Document("sxjgnlx.error", Boolean.FALSE));
+        Document qualifyFilter = new Document("$and", qualifyErrorConditions);
 
-        List<Document> lists = Arrays.asList(totalFilter, qualifyFilter, unQualifyFilter);
-        List<String> rList = lists.stream().map(filter -> {
-            // 鏋勫缓鑱氬悎绠¢亾
-            List<Document> pipeline = Arrays.asList(
-                    new Document("$match", filter),
-                    // $group 鍘婚噸
-                    new Document("$group", new Document("_id", "$serialNumber.showValue")),
-                    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());
+// 涓嶅悎鏍兼潯浠讹細鑷冲皯涓�涓猠rror涓簍rue
+        List<Document> unQualifyErrorConditions = new ArrayList<>();
+        unQualifyErrorConditions.add(new Document("serialNumber.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("name.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("civilCode.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("integrated_device.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("jkdwlx.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("latitude.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("longitude.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("macdz.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("sbzt.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("sxjcjqy.error", Boolean.TRUE));
+        unQualifyErrorConditions.add(new Document("sxjgnlx.error", Boolean.TRUE));
+        Document unQualifyFilter = new Document("$or", unQualifyErrorConditions);
+
+// 3. 鏋勫缓涓�娆¤仛鍚堢閬擄紙鐢�$facet鍚堝苟涓変釜缁熻缁村害锛�
+        List<Document> pipeline = new ArrayList<>();
+
+// 姝ラ1锛氬厛搴旂敤鍏叡杩囨护鏉′欢锛坉eviceNo + tag锛夛紝鍑忓皯鍚庣画澶勭悊鏁版嵁閲�
+        if (!commonFilters.isEmpty()) {
+            pipeline.add(new Document("$match", commonFilter));
+        }
+
+// 姝ラ2锛氱敤$facet鍒嗛潰鏌ヨ锛屽悓鏃惰绠楁�绘暟銆佸悎鏍兼暟銆佷笉鍚堟牸鏁�
+        pipeline.add(new Document("$facet", new Document()
+                // 鎬绘暟锛氭寜serialNumber.showValue鍘婚噸鍚庤鏁�
+                .append("total", Arrays.asList(
+                        new Document("$group", new Document("_id", "$serialNumber.showValue")),
+                        new Document("$count", "uniqueDeviceIds")
+                ))
+                // 鍚堟牸鏁帮細鍏堣繃婊ゅ悎鏍兼潯浠讹紝鍐嶅幓閲嶈鏁�
+                .append("qualify", Arrays.asList(
+                        new Document("$match", qualifyFilter),
+                        new Document("$group", new Document("_id", "$serialNumber.showValue")),
+                        new Document("$count", "uniqueDeviceIds")
+                ))
+                // 涓嶅悎鏍兼暟锛氬厛杩囨护涓嶅悎鏍兼潯浠讹紝鍐嶅幓閲嶈鏁�
+                .append("unQualify", Arrays.asList(
+                        new Document("$match", unQualifyFilter),
+                        new Document("$group", new Document("_id", "$serialNumber.showValue")),
+                        new Document("$count", "uniqueDeviceIds")
+                ))
+        ));
+//        Document explainResult = collection.aggregate(pipeline).explain();
+//
+//// 鎵撳嵃鎵ц璁″垝锛堟棩蹇楁垨鎺у埗鍙拌緭鍑猴級
+//        log.info("鑱氬悎鏌ヨ鎵ц璁″垝锛歿}", explainResult.toJson());
+// 4. 鎵ц鑱氬悎鏌ヨ锛堜粎涓�娆℃暟鎹簱浜や簰锛�
+        AggregateIterable<Document> facetResult = collection.aggregate(pipeline).allowDiskUse(true);
+        Document resultDoc = facetResult.iterator().next(); // $facet浠呰繑鍥炰竴涓枃妗�
+
+// 5. 瑙f瀽缁撴灉锛堝鐞嗙┖缁撴灉鍦烘櫙锛岄粯璁よ鏁颁负0锛�
+        int totalCount = parseFacetCount(resultDoc, "total");
+        int qualifyCount = parseFacetCount(resultDoc, "qualify");
+        int unQualifyCount = parseFacetCount(resultDoc, "unQualify");
+
+// 6. 缁勮rList锛堜繚鎸佸師鏍煎紡涓嶅彉锛屽悗缁�昏緫鏃犻渶淇敼锛�
+        List<String> rList = new ArrayList<>(Arrays.asList(
+                String.valueOf(totalCount),
+                String.valueOf(qualifyCount),
+                String.valueOf(unQualifyCount)
+        ));
+// 鍘熷悎鏍肩巼璁$畻閫昏緫涓嶅彉
         BigDecimal onlineRate = BigDecimal.ZERO;
-        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
-            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
+        if (totalCount != 0) {
+            onlineRate = new BigDecimal(qualifyCount)
+                    .divide(new BigDecimal(totalCount), 3, RoundingMode.DOWN)
+                    .multiply(new BigDecimal("100"));
         }
+        rList.add(this.remove0(onlineRate));
+
+        long endTime2 = System.currentTimeMillis();
+        log.info("缁熻鑰楁椂锛歿} ms", (endTime2 - startTime2));
+
         rList.add(this.remove0(onlineRate));
         HashMap<String, Object> map = new HashMap<>();
         map.put("count", rList);
         map.put("list", resultVOS);
         return Result.ok().data(map).total(total);
     }
-
+    private int parseFacetCount(Document resultDoc, String facetName) {
+        List<Document> facetList = (List<Document>) resultDoc.get(facetName);
+        if (facetList == null || facetList.isEmpty()) {
+            return 0;
+        }
+        Document countDoc = facetList.get(0);
+        return countDoc.getInteger("uniqueDeviceIds", 0);
+    }
     /**
      * 瑙嗛锛氭。妗堣�冩牳姣�
      * 妗f鐣欏瓨鎬婚噺锛歮ongo瀛樼殑鎵�鏈夊幓閲嶅悗鐨勬。妗�

--
Gitblit v1.8.0