一、业务描述
统计今年每月的用户访问量,默认展示到当前月,可根据日期筛选。
二、代码实现
1. 创建响应类
@Data
public class CountVo {
@ApiModelProperty(value="名称")
private String name;
@ApiModelProperty(value="访问量")
private Integer total;
}
2. 条件参数类
@Data
public class PUserBuryPointDto extends PageDto{
@ApiModelProperty(value = "开始时间")
private LocalDate startTime;
@ApiModelProperty(value = "结束时间")
private LocalDate endTime;
}
3. 业务实现
public List<CountVo> getVisitCountChart(PUserBuryPointDto pUserBuryPointDto) {
//获取按月分组的统计数据
List<Map<String, Object>> mouthList = pUserBuryPointMapper.selectMaps(new QueryWrapper<PUserBuryPoint>()
//获取月份及对应的访问量,根据不同业务可将COUNT()换为SUM()
.select("MONTH(CREATE_TIME) month,COUNT(MONTH(CREATE_TIME)) total")
//根据用户设置的时间段查询对应数据
.between(pUserBuryPointDto.getStartTime()!=null && pUserBuryPointDto.getEndTime()!=null,"CREATE_TIME",startTime,endStartTime)
//获取今年的数据,不需要的可以去掉
.apply("year(CREATE_TIME)=year(getdate())")
//按月进行分组
.groupBy("MONTH(CREATE_TIME)"));
//以月为key访问量为value存放数据方便后面取值
Map<String,String> map=new HashMap<>();
if (mouthList.size()>0){
mouthList.forEach(m-> map.put(m.get("month").toString(),m.get("total").toString()));
}
//只返回到当前月的数据
List<CountVo> countVoList=new ArrayList<>();
if (pUserBuryPointDto.getStartTime()!=null && pUserBuryPointDto.getEndTime()!=null){
//用户选择了时间段则按照用户所选时间段取出对应数据
for (int i = pUserBuryPointDto.getStartTime().getMonthValue(); i <= pUserBuryPointDto.getEndTime().getMonthValue(); i++) {
CountVo countVo = new CountVo();
countVo.setName(i+"月");
//取出对应时间段内月份的访问量
countVo.setTotal(Integer.parseInt(map.get(String.valueOf(i))==null?"0":map.get(String.valueOf(i))));
countVoList.add(countVo);
}
}else {
//用户没有选择时间段则默认展示到当前月
for (int i = 1; i <= Calendar.getInstance().get(Calendar.MONTH)+1; i++) {
CountVo countVo = new CountVo();
countVo.setName(i+"月");
//取出1月到当前月的访问量数据
countVo.setTotal(Integer.parseInt(map.get(String.valueOf(i))==null?"0":map.get(String.valueOf(i))));
countVoList.add(countVo);
}
}
return countVoList;
}