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. 工作台验收标准
- 这 4 个接口都能返回成功(哪怕数据是 0)
- 当天如果确实有已完成订单:营业额/有效订单不为 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返回。
实现步骤:
- 设计 Excel 模板
- 查询近30天运营数据
- 写入模板
- 输出流下载到浏览器
C2. 接口与代码落点
Controller:在 ReportController 增加 GET /export,调用 reportService.exportBusinessData(response)。
Service:声明 void exportBusinessData(HttpServletResponse response);
C3. ServiceImpl 核心逻辑
- 日期范围:
begin = now - 30天end = now - 1天(昨天)
- 概览数据:调用工作台统计方法拿
BusinessDataVO(直接复用工作台统计口径) - 读取模板:必须放在 resources 下,路径是
template/运营数据报表模板.xlsx - 按固定位置填概览:
Sheet1- 第2行写日期范围:
begin 至 end - 第4/5行写营业额、完成率、新增用户、有效订单、客单价等
- 循环 30 天写明细(关键行号别写错):
从第7 + i行开始,每行写:日期、营业额、有效订单、完成率、客单价、新增用户 - 输出下载:
response.getOutputStream()+excel.write(out),并 flush/close。
C4. 功能验收(最短闭环)
前后端联调,进入数据统计,点“数据导出”,Excel 下载成功。
我建议你加两个“强验收”:
- 打开 Excel:概览区域(日期范围、营业额等)确实被填充
- 明细 30 行每天都有一行(没数据也应该是 0,不要空)
Day12 最常见的坑
- 模板读不到(NPE) :99% 是路径/文件名不一致。代码里写死的是
template/运营数据报表模板.xlsx。 - Sheet 名不对:代码取的是
"Sheet1",你模板如果叫别的名字就会取不到。 - 明细行错位:讲义从
7 + i行开始写明细,行号一偏就会把模板标题覆盖或写到空白区域。 - 下载成功但文件损坏/打不开:通常是流没正确关闭/flush,或异常后资源没释放。讲义里有
excel.write(out)+out.flush/out.close/excel.close的模式。 - 统计数据全是 0:先确认“已完成订单”是否存在(营业额/有效订单的定义都依赖已完成订单)。