peixue-dev/Archive/[一次性]待支付状态混淆问题诊断-2026-01-31.md

4.8 KiB
Raw Blame History

待支付状态混淆问题诊断

问题描述

数据库中存在 status=0 的订单,但后端代码中 status=0 的含义存在矛盾


核心矛盾

1 订单状态定义OrderServiceImpl.java 第760-770行

/**
 * 订单状态定义:
 * 0 - 待支付:订单已创建,等待支付
 * 1 - 待接单:已支付,等待陪伴员接单
 * 2 - 待服务:已接单,等待签到开始服务
 * 3 - 服务中:已签到,正在服务
 * 4 - 已完成:服务已完成(已签退)
 * -1 - 已取消:用户取消或超时取消
 * -2 - 已退款:退款成功
 */

注释说明: 0 = 待支付


2 实际代码逻辑

订单创建时OrderServiceImpl.java 第90行

order.setStatus(0); // 待支付
order.setPayStatus(0); // 未支付

符合定义: 创建订单时 status=0 表示待支付


支付成功后OrderServiceImpl.java 第225行

// 🔥 修复:支付成功后,设置订单状态为待派单
order.setStatus(0); // 0-待派单(支付完成,等待管理师派单)
log.info("支付成功,订单状态设置为待派单(status=0)");

与定义矛盾: 支付成功后仍然设置 status=0,但注释说是"待派单"


陪伴员拒单后OrderServiceImpl.java 第863行

// 🔥 修改:拒单后订单状态回到待派单(0)清除陪伴员ID让管理师重新分配
order.setStatus(0); // 0-待派单(回到待分配状态)
order.setTeacherId(null); // 清除陪伴员ID

与定义矛盾: 拒单后设置 status=0,注释说是"待派单"


状态流转规则OrderServiceImpl.java 第772行

/**
 * 状态流转规则:
 * 0(待支付) -> 1(待接单) [支付成功] | -1(已取消) [取消订单]
 */

case 0: // 待支付
    return to == 1 || to == -1;  // 支付成功->待接单 或 取消

符合定义: status=0 只能流转到 1(待接单)-1(已取消)


问题根源

代码中 status=0两种含义

  1. 待支付(订单创建时,未支付)

    • pay_status = 0(未支付)
    • 用户还没有付款
  2. 待派单(支付成功后,等待管理师派单)

    • pay_status = 1(已支付)
    • 用户已经付款,等待管理师分配陪伴员

数据库中的实际情况

可能存在两种 status=0 的订单:

类型1真正的待支付订单

status = 0
pay_status = 0  -- 未支付
pay_time IS NULL

类型2实际是待派单订单

status = 0
pay_status = 1  -- 已支付
pay_time IS NOT NULL

验证方法

运行以下SQL查询

-- 检查status=0的订单按支付状态分组
SELECT 
    pay_status,
    COUNT(*) as count,
    CASE 
        WHEN pay_status = 0 THEN '未支付(真正的待支付)'
        WHEN pay_status = 1 THEN '已支付(实际是待派单)'
        ELSE '其他'
    END as description
FROM work_order
WHERE status = 0
GROUP BY pay_status;

-- 查看具体订单
SELECT 
    id,
    order_no,
    status,
    pay_status,
    pay_time,
    teacher_id,
    create_time
FROM work_order
WHERE status = 0
ORDER BY create_time DESC
LIMIT 20;

结论

"待支付"在后端算不算订单状态?

算! 但存在设计问题:

  1. 定义上: status=0 明确定义为"待支付"

  2. 实际使用: status=0 被用于表示两种不同的业务状态

    • 待支付(未付款)
    • 待派单(已付款)
  3. 区分方式: 通过 pay_status 字段区分

    • pay_status=0 → 真正的待支付
    • pay_status=1 → 实际是待派单

建议

方案1保持现状需要明确文档

  • 明确说明 status=0 有两种含义
  • 必须结合 pay_status 判断实际状态

方案2修改状态定义推荐

0 - 待支付(未付款)
1 - 待派单(已付款,等待管理师派单)
2 - 待接单(已派单,等待陪伴员接单)
3 - 待服务(已接单,等待签到)
4 - 服务中(已签到)
5 - 已完成(已签退)
-1 - 已取消
-2 - 已退款

这样每个状态都有明确的业务含义,不会混淆。


当前状态总结

状态值 注释定义 实际使用场景1 实际使用场景2 区分字段
0 待支付 订单创建,未支付 支付成功,待派单 pay_status
1 待接单 已派单,等待陪伴员接单 - -
2 待服务 已接单,等待签到 - -
3 服务中 已签到,正在服务 - -
4 已完成 服务完成 - -
-1 已取消 订单取消 - -
-2 已退款 订单退款 - -

关键点: status=0 是唯一一个需要结合 pay_status 才能确定真实业务状态的值!