# 预约系统问题修复指南 ## 问题:没有时间段数据 ### 原因分析 1. ✅ **API参数错误**:前端传 `date`,后端期望 `appointment_date` - 已修复 2. ⏳ **数据库表未创建**:需要执行SQL脚本 3. ⏳ **医生没有排班数据**:需要创建测试数据 ## 修复步骤 ### 步骤1:创建数据库表 ```bash # 执行预约表创建脚本 mysql -u username -p database < server/sql/doctor_appointment.sql ``` ### 步骤2:创建测试排班数据 ```bash # 执行测试数据脚本 mysql -u username -p database < server/sql/test_appointment_data.sql ``` 或者手动执行SQL: ```sql -- 为医生ID=1创建今天和明天的排班 INSERT INTO `la_doctor_roster` (`doctor_id`, `date`, `period`, `status`, `quota`, `max_patients`, `create_time`, `update_time`) VALUES (1, CURDATE(), 'morning', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), (1, CURDATE(), 'afternoon', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), (1, DATE_ADD(CURDATE(), INTERVAL 1 DAY), 'morning', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), (1, DATE_ADD(CURDATE(), INTERVAL 1 DAY), 'afternoon', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()); ``` ### 步骤3:验证数据 ```sql -- 查询医生排班 SELECT * FROM la_doctor_roster WHERE doctor_id = 1 AND date >= CURDATE() ORDER BY date, period; ``` 应该看到类似输出: ``` +----+-----------+------------+---------+--------+-------+--------------+ | id | doctor_id | date | period | status | quota | max_patients | +----+-----------+------------+---------+--------+-------+--------------+ | 1 | 1 | 2026-03-03 | morning | 1 | 10 | 15 | | 2 | 1 | 2026-03-03 | afternoon| 1 | 10 | 15 | +----+-----------+------------+---------+--------+-------+--------------+ ``` ### 步骤4:清除缓存 ```bash cd server php think clear ``` ### 步骤5:测试API ```bash # 测试获取可用时间段 curl "http://localhost/adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-03&period=morning" ``` 预期返回: ```json { "code": 1, "msg": "success", "data": { "slots": [ { "time": "09:00", "available": true, "quota": 10 }, { "time": "09:30", "available": true, "quota": 10 }, ... ] } } ``` ## 前端修复内容 ### 修复1:API参数名称 **文件**: `admin/src/views/tcm/diagnosis/appointment.vue` **修改前**: ```typescript const morningRes = await getAvailableSlots({ doctor_id: selectedDoctorId.value, date: form.date, // ❌ 错误 period: 'morning' }) ``` **修改后**: ```typescript const morningRes = await getAvailableSlots({ doctor_id: selectedDoctorId.value, appointment_date: form.date, // ✅ 正确 period: 'morning' }) ``` ### 修复2:添加调试日志 添加了 `console.log` 输出,方便调试: ```typescript console.log('上午时段:', morningRes) console.log('下午时段:', afternoonRes) console.log('合并后的时间段:', timeSlots.value) ``` ## 调试检查清单 ### 前端检查 - [ ] 打开浏览器开发者工具(F12) - [ ] 打开预约弹窗 - [ ] 选择医生 - [ ] 查看Network标签,找到 `availableSlots` 请求 - [ ] 检查请求参数是否包含 `appointment_date` - [ ] 检查响应数据中是否有 `slots` 数组 ### 后端检查 - [ ] 数据库表 `la_doctor_appointment` 已创建 - [ ] 数据库表 `la_doctor_roster` 有数据 - [ ] 医生排班状态为 1(出诊) - [ ] 日期是今天或未来日期 - [ ] 后端日志没有错误 ### 数据库检查 ```sql -- 1. 检查预约表是否存在 SHOW TABLES LIKE 'la_doctor_appointment'; -- 2. 检查排班表是否存在 SHOW TABLES LIKE 'la_doctor_roster'; -- 3. 检查医生排班数据 SELECT * FROM la_doctor_roster WHERE doctor_id = 1; -- 4. 检查医生是否存在 SELECT id, name FROM la_admin WHERE role_id = 1; ``` ## 常见问题 ### Q1: 返回空数组 `Array(0)` **原因**: - 医生没有排班数据 - 排班状态不是"出诊"(status=1) - 日期不匹配 **解决**: 执行 `test_appointment_data.sql` 创建测试数据 ### Q2: 提示"预约日期不能为空" **原因**: - 前端参数名错误(已修复) - 日期没有被选中 **解决**: - 确保已更新前端代码 - 点击日期按钮选择日期 ### Q3: 控制器不存在 **原因**: 缓存未清除 **解决**: ```bash cd server php think clear ``` ### Q4: 数据库表不存在 **原因**: 未执行SQL脚本 **解决**: ```bash mysql -u username -p database < server/sql/doctor_appointment.sql ``` ## 完整测试流程 1. **创建数据库表** ```bash mysql -u username -p database < server/sql/doctor_appointment.sql ``` 2. **创建测试数据** ```bash mysql -u username -p database < server/sql/test_appointment_data.sql ``` 3. **清除缓存** ```bash cd server && php think clear ``` 4. **刷新前端页面** - 按 Ctrl+F5 强制刷新 - 清除浏览器缓存 5. **测试预约流程** - 打开预约弹窗 - 选择医生(医生2或医生1) - 查看是否显示时间段 - 选择时间段 - 点击确定 6. **查看控制台日志** - 应该看到"上午时段"、"下午时段"、"合并后的时间段"的日志 - 应该看到时间段数组有数据 ## 成功标志 当你看到以下情况时,说明修复成功: 1. ✅ 选择医生后,显示时间段网格 2. ✅ 时间段显示可用号源数量 3. ✅ 可以点击选择时间段 4. ✅ 点击确定后提示"预约成功" 5. ✅ 控制台没有错误信息 --- **最后更新**: 2024-02-26