xiangpei
2024-08-16 3364d6efd58eca1d6acf129948265b1e663dae7a
Merge remote-tracking branch 'origin/master'
7个文件已修改
1个文件已添加
236 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/ApiConstants.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/CalculationStrategyConstants.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/PyOsdResult.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/PythonTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/VideoTask.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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";
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";
    /**
     * 一机一档注册率、档案考核比
     */
@@ -78,4 +80,8 @@
     * 平台在线率
     */
    public static final String Video_PlatformOnline = "videoPlatformOnline";
    /**
     * Osd准确率和时间标注准确率
     */
    public static final String Video_OsdTime = "videoOsdTime";
}
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_时间格式是否正确
     */
    private String osd1TimeFormat;
    private Integer osd1TimeFormat;
    /**
     * osd1_省设置
@@ -131,7 +131,7 @@
    /**
     * osd1_osd设置
     */
    private String osd1OsdSet;
    private Integer osd1OsdSet;
    /**
     * osd1 时间格式
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"));
ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java
New file
@@ -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为deptId或者Province_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的设备map
        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");
        // 解析时间字符串
        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;
    }
}
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) {
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;
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);
    }
}