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

8.9 KiB
Raw Blame History

预约时段为空问题诊断指南

问题描述

访问接口 /adminapi/doctor.appointment/availableSlots?doctor_id=3&appointment_date=2026-03-06&period=all 返回空数组。

可能的原因

原因 1:医生没有排班数据

检查方法:

SELECT * FROM zyt_doctor_roster 
WHERE doctor_id = 3 
  AND date = '2026-03-06';

如果返回空:

  • 说明医生在该日期没有排班
  • 需要先添加排班数据

解决方案:

-- 添加排班数据
INSERT INTO zyt_doctor_roster (
    doctor_id, 
    date, 
    period, 
    status, 
    quota, 
    max_patients, 
    booked_count,
    create_time, 
    update_time
) VALUES 
(3, '2026-03-06', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),  -- 上午出诊
(3, '2026-03-06', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());  -- 下午出诊

原因 2:排班状态不是"出诊"

检查方法:

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

如果 status 不是 1

  • status = 2(停诊)→ 不会生成时段
  • status = 3(休息)→ 不会生成时段
  • status = 4(请假)→ 不会生成时段

解决方案:

-- 修改排班状态为出诊
UPDATE zyt_doctor_roster 
SET status = 1 
WHERE doctor_id = 3 
  AND date = '2026-03-06';

原因 3period 值不正确

检查方法:

SELECT 
    id,
    date,
    period,
    CASE period
        WHEN 1 THEN '上午'
        WHEN 2 THEN '下午'
        ELSE CONCAT('未知(', period, ')')
    END as period_name,
    status
FROM zyt_doctor_roster 
WHERE doctor_id = 3 
  AND date = '2026-03-06';

如果 period 不是 1 或 2

  • 代码只处理 period = 1(上午)和 period = 2(下午)
  • 其他值会被跳过

解决方案:

-- 修改 period 为正确的值
UPDATE zyt_doctor_roster 
SET period = 1  -- 或 2
WHERE doctor_id = 3 
  AND date = '2026-03-06'
  AND period NOT IN (1, 2);

原因 4:医生ID不存在

检查方法:

-- 检查医生是否存在
SELECT 
    a.id,
    a.name,
    a.account,
    ar.role_id
FROM zyt_admin a
INNER JOIN zyt_admin_role ar ON a.id = ar.admin_id
WHERE a.id = 3
  AND ar.role_id = 1;

如果返回空:

  • 医生ID=3不存在
  • 或者该用户不是医生角色

快速诊断步骤

步骤 1:检查排班数据

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

预期结果:

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

步骤 2:查看日志

# 查看应用日志
tail -f runtime/log/202403/04.log | grep "获取可用时段"

日志示例:

[info] 获取可用时段 - 请求参数 {"doctor_id":3,"date":"2026-03-06","period":"all"}
[info] 查询到的排班数据 {"count":2,"rosters":[...]}
[info] 处理排班时段 {"roster_id":1,"period":1}
[info] 处理排班时段 {"roster_id":2,"period":2}
[info] 生成的时间段数量 {"count":28}

步骤 3:测试接口

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

预期响应(有排班):

{
  "code": 1,
  "msg": "success",
  "data": {
    "slots": [
      {"time": "09:00", "available": true, "quota": 1, "period": 1},
      {"time": "09:15", "available": true, "quota": 1, "period": 1},
      ...
    ]
  }
}

实际响应(无排班):

{
  "code": 1,
  "msg": "success",
  "data": {
    "slots": []
  }
}

解决方案

方案 1:添加排班数据

如果医生没有排班,需要先添加:

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

方案 2:修改排班状态

如果排班存在但状态不对:

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

方案 3:批量添加排班

为医生添加未来7天的排班:

-- 添加未来7天的排班
INSERT INTO zyt_doctor_roster (
    doctor_id, 
    date, 
    period, 
    status, 
    quota, 
    max_patients, 
    booked_count,
    create_time, 
    update_time
) VALUES 
-- 2026-03-04
(3, '2026-03-04', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-04', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 2026-03-05
(3, '2026-03-05', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-05', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 2026-03-06
(3, '2026-03-06', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-06', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 2026-03-07
(3, '2026-03-07', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-07', 2, 3, 0, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),  -- 下午休息
-- 2026-03-08
(3, '2026-03-08', 1, 3, 0, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),  -- 上午休息
(3, '2026-03-08', 2, 3, 0, 0, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),  -- 下午休息
-- 2026-03-09
(3, '2026-03-09', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-09', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
-- 2026-03-10
(3, '2026-03-10', 1, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(3, '2026-03-10', 2, 1, 20, 20, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());

验证修复

1. 检查数据

SELECT 
    date,
    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 = 3
  AND date BETWEEN '2026-03-04' AND '2026-03-10'
ORDER BY date, period;

2. 测试接口

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

3. 前端测试

  1. 登录管理后台
  2. 进入诊单管理
  3. 点击"挂号"
  4. 选择医生ID=3
  5. 选择日期2026-03-06
  6. 查看是否显示时段

常见错误

错误 1:日期格式不对

-- ❌ 错误:使用了错误的日期格式
INSERT INTO zyt_doctor_roster (doctor_id, date, ...) 
VALUES (3, '2026/03/06', ...);

-- ✅ 正确:使用 YYYY-MM-DD 格式
INSERT INTO zyt_doctor_roster (doctor_id, date, ...) 
VALUES (3, '2026-03-06', ...);

错误 2status 值错误

-- ❌ 错误:使用了字符串
UPDATE zyt_doctor_roster SET status = '出诊';

-- ✅ 正确:使用数字
UPDATE zyt_doctor_roster SET status = 1;

错误 3period 值错误

-- ❌ 错误:使用了字符串
INSERT INTO zyt_doctor_roster (period, ...) VALUES ('上午', ...);

-- ✅ 正确:使用数字
INSERT INTO zyt_doctor_roster (period, ...) VALUES (1, ...);

调试工具

使用提供的SQL脚本

# 在数据库客户端中运行
source CHECK_ROSTER_DATA.sql

查看详细日志

代码中已添加详细日志,可以通过以下方式查看:

# 实时查看日志
tail -f runtime/log/202403/04.log

# 搜索特定医生的日志
grep "doctor_id.*3" runtime/log/202403/04.log

# 搜索特定日期的日志
grep "2026-03-06" runtime/log/202403/04.log

总结

最常见的原因是:

  1. 医生没有排班数据
  2. 排班状态不是"出诊"status != 1
  3. period 值不是 1 或 2

解决方法:

  1. 添加排班数据
  2. 修改排班状态为出诊(status = 1)
  3. 确保 period 值为 1(上午)或 2(下午)

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