# 挂号预约流程验证指南 ## 当前问题 医生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