ソースを参照

修复URS推广排行榜SQL查询错误

- 修复子查询中表名前缀问题,使用DB::getTablePrefix()获取完整表名
- 修复MySQL sql_mode=only_full_group_by错误,在GROUP BY中添加urs_user_id字段
- 移除HAVING条件,允许显示所有数据包括0值
- 所有排行榜SQL查询现在都能正常执行
- URS达人等级统计卡片正常显示各等级人数
AI Assistant 7 ヶ月 前
コミット
19368d1d93

+ 136 - 0
AiWork/202506/221711-URS推广模块图表页面增加达人等级统计卡片.md

@@ -0,0 +1,136 @@
+# URS推广模块图表页面增加达人等级统计卡片
+
+**创建时间**: 2025年06月22日 17:11  
+**任务类型**: 功能开发  
+**关联模块**: URS推广模块  
+**完成状态**: ✅ 已完成
+
+## 📋 任务概述
+
+为URS推广模块的图表页面增加达人等级统计卡片,显示各个达人等级的人数统计。
+
+## 🔧 实现内容
+
+### 1. 新增统计卡片组件
+
+#### UrsTalentLevelStatsCard
+**文件**: `app/Module/UrsPromotion/AdminControllers/Metrics/UrsTalentLevelStatsCard.php`
+
+**功能特点**:
+- 继承自`Dcat\Admin\Widgets\Card`
+- 显示各个达人等级的人数统计
+- 使用不同颜色和图标区分各等级
+- 支持实时数据统计
+
+**统计内容**:
+- 非达人(等级0)- 灰色用户图标
+- URS初级达人(等级1)- 绿色星星图标
+- URS中级达人(等级2)- 青色半星图标
+- URS高级达人(等级3)- 黄色皇冠图标
+- URS资深达人(等级4)- 橙色宝石图标
+- URS顶级达人(等级5)- 红色奖杯图标
+
+### 2. 数据查询逻辑
+
+**数据来源**:
+- 主表:`kku_urs_promotion_user_talents`
+- 配置表:`kku_urs_promotion_talent_configs`
+- 枚举:`UrsTalentLevel`
+
+**查询方式**:
+```php
+// 统计各等级的用户数量
+$levelCounts = UrsUserTalent::select('talent_level', DB::raw('COUNT(*) as count'))
+    ->groupBy('talent_level')
+    ->get()
+    ->keyBy('talent_level');
+
+// 获取所有启用的达人等级配置
+$configs = UrsTalentConfig::where('status', UrsTalentConfig::STATUS_ENABLED)
+    ->orderBy('level')
+    ->get()
+    ->keyBy('level');
+```
+
+### 3. 页面布局更新
+
+**文件**: `app/Module/UrsPromotion/AdminControllers/UrsPromotionMetricsController.php`
+
+**布局调整**:
+- 第一行:新用户趋势图(6列)+ 活跃用户卡片(6列)
+- 第二行:达人等级统计卡片(12列)- **新增**
+- 第三行:四个推广排名卡片(各3列)
+
+### 4. 卡片样式设计
+
+**视觉特点**:
+- 使用Bootstrap网格布局(col-md-4 col-sm-6)
+- 每个等级一个独立的小卡片
+- 居中显示图标、等级名称和人数
+- 使用不同颜色区分等级重要性
+- 响应式设计,适配不同屏幕尺寸
+
+## ✅ 功能验证
+
+### 1. 页面显示测试
+- ✅ 达人等级统计卡片正常显示
+- ✅ 各等级人数统计正确
+- ✅ 卡片布局美观,响应式设计
+- ✅ 与其他图表组件协调一致
+
+### 2. 数据准确性测试
+- ✅ 统计数据与数据库一致
+- ✅ 当前显示:非达人2人,其他等级0人
+- ✅ 实时数据更新正常
+
+### 3. 样式和交互测试
+- ✅ 卡片样式美观,颜色搭配合理
+- ✅ 图标显示正常(FontAwesome图标)
+- ✅ 文字清晰易读
+
+## 📁 文件清单
+
+### 新增文件
+- `app/Module/UrsPromotion/AdminControllers/Metrics/UrsTalentLevelStatsCard.php` - 达人等级统计卡片
+
+### 修改文件
+- `app/Module/UrsPromotion/AdminControllers/UrsPromotionMetricsController.php` - 主控制器布局更新
+
+## 🎯 使用说明
+
+### 1. 访问路径
+- **后台菜单**: URS推广管理 → URS推广数据统计
+- **直接访问**: `/admin/urs-promotion/metrics`
+
+### 2. 功能说明
+- **实时统计**: 页面加载时自动统计最新数据
+- **等级分类**: 按照6个等级分别显示人数
+- **视觉区分**: 使用不同颜色和图标区分等级
+
+### 3. 数据说明
+- **统计范围**: 所有URS用户的达人等级
+- **更新频率**: 实时查询数据库
+- **数据来源**: `kku_urs_promotion_user_talents`表
+
+## 🚀 后续优化建议
+
+1. **性能优化**: 考虑添加缓存机制,减少数据库查询
+2. **交互增强**: 点击卡片可跳转到对应等级的用户列表
+3. **趋势分析**: 增加等级变化趋势图表
+4. **导出功能**: 支持统计数据导出
+
+## 📊 当前统计数据
+
+根据测试结果,当前系统中的达人等级分布:
+- 非达人:2人
+- URS初级达人:0人
+- URS中级达人:0人
+- URS高级达人:0人
+- URS资深达人:0人
+- URS顶级达人:0人
+
+## 🔗 相关文档
+
+- [URS推广模块图表控制器创建完成](./221626-URS推广模块图表控制器创建完成.md)
+- [URS推广排名卡片拆分完成](./221655-URS推广排名卡片拆分完成.md)
+- [达人等级逻辑文档](../UrsPromotion/Docs/达人等级逻辑.md)

+ 4 - 2
AiWork/now.md

@@ -1,7 +1,9 @@
 # 当前工作状态
 
-Urs推广模块,图表页面,增加图表
-1. 统计卡片,各个达人等级的人数
+✅ 已完成:Urs推广模块,图表页面,增加图表
+1. ✅ 统计卡片,各个达人等级的人数
+
+当前任务已完成,等待新任务分配。
 
 物品模块,增加图表
 - 几种果实的持有数量,排行,每种果实一个排行卡片

+ 10 - 11
app/Module/UrsPromotion/AdminControllers/Metrics/UrsIndirectRankingCard.php

@@ -46,22 +46,21 @@ class UrsIndirectRankingCard extends Ranking
     protected function getIndirectRankingData(): array
     {
         // 使用子查询统计间推数量
-        $rankings = DB::table('urs_promotion_user_referrals as r1')
-            ->select([
-                'r1.urs_referrer_id',
-                'r1.referrer_id',
-                'u.username',
+        $fullTableName = DB::getTablePrefix() . (new UrsUserReferral())->getTable();
+        $rankings = UrsUserReferral::select([
+                'urs_referrer_id',
+                'referrer_id',
+                'users.username',
                 DB::raw('(
                     SELECT COUNT(*)
-                    FROM urs_promotion_user_referrals r2
-                    WHERE r2.urs_referrer_id = r1.urs_user_id
+                    FROM ' . $fullTableName . ' r2
+                    WHERE r2.urs_referrer_id = ' . $fullTableName . '.urs_user_id
                     AND r2.status = 1
                 ) as indirect_count')
             ])
-            ->leftJoin('users as u', 'r1.referrer_id', '=', 'u.id')
-            ->where('r1.status', UrsUserReferral::STATUS_VALID)
-            ->groupBy('r1.urs_referrer_id', 'r1.referrer_id', 'u.username')
-            ->havingRaw('indirect_count > 0')
+            ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id')
+            ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID)
+            ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'urs_promotion_user_referrals.urs_user_id', 'users.username')
             ->orderBy('indirect_count', 'desc')
             ->limit(10)
             ->get();

+ 17 - 18
app/Module/UrsPromotion/AdminControllers/Metrics/UrsTeamRankingCard.php

@@ -46,38 +46,37 @@ class UrsTeamRankingCard extends Ranking
     protected function getTeamRankingData(): array
     {
         // 使用子查询统计团队总数
-        $rankings = DB::table('urs_promotion_user_referrals as r1')
-            ->select([
-                'r1.urs_referrer_id',
-                'r1.referrer_id',
-                'u.username',
+        $fullTableName = DB::getTablePrefix() . (new UrsUserReferral())->getTable();
+        $rankings = UrsUserReferral::select([
+                'urs_referrer_id',
+                'referrer_id',
+                'users.username',
                 DB::raw('(
                     -- 直推数量
                     SELECT COUNT(DISTINCT r_direct.urs_user_id)
-                    FROM urs_promotion_user_referrals r_direct
-                    WHERE r_direct.urs_referrer_id = r1.urs_referrer_id
+                    FROM ' . $fullTableName . ' r_direct
+                    WHERE r_direct.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
                     AND r_direct.status = 1
                 ) + (
                     -- 间推数量
                     SELECT COUNT(DISTINCT r_indirect.urs_user_id)
-                    FROM urs_promotion_user_referrals r_level1
-                    JOIN urs_promotion_user_referrals r_indirect ON r_level1.urs_user_id = r_indirect.urs_referrer_id
-                    WHERE r_level1.urs_referrer_id = r1.urs_referrer_id
+                    FROM ' . $fullTableName . ' r_level1
+                    JOIN ' . $fullTableName . ' r_indirect ON r_level1.urs_user_id = r_indirect.urs_referrer_id
+                    WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
                     AND r_level1.status = 1 AND r_indirect.status = 1
                 ) + (
                     -- 三推数量
                     SELECT COUNT(DISTINCT r_third.urs_user_id)
-                    FROM urs_promotion_user_referrals r_level1
-                    JOIN urs_promotion_user_referrals r_level2 ON r_level1.urs_user_id = r_level2.urs_referrer_id
-                    JOIN urs_promotion_user_referrals r_third ON r_level2.urs_user_id = r_third.urs_referrer_id
-                    WHERE r_level1.urs_referrer_id = r1.urs_referrer_id
+                    FROM ' . $fullTableName . ' r_level1
+                    JOIN ' . $fullTableName . ' r_level2 ON r_level1.urs_user_id = r_level2.urs_referrer_id
+                    JOIN ' . $fullTableName . ' r_third ON r_level2.urs_user_id = r_third.urs_referrer_id
+                    WHERE r_level1.urs_referrer_id = ' . $fullTableName . '.urs_referrer_id
                     AND r_level1.status = 1 AND r_level2.status = 1 AND r_third.status = 1
                 ) as team_count')
             ])
-            ->leftJoin('users as u', 'r1.referrer_id', '=', 'u.id')
-            ->where('r1.status', UrsUserReferral::STATUS_VALID)
-            ->groupBy('r1.urs_referrer_id', 'r1.referrer_id', 'u.username')
-            ->havingRaw('team_count > 0')
+            ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id')
+            ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID)
+            ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'urs_promotion_user_referrals.urs_user_id', 'users.username')
             ->orderBy('team_count', 'desc')
             ->limit(10)
             ->get();

+ 11 - 12
app/Module/UrsPromotion/AdminControllers/Metrics/UrsThirdRankingCard.php

@@ -46,23 +46,22 @@ class UrsThirdRankingCard extends Ranking
     protected function getThirdRankingData(): array
     {
         // 使用子查询统计三推数量
-        $rankings = DB::table('urs_promotion_user_referrals as r1')
-            ->select([
-                'r1.urs_referrer_id',
-                'r1.referrer_id',
-                'u.username',
+        $fullTableName = DB::getTablePrefix() . (new UrsUserReferral())->getTable();
+        $rankings = UrsUserReferral::select([
+                'urs_referrer_id',
+                'referrer_id',
+                'users.username',
                 DB::raw('(
                     SELECT COUNT(*)
-                    FROM urs_promotion_user_referrals r2
-                    JOIN urs_promotion_user_referrals r3 ON r2.urs_user_id = r3.urs_referrer_id
-                    WHERE r2.urs_referrer_id = r1.urs_user_id
+                    FROM ' . $fullTableName . ' r2
+                    JOIN ' . $fullTableName . ' r3 ON r2.urs_user_id = r3.urs_referrer_id
+                    WHERE r2.urs_referrer_id = ' . $fullTableName . '.urs_user_id
                     AND r2.status = 1 AND r3.status = 1
                 ) as third_count')
             ])
-            ->leftJoin('users as u', 'r1.referrer_id', '=', 'u.id')
-            ->where('r1.status', UrsUserReferral::STATUS_VALID)
-            ->groupBy('r1.urs_referrer_id', 'r1.referrer_id', 'u.username')
-            ->havingRaw('third_count > 0')
+            ->leftJoin('users', 'urs_promotion_user_referrals.referrer_id', '=', 'users.id')
+            ->where('urs_promotion_user_referrals.status', UrsUserReferral::STATUS_VALID)
+            ->groupBy('urs_promotion_user_referrals.urs_referrer_id', 'urs_promotion_user_referrals.referrer_id', 'urs_promotion_user_referrals.urs_user_id', 'users.username')
             ->orderBy('third_count', 'desc')
             ->limit(10)
             ->get();