From f44e4d609e7efaed9eac545137970b1e334f8106 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 21 九月 2024 09:01:36 +0800 Subject: [PATCH] 修改bug --- ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java | 244 ++++++++++++++++++++++++++++-------------------- 1 files changed, 142 insertions(+), 102 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java index 75fef99..1b9284e 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/MgtBusinessDataService.java @@ -1,5 +1,7 @@ package com.ruoyi.order.service.impl; +import com.alibaba.excel.EasyExcel; +import com.google.common.collect.Lists; import com.ruoyi.common.core.enums.AuctionOrderTypeEnum; import com.ruoyi.common.core.enums.OrderFromEnum; import com.ruoyi.common.core.enums.OrderTypeEnum; @@ -15,10 +17,12 @@ import com.ruoyi.order.service.IOrderService; import com.ruoyi.system.api.domain.Order; import java.math.BigDecimal; +import java.net.URLEncoder; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -28,6 +32,7 @@ import java.util.concurrent.Executors; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -52,103 +57,110 @@ */ public MgtOrderStaticsVO getOverview(MgtOrderStaticsQuery query) { - LocalDateTime startTime = null; - LocalDateTime endTime = null; - getTimeByTimeType(query, startTime, endTime); + List<LocalDateTime> timeByTimeType = getTimeByTimeType(query); + LocalDateTime startTime = timeByTimeType.get(0); + LocalDateTime endTime = timeByTimeType.get(1); List<Order> orderList = orderService.getStaticsOrderList(startTime, endTime); - if (orderList.isEmpty()) { - throw new ServiceException("暂无数据"); - } MgtOrderStaticsVO mgtOrderStaticsVO = new MgtOrderStaticsVO(); - /* ***************************************商城订单统计*************************************** */ - // 商城订单统计-订单总数 - long mallOrderTotalCount = orderList.stream() - .filter(order -> !order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) - .count(); - // 商城订单统计-订单总数 - long mallOrderCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER)) - .count(); - // 商城订单统计-商城订单 - long seckillOrderCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS)) - .count(); - // 商城订单统计-团购订单 - long groupPurchaseOrderCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.GROUP_PURCHASE_ORDERS)) - .count(); - // 商城订单统计-订单总金额 - BigDecimal mallOrderTotalAmount = orderList.stream() - .filter(order -> !order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - // 商城订单统计 - 商城总金额 - BigDecimal mallTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER)) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - // 商城订单统计-秒杀总金额 - BigDecimal seckillTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS)) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + if (CollUtils.isNotEmpty(orderList)) { + /* ***************************************商城订单统计*************************************** */ + // 商城订单统计-订单总数 + long mallOrderTotalCount = orderList.stream() + .filter(order -> !order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) + .count(); + // 商城订单统计-商城订单 + long mallOrderCount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER)) + .count(); + // 商城订单统计-秒杀订单 + long seckillOrderCount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS)) + .count(); + // 商城订单统计-团购订单 + long groupPurchaseOrderCount = orderList.stream() + .filter(order -> order.getOrderFrom() + .equals(OrderFromEnum.GROUP_PURCHASE_ORDERS)) + .count(); + // 商城订单统计-订单总金额 + BigDecimal mallOrderTotalAmount = orderList.stream() + .filter(order -> !order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + // 商城订单统计 - 商城总金额 + BigDecimal mallTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.COMMODITY_ORDER)) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + // 商城订单统计-秒杀总金额 + BigDecimal seckillTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.SNAP_ORDERS)) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - // 商城订单统计-团购总金额 - BigDecimal groupPurchaseTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.GROUP_PURCHASE_ORDERS)) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + // 商城订单统计-团购总金额 + BigDecimal groupPurchaseTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom() + .equals(OrderFromEnum.GROUP_PURCHASE_ORDERS)) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - mgtOrderStaticsVO.setMallOrderTotalCount(mallOrderTotalCount); - mgtOrderStaticsVO.setMallOrderCount(mallOrderCount); - mgtOrderStaticsVO.setSeckillOrderCount(seckillOrderCount); - mgtOrderStaticsVO.setGroupPurchaseOrderCount(groupPurchaseOrderCount); + mgtOrderStaticsVO.setMallOrderTotalCount(mallOrderTotalCount); + mgtOrderStaticsVO.setMallOrderCount(mallOrderCount); + mgtOrderStaticsVO.setSeckillOrderCount(seckillOrderCount); + mgtOrderStaticsVO.setGroupPurchaseOrderCount(groupPurchaseOrderCount); - mgtOrderStaticsVO.setMallOrderTotalAmount(mallOrderTotalAmount); - mgtOrderStaticsVO.setMallTotalAmount(mallTotalAmount); - mgtOrderStaticsVO.setSeckillTotalAmount(seckillTotalAmount); - mgtOrderStaticsVO.setGroupPurchaseTotalAmount(groupPurchaseTotalAmount); + mgtOrderStaticsVO.setMallOrderTotalAmount(mallOrderTotalAmount); + mgtOrderStaticsVO.setMallTotalAmount(mallTotalAmount); + mgtOrderStaticsVO.setSeckillTotalAmount(seckillTotalAmount); + mgtOrderStaticsVO.setGroupPurchaseTotalAmount(groupPurchaseTotalAmount); - /* ***************************************拍卖订单统计*************************************** */ - // 拍卖订单统计-订单总数 - long auctionOrderTotalCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) - .count(); - // 商城订单统计-订单总数 - long auctionGoodsOrderCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) - && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.REGULAR_ITEMS)) - .count(); - // 拍卖订单统计-拍卖商品订单 - long auctionSalesroomOrderCount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) - && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) - .count(); - // 拍卖订单统计-订单总金额 - BigDecimal auctionOrderTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) - .map(Order::getTotalAmount) - .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - // 拍卖订单统计-拍卖商品总金额 - BigDecimal auctionGoodsTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) - && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.REGULAR_ITEMS) - ) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - // 拍卖订单统计-拍卖场总金额 - BigDecimal auctionSalesroomTotalAmount = orderList.stream() - .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) - && order.getAuctionOrderType().equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) - .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + /* ***************************************拍卖订单统计*************************************** */ + // 拍卖订单统计-订单总数 + long auctionOrderTotalCount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) + .count(); + // 拍卖订单统计-拍卖商品订单 + long auctionGoodsOrderCount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) + && order.getAuctionOrderType() + .equals(AuctionOrderTypeEnum.REGULAR_ITEMS)) + .count(); + // 拍卖订单统计-拍卖场订单 + long auctionSalesroomOrderCount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) + && order.getAuctionOrderType() + .equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) + .count(); + // 拍卖订单统计-订单总金额 + BigDecimal auctionOrderTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS)) + .map(Order::getTotalAmount) + .reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + // 拍卖订单统计-拍卖商品总金额 + BigDecimal auctionGoodsTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) + && order.getAuctionOrderType() + .equals(AuctionOrderTypeEnum.REGULAR_ITEMS) + ) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); + // 拍卖订单统计-拍卖场总金额 + BigDecimal auctionSalesroomTotalAmount = orderList.stream() + .filter(order -> order.getOrderFrom().equals(OrderFromEnum.AUCTION_ORDERS) + && order.getAuctionOrderType() + .equals(AuctionOrderTypeEnum.AUCTION_ITEMS)) + .map(Order::getTotalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); - mgtOrderStaticsVO.setAuctionOrderTotalCount(auctionOrderTotalCount); - mgtOrderStaticsVO.setAuctionGoodsOrderCount(auctionGoodsOrderCount); - mgtOrderStaticsVO.setAuctionSalesroomOrderCount(auctionSalesroomOrderCount); + mgtOrderStaticsVO.setAuctionOrderTotalCount(auctionOrderTotalCount); + mgtOrderStaticsVO.setAuctionGoodsOrderCount(auctionGoodsOrderCount); + mgtOrderStaticsVO.setAuctionSalesroomOrderCount(auctionSalesroomOrderCount); - mgtOrderStaticsVO.setAuctionOrderTotalAmount(auctionOrderTotalAmount); - mgtOrderStaticsVO.setAuctionGoodsTotalAmount(auctionGoodsTotalAmount); - mgtOrderStaticsVO.setAuctionSalesroomTotalAmount(auctionSalesroomTotalAmount); + mgtOrderStaticsVO.setAuctionOrderTotalAmount(auctionOrderTotalAmount); + mgtOrderStaticsVO.setAuctionGoodsTotalAmount(auctionGoodsTotalAmount); + mgtOrderStaticsVO.setAuctionSalesroomTotalAmount(auctionSalesroomTotalAmount); + } return mgtOrderStaticsVO; } - private void getTimeByTimeType(MgtOrderStaticsQuery query, LocalDateTime startTime, - LocalDateTime endTime) { + private List<LocalDateTime> getTimeByTimeType(MgtOrderStaticsQuery query) { + LocalDateTime startTime; + LocalDateTime endTime; + List<LocalDateTime> range = new ArrayList<>(); LocalDateTime now = LocalDateTime.now(); if (Objects.equals(TimeTypeEnum.TODAY.getCode(), query.getTimeType())) { startTime = DateUtils.getDayStart(now); @@ -169,6 +181,9 @@ startTime = DateUtils.getDayStart(now); endTime = DateUtils.getDayEnd(now); } + range.add(startTime); + range.add(endTime); + return range; } /** @@ -201,23 +216,23 @@ CompletableFuture<List<MgtAmountChartVO>> auctionOrderTotalAmountFuture = CompletableFuture.supplyAsync( () -> getMgtAmountChartVOS(datesBetween, orderList, OrderTypeEnum.AUCTION_ORDER), executorService); - // 等待所有任务完成 - CompletableFuture<Void> futureAll = CompletableFuture.allOf(mallOrderCountFuture, - mallOrderTotalAmountFuture, auctionOrderCountFuture, auctionOrderTotalAmountFuture); + // 使用 join 方法阻塞当前线程,直到所有任务完成 + CompletableFuture.allOf(mallOrderCountFuture, + mallOrderTotalAmountFuture, auctionOrderCountFuture, auctionOrderTotalAmountFuture) + .join(); MgtOrderStaticsChartVO mgtOrderStaticsChartVO = new MgtOrderStaticsChartVO(); - futureAll.thenRun(() -> { - try { - mgtOrderStaticsChartVO.setMallOrderCountList(mallOrderCountFuture.get()); - mgtOrderStaticsChartVO.setMallOrderTotalAmountList( - mallOrderTotalAmountFuture.get()); - mgtOrderStaticsChartVO.setAuctionOrderCount(auctionOrderCountFuture.get()); - mgtOrderStaticsChartVO.setAuctionOrderTotalAmount( - auctionOrderTotalAmountFuture.get()); - } catch (InterruptedException | ExecutionException e) { - throw new RuntimeException(e); - } - executorService.shutdown(); // 关闭线程池 - }); + try { + // 设置结果 + mgtOrderStaticsChartVO.setMallOrderCountList(mallOrderCountFuture.get()); + mgtOrderStaticsChartVO.setMallOrderTotalAmountList(mallOrderTotalAmountFuture.get()); + mgtOrderStaticsChartVO.setAuctionOrderCountList(auctionOrderCountFuture.get()); + mgtOrderStaticsChartVO.setAuctionOrderTotalAmountList( + auctionOrderTotalAmountFuture.get()); + } catch (InterruptedException | ExecutionException e) { + throw new RuntimeException(e); + } finally { + executorService.shutdown(); // 确保关闭线程池 + } return mgtOrderStaticsChartVO; } @@ -304,4 +319,29 @@ .limit(numOfDaysBetween + 1) // 加1是因为包含结束日期 .collect(Collectors.toList()); } + + /** + * 业务数据导出 + * + * @param query + * @param response + */ + public void exportBusinessData(MgtOrderStaticsQuery query, HttpServletResponse response) { + MgtOrderStaticsVO overview = getOverview(query); + // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman + response.setContentType( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系 + try { + String fileName = URLEncoder.encode("业务数据", "UTF-8").replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", + "attachment;filename*=utf-8''" + fileName + ".xlsx"); + EasyExcel.write(response.getOutputStream(), MgtOrderStaticsVO.class) + .sheet("业务数据") + .doWrite(Lists.newArrayList(overview)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } -- Gitblit v1.7.1