fuliqi
2024-08-31 6221c8b5df5eb0ee62dce79048c9c3f0dc3d0fc1
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
package com.ycl.calculate;
 
 
import com.ycl.platform.base.CheckIndex;
import com.ycl.platform.domain.entity.TMonitor;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.utils.DateUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
 
/**
 * 计算公式
 */
@Component
@Slf4j
public class IndexCalculationServe {
    @Autowired
    private YwPointMapper pointMapper;
 
    @Autowired
    private TMonitorMapper monitorMapper;
 
    @Autowired
    private MongoTemplate mongoTemplate;
 
    //一机一档合格率
    public BigDecimal monitorQualify(Map<String, Object> param) {
        BigDecimal totalMonitors = new BigDecimal((Integer) param.get("totalMonitors"));
        BigDecimal qualifyMonitor = new BigDecimal((Integer) param.get("qualifyMonitor"));
        return 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 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 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 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 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 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;
        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");
        return 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 qualifySiteCount.divide(totalSitesCount, 4, RoundingMode.HALF_UP);
    }
 
    //数据上传及时性
    public BigDecimal snapshopDelay(Map<String, Object> param) {
        BigDecimal totalCount = new BigDecimal((Integer) param.get("totalCount"));
        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.ONE.subtract(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 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 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 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 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 usabilitySites.divide(totalSites, 4, RoundingMode.HALF_UP);
    }
 
    //返回省厅国标码集合
    public List<String> getProvince() {
        List<YwPoint> province = pointMapper.selectByTag(null, Boolean.TRUE, null, null);
        return CollectionUtils.isEmpty(province) ? new ArrayList<>() : province.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
    }
 
    //返回重点点位集合
    public List<String> getImportant() {
        List<YwPoint> important = pointMapper.selectByTag(Boolean.TRUE, null, null, null);
        return CollectionUtils.isEmpty(important) ? new ArrayList<>() : important.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
    }
 
    //返回重点指挥图像集合
    public List<String> getCommandImage() {
        List<YwPoint> commandImages = pointMapper.selectByTag(null, null, Boolean.TRUE, null);
        return CollectionUtils.isEmpty(commandImages) ? new ArrayList<>() : commandImages.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
    }
 
    //返回重点指挥图像集合
    public List<String> getDeptTag() {
        List<YwPoint> commandImages = pointMapper.selectByTag(null, null, null, Boolean.TRUE);
        return CollectionUtils.isEmpty(commandImages) ? new ArrayList<>() : commandImages.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList());
    }
 
    //返回monitor
    public List<String> getMonitorFromMongo() {
        Date yesterday = DateUtils.addDays(new Date(), -1);
        Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
 
        return CollectionUtils.isEmpty(oneMachineFileResults) ? new ArrayList<>() : oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList());
    }
 
    //检查是否存在当日数据
    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;
    }
 
}