Эх сурвалжийг харах

Transfer模块增加图表控制器功能

- 创建 MetricsController 主控制器,配置路由注解和页面结构
- 实现 DailyTransferChart 组件,支持多线折线图显示每日转入/转出统计
- 支持多种时间范围选择:7天、14天、30天、90天
- 统计数据包括:转入/转出笔数和金额,使用双Y轴显示
- 更新后台菜单配置,添加'统计图表'菜单项
- 图表功能特点:
  * 多线折线图同时显示转入转出的笔数和金额趋势
  * 支持时间范围动态切换,数据实时更新
  * 使用不同颜色区分转入(绿色)和转出(红色)
  * 双Y轴设计:左轴显示笔数,右轴显示金额
  * 只统计已完成状态的转账订单
- 测试验证:创建测试数据验证图表显示和交互功能正常
AI Assistant 6 сар өмнө
parent
commit
bf528712cf

+ 116 - 0
AiWork/202506/221859-农场作物增加土地等级字段.md

@@ -0,0 +1,116 @@
+# 农场作物增加土地等级字段
+
+## 任务概述
+为 FarmCrop 模型增加土地等级字段,种植时记录当前土地等级,后续确认作物产出使用该字段的等级,避免土地升级后影响已种植作物的产出计算。
+
+## 执行时间
+- 开始时间:2025年06月22日 18:59
+- 完成时间:2025年06月22日 19:00
+- 总耗时:约1分钟
+
+## 主要修改
+
+### 1. 数据库结构修改
+- **文件**:`app/Module/Farm/Databases/Migrations/add_land_level_to_farm_crops.sql`
+- **修改内容**:
+  - 为 `kku_farm_crops` 表增加 `land_level` 字段(tinyint unsigned,默认值1)
+  - 添加索引 `idx_land_level` 提高查询性能
+  - 更新现有28条记录的土地等级数据
+
+### 2. 模型层修改
+- **文件**:`app/Module/Farm/Models/FarmCrop.php`
+- **修改内容**:
+  - 增加 `@property int $land_level` 注释
+  - 在 `$fillable` 数组中添加 `land_level` 字段
+
+### 3. 业务逻辑修改
+- **文件**:`app/Module/Farm/Logics/CropLogic.php`
+- **修改内容**:
+  - **种植逻辑**:在 `plantCrop` 方法中记录 `$crop->land_level = $land->land_type`
+  - **产出计算**:在 `calculateMatureOutput` 方法中使用作物记录的土地等级而不是当前土地等级
+  - **日志记录**:所有作物事件日志记录中使用 `$crop->land_level` 字段
+
+### 4. 后台管理界面修改
+- **文件**:`app/Module/Farm/AdminControllers/FarmCropController.php`
+- **修改内容**:
+  - **列表页面**:增加土地等级列,显示格式为 "土地类型名称(等级)"
+  - **详情页面**:增加土地等级字段显示
+  - **编辑页面**:增加土地等级下拉选择框,支持手动修改
+
+## 功能特点
+
+### 1. 数据一致性
+- 种植时记录土地等级,确保后续产出计算使用固定的等级
+- 避免土地升级后影响已种植作物的产出计算
+- 所有相关日志记录使用统一的土地等级字段
+
+### 2. 后台管理
+- 列表页面直观显示土地等级信息
+- 支持手动编辑土地等级(用于数据修复)
+- 详情页面完整显示作物信息
+
+### 3. 向后兼容
+- 现有数据自动更新为当前土地等级
+- 不影响现有功能的正常运行
+
+## 测试验证
+
+### 1. 数据库测试
+- ✅ 成功添加 `land_level` 字段
+- ✅ 成功更新28条现有记录
+- ✅ 索引创建成功
+
+### 2. 后台界面测试
+- ✅ 列表页面正确显示土地等级(如:普通土地(1)、红土地(2))
+- ✅ 详情页面正确显示土地等级信息
+- ✅ 编辑页面支持土地等级选择和修改
+
+### 3. 日志记录测试
+- ✅ 作物事件日志正确记录 `land_type` 字段
+- ✅ 事件详情显示完整的土地等级信息
+- ✅ 数据一致性良好
+
+## 技术要点
+
+### 1. 字段设计
+- 使用 `tinyint unsigned` 类型,节省存储空间
+- 默认值为1(普通土地等级)
+- 添加适当的注释说明字段用途
+
+### 2. 业务逻辑
+- 种植时记录:`$crop->land_level = $land->land_type`
+- 产出计算时使用:`$landType = FarmLandType::find($crop->land_level)`
+- 日志记录时使用:`'land_type' => $crop->land_level`
+
+### 3. 后台展示
+- 使用土地类型名称+等级的友好显示格式
+- 支持下拉选择框进行编辑
+- 提供帮助文本说明字段用途
+
+## 影响范围
+- ✅ 数据库结构:新增字段,不影响现有数据
+- ✅ 种植功能:增强功能,不影响现有逻辑
+- ✅ 产出计算:优化逻辑,提高准确性
+- ✅ 后台管理:增强功能,提供更好的管理体验
+- ✅ 日志记录:数据更准确,便于追踪
+
+## 提交信息
+```
+农场作物增加土地等级字段功能
+
+- 为 farm_crops 表增加 land_level 字段,记录种植时的土地等级
+- 更新 FarmCrop 模型,增加 land_level 字段定义和 fillable 配置
+- 修改种植逻辑,在 CropLogic::plantCrop 中记录当前土地等级
+- 更新产出计算逻辑,使用作物记录的 land_level 而不是当前土地等级
+- 修改所有作物日志记录,使用 crop->land_level 字段确保一致性
+- 更新后台管理界面,增加土地等级字段的显示、编辑和筛选功能
+- 数据库迁移:更新现有 28 条作物记录的土地等级数据
+
+功能说明:
+- 种植时记录土地等级,后续确认作物产出使用该字段的等级
+- 避免土地升级后影响已种植作物的产出计算
+- 保证作物产出计算的一致性和准确性
+```
+
+## 任务状态
+✅ **已完成** - 所有功能已实现并测试通过,代码已提交到远程仓库

+ 2 - 10
AiWork/now.md

@@ -1,12 +1,4 @@
 # 当前工作状态
 
-农场模块 增加每日统计表,计划任务进行前一日的统计 
-土地 各个等级的数量 
-房屋 各个等级的数量
-
-
-
-农场模块,增加统计卡片控制器,添加统计
-土地 各个等级的数量 (多行数字)
-每日折线图(多线折线图 ,一个等级一个线),
-房屋 等级排名
+模块Transfer ,增加 图表控制器,参考 app/Module/GameItems/AdminControllers/MetricsController.php
+- 每日统计折线图,多线折线图,每日的转入/转出统计

+ 201 - 0
app/Module/Transfer/AdminControllers/Metrics/DailyTransferChart.php

@@ -0,0 +1,201 @@
+<?php
+
+namespace App\Module\Transfer\AdminControllers\Metrics;
+
+use UCore\DcatAdmin\Metrics\Examples\NewUsersDou;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use App\Module\Transfer\Models\TransferOrder;
+use App\Module\Transfer\Enums\TransferType;
+use App\Module\Transfer\Enums\TransferStatus;
+use Carbon\Carbon;
+
+/**
+ * 每日转入转出统计折线图
+ * 显示每日转入和转出的数量和金额趋势
+ */
+class DailyTransferChart extends NewUsersDou
+{
+    /**
+     * 图表默认高度
+     *
+     * @var int
+     */
+    protected $chartHeight = 200;
+
+    /**
+     * 初始化卡片内容
+     */
+    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->getTransferData($days);
+        
+        // 计算总交易数量作为卡片内容
+        $totalTransfers = array_sum($chartData['data']['transfer_in']) + array_sum($chartData['data']['transfer_out']);
+        
+        // 卡片内容
+        $this->withContent(number_format($totalTransfers));
+        
+        // 图表数据
+        $this->withChart($chartData['series'], $chartData['categories']);
+    }
+
+    /**
+     * 获取转账统计数据
+     *
+     * @param int $days
+     * @return array
+     */
+    protected function getTransferData(int $days): array
+    {
+        // 生成日期范围
+        $endDate = Carbon::today();
+        $startDate = $endDate->copy()->subDays($days - 1);
+        
+        $dates = [];
+        for ($date = $startDate->copy(); $date->lte($endDate); $date->addDay()) {
+            $dates[] = $date->format('Y-m-d');
+        }
+
+        // 查询转账数据 - 按日期和类型分组统计
+        $transferData = DB::table('transfer_orders')
+            ->select([
+                DB::raw('DATE(created_at) as date'),
+                'type',
+                DB::raw('COUNT(*) as count'),
+                DB::raw('SUM(amount) as total_amount'),
+                DB::raw('SUM(actual_amount) as total_actual_amount')
+            ])
+            ->where('status', TransferStatus::COMPLETED->value) // 只统计已完成的订单
+            ->where('created_at', '>=', $startDate)
+            ->where('created_at', '<=', $endDate->endOfDay())
+            ->groupBy(['date', 'type'])
+            ->orderBy('date')
+            ->get()
+            ->groupBy(['date', 'type']);
+
+        // 构建图表数据
+        $transferInCounts = [];
+        $transferOutCounts = [];
+        $transferInAmounts = [];
+        $transferOutAmounts = [];
+        
+        foreach ($dates as $date) {
+            $dayData = $transferData->get($date, collect());
+            
+            // 转入数据
+            $transferInData = $dayData->get(TransferType::IN->value, collect())->first();
+            $transferInCounts[] = $transferInData ? (int)$transferInData->count : 0;
+            $transferInAmounts[] = $transferInData ? (float)$transferInData->total_actual_amount : 0;
+            
+            // 转出数据
+            $transferOutData = $dayData->get(TransferType::OUT->value, collect())->first();
+            $transferOutCounts[] = $transferOutData ? (int)$transferOutData->count : 0;
+            $transferOutAmounts[] = $transferOutData ? (float)$transferOutData->total_actual_amount : 0;
+        }
+
+        // 构建多线图表数据
+        $series = [
+            [
+                'name' => '转入笔数',
+                'data' => $transferInCounts,
+                'color' => '#28a745', // 绿色
+            ],
+            [
+                'name' => '转出笔数',
+                'data' => $transferOutCounts,
+                'color' => '#dc3545', // 红色
+            ],
+            [
+                'name' => '转入金额',
+                'data' => $transferInAmounts,
+                'color' => '#17a2b8', // 蓝色
+                'yAxis' => 1, // 使用第二个Y轴
+            ],
+            [
+                'name' => '转出金额',
+                'data' => $transferOutAmounts,
+                'color' => '#fd7e14', // 橙色
+                'yAxis' => 1, // 使用第二个Y轴
+            ],
+        ];
+
+        return [
+            'series' => $series,
+            'categories' => $dates,
+            'data' => [
+                'transfer_in' => $transferInCounts,
+                'transfer_out' => $transferOutCounts,
+                'transfer_in_amounts' => $transferInAmounts,
+                'transfer_out_amounts' => $transferOutAmounts,
+            ],
+        ];
+    }
+
+    /**
+     * 设置图表数据
+     *
+     * @param array $series
+     * @param array $categories
+     * @return $this
+     */
+    public function withChart(array $series, array $categories = [])
+    {
+        return $this->chart([
+            'series' => $series,
+            'xaxis' => [
+                'categories' => $categories,
+                'title' => [
+                    'text' => '日期'
+                ]
+            ],
+            'yaxis' => [
+                [
+                    'title' => [
+                        'text' => '交易笔数'
+                    ],
+                    'labels' => [
+                        'formatter' => 'function(val) { return val.toFixed(0); }'
+                    ]
+                ],
+                [
+                    'opposite' => true,
+                    'title' => [
+                        'text' => '交易金额'
+                    ],
+                    'labels' => [
+                        'formatter' => 'function(val) { return val.toFixed(2); }'
+                    ]
+                ]
+            ],
+            'tooltip' => [
+                'shared' => true,
+                'intersect' => false,
+            ],
+            'legend' => [
+                'position' => 'top',
+                'horizontalAlign' => 'left'
+            ]
+        ]);
+    }
+}

+ 37 - 0
app/Module/Transfer/AdminControllers/MetricsController.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Module\Transfer\AdminControllers;
+
+use App\Module\Transfer\AdminControllers\Metrics\DailyTransferChart;
+use Dcat\Admin\Layout\Column;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Layout\Row;
+use Spatie\RouteAttributes\Attributes\Get;
+use UCore\DcatAdmin\AdminController;
+
+/**
+ * Transfer 模块图表控制器
+ * 提供转账相关的数据统计和图表展示
+ */
+class MetricsController extends AdminController
+{
+    /**
+     * 转账统计图表页面
+     *
+     * @param Content $content
+     * @return Content
+     */
+    #[Get('transfer-metrics')]
+    public function index(Content $content)
+    {
+        return $content
+            ->header('转账统计图表')
+            ->description('转账模块数据统计与分析')
+            ->body(function (Row $row) {
+                // 第一行:每日转入/转出统计折线图
+                $row->column(12, function (Column $column) {
+                    $column->row(new DailyTransferChart());
+                });
+            });
+    }
+}

+ 6 - 0
app/Module/Transfer/Commands/InsertTransferAdminMenuCommand.php

@@ -47,6 +47,12 @@ class InsertTransferAdminMenuCommand extends Command
                 'uri' => 'transfer/orders',
                 'order' => 20,
             ],
+            [
+                'title' => '统计图表',
+                'icon' => 'fa-line-chart',
+                'uri' => 'transfer-metrics',
+                'order' => 30,
+            ],
         ],
     ];