新增功能

This commit is contained in:
Your Name
2026-03-04 15:32:30 +08:00
parent a07e844c47
commit ab77f5488d
2266 changed files with 177942 additions and 3444 deletions
+381
View File
@@ -0,0 +1,381 @@
# 挂号预约排班状态测试指南
## 快速测试
### 准备测试数据
```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