From ea29dd781af04c2f1a5ad54d6b25251c9eca6c2b Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Fri, 12 Jan 2024 10:15:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E8=BF=90=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/ReportController.java | 12 +++ .../java/com/sky/service/ReportService.java | 8 ++ .../sky/service/impl/ReportServiceImpl.java | 88 +++++++++++++----- .../resources/template/运营数据报表模板.xlsx | Bin 0 -> 12570 bytes 4 files changed, 86 insertions(+), 22 deletions(-) create mode 100644 sky-server/src/main/resources/template/运营数据报表模板.xlsx diff --git a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java index 52a8dd6..eff1e4d 100644 --- a/sky-server/src/main/java/com/sky/controller/admin/ReportController.java +++ b/sky-server/src/main/java/com/sky/controller/admin/ReportController.java @@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; @RestController @@ -84,4 +85,15 @@ public class ReportController { log.info("销量排名,开始时间:{};结束时间:{}", begin, end); return Result.success(reportService.getSalesTop10(begin, end)); } + + /** + * 导出运行数据 + * + * @param response HttpResponse + */ + @ApiOperation(("导出运行数据")) + @GetMapping("/export") + public void export(HttpServletResponse response) { + reportService.exportBusinessData(response); + } } diff --git a/sky-server/src/main/java/com/sky/service/ReportService.java b/sky-server/src/main/java/com/sky/service/ReportService.java index 443fc74..7007574 100644 --- a/sky-server/src/main/java/com/sky/service/ReportService.java +++ b/sky-server/src/main/java/com/sky/service/ReportService.java @@ -5,6 +5,7 @@ import com.sky.vo.SalesTop10ReportVO; import com.sky.vo.TurnoverReportVO; import com.sky.vo.UserReportVO; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; public interface ReportService { @@ -43,4 +44,11 @@ public interface ReportService { * @return OrderReportVO */ SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end); + + /** + * 导出运行数据 + * + * @param response HttpResponse + */ + void exportBusinessData(HttpServletResponse response); } diff --git a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java index eec6ffe..026703d 100644 --- a/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/ReportServiceImpl.java @@ -5,14 +5,18 @@ import com.sky.entity.Orders; import com.sky.mapper.OrderMapper; import com.sky.mapper.UserMapper; import com.sky.service.ReportService; -import com.sky.vo.OrderReportVO; -import com.sky.vo.SalesTop10ReportVO; -import com.sky.vo.TurnoverReportVO; -import com.sky.vo.UserReportVO; +import com.sky.service.WorkspaceService; +import com.sky.vo.*; import org.apache.commons.lang.StringUtils; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.InputStream; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -27,6 +31,8 @@ public class ReportServiceImpl implements ReportService { private OrderMapper orderMapper; @Resource private UserMapper userMapper; + @Resource + private WorkspaceService workspaceService; /** * 获得订单数量 @@ -113,11 +119,7 @@ public class ReportServiceImpl implements ReportService { totalUserList.add(totalUser); newUserList.add(newUser); } - return UserReportVO.builder() - .dateList(StringUtils.join(dateList, ",")) - .totalUserList(StringUtils.join(totalUserList, ",")) - .newUserList(StringUtils.join(newUserList, ",")) - .build(); + return UserReportVO.builder().dateList(StringUtils.join(dateList, ",")).totalUserList(StringUtils.join(totalUserList, ",")).newUserList(StringUtils.join(newUserList, ",")).build(); } /** @@ -161,14 +163,7 @@ public class ReportServiceImpl implements ReportService { if (totalOrderCount != 0) { orderCompletionRate = vailOrderCount.doubleValue() / totalOrderCount; } - return OrderReportVO.builder() - .dateList(StringUtils.join(dateList, ",")) - .orderCountList(StringUtils.join(orderCountList, ",")) - .validOrderCountList((StringUtils.join(vailOrderCountList, ","))) - .totalOrderCount(totalOrderCount) - .validOrderCount(vailOrderCount) - .orderCompletionRate(orderCompletionRate) - .build(); + return OrderReportVO.builder().dateList(StringUtils.join(dateList, ",")).orderCountList(StringUtils.join(orderCountList, ",")).validOrderCountList((StringUtils.join(vailOrderCountList, ","))).totalOrderCount(totalOrderCount).validOrderCount(vailOrderCount).orderCompletionRate(orderCompletionRate).build(); } /** @@ -191,10 +186,59 @@ public class ReportServiceImpl implements ReportService { String numberList = StringUtils.join(numbers, ","); // 封装返回结果数据 - return SalesTop10ReportVO - .builder() - .nameList(nameList) - .numberList(numberList) - .build(); + return SalesTop10ReportVO.builder().nameList(nameList).numberList(numberList).build(); + } + + /** + * 导出运行数据 + * + * @param response HttpResponse + */ + @Override + public void exportBusinessData(HttpServletResponse response) { + // 查询数据库,获取营业额数据---查询最近30天营业额数据 + LocalDate dateBegin = LocalDate.now().minusDays(30); + LocalDate dateEnd = LocalDate.now().minusDays(1); + // 查询概览数据 + BusinessDataVO businessDataVO = workspaceService.getBusinessData(LocalDateTime.of(dateBegin, LocalTime.MIN), LocalDateTime.of(dateEnd, LocalTime.MIN)); + // 通过POI将数据写到Excel文件中 + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx"); + try { + assert inputStream != null; + XSSFWorkbook excel = new XSSFWorkbook(inputStream); + XSSFSheet sheet = excel.getSheet("Sheet1"); + sheet.getRow(1).getCell(1).setCellValue("时间:" + dateBegin + "至" + dateEnd); + // 第四行,营业额数据 + XSSFRow row4 = sheet.getRow(3); + row4.getCell(2).setCellValue(businessDataVO.getTurnover()); + row4.getCell(4).setCellValue(businessDataVO.getOrderCompletionRate()); + row4.getCell(6).setCellValue(businessDataVO.getNewUsers()); + // 第五行,营业额数据 + XSSFRow row5 = sheet.getRow(4); + row5.getCell(2).setCellValue(businessDataVO.getValidOrderCount()); + row5.getCell(4).setCellValue(businessDataVO.getUnitPrice()); + + for (int i = 0; i < 30; i++) { + LocalDate date = dateBegin.plusDays(i); + // 查询某一天数据 + BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(date, LocalTime.MIN), LocalDateTime.of(date, LocalTime.MAX)); + sheet.getRow(7 + i).getCell(1).setCellValue(date.toString()); + sheet.getRow(7 + i).getCell(2).setCellValue(businessData.getTurnover()); + sheet.getRow(7 + i).getCell(3).setCellValue(businessData.getValidOrderCount()); + sheet.getRow(7 + i).getCell(4).setCellValue(businessData.getOrderCompletionRate()); + sheet.getRow(7 + i).getCell(5).setCellValue(businessData.getUnitPrice()); + sheet.getRow(7 + i).getCell(6).setCellValue(businessData.getNewUsers()); + } + + // 通过输出Excel文件下载到客户端浏览器 + ServletOutputStream outputStream = response.getOutputStream(); + excel.write(outputStream); + // 关闭 + outputStream.close(); + excel.close(); + inputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/sky-server/src/main/resources/template/运营数据报表模板.xlsx b/sky-server/src/main/resources/template/运营数据报表模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..76806c553826045fe5f3fc6f81dd7e2cef56b3a9 GIT binary patch literal 12570 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 literal 0 HcmV?d00001