fuliqi
2024-09-10 7d5ea3631d163343b652bd6bd40b94b34c4194eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
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);
    }
 
}