堆叠柱状图的后端返回数据格式
在开发中常遇到堆叠柱状图,他比普通柱状图复杂,例如:
类似这种图,多条折线图等,都是一个意思。
这个并不是多高深的技术,但是留下一个模板,遇到了可以回过头来找,找模板写,可以节约时间,就当积累了。
首先看数据库:
这里以时间和告警类型两个字段分堆叠柱状图,即,每天的每种告警柱状图
① 主类
@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;
}