# 挂号预约排班状态测试指南 ## 快速测试 ### 准备测试数据 ```sql -- 1. 确保有医生数据 SELECT a.id, a.name, ar.role_id FROM zyt_admin a INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id WHERE ar.role_id = 1; -- 2. 清空测试医生的排班(可选) DELETE FROM zyt_doctor_roster WHERE doctor_id = 1; -- 3. 添加测试排班数据 -- 场景1:周一全天出诊 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2026-03-09', 1, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -- 上午出诊 (1, '2026-03-09', 2, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); -- 下午出诊 -- 场景2:周二上午出诊,下午休息 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2026-03-10', 1, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -- 上午出诊 (1, '2026-03-10', 2, 3, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); -- 下午休息 -- 场景3:周三全天休息 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2026-03-11', 1, 3, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -- 上午休息 (1, '2026-03-11', 2, 3, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); -- 下午休息 -- 场景4:周四上午停诊,下午出诊 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2026-03-12', 1, 2, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), -- 上午停诊 (1, '2026-03-12', 2, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); -- 下午出诊 -- 场景5:周五只有上午出诊 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2026-03-13', 1, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); -- 上午出诊 ``` ## 测试步骤 ### 测试 1:周一全天出诊 1. 登录管理后台 2. 进入诊单管理 3. 点击某条诊单的"挂号"按钮 4. 选择医生(ID=1) 5. 选择日期:2026-03-09(周一) **预期结果:** - ✅ 显示上午时段:09:00, 09:15, 09:30, ..., 11:45(共12个) - ✅ 显示下午时段:14:00, 14:15, 14:30, ..., 17:45(共16个) - ✅ 总共28个时段 ### 测试 2:周二上午出诊,下午休息 1. 选择日期:2026-03-10(周二) **预期结果:** - ✅ 显示上午时段:09:00-11:45(共12个) - ❌ 不显示下午时段 - ✅ 总共12个时段 ### 测试 3:周三全天休息 1. 查看可选日期列表 **预期结果:** - ❌ 2026-03-11(周三)不出现在可选日期列表中 - 💡 如果强制选择该日期,不显示任何时段 ### 测试 4:周四上午停诊,下午出诊 1. 选择日期:2026-03-12(周四) **预期结果:** - ❌ 不显示上午时段 - ✅ 显示下午时段:14:00-17:45(共16个) - ✅ 总共16个时段 ### 测试 5:周五只有上午出诊 1. 选择日期:2026-03-13(周五) **预期结果:** - ✅ 显示上午时段:09:00-11:45(共12个) - ❌ 不显示下午时段 - ✅ 总共12个时段 ## 浏览器控制台测试 打开浏览器开发者工具(F12),在 Network 标签中查看接口请求: ### 1. 查看排班列表请求 ``` GET /adminapi/doctor.roster/lists?doctor_id=1&start_date=2026-03-09&end_date=2026-03-15&status=1 ``` **预期响应:** ```json { "code": 1, "data": { "lists": [ { "id": 1, "doctor_id": 1, "date": "2026-03-09", "period": 1, "status": 1 }, { "id": 2, "doctor_id": 1, "date": "2026-03-09", "period": 2, "status": 1 } // ... 只返回 status=1 的排班 ] } } ``` ### 2. 查看可用时段请求 ``` GET /adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-09&period=all ``` **预期响应(全天出诊):** ```json { "code": 1, "data": { "slots": [ {"time": "09:00", "available": true, "quota": 1, "period": 1}, {"time": "09:15", "available": true, "quota": 1, "period": 1}, // ... 上午时段 {"time": "14:00", "available": true, "quota": 1, "period": 2}, {"time": "14:15", "available": true, "quota": 1, "period": 2} // ... 下午时段 ] } } ``` **预期响应(只有上午出诊):** ```json { "code": 1, "data": { "slots": [ {"time": "09:00", "available": true, "quota": 1, "period": 1}, {"time": "09:15", "available": true, "quota": 1, "period": 1} // ... 只有上午时段 ] } } ``` **预期响应(全天休息):** ```json { "code": 1, "data": { "slots": [] // 空数组 } } ``` ## 功能测试 ### 测试已预约时段 1. 先创建一个预约: ```sql INSERT INTO zyt_doctor_appointment ( doctor_id, patient_id, appointment_date, appointment_time, status, create_time, update_time ) VALUES ( 1, 1, '2026-03-09', '09:00:00', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP() ); ``` 2. 刷新预约页面,选择 2026-03-09 **预期结果:** - ✅ 09:00 时段显示"已约" - ✅ 09:00 时段不可点击 - ✅ 其他时段正常显示"可约" ### 测试预约创建 1. 选择一个可用时段(如 09:15) 2. 填写患者信息 3. 点击"确定预约" **预期结果:** - ✅ 预约创建成功 - ✅ 该时段变为"已约" - ✅ 数据库中有对应记录 ## 边界测试 ### 测试 1:没有排班的医生 ```sql -- 删除医生的所有排班 DELETE FROM zyt_doctor_roster WHERE doctor_id = 1; ``` **预期结果:** - ❌ 没有可选日期 - 💡 提示:该医生暂无排班 ### 测试 2:排班已满 ```sql -- 设置排班的 booked_count = max_patients UPDATE zyt_doctor_roster SET booked_count = max_patients WHERE doctor_id = 1 AND date = '2026-03-09'; ``` **预期结果:** - ⚠️ 这个测试取决于是否实现了号源限制 - 如果实现了,应该显示"已满" ### 测试 3:过期日期 ```sql -- 添加过去的排班 INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, '2024-01-01', 1, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); ``` **预期结果:** - ❌ 过去的日期不出现在可选列表中 - ✅ 只显示未来7天的排班 ## 检查清单 ### 后端检查 - [ ] 接口正确查询 `status = 1` 的排班 - [ ] 根据 `period` 生成对应时段 - [ ] 上午时段:09:00-11:45 - [ ] 下午时段:14:00-17:45 - [ ] 已预约时段正确标记 - [ ] 返回数据格式正确 ### 前端检查 - [ ] 只显示有出诊排班的日期 - [ ] 时段按时间排序 - [ ] 可约时段显示"可约"标签 - [ ] 已约时段显示"已约"标签 - [ ] 已约时段不可点击 - [ ] 选中时段有高亮效果 ### 数据库检查 - [ ] 排班数据正确 - [ ] 预约数据正确 - [ ] 状态值正确(1=出诊) - [ ] 时段值正确(1=上午,2=下午) ## 常见问题 ### 问题 1:显示了休息时段 **原因:** - 后端没有过滤 `status = 1` - 前端没有传递 `status` 参数 **解决:** ```php // 后端确保查询条件 $rosters = Roster::where([ 'doctor_id' => $doctorId, 'date' => $date, 'status' => 1 // 必须有这个条件 ])->select()->toArray(); ``` ### 问题 2:显示了全天时段(9:00-18:00) **原因:** - 没有根据排班的 `period` 生成时段 - 直接生成了全天时段 **解决:** - 检查代码是否使用了修复后的逻辑 - 确保根据 `period` 值生成对应时段 ### 问题 3:没有显示任何时段 **原因:** - 医生没有出诊排班 - 数据库中 `status` 不是 1 **解决:** ```sql -- 检查排班数据 SELECT * FROM zyt_doctor_roster WHERE doctor_id = 1 AND date = '2026-03-09'; -- 确保 status = 1 UPDATE zyt_doctor_roster SET status = 1 WHERE doctor_id = 1 AND date = '2026-03-09'; ``` ## 性能测试 ### 测试大量排班 ```sql -- 添加未来30天的排班 DELIMITER $$ CREATE PROCEDURE add_test_rosters() BEGIN DECLARE i INT DEFAULT 0; DECLARE test_date DATE; WHILE i < 30 DO SET test_date = DATE_ADD(CURDATE(), INTERVAL i DAY); INSERT INTO zyt_doctor_roster (doctor_id, date, period, status, quota, max_patients, create_time, update_time) VALUES (1, test_date, 1, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), (1, test_date, 2, 1, 20, 20, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); SET i = i + 1; END WHILE; END$$ DELIMITER ; CALL add_test_rosters(); DROP PROCEDURE add_test_rosters; ``` **预期结果:** - ✅ 接口响应时间 < 500ms - ✅ 前端渲染流畅 - ✅ 没有性能问题 ## 成功标准 - ✅ 只显示出诊状态的排班 - ✅ 休息/停诊/请假的排班不显示 - ✅ 上午/下午时段正确区分 - ✅ 已预约时段正确标记 - ✅ 用户体验流畅 - ✅ 没有控制台错误 --- **测试日期:** 2024-03-04 **版本:** 1.0