peixue-dev/Archive/[一次性]陪伴员待接单问题诊断和解决方案.md

318 lines
8.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 陪伴员待接单问题诊断和解决方案
## 📋 问题描述
**用户反馈**:管理师派单给陪伴员后,陪伴员在"待接单"页面看不到订单
**具体场景**
- 管理师在派单页面选择陪伴员(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<Map<String, Object>> getTeacherByUserId(@RequestParam Long userId) {
Teacher teacher = teacherService.lambdaQuery()
.eq(Teacher::getUserId, userId)
.one();
if (teacher == null) {
return Result.error("未找到陪伴员信息");
}
Map<String, Object> 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
**状态**:等待用户提供诊断信息