From 4bd9370f341a248c5efd451c2a9dd87c63e00b25 Mon Sep 17 00:00:00 2001 From: subaixi Date: Wed, 9 Oct 2024 18:57:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=90=A5=E4=B8=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AF=BC=E5=87=BAexecl=E5=8A=9F=E8=83=BD?= 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 | 7 ++ .../sky/service/impl/ReportServiceImpl.java | 71 ++++++++++++++++-- .../service/impl/WorkspaceServiceImpl.java | 10 ++- .../resources/template/运营数据报表模板.xlsx | Bin 0 -> 12570 bytes 5 files changed, 90 insertions(+), 10 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 f5a79e1..9a45460 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.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletResponse; import java.time.LocalDate; @RestController @@ -87,4 +88,15 @@ public class ReportController { log.info("销量排名数据统计:{}-{}", begin, end); return Result.success(reportService.getSalesTop10(begin,end)); } + + /** + * 数据导出 + * @param response + */ + @GetMapping("/export") + @ApiOperation("运营数据导出") + public void export(HttpServletResponse response) { + log.info("数据导出"); + 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 44152b7..66c801b 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 { @@ -40,4 +41,10 @@ public interface ReportService { * @return */ SalesTop10ReportVO getSalesTop10(LocalDate begin, LocalDate end); + + /** + * 导出营业额数据 + * @param response + */ + 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 65e94f1..3eeec6b 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 @@ -6,15 +6,20 @@ import com.sky.mapper.OrderMapper; import com.sky.mapper.UserMapper; import com.sky.service.ReportService; import com.sky.service.UserService; -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 lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @@ -31,9 +36,9 @@ public class ReportServiceImpl implements ReportService { @Autowired private OrderMapper orderMapper; @Autowired - private UserService userService; - @Autowired private UserMapper userMapper; + @Autowired + private WorkspaceService workspaceService; /** * 获取营业额统计数据 @@ -201,6 +206,60 @@ public class ReportServiceImpl implements ReportService { .build(); } + /** + * 导出30天营业数据 + * @param response + */ + public void exportBusinessData(HttpServletResponse response) { + LocalDate begin = LocalDate.now().minusDays(30); + LocalDate end = LocalDate.now().minusDays(1); + + //查询概览运营数据,提供给Excel模板文件 + BusinessDataVO businessData = workspaceService.getBusinessData( + LocalDateTime.of(begin,LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX)); + + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx"); + try { + //基于提供好的模板文件创建一个新的Excel表格对象 + XSSFWorkbook excel = new XSSFWorkbook(inputStream); + //获得Excel文件中的一个Sheet页 + XSSFSheet sheet = excel.getSheet("Sheet1"); + + sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end); + //获得第4行 + XSSFRow row = sheet.getRow(3); + //获取单元格 + row.getCell(2).setCellValue(businessData.getTurnover()); + row.getCell(4).setCellValue(businessData.getOrderCompletionRate()); + row.getCell(6).setCellValue(businessData.getNewUsers()); + row = sheet.getRow(4); + row.getCell(2).setCellValue(businessData.getValidOrderCount()); + row.getCell(4).setCellValue(businessData.getUnitPrice()); + for (int i = 0; i < 30; i++) { + LocalDate date = begin.plusDays(i); + //准备明细数据 + businessData = workspaceService.getBusinessData(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()); + } + //通过输出流将文件下载到客户端浏览器中 + ServletOutputStream out = response.getOutputStream(); + excel.write(out); + //关闭资源 + out.flush(); + out.close(); + excel.close(); + + }catch (IOException e){ + e.printStackTrace(); + } + } + /** * 根据时间区间统计指定状态的订单数量 * diff --git a/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java b/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java index 8ea0475..90e444d 100644 --- a/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java +++ b/sky-server/src/main/java/com/sky/service/impl/WorkspaceServiceImpl.java @@ -14,6 +14,7 @@ import com.sky.vo.SetmealOverViewVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import java.time.LocalDateTime; import java.time.LocalTime; import java.util.HashMap; @@ -34,6 +35,7 @@ public class WorkspaceServiceImpl implements WorkspaceService { /** * 根据时间段统计营业数据 + * * @param begin * @param end * @return @@ -48,8 +50,8 @@ public class WorkspaceServiceImpl implements WorkspaceService { */ Map map = new HashMap(); - map.put("begin",begin); - map.put("end",end); + map.put("begin", begin); + map.put("end", end); //查询总订单数 Integer totalOrderCount = orderMapper.countByMap(map); @@ -57,7 +59,7 @@ public class WorkspaceServiceImpl implements WorkspaceService { map.put("status", Orders.COMPLETED); //营业额 Double turnover = orderMapper.sumByMap(map); - turnover = turnover == null? 0.0 : turnover; + turnover = turnover == null ? 0.0 : turnover; //有效订单数 Integer validOrderCount = orderMapper.countByMap(map); @@ -65,7 +67,7 @@ public class WorkspaceServiceImpl implements WorkspaceService { Double unitPrice = 0.0; Double orderCompletionRate = 0.0; - if(totalOrderCount != 0 && validOrderCount != 0){ + if (totalOrderCount != 0 && validOrderCount != 0) { //订单完成率 orderCompletionRate = validOrderCount.doubleValue() / totalOrderCount; //平均客单价 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