zxl
昨天 3b0516a2959e25576e4f3fda697a3b025d06c8c9
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -52,16 +52,19 @@
    private RedisTemplate redisTemplate;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    //区域人脸点位在线指标的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int totalDataSum = 0;
        //加权后的同期抓拍量
        int lastSnapCount = 0;
    }
    @Override
    public void calculate(List<SnapshotDataMonitorResult> list) {
        //获取分区域的指标数量
        Map<String, FaceSnapshotDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list,Boolean.FALSE);
        Map<String, FaceSnapshotDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list, Boolean.FALSE);
        if (areaStatsMap == null) return;
        // 获取当前日期
@@ -74,13 +77,15 @@
            redisTemplate.delete(RedisConstant.Check_Face_ViewConnect);
        }
        //从字典获取同期抓拍量
        List<SysDictData> faceSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_FACE_SNAP);
        List<SysDictData> lastSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_LAST_SNAP);
        //根据各个区县点位数据对同期抓拍量做加权处理
        fillLastSnap(areaStatsMap, lastSnap);
        // 查询今日数据
        List<CheckIndexFace> checkIndexFaceList = checkIndexFaceMapper.selectToday(DateUtils.getDate());
        List<CheckIndexFace> checkIndexFaces = new ArrayList<>();
        areaStatsMap.forEach((deptId, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList,faceSnap);
                CheckIndexFace checkIndexFace = createOrUpdateCheckIndexFace(deptId, stats, checkIndexFaceList, lastSnap);
                if (checkIndexFace != null) {
                    checkIndexFaces.add(checkIndexFace);
                }
@@ -88,6 +93,64 @@
        });
        checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces);
    }
    //根据点位数量对同期抓拍量作加权处理
    private void fillLastSnap(Map<String, AreaStats> areaStatsMap, List<SysDictData> lastSnap) {
        //省厅总点位数
        int provinceTotalSites = 0;
        //区县总点位数
        int countyTotalSites = 0;
        //同期省厅抓拍量
        int lastProvinceSnap = 0;
        //同期区县抓拍量
        int lastCountySnap = 0;
        //从字典里筛选省厅值
        Optional<SysDictData> first = lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_PROVINCE_FACE.equals(sysDictData.getDictLabel())).findFirst();
        if (first.isPresent()) {
            lastProvinceSnap = Integer.parseInt(first.get().getDictValue());
        }
        //从字典里筛选区县值
        Optional<SysDictData> first2 = lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_COUNTY_FACE.equals(sysDictData.getDictLabel())).findFirst();
        if (first2.isPresent()) {
            lastCountySnap = Integer.parseInt(first2.get().getDictValue());
        }
        //计算总数
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            if (key.startsWith(ApiConstants.Province)) {
                provinceTotalSites += value.totalSites;
            } else {
                countyTotalSites += value.totalSites;
            }
        }
        //加权操作,补充同期抓拍量
        for (Map.Entry<String, AreaStats> entry : areaStatsMap.entrySet()) {
            String key = entry.getKey();
            AreaStats value = entry.getValue();
            //省厅
            if (key.startsWith(ApiConstants.Province)) {
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    BigDecimal result = new BigDecimal(value.totalSites)
                            .divide(new BigDecimal(provinceTotalSites), 2, RoundingMode.HALF_UP)
                            .multiply(new BigDecimal(lastProvinceSnap));
                    value.lastSnapCount = result.setScale(0, RoundingMode.HALF_UP).intValue();
                }
            } else {
                //区县
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    BigDecimal result = new BigDecimal(value.totalSites)
                            .divide(new BigDecimal(countyTotalSites), 2, RoundingMode.HALF_UP)
                            .multiply(new BigDecimal(lastCountySnap));
                    value.lastSnapCount = result.setScale(0, RoundingMode.HALF_UP).intValue();
                }
            }
        }
    }
    //累计总点位数、离线数、总抓拍量
@@ -103,7 +166,7 @@
    //人脸视图库对接稳定性
    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList,List<SysDictData> faceSnap) {
    private CheckIndexFace createOrUpdateCheckIndexFace(String key, AreaStats stats, List<CheckIndexFace> checkIndexFaceList, List<SysDictData> faceSnap) {
        CheckIndexFace checkIndexFace = getCheckIndex(key, checkIndexFaceList, CheckIndexFace.class);
        if (checkIndexFace == null) {
            return null;
@@ -116,20 +179,13 @@
            noDateCount = 0;
        }
        Double deductScore = 0.1 * noDateCount;
        log.info("总量:{}",stats.totalDataSum);
        if (stats.totalDataSum != 0) {
            Integer deptId = key.startsWith(ApiConstants.Province) ? Integer.parseInt(key.split("_")[1]) : Integer.parseInt(key);
            String dictKey = key.startsWith(ApiConstants.Province) ? ApiConstants.Province+ AreaDeptEnum.fromDept(deptId).getCode() : ApiConstants.County+AreaDeptEnum.fromDept(deptId).getCode();
            Optional<SysDictData> first = faceSnap.stream().filter(sysDictData -> sysDictData.getDictLabel().equals(dictKey)).findFirst();
            if(first.isPresent()) {
                String value = first.get().getDictValue();
                Map<String, Object> viewConnectParam = new HashMap<>();
                viewConnectParam.put("totalDataSum", stats.totalDataSum);
                viewConnectParam.put("avgCount", new BigDecimal(value).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
                BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
                viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
                checkIndexFace.setViewConnectStability(viewConnectStability);
            }
            Map<String, Object> viewConnectParam = new HashMap<>();
            viewConnectParam.put("totalDataSum", stats.totalDataSum);
            viewConnectParam.put("lastCount", new BigDecimal(stats.lastSnapCount).multiply(new BigDecimal(CheckConstants.MultiplyNum)).divide(new BigDecimal(LocalDate.now().getDayOfMonth()), 0, RoundingMode.HALF_UP));
            BigDecimal viewConnectStability = viewConnectStability(viewConnectParam);
            viewConnectStability = viewConnectStability.subtract(new BigDecimal(deductScore)).max(BigDecimal.ZERO).min(BigDecimal.ONE);
            checkIndexFace.setViewConnectStability(viewConnectStability);
        } else {
            noDateCount++;
        }