销售统计 效率优化

This commit is contained in:
wangw 2024-10-30 14:52:52 +08:00
parent b2a7ea1887
commit 5cb7e9bdfb
3 changed files with 51 additions and 11 deletions

View File

@ -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<T> shopSummary(ShopSummaryDto summaryDto,
@RequestParam(required = false, defaultValue = "0") Integer page,
@RequestParam(required = false, defaultValue = "10") Integer size) {

View File

@ -36,7 +36,7 @@ public interface TbOrderDetailRepository extends JpaRepository<TbOrderDetail, In
List<TbOrderDetail> searchDetailByOrderIds(@Param("ids")List<Integer> 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<TbOrderDetail, In
"SUM(CASE WHEN orders.orderType='return' THEN info.priceAmount ELSE 0 END)) " +
"FROM TbOrderInfo orders " +
"LEFT JOIN TbOrderDetail info on orders.id=info.orderId " +
"INNER JOIN TbProduct pro ON info.productId = pro.id AND pro.id= :proId " +
"INNER JOIN TbProduct pro ON info.productId = pro.id " +
" AND pro.typeEnum= 'sku' " +
"LEFT JOIN TbShopCategory cate ON cate.id = pro.categoryId " +
"WHERE info.shopId = :shopId " +
"AND info.createTime > :startTime AND info.createTime < :endTime " +
"AND (info.status = 'closed' OR info.status = 'refund') " +
"GROUP BY info.productId, info.productSkuId " +
"ORDER BY salesNum DESC")
List<TbOrderSalesCountByDayV2Vo> queryTbOrderSalesCountBySku(@Param("shopId") Integer shopId,@Param("proId")Integer proId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
List<TbOrderSalesCountByDayV2Vo> 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, " +

View File

@ -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<TbOrderSalesCountByDayV2Vo> products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime(), pageable);
for (TbOrderSalesCountByDayV2Vo product : products) {
List<TbOrderSalesCountByDayV2Vo> skus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()), product.getProductId(), summaryDto.getStartTime(), summaryDto.getEndTime());
product.setSkus(skus);
// 使用 CompletableFuture 并行执行两个数据库查询
CompletableFuture<Page<TbOrderSalesCountByDayV2Vo>> 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<List<TbOrderSalesCountByDayV2Vo>> 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<TbOrderSalesCountByDayV2Vo> products = productsFuture.join();
List<TbOrderSalesCountByDayV2Vo> skus = skusFuture.join();
if (products!= null && skus!= null) {
Map<Integer, List<TbOrderSalesCountByDayV2Vo>> 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<T>) products;
} else {
return null;
}
}).join();
} catch (Exception e) {
log.error("处理查询结果时发生错误", e);
return null;
}
return (Page<T>)products;
}
@Override
@ -353,10 +388,12 @@ public class SummaryServiceImpl implements SummaryService {
}
List<TbOrderSalesCountByDayV2Vo> products = detailRepository.queryTbOrderSalesCountByProduct(Integer.valueOf(summaryDto.getShopId()), summaryDto.getCateId(), summaryDto.getProName(), summaryDto.getStartTime(), summaryDto.getEndTime());
List<TbOrderSalesCountByDayV2Vo> proSkus = detailRepository.queryTbOrderSalesCountBySku(Integer.valueOf(summaryDto.getShopId()),
summaryDto.getStartTime(), summaryDto.getEndTime());
Map<Integer, List<TbOrderSalesCountByDayV2Vo>> collect = proSkus.stream().collect(Collectors.groupingBy(TbOrderSalesCountByDayV2Vo::getProductId));
for (TbOrderSalesCountByDayV2Vo product : products) {
if("sku".equals(product.getTypeEnum())){
List<TbOrderSalesCountByDayV2Vo> 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) {