package com.ycl.calculate; import com.ycl.platform.domain.entity.CheckIndexVideo; import com.ycl.platform.domain.result.UY.OsdCheckResult; import com.ycl.platform.mapper.CheckIndexVideoMapper; import com.ycl.platform.service.ICheckIndexVideoService; import constant.ApiConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import utils.DateUtils; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 计算视频设备Osd标注信息、时间准确信息 * 获取分省厅、区域的map k为deptId或者Province_deptId * 更新或新增 */ @Component @Slf4j public class VideoOsdCalculation extends IndexCalculationServe implements CalculationStrategy { @Autowired private CheckIndexVideoMapper checkIndexVideoMapper; @Autowired private ICheckIndexVideoService checkIndexVideoService; //区域视频在线率的内部类 protected static class AreaStats { int totalSites = 0; int importantTotalSites = 0; int importantOsdAccuracySites = 0; int importantTimeAccuracySites = 0; } @Override public void calculate(List list) { //获取分区域的指标数量 Map areaStatsMap = getAreaStatsMap(list); if (areaStatsMap == null) return; // 查询是否index表已经存在今日数据 List checkIndexVideoList = checkIndexVideoMapper.selectToday(DateUtils.getDate()); List 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合格数、时间偏差合格数 */ @Override public void updateAreaStats(Map areaStatsMap, String key, OsdCheckResult result) { //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); stats.totalSites++; //重点点位 if (result.getImportantTag()) { stats.importantTotalSites++; if (checkOsd(result)) { stats.importantOsdAccuracySites++; } if (checkTime(result)) { stats.importantTimeAccuracySites++; } } } private Boolean checkOsd(OsdCheckResult result) { return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect()) && ApiConstants.OSD_Correct.equals(result.getOsdNameCorrect()) && ApiConstants.OSD_Correct.equals(result.getOsdProvinceCorrect()) && ApiConstants.OSD_Correct.equals(result.getOsdCityCorrect()) && ApiConstants.OSD_Correct.equals(result.getOsdPartCorrect()); } private Boolean checkTime(OsdCheckResult result) { return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect()); } /** * 视频点位在线率 */ private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List checkIndexVideoList) { CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class); if (checkIndexVideo == null) { return null; } //调用osd标注计算方法 计算重点osd标注 Map importantParam = new HashMap<>(); importantParam.put("totalSites", stats.importantTotalSites); importantParam.put("osdAccuracySites", stats.importantOsdAccuracySites); BigDecimal imOsdAccuracy = osdAccuracy(importantParam); checkIndexVideo.setKeyAnnotationAccuracy(imOsdAccuracy); //调用osd时间准确率,计算重点 Map importantTimeParam = new HashMap<>(); importantTimeParam.put("totalSites", stats.importantTotalSites); importantTimeParam.put("timeAccuracySites", stats.importantTimeAccuracySites); BigDecimal imOsdTimeAccuracy = osdTimeAccuracy(importantTimeParam); checkIndexVideo.setKeyTimingAccuracy(imOsdTimeAccuracy); return checkIndexVideo; } }