# 订单系统 Bug 修复 ## 问题描述 **错误信息:** ``` Typed property app\\common\\lists\\BaseDataLists::$orderBy must not be accessed before initialization ``` ## 原因分析 `OrderLists` 类继承自 `BaseDataLists`,但没有实现 `ListsSearchInterface` 接口。 在 `BaseDataLists` 的 `initSort()` 方法中,只有当类实现了 `ListsSortInterface` 接口时,才会初始化 `$orderBy` 属性: ```php private function initSort() { if (!($this instanceof ListsSortInterface)) { return []; // 如果没有实现接口,$orderBy 不会被初始化 } // ... } ``` 当 `lists()` 方法尝试使用 `$this->orderBy` 时,由于属性未初始化,就会抛出错误。 ## 解决方案 ### 修改 OrderLists 类 1. **改变继承关系**:从 `BaseDataLists` 改为 `BaseAdminDataLists` 2. **实现接口**:实现 `ListsSearchInterface` 接口 3. **实现方法**:实现 `setSearch()` 方法定义搜索条件 4. **移除 orderBy 使用**:使用固定的排序而不是 `$this->orderBy` ### 修改后的代码 ```php ['order_type', 'status'], 'like' => ['order_no'], ]; } /** * @notes 获取列表 * @return array */ public function lists(): array { $where = $this->searchWhere; // 处理患者关键词搜索 if (!empty($this->params['patient_keyword'])) { $where[] = ['patient_id', 'in', function ($query) { $query->table('user') ->where('nickname|mobile', 'like', '%' . $this->params['patient_keyword'] . '%') ->field('id'); }]; } // 处理创建时间范围 if (!empty($this->params['create_time_start'])) { $where[] = ['create_time', '>=', $this->params['create_time_start'] . ' 00:00:00']; } if (!empty($this->params['create_time_end'])) { $where[] = ['create_time', '<=', $this->params['create_time_end'] . ' 23:59:59']; } return Order::where($where) ->with(['patient', 'creator', 'details']) ->order(['create_time' => 'desc']) // 使用固定排序 ->limit($this->limitOffset, $this->pageSize) ->select() ->toArray(); } /** * @notes 获取数量 * @return int */ public function count(): int { $where = $this->searchWhere; if (!empty($this->params['patient_keyword'])) { $where[] = ['patient_id', 'in', function ($query) { $query->table('user') ->where('nickname|mobile', 'like', '%' . $this->params['patient_keyword'] . '%') ->field('id'); }]; } if (!empty($this->params['create_time_start'])) { $where[] = ['create_time', '>=', $this->params['create_time_start'] . ' 00:00:00']; } if (!empty($this->params['create_time_end'])) { $where[] = ['create_time', '<=', $this->params['create_time_end'] . ' 23:59:59']; } return Order::where($where)->count(); } } ``` ## 关键改动 | 项目 | 原来 | 修改后 | |------|------|--------| | 基类 | `BaseDataLists` | `BaseAdminDataLists` | | 接口 | 无 | `ListsSearchInterface` | | 搜索条件 | `getSearchWhere()` 方法 | `setSearch()` 方法 | | 排序 | `$this->orderBy` | `['create_time' => 'desc']` | ## 验证修复 修复后,访问订单列表 API 应该能正常工作: ```bash curl -X GET "http://localhost:8000/order.order/lists" \ -H "token: your_admin_token" ``` 预期响应: ```json { "code": 1, "msg": "success", "data": { "lists": [], "count": 0, "page_no": 1, "page_size": 15 } } ``` ## 相关文件 - `server/app/adminapi/lists/order/OrderLists.php` - 已修复 ## 参考 - `server/app/adminapi/lists/doctor/RosterLists.php` - 参考实现 - `server/app/common/lists/BaseDataLists.php` - 基类实现 --- **修复日期**: 2024-03-10 **状态**: ✅ 完成