堆叠柱状图的后端返回数据格式

堆叠柱状图的后端返回数据格式

在开发中常遇到堆叠柱状图,他比普通柱状图复杂,例如:
在这里插入图片描述
类似这种图,多条折线图等,都是一个意思。
这个并不是多高深的技术,但是留下一个模板,遇到了可以回过头来找,找模板写,可以节约时间,就当积累了。
首先看数据库:
在这里插入图片描述

这里以时间和告警类型两个字段分堆叠柱状图,即,每天的每种告警柱状图

① 主类

 @Override
    public R getCategorys() {
		/**
		* SELECT
        *        ID,date_format(CREATE_TIME,'%Y-%m-%d') AS CREATE_TIME,
        *       ALARM_TYPE, HANDLE_STATE, CREATE_USER, EQUIP_NAME,EQUIP_IP
        *        FROM sys_alarm
		*这里查询时间时只保留了年月日,注意mysql保留年月日的函数是date_format(CREATE_TIME,'%Y-%m-%d %H:%i:%s'),oracle的时间处理是 to_char(sysdate,'yyyy-mm-dd HH24:mi:ss') 
		**/
        List<SysAlarm> sysAlarmsList = sysAlarmMapper.selectLists();
        /**
         * 1.x轴坐标 获取十二天之内的数据
         * 格式 yyyy-MM-dd
         */
        List<String> timeList = TimeUtils.getTimeList(12);
        /**
         *2. 按时间分类
         */
        Map<Object, List<SysAlarm>> createTimeMap = sysAlarmsList.stream().collect(Collectors.groupingBy(its -> its.getCreateTime()));
        /**
         * 3.获取分类后的时间的集合 格式 yyyy-MM-dd
         */
        Set<Object> createTimeMapSets = createTimeMap.keySet();
        /**
         * 4.创建4个集合 和 boolean 备用 告警类型 1 低危 2中危 3 高危 4 严重
         */
        List<Long> lowDangrous = new ArrayList<>();
        List<Long> mediumDangrous = new ArrayList<>();
        List<Long> highDangrous = new ArrayList<>();
        List<Long> seriousDangrous = new ArrayList<>();
        lowDangrous.clear();
        mediumDangrous.clear();
        highDangrous.clear();
        seriousDangrous.clear();

        /**
         * 5.遍历时间,获取每天的告警类型
         */
        for (Object times : timeList) {
            boolean flag1 = false;
            boolean flag2 = false;
            boolean flag3 = false;
            boolean flag4 = false;
            if (createTimeMapSets.contains(times)) {
                List<SysAlarm> sysAlarmscol = createTimeMap.get(times);
                /**
                 * 6.每天的数据再按 告警类型 分类
                 */
                Map<Integer, List<SysAlarm>> sysAlarmscolMap = sysAlarmscol.stream().collect(Collectors.groupingBy(item -> item.getAlarmType()));
                /**
                 * 7.获取这一天的告警类型,并计算总数
                 */
                Set<Integer> sysAlarmscolMapSet = sysAlarmscolMap.keySet();
                for (Integer alarmType : sysAlarmscolMapSet) {
                    List<SysAlarm> sysAlarms = sysAlarmscolMap.get(alarmType);
                    long count = sysAlarms.stream().count();
                    if (alarmType == 1) {
                        lowDangrous.add(count);
                        flag1 = true;
                    } else if (alarmType == 2) {
                        mediumDangrous.add(count);
                        flag2 = true;
                    } else if (alarmType == 3) {
                        highDangrous.add(count);
                        flag3 = true;
                    } else if (alarmType == 4) {
                        seriousDangrous.add(count);
                        flag4 = true;
                    }
                }
            }
            if(!flag1){
                lowDangrous.add(0L);
            }
            if(!flag2){
                mediumDangrous.add(0L);
            }
            if(!flag3){
                highDangrous.add(0L);
            }
            if(!flag4){
                seriousDangrous.add(0L);
            }
        }
        Map<String,Object> map = new HashMap<>();
        map.clear();

        map.put("低危",lowDangrous);
        map.put("中危",mediumDangrous);
        map.put("高危",highDangrous);
        map.put("严重",seriousDangrous);
        Map<String,Object> result = new HashMap<>();
        result.put("x",timeList);
        result.put("y",map);
        return R.ok("查询成功!",result);
    }

②工具类获取连续的时间,比如统计近一周的数据,返回时间集合(这里以每天作单位,tm是传入的天数)

/**
 * 获取连续的时间,比如统计近一周的数据,返回时间集合(这里以每天作单位)
 */
public static List<String> getTimeList(int tm){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    List<String> dateList = new ArrayList<>();
    /**
     * 用Calendar.getInstance()不仅能获取当前的时间,还能指定需要获取的时间点
     */
    Calendar calendar = Calendar.getInstance();
    /**
     * 设定当前日期
     */
    calendar.setTime(new Date());
    //这里设定tm,可以根据需要随便设获取多久时间
    int tip = Integer.valueOf(tm)-1;
    /**
     * cal1.add(Calendar.DAY_OF_MONTH,1);
     * cal1.add(Calendar.DAY_OF_YEAR,1);
     * cal1.add(Calendar.DATE,1);
     * 就单纯的add操作结果都一样,因为都是将日期+1
     * 就没有区别说是在月的日期中加1还是年的日期中加1
     *这里是设定指定时间的起始时间,比如30天前的日期
     */
    calendar.add(Calendar.DAY_OF_MONTH,-tip);
    dateList.add(sdf.format(calendar.getTime()));
    /**
     *每循环一次,日期加1,把每天的时间装进集合
     **/
    for(int i=0;i<tip;i++){
        calendar.add(Calendar.DAY_OF_MONTH,1);
        dateList.add(sdf.format(calendar.getTime()));
    }
    return dateList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神雕大侠mu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值