peixue-dev/Archive/[一次性]管理师派单功能问题分析.md

336 lines
9.1 KiB
Markdown
Raw Normal View History

2026-02-28 17:26:03 +08:00
# 管理师派单功能问题分析
## 🚨 问题描述
1. **待派单数目不对** - 统计的待派单数量与实际不符
2. **订单状态不对** - 派单前后订单状态一致都是status=0
3. **无法通过筛选** - 使用dispatchStatus筛选时无法正确过滤订单
## 🔍 问题根源分析
### 问题1待派单数目统计错误
**当前逻辑ManagerController.java 第95-99行**
```java
// 待派单订单数status=0 表示待派单,不限制支付状态)
QueryWrapper<com.peidu.entity.Order> pendingQuery = new QueryWrapper<>();
pendingQuery.eq("status", 0).eq("deleted", 0);
long pendingOrders = orderService.count(pendingQuery);
```
**问题:**
- 只根据`status=0`判断待派单
- 没有考虑`teacher_id`字段
- 没有考虑`pay_status`字段
**正确的待派单逻辑应该是:**
```
待派单 = pay_status=1(已支付) AND teacher_id IS NULL AND deleted=0
```
因为:
1. 用户创建订单后订单status=0pay_status=0待支付
2. 用户支付后pay_status=1已支付但status仍然是0
3. 管理师派单后teacher_id有值status应该变为1
4. 所以待派单的订单应该是:已支付但未分配陪伴员的订单
### 问题2派单后订单状态不变
**当前逻辑ManagerController.java 第471-472行**
```java
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已接单/已派单
```
**问题:**
虽然代码中设置了`status=1`,但从你的描述来看,派单前后状态一致,说明:
1. 可能是数据库更新失败
2. 可能是有其他地方覆盖了状态
3. 可能是MyBatis-Plus的更新策略问题
**需要检查:**
- Order实体类的`@TableField`注解配置
- 是否有更新策略导致null值不更新
- 是否有触发器或其他逻辑修改了状态
### 问题3筛选逻辑不正确
**当前逻辑ManagerController.java 第182-206行**
```java
// 只查询已支付的订单
queryWrapper.eq("pay_status", 1);
// 添加派单状态过滤
if ("pending".equals(dispatchStatus)) {
queryWrapper.isNull("teacher_id"); // 待派单
} else if ("assigned".equals(dispatchStatus)) {
queryWrapper.isNotNull("teacher_id"); // 已派单
}
```
**问题:**
- 筛选逻辑本身是正确的
- 但如果派单后`teacher_id`没有正确更新,筛选就会失败
- 或者如果派单后`status`没有变化前端可能根据status筛选也会失败
## 📊 订单状态流转分析
### 当前的订单状态定义
根据代码分析,订单状态应该是:
- `status=0` - 待派单(已支付,未分配陪伴员)
- `status=1` - 已派单/待接单(已分配陪伴员,陪伴员未接单)
- `status=2` - 服务中(陪伴员已签到)
- `status=3` - 已完成
- `status=4` - 已取消
### 正确的订单流转应该是
```
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=有值 ← 已完成状态
```
## 🔧 修复方案
### 修复1正确统计待派单数量
**修改位置:** `ManagerController.java` 第95-99行
**修改前:**
```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);
```
### 修复2确保派单后状态正确更新
**修改位置:** `ManagerController.java` 第470-476行
**修改前:**
```java
// 更新订单信息
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已接单/已派单
```
**修改后:**
```java
// 更新订单信息
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已派单/待接单
order.setUpdateTime(java.time.LocalDateTime.now()); // 更新时间
// 🔥 添加日志,确认更新前的值
System.out.println("准备更新订单:");
System.out.println(" teacherId: " + order.getTeacherId());
System.out.println(" status: " + order.getStatus());
System.out.println(" updateTime: " + order.getUpdateTime());
```
### 修复3添加派单通知
**修改位置:** `ManagerController.java` 第510-512行
**修改后:**
```java
if (updatedOrder.getStatus() == 1) {
System.out.println("✅ 订单状态更新成功");
// 🔥 发送派单通知给陪伴员
try {
INotificationService notificationService =
(INotificationService) SpringContextHolder.getBean("notificationServiceImpl");
// 获取陪伴员信息
Teacher teacher = teacherService.getById(teacherId);
if (teacher != null && teacher.getUserId() != null) {
// 发送通知给陪伴员
notificationService.sendNotification(
teacher.getUserId(),
"order",
"新订单派单通知",
"您有新的订单被分配,订单号:" + orderId + ",请及时查看并接单。",
orderId
);
System.out.println("✅ 已发送派单通知给陪伴员userId: " + teacher.getUserId());
} else {
System.out.println("⚠️ 陪伴员userId为空无法发送通知");
}
// 发送通知给家长
if (order.getUserId() != null) {
String teacherName = teacher != null ?
(teacher.getRealName() != null ? teacher.getRealName() : teacher.getName()) :
"陪伴员";
notificationService.sendOrderAssignNotification(
order.getUserId(),
orderId,
teacherName
);
System.out.println("✅ 已发送派单通知给家长userId: " + order.getUserId());
}
} catch (Exception e) {
System.out.println("⚠️ 发送派单通知失败: " + e.getMessage());
e.printStackTrace();
}
return Result.success(true, "派单成功");
} else {
System.out.println("❌ 订单状态更新失败,当前状态: " + updatedOrder.getStatus());
return Result.error("订单状态更新失败");
}
```
### 修复4检查Order实体类的更新策略
需要检查Order实体类中status字段的配置
```java
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private Integer status;
```
如果配置了`updateStrategy = FieldStrategy.NOT_NULL`当status为null时不会更新。
但我们设置的是1不是null所以应该没问题。
需要检查是否有其他配置影响了更新。
## 📝 测试验证步骤
### 步骤1验证待派单统计
1. 创建几个测试订单
2. 支付其中一些订单
3. 查看管理师统计数据
4. 确认待派单数量 = 已支付但未分配陪伴员的订单数
### 步骤2验证派单功能
1. 选择一个待派单订单
2. 分配陪伴员
3. 点击派单
4. 检查数据库:
- `teacher_id` 是否有值
- `status` 是否变为1
- `update_time` 是否更新
### 步骤3验证派单通知
1. 派单成功后
2. 陪伴员端查看消息通知
3. 确认收到"新订单派单通知"
4. 家长端查看消息通知
5. 确认收到"订单已派单"通知
### 步骤4验证筛选功能
1. 使用"待派单"筛选
2. 确认只显示已支付但未分配陪伴员的订单
3. 使用"已派单"筛选
4. 确认只显示已分配陪伴员的订单
## 🔍 需要检查的SQL
```sql
-- 1. 查看所有订单的状态分布
SELECT
status,
pay_status,
CASE
WHEN teacher_id IS NULL THEN '未分配'
ELSE '已分配'
END as teacher_status,
COUNT(*) as count
FROM `order`
WHERE deleted = 0
GROUP BY status, pay_status, teacher_status
ORDER BY status, pay_status;
-- 2. 查看待派单订单(正确的逻辑)
SELECT
id,
order_no,
status,
pay_status,
teacher_id,
user_id,
create_time,
update_time
FROM `order`
WHERE pay_status = 1
AND teacher_id IS NULL
AND deleted = 0
ORDER BY create_time DESC;
-- 3. 查看派单后的订单
SELECT
id,
order_no,
status,
pay_status,
teacher_id,
user_id,
create_time,
update_time
FROM `order`
WHERE teacher_id IS NOT NULL
AND deleted = 0
ORDER BY update_time DESC
LIMIT 20;
-- 4. 检查派单前后的状态变化
-- 先记录派单前的订单ID和状态
-- 然后派单
-- 再查询该订单的状态
SELECT
id,
order_no,
status,
teacher_id,
update_time
FROM `order`
WHERE id = <订单ID>;
```
---
**分析完成时间:** 2026-01-26
**分析人员:** Kiro AI
**下一步:** 等待用户确认后开始修复