苍穹外卖 10 用户统计订单统计 销量排名统计
2-21 用户统计&订单统计
02 09-用户统计_需求分析和设计
03 10-用户统计_代码开发
代码开发如下:
/*** 用户统计* @param begin* @param end* @return*/@ApiOperation("用户统计")@GetMapping("/userStatistics")public Result<UserReportVO> UserStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end) {log.info("查询用户数据:{}到{}", begin, end);UserReportVO userReportVO = reportService.getUserStatistics(begin, end);return Result.success(userReportVO);}/*** 用户统计* @param begin* @param end* @return*/@Overridepublic UserReportVO getUserStatistics(LocalDate begin, LocalDate end) {log.info("查询用户数据:{}到{}", begin, end);//创建一个集合用于存放begin到end范围内每天的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)) {begin = begin.plusDays(1);dateList.add(begin);}//日期计算可以通过上述的方式实现遍历累加//存放每天新增用户数 select count(id) from user where create_time > begin and create_time < endList<Integer> newUserList = new ArrayList<>();//查询每天总用户数 select count(id) from user where create_time < endList<Integer> totalUserList = new ArrayList<>();for (LocalDate date : dateList) {LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);Map map = new HashMap<>();map.put("end", endTime);//查询每天总用户数Integer totalUser = userMapper.countByMap(map);map.put("begin", beginTime);//查询每天新增用户数Integer newUser =userMapper.countByMap(map);//将数据添加到对应的集合中totalUserList.add(totalUser);newUserList.add(newUser);}return UserReportVO.builder().dateList(StringUtils.join(dateList, ",")).totalUserList(StringUtils.join(totalUserList, ",")).newUserList(StringUtils.join(newUserList, ",")).build();}
07 14-订单统计_需求分析和设计
01 16-订单统计_代码开发
代码实现如下:
controller:
/*** 订单统计* @param begin* @param end* @return*/@ApiOperation("订单统计")@GetMapping("/orderStatistics")public Result<OrderReportVO> OrderStatistics(@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end) {log.info("查询用户数据:{}到{}", begin, end);OrderReportVO orderReportVO = reportService.getOrderStatistics(begin, end);return Result.success(orderReportVO);}
实现类:
/*** 订单统计* @param begin* @param end* @return*/@Overridepublic OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end) {List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!begin.equals(end)) {begin = begin.plusDays(1);dateList.add(begin);}//日期计算可以通过上述的方式实现遍历累加//存放每天订单总数List<Integer> totalOrderList = new ArrayList<>();//存放每天有效订单总数List<Integer> validOrderList = new ArrayList<>();for (LocalDate localDate : dateList) {//查询每天订单总数 Select count(id) from orders where order_time > begin and order_time < endLocalDateTime beginTime = LocalDateTime.of(localDate, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(localDate, LocalTime.MAX);Integer totalOrderCount = getOrderCount(beginTime, endTime, null);//查询每天有效订单总数 Select count(id) from orders where order_time > begin and order_time < end and status = 5Integer validOrderCount =getOrderCount(beginTime,endTime, Orders.COMPLETED);//将数据添加到对应的集合中totalOrderList.add(totalOrderCount);validOrderList.add(validOrderCount);}//遍历集合累加,计算时间区间内的总数量//使用Stream流Integer totalOrderCount = totalOrderList.stream().reduce(Integer::sum).get();//遍历集合累加,计算时间区间内的有效数量Integer validOrderCount = validOrderList.stream().reduce(Integer::sum).get();Double orderCompletionRate = 0.0;if (totalOrderCount != 0) {//计算订单完成率orderCompletionRate = validOrderCount.doubleValue()/totalOrderCount;}return OrderReportVO.builder().dateList(StringUtils.join(dateList, ",")).orderCountList(StringUtils.join(totalOrderList, ",")).validOrderCountList(StringUtils.join(validOrderList, ",")).totalOrderCount(totalOrderCount).validOrderCount(validOrderCount).orderCompletionRate(orderCompletionRate).build();}// 根据状态统计订单数量private Integer getOrderCount(LocalDateTime begin,LocalDateTime end, Integer status){Map map = new HashMap<>();map.put("begin", begin);map.put("end", end);map.put("status", status);return orderMapper.countByMap(map);}
2-22 销量排名统计
03 18-销量排名统计_需求分析和设计
代码实现如下:
/*** 菜品销量前十统计* @param begin* @param end* @return*/@Overridepublic SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) {LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX);List<GoodsSalesDTO> salesTop10 = orderMapper.getSalesTop10(beginTime, endTime);List<String> names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList());String nameList = StringUtils.join(names, ",");List<Integer> numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList());String numberList = StringUtils.join(numbers, ",");return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build();}
<select id="getSalesTop10" resultType="com.sky.dto.GoodsSalesDTO">select od.name, sum(od.number) numberfrom order_detail od,orders owhere od.order_id = o.id and o.status = 5<if test="begin != null">and o.order_time >= #{begin}</if><if test="end != null">and o.order_time <= #{end}</if>group by od.nameorder by number desclimit 0,10</select>