package com.ycl.calculate; import com.ycl.platform.base.CheckIndex; import constant.ApiConstants; import constant.CheckConstants; import lombok.extern.slf4j.Slf4j; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Optional; @Slf4j public class IndexCalculationUtils { //检查是否存在当日数据 public T getCheckIndex(String key, List checkIndexList, Class clazz) { T checkIndex; // 检查是否已存在今日数据 Optional existingIndex = checkIndexList.stream() .filter(index -> key.startsWith(ApiConstants.Province) ? CheckConstants.Examine_Tag_Province.equals(index.getExamineTag()) && key.split("_")[1].equals(index.getDeptId().toString()) : CheckConstants.Examine_Tag_County.equals(index.getExamineTag()) && key.equals(index.getDeptId().toString())) .findFirst(); if (existingIndex.isPresent()) { checkIndex = existingIndex.get(); } else { try { checkIndex = clazz.getDeclaredConstructor().newInstance(); checkIndex.setDeptId(key.startsWith(ApiConstants.Province) ? Long.parseLong(key.split("_")[1]) : Long.parseLong(key)); checkIndex.setExamineTag(key.startsWith(ApiConstants.Province) ? CheckConstants.Examine_Tag_Province : CheckConstants.Examine_Tag_County); checkIndex.setCreateTime(new Date()); } catch (Exception e) { checkIndex = null; log.error("无法创建 checkIndex 实例", e); } } return checkIndex; } /** --------指标算法---------*/ //一机一档合格率 public BigDecimal monitorQualify(Map param) { BigDecimal totalMonitors = new BigDecimal((Integer) param.get("totalMonitors")); BigDecimal qualifyMonitor = new BigDecimal((Integer) param.get("qualifyMonitor")); return BigDecimal.ZERO.compareTo(totalMonitors) == 0 ? BigDecimal.ZERO : qualifyMonitor.divide(totalMonitors, 4, RoundingMode.HALF_UP); } //一机一档注册率率 public BigDecimal monitorRegistration(Map param) { //新+正在用的档案数 BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); //正在用的档案数 BigDecimal useSites = new BigDecimal((Integer) param.get("totalSites") - (Integer) param.get("newSites")); return BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : useSites.divide(totalSites, 4, RoundingMode.HALF_UP); } //档案考核比 public BigDecimal archivesRate(Map param) { BigDecimal allFiles = new BigDecimal((Integer) param.get("allFiles")); BigDecimal todayFiles = new BigDecimal((Integer) param.get("todayFiles")); return BigDecimal.ZERO.compareTo(todayFiles) == 0 ? BigDecimal.ZERO : todayFiles.divide(allFiles, 4, RoundingMode.HALF_UP); } //点位在线率 public BigDecimal siteOnline(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal onlineSites = new BigDecimal((Integer) param.get("onlineSites")); return BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : onlineSites.divide(totalSites, 4, RoundingMode.HALF_UP); } //视频Osd准确率 public BigDecimal osdAccuracy(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal osdAccuracySites = new BigDecimal((Integer) param.get("osdAccuracySites")); return BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : osdAccuracySites.divide(totalSites, 4, RoundingMode.HALF_UP); } //视频时间合格率 public BigDecimal osdTimeAccuracy(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal timeAccuracySites = new BigDecimal((Integer) param.get("timeAccuracySites")); return BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : timeAccuracySites.divide(totalSites, 4, RoundingMode.HALF_UP); } //目录一致率,每超过百分之1扣10% public BigDecimal directoryConstant(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal newSites = new BigDecimal((Integer) param.get("newSites")); // 计算newSites占totalSites的百分比倍数 BigDecimal percentage = newSites.divide(totalSites, 2, RoundingMode.DOWN).multiply(BigDecimal.valueOf(100)); BigDecimal result = BigDecimal.ONE; //超过百分之1没,超过了才扣分 if (BigDecimal.ONE.compareTo(percentage) <= 0) { result = result.subtract(percentage.multiply(new BigDecimal("0.1"))); } return result.max(BigDecimal.ZERO); } //视图库对接稳定性 public BigDecimal viewConnectStability(Map 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); } //标注正确率 public BigDecimal infoAccuracy(Map param) { BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); BigDecimal qualifySiteCount = new BigDecimal((Integer) param.get("qualifySite")); return BigDecimal.ZERO.compareTo(totalSitesCount) == 0 ? BigDecimal.ZERO : qualifySiteCount.divide(totalSitesCount, 4, RoundingMode.HALF_UP); } //数据上传及时性 public BigDecimal snapshopDelay(Map param) { BigDecimal totalCount = new BigDecimal((Integer) param.get("totalCount")); BigDecimal delayCount = new BigDecimal((Integer) param.get("delayCount")); BigDecimal delayCount1 = new BigDecimal((Integer) param.get("delayCount1")); BigDecimal delayCount2 = new BigDecimal((Integer) param.get("delayCount2")); BigDecimal delayCount3 = new BigDecimal((Integer) param.get("delayCount3")); BigDecimal result = BigDecimal.ZERO.compareTo(totalCount) == 0 ? BigDecimal.ZERO : totalCount.subtract(delayCount).divide(totalCount, 10, RoundingMode.HALF_UP).multiply(BigDecimal.ONE) .add(delayCount1.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(BigDecimal.ONE)) .add(delayCount2.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.8"))) .add(delayCount3.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.6"))); return result.setScale(4, RoundingMode.HALF_UP); } //车辆数据完整性 public BigDecimal dataIntegrity(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal importantTotalSites = new BigDecimal((Integer) param.get("importantTotalSites")); BigDecimal integritySites = new BigDecimal((Integer) param.get("integritySites")); BigDecimal importantIntegritySites = new BigDecimal((Integer) param.get("importantIntegritySites")); BigDecimal total = BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : integritySites.divide(totalSites, 10, RoundingMode.HALF_UP); BigDecimal important = BigDecimal.ZERO.compareTo(importantTotalSites) == 0 ? BigDecimal.ZERO : importantIntegritySites.divide(importantTotalSites, 10, RoundingMode.HALF_UP); return total.multiply(important).setScale(4, RoundingMode.HALF_UP); } //车辆数据完整性 public BigDecimal dataAccuracy(Map 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 total = BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : accuracySites.divide(totalSites, 10, RoundingMode.HALF_UP); BigDecimal important = BigDecimal.ZERO.compareTo(importantTotalSites) == 0 ? BigDecimal.ZERO : importantAccuracySites.divide(importantTotalSites, 10, RoundingMode.HALF_UP); return total.multiply(important).setScale(4, RoundingMode.HALF_UP); } //时钟准确性 public BigDecimal clockAccuracy(Map param) { BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); BigDecimal accuracySites = new BigDecimal((Integer) param.get("accuracySites")); return BigDecimal.ZERO.compareTo(totalSitesCount) == 0 ? BigDecimal.ZERO : accuracySites.divide(totalSitesCount, 4, RoundingMode.HALF_UP); } //url可用性 public BigDecimal urlUsability(Map param) { BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); BigDecimal urlQualifySites = new BigDecimal((Integer) param.get("urlQualifySites")); return BigDecimal.ZERO.compareTo(totalSitesCount) == 0 ? BigDecimal.ZERO : urlQualifySites.divide(totalSitesCount, 4, RoundingMode.HALF_UP); } //大图可用性 public BigDecimal picUsability(Map param) { BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); BigDecimal picUsabilitySites = new BigDecimal((Integer) param.get("picUsabilitySites")); return BigDecimal.ZERO.compareTo(totalSitesCount) == 0 ? BigDecimal.ZERO : picUsabilitySites.divide(totalSitesCount, 4, RoundingMode.HALF_UP); } //图片合格率 public BigDecimal dataQualify(Map param) { BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); BigDecimal picQualifySites = new BigDecimal((Integer) param.get("picQualifySites")); return BigDecimal.ZERO.compareTo(totalSitesCount) == 0 ? BigDecimal.ZERO : picQualifySites.divide(totalSitesCount, 4, RoundingMode.HALF_UP); } //录像可用率 public BigDecimal videoUsability(Map param) { BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); BigDecimal usabilitySites = new BigDecimal((Integer) param.get("usabilitySites")); return BigDecimal.ZERO.compareTo(totalSites) == 0 ? BigDecimal.ZERO : usabilitySites.divide(totalSites, 4, RoundingMode.HALF_UP); } }