# 陪伴员待接单问题诊断和解决方案 ## 📋 问题描述 **用户反馈**:管理师派单给陪伴员后,陪伴员在"待接单"页面看不到订单 **具体场景**: - 管理师在派单页面选择陪伴员(ID=10096)并派单 - 派单后前端显示"派单成功" - 但陪伴员登录后在"待接单"页面看不到这个订单 --- ## 🔍 技术分析 ### 1. 派单逻辑(ManagerController.assignOrder) **派单时的操作**: ```java // 更新订单信息 updateWrapper.set(com.peidu.entity.Order::getTeacherId, teacherId) // 设置陪伴员ID .set(com.peidu.entity.Order::getStatus, 1); // 设置状态为1(待接单) ``` **预期结果**: - `teacher_id = 10096` - `status = 1` (待接单) - `pay_status = 1` (已支付) ### 2. 陪伴员查询逻辑(TeacherServiceImpl.getPendingOrders) **查询条件**: ```java wrapper.eq(Order::getTeacherId, teacherId); // teacher_id = 陪伴员ID wrapper.eq(Order::getStatus, 1); // status = 1 (待接单) wrapper.eq(Order::getPayStatus, 1); // pay_status = 1 (已支付) wrapper.eq(Order::getDeleted, 0); // deleted = 0 (未删除) ``` ### 3. 前端获取teacherId的方式 **前端代码**(pending-orders.vue): ```javascript const userInfo = uni.getStorageSync('userInfo') // 🔥 关键:优先使用teacherId,如果没有则使用id或userId this.teacherId = userInfo.teacherId || userInfo.id || userInfo.userId ``` --- ## 🎯 可能的原因 ### 原因1:前端获取的teacherId不正确 ⚠️ (概率70%) **问题描述**: - 前端从 `userInfo` 中获取 `teacherId` - 如果 `userInfo.teacherId` 为空,会使用 `userInfo.id` (这是 `user.id`,不是 `teacher.id`) - 导致查询时使用了错误的ID **验证方法**: 1. 在陪伴员端打开控制台 2. 查看日志中的 `[待接单] 陪伴员ID:` 输出 3. 确认这个ID是否等于数据库中的 `teacher.id` ### 原因2:派单时数据库更新失败 ⚠️ (概率20%) **问题描述**: - 虽然后端日志显示"派单成功" - 但数据库中的 `teacher_id` 和 `status` 可能没有真正更新 - 这可能是由于MyBatis-Plus的逻辑删除机制导致的 **验证方法**: 运行SQL查询订单306的实际状态 ### 原因3:登录接口未返回teacherId ⚠️ (概率10%) **问题描述**: - 登录接口只返回了 `user` 信息 - 没有查询 `teacher` 表并返回 `teacherId` **验证方法**: 查看登录接口的实现,确认是否返回了 `teacherId` --- ## 🔧 诊断步骤 ### 步骤1:运行SQL检查订单状态 请在数据库中运行以下SQL,并提供查询结果: ```sql -- 1. 查看最近派单的订单(假设派给了陪伴员ID=10096) SELECT id, order_no, teacher_id, status, pay_status, service_date, time_slot, create_time, update_time, CASE WHEN teacher_id IS NULL THEN '❌ 未分配陪伴员' WHEN status != 1 THEN '❌ 状态不是1(待接单)' WHEN pay_status != 1 THEN '❌ 未支付' ELSE '✅ 符合条件' END as check_result FROM `order` WHERE teacher_id = 10096 ORDER BY update_time DESC LIMIT 10; -- 2. 查看陪伴员10096应该能看到的待接单订单 SELECT id, order_no, teacher_id, status, pay_status, service_date, time_slot, create_time, update_time FROM `order` WHERE teacher_id = 10096 AND status = 1 AND pay_status = 1 AND deleted = 0 ORDER BY create_time DESC; -- 3. 查看teacher表中ID=10096的陪伴员信息 SELECT id as teacher_id, user_id, name, real_name, phone, audit_status FROM teacher WHERE id = 10096; ``` ### 步骤2:检查前端控制台日志 请在陪伴员端执行以下操作: 1. 打开微信开发者工具 2. 切换到"控制台"标签 3. 清空控制台日志 4. 进入"待接单"页面 5. 查看控制台输出,找到以下关键信息: - `[待接单] 用户信息:` - 查看完整的 userInfo 对象 - `[待接单] 陪伴员ID:` - 查看前端获取的 teacherId - `[待接单] API响应:` - 查看后端返回的数据 ### 步骤3:检查后端控制台日志 请在后端控制台查看: 1. 派单时的日志: - `=== 派单接口被调用 ===` - `派单前订单信息:` - `更新后订单验证:` 2. 查询待接单订单时的日志: - 查找包含 `getPendingOrders` 的日志 - 查看查询参数和查询结果 --- ## 💡 临时解决方案 如果确认是前端获取 `teacherId` 的问题,可以使用以下临时方案: ### 方案A:手动设置teacherId 在陪伴员端的 `pending-orders.vue` 中: ```javascript onLoad() { const userInfo = uni.getStorageSync('userInfo') // 🔥 临时方案:手动设置teacherId this.teacherId = 10096 // 替换为实际的陪伴员ID console.log('[待接单] 陪伴员ID:', this.teacherId) this.loadList() } ``` ### 方案B:调用接口获取teacherId ```javascript async loadTeacherId() { const userInfo = uni.getStorageSync('userInfo') // 如果已有teacherId,直接使用 if (userInfo.teacherId) { this.teacherId = userInfo.teacherId return } // 否则,调用接口查询 try { const res = await teacherApi.getTeacherInfo({ userId: userInfo.id }) if (res.code === 200 && res.data) { this.teacherId = res.data.id // 保存到本地存储 userInfo.teacherId = res.data.id uni.setStorageSync('userInfo', userInfo) } } catch (error) { console.error('[待接单] 获取teacherId失败:', error) } } ``` --- ## 🎯 根本解决方案 ### 方案1:修复登录接口(推荐) 在登录接口中查询 `teacher` 表并返回 `teacherId`: **后端修改**(登录接口): ```java // 登录成功后,查询teacher信息 Teacher teacher = teacherService.lambdaQuery() .eq(Teacher::getUserId, user.getId()) .one(); if (teacher != null) { userInfo.put("teacherId", teacher.getId()); userInfo.put("teacherName", teacher.getTeacherName()); } ``` ### 方案2:添加专门的接口获取teacherId **后端新增接口**: ```java @ApiOperation("根据userId获取teacherId") @GetMapping("/teacher/getByUserId") public Result> getTeacherByUserId(@RequestParam Long userId) { Teacher teacher = teacherService.lambdaQuery() .eq(Teacher::getUserId, userId) .one(); if (teacher == null) { return Result.error("未找到陪伴员信息"); } Map data = new HashMap<>(); data.put("teacherId", teacher.getId()); data.put("teacherName", teacher.getTeacherName()); return Result.success(data); } ``` **前端调用**: ```javascript async getTeacherId() { const userInfo = uni.getStorageSync('userInfo') const res = await teacherApi.getTeacherByUserId({ userId: userInfo.id }) if (res.code === 200 && res.data) { this.teacherId = res.data.teacherId // 保存到本地存储 userInfo.teacherId = res.data.teacherId uni.setStorageSync('userInfo', userInfo) } } ``` --- ## 📝 下一步行动 ### 立即执行 1. **运行SQL检查** - 运行步骤1中的3个SQL查询 2. **查看前端日志** - 按步骤2的指引查看控制台 3. **查看后端日志** - 按步骤3的指引查看后端控制台 ### 根据诊断结果 - **如果SQL查询结果显示订单状态正确** → 问题在前端,使用方案A或B - **如果SQL查询结果显示订单状态不正确** → 问题在派单逻辑,需要修复派单接口 - **如果teacher表中没有user_id映射** → 需要修复数据关联 --- ## 🔍 需要用户提供的信息 请提供以下信息以便进一步诊断: 1. **SQL查询结果**: - 查询1的结果(最近派单的订单) - 查询2的结果(符合条件的待接单订单) - 查询3的结果(陪伴员信息) 2. **前端控制台日志**: - `[待接单] 用户信息:` 的完整输出 - `[待接单] 陪伴员ID:` 的值 - `[待接单] API响应:` 的完整输出 3. **后端控制台日志**: - 派单时的完整日志 - 查询待接单订单时的日志 --- **创建时间**:2026-01-26 **状态**:等待用户提供诊断信息