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 extends CheckIndex> T getCheckIndex(String key, List<T> checkIndexList, Class<T> clazz) {
|
T checkIndex;
|
|
// 检查是否已存在今日数据
|
Optional<T> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<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);
|
}
|
|
//标注正确率
|
|
public BigDecimal infoAccuracy(Map<String, Object> 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<String, Object> 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<String, Object> 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<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 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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);
|
}
|
|
}
|