前言
按纬度统计 但按照数据最新时间作为有效数据进行统计。
例如:按今日的月份向前统计共计12个月的不同设备报警核实次数。核实表同一月份同一个设备报警可能被多次核实,但统计只取当前设备报警最后一次被核实作为有效次数。
一、实现思路
- 取到所有有效数据(设备当前报警最后一次核实的数据)
- 按照月份时间段筛选 统计个数
二、代码
代码如下(示例):
List<FirePointVeriPO> all = firePointVeriDao.findAll();
/**
* 分组 后获取创建时间 最新的一条
*/
Collection<FirePointVeriPO> collect = all.stream().collect(Collectors.toMap(
FirePointVeriPO::getFirePointId,
v -> v,
(v1, v2) -> {
LocalDateTime dataTime = v1.getCreateTime();
LocalDateTime startDate1 = v2.getCreateTime();
if (dataTime == null || startDate1 == null) {
return dataTime != null ? v1 : v2; //拿到不为空的 ,都为空取后一条
}
return dataTime.isAfter(startDate1) || dataTime.isEqual(startDate1) ? v1 : v2;
}
)).values();
//按月份筛选统计
List<ChartResp.ChartData> list = Arrays.stream(last12Months).map(m -> {
LocalDateTime start = startInit.minusMonths(-ArrayUtils.indexOf(last12Months, m));
LocalDateTime end = endInit.minusMonths(-ArrayUtils.indexOf(last12Months, m));
int value = (int) collect.stream()
.filter(c -> (c.getCreateTime().isEqual(start) || c.getCreateTime().isAfter(start)) && c.getCreateTime().equals(end) || c.getCreateTime().isBefore(end))
.count();
return ChartResp.ChartData.builder().name(m).value(value).build();
}).collect(Collectors.toList());
三、其他代码
2.1 获取当前时间月份向前推算11个月的起始日期
LocalDateTime now = LocalDateTime.now().minusMonths(11);
LocalDateTime startInit = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.firstDayOfMonth())), LocalTime.MIN);
LocalDateTime endInit = LocalDateTime.of(LocalDate.from(now.with(TemporalAdjusters.lastDayOfMonth())), LocalTime.MAX);
2.2 获取横坐标(当前月份向前推算11个月)
private static String[] getLast12Months() {
String[] last12Months = new String[12];
Calendar cal = Calendar.getInstance();
//设置输入条件时间
cal.setTime(new Date());
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) + 1); //要先+1,才能把本月的算进去
for (int i = 0; i < 12; i++) {
cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); //逐次往前推1个月
last12Months[11 - i] = addZeroForNum(String.valueOf(cal.get(Calendar.MONTH) + 1), 2) + "月";
}
return last12Months;
}
private static String addZeroForNum(String str, int strLength) {
int strLen = str.length();
if (strLen < strLength) {
while (strLen < strLength) {
// sb.append(str).append("0");//右补0
str = "0" + str// 左补0
// sb.append(str).append("0");//右补0
;
strLen = str.length();
}
}
return str;
}
四、实现效果
截图当前时间为23年1月份