382 lines
8.9 KiB
Markdown
382 lines
8.9 KiB
Markdown
# 挂号预约排班状态测试指南
|
||
|
||
## 快速测试
|
||
|
||
### 准备测试数据
|
||
|
||
```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
|