Files
zyt/VERIFY_APPOINTMENT_FLOW.md
T
2026-03-04 15:32:30 +08:00

373 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 挂号预约流程验证指南
## 当前问题
医生ID=4在2026-03-04无法显示可预约时段。
## 验证步骤
### 步骤 1:检查医生ID=4的排班数据
```sql
-- 查看医生ID=4在2026-03-04的排班
SELECT
id,
doctor_id,
date,
period,
CASE period
WHEN 1 THEN '上午'
WHEN 2 THEN '下午'
ELSE CONCAT('未知(', period, ')')
END as period_name,
status,
CASE status
WHEN 1 THEN '出诊'
WHEN 2 THEN '停诊'
WHEN 3 THEN '休息'
WHEN 4 THEN '请假'
ELSE CONCAT('未知(', status, ')')
END as status_name,
quota,
max_patients,
booked_count,
remark
FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date = '2026-03-04';
```
### 步骤 2:检查预期结果
**如果查询结果为空:**
```
Empty set (0.00 sec)
```
→ 说明没有排班数据,需要添加
**如果查询结果显示 status != 1**
```
+----+-----------+------------+--------+-------------+--------+-------------+
| id | doctor_id | date | period | period_name | status | status_name |
+----+-----------+------------+--------+-------------+--------+-------------+
| 1 | 4 | 2026-03-04 | 1 | 上午 | 3 | 休息 |
| 2 | 4 | 2026-03-04 | 2 | 下午 | 3 | 休息 |
+----+-----------+------------+--------+-------------+--------+-------------+
```
→ 说明排班状态是休息,不会生成可预约时段(这是正确的行为)
**如果查询结果显示 status = 1**
```
+----+-----------+------------+--------+-------------+--------+-------------+
| id | doctor_id | date | period | period_name | status | status_name |
+----+-----------+------------+--------+-------------+--------+-------------+
| 1 | 4 | 2026-03-04 | 1 | 上午 | 1 | 出诊 |
| 2 | 4 | 2026-03-04 | 2 | 下午 | 1 | 出诊 |
+----+-----------+------------+--------+-------------+--------+-------------+
```
→ 说明排班状态是出诊,应该生成可预约时段
### 步骤 3:根据结果采取行动
#### 情况 A:没有排班数据
**添加排班:**
```sql
-- 添加医生ID=4在2026-03-04的出诊排班
INSERT INTO zyt_doctor_roster (
doctor_id,
date,
period,
status,
quota,
max_patients,
booked_count,
remark,
create_time,
update_time
) VALUES
-- 上午出诊
(4, '2026-03-04', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 下午出诊
(4, '2026-03-04', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
```
#### 情况 B:排班状态不是出诊
**如果医生确实应该出诊,修改状态:**
```sql
-- 将休息/停诊改为出诊
UPDATE zyt_doctor_roster
SET status = 1,
remark = '修改为出诊',
update_time = UNIX_TIMESTAMP()
WHERE doctor_id = 4
AND date = '2026-03-04'
AND status != 1;
```
**如果医生确实休息,这是正确的行为:**
- 不需要修改
- 系统正确地不显示可预约时段
- 用户应该选择其他日期或其他医生
#### 情况 C:排班状态是出诊但仍无法预约
**检查接口日志:**
```bash
# 查看日志
tail -f runtime/log/202403/04.log | grep "doctor_id.*4"
```
**手动测试接口:**
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-04&period=all" \
-H "token: your-token"
```
## 完整测试流程
### 1. 准备测试数据
```sql
-- 清空医生ID=4的旧排班(可选)
DELETE FROM zyt_doctor_roster WHERE doctor_id = 4 AND date BETWEEN '2026-03-02' AND '2026-03-08';
-- 添加完整的一周排班
INSERT INTO zyt_doctor_roster (
doctor_id,
date,
period,
status,
quota,
max_patients,
booked_count,
remark,
create_time,
update_time
) VALUES
-- 周一 (2026-03-02) - 全天出诊
(4, '2026-03-02', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-02', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周二 (2026-03-03) - 上午出诊,下午休息
(4, '2026-03-03', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-03', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周三 (2026-03-04) - 全天出诊
(4, '2026-03-04', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-04', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周四 (2026-03-05) - 上午停诊,下午出诊
(4, '2026-03-05', 1, 2, 0, 0, 0, '上午停诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-05', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周五 (2026-03-06) - 全天休息
(4, '2026-03-06', 1, 3, 0, 0, 0, '上午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-06', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周六 (2026-03-07) - 全天出诊
(4, '2026-03-07', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-07', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 周日 (2026-03-08) - 全天休息
(4, '2026-03-08', 1, 3, 0, 0, 0, '上午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-08', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
```
### 2. 验证排班数据
```sql
-- 查看一周的排班
SELECT
date,
CASE DAYOFWEEK(date)
WHEN 1 THEN '周日'
WHEN 2 THEN '周一'
WHEN 3 THEN '周二'
WHEN 4 THEN '周三'
WHEN 5 THEN '周四'
WHEN 6 THEN '周五'
WHEN 7 THEN '周六'
END as weekday,
period,
CASE period WHEN 1 THEN '上午' WHEN 2 THEN '下午' END as period_name,
status,
CASE status
WHEN 1 THEN '出诊'
WHEN 2 THEN '停诊'
WHEN 3 THEN '休息'
WHEN 4 THEN '请假'
END as status_name,
quota,
max_patients,
remark
FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date BETWEEN '2026-03-02' AND '2026-03-08'
ORDER BY date, period;
```
**预期结果:**
```
+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+
| date | weekday | period | period_name | status | status_name | quota | max_patients | remark |
+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+
| 2026-03-02 | 周一 | 1 | 上午 | 1 | 出诊 | 20 | 20 | 上午出诊 |
| 2026-03-02 | 周一 | 2 | 下午 | 1 | 出诊 | 20 | 20 | 下午出诊 |
| 2026-03-03 | 周二 | 1 | 上午 | 1 | 出诊 | 20 | 20 | 上午出诊 |
| 2026-03-03 | 周二 | 2 | 下午 | 3 | 休息 | 0 | 0 | 下午休息 |
| 2026-03-04 | 周三 | 1 | 上午 | 1 | 出诊 | 20 | 20 | 上午出诊 |
| 2026-03-04 | 周三 | 2 | 下午 | 1 | 出诊 | 20 | 20 | 下午出诊 |
| 2026-03-05 | 周四 | 1 | 上午 | 2 | 停诊 | 0 | 0 | 上午停诊 |
| 2026-03-05 | 周四 | 2 | 下午 | 1 | 出诊 | 20 | 20 | 下午出诊 |
| 2026-03-06 | 周五 | 1 | 上午 | 3 | 休息 | 0 | 0 | 上午休息 |
| 2026-03-06 | 周五 | 2 | 下午 | 3 | 休息 | 0 | 0 | 下午休息 |
| 2026-03-07 | 周六 | 1 | 上午 | 1 | 出诊 | 20 | 20 | 上午出诊 |
| 2026-03-07 | 周六 | 2 | 下午 | 1 | 出诊 | 20 | 20 | 下午出诊 |
| 2026-03-08 | 周日 | 1 | 上午 | 3 | 休息 | 0 | 0 | 上午休息 |
| 2026-03-08 | 周日 | 2 | 下午 | 3 | 休息 | 0 | 0 | 下午休息 |
+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+
```
### 3. 测试各个日期的预约
#### 测试 2026-03-02(周一,全天出诊)
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-02&period=all" \
-H "token: your-token"
```
**预期:** 返回上午和下午的所有时段(共28个)
#### 测试 2026-03-03(周二,上午出诊下午休息)
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-03&period=all" \
-H "token: your-token"
```
**预期:** 只返回上午时段(共12个)
#### 测试 2026-03-04(周三,全天出诊)
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-04&period=all" \
-H "token: your-token"
```
**预期:** 返回上午和下午的所有时段(共28个)
#### 测试 2026-03-05(周四,上午停诊下午出诊)
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-05&period=all" \
-H "token: your-token"
```
**预期:** 只返回下午时段(共16个)
#### 测试 2026-03-06(周五,全天休息)
```bash
curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-06&period=all" \
-H "token: your-token"
```
**预期:** 返回空数组 `{"slots": []}`
### 4. 前端测试
1. 登录管理后台
2. 进入诊单管理
3. 点击某条诊单的"挂号"按钮
4. 选择医生ID=4
**预期可选日期:**
- ✅ 2026-03-02(周一)
- ✅ 2026-03-03(周二)
- ✅ 2026-03-04(周三)
- ✅ 2026-03-05(周四)
- ❌ 2026-03-06(周五)- 不应出现
- ✅ 2026-03-07(周六)
- ❌ 2026-03-08(周日)- 不应出现
5. 选择 2026-03-04(周三)
**预期时段:**
- ✅ 上午:09:00, 09:15, ..., 11:4512个)
- ✅ 下午:14:00, 14:15, ..., 17:4516个)
- ✅ 总共28个时段
## 常见问题排查
### 问题 12026-03-04 不显示在可选日期中
**原因:** 该日期没有 status=1 的排班
**检查:**
```sql
SELECT * FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date = '2026-03-04'
AND status = 1;
```
**解决:** 添加或修改排班状态
### 问题 2:选择日期后没有时段
**原因:** 排班状态不是出诊
**检查:**
```sql
SELECT
period,
status,
CASE status WHEN 1 THEN '出诊' WHEN 2 THEN '停诊' WHEN 3 THEN '休息' END as status_name
FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date = '2026-03-04';
```
**解决:** 确保 status = 1
### 问题 3:只显示部分时段
**原因:** 只有部分时段是出诊状态
**检查:**
```sql
SELECT
period,
CASE period WHEN 1 THEN '上午' WHEN 2 THEN '下午' END as period_name,
status,
CASE status WHEN 1 THEN '出诊' WHEN 2 THEN '停诊' WHEN 3 THEN '休息' END as status_name
FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date = '2026-03-04';
```
**这是正确的行为:**
- 如果上午出诊,下午休息 → 只显示上午时段
- 如果上午休息,下午出诊 → 只显示下午时段
## 总结
系统的逻辑是正确的:
1. ✅ 排班接口返回所有排班(包括休息、停诊)
2. ✅ 挂号接口只处理出诊状态(status=1)的排班
3. ✅ 休息/停诊的时段不会生成可预约时段
如果医生ID=4在2026-03-04无法预约,请检查:
1. 是否有排班数据
2. 排班状态是否为出诊(status=1)
3. period 值是否为 1 或 2
---
**创建日期:** 2024-03-04
**版本:** 1.0