Browse Source

perf: 统计模块 selectList 添加 select() 限制列宽

- getOverview: orderMapper.selectList 只取 totalAmount + userId
- getCategoryOverview: orderItemMapper.selectList 只取 5 列
- 趋势图等方法: 添加 select() 避免 SELECT *

Co-Authored-By: Claude <noreply@anthropic.com>
skyline 1 ngày trước cách đây
mục cha
commit
af2b7a3f5a

+ 19 - 15
haha-service/src/main/java/com/haha/service/impl/StatisticsServiceImpl.java

@@ -66,32 +66,30 @@ public class StatisticsServiceImpl implements StatisticsService {
             orderWrapper.eq(Order::getShopId, queryDTO.getShopId());
         }
         
+        // 只选需要的列,避免 SELECT * 全量加载
+        orderWrapper.select(Order::getTotalAmount, Order::getUserId);
         List<Order> orders = orderMapper.selectList(orderWrapper);
-        
+
         BigDecimal totalSales = orders.stream()
                 .map(o -> o.getTotalAmount() != null ? o.getTotalAmount() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         overview.setTotalSales(totalSales.setScale(2, RoundingMode.HALF_UP));
-        
         overview.setTotalOrders(orders.size());
-        
+
         Set<Long> userIds = orders.stream()
-                .map(Order::getUserId)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toSet());
+                .map(Order::getUserId).filter(Objects::nonNull).collect(Collectors.toSet());
         overview.setTotalUsers(userIds.size());
-        
+
         long totalDevices = deviceMapper.selectCount(null);
         long onlineDevices = deviceMapper.selectCount(
-                new LambdaQueryWrapper<Device>().eq(Device::getStatus, DeviceConstants.STATUS_ONLINE)
-        );
+                new LambdaQueryWrapper<Device>().eq(Device::getStatus, DeviceConstants.STATUS_ONLINE));
         overview.setTotalDevices((int) totalDevices);
         overview.setOnlineDevices((int) onlineDevices);
-        
+
         long totalShops = shopMapper.selectCount(null);
         overview.setTotalShops((int) totalShops);
-        
-        BigDecimal avgOrderAmount = orders.size() > 0 
+
+        BigDecimal avgOrderAmount = orders.size() > 0
                 ? totalSales.divide(BigDecimal.valueOf(orders.size()), 2, RoundingMode.HALF_UP)
                 : BigDecimal.ZERO;
         overview.setAvgOrderAmount(avgOrderAmount);
@@ -128,12 +126,15 @@ public class StatisticsServiceImpl implements StatisticsService {
             wrapper.eq(OrderItem::getShopId, queryDTO.getShopId());
         }
         
+        // 只选需要的列
+        wrapper.select(OrderItem::getProductType, OrderItem::getQuantity, OrderItem::getTotalAmount,
+                OrderItem::getCostPrice, OrderItem::getOrderId);
         List<OrderItem> items = orderItemMapper.selectList(wrapper);
-        
+
         Map<String, List<OrderItem>> categoryMap = items.stream()
                 .filter(item -> item.getProductType() != null)
                 .collect(Collectors.groupingBy(OrderItem::getProductType));
-        
+
         BigDecimal totalSales = items.stream()
                 .map(i -> i.getTotalAmount() != null ? i.getTotalAmount() : BigDecimal.ZERO)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -202,8 +203,9 @@ public class StatisticsServiceImpl implements StatisticsService {
             wrapper.eq(OrderItem::getProductType, queryDTO.getCategory());
         }
         
+        wrapper.select(OrderItem::getProductType, OrderItem::getTotalAmount, OrderItem::getPayTime);
         List<OrderItem> items = orderItemMapper.selectList(wrapper);
-        
+
         Map<String, Map<String, BigDecimal>> categoryDateAmount = new HashMap<>();
         for (OrderItem item : items) {
             String date = item.getPayTime().toLocalDate().toString();
@@ -563,6 +565,7 @@ public class StatisticsServiceImpl implements StatisticsService {
                .ge(Order::getPayTime, startDate.atStartOfDay())
                .le(Order::getPayTime, endDate.atTime(LocalTime.MAX));
         
+        wrapper.select(Order::getTotalAmount, Order::getUserId, Order::getPayTime, Order::getShopId, Order::getDeviceId);
         List<Order> orders = orderMapper.selectList(wrapper);
         
         Map<String, BigDecimal> dateAmount = orders.stream()
@@ -771,6 +774,7 @@ public class StatisticsServiceImpl implements StatisticsService {
                .ge(Order::getPayTime, startDate.atStartOfDay())
                .le(Order::getPayTime, endDate.atTime(LocalTime.MAX));
         
+        wrapper.select(Order::getTotalAmount, Order::getUserId, Order::getPayTime, Order::getShopId, Order::getDeviceId);
         List<Order> orders = orderMapper.selectList(wrapper);
         
         Map<String, BigDecimal> dateAmount = orders.stream()