|
|
@@ -1,12 +1,12 @@
|
|
|
# 农场统计图表:各等级土地产出果实种类统计
|
|
|
|
|
|
-**任务时间:** 2025年06月22日 22:03 - 22:30
|
|
|
+**任务时间:** 2025年06月22日 22:03 - 22:45
|
|
|
**任务类型:** 功能开发
|
|
|
**模块:** Farm(农场模块)
|
|
|
|
|
|
## 任务描述
|
|
|
|
|
|
-在农场统计图表页面中增加各个等级土地的产出果实种类统计功能,为每个土地等级创建独立的统计卡片,显示该土地类型产出的不同果实种类及其出现次数。
|
|
|
+在农场统计图表页面中增加各个等级土地的产出果实种类统计功能,为每个土地等级创建独立的统计卡片,显示该土地类型产出的不同果实种类及其出现次数。使用FarmCrop模型进行统计,并包含软删除数据以提供完整的数据分析。
|
|
|
|
|
|
## 实现内容
|
|
|
|
|
|
@@ -29,27 +29,26 @@
|
|
|
|
|
|
### 4. 统计逻辑
|
|
|
```php
|
|
|
-// 从作物日志表中统计指定土地类型的收获数据,按果实种类分组
|
|
|
-$harvestStats = FarmCropLog::where('event_type', FarmCropLog::EVENT_HARVESTED)
|
|
|
- ->where('land_type', $this->landType)
|
|
|
- ->select(
|
|
|
- DB::raw('JSON_EXTRACT(event_data, "$.item_id") as item_id'),
|
|
|
- DB::raw('COUNT(*) as harvest_count')
|
|
|
- )
|
|
|
- ->groupBy(DB::raw('JSON_EXTRACT(event_data, "$.item_id")'))
|
|
|
+// 从作物表中统计指定土地等级的产出果实,按果实种类分组
|
|
|
+// 使用withTrashed()包含软删除的数据
|
|
|
+$cropStats = FarmCrop::withTrashed()
|
|
|
+ ->where('land_level', $this->landType)
|
|
|
+ ->whereNotNull('final_output_item_id')
|
|
|
+ ->select('final_output_item_id', DB::raw('COUNT(*) as crop_count'))
|
|
|
+ ->groupBy('final_output_item_id')
|
|
|
->get();
|
|
|
```
|
|
|
|
|
|
### 5. 显示效果
|
|
|
- **卡片数量:** 4个独立卡片,每个土地等级一个
|
|
|
- **显示格式:** 单行多数字(NumberS2)
|
|
|
-- **显示内容:**
|
|
|
- - **普通土地产出果实统计:** 萝卜(1次)、辣椒(1次)
|
|
|
- - **红土地产出果实统计:** 辣椒(8次)、萝卜(2次)、西瓜(2次)、苹果(2次)
|
|
|
- - **黑土地产出果实统计:** 无数据(空卡片)
|
|
|
- - **金土地产出果实统计:** 无数据(空卡片)
|
|
|
-- **排序:** 按收获次数降序排列
|
|
|
-- **特性:** 只显示有收获记录的果实种类
|
|
|
+- **显示内容(包含软删除数据后):**
|
|
|
+ - **普通土地产出果实统计:** 萝卜(8次)、辣椒(6次)
|
|
|
+ - **红土地产出果实统计:** 萝卜(23次)、辣椒(19次)、西瓜(4次)、苹果(3次)
|
|
|
+ - **黑土地产出果实统计:** 西瓜(12次)、苹果(7次)、萝卜(2次)、南瓜(1次)、草莓(1次)
|
|
|
+ - **金土地产出果实统计:** 西瓜(6次)、草莓(4次)、南瓜(2次)、苹果(2次)
|
|
|
+- **排序:** 按作物数量降序排列
|
|
|
+- **特性:** 包含软删除数据,提供完整的历史统计分析
|
|
|
|
|
|
### 6. 页面集成
|
|
|
- **控制器:** `app/Module/Farm/AdminControllers/FarmMetricsController.php`
|
|
|
@@ -70,21 +69,23 @@ GROUP BY land_type, JSON_EXTRACT(event_data, '$.item_id')
|
|
|
ORDER BY land_type, harvest_count DESC;
|
|
|
```
|
|
|
|
|
|
-**验证结果:**
|
|
|
-- **普通土地(1):** 萝卜(ID:2)1次、辣椒(ID:3)1次
|
|
|
-- **红土地(2):** 辣椒(ID:3)8次、萝卜(ID:2)2次、西瓜(ID:5)2次、苹果(ID:4)2次
|
|
|
-- **黑土地(3):** 无收获记录
|
|
|
-- **金土地(4):** 无收获记录
|
|
|
+**验证结果(包含软删除数据):**
|
|
|
+- **普通土地(1):** 萝卜(ID:2)8次、辣椒(ID:3)6次
|
|
|
+- **红土地(2):** 萝卜(ID:2)23次、辣椒(ID:3)19次、西瓜(ID:5)4次、苹果(ID:4)3次
|
|
|
+- **黑土地(3):** 西瓜(ID:5)12次、苹果(ID:4)7次、萝卜(ID:2)2次、南瓜(ID:7)1次、草莓(ID:6)1次
|
|
|
+- **金土地(4):** 西瓜(ID:5)6次、草莓(ID:6)4次、南瓜(ID:7)2次、苹果(ID:4)2次
|
|
|
|
|
|
## 技术特点
|
|
|
|
|
|
1. **模块化设计:** 使用抽象基类和具体实现类,便于扩展新的土地类型
|
|
|
-2. **数据准确性:** 直接从作物日志表统计实际收获数据,按果实种类分组
|
|
|
-3. **性能优化:** 使用SQL聚合函数和JSON提取进行数据库层面统计
|
|
|
-4. **用户体验:** 每个土地类型独立卡片,数据清晰直观
|
|
|
-5. **智能排序:** 按收获次数降序排列,突出热门果实
|
|
|
-6. **代码复用:** 继承UCore框架的NumberS2卡片类,保持UI一致性
|
|
|
-7. **数据关联:** 自动关联物品表获取果实名称,提升可读性
|
|
|
+2. **数据完整性:** 使用withTrashed()包含软删除数据,提供完整的历史统计分析
|
|
|
+3. **数据准确性:** 直接从FarmCrop表统计实际作物数据,按果实种类分组
|
|
|
+4. **性能优化:** 使用SQL聚合函数进行数据库层面统计
|
|
|
+5. **用户体验:** 每个土地类型独立卡片,数据清晰直观
|
|
|
+6. **智能排序:** 按作物数量降序排列,突出主要产出果实
|
|
|
+7. **代码复用:** 继承UCore框架的NumberS2卡片类,保持UI一致性
|
|
|
+8. **数据关联:** 自动关联物品表获取果实名称,提升可读性
|
|
|
+9. **软删除支持:** 符合用户偏好,统计包含删除数据以提供完整数据分析
|
|
|
|
|
|
## 测试结果
|
|
|
|
|
|
@@ -100,7 +101,9 @@ ORDER BY land_type, harvest_count DESC;
|
|
|
|
|
|
**第一次提交:** `6c7ec653` - 初始实现(总产量统计)
|
|
|
**第二次提交:** `102686c8` - 重构为果实种类统计
|
|
|
-**最终Message:** 农场统计图表:重构土地产出统计为果实种类统计
|
|
|
+**第三次提交:** `48654990` - 改用FarmCrop模型进行统计
|
|
|
+**第四次提交:** `bac5724b` - 包含软删除数据的完整统计分析
|
|
|
+**最终Message:** 农场统计图表:包含软删除数据的完整统计分析
|
|
|
|
|
|
## 相关文件
|
|
|
|