苍穹外卖day12 (Apache POI) 数据统计-Excel报表

发布于:2024-04-25 ⋅ 阅读:(27) ⋅ 点赞:(0)


前言

工作台用于展示各项运营数据,在图形报表中很多方法都已实现,这部分的业务逻辑也差不多,只是返回的数据类型不一样。
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();
    }
}