4.8 KiB
4.8 KiB
待支付状态混淆问题诊断
问题描述
数据库中存在 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 有两种含义:
-
待支付(订单创建时,未支付)
pay_status = 0(未支付)- 用户还没有付款
-
待派单(支付成功后,等待管理师派单)
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;
结论
"待支付"在后端算不算订单状态?
✅ 算! 但存在设计问题:
-
定义上:
status=0明确定义为"待支付" -
实际使用:
status=0被用于表示两种不同的业务状态- 待支付(未付款)
- 待派单(已付款)
-
区分方式: 通过
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 才能确定真实业务状态的值!