From 3364d6efd58eca1d6acf129948265b1e663dae7a Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期五, 16 八月 2024 13:38:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
ycl-common/src/main/java/constant/ApiConstants.java | 6 +
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java | 2
ycl-common/src/main/java/constant/CalculationStrategyConstants.java | 6 +
ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java | 181 +++++++++++++++++++++++++++++++++++++++++++++
ycl-server/src/main/java/com/ycl/task/VideoTask.java | 12 ++
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java | 14 +-
ycl-server/src/main/java/com/ycl/task/PythonTask.java | 2
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java | 13 +++
8 files changed, 227 insertions(+), 9 deletions(-)
diff --git a/ycl-common/src/main/java/constant/ApiConstants.java b/ycl-common/src/main/java/constant/ApiConstants.java
index f65fcb4..db00b75 100644
--- a/ycl-common/src/main/java/constant/ApiConstants.java
+++ b/ycl-common/src/main/java/constant/ApiConstants.java
@@ -58,6 +58,12 @@
public final static Integer UY_OnlineStatus_Online = 1;
public final static Integer UY_OnlineStatus_Offline = -1;
public final static Integer UY_OnlineStatus_Unknown = 0;
+
+ //Python鏍¢獙鏍囪瘑
+ public final static Integer PY_OSD_Correct = 1;
+ public final static Integer PY_OSD_Unknown = 0;
+ public final static Integer PY_OSD_Error = -1;
+
//鑷础琛屾斂缂栫爜
public final static String AreaNo = "5103";
diff --git a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
index 86f1149..4497d08 100644
--- a/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
+++ b/ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -33,6 +33,7 @@
*/
public static final String Car_DirectConsistent = "carDirectConsistent";
+
/**
* 浜鸿劯鏁版嵁涓婁紶鍙婃椂鎬�
*/
@@ -58,6 +59,7 @@
*/
public static final String Face_DirectConsistent = "faceDirectConsistent";
+
/**
* 涓�鏈轰竴妗f敞鍐岀巼銆佹。妗堣�冩牳姣�
*/
@@ -78,4 +80,8 @@
* 骞冲彴鍦ㄧ嚎鐜�
*/
public static final String Video_PlatformOnline = "videoPlatformOnline";
+ /**
+ * Osd鍑嗙‘鐜囧拰鏃堕棿鏍囨敞鍑嗙‘鐜�
+ */
+ public static final String Video_OsdTime = "videoOsdTime";
}
diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java
index e41ad4b..7be45e7 100644
--- a/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java
+++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java
@@ -81,32 +81,32 @@
/**
* osd1鐪�
*/
- private String osd1Province;
+ private Integer osd1Province;
/**
* osd1甯�
*/
- private String osd1City;
+ private Integer osd1City;
/**
* osd1鍖�
*/
- private String osd1Part;
+ private Integer osd1Part;
/**
* osd1 宸︿笅瑙�
*/
- private String osd1LB;
+ private Integer osd1LB;
/**
* osd1_osd
*/
- private String osd1OSD;
+ private Integer osd1OSD;
/**
* osd1_鏃堕棿鏍煎紡鏄惁姝g‘
*/
- private String osd1TimeFormat;
+ private Integer osd1TimeFormat;
/**
* osd1_鐪佽缃�
@@ -131,7 +131,7 @@
/**
* osd1_osd璁剧疆
*/
- private String osd1OsdSet;
+ private Integer osd1OsdSet;
/**
* osd1 鏃堕棿鏍煎紡
diff --git a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
index b3ae363..28f72a2 100644
--- a/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
+++ b/ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -67,6 +67,19 @@
return onlineSites.divide(totalSites, 4, RoundingMode.HALF_UP);
}
+ //瑙嗛Osd鍑嗙‘鐜�
+ public BigDecimal osdAccuracy(Map<String, Object> param) {
+ BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
+ BigDecimal osdAccuracySites = new BigDecimal((Integer) param.get("osdAccuracySites"));
+ return osdAccuracySites.divide(totalSites, 4, RoundingMode.HALF_UP);
+ }
+ //瑙嗛鏃堕棿鍚堟牸鐜�
+ public BigDecimal osdTimeAccuracy(Map<String, Object> param) {
+ BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
+ BigDecimal timeAccuracySites = new BigDecimal((Integer) param.get("timeAccuracySites"));
+ return timeAccuracySites.divide(totalSites, 4, RoundingMode.HALF_UP);
+ }
+
//鐩綍涓�鑷寸巼锛屾瘡瓒呰繃鐧惧垎涔�1鎵�10%
public BigDecimal directoryConstant(Map<String, Object> param) {
BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
diff --git a/ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java b/ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java
new file mode 100644
index 0000000..7369100
--- /dev/null
+++ b/ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java
@@ -0,0 +1,181 @@
+package com.ycl.calculate;
+
+import com.ycl.platform.domain.entity.CheckIndexVideo;
+import com.ycl.platform.domain.result.UY.PyOsdResult;
+import com.ycl.platform.domain.result.UY.VideoOnlineResult;
+import com.ycl.platform.domain.vo.TMonitorVO;
+import com.ycl.platform.mapper.CheckIndexVideoMapper;
+import com.ycl.platform.mapper.TMonitorMapper;
+import com.ycl.platform.service.ICheckIndexVideoService;
+import constant.ApiConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import utils.DateUtils;
+
+import java.math.BigDecimal;
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 璁$畻瑙嗛璁惧Osd鏍囨敞淇℃伅銆佹椂闂村噯纭俊鎭�
+ * 鑾峰彇鍒嗙渷鍘呫�佸尯鍩熺殑map<k,v> k涓篸eptId鎴栬�匬rovince_deptId
+ * 鏇存柊鎴栨柊澧�
+ */
+@Component
+public class VideoOsdCalculation extends IndexCalculationServe implements CalculationStrategy<PyOsdResult> {
+ @Autowired
+ private CheckIndexVideoMapper checkIndexVideoMapper;
+ @Autowired
+ private TMonitorMapper monitorMapper;
+ @Autowired
+ private ICheckIndexVideoService checkIndexVideoService;
+
+ //鍖哄煙瑙嗛鍦ㄧ嚎鐜囩殑鍐呴儴绫�
+ private static class AreaStats {
+ int totalSites = 0;
+ int osdAccuracySites = 0;
+ int timeAccuracySites = 0;
+
+ int importantTotalSites = 0;
+ int importantOsdAccuracySites = 0;
+ int importantTimeAccuracySites = 0;
+ }
+
+ @Override
+ public void calculate(List<PyOsdResult> list) {
+ if (CollectionUtils.isEmpty(list)) {
+ return;
+ }
+
+ //鑾峰緱鍥芥爣鐮佷负key鐨勮澶噈ap
+ Map<String, TMonitorVO> monitorMap = monitorMapper.selectListByIds(list.stream().map(PyOsdResult::getDeviceNo).collect(Collectors.toList()))
+ .stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity()));
+ //鑾峰彇鐪佸巺鍥芥爣鐮侀泦鍚�
+ List<String> provinceIds = getProvince();
+ //閲嶇偣鐐逛綅闆嗗悎
+ List<String> important = getImportant();
+
+ Map<String, AreaStats> areaStatsMap = new HashMap<>();
+ for (PyOsdResult result : list) {
+ TMonitorVO monitor = monitorMap.get(result.getDeviceNo());
+ if (monitor == null) continue;
+
+ String deptId = monitor.getDeptId().toString();
+ updateAreaStats(areaStatsMap, deptId, result, important);
+
+ // 澶勭悊鐪佸巺鏁版嵁
+ if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) {
+ String provinceKey = ApiConstants.Province + deptId;
+ updateAreaStats(areaStatsMap, provinceKey, result, important);
+ }
+ }
+
+ // 鏌ヨ鏄惁index琛ㄥ凡缁忓瓨鍦ㄤ粖鏃ユ暟鎹�
+ List<CheckIndexVideo> checkIndexVideoList = checkIndexVideoMapper.selectToday(DateUtils.getDate());
+ List<CheckIndexVideo> checkIndexVideos = new ArrayList<>();
+ areaStatsMap.forEach((deptId, stats) -> {
+ if (stats.totalSites > 0) {
+ CheckIndexVideo CheckIndexVideo = createOrUpdateCheckIndexVideo(deptId, stats, checkIndexVideoList);
+ if (CheckIndexVideo != null) {
+ checkIndexVideos.add(CheckIndexVideo);
+ }
+ }
+ });
+
+ checkIndexVideoService.saveOrUpdateBatch(checkIndexVideos);
+ }
+
+ /**
+ * 绱osd鍚堟牸鏁般�佹椂闂村亸宸悎鏍兼暟
+ */
+ private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, PyOsdResult result, List<String> important) {
+ //杩斿洖瀵硅薄鐨勫紩鐢紝濡傛灉涓嶅瓨鍦ㄤ細鏀惧叆鏂扮殑key,value
+ AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
+ stats.totalSites++;
+ //鏍¢獙osd
+ if (checkOsd(result)) {
+ stats.osdAccuracySites++;
+ }
+ //鏍¢獙鏃堕棿鍋忓樊
+ if (checkTime(result)) {
+ stats.timeAccuracySites++;
+ }
+ //閲嶇偣鐐逛綅
+ if (important.contains(result.getDeviceNo())) {
+ stats.importantTotalSites++;
+ if (checkOsd(result)) {
+ stats.importantOsdAccuracySites++;
+ }
+ if (checkTime(result)) {
+ stats.importantTimeAccuracySites++;
+ }
+ }
+ }
+
+ private Boolean checkOsd(PyOsdResult result) {
+ return ApiConstants.PY_OSD_Correct.equals(result.getOsd1Province()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1City()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1Part()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1LB()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1OSD()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1TimeFormat()) &&
+ ApiConstants.PY_OSD_Correct.equals(result.getOsd1OsdSet());
+ }
+
+ private Boolean checkTime(PyOsdResult result) {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+ // 瑙f瀽鏃堕棿瀛楃涓�
+ LocalDateTime checkTime = LocalDateTime.parse(result.getCheckTime(), formatter);
+ LocalDateTime osdTime = LocalDateTime.parse(result.getSetTime(), formatter);
+ // 璁$畻鏃堕棿宸紙Duration锛�
+ Duration duration = Duration.between(checkTime, osdTime);
+ // 灏嗘椂闂村樊杞崲涓虹
+ long secondsBetween = duration.getSeconds();
+ // 鍒ゆ柇鏃堕棿宸槸鍚﹀湪60绉掍互鍐�
+ return secondsBetween <= 60;
+ }
+
+ /**
+ * 瑙嗛鐐逛綅鍦ㄧ嚎鐜�
+ */
+ private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
+ CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class);
+ if (checkIndexVideo == null) {
+ return null;
+ }
+ //璋冪敤osd鏍囨敞璁$畻鏂规硶
+ Map<String, Object> param = new HashMap<>();
+ param.put("totalSites", stats.totalSites);
+ param.put("osdAccuracySites", stats.osdAccuracySites);
+ BigDecimal osdAccuracy = osdAccuracy(param);
+ checkIndexVideo.setAnnotationAccuracy(osdAccuracy);
+ //璋冪敤osd鏍囨敞璁$畻鏂规硶 璁$畻閲嶇偣osd鏍囨敞
+ Map<String, Object> importantParam = new HashMap<>();
+ param.put("totalSites", stats.importantTotalSites);
+ param.put("osdAccuracySites", stats.importantOsdAccuracySites);
+ BigDecimal imOsdAccuracy = osdAccuracy(importantParam);
+ checkIndexVideo.setKeyAnnotationAccuracy(imOsdAccuracy);
+
+ //璋冪敤osd鏃堕棿鍑嗙‘鐜�
+ Map<String, Object> timeParam = new HashMap<>();
+ param.put("totalSites", stats.totalSites);
+ param.put("timeAccuracySites", stats.timeAccuracySites);
+ BigDecimal osdTimeAccuracy = osdTimeAccuracy(timeParam);
+ checkIndexVideo.setTimingAccuracy(osdTimeAccuracy);
+ //璋冪敤osd鏃堕棿鍑嗙‘鐜�,璁$畻閲嶇偣
+ Map<String, Object> importantTimeParam = new HashMap<>();
+ param.put("totalSites", stats.importantTotalSites);
+ param.put("timeAccuracySites", stats.importantTimeAccuracySites);
+ BigDecimal imOsdTimeAccuracy = osdTimeAccuracy(importantTimeParam);
+ checkIndexVideo.setKeyTimingAccuracy(imOsdTimeAccuracy);
+ return checkIndexVideo;
+ }
+}
diff --git a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
index 5a5af92..7813b7d 100644
--- a/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
+++ b/ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -49,6 +49,8 @@
calculators.put(CalculationStrategyConstants.Video_Usability, new VideoUsabilityCalculation());
//骞冲彴鍦ㄧ嚎鐜�
calculators.put(CalculationStrategyConstants.Video_PlatformOnline,new PlatformOnlineCalculation());
+ //Osd鍑嗙‘鐜囧拰鏃堕棿鏍囨敞鍑嗙‘鐜�
+ calculators.put(CalculationStrategyConstants.Video_OsdTime,new VideoOsdCalculation());
}
public static CalculationStrategy getCalculator(String indexName) {
diff --git a/ycl-server/src/main/java/com/ycl/task/PythonTask.java b/ycl-server/src/main/java/com/ycl/task/PythonTask.java
index d77cd15..430e6a6 100644
--- a/ycl-server/src/main/java/com/ycl/task/PythonTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/PythonTask.java
@@ -30,7 +30,7 @@
* 鎷垮幓osd鏍囨敞銆佹爣娉ㄦ椂闂存暟鎹�
*/
@Slf4j
-@Component("PythonTask")
+@Component("pythonTask")
public class PythonTask {
@Autowired
private MongoTemplate mongoTemplate;
diff --git a/ycl-server/src/main/java/com/ycl/task/VideoTask.java b/ycl-server/src/main/java/com/ycl/task/VideoTask.java
index 38e698b..4dc6072 100644
--- a/ycl-server/src/main/java/com/ycl/task/VideoTask.java
+++ b/ycl-server/src/main/java/com/ycl/task/VideoTask.java
@@ -7,6 +7,7 @@
import com.ycl.platform.domain.param.UY.RecordMetaDSumParam;
import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
+import com.ycl.platform.domain.result.UY.PyOsdResult;
import com.ycl.platform.domain.result.UY.QueryVqdResult;
import com.ycl.platform.domain.result.UY.VideoOnlineResult;
import com.ycl.platform.domain.vo.PlatformOnlineVO;
@@ -95,6 +96,15 @@
CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_PlatformOnline);
calculator.calculate(list);
}
-
+ public void osdTask() {
+ //璁$畻Osd鏍囨敞銆佹椂闂村噯纭巼
+ Date yesterday = DateUtils.addDays(new Date(), -1);
+ Query query = new Query();
+ query.addCriteria(Criteria
+ .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
+ List<PyOsdResult> results = mongoTemplate.find(query, PyOsdResult.class);
+ CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_OsdTime);
+ calculator.calculate(results);
+ }
}
--
Gitblit v1.8.0