淘先锋技术网

首页 1 2 3 4 5 6 7

一、业务描述

统计今年每月的用户访问量,默认展示到当前月,可根据日期筛选。

二、代码实现

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;
}