文章目录
- 前言
- 一、工作台
-
- [1.1 今日数据](#1.1 今日数据)
-
- [1.1.1 接口设计](#1.1.1 接口设计)
- [1.1.2 代码实现](#1.1.2 代码实现)
- [1.2 订单管理接口](#1.2 订单管理接口)
- 1.3菜品总览接口
- [1.4 套餐总览接口](#1.4 套餐总览接口)
- [1.5 订单搜索(已完成)](#1.5 订单搜索(已完成))
- [1.6 各个状态的订单数量统计(已完成)](#1.6 各个状态的订单数量统计(已完成))
- [二、Apache POI](#二、Apache POI)
-
- [2.1 概述](#2.1 概述)
- [2.2 效果展示](#2.2 效果展示)
- 三、导出运营数据Excel报表
-
- [3.1 业务规则](#3.1 业务规则)
- [3.2 接口设计](#3.2 接口设计)
- [3.3 代码实现](#3.3 代码实现)
前言
工作台用于展示各项运营数据,在图形报表中很多方法都已实现,这部分的业务逻辑也差不多,只是返回的数据类型不一样。
POI用于操作 Excel 文件,可以对Excel文件进行读写操作
导出运营数据报表首先就是查询近30天的运营数据,然后通过POI将查询到的运营数据写入模板文件
最后通过输出流将Excel文件下载到客户端浏览器。
一、工作台
工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。
展示的数据包括:今日数据、订单管理、菜品总览、套餐总览、订单信息(已完成)
这里只展示今日数据的代码,其他部分逻辑差不多,前面的业务逻辑中也已
对相关sql语句编写过了,整体的业务逻辑都是根据需要返回的数据去计算对应的值,然后封装到VO实体类中返回给前端。
1.1 今日数据
1.1.1 接口设计
1.1.2 代码实现
1、在workspaceController中定义方法,实现工作台展示今日数据
java
@GetMapping("/businessData")
@ApiOperation("今日数据")
public Result<BusinessDataVO> businessData(){
//获得当天的开始时间
LocalDateTime begin = LocalDateTime.now().with(LocalTime.MIN);
LocalDateTime end = LocalDateTime.now().with(LocalTime.MAX);
BusinessDataVO businessDataVO = workspaceService.businessData(begin,end);
return Result.success(businessDataVO);
}
2、在WorkspaceService中编写businessData方法,在WorkspaceServiceImpl中实现
java
public BusinessDataVO businessData(LocalDateTime begin, LocalDateTime end) {
Map map = new HashMap();
map.put("begin",begin);
map.put("end",end);
//查询总订单数
Integer totalOrderCount = orderMapper.countByMap(map);
map.put("status", Orders.COMPLETED);
//营业额
Double turnover = orderMapper.sumByMap(map);
turnover = turnover == null? 0.0 : turnover;
//有效订单数
Integer validOrderCount = orderMapper.countByMap(map);
Double unitPrice = 0.0;
Double orderCompletionRate = 0.0;
if(totalOrderCount != 0 && validOrderCount != 0){
//订单完成率
orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount;
//平均客单价
unitPrice = turnover / validOrderCount;
}
//新增用户数
Integer newUsers = userMapper.countByMap(map);
return BusinessDataVO.builder()
.turnover(turnover)
.validOrderCount(validOrderCount)
.orderCompletionRate(orderCompletionRate)
.unitPrice(unitPrice)
.newUsers(newUsers)
.build();
}
3、在xxxMapper中定义方法,在day11统计报表中很多方法都已实现。
1.2 订单管理接口
1.3菜品总览接口
1.4 套餐总览接口
1.5 订单搜索(已完成)
1.6 各个状态的订单数量统计(已完成)
二、Apache POI
2.1 概述
Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。
一般情况下,POI 都是用于操作 Excel 文件。
应用场景:
- 银行网银系统导出交易明细
- 各种业务系统导出Excel报表
- 批量导入业务数据
2.2 效果展示
三、导出运营数据Excel报表
3.1 业务规则
导出Excel形式的报表文件
导出最近30天的运营数据
3.2 接口设计
当前接口没有返回数据,因为报表导出功能本质上是文件下载,
服务端会通过输出流将Excel文件下载到客户端浏览器
3.3 代码实现
1、设计Excel模板文件
2、在ReportController中创建export方法
java
@GetMapping("/export")
@ApiOperation("到处运营数据报表")
public void export(HttpServletResponse response){
reportService.exportBusinessData(response);
}
3、在ReportService接口中声明导出运营数据报表的方法,在ReportServiceImpl实现类中实现
java
public void exportBusinessData(HttpServletResponse response) {
//1. 查询数据库,获取营业数据--获取最近30天的运营数据
LocalDate dateBegin = LocalDate.now().minusDays(30);
LocalDate dateEnd = LocalDate.now().minusDays(1);
//查询今日数据
BusinessDataVO businessDataVO = workspaceService.businessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MAX));
//2. 通过POI将数据写入到excel文件中
InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
try {
//基于模板文件创建一个新的Excel文件
XSSFWorkbook excel = new XSSFWorkbook(in);
//获取表格文件sheet页
XSSFSheet sheet = excel.getSheet("Sheet1");
//填充数据--时间
sheet.getRow(1).getCell(1).setCellValue("时间:"+dateBegin+"至"+dateEnd);
//获得第4行
XSSFRow row = sheet.getRow(3);
row.getCell(2).setCellValue(businessDataVO.getTurnover());
row.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate());
row.getCell(6).setCellValue(businessDataVO.getNewUsers());
//获得第5行
row = sheet.getRow(4);
row.getCell(2).setCellValue(businessDataVO.getValidOrderCount());
row.getCell(4).setCellValue(businessDataVO.getUnitPrice());
//填充明细数据
for (int i = 0; i < 30; i++) {
LocalDate date = dateBegin.plusDays(i);
BusinessDataVO businessData = workspaceService.businessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX));
//获得某一行
row = sheet.getRow(7 + i);
row.getCell(1).setCellValue(date.toString());
row.getCell(2).setCellValue(businessData.getTurnover());
row.getCell(3).setCellValue(businessData.getValidOrderCount());
row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
row.getCell(5).setCellValue(businessData.getUnitPrice());
row.getCell(6).setCellValue(businessData.getNewUsers());
}
//3. 通过输出流将Excel文件下载到客户端浏览器
ServletOutputStream out = response.getOutputStream();
excel.write(out);
//4.关闭资源
out.close();
excel.close();
} catch (IOException e) {
e.printStackTrace();
}
}