fuliqi
2024-09-09 9de954bafc2cfe186eaefc0e99fa5fc292a8d45b
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
package com.ycl.calculate;
 
import com.ycl.platform.domain.entity.CheckIndexVideo;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.mapper.CheckIndexVideoMapper;
import com.ycl.platform.service.ICheckIndexVideoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import utils.DateUtils;
 
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * 计算一机一档合格率
 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
 * 循环map计算数据上传及时性
 * 更新或新增
 */
@Component
@Slf4j
public class MonitorQualifyCalculation extends IndexCalculationServe<MonitorQualifyResult, MonitorQualifyCalculation.AreaStats> implements CalculationStrategy<MonitorQualifyResult> {
    @Autowired
    private CheckIndexVideoMapper checkIndexVideoMapper;
    @Autowired
    private ICheckIndexVideoService checkIndexVideoService;
 
    //区域视频在线率的内部类
    protected static class AreaStats {
        //总档案数
        int totalMonitors = 0;
        //合格档案数
        int qualifyMonitor = 0;
    }
 
    @Override
    public void calculate(List<MonitorQualifyResult> list) {
        //获取分区域的指标数量
        Map<String, MonitorQualifyCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list);
        if (areaStatsMap == null) return;
 
        // 查询是否index表已经存在今日数据
        List<CheckIndexVideo> checkIndexVideoList = checkIndexVideoMapper.selectToday(DateUtils.getDate());
        List<CheckIndexVideo> checkIndexVideos = new ArrayList<>();
        areaStatsMap.forEach((deptId, stats) -> {
            if (stats.totalMonitors > 0) {
                CheckIndexVideo CheckIndexVideo = createOrUpdateCheckIndexVideo(deptId, stats, checkIndexVideoList);
                if (CheckIndexVideo != null) {
                    checkIndexVideos.add(CheckIndexVideo);
                }
            }
        });
 
        checkIndexVideoService.saveOrUpdateBatch(checkIndexVideos);
    }
 
    /**
     * 累计总档案数和合格档案数
     */
    @Override
    public void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, MonitorQualifyResult result) {
        //返回对象的引用,如果不存在会放入新的key,value
        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
        stats.totalMonitors++;
        if (result != null && correct(result)){
            stats.qualifyMonitor++;
        }
    }
    //全对返ture
    private boolean correct(MonitorQualifyResult result) {
        return  checkError(result.getName()) &&
                checkError(result.getCivilCode()) &&
                checkError(result.getIp()) &&
                checkError(result.getSerialNumber()) &&
                checkError(result.getMacdz()) &&
                checkError(result.getLatitude()) &&
                checkError(result.getLongitude()) &&
                checkError(result.getSbzt()) &&
                checkError(result.getSxjcjqy()) &&
                checkError(result.getSxjgnlx()) &&
                checkError(result.getJkdwlx()) &&
                checkError(result.getIntegrated_device())
                ;
    }
 
    //检查指标,正常返回true
    private boolean checkError(MonitorQualifyResult.QualifyResult result) {
        return  result.getError() != null && !result.getError();
    }
 
    /**
     * 一机一档合格率
     */
    private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
        CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class);
        if (checkIndexVideo == null) {
            return null;
        }
        //调用一机一档合格率计算方法
        Map<String, Object> param = new HashMap<>();
        param.put("totalMonitors", stats.totalMonitors);
        param.put("qualifyMonitor", stats.qualifyMonitor);
        BigDecimal index = monitorQualify(param);
        checkIndexVideo.setMonitorQualification(index);
        return checkIndexVideo;
    }
}