ycl-common/src/main/java/constant/ApiConstants.java
@@ -75,6 +75,8 @@ /** 考核指标 条件参数 */ //车辆考核,点位在线率,区县不少于40路 public final static Integer Check_Car_SiteOnline = 40; public final static Integer Check_Face_SiteOnline = 40; //车辆在线率 Redis 每月数据中断次数 Hash key public final static String Check_Car_ViewConnect = "ViewConnectNoData"; public final static String Check_Car_ViewConnect = "CarViewConnectNoData"; public final static String Check_Face_ViewConnect = "FaceViewConnectNoData"; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java
@@ -60,7 +60,8 @@ /** * 人脸合格性相关数据 */ private FaceEligibility faceElig; //TODO:参数名修改看接口是否有参数 private FaceEligibility faceEligibility; // 内嵌对象定义 ycl-server/src/main/java/com/ycl/calculate/CarSnapshopDataCalculation.java
@@ -111,7 +111,6 @@ /** * 累计总点位数、离线数、总抓拍量 */ //TODO:无数据处理 private void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, SnapshotDataMonitorResult result) { //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); ycl-server/src/main/java/com/ycl/calculate/FaceConsistentCalculation.java
@@ -27,7 +27,7 @@ import java.util.stream.Collectors; /** * 计算车辆目录一致率 * 计算人脸目录一致率 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId * 更新或新增 */ @@ -62,7 +62,7 @@ } //获取省厅国标码集合 List<String> provinceIds = getProvince(); //未注册车辆设备 //未注册人脸设备 Map<String,TMonitor> newMonitorMap = new HashMap<>(); //Mongo一机一档同步Mysql时放入Redis 筛选出车辆档案 String json = (String) redisTemplate.opsForValue().get(RedisConstant.New_Monitor_Set); ycl-server/src/main/java/com/ycl/calculate/FaceDeviceSampleCalculation.java
@@ -93,15 +93,19 @@ //返回对象的引用,如果不存在会放入新的key,value AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats()); FaceDeviceSamplingResult.BigUsefulness bigUseful = result.getBigUseful(); FaceDeviceSamplingResult.FaceEligibility faceElig = result.getFaceElig(); FaceDeviceSamplingResult.FaceEligibility faceElig = result.getFaceEligibility(); stats.totalSites++; //90%及以上数据合格则此人脸设备被视为图片合格 if (faceElig.getFaceEligPercent() >= 0.9) { stats.picQualifySites++; if (faceElig != null) { if (faceElig.getFaceEligPercent() >= 0.9) { stats.picQualifySites++; } } //大图可用率大于90%视为合格 if (bigUseful.getBigUsefulPercent() >= 0.9) { stats.picUsabilitySites++; if (bigUseful != null) { if (bigUseful.getBigUsefulPercent() >= 0.9) { stats.picUsabilitySites++; } } } ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -16,6 +16,7 @@ import constant.CheckSnapCountConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import utils.DateUtils; @@ -23,6 +24,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -46,6 +48,8 @@ private SysConfigMapper sysConfigMapper; @Autowired private TMonitorMapper monitorMapper; @Autowired private RedisTemplate redisTemplate; //区域人脸点位在线指标的内部类 private static class AreaStats { @@ -67,7 +71,15 @@ List<String> provinceIds = getProvince(); Map<String, AreaStats> areaStatsMap = new HashMap<>(); // 获取当前日期 LocalDate today = LocalDate.now(); // 获取本月的第一天 LocalDate firstDayOfMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 判断今天是否是本月的第一天 if (today.equals(firstDayOfMonth)) { // 如果是,则清除Redis中记录中断次数的数据 redisTemplate.delete(ApiConstants.Check_Face_ViewConnect); } for (SnapshotDataMonitorResult result : list) { TMonitorVO monitor = monitorMap.get(result.getExternalIndexCode()); if (monitor == null) continue; @@ -129,18 +141,36 @@ return null; } //调用点位在线计算方法 Map<String, Object> siteOnlineParam = new HashMap<>(); siteOnlineParam.put("totalSites", stats.totalSites); siteOnlineParam.put("onlineSites", stats.onlineSites); BigDecimal siteOnline = siteOnline(siteOnlineParam); checkIndexFace.setSiteOnline(siteOnline); if (stats.totalSites >= ApiConstants.Check_Face_SiteOnline) { Map<String, Object> siteOnlineParam = new HashMap<>(); siteOnlineParam.put("totalSites", stats.totalSites); siteOnlineParam.put("onlineSites", stats.onlineSites); BigDecimal siteOnline = siteOnline(siteOnlineParam); checkIndexFace.setSiteOnline(siteOnline); } else { checkIndexFace.setSiteOnline(BigDecimal.ZERO); } //视图库对接稳定性 BigDecimal avgCount = key.startsWith(ApiConstants.Province) ? cityCountAvg : countyCountAvg; Map<String, Object> viewConnectParam = new HashMap<>(); viewConnectParam.put("totalDataSum", stats.totalDataSum); viewConnectParam.put("avgCount", avgCount); BigDecimal viewConnectStability = viewConnectStability(viewConnectParam); checkIndexFace.setViewConnectStability(viewConnectStability); //Redis记录该区县当月无数据上传次数 Integer noDateCount = (Integer) redisTemplate.opsForHash().get(ApiConstants.Check_Face_ViewConnect, key); // 如果值为null,则初始化为0 if (noDateCount == null) { noDateCount = 0; } Double deductScore = 0.1 * noDateCount; if (stats.totalDataSum != 0) { BigDecimal avgCount = key.startsWith(ApiConstants.Province) ? cityCountAvg : countyCountAvg; Map<String, Object> viewConnectParam = new HashMap<>(); viewConnectParam.put("totalDataSum", stats.totalDataSum); viewConnectParam.put("avgCount", avgCount); BigDecimal viewConnectStability = viewConnectStability(viewConnectParam); viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE); checkIndexFace.setViewConnectStability(viewConnectStability); } else { noDateCount++; } // 将新的值放回Hash中 redisTemplate.opsForHash().put(ApiConstants.Check_Face_ViewConnect, key, noDateCount); return checkIndexFace; } } ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDelayCalculation.java
@@ -120,7 +120,7 @@ param.put("delayCount2", stats.delayCount2); param.put("delayCount3", stats.delayCount3); BigDecimal index = snapshopDelay(param); checkIndexFace.setSiteOnline(index); checkIndexFace.setFaceUploadTimeliness(index); return checkIndexFace; } } ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -34,7 +34,7 @@ @Autowired private TMonitorMapper monitorMapper; public void siteOnlineTask() { log.info("开始计算点位在线率和视图库对接稳定性"); log.info("开始计算车辆点位在线率和视图库对接稳定性"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); ycl-server/src/main/java/com/ycl/task/FaceTask.java
@@ -7,6 +7,7 @@ import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; import constant.ApiConstants; import constant.CalculationStrategyConstants; import constant.CheckConstants; @@ -34,63 +35,85 @@ private TMonitorMapper monitorMapper; public void siteOnlineTask() { log.info("开始计算人脸点位在线率和视图库对接稳定性"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); //点位在线率和视图库对接稳定性 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)) .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)) .and("dataType").is(ApiConstants.HK_DataType_FACE)); List<SnapshotDataMonitorResult> results = mongoTemplate.find(query, SnapshotDataMonitorResult.class); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SiteOnline_ViewStability); calculator.calculate(results); log.info("结束计算人脸点位在线率和视图库对接稳定性"); } public void deviceSampleTask() { log.info("开始计算人脸图片合格率、大图可用性"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); //计算人脸图片合格率、大图可用性 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))); .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List<FaceDeviceSamplingResult> results = mongoTemplate.find(query, FaceDeviceSamplingResult.class); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_DataAccuracy_PicUsability); calculator.calculate(results); log.info("结束计算人脸图片合格率、大图可用性"); } public void infoAccuracyTask(){ log.info("开始计算人脸卡口信息采集准确率"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); //计算人脸卡口信息采集准确率 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))); .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List<MonitoringDetailResult> results = mongoTemplate.find(query, MonitoringDetailResult.class); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_InfoAccuracy); calculator.calculate(results); log.info("结束计算人脸卡口信息采集准确率"); } public void snapShopDelay(){ log.info("开始计算人脸抓拍数据上传及时性"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); //计算人脸抓拍数据上传及时性 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)) .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)) .and("dataType").is(ApiConstants.HK_DataType_FACE)); List<SnapshotDelayMonitorResult> results = mongoTemplate.find(query, SnapshotDelayMonitorResult.class); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SnapshotDelay); calculator.calculate(results); log.info("结束计算人脸抓拍数据上传及时性"); } public void clockAccuracyTask() { log.info("开始计算人脸设备时钟准确性"); Date yesterday = DateUtils.addDays(new Date(), -1); //TODO:时间写死了 Date date = DateUtils.getDay(2024,7,13); //计算人脸设备时钟准确性 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday))); .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List<FaceDeviceInspectionResult> results = mongoTemplate.find(query, FaceDeviceInspectionResult.class); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_ClockAccuracy); calculator.calculate(results); log.info("结束计算人脸设备时钟准确性"); } public void directConsistentTask() { log.info("开始计算人脸目录一致率"); //人脸目录一致率 List<TMonitorVO> tMonitorVOS = monitorMapper.selectMonitorVOList(); List<TMonitorVO> list = tMonitorVOS.stream().filter(tMonitorVO -> tMonitorVO.getCameraFunType().contains(CheckConstants.Rule_Category_Face + "")).collect(Collectors.toList()); List<TMonitorVO> list = tMonitorVOS.stream().filter(tMonitorVO ->!StringUtils.isEmpty(tMonitorVO.getCameraFunType()) && tMonitorVO.getCameraFunType().contains(CheckConstants.Rule_Category_Face + "")).collect(Collectors.toList()); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_DirectConsistent); calculator.calculate(list); log.info("结束计算人脸目录一致率"); } } ycl-server/src/main/resources/mapper/zgyw/CheckIndexFaceMapper.xml
@@ -112,7 +112,7 @@ </delete> <select id="selectToday" resultType="com.ycl.platform.domain.entity.CheckIndexFace"> select * from t_check_index_car where DATE(create_time) = #{today} select * from t_check_index_face where DATE(create_time) = #{today} </select> <select id="dashboard" resultType="com.ycl.platform.domain.entity.CheckIndexFace">