12 KiB
12 KiB
挂号预约流程验证指南
当前问题
医生ID=4在2026-03-04无法显示可预约时段。
验证步骤
步骤 1:检查医生ID=4的排班数据
-- 查看医生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:没有排班数据
添加排班:
-- 添加医生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:排班状态不是出诊
如果医生确实应该出诊,修改状态:
-- 将休息/停诊改为出诊
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:排班状态是出诊但仍无法预约
检查接口日志:
# 查看日志
tail -f runtime/log/202403/04.log | grep "doctor_id.*4"
手动测试接口:
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. 准备测试数据
-- 清空医生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. 验证排班数据
-- 查看一周的排班
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(周一,全天出诊)
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(周二,上午出诊下午休息)
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(周三,全天出诊)
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(周四,上午停诊下午出诊)
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(周五,全天休息)
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. 前端测试
- 登录管理后台
- 进入诊单管理
- 点击某条诊单的"挂号"按钮
- 选择医生ID=4
预期可选日期:
- ✅ 2026-03-02(周一)
- ✅ 2026-03-03(周二)
- ✅ 2026-03-04(周三)
- ✅ 2026-03-05(周四)
- ❌ 2026-03-06(周五)- 不应出现
- ✅ 2026-03-07(周六)
- ❌ 2026-03-08(周日)- 不应出现
- 选择 2026-03-04(周三)
预期时段:
- ✅ 上午:09:00, 09:15, ..., 11:45(12个)
- ✅ 下午:14:00, 14:15, ..., 17:45(16个)
- ✅ 总共28个时段
常见问题排查
问题 1:2026-03-04 不显示在可选日期中
原因: 该日期没有 status=1 的排班
检查:
SELECT * FROM zyt_doctor_roster
WHERE doctor_id = 4
AND date = '2026-03-04'
AND status = 1;
解决: 添加或修改排班状态
问题 2:选择日期后没有时段
原因: 排班状态不是出诊
检查:
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:只显示部分时段
原因: 只有部分时段是出诊状态
检查:
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';
这是正确的行为:
- 如果上午出诊,下午休息 → 只显示上午时段
- 如果上午休息,下午出诊 → 只显示下午时段
总结
系统的逻辑是正确的:
- ✅ 排班接口返回所有排班(包括休息、停诊)
- ✅ 挂号接口只处理出诊状态(status=1)的排班
- ✅ 休息/停诊的时段不会生成可预约时段
如果医生ID=4在2026-03-04无法预约,请检查:
- 是否有排班数据
- 排班状态是否为出诊(status=1)
- period 值是否为 1 或 2
创建日期: 2024-03-04 版本: 1.0