一、Apache ECharts
1.1介绍
Apache ECharts是一款基于Javascript的数据可视化图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。
官网地址:Apache ECharts
总结:使用Echarts,重点在于研究当前图表所需的数据格式。通常是需要后端提供符合格式要求的动态数据,然后响应给前端来展示图表。
二、营业额统计
2.1需求分析和设计
业务规则:
营业额指订单状态为已完成的订单金额合计
基于可视化报表的折线图展示营业额数据,x轴为日期,y轴为营业额
根据时间选择区间,展示每天的营业额数据
查看接口文档:

2.2代码开发
controller层

service层
java
@Service
@Slf4j
public class ReportServiceImpl implements ReportService {
@Autowired
private OrderMapper orderMapper;
/**
* 统计指定时间区间内的营业额数据
* @param begin
* @param end
* @return
*/
@Override
public TurnoverReportVO getTurnoverReport(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 > ? and order_time < ? and status = 5
Map map = new HashMap();
map.put("beginTime",beginTime);
map.put("endTime",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();
}
}
dao层

2.3功能测试
通过

三、用户统计
3.1需求分析和设计
业务规则:
基于可视化报表的折线图展示用户数据,x轴为日期,y轴为用户数
根据时间选择区间,展示每天的用户总量和新增用户量数据
查看接口文档:

3.2代码开发
controller层

service层
java
/**
* 统计指定时间内的新增用户和总用户数据
* @param begin
* @param end
* @return
*/
@Override
public UserReportVO getUserReport(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> newUserList = new ArrayList<>();
//存放每天总用户数量
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("endTime",endTime);
Integer totalUser = userMapper.countByMap(map);//总用户数量
totalUserList.add(totalUser);
map.put("beginTime", 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();
}
dao层

3.3功能测试
通过

四、订单统计
4.1需求分析和设计
业务规则:
有效订单指状态为"已完成"的订单
基于可视化报表的折线图展示订单数据,x轴为日期,y轴为订单数量
根据时间选择区间,展示每天的订单总数和有效订单数
展示所选时间区间内的有效订单数、总订单数、订单完成率、订单完成率=有效订单数/总订单数*100%
查看接口文档:


4.2代码开发
controller层

service层
java
/**
* 统计指定时间内的订单相关数据
* @param begin
* @param end
* @return
*/
@Override
public OrderReportVO getStatisticsReport(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<>();
//存放订单总数
Integer totalOrderCount =0;
//存放有效订单总数
Integer validOrderCount =0;
//存放订单完成率
Double orderCompletionRate = 0.0;
for (LocalDate date : dateList) {
LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
Map map = new HashMap();
map.put("beginTime",beginTime);
map.put("endTime",endTime);
Integer totalOrder = orderMapper.countOrderByMap(map);//每日订单数量
orderCountList.add(totalOrder);
if(totalOrder!=null){
totalOrderCount = totalOrderCount + totalOrder;
}
map.put("status", Orders.COMPLETED);
Integer validOrder = orderMapper.countOrderByMap(map);//每日有效订单数
validOrderCountList.add(validOrder);
if(validOrder!=null){
validOrderCount = validOrderCount + validOrder;
}
}
orderCompletionRate = totalOrderCount==0 ? 0.0 :(validOrderCount*1.0/totalOrderCount);
return OrderReportVO
.builder()
.dateList(StringUtils.join(dateList, ","))
.orderCountList(StringUtils.join(orderCountList,","))
.validOrderCountList(StringUtils.join(validOrderCountList,","))
.orderCompletionRate(orderCompletionRate)
.totalOrderCount(totalOrderCount)
.validOrderCount(validOrderCount)
.build();
}
dao层

4.3功能测试
通过

五、销量排名Top10
5.1需求分析和设计
业务规则:
根据时间选择区间,展示销量前十的商品(包括菜品和套餐)
基于可视化报表的柱状图降序展示商品销量
此处的销量为商品销售的份数
查看接口文档:

5.2代码开发
controller层

service层

dao层

5.3功能测试
通过

六、小结
注意:MySql语句中 select sum()...是统计具体的数值总和,select count()...是统计符合记录数有几条,请勿混淆
订单统计部分业务代码还是有些复杂的,没有跟着老师走看看接口文档自己设计也能够顺畅运行。
销量排名部分的sql语句有一些长,考虑的较多。