销售统计 效率优化
This commit is contained in:
parent
b2a7ea1887
commit
5cb7e9bdfb
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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, " +
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue