7.8 KiB
7.8 KiB
医生预约系统 - 完整实现总结
🎉 实现完成
已成功实现完整的医生预约挂号系统,包括前端界面和后端API。
📁 创建的文件清单
后端文件 (PHP/ThinkPHP)
-
数据模型
server/app/common/model/doctor/Appointment.php
-
控制器
server/app/adminapi/controller/doctor/AppointmentController.php
-
业务逻辑
server/app/adminapi/logic/doctor/AppointmentLogic.php
-
验证器
server/app/adminapi/validate/doctor/AppointmentValidate.php
-
数据列表
server/app/adminapi/lists/doctor/AppointmentLists.php
-
数据库脚本
server/sql/doctor_appointment.sql
-
文档
server/APPOINTMENT_BACKEND_SETUP.mdserver/test_appointment_api.php
前端文件 (Vue3/TypeScript)
-
API接口
admin/src/api/doctor.ts(已更新)
-
组件
admin/src/views/tcm/diagnosis/appointment.vue(新建)admin/src/views/tcm/diagnosis/index.vue(已更新)
-
文档
admin/APPOINTMENT_SYSTEM.mdadmin/APPOINTMENT_UI_UPDATE.mdadmin/APPOINTMENT_IMPLEMENTATION_SUMMARY.md
安装脚本
-
Windows
install_appointment_system.bat
-
Linux/Mac
install_appointment_system.sh
文档
-
快速开始
APPOINTMENT_QUICK_START.md
-
完整总结
APPOINTMENT_COMPLETE.md(本文件)
🚀 快速安装
方法1: 使用安装脚本
Windows:
install_appointment_system.bat
Linux/Mac:
chmod +x install_appointment_system.sh
./install_appointment_system.sh
方法2: 手动安装
- 创建数据库表
mysql -u username -p database < server/sql/doctor_appointment.sql
- 清除缓存
cd server
php think clear
- 验证安装
# 访问API测试
curl "http://your-domain/adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-04&period=morning"
📊 功能特性
前端功能
✅ 预约方式选择
- 选择时段预约有专医生
- 选择医生预约有专时段
✅ 患者信息显示
- 显示患者姓名、性别、年龄
- 显示上次就诊记录
✅ 医生选择
- 单选按钮形式
- 显示可用号源数量标签
- 绿色数字(有号源) / 灰色"无"(无号源)
✅ 日期选择
- 横向按钮布局
- 显示未来7天
- 格式: 02月26日 (四)
✅ 时间段选择
- 4列网格布局
- 30分钟间隔
- 显示可用号源数量
- 可用/不可用/已选择三种状态
✅ 表单验证
- 必填项验证
- 实时错误提示
后端功能
✅ 时间段管理
- 自动生成30分钟间隔时间段
- 上午: 09:00-11:30
- 下午: 13:00-20:30
✅ 排班检查
- 验证医生排班存在
- 检查排班状态(出诊/停诊/休息)
- 号源数量控制
✅ 预约管理
- 创建预约
- 取消预约
- 预约列表
- 预约详情
✅ 冲突检查
- 时间段重复检查
- 号源数量限制
- 数据库唯一索引防并发
✅ 数据统计
- 医生可用号源统计
- 预约数量统计
🔌 API接口
1. 获取可用时间段
GET /adminapi/doctor.appointment/availableSlots
参数: doctor_id, appointment_date, period
返回: { slots: [{ time, available, quota }] }
2. 创建预约
POST /adminapi/doctor.appointment/create
参数: patient_id, doctor_id, appointment_date, period, appointment_time
返回: { id }
3. 取消预约
POST /adminapi/doctor.appointment/cancel
参数: id
返回: success
4. 预约列表
GET /adminapi/doctor.appointment/lists
参数: page_no, page_size, patient_id, doctor_id, status
返回: { lists, count }
5. 预约详情
GET /adminapi/doctor.appointment/detail
参数: id
返回: appointment object
6. 医生可用号源
GET /adminapi/doctor.appointment/doctorAvailability
参数: doctor_id, date
返回: { available_count }
💾 数据库设计
la_doctor_appointment 表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | int(11) | 主键 |
| patient_id | int(11) | 患者ID |
| doctor_id | int(11) | 医生ID |
| roster_id | int(11) | 排班ID |
| appointment_date | date | 预约日期 |
| period | enum | 时段(morning/afternoon) |
| appointment_time | time | 预约时间 |
| appointment_type | varchar(20) | 预约类型(video/text/phone) |
| status | tinyint(1) | 状态(1=已预约,2=已取消,3=已完成) |
| remark | varchar(500) | 备注 |
| create_time | int(10) | 创建时间 |
| update_time | int(10) | 更新时间 |
索引:
- PRIMARY KEY (id)
- UNIQUE KEY (doctor_id, appointment_date, appointment_time, status)
- KEY (patient_id)
- KEY (doctor_id, appointment_date)
- KEY (roster_id)
🔒 业务规则
-
预约条件
- 医生必须有排班
- 排班状态必须为"出诊"(status=1)
- 时间段不能重复预约
- 预约数量不能超过号源数
-
时间规则
- 时间段间隔: 30分钟
- 上午时段: 09:00-11:30
- 下午时段: 13:00-20:30
-
并发控制
- 数据库唯一索引防止重复预约
- 事务处理确保数据一致性
-
状态管理
- 1: 已预约 (有效预约)
- 2: 已取消 (不占用号源)
- 3: 已完成 (历史记录)
🧪 测试
准备测试数据
-- 创建医生排班
INSERT INTO `la_doctor_roster`
(`doctor_id`, `date`, `period`, `status`, `quota`, `max_patients`, `create_time`, `update_time`)
VALUES
(1, '2026-03-04', 'morning', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(1, '2026-03-04', 'afternoon', 1, 10, 15, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
测试API
# 使用测试脚本
cd server
php test_appointment_api.php
测试前端
- 登录后台管理系统
- 进入"中医诊断"页面
- 点击患者的"挂号"按钮
- 完成预约流程
📝 权限配置
在后台权限管理中添加:
doctor.appointment/availableSlots - 查看可用时间段
doctor.appointment/create - 创建预约
doctor.appointment/cancel - 取消预约
doctor.appointment/lists - 预约列表
doctor.appointment/detail - 预约详情
doctor.appointment/doctorAvailability - 医生可用号源
🐛 故障排查
控制器不存在
cd server
php think clear
数据库表不存在
mysql -u username -p database < server/sql/doctor_appointment.sql
没有可用时间段
检查:
- 医生排班是否存在
- 排班状态是否为"出诊"(status=1)
- 号源是否已满
TypeScript错误
cd admin
npm run build
📚 文档索引
| 文档 | 说明 |
|---|---|
| APPOINTMENT_QUICK_START.md | 快速开始指南 |
| server/APPOINTMENT_BACKEND_SETUP.md | 后端详细安装说明 |
| admin/APPOINTMENT_SYSTEM.md | 系统设计文档 |
| admin/APPOINTMENT_UI_UPDATE.md | UI更新说明 |
| admin/APPOINTMENT_IMPLEMENTATION_SUMMARY.md | 前端实现总结 |
✅ 完成清单
- 数据库表设计
- 后端模型创建
- 后端控制器实现
- 后端业务逻辑
- 后端数据验证
- 前端API接口
- 前端预约组件
- 前端集成
- 安装脚本
- 测试脚本
- 完整文档
- 数据库表创建 (需手动执行)
- 权限配置 (需手动配置)
- 功能测试 (需手动测试)
🎯 下一步
-
立即执行
- 运行安装脚本创建数据库表
- 清除后端缓存
- 配置权限节点
-
测试验证
- 创建测试排班数据
- 测试API接口
- 测试前端功能
-
上线准备
- 备份数据库
- 配置生产环境
- 培训用户
🔧 技术栈
后端:
- PHP 7.2+
- ThinkPHP 6.0
- MySQL 5.7+
前端:
- Vue 3
- TypeScript
- Element Plus
- Vite
📞 支持
如遇问题:
- 查看相关文档
- 检查错误日志
- 验证环境配置
- 查看测试脚本输出
版本: 1.0.0
状态: ✅ 开发完成,等待部署
创建时间: 2024-02-26
最后更新: 2024-02-26