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

196 lines
4.8 KiB
Markdown
Raw Permalink Normal View History

2026-02-28 17:26:03 +08:00
# 待支付状态混淆问题诊断
## 问题描述
数据库中存在 `status=0` 的订单,但后端代码中 `status=0` 的含义存在**矛盾**。
---
## 核心矛盾
### 1⃣ 订单状态定义OrderServiceImpl.java 第760-770行
```java
/**
* 订单状态定义:
* 0 - 待支付:订单已创建,等待支付
* 1 - 待接单:已支付,等待陪伴员接单
* 2 - 待服务:已接单,等待签到开始服务
* 3 - 服务中:已签到,正在服务
* 4 - 已完成:服务已完成(已签退)
* -1 - 已取消:用户取消或超时取消
* -2 - 已退款:退款成功
*/
```
**注释说明:** `0 = 待支付`
---
### 2⃣ 实际代码逻辑
#### 订单创建时OrderServiceImpl.java 第90行
```java
order.setStatus(0); // 待支付
order.setPayStatus(0); // 未支付
```
**符合定义:** 创建订单时 `status=0` 表示待支付
---
#### 支付成功后OrderServiceImpl.java 第225行
```java
// 🔥 修复:支付成功后,设置订单状态为待派单
order.setStatus(0); // 0-待派单(支付完成,等待管理师派单)
log.info("支付成功,订单状态设置为待派单(status=0)");
```
**与定义矛盾:** 支付成功后仍然设置 `status=0`,但注释说是"待派单"
---
#### 陪伴员拒单后OrderServiceImpl.java 第863行
```java
// 🔥 修改:拒单后订单状态回到待派单(0)清除陪伴员ID让管理师重新分配
order.setStatus(0); // 0-待派单(回到待分配状态)
order.setTeacherId(null); // 清除陪伴员ID
```
**与定义矛盾:** 拒单后设置 `status=0`,注释说是"待派单"
---
#### 状态流转规则OrderServiceImpl.java 第772行
```java
/**
* 状态流转规则:
* 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真正的待支付订单
```sql
status = 0
pay_status = 0 -- 未支付
pay_time IS NULL
```
#### 类型2实际是待派单订单
```sql
status = 0
pay_status = 1 -- 已支付
pay_time IS NOT NULL
```
---
## 验证方法
运行以下SQL查询
```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` 才能确定真实业务状态的值!