# 管理师派单功能问题分析 ## 🚨 问题描述 1. **待派单数目不对** - 统计的待派单数量与实际不符 2. **订单状态不对** - 派单前后订单状态一致,都是status=0 3. **无法通过筛选** - 使用dispatchStatus筛选时无法正确过滤订单 ## 🔍 问题根源分析 ### 问题1:待派单数目统计错误 **当前逻辑(ManagerController.java 第95-99行):** ```java // 待派单订单数(status=0 表示待派单,不限制支付状态) QueryWrapper 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=0,pay_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 pendingQuery = new QueryWrapper<>(); pendingQuery.eq("status", 0).eq("deleted", 0); long pendingOrders = orderService.count(pendingQuery); ``` **修改后:** ```java // 待派单订单数(已支付但未分配陪伴员的订单) QueryWrapper 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 **下一步:** 等待用户确认后开始修复