diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java index 315888f7..28592d0f 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/controller/shop/SummaryByDayController.java @@ -1,5 +1,6 @@ package cn.ysk.cashier.controller.shop; +import cn.ysk.cashier.annotation.rest.AnonymousGetMapping; import cn.ysk.cashier.dto.ShopSummaryDto; import cn.ysk.cashier.service.SummaryService; import cn.ysk.cashier.vo.TbOrderPayCountVo; @@ -33,6 +34,7 @@ public class SummaryByDayController { @GetMapping + @AnonymousGetMapping public Page shopSummary(ShopSummaryDto summaryDto, @RequestParam(required = false, defaultValue = "0") Integer page, @RequestParam(required = false, defaultValue = "10") Integer size) { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java index fe3ab82f..8429d37f 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/repository/order/TbOrderDetailRepository.java @@ -36,7 +36,7 @@ public interface TbOrderDetailRepository extends JpaRepository searchDetailByOrderIds(@Param("ids")List ids); @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayV2Vo(" + - "info.productName,pro.id, cate.name,'', " + + "info.productName,pro.id, cate.name,pro.typeEnum, " + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + "SUM(CASE WHEN orders.orderType='return' THEN info.num ELSE 0 END), " + "SUM(CASE WHEN orders.orderType!='return' THEN info.priceAmount ELSE 0 END), " + @@ -82,15 +82,16 @@ public interface TbOrderDetailRepository extends JpaRepository :startTime AND info.createTime < :endTime " + "AND (info.status = 'closed' OR info.status = 'refund') " + "GROUP BY info.productId, info.productSkuId " + "ORDER BY salesNum DESC") - List queryTbOrderSalesCountBySku(@Param("shopId") Integer shopId,@Param("proId")Integer proId, @Param("startTime") Date startTime, @Param("endTime") Date endTime); - + List queryTbOrderSalesCountBySku(@Param("shopId") Integer shopId + , @Param("startTime") Date startTime, @Param("endTime") Date endTime); @Query("SELECT new cn.ysk.cashier.vo.TbOrderSalesCountByDayVo(" + "info.productName, info.productSkuName, cate.name, unit.name,info.price," + "SUM(CASE WHEN orders.orderType!='return' THEN info.num ELSE 0 END) as salesNum, " + diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java index b89fe541..aacb65f7 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/service/impl/SummaryServiceImpl.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -35,6 +36,7 @@ import java.time.Instant; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; @@ -333,12 +335,45 @@ public class SummaryServiceImpl implements SummaryService { summaryDto.setStartTime(DateUtil.toDate(DateUtil.fromTimeStamp(1704038400L))); summaryDto.setEndTime(new Date()); } - Page products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime(), pageable); - for (TbOrderSalesCountByDayV2Vo product : products) { - List skus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), product.getProductId(), summaryDto.getStartTime(), summaryDto.getEndTime()); - product.setSkus(skus); + + // 使用 CompletableFuture 并行执行两个数据库查询 + CompletableFuture> productsFuture = CompletableFuture.supplyAsync(() -> { + try { + return detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime(), pageable); + } catch (Exception e) { + log.error("查询 products 时发生错误", e); + return null; + } + }); + CompletableFuture> skusFuture = CompletableFuture.supplyAsync(() -> { + try { + return detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), summaryDto.getStartTime(), summaryDto.getEndTime()); + } catch (Exception e) { + log.error("查询 skus 时发生错误", e); + return null; + } + }); + try { + // 等待两个查询都完成后执行后续逻辑 + return CompletableFuture.allOf(productsFuture, skusFuture).thenApply(v -> { + Page products = productsFuture.join(); + List skus = skusFuture.join(); + if (products!= null && skus!= null) { + Map> collect = skus.stream().collect(Collectors.groupingBy(TbOrderSalesCountByDayV2Vo::getProductId)); + for (TbOrderSalesCountByDayV2Vo product : products) { + if ("sku".equals(product.getTypeEnum())) { + product.setSkus(collect.get(product.getProductId())); + } + } + return (Page) products; + } else { + return null; + } + }).join(); + } catch (Exception e) { + log.error("处理查询结果时发生错误", e); + return null; } - return (Page)products; } @Override @@ -353,10 +388,12 @@ public class SummaryServiceImpl implements SummaryService { } List products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime()); + List proSkus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), + summaryDto.getStartTime(), summaryDto.getEndTime()); + Map> collect = proSkus.stream().collect(Collectors.groupingBy(TbOrderSalesCountByDayV2Vo::getProductId)); for (TbOrderSalesCountByDayV2Vo product : products) { if("sku".equals(product.getTypeEnum())){ - List skus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), product.getProductId(), summaryDto.getStartTime(), summaryDto.getEndTime()); - product.setSkus(skus); + product.setSkus(collect.get(product.getProductId())); } } for (TbOrderSalesCountByDayV2Vo product : products) {