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

8.9 KiB
Raw Blame History

挂号预约排班状态测试指南

快速测试

准备测试数据

-- 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

预期响应:

{
  "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": []  // 空数组
  }
}

功能测试

测试已预约时段

  1. 先创建一个预约:
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()
);
  1. 刷新预约页面,选择 2026-03-09

预期结果:

  • 09:00 时段显示"已约"
  • 09:00 时段不可点击
  • 其他时段正常显示"可约"

测试预约创建

  1. 选择一个可用时段(如 09:15
  2. 填写患者信息
  3. 点击"确定预约"

预期结果:

  • 预约创建成功
  • 该时段变为"已约"
  • 数据库中有对应记录

边界测试

测试 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