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

318 lines
8.1 KiB
Markdown
Raw Normal View History

2026-02-28 17:26:03 +08:00
# 陪伴员待接单问题诊断和解决方案
## 📋 问题描述
**用户反馈**:管理师派单给陪伴员后,陪伴员在"待接单"页面看不到订单
**具体场景**
- 管理师在派单页面选择陪伴员(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
**状态**:等待用户提供诊断信息