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

8.1 KiB
Raw Permalink Blame History

陪伴员待接单问题诊断和解决方案

📋 问题描述

用户反馈:管理师派单给陪伴员后,陪伴员在"待接单"页面看不到订单

具体场景

  • 管理师在派单页面选择陪伴员(ID=10096)并派单
  • 派单后前端显示"派单成功"
  • 但陪伴员登录后在"待接单"页面看不到这个订单

🔍 技术分析

1. 派单逻辑ManagerController.assignOrder

派单时的操作

// 更新订单信息
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

查询条件

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

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_idstatus 可能没有真正更新
  • 这可能是由于MyBatis-Plus的逻辑删除机制导致的

验证方法 运行SQL查询订单306的实际状态

原因3登录接口未返回teacherId ⚠️ (概率10%)

问题描述

  • 登录接口只返回了 user 信息
  • 没有查询 teacher 表并返回 teacherId

验证方法 查看登录接口的实现,确认是否返回了 teacherId


🔧 诊断步骤

步骤1运行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 中:

onLoad() {
  const userInfo = uni.getStorageSync('userInfo')
  
  // 🔥 临时方案手动设置teacherId
  this.teacherId = 10096  // 替换为实际的陪伴员ID
  
  console.log('[待接单] 陪伴员ID:', this.teacherId)
  this.loadList()
}

方案B调用接口获取teacherId

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

后端修改(登录接口):

// 登录成功后查询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

后端新增接口

@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);
}

前端调用

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
状态:等待用户提供诊断信息