8.9 KiB
8.9 KiB
挂号预约排班状态测试指南
快速测试
准备测试数据
-- 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:周一全天出诊
- 登录管理后台
- 进入诊单管理
- 点击某条诊单的"挂号"按钮
- 选择医生(ID=1)
- 选择日期:2026-03-09(周一)
预期结果:
- ✅ 显示上午时段:09:00, 09:15, 09:30, ..., 11:45(共12个)
- ✅ 显示下午时段:14:00, 14:15, 14:30, ..., 17:45(共16个)
- ✅ 总共28个时段
测试 2:周二上午出诊,下午休息
- 选择日期:2026-03-10(周二)
预期结果:
- ✅ 显示上午时段:09:00-11:45(共12个)
- ❌ 不显示下午时段
- ✅ 总共12个时段
测试 3:周三全天休息
- 查看可选日期列表
预期结果:
- ❌ 2026-03-11(周三)不出现在可选日期列表中
- 💡 如果强制选择该日期,不显示任何时段
测试 4:周四上午停诊,下午出诊
- 选择日期:2026-03-12(周四)
预期结果:
- ❌ 不显示上午时段
- ✅ 显示下午时段:14:00-17:45(共16个)
- ✅ 总共16个时段
测试 5:周五只有上午出诊
- 选择日期: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
预期响应:
{
"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
预期响应(全天出诊):
{
"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}
// ... 下午时段
]
}
}
预期响应(只有上午出诊):
{
"code": 1,
"data": {
"slots": [
{"time": "09:00", "available": true, "quota": 1, "period": 1},
{"time": "09:15", "available": true, "quota": 1, "period": 1}
// ... 只有上午时段
]
}
}
预期响应(全天休息):
{
"code": 1,
"data": {
"slots": [] // 空数组
}
}
功能测试
测试已预约时段
- 先创建一个预约:
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()
);
- 刷新预约页面,选择 2026-03-09
预期结果:
- ✅ 09:00 时段显示"已约"
- ✅ 09:00 时段不可点击
- ✅ 其他时段正常显示"可约"
测试预约创建
- 选择一个可用时段(如 09:15)
- 填写患者信息
- 点击"确定预约"
预期结果:
- ✅ 预约创建成功
- ✅ 该时段变为"已约"
- ✅ 数据库中有对应记录
边界测试
测试 1:没有排班的医生
-- 删除医生的所有排班
DELETE FROM zyt_doctor_roster WHERE doctor_id = 1;
预期结果:
- ❌ 没有可选日期
- 💡 提示:该医生暂无排班
测试 2:排班已满
-- 设置排班的 booked_count = max_patients
UPDATE zyt_doctor_roster
SET booked_count = max_patients
WHERE doctor_id = 1 AND date = '2026-03-09';
预期结果:
- ⚠️ 这个测试取决于是否实现了号源限制
- 如果实现了,应该显示"已满"
测试 3:过期日期
-- 添加过去的排班
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参数
解决:
// 后端确保查询条件
$rosters = Roster::where([
'doctor_id' => $doctorId,
'date' => $date,
'status' => 1 // 必须有这个条件
])->select()->toArray();
问题 2:显示了全天时段(9:00-18:00)
原因:
- 没有根据排班的
period生成时段 - 直接生成了全天时段
解决:
- 检查代码是否使用了修复后的逻辑
- 确保根据
period值生成对应时段
问题 3:没有显示任何时段
原因:
- 医生没有出诊排班
- 数据库中
status不是 1
解决:
-- 检查排班数据
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';
性能测试
测试大量排班
-- 添加未来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