Day12

7 阅读4分钟

Day12 你要做成什么效果

1)工作台(后台首页看板)

工作台会展示:今日数据、订单管理、菜品总览、套餐总览、订单信息

几个关键指标口径(后端统计会用到,必须记住):

  • 营业额:已完成订单的总金额
  • 有效订单:已完成订单的数量
  • 订单完成率:有效订单数 / 总订单数 * 100%
  • 平均客单价:营业额 / 有效订单数
  • 新增用户:新增用户的数量

2)导出Excel(近30天运营数据)

在数据统计页面点“数据导出”,下载一个 Excel 文件,包含 最近30日 的运营数据,表格固定为 概览数据 + 明细数据
业务规则与接口特点:

  • 导出 Excel 形式报表
  • 导出最近30天运营数据
  • 接口无参数(后端自己算最近30天)
  • 接口无返回 JSON(文件下载,通过输出流写到浏览器)

Part A:工作台模块怎么学

A1. 你要跑通的 4 个接口

工作台 Controller 路径是 /admin/workspace,核心接口包括:

  • GET /admin/workspace/businessData:今日数据(当天 LocalTime.MIN ~ LocalTime.MAX
  • GET /admin/workspace/overviewOrders:订单管理概览
  • GET /admin/workspace/overviewDishes:菜品总览
  • GET /admin/workspace/overviewSetmeals:套餐总览

WorkspaceService 至少要看懂 4 个方法签名:getBusinessData / getOrderOverView / getDishOverView / getSetmealOverView

直接导入工作台模块功能代码

A2. 你要理解的“统计套路”(举一反三)

工作台的“菜品/套餐总览”本质就是 按状态 count

  • ENABLE 统计 sold
  • DISABLE 统计 discontinued
    套餐总览也是同样逻辑。

订单管理概览同样是 countByMap,只不过按订单状态统计:待接单、待派送、已完成、已取消、全部等。

A3. 工作台验收标准

  1. 这 4 个接口都能返回成功(哪怕数据是 0)
  2. 当天如果确实有已完成订单:营业额/有效订单不为 0(口径见上面的定义)

Part B:Apache POI 你只要掌握的“最小知识集”

Day12 用 POI 的目的很明确:基于模板导出 Excel。POI 读写 Excel 的典型对象链路就是:

  • XSSFWorkbook(整个xlsx)
  • XSSFSheet(Sheet页)
  • XSSFRow(行)
  • XSSFCell(单元格)

典型操作:读取文件 → getSheetAt/getRow/getCell → 读写 cell → 关闭资源。

不用背 API,记住两句话就够:

  • 模板导出 = 读模板 → 填数据 → 输出到浏览器流
  • 资源一定要关(InputStream / Workbook / OutputStream)

Part C:导出近30天运营数据 Excel

C1. 需求 & 实现步骤

需求:导出最近30天运营数据,报表固定为概览+明细;接口无参数、无JSON返回。
实现步骤:

  1. 设计 Excel 模板
  2. 查询近30天运营数据
  3. 写入模板
  4. 输出流下载到浏览器

C2. 接口与代码落点

Controller:在 ReportController 增加 GET /export,调用 reportService.exportBusinessData(response)
Service:声明 void exportBusinessData(HttpServletResponse response);

C3. ServiceImpl 核心逻辑

  1. 日期范围:
  • begin = now - 30天
  • end = now - 1天(昨天)
  1. 概览数据:调用工作台统计方法拿 BusinessDataVO(直接复用工作台统计口径)
  2. 读取模板:必须放在 resources 下,路径是
    template/运营数据报表模板.xlsx
  3. 按固定位置填概览:
  • Sheet1
  • 第2行写日期范围:begin 至 end
  • 第4/5行写营业额、完成率、新增用户、有效订单、客单价等
  1. 循环 30 天写明细(关键行号别写错):
    从第 7 + i 行开始,每行写:日期、营业额、有效订单、完成率、客单价、新增用户
  2. 输出下载:response.getOutputStream() + excel.write(out),并 flush/close。

C4. 功能验收(最短闭环)

前后端联调,进入数据统计,点“数据导出”,Excel 下载成功。
我建议你加两个“强验收”:

  • 打开 Excel:概览区域(日期范围、营业额等)确实被填充
  • 明细 30 行每天都有一行(没数据也应该是 0,不要空)

Day12 最常见的坑

  1. 模板读不到(NPE) :99% 是路径/文件名不一致。代码里写死的是 template/运营数据报表模板.xlsx
  2. Sheet 名不对:代码取的是 "Sheet1",你模板如果叫别的名字就会取不到。
  3. 明细行错位:讲义从 7 + i 行开始写明细,行号一偏就会把模板标题覆盖或写到空白区域。
  4. 下载成功但文件损坏/打不开:通常是流没正确关闭/flush,或异常后资源没释放。讲义里有 excel.write(out) + out.flush/out.close/excel.close 的模式。
  5. 统计数据全是 0:先确认“已完成订单”是否存在(营业额/有效订单的定义都依赖已完成订单)。