走势图通用写法

需求:

天走势图,周走势图,月走势图

天走势图需要每十分钟(或者其他时间间隔)。周走势图和月走势图为一天。时间和数据对应,并且需要排序。

需要数据:

天走势图的原始数据每五分钟存在一次数据。(或者其他时间间隔)

周以上的走势图按照每天聚合一次数据。

使用数据库:

mongodb

做法:

先生成排好序的hashmap。

//sn天hash
    private ImmutableSortedMap<Long, Flow> generateDayHash(Date startDate, Date endDate, String sn) {
        Builder<Long, Flow> builder = ImmutableSortedMap.naturalOrder();
        Long start = startDate.getTime();
        Long end = endDate.getTime();
        Date nextHour = DateUtil.calHour2DateStandard(startDate, 1);
        Long next = nextHour.getTime();

        for(Long l = next; l > start; l = l - HOUR_AGGREGATION_TIME) {
            Flow flowlog = new Flow();
            Date date = new Date(l);
            String dateString = DateUtil.date2String("yyyy-MM-dd HH:mm:ss", date);
            flowlog.setTimeString(dateString);
            flowlog.setSn(sn);
            flowlog.setRxBytes(0l);
            builder.put(l, flowlog);
        }
        ImmutableSortedMap<Long, Flow> map = builder.build();
        for(Long l = next; l < end; l = l + HOUR_AGGREGATION_TIME) {
            if(!map.containsKey(l)) {
                Flow flowlog = new Flow();
                Date date = new Date(l);
                String dateString = DateUtil.date2String("yyyy-MM-dd HH:mm:ss", date);
                flowlog.setTimeString(dateString);
                flowlog.setSn(sn);
                flowlog.setRxBytes(0l);
                builder.put(l, flowlog);
            }
        }
        map = builder.build();
        return map;
    }

获取最接近的时间整数

//取得最近的整数时间,10分钟间隔。例如12:26则为12:30。
    private Long getAggregatedTime(String time) {
        String[] tmp = time.split(":");
        int i = Integer.parseInt(tmp[1].substring(0,1)) + 1; //调整这个1,可以调整到20分钟间隔,30分钟间隔等
        String dateString = tmp[0] + ":" + i + "0:00";
        SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            return sdf.parse(dateString).getTime();
        } catch (ParseException e) {
            LOGGER.error("failed to execute method getAggregatedTime in flowService {}", e);
        }
        
        return 0l;
    }

返回天走势图

//返回sn天走势图-间隔10分钟
    public List<Flow> getDayFlowBySn(Date startDate, Date endDate, String sn, String type) {
        List<Flow> result = new ArrayList<>();
        List<Flowlog> list = new ArrayList<>();
        if(!legalParam(startDate, endDate))
            return result;
        Long start = startDate.getTime();
        Long end = endDate.getTime();
        try {
            list = mongo.find(new Query(Criteria
                    .where(FlowlogField.START)
                    .gte(start).lte(end).and(FlowlogField.SN).is(sn).and(FlowlogField.INTF_TYPE).is(type))
                    , Flowlog.class
                    );
            ImmutableSortedMap<Long, Flow> map = generateDayHash(startDate, endDate, sn);
            result = getDayFlow(list, map);
            return result;
        } catch (Exception e) {
            LOGGER.error("execute method getDayFlowBySn failed {}", e);
            return result;
        }
    }
原文地址:https://www.cnblogs.com/guochunyi/p/5445499.html