zxl
13 小时以前 3b0516a2959e25576e4f3fda697a3b025d06c8c9
ycl-server/src/main/java/com/ycl/calculate/CarSnapshopDataCalculation.java
@@ -24,7 +24,7 @@
import java.util.*;
/**
 * 计算车辆点位在线率、视图库对接稳定性
 * 计算车辆视图库对接稳定性
 * 抓拍数据量监测结果接口数据
 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
 * 循环map计算点位在线率
@@ -41,17 +41,19 @@
    private RedisTemplate redisTemplate;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    //区域车辆点位在线指标的内部类
    //区域车辆视图库对接稳定性的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int onlineSites = 0;
        int totalDataSum = 0;
        //加权后的同期抓拍量
        int lastSnapCount = 0;
    }
    @Override
    public void calculate(List<SnapshotDataMonitorResult> list) {
        //获取分区域的指标数量
        Map<String, CarSnapshopDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list);
        Map<String, CarSnapshopDataCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list, Boolean.FALSE);
        if (areaStatsMap == null) return;
        // 获取当前日期
@@ -64,13 +66,15 @@
            redisTemplate.delete(RedisConstant.Check_Car_ViewConnect);
        }
        //从字典获取同期抓拍量
        List<SysDictData> carSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_CAR_SNAP);
        List<SysDictData> lastSnap = dictDataMapper.selectDictDataByType(CheckConstants.DICT_LAST_SNAP);
        //根据各个区县点位数据对同期抓拍量做加权处理
        fillLastSnap(areaStatsMap, lastSnap);
        // 查询是否index表已经存在今日数据
        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
        areaStatsMap.forEach((key, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(key, stats, checkIndexCarList,carSnap);
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(key, stats, checkIndexCarList);
                if (checkIndexCar != null) {
                    checkIndexCars.add(checkIndexCar);
                }
@@ -78,6 +82,67 @@
        });
        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
    }
    //根据点位数量对同期抓拍量作加权处理
    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_CAR.equals(sysDictData.getDictLabel())).findFirst();
        if (first.isPresent()) {
            lastProvinceSnap = Integer.parseInt(first.get().getDictValue());
        }
        //从字典里筛选区县值
        Optional<SysDictData> first2 = lastSnap.stream().filter(sysDictData -> CheckConstants.SNAP_COUNTY_CAR.equals(sysDictData.getDictLabel())).findFirst();
        if (first2.isPresent()) {
            lastCountySnap = Integer.parseInt(first2.get().getDictValue());
        }
        log.info("省厅同期:{},区县同期:{}",lastProvinceSnap,lastCountySnap);
        //计算总数
        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;
            }
        }
        log.info("省厅总数:{},区县总数:{}",provinceTotalSites,countyTotalSites);
        //加权操作,补充同期抓拍量
        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();
                }
            }
            log.info("计算的数据:总点位数:{},总抓拍量:{},同期抓拍量:{}",value.totalSites,value.totalDataSum,value.lastSnapCount);
        }
    }
    /**
@@ -90,31 +155,20 @@
        stats.totalSites++;
        if (ApiConstants.HK_SnapCount_ResultType_Null != result.getResultType()) {
            stats.onlineSites++;
            stats.totalDataSum += result.getDataCount();
        }
    }
    /**
     * 车辆点位在线率和视图库对接稳定性
     * 车辆视图库对接稳定性
     */
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList,List<SysDictData> carSnap) {
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) {
        CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList, CheckIndexCar.class);
        if (checkIndexCar == null) {
            return null;
        }
        //调用点位在线计算方法
        if (stats.totalSites >= CheckThreadConstants.Check_Car_SiteOnline) {
            Map<String, Object> siteOnlineParam = new HashMap<>();
            siteOnlineParam.put("totalSites", stats.totalSites);
            siteOnlineParam.put("onlineSites", stats.onlineSites);
            BigDecimal siteOnline = siteOnline(siteOnlineParam);
            checkIndexCar.setSiteOnline(siteOnline.min(BigDecimal.ONE));
        } else {
            checkIndexCar.setSiteOnline(BigDecimal.ZERO);
        }
        //视图库对接稳定性
        //Redis记录该区县当月无数据上传次数
        Integer noDateCount = (Integer) redisTemplate.opsForHash().get(RedisConstant.Check_Car_ViewConnect, key);
@@ -125,18 +179,12 @@
        Double deductScore = 0.1 * noDateCount;
        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 = carSnap.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);
                checkIndexCar.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);
            checkIndexCar.setViewConnectStability(viewConnectStability);
        } else {
            noDateCount++;
        }