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

12 KiB
Raw Blame History

挂号预约流程验证指南

当前问题

医生ID=4在2026-03-04无法显示可预约时段。

验证步骤

步骤 1:检查医生ID=4的排班数据

-- 查看医生ID=4在2026-03-04的排班
SELECT 
    id,
    doctor_id,
    date,
    period,
    CASE period
        WHEN 1 THEN '上午'
        WHEN 2 THEN '下午'
        ELSE CONCAT('未知(', period, ')')
    END as period_name,
    status,
    CASE status
        WHEN 1 THEN '出诊'
        WHEN 2 THEN '停诊'
        WHEN 3 THEN '休息'
        WHEN 4 THEN '请假'
        ELSE CONCAT('未知(', status, ')')
    END as status_name,
    quota,
    max_patients,
    booked_count,
    remark
FROM zyt_doctor_roster
WHERE doctor_id = 4
  AND date = '2026-03-04';

步骤 2:检查预期结果

如果查询结果为空:

Empty set (0.00 sec)

→ 说明没有排班数据,需要添加

如果查询结果显示 status != 1:

+----+-----------+------------+--------+-------------+--------+-------------+
| id | doctor_id | date       | period | period_name | status | status_name |
+----+-----------+------------+--------+-------------+--------+-------------+
| 1  | 4         | 2026-03-04 | 1      | 上午        | 3      | 休息        |
| 2  | 4         | 2026-03-04 | 2      | 下午        | 3      | 休息        |
+----+-----------+------------+--------+-------------+--------+-------------+

→ 说明排班状态是休息,不会生成可预约时段(这是正确的行为)

如果查询结果显示 status = 1:

+----+-----------+------------+--------+-------------+--------+-------------+
| id | doctor_id | date       | period | period_name | status | status_name |
+----+-----------+------------+--------+-------------+--------+-------------+
| 1  | 4         | 2026-03-04 | 1      | 上午        | 1      | 出诊        |
| 2  | 4         | 2026-03-04 | 2      | 下午        | 1      | 出诊        |
+----+-----------+------------+--------+-------------+--------+-------------+

→ 说明排班状态是出诊,应该生成可预约时段

步骤 3:根据结果采取行动

情况 A:没有排班数据

添加排班:

-- 添加医生ID=4在2026-03-04的出诊排班
INSERT INTO zyt_doctor_roster (
    doctor_id, 
    date, 
    period, 
    status, 
    quota, 
    max_patients, 
    booked_count,
    remark,
    create_time, 
    update_time
) VALUES 
-- 上午出诊
(4, '2026-03-04', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 下午出诊
(4, '2026-03-04', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());

情况 B:排班状态不是出诊

如果医生确实应该出诊,修改状态:

-- 将休息/停诊改为出诊
UPDATE zyt_doctor_roster 
SET status = 1,
    remark = '修改为出诊',
    update_time = UNIX_TIMESTAMP()
WHERE doctor_id = 4 
  AND date = '2026-03-04'
  AND status != 1;

如果医生确实休息,这是正确的行为:

  • 不需要修改
  • 系统正确地不显示可预约时段
  • 用户应该选择其他日期或其他医生

情况 C:排班状态是出诊但仍无法预约

检查接口日志:

# 查看日志
tail -f runtime/log/202403/04.log | grep "doctor_id.*4"

手动测试接口:

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-04&period=all" \
  -H "token: your-token"

完整测试流程

1. 准备测试数据

-- 清空医生ID=4的旧排班(可选)
DELETE FROM zyt_doctor_roster WHERE doctor_id = 4 AND date BETWEEN '2026-03-02' AND '2026-03-08';

-- 添加完整的一周排班
INSERT INTO zyt_doctor_roster (
    doctor_id, 
    date, 
    period, 
    status, 
    quota, 
    max_patients, 
    booked_count,
    remark,
    create_time, 
    update_time
) VALUES 
-- 周一 (2026-03-02) - 全天出诊
(4, '2026-03-02', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-02', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周二 (2026-03-03) - 上午出诊,下午休息
(4, '2026-03-03', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-03', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周三 (2026-03-04) - 全天出诊
(4, '2026-03-04', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-04', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周四 (2026-03-05) - 上午停诊,下午出诊
(4, '2026-03-05', 1, 2, 0, 0, 0, '上午停诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-05', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周五 (2026-03-06) - 全天休息
(4, '2026-03-06', 1, 3, 0, 0, 0, '上午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-06', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周六 (2026-03-07) - 全天出诊
(4, '2026-03-07', 1, 1, 20, 20, 0, '上午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-07', 2, 1, 20, 20, 0, '下午出诊', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),

-- 周日 (2026-03-08) - 全天休息
(4, '2026-03-08', 1, 3, 0, 0, 0, '上午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(4, '2026-03-08', 2, 3, 0, 0, 0, '下午休息', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());

2. 验证排班数据

-- 查看一周的排班
SELECT 
    date,
    CASE DAYOFWEEK(date)
        WHEN 1 THEN '周日'
        WHEN 2 THEN '周一'
        WHEN 3 THEN '周二'
        WHEN 4 THEN '周三'
        WHEN 5 THEN '周四'
        WHEN 6 THEN '周五'
        WHEN 7 THEN '周六'
    END as weekday,
    period,
    CASE period WHEN 1 THEN '上午' WHEN 2 THEN '下午' END as period_name,
    status,
    CASE status 
        WHEN 1 THEN '出诊' 
        WHEN 2 THEN '停诊' 
        WHEN 3 THEN '休息' 
        WHEN 4 THEN '请假' 
    END as status_name,
    quota,
    max_patients,
    remark
FROM zyt_doctor_roster
WHERE doctor_id = 4
  AND date BETWEEN '2026-03-02' AND '2026-03-08'
ORDER BY date, period;

预期结果:

+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+
| date       | weekday | period | period_name | status | status_name | quota | max_patients | remark     |
+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+
| 2026-03-02 | 周一    | 1      | 上午        | 1      | 出诊        | 20    | 20           | 上午出诊   |
| 2026-03-02 | 周一    | 2      | 下午        | 1      | 出诊        | 20    | 20           | 下午出诊   |
| 2026-03-03 | 周二    | 1      | 上午        | 1      | 出诊        | 20    | 20           | 上午出诊   |
| 2026-03-03 | 周二    | 2      | 下午        | 3      | 休息        | 0     | 0            | 下午休息   |
| 2026-03-04 | 周三    | 1      | 上午        | 1      | 出诊        | 20    | 20           | 上午出诊   |
| 2026-03-04 | 周三    | 2      | 下午        | 1      | 出诊        | 20    | 20           | 下午出诊   |
| 2026-03-05 | 周四    | 1      | 上午        | 2      | 停诊        | 0     | 0            | 上午停诊   |
| 2026-03-05 | 周四    | 2      | 下午        | 1      | 出诊        | 20    | 20           | 下午出诊   |
| 2026-03-06 | 周五    | 1      | 上午        | 3      | 休息        | 0     | 0            | 上午休息   |
| 2026-03-06 | 周五    | 2      | 下午        | 3      | 休息        | 0     | 0            | 下午休息   |
| 2026-03-07 | 周六    | 1      | 上午        | 1      | 出诊        | 20    | 20           | 上午出诊   |
| 2026-03-07 | 周六    | 2      | 下午        | 1      | 出诊        | 20    | 20           | 下午出诊   |
| 2026-03-08 | 周日    | 1      | 上午        | 3      | 休息        | 0     | 0            | 上午休息   |
| 2026-03-08 | 周日    | 2      | 下午        | 3      | 休息        | 0     | 0            | 下午休息   |
+------------+---------+--------+-------------+--------+-------------+-------+--------------+------------+

3. 测试各个日期的预约

测试 2026-03-02(周一,全天出诊)

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-02&period=all" \
  -H "token: your-token"

预期: 返回上午和下午的所有时段(共28个)

测试 2026-03-03(周二,上午出诊下午休息)

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-03&period=all" \
  -H "token: your-token"

预期: 只返回上午时段(共12个)

测试 2026-03-04(周三,全天出诊)

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-04&period=all" \
  -H "token: your-token"

预期: 返回上午和下午的所有时段(共28个)

测试 2026-03-05(周四,上午停诊下午出诊)

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-05&period=all" \
  -H "token: your-token"

预期: 只返回下午时段(共16个)

测试 2026-03-06(周五,全天休息)

curl -X GET "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=4&appointment_date=2026-03-06&period=all" \
  -H "token: your-token"

预期: 返回空数组 {"slots": []}

4. 前端测试

  1. 登录管理后台
  2. 进入诊单管理
  3. 点击某条诊单的"挂号"按钮
  4. 选择医生ID=4

预期可选日期:

  • 2026-03-02(周一)
  • 2026-03-03(周二)
  • 2026-03-04(周三)
  • 2026-03-05(周四)
  • 2026-03-06(周五)- 不应出现
  • 2026-03-07(周六)
  • 2026-03-08(周日)- 不应出现
  1. 选择 2026-03-04(周三)

预期时段:

  • 上午:09:00, 09:15, ..., 11:4512个)
  • 下午:14:00, 14:15, ..., 17:4516个)
  • 总共28个时段

常见问题排查

问题 1:2026-03-04 不显示在可选日期中

原因: 该日期没有 status=1 的排班

检查:

SELECT * FROM zyt_doctor_roster 
WHERE doctor_id = 4 
  AND date = '2026-03-04' 
  AND status = 1;

解决: 添加或修改排班状态

问题 2:选择日期后没有时段

原因: 排班状态不是出诊

检查:

SELECT 
    period,
    status,
    CASE status WHEN 1 THEN '出诊' WHEN 2 THEN '停诊' WHEN 3 THEN '休息' END as status_name
FROM zyt_doctor_roster 
WHERE doctor_id = 4 
  AND date = '2026-03-04';

解决: 确保 status = 1

问题 3:只显示部分时段

原因: 只有部分时段是出诊状态

检查:

SELECT 
    period,
    CASE period WHEN 1 THEN '上午' WHEN 2 THEN '下午' END as period_name,
    status,
    CASE status WHEN 1 THEN '出诊' WHEN 2 THEN '停诊' WHEN 3 THEN '休息' END as status_name
FROM zyt_doctor_roster 
WHERE doctor_id = 4 
  AND date = '2026-03-04';

这是正确的行为:

  • 如果上午出诊,下午休息 → 只显示上午时段
  • 如果上午休息,下午出诊 → 只显示下午时段

总结

系统的逻辑是正确的:

  1. 排班接口返回所有排班(包括休息、停诊)
  2. 挂号接口只处理出诊状态(status=1)的排班
  3. 休息/停诊的时段不会生成可预约时段

如果医生ID=4在2026-03-04无法预约,请检查:

  1. 是否有排班数据
  2. 排班状态是否为出诊(status=1
  3. period 值是否为 1 或 2

创建日期: 2024-03-04 版本: 1.0