Преглед изворни кода

fix: dashboard 统计 NPE — 对 nullable 字段 stream 求和前加 null 过滤

WashOrder 的 amount、amountReceived 为 Integer,totalSeconds 为 Long,
都是包装类型。mapToInt/mapToLong 在遇到 null 值时自动拆箱会抛出 NPE。
在 stream 中加 filter 过滤 null 值后再求和。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline пре 6 дана
родитељ
комит
f3d1619315

+ 7 - 7
car-wash-service/src/main/java/com/kym/service/impl/StatServiceImpl.java

@@ -122,7 +122,7 @@ public class StatServiceImpl implements StatService {
                 .list();
 
         // 今日收入:V2结算方案从订单中计算
-        var todayIncome = todayOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
+        var todayIncome = todayOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
 
         // 站点今日注册人数
         var todayRegistrations = userService.countDailyRegister(LocalDate.now(), stationId);
@@ -131,7 +131,7 @@ public class StatServiceImpl implements StatService {
        var avgOrderPrice = todayOrders.isEmpty() ? 0 : (int)todayIncome/todayOrders.size();
        
         // 平均洗车时长(秒)
-       var avgOrderDuration = todayOrders.isEmpty() ? 0 : (int) (todayOrders.stream().mapToLong(WashOrder::getTotalSeconds).sum() / todayOrders.size());
+       var avgOrderDuration = todayOrders.isEmpty() ? 0 : (int) (todayOrders.stream().filter(o -> o.getTotalSeconds() != null).mapToLong(WashOrder::getTotalSeconds).sum() / todayOrders.size());
 
         // 月度数据
         var monthOrders = washOrderService.lambdaQuery()
@@ -139,8 +139,8 @@ public class StatServiceImpl implements StatService {
                 .ge(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atTime(LocalTime.MIN))
                 .le(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(LocalTime.MAX))
                 .list();
-        var monthConsumptionAmount = monthOrders.stream().mapToInt(WashOrder::getAmount).sum();
-        var monthIncome = monthOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
+        var monthConsumptionAmount = monthOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
+        var monthIncome = monthOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
         var monthRegistrations = userService.countMonthRegister(LocalDate.now());
         var monthOrdersMap = washOrderService.countMonthOrders(LocalDate.now());
 
@@ -148,13 +148,13 @@ public class StatServiceImpl implements StatService {
         var allOrders = washOrderService.lambdaQuery()
                 .eq(WashOrder::getStationId, stationId)
                 .list();
-        var totalIncome = allOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
-        var totalConsumptionAmount = allOrders.stream().mapToInt(WashOrder::getAmount).sum();
+        var totalIncome = allOrders.stream().filter(o -> o.getAmountReceived() != null).mapToInt(WashOrder::getAmountReceived).sum();
+        var totalConsumptionAmount = allOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum();
         var totalMembers = (int) userService.count();
 
         DashboardVo dashboardVo = new DashboardVo();
         dashboardVo.setTodayIncome(todayIncome);
-        dashboardVo.setTodayConsumptionAmount(todayOrders.stream().mapToInt(WashOrder::getAmount).sum());
+        dashboardVo.setTodayConsumptionAmount(todayOrders.stream().filter(o -> o.getAmount() != null).mapToInt(WashOrder::getAmount).sum());
         dashboardVo.setTodayWashOrders(todayOrders.size());
         dashboardVo.setTodayRegisteredMembers(CommUtil.isEmptyOrNull(todayRegistrations) ? 0 : todayRegistrations.getOrDefault(stationId, 0));