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