# 预约时间段Bug最终调试指南 ## 问题确认 - 数据库中只有上午排班记录 - 但前端显示了上午和下午的时间段 - 测试脚本证明代码逻辑是正确的 ## 调试步骤 ### 步骤1: 确认数据库数据 ```sql SELECT id, doctor_id, date, period, status, quota, HEX(period) as period_hex, -- 查看period的十六进制值 LENGTH(period) as period_length -- 查看period的长度 FROM zyt_doctor_roster WHERE doctor_id = 1 AND date = '2026-03-06'; ``` **期望结果:** - 只有1条记录 - period = 'morning' 或 '上午' 或 1 - status = 1 **如果有2条记录,说明数据有问题!** ### 步骤2: 清除所有缓存 #### 后端缓存 ```bash # 清除ThinkPHP缓存 rm -rf runtime/cache/* rm -rf runtime/temp/* ``` #### 前端缓存 1. 浏览器按 Ctrl+Shift+Delete 清除缓存 2. 或者按 Ctrl+Shift+R 强制刷新 3. 或者打开开发者工具 -> Network -> 勾选 "Disable cache" ### 步骤3: 测试API并查看响应 #### 使用浏览器测试 访问: ``` http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-06&period=all ``` #### 使用curl测试 ```bash curl "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-06&period=all" ``` **检查返回的JSON:** ```json { "code": 1, "data": { "slots": [ {"time": "09:00", ...}, {"time": "09:15", ...}, ... {"time": "11:45", ...} ] } } ``` **如果slots数组中有14:00之后的时间,说明后端返回了错误数据!** ### 步骤4: 查看日志 查看文件:`runtime/log/日期.log` 搜索关键字: ``` 该日期所有排班数据(包括非出诊) ``` 日志应该显示: ``` 该日期所有排班数据(包括非出诊): { "count": 1, // 只有1条记录 "all_rosters": [ { "id": 1, "doctor_id": 1, "date": "2026-03-06", "period": "morning", "status": 1, ... } ] } ``` 然后搜索: ``` morning_slots afternoon_slots ``` 应该显示: ``` 生成的时间段数量(去重后): { "count": 12, "morning_slots": 12, "afternoon_slots": 0, ... } ``` **如果afternoon_slots > 0,说明代码生成了下午时段!** ### 步骤5: 前端调试 在浏览器控制台查看: ```javascript // 应该会看到两行输出 时间段数据: {slots: Array(12)} 处理后的时间段: Array(12) ``` **如果Array的长度大于12,说明返回了下午时段!** ## 可能的原因和解决方案 ### 原因1: 数据库中有多条记录 **解决方案:** 删除多余的记录 ```sql -- 查看所有记录 SELECT * FROM zyt_doctor_roster WHERE doctor_id = 1 AND date = '2026-03-06'; -- 如果有下午的记录且不需要,删除它 DELETE FROM zyt_doctor_roster WHERE doctor_id = 1 AND date = '2026-03-06' AND period IN ('afternoon', '下午', '2'); ``` ### 原因2: period字段值异常 **解决方案:** 修正period字段 ```sql -- 检查period字段的实际值 SELECT DISTINCT period, HEX(period), LENGTH(period) FROM zyt_doctor_roster; -- 如果发现异常值,统一修正 UPDATE zyt_doctor_roster SET period = 'morning' WHERE period = '上午'; UPDATE zyt_doctor_roster SET period = 'afternoon' WHERE period = '下午'; ``` ### 原因3: 前端缓存 **解决方案:** 清除浏览器缓存,强制刷新 ### 原因4: 代码被修改过 **解决方案:** 检查是否有其他人修改了代码,或者有其他版本的代码在运行 ## 终极测试 运行测试脚本: ```bash php test_slot_generation.php ``` 应该输出: ``` ✓ 测试通过!逻辑正确。 ``` 如果测试通过,说明代码逻辑没问题,问题在数据或缓存。 ## 下一步 根据上述调试结果,确定问题所在: 1. 如果是数据问题 -> 清理数据库 2. 如果是缓存问题 -> 清除缓存 3. 如果是代码问题 -> 检查代码版本 4. 如果都不是 -> 提供日志和API响应,我们继续分析