373 lines
12 KiB
Markdown
373 lines
12 KiB
Markdown
# 挂号预约流程验证指南
|
||
|
||
## 当前问题
|
||
|
||
医生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:45(12个)
|
||
- ✅ 下午:14:00, 14:15, ..., 17:45(16个)
|
||
- ✅ 总共28个时段
|
||
|
||
## 常见问题排查
|
||
|
||
### 问题 1:2026-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
|