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("结束抓拍数据量检测结果数据同步");