itheima苍穹外卖项目学习笔记

您所在的位置:网站首页 数据统计相关工作内容有哪些 itheima苍穹外卖项目学习笔记

itheima苍穹外卖项目学习笔记

2024-07-09 13:08| 来源: 网络整理| 查看: 265

数据统计-图形报表 Day11: 数据统计(图形报表)a. 营业额统计b. 用户统计c. 订单统计d. 销量排名Top10

Day11: 数据统计(图形报表) a. 营业额统计

业务规则:

营业额指订单状态为已完成的订单金额合计基于可视化报表的折线图展示营业额数据,X轴为日期,Y轴为营业额根据时间选择区间,展示每天的营业额数据

创建admin/ReportController数据统计相关接口,创建营业额统计接口方法

@RestController @RequestMapping("/admin/report") @Api(tags = "数据统计相关接口") @Slf4j public class ReportController { private ReportService reportService; /** * 营业额统计 * @param begin * @param end * @return */ @GetMapping("/turnoverStatistics") @ApiOperation("营业额统计") public Result turnoverStatistics( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){ log.info("营业额数据统计:{},{}", begin, end); return Result.success(reportService.getTurnoverStatistics(begin, end)); } }

在ReportServiceImpl中,实现"统计指定区间内的营业额统计"的方法,及其父类接口

@Service @Slf4j public class ReportServiceImpl implements ReportService { @Autowired private OrderMapper orderMapper; /** * 统计指定区间内的营业额统计 * @param begin * @param end * @return */ @Override public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) { // 当前集合用于存放从begin到end范围内的每天的日期 List dateList = new ArrayList(); dateList.add(begin); while(!begin.equals(end)){ // 日期计算,计算指定日期的后一天对应的日期 begin = begin.plusDays(1); dateList.add(begin); } // 存放每天的营业额 List turnoverList = new ArrayList(); for (LocalDate date : dateList) { // 查询date日期对应的营业额,营业额是指:状态为“已完成”的订单金额合计 LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX); // select sum(amount) from orders where order_time > beginTime and order_time < endTime and status = 5 Map map = new HashMap(); map.put("begin", beginTime); map.put("end", endTime); map.put("status", Orders.COMPLETED); Double turnover = orderMapper.sumByMap(map); turnoverList.add(turnover); } // 封装返回结果 return TurnoverReportVO .builder() .dateList(StringUtils.join(dateList, ",")) .turnoverList(StringUtils.join(turnoverList, ",")) .build(); } }

在OrderMapper中,实现营业额统计的方法

/** * 根据动态条件统计营业额数据 * @param map * @return */ Double sumByMap(Map map);

在OrderMapper.xml中,写入SQL语句,根据动态条件统计营业额数据

select sum(amount) from orders and order_time ; #{begin} and order_time ; #{end} and status = #{status} b. 用户统计

业务规则:

基于可视化报表的折线图展示用户数据,X轴为日期,Y轴为用户数根据时间选择区间,展示每天的用户总量和新增用户量数据

在ReportController中,创建用户统计接口方法

/** * 用户统计 * @param begin * @param end * @return */ @GetMapping("/userStatistics") @ApiOperation("用户统计") public Result userStatistics( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){ log.info("用户数据统计:{},{}", begin, end); return Result.success(reportService.getUserStatistics(begin, end)); }

在ReportServiceImpl中,实现"统计指定区间内的用户统计"的方法,及其父类接口

/** * 统计指定区间内的用户统计 * @param begin * @param end * @return */ @Override public UserReportVO getUserStatistics(LocalDate begin, LocalDate end) { // 当前集合用于存放从begin到end范围内的每天的日期 List 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 > beginTime and create_time < endTime List newUserList = new ArrayList(); // 存放总用户数量 select count(id) from user where create_time < endTime List 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); totalUserList.add(totalUser); map.put("begin", beginTime); // 查询新用户数量 Integer newUser = userMapper.countByMap(map); newUserList.add(newUser); } // 封装返回结果 return UserReportVO .builder() .dateList(StringUtils.join(dateList,",")) .newUserList(StringUtils.join(newUserList, ",")) .totalUserList(StringUtils.join(totalUserList, ",")) .build(); }

在UserMapper中,实现用户统计的方法

/** * 根据动态条件来统计用户数量 * @param map * @return */ Integer countByMap(Map map);

在UserMapper.xml中,写入SQL语句,根据动态条件统计用户数据

select count(id) from user and create_time ; #{begin} and create_time ; #{end} c. 订单统计

业务规则:

有效订单指状态为 “已完成” 的订单基于可视化报表的折线图展示订单数据,X轴为日期,Y轴为订单数量根据时间选择区间,展示每天的订单总数和有效订单数展示所选时间区间内的有效订单数、总订单数、订单完成率,订单完成率 = 有效订单数 / 总订单数 * 100%

在ReportController中,创建订单统计接口方法

/** * 订单统计 * @param begin * @param end * @return */ @GetMapping("/ordersStatistics") @ApiOperation("订单统计") public Result ordersStatistics( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){ log.info("订单数据统计:{},{}", begin, end); return Result.success(reportService.getOrderStatistics(begin, end)); }

在ReportServiceImpl中,实现"统计指定区间内的订单统计"的方法,及其父类接口

/** * 统计指定区间内的订单数据 * @param begin * @param end * @return */ @Override public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end) { // 当前集合用于存放从begin到end范围内的每天的日期 List dateList = new ArrayList(); dateList.add(begin); while(!begin.equals(end)){ // 日期计算,计算指定日期的后一天对应的日期 begin = begin.plusDays(1); dateList.add(begin); } // 存放每天的订单总数 List orderCountList = new ArrayList(); // 存放每天的有效订单数 List validOrderCountList = new ArrayList(); // 查询每天的有效订单数,和订单总数 for (LocalDate date : dateList) { LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); // 查询每天的订单总数 select count(id) form orders where order_time > beginTime and order_time < endTime Integer orderCount = getOrderCount(beginTime, endTime, null); // 查询每天的有效订单数 select count(id) form orders where order_time > beginTime and order_time < endTime and Status = 5 Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED); orderCountList.add(orderCount); validOrderCountList.add(validOrderCount); } // 计算时间区间内的订单总数量 Integer totalOrderCount = orderCountList.stream().reduce(Integer::sum).get(); // 计算区时间间内的有效订单数 Integer validOrderCount = validOrderCountList.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(orderCountList, ",")) .validOrderCountList(StringUtils.join(validOrderCountList, ",")) .totalOrderCount(totalOrderCount) .validOrderCount(validOrderCount) .orderCompletionRate(OrderCompletionRate) .build(); } /** * 根据条件统计订单数量 * @param begin * @param end * @param status * @return */ 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); }

在OrderMapper中,实现订单统计的方法

/** * 根据动态条件统计订单数量 * @param map * @return */ Integer countByMap(Map map);

在OrderMapper.xml中,写入SQL语句,根据动态条件统计订单数据

select count(id) from orders and order_time ; #{begin} and order_time ; #{end} and status = #{status} d. 销量排名Top10

业务规则:

根据时间选择区间,展示销量前10的商品(包括菜品和套餐)基于可视化报表的柱状图降序展示商品销量此处的销量为商品销售的份数

在ReportController中根据销量排名接口创建top10方法:

/** * 销量排名top10 * @param begin * @param end * @return */ @GetMapping("/top10") @ApiOperation("销量排名top10") public Result salesTop10( @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){ log.info("销量排名top10统计:{},{}", begin, end); return Result.success(reportService.getSalesTop10(begin, end)); }

在ReportServiceImpl中,实现getSalesTop10方法,及其父类接口

/** * 销量排名top10 * @param begin * @param end * @return */ @Override public SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end) { LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN); LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX); List salesTop10 = orderMapper.getSalesTop10(beginTime, endTime); List names = salesTop10.stream().map(GoodsSalesDTO::getName).collect(Collectors.toList()); String nameList = StringUtils.join(names, ","); List numbers = salesTop10.stream().map(GoodsSalesDTO::getNumber).collect(Collectors.toList()); String numberList = StringUtils.join(numbers, ","); return SalesTop10ReportVO .builder() .nameList(nameList) .numberList(numberList) .build(); }

在OrderMapper中,声明getSalesTop10方法:

/** * 统计指定时间区间内的销量排名前10 * @param begin * @param end * @return */ List getSalesTop10(LocalDateTime begin, LocalDateTime end);

在OrderMapper.xml文件中编写动态SQL:

select od.name, sum(od.number) as number from order_detail od, orders o where od.order_id = o.id and o.status = 5 and o.order_time ; #{begin} and o.order_time ; #{end} group BY od.name ORDER BY number desc limit 0,10


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3