前言
本文是在开发毕业设计时,关于数据统计报表功能需求,思路整理。
用户统计
前端要求的数据
: 是区间内日期字符串,用户总量字符串,新增用户量字符串。如下图
实现思路
- 计算出日期时间开始前的用户总量
- 计算出日期区间对应的每日用户新增量
- 那么当前日期的用户总量即为昨日总量+今日新增
代码实现解析
完整代码如下
scss
@Override
public Result<UserReportVO> userStatistics(LocalDate begin, LocalDate end) {
// 1.统计时间开启前,用户的总量
Integer beginTotalUser = userMapper.getBeginTotalUser(begin);
// 2.统计时间区间内每日用户增量 注: 若区间内有日期没有新增用户,则返回结果的日期不连续
List<UserStatisticsDTO> newUsers = userMapper.countNewUser(begin,end);
/*
接下来通过逻辑封装数据返回给前端集合
*/
// 3.初始化所需的数据结构, 即日期连续的每日用户新增量,与总量
List<LocalDate> localDates = new ArrayList<>();
List<UserStatisticsDTO> users = new ArrayList<>();
users.add(new UserStatisticsDTO(begin, 0, 0));
while (!end.equals(begin)) {
begin = begin.plusDays(1);
localDates.add(begin);
users.add(new UserStatisticsDTO(begin, 0, 0));
}
//打印初始化后的结果
users.forEach(t -> {
log.info("当前日期{},当前日新增{},当日用户总数{}", t.getDate(), t.getNewUser(), t.getTotalUser());
});
// 4.将每日新增用户量的结果合并到所需的数据结构中
Integer totalUser = beginTotalUser;
for (UserStatisticsDTO dto : users){
for (UserStatisticsDTO user : newUsers){
//如果匹配到日期则进行赋值操作
if (dto.getDate().equals(user.getDate())){
//设置当前新增用户量
dto.setNewUser(user.getNewUser());
//更新当前的用户总量
totalUser += user.getNewUser();
}
}
//为了确保每个日期的用户总量都被统计到,所以需要写在循环外面
dto.setTotalUser(totalUser);
}
// 此时所有数据都合并完毕, users中存放的就为,时间区间连续的,当日新增用户量数据,当日用户总数数据的集合
//封装数据返回
StringJoiner dateString = new StringJoiner(",");
StringJoiner newUserString = new StringJoiner(",");
StringJoiner totalUserString = new StringJoiner(",");
for (UserStatisticsDTO user : users){
dateString.add(user.getDate().toString());
newUserString.add(user.getNewUser().toString());
totalUserString.add(user.getTotalUser().toString());
}
UserReportVO userReportVO = new UserReportVO();
userReportVO.setDateList(dateString.toString());
userReportVO.setNewUserList(newUserString.toString());
userReportVO.setTotalUserList(totalUserString.toString());
return Result.success(userReportVO);
}
订单统计
需求:
要求统计区间日期内,每日的有效订单数,每日的订单总数,区间内所有的有效订单,区间内订单总数。
实现思路:
- 查询区间内每日有效订单数, 使用
group by
实现 - 查询区间内每日订单总数, 使用
group by
实现 - 根据以上俩数据可求出区间内所有的有效订单数(对1.求和),区间内所有的订单总数(对2.求和)
- 订单完成率为有效订单总数/订单总数
销量统计
需求
实现思路:
- 连接订单表和订单明细表
- 根据商品名称分组, where条件为日期的区间, count(*) 查出每个商品的销量
- 根据销量降序排序
- 使用limt筛选出前10个