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

2.7 KiB
Raw Blame History

测试预约时间段生成逻辑

测试场景

医生1在2026-03-06只有上午排班,下午未排班

数据库预期状态

-- 应该只有这一条记录
SELECT * FROM zyt_doctor_roster 
WHERE doctor_id = 1 AND date = '2026-03-06';

-- 预期结果:
-- id | doctor_id | date       | period  | status | quota
-- 1  | 1         | 2026-03-06 | morning | 1      | 20

API测试

GET /adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-06&period=all

预期返回(正确)

{
  "slots": [
    {"time": "09:00", "available": true, "quota": 1, "period": "morning"},
    {"time": "09:15", "available": true, "quota": 1, "period": "morning"},
    ...
    {"time": "11:45", "available": true, "quota": 1, "period": "morning"}
  ]
}

总共应该有 12个时间段(9:00-12:00,每15分钟一个)

错误返回(当前bug

{
  "slots": [
    {"time": "09:00", ...},
    ...
    {"time": "11:45", ...},
    {"time": "14:00", ...},  // ❌ 不应该有下午时段
    ...
    {"time": "17:45", ...}   // ❌ 不应该有下午时段
  ]
}

调试步骤

1. 检查数据库

运行SQL查看实际数据:

SELECT id, doctor_id, date, period, status, quota, create_time
FROM zyt_doctor_roster
WHERE doctor_id = 1 AND date = '2026-03-06'
ORDER BY period;

2. 检查日志

查看 runtime/log/ 中的日志,搜索:

  • "该日期所有排班数据(包括非出诊)"
  • "处理排班时段"

3. 临时调试代码

AppointmentLogic.phpgetAvailableSlots 方法中,在返回前添加:

\think\facade\Log::info('最终生成的时间段', [
    'total_count' => count($slots),
    'morning_count' => count(array_filter($slots, function($s) { 
        return strtotime($s['time']) < strtotime('12:00'); 
    })),
    'afternoon_count' => count(array_filter($slots, function($s) { 
        return strtotime($s['time']) >= strtotime('14:00'); 
    })),
    'first_5_slots' => array_slice($slots, 0, 5),
    'last_5_slots' => array_slice($slots, -5)
]);

可能的bug原因

假设1: 数据库中实际有两条记录

如果数据库中有:

  • period='morning', status=1
  • period='afternoon', status=1 (或其他值)

那么查询 WHERE status=1 可能会返回两条记录。

假设2: period字段值不一致

如果数据库中的period值是其他格式,比如:

  • period='all' 或 period='1,2'

那么代码可能会错误地生成两个时段。

假设3: 前端缓存

前端可能缓存了之前的数据。

解决方案

如果确认数据库中只有上午记录,但仍然生成了下午时段,那么问题在代码逻辑中。

需要在代码中添加更详细的日志,追踪每一步的数据变化。