peixue-dev/Archive/[一次性]管理师派单功能修复总结.md

327 lines
9.3 KiB
Markdown
Raw Normal View History

2026-02-28 17:26:03 +08:00
# 管理师派单功能修复总结
## 📋 修复内容
### 修复1待派单数量统计逻辑
**问题:** 原来只根据`status=0`统计待派单数量,没有考虑支付状态和陪伴员分配情况
**修复前:**
```java
// 待派单订单数status=0 表示待派单,不限制支付状态)
QueryWrapper<com.peidu.entity.Order> pendingQuery = new QueryWrapper<>();
pendingQuery.eq("status", 0).eq("deleted", 0);
long pendingOrders = orderService.count(pendingQuery);
```
**修复后:**
```java
// 待派单订单数(已支付但未分配陪伴员的订单)
QueryWrapper<com.peidu.entity.Order> pendingQuery = new QueryWrapper<>();
pendingQuery.eq("pay_status", 1) // 已支付
.isNull("teacher_id") // 未分配陪伴员
.eq("deleted", 0);
long pendingOrders = orderService.count(pendingQuery);
```
**修复原因:**
- 用户创建订单后:`status=0, pay_status=0, teacher_id=null` (待支付)
- 用户支付后:`status=0, pay_status=1, teacher_id=null` (待派单)✅
- 管理师派单后:`status=1, pay_status=1, teacher_id=有值` (已派单)
所以待派单应该是:**已支付但未分配陪伴员的订单**
### 修复2已派单数量统计逻辑
**问题:** 原来根据`status=1`统计但如果派单后status没有正确更新统计就会错误
**修复前:**
```java
// 已派单订单数status=1 表示已派单)
QueryWrapper<com.peidu.entity.Order> assignedQuery = new QueryWrapper<>();
assignedQuery.eq("status", 1).eq("deleted", 0);
long assignedOrders = orderService.count(assignedQuery);
```
**修复后:**
```java
// 已派单订单数(已分配陪伴员的订单)
QueryWrapper<com.peidu.entity.Order> assignedQuery = new QueryWrapper<>();
assignedQuery.isNotNull("teacher_id") // 已分配陪伴员
.eq("deleted", 0);
long assignedOrders = orderService.count(assignedQuery);
```
**修复原因:**
- `teacher_id`是派单的核心标识
- 即使`status`没有正确更新,只要`teacher_id`有值,就说明已派单
- 这样统计更可靠
### 修复3派单时添加更新时间
**问题:** 派单时没有更新`update_time`字段
**修复前:**
```java
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已接单/已派单
```
**修复后:**
```java
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已派单/待接单
order.setUpdateTime(java.time.LocalDateTime.now()); // 更新时间
```
**修复原因:**
- `update_time`用于追踪订单最后修改时间
- 可以用来计算派单响应时间
- 有助于排查问题
### 修复4添加派单通知功能
**新增功能:** 派单成功后,发送通知给陪伴员和家长
**实现代码:**
```java
// 发送通知给陪伴员
if (teacher != null && teacher.getUserId() != null) {
notificationService.sendNotification(
teacher.getUserId(),
"order",
"新订单派单通知",
"您有新的订单被分配,订单号:" + order.getOrderNo() + ",请及时查看并接单。",
orderId
);
}
// 发送通知给家长
if (order.getUserId() != null) {
notificationService.sendOrderAssignNotification(
order.getUserId(),
orderId,
teacherName
);
}
```
**通知内容:**
- **陪伴员收到:** "新订单派单通知 - 您有新的订单被分配订单号XXX请及时查看并接单。"
- **家长收到:** "订单已派单 - 您的订单已分配给陪伴员XXX"
## 📊 订单状态流转
### 正确的订单状态流转
```
1. 用户创建订单
status=0, pay_status=0, teacher_id=null
状态:待支付
2. 用户支付订单
status=0, pay_status=1, teacher_id=null
状态:待派单 ← 管理师在这里看到订单
3. 管理师派单
status=1, pay_status=1, teacher_id=有值
状态:已派单/待接单 ← 陪伴员收到通知
4. 陪伴员接单
status=1, pay_status=1, teacher_id=有值
状态:待服务
5. 陪伴员签到
status=2, pay_status=1, teacher_id=有值
状态:服务中
6. 陪伴员签退
status=3, pay_status=1, teacher_id=有值
状态:已完成
```
### 订单筛选逻辑
**待派单筛选:**
```sql
WHERE pay_status = 1
AND teacher_id IS NULL
AND deleted = 0
```
**已派单筛选:**
```sql
WHERE teacher_id IS NOT NULL
AND deleted = 0
```
## 📝 测试步骤
### 步骤1测试待派单统计
1. 创建几个测试订单
2. 支付其中一些订单
3. 访问管理师统计接口:`GET /api/manager/statistics?managerId=1`
4. 检查返回的`pendingOrders`数量
5. 运行SQL验证`Archive/[一次性]检查订单派单状态.sql` 第2个查询
6. 确认数量一致
**预期结果:**
- 待派单数量 = 已支付但未分配陪伴员的订单数
- 不包括未支付的订单
- 不包括已派单的订单
### 步骤2测试派单功能
1. 选择一个待派单订单记录订单ID
2. 运行SQL查看派单前状态
```sql
SELECT id, order_no, status, teacher_id, update_time
FROM `order` WHERE id = <订单ID>;
```
3. 在管理师界面执行派单操作
4. 再次运行SQL查看派单后状态
5. 检查数据库变化:
- `teacher_id` 应该有值
- `status` 应该变为1
- `update_time` 应该更新
**预期结果:**
```
派单前:
id=123, status=0, teacher_id=NULL, update_time=2026-01-26 10:00:00
派单后:
id=123, status=1, teacher_id=5, update_time=2026-01-26 14:30:00
```
### 步骤3测试派单通知
1. 派单成功后,查看后端日志
2. 确认日志中有:
```
✅ 已发送派单通知给陪伴员userId: XXX
✅ 已发送派单通知给家长userId: XXX
```
3. 陪伴员端登录,进入"消息通知"
4. 确认收到"新订单派单通知"
5. 家长端登录,进入"消息通知"
6. 确认收到"订单已派单"通知
**预期结果:**
- 陪伴员收到通知,内容包含订单号
- 家长收到通知,内容包含陪伴员姓名
- 点击通知可以跳转到订单详情
### 步骤4测试订单筛选
1. 在管理师订单列表页面
2. 选择"待派单"筛选
3. 确认只显示已支付但未分配陪伴员的订单
4. 选择"已派单"筛选
5. 确认只显示已分配陪伴员的订单
6. 清除筛选,查看所有订单
**预期结果:**
- 待派单筛选:只显示`pay_status=1 AND teacher_id IS NULL`的订单
- 已派单筛选:只显示`teacher_id IS NOT NULL`的订单
- 筛选切换流畅,数据正确
### 步骤5测试统计数据
1. 访问管理师统计接口
2. 检查返回的数据:
```json
{
"pendingOrders": 5, // 待派单
"assignedOrders": 10, // 已派单
"processingOrders": 3, // 服务中
"completedOrders": 20, // 已完成
"cancelledOrders": 2, // 已取消
"activeTeachers": 8, // 在岗陪伴员
"totalOrders": 40 // 总订单数
}
```
3. 运行SQL验证各项数据
4. 确认数据准确
## ⚠️ 注意事项
### 1. 陪伴员userId可能为空
**问题:** 如果陪伴员的`user_id`字段为空,无法发送通知
**检查SQL**
```sql
SELECT id, user_id, name, real_name
FROM teacher
WHERE audit_status = 1 AND user_id IS NULL;
```
**解决方案:**
- 如果发现有陪伴员`user_id`为空,需要补充数据
- 或者在派单时提示管理师该陪伴员无法接收通知
### 2. 订单状态可能不一致
**问题:** 如果之前有订单派单时`status`没有更新,会导致统计不准
**检查SQL**
```sql
SELECT id, order_no, status, teacher_id
FROM `order`
WHERE teacher_id IS NOT NULL AND status = 0 AND deleted = 0;
```
**解决方案:**
- 如果发现有这样的订单运行修复SQL
```sql
UPDATE `order`
SET status = 1
WHERE teacher_id IS NOT NULL AND status = 0 AND deleted = 0;
```
### 3. 通知发送失败不影响派单
**设计:** 即使通知发送失败,派单操作仍然成功
**原因:**
- 派单是核心业务,不能因为通知失败而失败
- 通知失败会记录日志,方便排查
- 可以后续补发通知
## 📊 修改文件清单
| 文件 | 修改内容 | 行数 |
|------|---------|------|
| `peidu/backend/src/main/java/com/peidu/controller/ManagerController.java` | 修复待派单统计逻辑 | 95-115 |
| `peidu/backend/src/main/java/com/peidu/controller/ManagerController.java` | 修复已派单统计逻辑 | 112-115 |
| `peidu/backend/src/main/java/com/peidu/controller/ManagerController.java` | 添加更新时间 | 471-478 |
| `peidu/backend/src/main/java/com/peidu/controller/ManagerController.java` | 添加派单通知 | 510-550 |
| `Archive/[一次性]检查订单派单状态.sql` | 创建检查SQL | 新建 |
| `Archive/[一次性]管理师派单功能修复总结.md` | 创建修复总结 | 新建 |
## 🎯 预期效果
修复后,管理师派单功能应该:
1.**统计准确** - 待派单数量正确显示已支付但未分配陪伴员的订单
2.**状态正确** - 派单后订单status从0变为1teacher_id有值
3.**筛选正常** - 可以正确筛选待派单和已派单订单
4.**通知及时** - 派单后陪伴员和家长都能收到通知
5.**日志完整** - 派单过程有详细的日志记录,方便排查问题
---
**修复完成时间:** 2026-01-26
**修复人员:** Kiro AI
**测试状态:** ⚠️ 待用户测试验证
**下一步:**
1. 重启后端服务
2. 测试派单功能
3. 验证通知是否正常发送
4. 检查统计数据是否准确