Files
zyt/APPOINTMENT_STATUS_TEST.md
T
2026-03-04 15:32:30 +08:00

382 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 挂号预约排班状态测试指南
## 快速测试
### 准备测试数据
```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