ycl-common/src/main/java/constant/CalculationStrategyConstants.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/calculate/CarAttrRecognitionCalculation.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/calculate/IndexCalculationServe.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ycl-server/src/main/java/com/ycl/task/CarTask.java | ●●●●● 补丁 | 查看 | 原始文档 | 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); } }