fuliqi
2024-10-15 c4d949d801ef6261741567ddbd7594631503ef82
抓拍量加权
6个文件已修改
178 ■■■■ 已修改文件
ycl-common/src/main/java/constant/CheckConstants.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarSnapshopDataCalculation.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/CheckConstants.java
@@ -28,13 +28,15 @@
    public static final String Status_Stop = "1";
    /**
     * 车辆同期抓拍量字典表
     * 车辆、人脸同期抓拍量字典表
     */
    public final static String DICT_CAR_SNAP = "check_car_snap";
    /**
     * 人脸同期抓拍量字典表
     */
    public final static String DICT_FACE_SNAP = "check_face_snap";
    public final static String DICT_LAST_SNAP = "check_last_snap";
    /** 抓拍量标签常量 */
    public final static String SNAP_PROVINCE_CAR ="PROVINCE_CAR";
    public final static String SNAP_PROVINCE_FACE ="PROVINCE_FACE";
    public final static String SNAP_COUNTY_CAR ="COUNTY_CAR";
    public final static String SNAP_COUNTY_FACE ="COUNTY_FACE";
    /**
     * 2022抓拍数计算倍率
     */
ycl-server/src/main/java/com/ycl/calculate/CarSnapshopDataCalculation.java
@@ -41,16 +41,19 @@
    private RedisTemplate redisTemplate;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    //区域车辆视图库对接稳定性的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int totalDataSum = 0;
        //加权后的同期抓拍量
        int lastSnapCount = 0;
    }
    @Override
    public void calculate(List<SnapshotDataMonitorResult> list) {
        //获取分区域的指标数量
        Map<String, CarSnapshopDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list,Boolean.FALSE);
        Map<String, CarSnapshopDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list, Boolean.FALSE);
        if (areaStatsMap == null) return;
        // 获取当前日期
@@ -63,13 +66,15 @@
            redisTemplate.delete(RedisConstant.Check_Car_ViewConnect);
        }
        //从字典获取同期抓拍量
        List<SysDictData> carSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_CAR_SNAP);
        List<SysDictData> lastSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_LAST_SNAP);
        //根据各个区县点位数据对同期抓拍量做加权处理
        fillLastSnap(areaStatsMap, lastSnap);
        // 查询是否index表已经存在今日数据
        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
        areaStatsMap.forEach((key, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(key, stats, checkIndexCarList,carSnap);
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(key, stats, checkIndexCarList);
                if (checkIndexCar != null) {
                    checkIndexCars.add(checkIndexCar);
                }
@@ -77,6 +82,49 @@
        });
        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
    }
    //根据点位数量对同期抓拍量作加权处理
    private void fillLastSnap(Map<String, AreaStats> areaStatsMap, List<SysDictData> lastSnap) {
        //省厅总点位数
        int provinceTotalSites = 0;
        //区县总点位数
        int countyTotalSites = 0;
        //从字典里筛选省厅值
        int lastProvinceSnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_PROVINCE_CAR.equals(sysDictData.getDictLabel())).findFirst().get().getDictValue());
        //从字典里筛选区县值
        int lastCountySnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_COUNTY_CAR.equals(sysDictData.getDictLabel())).findFirst().get().getDictValue());;
        //计算总数
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            if (key.startsWith(ApiConstants.Province)) {
                provinceTotalSites += value.totalSites;
            } else {
                countyTotalSites += value.totalSites;
            }
        }
        //加权操作,补充同期抓拍量
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            //省厅
            if (key.startsWith(ApiConstants.Province)) {
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    value.lastSnapCount = (value.totalSites / provinceTotalSites) * lastProvinceSnap;
                }
            } else {
                //区县
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    value.lastSnapCount = (value.totalSites / countyTotalSites) * lastCountySnap;
                }
            }
        }
    }
    /**
@@ -97,7 +145,7 @@
    /**
     * 车辆视图库对接稳定性
     */
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList,List<SysDictData> carSnap) {
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) {
        CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList, CheckIndexCar.class);
        if (checkIndexCar == null) {
            return null;
@@ -113,18 +161,12 @@
        Double deductScore = 0.1 * noDateCount;
        if (stats.totalDataSum != 0) {
            Integer deptId = key.startsWith(ApiConstants.Province) ? Integer.parseInt(key.split("_")[1]) : Integer.parseInt(key);
            String dictKey = key.startsWith(ApiConstants.Province) ? ApiConstants.Province+AreaDeptEnum.fromDept(deptId).getCode() : ApiConstants.County+AreaDeptEnum.fromDept(deptId).getCode();
            Optional<SysDictData> first = carSnap.stream().filter(sysDictData -> sysDictData.getDictLabel().equals(dictKey)).findFirst();
            if(first.isPresent()){
                String value = first.get().getDictValue();
                Map<String, Object> viewConnectParam = new HashMap<>();
                viewConnectParam.put("totalDataSum", stats.totalDataSum);
                viewConnectParam.put("avgCount", new BigDecimal(value).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
                BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
                viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
                checkIndexCar.setViewConnectStability(viewConnectStability);
            }
            Map<String, Object> viewConnectParam = new HashMap<>();
            viewConnectParam.put("totalDataSum", stats.totalDataSum);
            viewConnectParam.put("lastCount", new BigDecimal(stats.lastSnapCount).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
            BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
            viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
            checkIndexCar.setViewConnectStability(viewConnectStability);
        } else {
            noDateCount++;
        }
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -52,16 +52,19 @@
    private RedisTemplate redisTemplate;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    //区域人脸点位在线指标的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int totalDataSum = 0;
        //加权后的同期抓拍量
        int lastSnapCount = 0;
    }
    @Override
    public void calculate(List<SnapshotDataMonitorResult> list) {
        //获取分区域的指标数量
        Map<String, FaceSnapshotDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list,Boolean.FALSE);
        Map<String, FaceSnapshotDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list, Boolean.FALSE);
        if (areaStatsMap == null) return;
        // 获取当前日期
@@ -74,13 +77,15 @@
            redisTemplate.delete(RedisConstant.Check_Face_ViewConnect);
        }
        //从字典获取同期抓拍量
        List<SysDictData> faceSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_FACE_SNAP);
        List<SysDictData> lastSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_LAST_SNAP);
        //根据各个区县点位数据对同期抓拍量做加权处理
        fillLastSnap(areaStatsMap, lastSnap);
        // 查询今日数据
        List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate());
        List<CheckIndexFace> checkIndexFaces = new ArrayList<>();
        areaStatsMap.forEach((deptId, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList,faceSnap);
                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList, lastSnap);
                if (checkIndexFace != null) {
                    checkIndexFaces.add(checkIndexFace);
                }
@@ -88,6 +93,50 @@
        });
        checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces);
    }
    //根据点位数量对同期抓拍量作加权处理
    private void fillLastSnap(Map<String, AreaStats> areaStatsMap, List<SysDictData> lastSnap) {
        //省厅总点位数
        int provinceTotalSites = 0;
        //区县总点位数
        int countyTotalSites = 0;
        //从字典里筛选省厅值
        int lastProvinceSnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_PROVINCE_FACE.equals(sysDictData.getDictLabel())).findFirst().get().getDictValue());
        //从字典里筛选区县值
        int lastCountySnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_COUNTY_FACE.equals(sysDictData.getDictLabel())).findFirst().get().getDictValue());
        ;
        //计算总数
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            if (key.startsWith(ApiConstants.Province)) {
                provinceTotalSites += value.totalSites;
            } else {
                countyTotalSites += value.totalSites;
            }
        }
        //加权操作,补充同期抓拍量
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            //省厅
            if (key.startsWith(ApiConstants.Province)) {
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    value.lastSnapCount = (value.totalSites / provinceTotalSites) * lastProvinceSnap;
                }
            } else {
                //区县
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    value.lastSnapCount = (value.totalSites / countyTotalSites) * lastCountySnap;
                }
            }
        }
    }
    //累计总点位数、离线数、总抓拍量
@@ -103,7 +152,7 @@
    //人脸视图库对接稳定性
    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList,List<SysDictData> faceSnap) {
    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList, List<SysDictData> faceSnap) {
        CheckIndexFace checkIndexFace = getCheckIndex(key, checkIndexFaceList, CheckIndexFace.class);
        if (checkIndexFace == null) {
            return null;
@@ -116,20 +165,13 @@
            noDateCount = 0;
        }
        Double deductScore = 0.1 * noDateCount;
        log.info("总量:{}",stats.totalDataSum);
        if (stats.totalDataSum != 0) {
            Integer deptId = key.startsWith(ApiConstants.Province) ? Integer.parseInt(key.split("_")[1]) : Integer.parseInt(key);
            String dictKey = key.startsWith(ApiConstants.Province) ? ApiConstants.Province+ AreaDeptEnum.fromDept(deptId).getCode() : ApiConstants.County+AreaDeptEnum.fromDept(deptId).getCode();
            Optional<SysDictData> first = faceSnap.stream().filter(sysDictData -> sysDictData.getDictLabel().equals(dictKey)).findFirst();
            if(first.isPresent()) {
                String value = first.get().getDictValue();
                Map<String, Object> viewConnectParam = new HashMap<>();
                viewConnectParam.put("totalDataSum", stats.totalDataSum);
                viewConnectParam.put("avgCount", new BigDecimal(value).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
                BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
                viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
                checkIndexFace.setViewConnectStability(viewConnectStability);
            }
            Map<String, Object> viewConnectParam = new HashMap<>();
            viewConnectParam.put("totalDataSum", stats.totalDataSum);
            viewConnectParam.put("lastCount", new BigDecimal(stats.lastSnapCount).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
            BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
            viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
            checkIndexFace.setViewConnectStability(viewConnectStability);
        } else {
            noDateCount++;
        }
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java
@@ -48,7 +48,7 @@
                String provinceKey = ApiConstants.Province + deptId;
                updateAreaStats(areaStatsMap, provinceKey, result);
            }
            // 处理公安部考核数据
            // 处理公安部考核数据(公安部数据只有视频才有,所以这里定义了needDept来决定是否需要处理部级数据)
            if (needDept) {
                if (result.getDeptTag() != null && result.getDeptTag()) {
                    String deptKey = ApiConstants.Dept + deptId;
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationUtils.java
@@ -109,9 +109,9 @@
    //视图库对接稳定性
    public BigDecimal viewConnectStability(Map<String, Object> param) {
        BigDecimal totalDataSum = new BigDecimal((Integer) param.get("totalDataSum"));
        BigDecimal avgCount = (BigDecimal) param.get("avgCount");
        log.info("视图库对接稳定性,totalDataSum:{},avgCount:{}",totalDataSum,avgCount);
        return BigDecimal.ZERO.compareTo(totalDataSum) == 0 ? BigDecimal.ZERO : avgCount.divide(totalDataSum, 4, RoundingMode.HALF_UP);
        BigDecimal lastCount = (BigDecimal) param.get("lastCount");
        log.info("视图库对接稳定性,totalDataSum:{},lastCount:{}",totalDataSum,lastCount);
        return totalDataSum.divide(lastCount, 4, RoundingMode.HALF_UP);
    }
    //标注正确率
ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -123,7 +123,8 @@
            //存放在mongo中
            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_CAR));
            mongoTemplate.insertAll(carList);
            //TODO:更新point表在线状态
            //TODO:更新point表在线状态(有抓拍量视作在线)
            //工单
        }
        /** 人脸数据 */
@@ -149,7 +150,8 @@
            //存放在mongo中
            faceList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            mongoTemplate.insertAll(faceList);
            //TODO:更新point表在线状态
            //TODO:更新point表在线状态(有抓拍量视作在线)
            //工单
        }
        log.info("结束抓拍数据量检测结果数据同步");