在统计年,月,日等数据时,需要给前端返回连续月,连续日的数据,若有月份或者日无数据时,需要进行补0操作。
我们的解决办法为,在后端进行数据处理,通过echartsUtil解决,组装好echarts数据直接返回给前端。
echartsUtil:
public class EchartsUtils {
private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//月补0的方法
public static Echarts createMonth(List<Map<String,Object>> list){
try{
String[] month = new String[]{"01","02","03","04","05","06","07","08","09","10","11","12"};
//实体类Echarts,各字段为vue的Echarts所需属性
Echarts echarts = new Echarts();
//x轴
XAxis xAxis = new XAxis();
xAxis.setType("category");
xAxis.setData(Arrays.asList(month));
Double[] data = new Double[12];
for(int i = 0 ; i < 12 ; i++){
data[i] = 0.0;
}
for(int i = 0 ; i < list.size() ; i++){
Map<String,Object> row = list.get(i);
Double total = Double.valueOf(String.valueOf(row.get("total")));
Integer num = Integer.valueOf(String.valueOf(row.get("data")));
BigDecimal bignum = new BigDecimal(total);
bignum.setScale(2, BigDecimal.ROUND_HALF_UP);
total = bignum.doubleValue();
data[num-1] = total;
}
//series属性
List<Series> series = Lists.newArrayList();
Series serie = new Series();
serie.setType("bar");
serie.setData(Arrays.asList(data));
series.add(serie);
//y轴属性
YAxis yAxis = new YAxis();
yAxis.setType("value");
echarts.setyAxis(yAxis);
echarts.setxAxis(xAxis);
echarts.setSeries(series);
return echarts;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}
controller:
public ResultBean selectApplyCountByYear(@RequestParam Map<String, Object> params) {
try {
String startTimeStr = String.valueOf(params.get("startTime"));
String endTimeStr = String.valueOf(params.get("endTime"));
startTimeStr = startTimeStr.replaceAll("/", "-");
endTimeStr = endTimeStr.replaceAll("/", "-");
Date startTime = sf.parse(startTimeStr);
Date endTime = sf.parse(endTimeStr);
params.put("startTime", startTime);
params.put("endTime", endTime);
List<Map<String, Object>> result = Lists.newArrayList();
result = visitorAnalysisService.selectApplyCountByYear(params);
System.out.println(EchartsUtils.createMonth(result));
return ResultBean.success(EchartsUtils.createMonth(result));
} catch (Exception e) {
log.error("根据年查询访客申请数量", e);
return ResultBean.error(e.getMessage());
}
}
sql:
<select id="selectApplyCountByYear" resultType="map">
SELECT
MONTH ( start_time ) AS data,
COUNT ( * ) AS 'total'
FROM
security_visitor v
WHERE
v.start_time BETWEEN #{startTime}
AND #{endTime}
GROUP BY
MONTH ( start_time )
</select>