From 3f45e8fdfa31d7b764d60a7c0cb5dd11944ed418 Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期一, 21 九月 2026 23:38:59 +0800
Subject: [PATCH] bug:统计数据修正

---
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java |   42 +++++++++++++++++++--
 cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java                                   |   25 ++++++++++--
 2 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
index 86c4c81..a91cad3 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java
@@ -316,10 +316,12 @@
         Integer statisticsScopeObjectId = statisticsScopeType == 3 ? storeId
                 : (statisticsScopeType == 2 ? operatorId : null);
 
-        List<Integer> cityManagerId= new ArrayList<>();
+        // 积分商品收入接口按门店 ID 过滤;空集合会被其 SQL 视为“不过滤”,
+        // 因此运营商统计必须传入该运营商名下的全部门店,不能传空集合。
+        List<Integer> cityManagerId = new ArrayList<>();
         if (Integer.valueOf(2).equals(statisticsScopeType) && statisticsScopeObjectId != null) {
             cityManagerId = storeService.list(new QueryWrapper<TStore>()
-                            .eq("cityManagerId", statisticsScopeObjectId).ne("state", 3))
+                            .eq("operatorId", statisticsScopeObjectId).ne("state", 3))
                     .stream().map(TStore::getId).collect(Collectors.toList());
         } else if (Integer.valueOf(3).equals(statisticsScopeType) && statisticsScopeObjectId != null) {
             cityManagerId.add(statisticsScopeObjectId);
@@ -1557,9 +1559,29 @@
         objects.add(1);
         objects.add(2);
         vipPaymentLambdaQueryWrapper.in(SiteBooking::getPayType,objects);
-        List<SiteBooking> list1 = siteBookingService.list(vipPaymentLambdaQueryWrapper);
+        List<SiteBooking> list1 = new ArrayList<>(siteBookingService.list(vipPaymentLambdaQueryWrapper));
         double sum = list1.stream().mapToDouble(SiteBooking::getPayMoney).sum();
-        map.put("fee5",sum);
+
+        // 智慧球场支付记录的场地可能只保存在 t_game.siteId。ballClient 已补齐该值,
+        // 将其转换为订场明细后可与普通订场一起按场地类型统计。
+        GameDataQuery gameDataQuery = new GameDataQuery();
+        gameDataQuery.setObjectId(id);
+        if (ToolUtil.isNotEmpty(time)) {
+            gameDataQuery.setStartTime(time.split(" - ")[0] + " 00:00:00");
+            gameDataQuery.setEndTime(time.split(" - ")[1] + " 23:59:59");
+        }
+        double gameIncome = 0D;
+        for (TGameRecord gameRecord : ballClient.getData(gameDataQuery)) {
+            if (gameRecord.getSiteId() == null || gameRecord.getMoney() == null || !ids.contains(gameRecord.getSiteId())) {
+                continue;
+            }
+            SiteBooking gameBooking = new SiteBooking();
+            gameBooking.setSiteId(gameRecord.getSiteId());
+            gameBooking.setPayMoney(gameRecord.getMoney().doubleValue());
+            list1.add(gameBooking);
+            gameIncome += gameRecord.getMoney().doubleValue();
+        }
+        map.put("fee5", sum + gameIncome);
 
 
         List<Integer> collect = list1.stream().map(SiteBooking::getSiteId).collect(Collectors.toList());
@@ -1820,8 +1842,20 @@
         }
         // 平台智慧球场
         List<TGameRecord> data1 = ballClient.getData(gameDataQuery);
+        // 将游戏支付转换为场地收入明细参与后续 siteId -> siteTypeId 分类。
+        // fee5 仍由普通订场金额与游戏金额分别相加,避免重复计入总额。
+        for (TGameRecord gameRecord : data1) {
+            if (gameRecord.getSiteId() == null || gameRecord.getMoney() == null) {
+                continue;
+            }
+            SiteBooking gameBooking = new SiteBooking();
+            gameBooking.setSiteId(gameRecord.getSiteId());
+            gameBooking.setPayMoney(gameRecord.getMoney().doubleValue());
+            list1.add(gameBooking);
+        }
         double sum1 = data1.stream()
                 .map(TGameRecord::getMoney) // 获取每个 TGameRecord 对象的 money 字段
+                .filter(Objects::nonNull)
                 .mapToDouble(BigDecimal::doubleValue) // 将 BigDecimal 转换为 double
                 .sum();
         map.put("fee5",sum+sum1);
diff --git a/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java b/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
index cc43702..2d9357a 100644
--- a/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
+++ b/cloud-server-other/src/main/java/com/dsh/other/controller/BallController.java
@@ -45,8 +45,8 @@
     public List<TGameRecord> getData(@RequestBody GameDataQuery query){
         if (query.getStoreId()==null){
             // 获取到游戏ids
-            List<Integer> gameIds = gameService.list(new QueryWrapper<Game>().eq("operationId", query.getObjectId()))
-                    .stream().map(Game::getId).collect(Collectors.toList());
+            List<Game> games = gameService.list(new QueryWrapper<Game>().eq("operationId", query.getObjectId()));
+            List<Integer> gameIds = games.stream().map(Game::getId).collect(Collectors.toList());
             // 运营商下没有智慧球场时,不能省略 gameId 条件后查询全部支付记录。
             if (gameIds.isEmpty()) {
                 return new ArrayList<>();
@@ -60,10 +60,11 @@
             }
             wrapper.in("gameId", gameIds);
             List<TGameRecord> list = gameRecordService.list(wrapper);
+            fillMissingSiteId(list, games);
             return list;
         }else{
-            List<Integer> gameIds = gameService.list(new QueryWrapper<Game>().eq("storeId", query.getStoreId()))
-                    .stream().map(Game::getId).collect(Collectors.toList());
+            List<Game> games = gameService.list(new QueryWrapper<Game>().eq("storeId", query.getStoreId()));
+            List<Integer> gameIds = games.stream().map(Game::getId).collect(Collectors.toList());
             // 门店下没有智慧球场时,不能省略 gameId 条件后查询全部支付记录。
             if (gameIds.isEmpty()) {
                 return new ArrayList<>();
@@ -76,10 +77,26 @@
             }
             wrapper.in("gameId", gameIds);
             List<TGameRecord> list = gameRecordService.list(wrapper);
+            fillMissingSiteId(list, games);
             return list;
         }
     }
 
+    /**
+     * 旧游戏支付记录可能没有写入 t_game_record.siteId,场地归属以 t_game.siteId 为准补齐,
+     * 让调用方能够按场地类型做收入统计。
+     */
+    private void fillMissingSiteId(List<TGameRecord> records, List<Game> games) {
+        Map<Integer, Integer> gameSiteIds = games.stream()
+                .filter(game -> game.getId() != null && game.getSiteId() != null)
+                .collect(Collectors.toMap(Game::getId, Game::getSiteId, (first, ignored) -> first));
+        for (TGameRecord record : records) {
+            if (record.getSiteId() == null) {
+                record.setSiteId(gameSiteIds.get(record.getGameId()));
+            }
+        }
+    }
+
 
     @ResponseBody
     @PostMapping("/student/webStudentList")

--
Gitblit v1.7.1