# 修复后台作物管理页面报错 ## 任务信息 - **时间**: 2025-06-21 22:20 - **任务**: 修复后台 `/admin/farm-crops` 页面报错 - **状态**: ✅ 已完成 ## 问题描述 后台作物管理页面 `/admin/farm-crops` 访问时出现 TypeError 错误: ``` TypeError: "Dcat\Admin\Grid\Filter\Where::__construct(): Argument #2 ($query) must be of type Closure, string given, called in /var/www/html/vendor/dcat/laravel-admin/src/Grid/Filter.php on line 789" ``` ## 问题分析 错误发生在 `FarmCropController.php` 第139行,问题是 `$filter->where()` 方法的参数顺序不正确。 ### 错误代码 ```php $filter->where('final_output_amount', '产量状态', function ($query) { // 查询逻辑 })->select([...]); ``` ### 正确语法 根据 Dcat Admin 文档,`where` 方法的正确参数顺序应该是: ```php $filter->where($column, \Closure $callback, $label = '') ``` ## 解决方案 修改 `app/Module/Farm/AdminControllers/FarmCropController.php` 文件中的两个 `where` 过滤器: ### 修复前 ```php $filter->where('final_output_amount', '产量状态', function ($query) { // ... }, '产量状态')->select([...]); $filter->where('data_completeness', '数据完整性', function ($query) { // ... }, '数据完整性')->select([...]); ``` ### 修复后 ```php $filter->where('output_status', function ($query) { $value = $this->input; if ($value == 'has_amount') { $query->whereNotNull('final_output_amount'); } elseif ($value == 'no_amount') { $query->whereNull('final_output_amount'); } }, '产量状态')->select([ 'has_amount' => '已确定产量', 'no_amount' => '未确定产量' ]); $filter->where('data_completeness', function ($query) { $value = $this->input; if ($value == 'complete') { $query->whereNotNull('final_output_item_id') ->whereNotNull('final_output_amount') ->where('growth_stage', GROWTH_STAGE::MATURE->value); } elseif ($value == 'incomplete_mature') { $query->where('growth_stage', GROWTH_STAGE::MATURE->value) ->where(function ($q) { $q->whereNull('final_output_item_id') ->orWhereNull('final_output_amount'); }); } elseif ($value == 'missing_amount') { $query->whereNotNull('final_output_item_id') ->whereNull('final_output_amount'); } }, '数据完整性')->select([ 'complete' => '数据完整(成熟期)', 'incomplete_mature' => '数据不完整(成熟期)', 'missing_amount' => '缺少产量' ]); ``` ## 修改内容 1. 将 `where` 方法的参数顺序从 `(field, label, callback)` 改为正确的 `(field, callback, label)` 2. 为第一个过滤器使用虚拟字段名 `output_status`,为第二个过滤器使用 `data_completeness` ## 测试结果 ✅ 页面可以正常加载,不再出现 TypeError 错误 ✅ 筛选器正常显示,包含"产量状态"和"数据完整性"选项 ✅ 筛选功能正常工作,可以按"未确定产量"进行筛选 ✅ 筛选结果正确,只显示符合条件的记录 ✅ URL 参数正确传递(`output_status=no_amount`) ## 提交信息 - **Commit**: 3439d267 - **Message**: 修复后台作物管理页面报错 - **Files**: `app/Module/Farm/AdminControllers/FarmCropController.php` ## 技术要点 1. **Dcat Admin Where 过滤器语法**:`where($column, \Closure $callback, $label = '')` 2. **参数顺序重要性**:框架严格检查参数类型,顺序错误会导致 TypeError 3. **虚拟字段名**:可以使用不存在的字段名作为过滤器标识符 4. **闭包上下文**:在闭包中通过 `$this->input` 获取用户输入值