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

3.9 KiB
Raw Blame History

预约时间段Bug最终调试指南

问题确认

  • 数据库中只有上午排班记录
  • 但前端显示了上午和下午的时间段
  • 测试脚本证明代码逻辑是正确的

调试步骤

步骤1: 确认数据库数据

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: 清除所有缓存

后端缓存

# 清除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测试

curl "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-06&period=all"

检查返回的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: 前端调试

在浏览器控制台查看:

// 应该会看到两行输出
时间段数据: {slots: Array(12)}
处理后的时间段: Array(12)

如果Array的长度大于12,说明返回了下午时段!

可能的原因和解决方案

原因1: 数据库中有多条记录

解决方案: 删除多余的记录

-- 查看所有记录
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字段

-- 检查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: 代码被修改过

解决方案: 检查是否有其他人修改了代码,或者有其他版本的代码在运行

终极测试

运行测试脚本:

php test_slot_generation.php

应该输出:

✓ 测试通过!逻辑正确。

如果测试通过,说明代码逻辑没问题,问题在数据或缓存。

下一步

根据上述调试结果,确定问题所在:

  1. 如果是数据问题 -> 清理数据库
  2. 如果是缓存问题 -> 清除缓存
  3. 如果是代码问题 -> 检查代码版本
  4. 如果都不是 -> 提供日志和API响应,我们继续分析