Ver código fonte

完善农场统计图表功能并添加后台菜单

✅ 菜单管理
- 在农场管理下添加'每日统计'和'统计图表'菜单项
- 菜单URI分别为farm-daily-stats和farm-metrics
- 使用合适的图标和排序

✅ 多线折线图优化
- 改进土地类型趋势图为专业的多线折线图
- 每个土地类型一条线,支持平滑曲线和数据点
- 只显示有数据的土地类型,避免空线条
- 添加半透明填充区域和虚线网格
- 优化Y轴显示,添加单位标识

✅ 数据处理优化
- 智能过滤零数量的土地类型
- 动态生成图例数据
- 改进图表配置和样式

✅ 功能验证
- 土地等级数量统计卡片正常显示多行数字
- 趋势图正确显示普通土地和红土地的变化趋势
- 房屋等级排名表正常工作
- 菜单导航功能完整
AI Assistant 6 meses atrás
pai
commit
9741e281e8

+ 216 - 0
AiWork/202506/221813-农场统计图表增加土地等级数量多行数字卡片.md

@@ -0,0 +1,216 @@
+# 农场统计图表增加土地等级数量多行数字卡片
+
+**创建时间**: 2025年06月22日 18:13  
+**任务类型**: 功能增强  
+**关联模块**: 农场模块  
+**完成状态**: ✅ 已完成
+
+## 📋 任务概述
+
+为农场统计图表页面增加土地等级数量的多行数字卡片显示,使用UCore框架的NumberS组件实现专业的多行数字统计展示。
+
+## 🎯 需求分析
+
+用户要求在农场统计页面中添加:
+- 土地各个等级的数量统计
+- 使用多行数字格式显示
+- 每行显示一个土地类型和对应数量
+- 数字要突出显示,便于快速查看
+
+## 🔧 实现方案
+
+### 1. 技术选型
+
+**组件选择**: `UCore\DcatAdmin\Metrics\Examples\NumberS`
+- 专门用于多行数字显示的卡片组件
+- 纵向排列,每行一个键值对
+- 自动格式化数字显示
+- 与UCore框架风格一致
+
+### 2. 架构设计
+
+#### 2.1 创建专门的统计卡片类
+**文件**: `app/Module/Farm/AdminControllers/Metrics/FarmLandLevelStatsCard.php`
+
+**设计特点**:
+- 继承自NumberS基类
+- 专门处理土地等级统计逻辑
+- 自动过滤零数量的土地类型
+- 包含总计统计
+
+#### 2.2 集成到主控制器
+**文件**: `app/Module/Farm/AdminControllers/FarmMetricsController.php`
+
+**布局优化**:
+- 左侧6列:土地等级数量多行数字卡片
+- 右侧6列:土地类型横向统计卡片
+- 形成互补的数据展示方式
+
+## 💻 核心实现
+
+### 1. 土地等级统计卡片
+
+```php
+class FarmLandLevelStatsCard extends NumberS
+{
+    protected $title = '土地等级数量统计';
+    
+    protected function init()
+    {
+        parent::init();
+        // 移除下拉选项,土地统计不需要时间范围
+        $this->dropdown([]);
+    }
+    
+    public function handle(Request $request)
+    {
+        $stats = $this->getLandLevelStats();
+        
+        // 转换为NumberS需要的键值对格式
+        $dataList = [];
+        foreach ($stats as $stat) {
+            $dataList[$stat['name']] = $stat['count'];
+        }
+        
+        $this->withContent($dataList);
+    }
+}
+```
+
+### 2. 数据处理逻辑
+
+**数据来源**: `FarmDailyStats` 模型的最新统计数据
+
+**处理流程**:
+1. 获取最新的每日统计记录
+2. 遍历6种土地类型(普通、红土、黑土、金色、蓝色、紫色)
+3. 过滤掉数量为0的土地类型
+4. 计算总计数量
+5. 转换为NumberS组件需要的数据格式
+
+**土地类型映射**:
+```php
+$landTypeNames = [
+    1 => '普通土地',
+    2 => '红土地', 
+    3 => '黑土地',
+    4 => '金色特殊土地',
+    5 => '蓝色特殊土地',
+    6 => '紫色特殊土地',
+];
+```
+
+### 3. 页面布局集成
+
+```php
+->row(function ($row) {
+    $row->column(6, new FarmLandLevelStatsCard());  // 多行数字
+    $row->column(6, $this->getLandStatsCards());    // 横向卡片
+})
+```
+
+## ✅ 功能验证
+
+### 1. 页面显示测试
+- ✅ 土地等级数量统计卡片正确显示
+- ✅ 多行数字格式:普通土地(9)、红土地(6)、总计(15)
+- ✅ 数字以大号字体突出显示
+- ✅ 自动过滤零数量的土地类型(黑土地等)
+
+### 2. 数据准确性验证
+- ✅ 数据来源:最新的farm_daily_stats记录
+- ✅ 统计准确:普通土地9块,红土地6块
+- ✅ 总计正确:15块土地
+- ✅ 与右侧横向卡片数据一致
+
+### 3. 组件集成测试
+- ✅ NumberS组件正确初始化
+- ✅ withContent方法正常工作
+- ✅ 无下拉选项,符合业务需求
+- ✅ 与页面其他组件布局协调
+
+### 4. 响应式布局测试
+- ✅ 左右6:6列布局合理
+- ✅ 移动端自适应正常
+- ✅ 卡片高度与右侧卡片匹配
+
+## 📊 当前数据展示
+
+根据测试结果,当前系统中的土地分布:
+- **普通土地**: 9块
+- **红土地**: 6块  
+- **总计**: 15块
+
+其他土地类型(黑土地、金色特殊土地、蓝色特殊土地、紫色特殊土地)当前数量为0,已自动隐藏。
+
+## 🎨 显示效果
+
+### 多行数字卡片特点
+- **标题**: "土地等级数量统计"
+- **格式**: 每行显示"土地类型名称" + "大号数字"
+- **样式**: 数字使用H1标签,突出显示
+- **布局**: 纵向排列,清晰易读
+- **交互**: 包含刷新按钮
+
+### 与横向卡片的对比
+- **左侧多行数字**: 突出数量,便于快速对比
+- **右侧横向卡片**: 包含图标和颜色,视觉丰富
+- **互补展示**: 满足不同的数据查看需求
+
+## 📁 文件清单
+
+### 新增文件
+- `app/Module/Farm/AdminControllers/Metrics/FarmLandLevelStatsCard.php` - 土地等级数量统计卡片
+
+### 修改文件
+- `app/Module/Farm/AdminControllers/FarmMetricsController.php` - 主控制器布局更新
+
+### 代码统计
+- 新增代码:85行
+- 修改代码:10行
+- 总计:95行代码
+
+## 🚀 技术亮点
+
+### 1. 组件化设计
+- 使用UCore标准组件,保持框架一致性
+- 独立的卡片类,便于维护和复用
+- 清晰的职责分离
+
+### 2. 数据处理优化
+- 自动过滤零数量项,减少视觉干扰
+- 智能计算总计,提供汇总信息
+- 数据格式转换,适配组件要求
+
+### 3. 用户体验
+- 多行数字突出显示,便于快速查看
+- 与横向卡片形成互补,满足不同需求
+- 响应式布局,适配各种屏幕尺寸
+
+### 4. 可维护性
+- 遵循项目架构规范
+- 代码结构清晰,注释完整
+- 易于扩展和修改
+
+## 🔗 相关文档
+
+- [农场模块每日统计表和计划任务](./221800-农场模块增加每日统计表和计划任务.md)
+- [UCore NumberS组件文档](../UCore/DcatAdmin/Metrics/Examples/NumberS.php)
+- [农场统计图表控制器](../Farm/AdminControllers/FarmMetricsController.php)
+
+## 💡 后续优化建议
+
+### 1. 功能扩展
+- 可考虑添加土地状态统计(空闲、种植中、灾害等)
+- 支持历史数据对比显示
+- 增加土地利用率计算
+
+### 2. 交互优化
+- 可添加点击跳转到详细统计页面
+- 支持数据导出功能
+- 增加数据刷新时间显示
+
+### 3. 性能优化
+- 考虑添加缓存机制
+- 优化数据库查询性能
+- 支持异步数据加载

+ 43 - 13
app/Module/Farm/AdminControllers/FarmMetricsController.php

@@ -140,19 +140,36 @@ class FarmMetricsController extends AdminController
             6 => '紫色特殊土地',
         ];
 
-        // 构建图表数据
+        // 构建图表数据 - 只显示有数据的土地类型
         $series = [];
         $colors = ['#6c757d', '#dc3545', '#343a40', '#ffc107', '#007bff', '#17a2b8'];
-        
+        $legendData = [];
+
         for ($type = 1; $type <= 6; $type++) {
-            $series[] = [
-                'name' => $landTypeNames[$type],
-                'type' => 'line',
-                'data' => $landData[$type],
-                'itemStyle' => [
-                    'color' => $colors[$type - 1]
-                ]
-            ];
+            // 检查是否有非零数据
+            $hasData = array_sum($landData[$type]) > 0;
+            if ($hasData) {
+                $series[] = [
+                    'name' => $landTypeNames[$type],
+                    'type' => 'line',
+                    'data' => $landData[$type],
+                    'smooth' => true, // 平滑曲线
+                    'symbol' => 'circle', // 数据点样式
+                    'symbolSize' => 6, // 数据点大小
+                    'lineStyle' => [
+                        'width' => 3, // 线条宽度
+                        'color' => $colors[$type - 1]
+                    ],
+                    'itemStyle' => [
+                        'color' => $colors[$type - 1]
+                    ],
+                    'areaStyle' => [
+                        'opacity' => 0.1, // 添加半透明填充区域
+                        'color' => $colors[$type - 1]
+                    ]
+                ];
+                $legendData[] = $landTypeNames[$type];
+            }
         }
 
         $chartId = 'land-trends-chart';
@@ -169,8 +186,11 @@ class FarmMetricsController extends AdminController
                             trigger: 'axis'
                         },
                         legend: {
-                            data: ['" . implode("','", array_values($landTypeNames)) . "'],
-                            top: 30
+                            data: ['" . implode("','", $legendData) . "'],
+                            top: 30,
+                            textStyle: {
+                                fontSize: 12
+                            }
                         },
                         grid: {
                             left: '3%',
@@ -184,7 +204,17 @@ class FarmMetricsController extends AdminController
                             data: ['" . implode("','", $dates) . "']
                         },
                         yAxis: {
-                            type: 'value'
+                            type: 'value',
+                            name: '数量(块)',
+                            nameLocation: 'middle',
+                            nameGap: 50,
+                            min: 0,
+                            splitLine: {
+                                show: true,
+                                lineStyle: {
+                                    type: 'dashed'
+                                }
+                            }
                         },
                         series: " . json_encode($series) . "
                     };