fuliqi
2024-10-15 c4d949d801ef6261741567ddbd7594631503ef82
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -52,10 +52,13 @@
    private RedisTemplate redisTemplate;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    //区域人脸点位在线指标的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int totalDataSum = 0;
        //加权后的同期抓拍量
        int lastSnapCount = 0;
    }
    @Override
@@ -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,50 @@
        });
        checkIndexFaceService.saveOrUpdateBatch(checkIndexFaces);
    }
    //根据点位数量对同期抓拍量作加权处理
    private void fillLastSnap(Map<String, AreaStats> areaStatsMap, List<SysDictData> lastSnap) {
        //省厅总点位数
        int provinceTotalSites = 0;
        //区县总点位数
        int countyTotalSites = 0;
        //从字典里筛选省厅值
        int lastProvinceSnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_PROVINCE_FACE.equals(sysDictData.getDictLabel())).findFirst().get().getDictValue());
        //从字典里筛选区县值
        int lastCountySnap = Integer.parseInt(lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_COUNTY_FACE.equals(sysDictData.getDictLabel())).findFirst().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 {
                    value.lastSnapCount = (value.totalSites / provinceTotalSites) * lastProvinceSnap;
                }
            } else {
                //区县
                if (value.totalSites == 0) {
                    value.lastSnapCount = 0;
                } else {
                    value.lastSnapCount = (value.totalSites / countyTotalSites) * lastCountySnap;
                }
            }
        }
    }
    //累计总点位数、离线数、总抓拍量
@@ -116,20 +165,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));
            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++;
        }