毕设项目<<基于微信小程序的餐馆外卖系统的设计>>后端(十)

毕设项目<<基于微信小程序的餐馆外卖系统的设计后端>>(开发记录(十)数据统计图形报表)


视频传送带

数据统计图形报表

1.ApacheEChars技术

1.1 介绍

ECharts是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

2. 营业额统计

2.1 需求分析和设计

请添加图片描述

业务规则
  • 营业额是指订单状态为已完成的订单金额合计
  • 基于可视化报表的折线图展示营业额数据,x为日期,y轴为营业额
  • 根据数据选择区间,展示每天都营业额数据
接口设计

请添加图片描述

2.2 代码开发

请添加图片描述

public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {  
//当前集合用于存放从begin到end范围内的每天的日期  
List<LocalDate> dateList = new ArrayList<>();  
  
dateList.add(begin);  
  
while (!begin.equals(end)) {  
//日期计算,计算指定日期的后一天对应的日期  
begin = begin.plusDays(1);  
dateList.add(begin);  
}  
  
//存放每天的营业额  
List<Double> 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);  
turnover = turnover == null ? 0.0 : turnover;  
turnoverList.add(turnover);  
}  
  
//封装返回结果  
return TurnoverReportVO  
.builder()  
.dateList(StringUtils.join(dateList, ","))  
.turnoverList(StringUtils.join(turnoverList, ","))  
.build();  
}
2.3 功能测试

请添加图片描述

3. 用户统计

3.1 需求分析与设计
3.1.1 产品原型

请添加图片描述

3.1.2 业务规则
  • 基于可视化报表折线图展示用户数据,x轴为日期,y轴为用户数
  • 根据时间选择区间,展示每天的用户总量和新增用户数据
3.1.3 接口设计

请添加图片描述

3.2 代码开发

请添加图片描述

/**  
* 统计指定时间区间内的用户数据  
*  
* @param begin  
* @param end  
* @return  
*/  
public UserReportVO getUserStatistics(LocalDate begin, LocalDate 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 < ? and create_time > ?List<Integer> newUserList = new ArrayList<>();  
//存放每天的总用户数量 select count(id) from user where create_time < ?List<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();  
}

3.3 功能测试

请添加图片描述

4. 订单统计

4.1 需求分析与设计
4.1.1 产品原型

请添加图片描述

4.1.2 业务规则
  • 有效订单指状态为”已完成“的订单
  • 基于可视化报表的折线图展示订单数据,x轴为日期,y轴为订单数量
  • 根据时间选择区间展示每天的订单总数和有效订单数
  • 展示所选时间区间的有效订单数、总订单数、订单完成率,其中订单完成率=有效订单数/总订单数*100%
4.1.3 接口设计

请添加图片描述

4.2 代码开发

请添加图片描述


  
/**  
* 统计指定时间区间内的订单数据  
* @param begin  
* @param end  
* @return  
*/  
public OrderReportVO getOrderStatistics(LocalDate begin, LocalDate end) {  
//存放从begin到end之间的每天对应的日期  
List<LocalDate> dateList = new ArrayList<>();  
  
dateList.add(begin);  
  
while (!begin.equals(end)) {  
begin = begin.plusDays(1);  
dateList.add(begin);  
}  
  
//存放每天的订单总数  
List<Integer> orderCountList = new ArrayList<>();  
//存放每天的有效订单数  
List<Integer> validOrderCountList = new ArrayList<>();  
  
//遍历dateList集合,查询每天的有效订单数和订单总数  
for (LocalDate date : dateList) {  
//查询每天的订单总数 select count(id) from orders where order_time > ? and order_time < ?LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);  
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);  
Integer orderCount = getOrderCount(beginTime, endTime, null);  
  
//查询每天的有效订单数 select count(id) from orders where order_time > ? and order_time < ? and status = 5Integer validOrderCount = getOrderCount(beginTime, endTime, Orders.COMPLETED);  
  
orderCountList.add(orderCount);  
validOrderCountList.add(validOrderCount);  
}  
  
//计算时间区间内的订单总数量 stream流  
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);  
}

4.3 功能测试

请添加图片描述
请添加图片描述

5. 销量排名

5.1 需求分析与设计
5.1.1 产品原型

请添加图片描述

5.1.2 业务规则
  • 根据业务规则,展示销量前10的商品(包括菜品和套餐)
  • 基于可视化报表的柱状图降序展示商品销量
  • 销量为商品销售的份数
5.2 代码开发

请添加图片描述

/**  
* 统计指定时间区间内的销量排名前10  
* @param begin  
* @param end  
* @return  
*/  
public 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();  
}

5.3 功能测试

请添加图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值