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