peixue-dev/Archive/[一次性]陪伴员收不到订单问题分析.md

405 lines
11 KiB
Markdown
Raw Normal View History

2026-02-28 17:26:03 +08:00
# 陪伴员收不到订单问题分析报告
## 📋 问题描述
**用户反馈**:派单后陪伴员收不到订单
**用户疑问**:订单状态定义冲突是否是导致陪伴员收不到订单的主要原因?
---
## ✅ 已验证:订单状态定义没有冲突
根据之前的SQL查询结果`[一次性]订单状态字段定义检查.sql`),我们已经确认:
### 订单状态定义清晰
- `pay_status=1, status=0, teacher_id=NULL`: 62个订单已支付待派单
- `pay_status=1, status=1, teacher_id=NOT NULL`: 192个订单已派单待接单
- 派单后订单的 status 会正确更新为 1teacher_id 会正确设置 ✅
### 结论
**订单状态定义没有冲突,不是导致陪伴员收不到订单的原因。**
---
## 🔍 陪伴员待接单查询逻辑分析
### 后端查询逻辑TeacherServiceImpl.java
```java
@Override
public Page<com.peidu.vo.OrderDetailVO> getPendingOrders(Long teacherId, Integer page, Integer size) {
Page<Order> pageObj = new Page<>(page, size);
LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Order::getTeacherId, teacherId); // 分配给我的
wrapper.eq(Order::getStatus, 1); // 待接单状态
wrapper.eq(Order::getPayStatus, 1); // 已支付
wrapper.eq(Order::getDeleted, 0); // 未删除
wrapper.orderByDesc(Order::getCreateTime);
Page<Order> orderPage = orderMapper.selectPage(pageObj, wrapper);
// ... 转换为VO
}
```
### 查询条件
1.`teacher_id = teacherId` - 只查询分配给当前陪伴员的订单
2.`status = 1` - 待接单状态
3.`pay_status = 1` - 已支付
4.`deleted = 0` - 未删除
### 前端调用逻辑pending-orders.vue
```javascript
const res = await teacherApi.getPendingOrders({
teacherId: this.teacherId,
page: this.page,
size: this.size
})
```
### 前端获取teacherId的方式
```javascript
const userInfo = uni.getStorageSync('userInfo')
this.teacherId = userInfo.teacherId || userInfo.id
```
---
## 🎯 可能的原因分析
### 原因1teacherId映射关系问题 ⚠️
**问题描述**
- 前端从 `userInfo` 中获取 `teacherId`
-`userInfo` 中的 `teacherId` 可能与数据库中的 `teacher.id` 不一致
**验证方法**
1. 检查 `teacher` 表中的 `user_id` 字段是否正确映射到 `user`
2. 检查登录时返回的 `userInfo` 中的 `teacherId` 是否正确
**SQL验证**
```sql
-- 检查陪伴员10096的user_id映射
SELECT
t.id as teacher_id,
t.user_id,
t.teacher_name,
u.id as user_table_id,
u.nickname
FROM teacher t
LEFT JOIN user u ON t.user_id = u.id
WHERE t.id = 10096;
```
---
### 原因2前端未正确获取teacherId ⚠️
**问题描述**
- 前端使用 `userInfo.teacherId || userInfo.id`
- 如果 `userInfo` 中没有 `teacherId` 字段,会使用 `userInfo.id`(这是 `user.id`,不是 `teacher.id`
**验证方法**
1. 检查登录接口返回的 `userInfo` 结构
2. 确认 `userInfo` 中是否包含正确的 `teacherId`
**可能的问题**
```javascript
// ❌ 错误userInfo.id 是 user.id不是 teacher.id
this.teacherId = userInfo.id
// ✅ 正确userInfo.teacherId 是 teacher.id
this.teacherId = userInfo.teacherId
```
---
### 原因3派单时未正确设置teacher_id ⚠️
**问题描述**
- 管理师派单时,可能未正确设置 `teacher_id`
- 或者设置的 `teacher_id` 与陪伴员实际的 `teacher.id` 不一致
**验证方法**
1. 检查派单接口的实现(`ManagerController.assignOrder`
2. 查看订单306的 `teacher_id` 是否正确
**SQL验证**
```sql
-- 查看订单306的teacher_id
SELECT id, order_no, teacher_id, status, pay_status
FROM `order`
WHERE id = 306;
```
---
### 原因4前端显示逻辑问题 ⚠️
**问题描述**
- 后端返回了正确的数据,但前端未正确显示
- 或者前端的刷新机制有问题
**验证方法**
1. 检查前端控制台日志查看API返回的数据
2. 检查前端的数据绑定和渲染逻辑
---
### 原因5缓存问题 ⚠️
**问题描述**
- 前端或后端可能有缓存,导致数据未及时更新
**验证方法**
1. 清除前端缓存uni.clearStorageSync()
2. 重启后端服务
3. 重新登录陪伴员账号
---
## 🔧 排查步骤建议
### 步骤1验证订单306的状态
运行SQL查询
```sql
SELECT id, order_no, teacher_id, status, pay_status, deleted
FROM `order`
WHERE id = 306;
```
**预期结果**
- `teacher_id = 10096`或其他陪伴员ID
- `status = 1`(待接单)
- `pay_status = 1`(已支付)
- `deleted = 0`(未删除)
---
### 步骤2验证陪伴员的user_id映射
运行SQL查询
```sql
SELECT
t.id as teacher_id,
t.user_id,
t.teacher_name,
u.id as user_table_id,
u.nickname
FROM teacher t
LEFT JOIN user u ON t.user_id = u.id
WHERE t.id = 10096;
```
**预期结果**
- `teacher_id``user_id` 应该正确关联
- `user_table_id` 应该等于 `user_id`
---
### 步骤3检查前端获取的teacherId
在陪伴员端前端添加日志:
```javascript
console.log('[待接单] 用户信息:', userInfo)
console.log('[待接单] 陪伴员ID:', this.teacherId)
```
**预期结果**
- `userInfo.teacherId` 应该等于数据库中的 `teacher.id`
- 如果 `userInfo.teacherId` 为空,说明登录接口未返回正确的 `teacherId`
---
### 步骤4检查后端查询结果
在后端添加日志(已有):
```java
System.out.println("查询到的所有匹配订单数量: " + allMatchingOrders.size());
for (Order order : allMatchingOrders) {
System.out.println(" 订单ID: " + order.getId() +
", 状态: " + order.getStatus() +
", 陪伴员ID: " + order.getTeacherId());
}
```
**预期结果**
- 应该能查询到订单306
- 订单306的 `teacher_id` 应该等于查询参数中的 `teacherId`
---
### 步骤5检查前端API调用
在前端添加日志(已有):
```javascript
console.log('[待接单] API响应:', res)
console.log('[待接单] 加载成功, 总数:', this.pendingCount, '当前列表:', this.list.length)
```
**预期结果**
- `res.data.records` 应该包含订单306
- `res.data.total` 应该大于0
---
## 📊 诊断流程图
```
派单成功订单306
检查数据库订单306的teacher_id和status是否正确
↓ 是
检查teacher表teacher_id和user_id映射是否正确
↓ 是
检查登录接口返回的userInfo中是否包含正确的teacherId
↓ 是
检查前端前端获取的teacherId是否正确
↓ 是
检查后端查询后端能否查询到订单306
↓ 是
检查前端显示前端能否正确显示订单306
↓ 是
问题解决 ✅
```
---
## 🎯 最可能的原因
根据经验判断,最可能的原因是:
### 1. **前端获取的teacherId不正确** 概率60%
- `userInfo.teacherId` 为空或不正确
- 前端使用了 `userInfo.id`user.id而不是 `teacher.id`
### 2. **登录接口未返回teacherId** 概率30%
- 登录接口只返回了 `user` 信息,没有返回 `teacher` 信息
- 需要在登录接口中查询 `teacher` 表并返回 `teacherId`
### 3. **派单时未正确设置teacher_id** 概率10%
- 派单接口有bug未正确设置 `teacher_id`
- 或者设置的 `teacher_id` 不正确
---
## 💡 建议的修复方案
### 方案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
在陪伴员端首页加载时,调用接口获取 `teacherId`
```javascript
async getTeacherId() {
const userInfo = uni.getStorageSync('userInfo')
const res = await teacherApi.getTeacherInfo({ userId: userInfo.id })
if (res.code === 200 && res.data) {
this.teacherId = res.data.teacherId
// 保存到本地存储
userInfo.teacherId = res.data.teacherId
uni.setStorageSync('userInfo', userInfo)
}
}
```
### 方案3修改前端获取逻辑临时方案
如果 `userInfo` 中确实没有 `teacherId`,可以先调用接口查询:
```javascript
async loadTeacherId() {
const userInfo = uni.getStorageSync('userInfo')
// 如果已有teacherId直接使用
if (userInfo.teacherId) {
this.teacherId = userInfo.teacherId
return
}
// 否则,调用接口查询
const res = await teacherApi.getTeacherIdByUserId({ 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验证脚本
运行 `[一次性]验证陪伴员待接单查询.sql` 中的所有查询,确认:
- 订单306的状态是否正确
- 陪伴员10096的user_id映射是否正确
- 后端查询逻辑是否能查到订单306
### 2. 检查前端日志
在陪伴员端打开控制台,查看:
- `userInfo` 的完整内容
- `teacherId` 的值
- API返回的数据
### 3. 检查后端日志
在后端控制台查看:
- `getPendingOrders` 方法的查询参数
- 查询到的订单数量
- 订单306是否在查询结果中
### 4. 根据诊断结果选择修复方案
- 如果是 `teacherId` 映射问题 → 使用方案1或方案2
- 如果是派单问题 → 检查派单接口
- 如果是前端显示问题 → 检查前端渲染逻辑
---
## 🔍 需要用户提供的信息
为了进一步诊断问题,请用户提供:
1. **SQL查询结果**
- 运行 `[一次性]验证陪伴员待接单查询.sql` 中的查询1、2、3、6、7
- 提供查询结果截图或文本
2. **前端控制台日志**
- 打开陪伴员端的待接单页面
- 查看控制台输出的日志
- 提供 `[待接单]` 相关的所有日志
3. **后端控制台日志**
- 陪伴员访问待接单页面时
- 查看后端控制台输出
- 提供 `getPendingOrders` 相关的所有日志
4. **登录接口返回的userInfo**
- 陪伴员登录后
- 查看 `uni.getStorageSync('userInfo')` 的内容
- 提供完整的 `userInfo` 对象
---
## 📌 总结
**订单状态定义没有冲突**,不是导致陪伴员收不到订单的原因。
**最可能的原因**是前端获取的 `teacherId` 不正确,或者登录接口未返回 `teacherId`
**建议**先运行SQL验证脚本和检查前端日志确认具体原因后再选择修复方案。