fuliqi
2024-08-02 2eb6984d4decf5079350a7d5d49dd138a16dff82
车辆数据抓拍准确性
4个文件已修改
1个文件已添加
197 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/CalculationStrategyConstants.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarAttrRecognitionCalculation.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/CarTask.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -4,29 +4,38 @@
 * 考核计算策略常量
 */
public class CalculationStrategyConstants {
    /**
     * 车辆点位在线率和视图库对接稳定性
     */
    public static final String Car_SiteOnline_ViewStability = "carSiteOnlineViewStability";
    /**
     * 人脸点位在线率和视图库对接稳定性
     */
    public static final String Face_SiteOnline_ViewStability = "faceSiteOnlineViewStability";
    /**
     * 车辆卡口属性监测结果
     */
    public static final String Car_InfoAccuracy = "carInfoAccuracy";
    /**
     * 人脸属性监测结果
     */
    public static final String Face_InfoAccuracy = "faceInfoAccuracy";
    /**
     * 车辆数据上传及时性
     */
    public static final String Car_SnapshotDelay = "carSnapshotDelay";
    /**
     * 车辆抓拍数据完整性
     */
    public static final String Car_DataIntegrity = "carDataIntegrity";
    /**
     * 车辆抓拍数据准确性
     */
    public static final String Car_DataAccuracy = "carDataAccuracy";
    /**
     * 人脸数据上传及时性
     */
    public static final String Face_SnapshotDelay = "faceSnapshotDelay";
    /**
     * 人脸点位在线率和视图库对接稳定性
     */
    public static final String Face_SiteOnline_ViewStability = "faceSiteOnlineViewStability";
    /**
     * 人脸属性监测结果
     */
    public static final String Face_InfoAccuracy = "faceInfoAccuracy";
}
ycl-server/src/main/java/com/ycl/calculate/CarAttrRecognitionCalculation.java
New file
@@ -0,0 +1,126 @@
package com.ycl.calculate;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ycl.platform.domain.entity.CheckIndexCar;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.result.HK.DataIntegrityMonitoringResult;
import com.ycl.platform.domain.result.HK.VehicleDeviceSamplingResult;
import com.ycl.platform.mapper.CheckIndexCarMapper;
import com.ycl.platform.service.ICheckIndexCarService;
import com.ycl.platform.service.ITMonitorService;
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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
 * 计算车辆属性识别准确率
 * 采用车辆抽检指标接口数据
 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
 * 更新或新增
 */
@Component
public class CarAttrRecognitionCalculation extends IndexCalculationServe implements CalculationStrategy<VehicleDeviceSamplingResult> {
    @Autowired
    private CheckIndexCarMapper checkIndexCarMapper;
    @Autowired
    private ITMonitorService monitorService;
    @Autowired
    private ICheckIndexCarService checkIndexCarService;
    //区域车辆属性识别准确率
    private static class AreaStats {
        int totalSites = 0;
        int importantTotalSites = 0;
        int accuracySites = 0;
        int importantAccuracySitesSites = 0;
    }
    @Override
    public void calculate(List<VehicleDeviceSamplingResult> list) {
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        //返回以国标码为key的设备map
        //TODO:monitor去掉了deptId
        Map<String, TMonitor> monitorMap = monitorService.list(new QueryWrapper<TMonitor>()
                        .in("serial_number", list.stream().map(VehicleDeviceSamplingResult::getExternalIndexCode).collect(Collectors.toList())))
                .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
        //获取省厅国标码集合
        List<String> provinceIds = getProvince();
        //获取重点点位集合
        List<String> importantIds = getImportant();
        Map<String, AreaStats> areaStatsMap = new HashMap<>();
        for (VehicleDeviceSamplingResult result : list) {
            TMonitor monitor = monitorMap.get(result.getExternalIndexCode());
            if (monitor == null) continue;
            String deptId = monitor.getDeptId().toString();
            updateAreaStats(areaStatsMap, deptId, result, importantIds);
            // 处理省厅数据
            if (!CollectionUtils.isEmpty(provinceIds) && provinceIds.contains(monitor.getSerialNumber())) {
                String provinceKey = "Province_" + deptId;
                updateAreaStats(areaStatsMap, provinceKey, result, importantIds);
            }
        }
        // 查询是否index表已经存在今日数据
        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
        areaStatsMap.forEach((deptId, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, checkIndexCarList);
                checkIndexCars.add(checkIndexCar);
            }
        });
        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
    }
    /**
     * 累计抓拍数据准确设备数和设备总数,区分重点点位
     */
    private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, VehicleDeviceSamplingResult result, List<String> importantIds) {
        //返回对象的引用,如果不存在会放入新的key,value
        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
        VehicleDeviceSamplingResult.VehicleDifference vehDiff = result.getVehDiff();
        stats.totalSites++;
        //90%及以上数据合格则此车辆卡口设备被视为抓拍数据准确
        if(vehDiff.getMajorConPercent() >= 0.9){
            stats.accuracySites++;
        }
        //重点点位为六项属性
        if(importantIds.contains(key)){
            stats.importantTotalSites++;
            if(vehDiff.getImportantConPercent() >= 0.9){
                stats.importantAccuracySitesSites++;
            }
        }
    }
    /**
     * 车辆信息采集正确率
     */
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) {
        CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList);
        //调用计算方法
        Map<String, Object> param = new HashMap<>();
        param.put("totalSites", stats.totalSites);
        param.put("importantTotalSites", stats.importantTotalSites);
        param.put("accuracySites", stats.accuracySites);
        param.put("importantAccuracySites", stats.importantAccuracySitesSites);
        BigDecimal dataAccuracy = dataAccuracy(param);
        checkIndexCar.setVehicleCaptureAccuracy(dataAccuracy);
        return checkIndexCar;
    }
}
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -59,7 +59,7 @@
        return result.setScale(4, RoundingMode.HALF_UP);
    }
    //数据完整性
    //车辆数据完整性
    public BigDecimal dataIntegrity(Map<String, Object> param){
        BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
        BigDecimal importantTotalSites = new BigDecimal((Integer) param.get("importantTotalSites"));
@@ -70,6 +70,16 @@
        return result.setScale(4, RoundingMode.HALF_UP);
    }
    //车辆数据完整性
    public BigDecimal dataAccuracy(Map<String, Object> param){
        BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites"));
        BigDecimal importantTotalSites = new BigDecimal((Integer) param.get("importantTotalSites"));
        BigDecimal accuracySites = new BigDecimal((Integer) param.get("accuracySites"));
        BigDecimal importantAccuracySites = new BigDecimal((Integer) param.get("importantAccuracySites"));
        BigDecimal result = accuracySites.divide(totalSites, 10, RoundingMode.HALF_UP)
                .add(importantAccuracySites.divide(importantTotalSites, 10, RoundingMode.HALF_UP));
        return result.setScale(4, RoundingMode.HALF_UP);
    }
    //返回省厅国标码集合
    public List<String> getProvince() {
        // TODO: 分省厅市局 需要补充集合数据
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -19,6 +19,10 @@
        //抓拍数据上传延迟
        calculators.put(CalculationStrategyConstants.Car_SnapshotDelay, new CarSnapshotDelayCalculation());
        calculators.put(CalculationStrategyConstants.Face_SnapshotDelay, new FaceSnapshotDelayCalculation());
        //车辆数据抓拍完整性
        calculators.put(CalculationStrategyConstants.Car_DataIntegrity,new CarDataIntegrityCalculation());
        //车辆数据抓拍准确性
        calculators.put(CalculationStrategyConstants.Car_DataAccuracy,new CarAttrRecognitionCalculation());
    }
    public static CalculationStrategy getCalculator(String indexName) {
ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -3,9 +3,7 @@
import com.ycl.calculate.CalculationStrategy;
import com.ycl.factory.IndexCalculationFactory;
import com.ycl.platform.domain.result.HK.CrossDetailResult;
import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
import com.ycl.platform.domain.result.HK.SnapshotDelayMonitorResult;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.utils.DateUtils;
import constant.ApiConstants;
import constant.CalculationStrategyConstants;
@@ -61,6 +59,30 @@
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_SnapshotDelay);
        calculator.calculate(results);
    }
    public void snapShopDataIntegrity(){
        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<DataIntegrityMonitoringResult> results = mongoTemplate.find(query, DataIntegrityMonitoringResult.class);
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_DataIntegrity);
        calculator.calculate(results);
    }
    public void test(){
        Date yesterday = DateUtils.addDays(new Date(), -1);
        //联网卡口设备目录一致率
    }
    public void AttrRecognitionMonitorTask(){
        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<VehicleDeviceSamplingResult> results = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_DataIntegrity);
        calculator.calculate(results);
    }
}