Преглед на файлове

fix: 修复统计表缺失BaseEntity字段及无归属站点生成脏数据的问题

- v12: t_daily_stat / t_month_stat 补充 company_id, create_time, update_time 列
- 日/月统计同步时过滤 null 和"未分配"等无效站点ID

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline преди 2 дни
родител
ревизия
70dd8a0a8d

+ 74 - 0
car-wash-entity/src/main/resources/sql/v12_fix_stat_base_columns.sql

@@ -0,0 +1,74 @@
+-- ====================================================
+-- 数据统计表补充 BaseEntity 基础字段(company_id, create_time, update_time)
+-- 发布日期:2026-06-11
+-- ====================================================
+
+DROP PROCEDURE IF EXISTS add_stat_base_columns;
+DELIMITER //
+CREATE PROCEDURE add_stat_base_columns()
+BEGIN
+    -- t_daily_stat 补字段
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_daily_stat'
+          AND COLUMN_NAME = 'company_id'
+    ) THEN
+        ALTER TABLE `t_daily_stat`
+            ADD COLUMN `company_id` BIGINT DEFAULT NULL COMMENT '公司(租户)ID' AFTER `orders_count`;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_daily_stat'
+          AND COLUMN_NAME = 'create_time'
+    ) THEN
+        ALTER TABLE `t_daily_stat`
+            ADD COLUMN `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' AFTER `company_id`;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_daily_stat'
+          AND COLUMN_NAME = 'update_time'
+    ) THEN
+        ALTER TABLE `t_daily_stat`
+            ADD COLUMN `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' AFTER `create_time`;
+    END IF;
+
+    -- t_month_stat 补字段
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_month_stat'
+          AND COLUMN_NAME = 'company_id'
+    ) THEN
+        ALTER TABLE `t_month_stat`
+            ADD COLUMN `company_id` BIGINT DEFAULT NULL COMMENT '公司(租户)ID' AFTER `orders_count`;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_month_stat'
+          AND COLUMN_NAME = 'create_time'
+    ) THEN
+        ALTER TABLE `t_month_stat`
+            ADD COLUMN `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' AFTER `company_id`;
+    END IF;
+
+    IF NOT EXISTS (
+        SELECT 1 FROM information_schema.COLUMNS
+        WHERE TABLE_SCHEMA = DATABASE()
+          AND TABLE_NAME = 't_month_stat'
+          AND COLUMN_NAME = 'update_time'
+    ) THEN
+        ALTER TABLE `t_month_stat`
+            ADD COLUMN `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' AFTER `create_time`;
+    END IF;
+END //
+DELIMITER ;
+CALL add_stat_base_columns();
+DROP PROCEDURE IF EXISTS add_stat_base_columns;

+ 2 - 1
car-wash-service/src/main/java/com/kym/service/impl/DailyStatServiceImpl.java

@@ -97,10 +97,11 @@ public class DailyStatServiceImpl extends MyBaseServiceImpl<DailyStatMapper, Dai
         var refundCountMap = splitRecordService.countDailyRefund(statDay);
         var activeUserMap = washOrderService.countDailyActiveUsers(statDay);
 
-        // 收集所有出现过的站点
+        // 收集所有出现过的站点(过滤掉无归属的null和"未分配"占位符)
         var allStationIds = Stream.of(amountMap, registerMap, ordersCountMap, incomeMap,
                         crossIncomeMap, expendMap, refundMap, rechargeCountMap, refundCountMap, activeUserMap)
                 .flatMap(m -> m.keySet().stream())
+                .filter(s -> s != null && !"未分配".equals(s))
                 .collect(Collectors.toSet());
 
         long operatorId = 0;

+ 1 - 0
car-wash-service/src/main/java/com/kym/service/impl/MonthStatServiceImpl.java

@@ -112,6 +112,7 @@ public class MonthStatServiceImpl extends MyBaseServiceImpl<MonthStatMapper, Mon
                         crossIncomeMap, expendMap, refundMap, rechargeCountMap, refundCountMap,
                         activeUserMap, platformFeeMap)
                 .flatMap(m -> m.keySet().stream())
+                .filter(s -> s != null && !"未分配".equals(s))
                 .collect(Collectors.toSet());
 
         long operatorId = 0;