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

402 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.
# 预约时段为空问题诊断指南
## 问题描述
访问接口 `/adminapi/doctor.appointment/availableSlots?doctor_id=3&appointment_date=2026-03-06&period=all` 返回空数组。
## 可能的原因
### 原因 1:医生没有排班数据
**检查方法:**
```sql
SELECT * FROM zyt_doctor_roster
WHERE doctor_id = 3
AND date = '2026-03-06';
```
**如果返回空:**
- 说明医生在该日期没有排班
- 需要先添加排班数据
**解决方案:**
```sql
-- 添加排班数据
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:排班状态不是"出诊"
**检查方法:**
```sql
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(请假)→ 不会生成时段
**解决方案:**
```sql
-- 修改排班状态为出诊
UPDATE zyt_doctor_roster
SET status = 1
WHERE doctor_id = 3
AND date = '2026-03-06';
```
### 原因 3period 值不正确
**检查方法:**
```sql
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(下午)
- 其他值会被跳过
**解决方案:**
```sql
-- 修改 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不存在
**检查方法:**
```sql
-- 检查医生是否存在
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:检查排班数据
```sql
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:查看日志
```bash
# 查看应用日志
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:测试接口
```bash
# 使用 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"
```
**预期响应(有排班):**
```json
{
"code": 1,
"msg": "success",
"data": {
"slots": [
{"time": "09:00", "available": true, "quota": 1, "period": 1},
{"time": "09:15", "available": true, "quota": 1, "period": 1},
...
]
}
}
```
**实际响应(无排班):**
```json
{
"code": 1,
"msg": "success",
"data": {
"slots": []
}
}
```
## 解决方案
### 方案 1:添加排班数据
如果医生没有排班,需要先添加:
```sql
-- 添加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:修改排班状态
如果排班存在但状态不对:
```sql
-- 将休息/停诊改为出诊
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天的排班:
```sql
-- 添加未来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. 检查数据
```sql
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. 测试接口
```bash
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:日期格式不对
```sql
-- ❌ 错误:使用了错误的日期格式
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 值错误
```sql
-- ❌ 错误:使用了字符串
UPDATE zyt_doctor_roster SET status = '出诊';
-- ✅ 正确:使用数字
UPDATE zyt_doctor_roster SET status = 1;
```
### 错误 3period 值错误
```sql
-- ❌ 错误:使用了字符串
INSERT INTO zyt_doctor_roster (period, ...) VALUES ('上午', ...);
-- ✅ 正确:使用数字
INSERT INTO zyt_doctor_roster (period, ...) VALUES (1, ...);
```
## 调试工具
### 使用提供的SQL脚本
```bash
# 在数据库客户端中运行
source CHECK_ROSTER_DATA.sql
```
### 查看详细日志
代码中已添加详细日志,可以通过以下方式查看:
```bash
# 实时查看日志
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