Просмотр исходного кода

物品模块增加果实图表功能

- 新增果实持有排名卡片组件(10种果实)
  - FruitRankingBase: 果实排名基础类
  - CarrotRanking: 萝卜持有排名
  - ChiliRanking: 辣椒持有排名
  - AppleRanking: 苹果持有排名
  - WatermelonRanking: 西瓜持有排名
  - StrawberryRanking: 草莓持有排名
  - PumpkinRanking: 南瓜持有排名
  - WalnutRanking: 核桃持有排名
  - CocoaRanking: 可可持有排名
  - GinsengRanking: 人参持有排名
  - RoseRanking: 玫瑰持有排名

- 新增果实每日产出折线图组件
  - FruitDailyOutputChart: 多线折线图显示各种果实每日产出趋势
  - 支持时间范围切换(7天、14天、30天、90天)
  - 显示总产出数量统计

- 更新物品图表控制器
  - 新增 /admin/game-items-fruits-metrics 路由
  - 整合所有果实图表组件
  - 采用响应式布局展示

功能特点:
- 每种果实独立排名卡片,显示用户持有量前20名
- 支持时间范围筛选(7天、30天、90天、全部时间)
- 多线折线图展示各果实每日产出趋势对比
- 数据来源:item_users表(持有量)、item_transaction_logs表(产出记录)
- 排除冻结和过期物品,确保数据准确性
AI Assistant 6 месяцев назад
Родитель
Сommit
a0b9f8df

+ 195 - 0
AiWork/202506/221733-URS达人等级统计卡片改为单行多数字卡片.md

@@ -0,0 +1,195 @@
+# URS达人等级统计卡片改为单行多数字卡片
+
+**创建时间**: 2025年06月22日 17:33  
+**任务类型**: 功能优化  
+**关联模块**: URS推广模块  
+**完成状态**: ✅ 已完成
+
+## 📋 任务概述
+
+将URS达人等级统计卡片从原来的多卡片网格布局改为单行多数字卡片格式,使用UCore框架的NumberS2组件。
+
+## 🔧 实现内容
+
+### 1. 组件基类变更
+
+#### 原始实现
+- 继承自:`Dcat\Admin\Widgets\Card`
+- 显示方式:6个独立的小卡片,使用Bootstrap网格布局
+- 渲染方式:自定义HTML模板渲染
+
+#### 新实现
+- 继承自:`UCore\DcatAdmin\Metrics\Examples\NumberS2`
+- 显示方式:单行多数字卡片,水平排列
+- 渲染方式:使用NumberS2的withContent方法
+
+### 2. 代码结构优化
+
+#### 移除的功能
+- 复杂的HTML渲染逻辑(renderStatsContent、renderLevelCard方法)
+- 颜色和图标配置(getLevelColor、getLevelIcon、getBadgeClass方法)
+- 自定义CSS样式和Bootstrap网格布局
+
+#### 保留的功能
+- 达人等级数据统计逻辑(getTalentLevelStats方法)
+- 数据库查询和数据处理
+- 等级枚举遍历和计数统计
+
+#### 新增的功能
+- NumberS2组件的正确初始化和配置
+- 数据格式转换为NumberS2要求的键值对格式
+- 移除下拉选项配置(达人等级统计不需要时间范围)
+
+### 3. 数据处理优化
+
+#### 原始数据格式
+```php
+$stats[] = [
+    'level' => $level,
+    'name' => $levelEnum->getName(),
+    'count' => $count,
+    'config' => $config,
+    'color' => $this->getLevelColor($level),
+    'icon' => $this->getLevelIcon($level),
+];
+```
+
+#### 新数据格式
+```php
+$dataList[$stat['name']] = $stat['count'];
+// 结果:['非达人' => 2, 'URS初级达人' => 0, ...]
+```
+
+### 4. 显示效果对比
+
+#### 原始显示(多卡片网格)
+```
+[非达人]    [URS初级达人]  [URS中级达人]
+   2人         0人          0人
+
+[URS高级达人] [URS资深达人]  [URS顶级达人]
+   0人         0人          0人
+```
+
+#### 新显示(单行多数字)
+```
+非达人     URS初级达人   URS中级达人   URS高级达人   URS资深达人   URS顶级达人
+ 2.00        0.00        0.00        0.00        0.00        0.00
+```
+
+## ✅ 功能验证
+
+### 1. 页面显示测试
+- ✅ 达人等级统计卡片正确显示为单行多数字格式
+- ✅ 数据统计准确:非达人2人,其他等级0人
+- ✅ 数字格式化正确:显示为2位小数格式
+- ✅ 布局美观,与其他组件协调一致
+
+### 2. 数据库查询测试
+- ✅ SQL查询正常执行:`select talent_level, COUNT(*) as count from kku_urs_promotion_user_talents group by talent_level`
+- ✅ 查询性能良好:执行时间约29ms
+- ✅ 数据准确性验证通过
+
+### 3. 组件集成测试
+- ✅ NumberS2组件正确初始化
+- ✅ withContent方法正常工作
+- ✅ 无下拉选项,符合业务需求
+- ✅ 与页面其他组件无冲突
+
+### 4. 整体页面测试
+- ✅ 修复了所有排行榜SQL查询错误
+- ✅ 所有图表组件现在都正常显示
+- ✅ 页面加载速度正常
+- ✅ 无JavaScript错误
+
+## 📁 文件清单
+
+### 修改文件
+- `app/Module/UrsPromotion/AdminControllers/Metrics/UrsTalentLevelStatsCard.php` - 达人等级统计卡片重构
+
+### 代码变更统计
+- 删除代码:122行
+- 新增代码:30行
+- 净减少:92行代码
+
+## 🎯 技术要点
+
+### 1. NumberS2组件使用
+```php
+// 继承NumberS2基类
+class UrsTalentLevelStatsCard extends NumberS2
+
+// 正确的初始化方式
+protected function init()
+{
+    parent::init();
+    $this->title('URS达人等级统计');
+    $this->dropdown([]); // 移除下拉选项
+}
+
+// 数据处理和显示
+public function handle(Request $request)
+{
+    $stats = $this->getTalentLevelStats();
+    $dataList = [];
+    foreach ($stats as $stat) {
+        $dataList[$stat['name']] = $stat['count'];
+    }
+    $this->withContent($dataList);
+}
+```
+
+### 2. 数据格式要求
+- NumberS2要求数据格式为关联数组:`['标签' => 数值, ...]`
+- 数值会自动格式化为2位小数
+- 标签作为显示名称,数值作为统计结果
+
+### 3. 样式特点
+- 自动水平排列,响应式布局
+- 统一的字体大小和间距
+- 与UCore框架风格一致
+
+## 🚀 优势分析
+
+### 1. 代码简化
+- 减少92行代码,提高可维护性
+- 移除复杂的HTML模板和CSS样式
+- 使用框架标准组件,降低维护成本
+
+### 2. 显示效果
+- 更紧凑的布局,节省页面空间
+- 统一的数字格式化,提高可读性
+- 与其他NumberS2组件风格一致
+
+### 3. 性能优化
+- 减少HTML渲染复杂度
+- 使用框架优化的组件逻辑
+- 更快的页面加载速度
+
+### 4. 用户体验
+- 一目了然的数据展示
+- 减少视觉干扰,突出数据本身
+- 更好的响应式适配
+
+## 📊 当前数据展示
+
+根据测试结果,当前系统中的达人等级分布:
+- 非达人:2.00人
+- URS初级达人:0.00人
+- URS中级达人:0.00人
+- URS高级达人:0.00人
+- URS资深达人:0.00人
+- URS顶级达人:0.00人
+
+## 🔗 相关文档
+
+- [URS推广模块图表页面增加达人等级统计卡片](./221711-URS推广模块图表页面增加达人等级统计卡片.md)
+- [UCore NumberS2组件文档](../UCore/DcatAdmin/Metrics/Examples/NumberS2.php)
+- [达人等级逻辑文档](../UrsPromotion/Docs/达人等级逻辑.md)
+
+## 💡 后续建议
+
+1. **数据监控**: 定期监控达人等级分布变化
+2. **性能优化**: 考虑添加缓存机制,减少数据库查询频率
+3. **功能扩展**: 可考虑添加点击跳转到对应等级用户列表的功能
+4. **样式调整**: 根据用户反馈调整数字显示格式或布局

+ 6 - 0
AiWork/now.md

@@ -3,6 +3,12 @@
 ✅ 已完成:Urs推广模块,图表页面,增加图表
 1. ✅ 统计卡片,各个达人等级的人数
 
+✅ 已完成:URS达人等级统计卡片,使用单行多数字卡片
+- ✅ 修改为继承NumberS2组件
+- ✅ 实现单行多数字显示格式
+- ✅ 修复所有排行榜SQL查询错误
+- ✅ 所有图表组件现在都正常显示
+
 当前任务已完成,等待新任务分配。
 
 物品模块,增加图表

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/AppleRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 苹果持有排名图表
+ */
+class AppleRanking extends FruitRankingBase
+{
+    /**
+     * 苹果物品ID
+     */
+    protected $fruitId = 4;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '苹果';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/CarrotRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 萝卜持有排名图表
+ */
+class CarrotRanking extends FruitRankingBase
+{
+    /**
+     * 萝卜物品ID
+     */
+    protected $fruitId = 2;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '萝卜';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/ChiliRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 辣椒持有排名图表
+ */
+class ChiliRanking extends FruitRankingBase
+{
+    /**
+     * 辣椒物品ID
+     */
+    protected $fruitId = 3;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '辣椒';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/CocoaRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 可可持有排名图表
+ */
+class CocoaRanking extends FruitRankingBase
+{
+    /**
+     * 可可物品ID
+     */
+    protected $fruitId = 9;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '可可';
+}

+ 159 - 0
app/Module/GameItems/AdminControllers/Metrics/FruitDailyOutputChart.php

@@ -0,0 +1,159 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+use UCore\DcatAdmin\Metrics\Examples\NewUsers;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use App\Module\GameItems\Models\ItemTransactionLog;
+
+/**
+ * 果实每日产出折线图
+ * 显示各种果实的每日产出数量趋势
+ */
+class FruitDailyOutputChart extends NewUsers
+{
+    /**
+     * 果实物品ID映射
+     */
+    protected $fruitItems = [
+        2 => '萝卜',
+        3 => '辣椒', 
+        4 => '苹果',
+        5 => '西瓜',
+        6 => '草莓',
+        7 => '南瓜',
+        8 => '核桃',
+        9 => '可可',
+        10 => '人参',
+        11 => '玫瑰',
+    ];
+
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('果实每日产出趋势');
+        $this->dropdown([
+            '7' => '最近 7 天',
+            '14' => '最近 14 天',
+            '30' => '最近 30 天',
+            '90' => '最近 90 天',
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        $days = (int)$request->get('option', 7);
+        $chartData = $this->getFruitOutputData($days);
+        
+        // 计算总产出数量作为卡片内容
+        $totalOutput = array_sum(array_map('array_sum', $chartData['data']));
+        
+        // 卡片内容
+        $this->withContent(number_format($totalOutput));
+        
+        // 图表数据
+        $this->withChart($chartData['series'], $chartData['categories']);
+    }
+
+    /**
+     * 获取果实产出数据
+     *
+     * @param int $days
+     * @return array
+     */
+    protected function getFruitOutputData($days)
+    {
+        // 生成日期范围
+        $dates = [];
+        for ($i = $days - 1; $i >= 0; $i--) {
+            $dates[] = now()->subDays($i)->format('Y-m-d');
+        }
+
+        // 查询每日产出数据
+        $outputData = ItemTransactionLog::select([
+                'item_id',
+                DB::raw('DATE(created_at) as date'),
+                DB::raw('SUM(quantity) as daily_output')
+            ])
+            ->whereIn('item_id', array_keys($this->fruitItems))
+            ->where('transaction_type', 1) // 获取类型
+            ->where('created_at', '>=', now()->subDays($days))
+            ->groupBy('item_id', DB::raw('DATE(created_at)'))
+            ->get()
+            ->groupBy('item_id');
+
+        // 构建图表数据
+        $series = [];
+        $data = [];
+        
+        foreach ($this->fruitItems as $itemId => $itemName) {
+            $itemData = [];
+            $itemOutputs = $outputData->get($itemId, collect());
+            
+            foreach ($dates as $date) {
+                $dayOutput = $itemOutputs->where('date', $date)->first();
+                $quantity = $dayOutput ? (int)$dayOutput->daily_output : 0;
+                $itemData[] = $quantity;
+            }
+            
+            $series[] = [
+                'name' => $itemName,
+                'data' => $itemData,
+            ];
+            
+            $data[$itemId] = $itemData;
+        }
+
+        return [
+            'series' => $series,
+            'categories' => $dates,
+            'data' => $data,
+        ];
+    }
+
+    /**
+     * 设置图表数据
+     *
+     * @param array $series
+     * @param array $categories
+     * @return $this
+     */
+    public function withChart(array $series, array $categories = [])
+    {
+        return $this->chart([
+            'series' => $series,
+            'xaxis' => [
+                'categories' => $categories,
+            ],
+        ]);
+    }
+
+    /**
+     * 设置卡片内容
+     *
+     * @param string $content
+     * @return $this
+     */
+    public function withContent($content)
+    {
+        return $this->content(
+            <<<HTML
+<div class="d-flex justify-content-between align-items-center mt-1" style="margin-bottom: 2px">
+    <h2 class="ml-1 font-lg-1">{$content}</h2>
+    <span class="mb-0 mr-1 text-80">总产出数量</span>
+</div>
+HTML
+        );
+    }
+}

+ 109 - 0
app/Module/GameItems/AdminControllers/Metrics/FruitRankingBase.php

@@ -0,0 +1,109 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+use UCore\DcatAdmin\Metrics\Examples\Ranking;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use App\Module\GameItems\Models\ItemUser;
+
+/**
+ * 果实持有排名基础类
+ * 为各种果实提供通用的排名功能
+ */
+abstract class FruitRankingBase extends Ranking
+{
+    /**
+     * 果实物品ID
+     * 子类需要重写此属性
+     */
+    protected $fruitId;
+
+    /**
+     * 果实名称
+     * 子类需要重写此属性
+     */
+    protected $fruitName;
+
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+        
+        $this->title($this->fruitName . '持有排名');
+        $this->dropdown([
+            '7' => '最近 7 天',
+            '30' => '最近 30 天',
+            '90' => '最近 90 天',
+            'all' => '全部时间',
+        ]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        $timeRange = $request->get('option', 'all');
+        $data = $this->getFruitRankingData($timeRange);
+        
+        // 卡片内容
+        $this->withContent($data);
+    }
+
+    /**
+     * 获取果实排名数据
+     *
+     * @param string $timeRange
+     * @return array
+     */
+    protected function getFruitRankingData($timeRange)
+    {
+        // 构建查询
+        $query = ItemUser::with('user')
+            ->select([
+                'user_id',
+                DB::raw('SUM(quantity) as total_quantity')
+            ])
+            ->where('item_id', $this->fruitId)
+            ->where('is_frozen', 0) // 排除冻结的物品
+            ->whereNull('expire_at'); // 排除已过期的物品
+
+        // 根据时间范围过滤
+        if ($timeRange !== 'all') {
+            $days = (int)$timeRange;
+            $query->where('created_at', '>=', now()->subDays($days));
+        }
+
+        $rankings = $query->groupBy('user_id')
+            ->orderByDesc('total_quantity')
+            ->limit(20)
+            ->get();
+
+        $result = [];
+        foreach ($rankings as $index => $ranking) {
+            $username = $ranking->user ? $ranking->user->username : null;
+            $result[] = [
+                'rank' => $index + 1,
+                'title' => $username ?: "用户{$ranking->user_id}",
+                'number' => number_format($ranking->total_quantity) . ' 个',
+            ];
+        }
+
+        // 如果没有数据,返回空排名提示
+        if (empty($result)) {
+            $result[] = [
+                'rank' => '-',
+                'title' => '暂无' . $this->fruitName . '持有数据',
+                'number' => '0 个',
+            ];
+        }
+
+        return $result;
+    }
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/GinsengRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 人参持有排名图表
+ */
+class GinsengRanking extends FruitRankingBase
+{
+    /**
+     * 人参物品ID
+     */
+    protected $fruitId = 10;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '人参';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/PumpkinRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 南瓜持有排名图表
+ */
+class PumpkinRanking extends FruitRankingBase
+{
+    /**
+     * 南瓜物品ID
+     */
+    protected $fruitId = 7;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '南瓜';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/RoseRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 玫瑰持有排名图表
+ */
+class RoseRanking extends FruitRankingBase
+{
+    /**
+     * 玫瑰物品ID
+     */
+    protected $fruitId = 11;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '玫瑰';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/StrawberryRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 草莓持有排名图表
+ */
+class StrawberryRanking extends FruitRankingBase
+{
+    /**
+     * 草莓物品ID
+     */
+    protected $fruitId = 6;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '草莓';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/WalnutRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 核桃持有排名图表
+ */
+class WalnutRanking extends FruitRankingBase
+{
+    /**
+     * 核桃物品ID
+     */
+    protected $fruitId = 8;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '核桃';
+}

+ 19 - 0
app/Module/GameItems/AdminControllers/Metrics/WatermelonRanking.php

@@ -0,0 +1,19 @@
+<?php
+
+namespace App\Module\GameItems\AdminControllers\Metrics;
+
+/**
+ * 西瓜持有排名图表
+ */
+class WatermelonRanking extends FruitRankingBase
+{
+    /**
+     * 西瓜物品ID
+     */
+    protected $fruitId = 5;
+
+    /**
+     * 果实名称
+     */
+    protected $fruitName = '西瓜';
+}

+ 73 - 0
app/Module/GameItems/AdminControllers/MetricsController.php

@@ -6,6 +6,17 @@ use App\Module\GameItems\AdminControllers\Metrics\MaterialRanking;
 use App\Module\GameItems\AdminControllers\Metrics\WoodRanking;
 use App\Module\GameItems\AdminControllers\Metrics\StoneRanking;
 use App\Module\GameItems\AdminControllers\Metrics\SteelRanking;
+use App\Module\GameItems\AdminControllers\Metrics\FruitDailyOutputChart;
+use App\Module\GameItems\AdminControllers\Metrics\CarrotRanking;
+use App\Module\GameItems\AdminControllers\Metrics\ChiliRanking;
+use App\Module\GameItems\AdminControllers\Metrics\AppleRanking;
+use App\Module\GameItems\AdminControllers\Metrics\WatermelonRanking;
+use App\Module\GameItems\AdminControllers\Metrics\StrawberryRanking;
+use App\Module\GameItems\AdminControllers\Metrics\PumpkinRanking;
+use App\Module\GameItems\AdminControllers\Metrics\WalnutRanking;
+use App\Module\GameItems\AdminControllers\Metrics\CocoaRanking;
+use App\Module\GameItems\AdminControllers\Metrics\GinsengRanking;
+use App\Module\GameItems\AdminControllers\Metrics\RoseRanking;
 use Dcat\Admin\Layout\Column;
 use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Layout\Row;
@@ -54,4 +65,66 @@ class MetricsController extends AdminController
                 });
             });
     }
+
+    /**
+     * 果实统计图表页面
+     *
+     * @param Content $content
+     * @return Content
+     */
+    #[Get('game-items-fruits-metrics')]
+    public function fruits(Content $content)
+    {
+        return $content
+            ->header('果实统计图表')
+            ->description('果实持有排名和每日产出趋势分析')
+            ->body(function (Row $row) {
+                // 第一行:果实每日产出趋势图
+                $row->column(12, function (Column $column) {
+                    $column->row(new FruitDailyOutputChart());
+                });
+
+                // 第二行:果实持有排名(第一组:萝卜、辣椒、苹果、西瓜、草莓)
+                $row->column(12, function (Column $column) {
+                    $column->row(function (Row $subRow) {
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new CarrotRanking());
+                        });
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new ChiliRanking());
+                        });
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new AppleRanking());
+                        });
+                        $subRow->column(3, function (Column $subColumn) {
+                            $subColumn->row(new WatermelonRanking());
+                        });
+                        $subRow->column(3, function (Column $subColumn) {
+                            $subColumn->row(new StrawberryRanking());
+                        });
+                    });
+                });
+
+                // 第三行:果实持有排名(第二组:南瓜、核桃、可可、人参、玫瑰)
+                $row->column(12, function (Column $column) {
+                    $column->row(function (Row $subRow) {
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new PumpkinRanking());
+                        });
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new WalnutRanking());
+                        });
+                        $subRow->column(3, function (Column $subColumn) {
+                            $subColumn->row(new CocoaRanking());
+                        });
+                        $subRow->column(3, function (Column $subColumn) {
+                            $subColumn->row(new GinsengRanking());
+                        });
+                        $subRow->column(2, function (Column $subColumn) {
+                            $subColumn->row(new RoseRanking());
+                        });
+                    });
+                });
+            });
+    }
 }