From 620a310bdcfb1d8f1b49bf163413afeb522e1b2f Mon Sep 17 00:00:00 2001
From: 刘帅 <rr.iii@qq.com>
Date: 星期一, 21 九月 2026 21:47:53 +0800
Subject: [PATCH] bug:收入类型统计数据问题解决

---
 cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/DataStatisticsController.java |   23 +++++++++++++++--------
 1 files changed, 15 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 208b8d3..2fd0be0 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
@@ -104,9 +104,7 @@
         return storeId;
     }
 
-    /**
-     * 运营商统计的门店范围:平台(0)统计平台门店,其他值统计对应运营商门店。
-     */
+    /** 平台(0)或运营商统计均以门店的 operatorId 作为唯一归属依据。 */
     private List<TStore> listStatisticsStores(Integer operatorId, boolean enabledOnly) {
         LambdaQueryWrapper<TStore> wrapper = new LambdaQueryWrapper<>();
         if (enabledOnly) {
@@ -116,10 +114,8 @@
         }
         if (operatorId == null) {
             // 平台统计:所有门店总和,不按门店所属运营商过滤。
-        } else if (Integer.valueOf(0).equals(operatorId)) {
-            wrapper.eq(TStore::getType, 1);
         } else {
-            wrapper.eq(TStore::getType, 2).eq(TStore::getOperatorId, operatorId);
+            wrapper.eq(TStore::getOperatorId, operatorId);
         }
         return storeService.list(wrapper);
     }
@@ -299,7 +295,9 @@
         // 下游多处查询会在门店集合为空时忽略门店过滤。运营商没有任何门店时,
         // 直接返回完整的零值结构,避免被误统计为全平台数据。
         if (operatorId != null && storeId == null
-                && listStatisticsStores(operatorId, false).isEmpty()) {
+                && storeService.count(new LambdaQueryWrapper<TStore>()
+                        .eq(TStore::getOperatorId, operatorId)
+                        .ne(TStore::getState, 3)) == 0) {
             Map<String, Object> emptyIncomeData = buildIncomeStatistics(Collections.emptyList());
             emptyIncomeData.put("incomeTypeNet", buildIncomeTypeNet(Collections.emptyList(), null));
             Map<String, Object> emptyTicketIncome = new HashMap<>();
@@ -589,6 +587,13 @@
         // 门票饼图需要日/月/季/年卡拆分;此前该数据只在 type1 内部返回,
         // 现随统一营收接口返回,供平台页直接使用。
         monthlyData.put("ticketIncome", getTicketIncome(time, operatorId, storeId));
+        // 平台收入类型饼图还需要课程、订场分类明细。此前页面只能读取 type1
+        // 的模板数据,筛选后 getIncomeData 缺少该字段,导致课程图显示为空。
+        if (operatorId == null && storeId == null) {
+            Map<String, Object> platformTypeData = (Map<String, Object>) type1(time);
+            monthlyData.put("courseData", platformTypeData.get("courseData"));
+            monthlyData.put("siteData", platformTypeData.get("siteData"));
+        }
         return monthlyData;
     }
 
@@ -1293,7 +1298,9 @@
     @RequestMapping(value = "/userAndVipPt")
     @ResponseBody
     public Object userAndVipPt(Integer type) {
-        HashMap<String, Object> map = appUserClient.userAndVipYys(listStatisticsAppUserIds(null));
+        // 平台用户统计按用户归属全量统计,不能以“已有消费记录”筛选,
+        // 否则会遗漏尚未在门店消费的新注册用户。
+        HashMap<String, Object> map = appUserClient.userAndVipPt(1);
         return map;
     }
 

--
Gitblit v1.7.1