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