| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | */ |
| | | 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); |
| | |
| | | startTime = DateUtils.getDayStart(now); |
| | | endTime = DateUtils.getDayEnd(now); |
| | | } |
| | | range.add(startTime); |
| | | range.add(endTime); |
| | | return range; |
| | | } |
| | | |
| | | /** |
| | |
| | | .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); |
| | | } |
| | | } |
| | | } |