文章目录
- 前言
- 一、工作台
- 1.1 今日数据
- 1.1.1 接口设计
- 1.1.2 代码实现
- 1.2 订单管理接口
- 1.3菜品总览接口
- 1.4 套餐总览接口
- 1.5 订单搜索(已完成)
- 1.6 各个状态的订单数量统计(已完成)
- 二、Apache POI
- 2.1 概述
- 2.2 效果展示
- 三、导出运营数据Excel报表
- 3.1 业务规则
- 3.2 接口设计
- 3.3 代码实现
前言
工作台用于展示各项运营数据,在图形报表中很多方法都已实现,这部分的业务逻辑也差不多,只是返回的数据类型不一样。
POI用于操作 Excel 文件,可以对Excel文件进行读写操作
导出运营数据报表首先就是查询近30天的运营数据,然后通过POI将查询到的运营数据写入模板文件
最后通过输出流将Excel文件下载到客户端浏览器。
一、工作台
工作台是系统运营的数据看板,并提供快捷操作入口,可以有效提高商家的工作效率。
展示的数据包括:今日数据、订单管理、菜品总览、套餐总览、订单信息(已完成)
这里只展示今日数据的代码,其他部分逻辑差不多,前面的业务逻辑中也已
对相关sql语句编写过了,整体的业务逻辑都是根据需要返回的数据去计算对应的值,然后封装到VO实体类中返回给前端。
1.1 今日数据
1.1.1 接口设计
1.1.2 代码实现
1、在workspaceController中定义方法,实现工作台展示今日数据
@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中实现
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方法
@GetMapping("/export")
@ApiOperation("到处运营数据报表")
public void export(HttpServletResponse response){reportService.exportBusinessData(response);
}
3、在ReportService接口中声明导出运营数据报表的方法,在ReportServiceImpl实现类中实现
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();}
}