9.1 KiB
9.1 KiB
管理师派单功能问题分析
🚨 问题描述
- 待派单数目不对 - 统计的待派单数量与实际不符
- 订单状态不对 - 派单前后订单状态一致,都是status=0
- 无法通过筛选 - 使用dispatchStatus筛选时无法正确过滤订单
🔍 问题根源分析
问题1:待派单数目统计错误
当前逻辑(ManagerController.java 第95-99行):
// 待派单订单数(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
因为:
- 用户创建订单后,订单status=0,pay_status=0(待支付)
- 用户支付后,pay_status=1(已支付),但status仍然是0
- 管理师派单后,teacher_id有值,status应该变为1
- 所以待派单的订单应该是:已支付但未分配陪伴员的订单
问题2:派单后订单状态不变
当前逻辑(ManagerController.java 第471-472行):
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已接单/已派单
问题:
虽然代码中设置了status=1,但从你的描述来看,派单前后状态一致,说明:
- 可能是数据库更新失败
- 可能是有其他地方覆盖了状态
- 可能是MyBatis-Plus的更新策略问题
需要检查:
- Order实体类的
@TableField注解配置 - 是否有更新策略导致null值不更新
- 是否有触发器或其他逻辑修改了状态
问题3:筛选逻辑不正确
当前逻辑(ManagerController.java 第182-206行):
// 只查询已支付的订单
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行
修改前:
// 待派单订单数(status=0 表示待派单,不限制支付状态)
QueryWrapper<com.peidu.entity.Order> pendingQuery = new QueryWrapper<>();
pendingQuery.eq("status", 0).eq("deleted", 0);
long pendingOrders = orderService.count(pendingQuery);
修改后:
// 待派单订单数(已支付但未分配陪伴员的订单)
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行
修改前:
// 更新订单信息
order.setTeacherId(teacherId);
order.setStatus(1); // 1-已接单/已派单
修改后:
// 更新订单信息
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行
修改后:
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字段的配置:
@TableField(updateStrategy = FieldStrategy.NOT_NULL)
private Integer status;
如果配置了updateStrategy = FieldStrategy.NOT_NULL,当status为null时不会更新。
但我们设置的是1,不是null,所以应该没问题。
需要检查是否有其他配置影响了更新。
📝 测试验证步骤
步骤1:验证待派单统计
- 创建几个测试订单
- 支付其中一些订单
- 查看管理师统计数据
- 确认待派单数量 = 已支付但未分配陪伴员的订单数
步骤2:验证派单功能
- 选择一个待派单订单
- 分配陪伴员
- 点击派单
- 检查数据库:
teacher_id是否有值status是否变为1update_time是否更新
步骤3:验证派单通知
- 派单成功后
- 陪伴员端查看消息通知
- 确认收到"新订单派单通知"
- 家长端查看消息通知
- 确认收到"订单已派单"通知
步骤4:验证筛选功能
- 使用"待派单"筛选
- 确认只显示已支付但未分配陪伴员的订单
- 使用"已派单"筛选
- 确认只显示已分配陪伴员的订单
🔍 需要检查的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
下一步: 等待用户确认后开始修复