Explorar o código

农场统计图表:增加各等级土地产出果实统计卡片

- 新增FarmLandOutputStatsCard统计卡片类
- 使用作物日志表中的收获事件数据统计各土地等级的产出果实总量
- 采用NumberS2单行多数字卡片格式显示统计结果
- 显示各土地类型的产出数量和总计
- 只显示有产出数据的土地类型,避免显示0值项目
AI Assistant hai 6 meses
pai
achega
6c7ec65388

+ 88 - 0
AiWork/2025年06月/22日2141-修复Game模块用户日志管理后台菜单问题.md

@@ -0,0 +1,88 @@
+# 修复Game模块用户日志管理后台菜单问题
+
+**时间**: 2025年06月22日 21:41  
+**任务**: 将Game模块的user-log添加到后台菜单中
+
+## 问题描述
+
+用户反馈Game模块的user-log未加入后台菜单,无法在后台管理界面中访问用户日志管理功能。
+
+## 解决方案
+
+### 1. 菜单结构分析
+
+通过查询数据库发现当前菜单结构:
+- 游戏运营管理 (ID: 260)
+  - 游戏管理 (ID: 382)
+    - 游戏奖励日志 (ID: 386)
+
+### 2. 添加菜单项
+
+在"游戏管理"子菜单下添加"用户日志管理"菜单项:
+
+```sql
+INSERT INTO kku_admin_menu (parent_id, `order`, title, icon, uri, created_at, updated_at) 
+VALUES (382, 124, '用户日志管理', 'fa-list-alt', 'game-user-logs', NOW(), NOW());
+```
+
+### 3. 修复控制器错误
+
+发现UserLogController中存在类型错误:
+
+**问题**: UserLog模型使用了`UserLogSourceTypeCast`,将数据库字符串转换为枚举实例,但控制器中的`isValid()`方法期望字符串参数。
+
+**解决**: 修改控制器代码,正确处理枚举实例和字符串:
+
+```php
+// 修改前
+if (REWARD_SOURCE_TYPE::isValid($value)) {
+
+// 修改后  
+$typeValue = $value instanceof REWARD_SOURCE_TYPE ? $value->value : $value;
+if (REWARD_SOURCE_TYPE::isValid($typeValue)) {
+```
+
+### 4. 涉及文件
+
+- `app/Module/Game/AdminControllers/UserLogController.php` - 修复枚举类型处理
+- 数据库表 `kku_admin_menu` - 添加菜单项
+
+## 测试结果
+
+✅ **菜单显示**: 用户日志管理菜单项成功显示在"游戏运营管理 -> 游戏管理"下  
+✅ **列表页面**: 正常显示用户日志列表,包含69120条记录  
+✅ **字段显示**: 来源类型正确显示图标和描述(如"🏡 农场升级")  
+✅ **链接功能**: 来源表名可点击跳转到对应详情页面  
+✅ **详情页面**: 详情页面正常显示所有字段信息  
+✅ **分页功能**: 分页功能正常工作  
+
+## 技术细节
+
+### Cast类型转换
+
+UserLog模型使用了`UserLogSourceTypeCast`类:
+- **get方法**: 将数据库字符串转换为`REWARD_SOURCE_TYPE`枚举实例
+- **set方法**: 将枚举实例转换为字符串存储
+
+### 枚举处理
+
+在控制器的display回调中需要正确处理:
+1. 检查值是否为枚举实例
+2. 提取枚举的value属性用于验证和获取信息
+3. 保持向后兼容性,支持字符串类型
+
+## 提交信息
+
+```
+修复Game模块用户日志管理后台菜单问题
+
+- 添加用户日志管理菜单项到游戏运营管理->游戏管理子菜单下
+- 修复UserLogController中枚举类型处理错误
+- 解决source_type字段Cast转换导致的类型不匹配问题
+- 完善来源类型显示,支持图标、名称和描述
+- 测试确认列表页面和详情页面功能正常
+```
+
+## 总结
+
+成功解决了Game模块用户日志管理功能无法在后台访问的问题。通过添加菜单项和修复控制器中的类型处理错误,现在用户可以正常访问和管理用户日志数据。

+ 5 - 0
app/Module/Farm/AdminControllers/FarmMetricsController.php

@@ -5,6 +5,7 @@ namespace App\Module\Farm\AdminControllers;
 use App\Module\Farm\AdminControllers\Metrics\FarmLandLevelStatsCard;
 use App\Module\Farm\AdminControllers\Metrics\FarmLandTrendChart;
 use App\Module\Farm\AdminControllers\Metrics\FarmHouseRanking;
+use App\Module\Farm\AdminControllers\Metrics\FarmLandOutputStatsCard;
 use UCore\DcatAdmin\AdminController;
 use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Layout\Row;
@@ -43,6 +44,10 @@ class FarmMetricsController extends AdminController
                     $column->row(function (Row $row) {
                         // 房屋等级排名卡片
                         $row->column(12, new FarmHouseRanking());
+
+                        // 各个等级土地的产出果实统计(使用作物日志表)
+                        $row->column(12, new FarmLandOutputStatsCard());
+                
                     });
                 });
             });

+ 93 - 0
app/Module/Farm/AdminControllers/Metrics/FarmLandOutputStatsCard.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace App\Module\Farm\AdminControllers\Metrics;
+
+use App\Module\Farm\Models\FarmCropLog;
+use App\Module\Farm\Models\FarmLandType;
+use UCore\DcatAdmin\Metrics\Examples\NumberS2;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 农场土地产出果实统计卡片
+ * 使用单行多数字卡片显示各个土地等级的产出果实总数统计
+ */
+class FarmLandOutputStatsCard extends NumberS2
+{
+    /**
+     * 初始化卡片内容
+     */
+    protected function init()
+    {
+        parent::init();
+
+        $this->title('各等级土地产出果实统计');
+        // 移除下拉选项,因为产出统计不需要时间范围选择
+        $this->dropdown([]);
+    }
+
+    /**
+     * 处理请求
+     *
+     * @param Request $request
+     * @return mixed|void
+     */
+    public function handle(Request $request)
+    {
+        $stats = $this->getLandOutputStats();
+
+        // 转换为NumberS2需要的数据格式
+        $dataList = [];
+        foreach ($stats as $stat) {
+            $dataList[$stat['name']] = $stat['total_output'];
+        }
+
+        $this->withContent($dataList);
+    }
+
+    /**
+     * 获取各等级土地产出果实统计数据
+     *
+     * @return array
+     */
+    private function getLandOutputStats(): array
+    {
+        // 获取所有土地类型配置
+        $landTypes = FarmLandType::orderBy('id')->get()->keyBy('id');
+
+        // 从作物日志表中统计各土地类型的收获数据
+        $harvestStats = FarmCropLog::where('event_type', FarmCropLog::EVENT_HARVESTED)
+            ->select('land_type', DB::raw('SUM(JSON_EXTRACT(event_data, "$.amount")) as total_amount'))
+            ->groupBy('land_type')
+            ->get()
+            ->keyBy('land_type');
+
+        $stats = [];
+        $totalOutput = 0;
+
+        // 遍历所有土地类型,生成统计数据
+        foreach ($landTypes as $landType) {
+            $harvestData = $harvestStats->get($landType->id);
+            $outputAmount = $harvestData ? (int)$harvestData->total_amount : 0;
+            $totalOutput += $outputAmount;
+
+            // 只显示有产出的土地类型
+            if ($outputAmount > 0) {
+                $stats[] = [
+                    'name' => $landType->name,
+                    'total_output' => $outputAmount
+                ];
+            }
+        }
+
+        // 添加总计
+        if ($totalOutput > 0) {
+            $stats[] = [
+                'name' => '总计',
+                'total_output' => $totalOutput
+            ];
+        }
+
+        return $stats;
+    }
+}