380 lines
7.8 KiB
Markdown
380 lines
7.8 KiB
Markdown
# 医生预约系统后端安装说明
|
||
|
||
## 文件清单
|
||
|
||
已创建以下后端文件:
|
||
|
||
### 1. 数据库模型
|
||
- `server/app/common/model/doctor/Appointment.php` - 预约模型
|
||
|
||
### 2. 控制器
|
||
- `server/app/adminapi/controller/doctor/AppointmentController.php` - 预约控制器
|
||
|
||
### 3. 业务逻辑层
|
||
- `server/app/adminapi/logic/doctor/AppointmentLogic.php` - 预约业务逻辑
|
||
|
||
### 4. 验证器
|
||
- `server/app/adminapi/validate/doctor/AppointmentValidate.php` - 预约数据验证
|
||
|
||
### 5. 数据列表
|
||
- `server/app/adminapi/lists/doctor/AppointmentLists.php` - 预约列表
|
||
|
||
### 6. 数据库脚本
|
||
- `server/sql/doctor_appointment.sql` - 数据库表创建脚本
|
||
|
||
## 安装步骤
|
||
|
||
### 1. 创建数据库表
|
||
|
||
在MySQL中执行以下SQL脚本:
|
||
|
||
```bash
|
||
mysql -u your_username -p your_database < server/sql/doctor_appointment.sql
|
||
```
|
||
|
||
或者在phpMyAdmin中导入 `server/sql/doctor_appointment.sql` 文件。
|
||
|
||
### 2. 验证文件
|
||
|
||
确认所有文件已正确创建:
|
||
|
||
```bash
|
||
# 检查模型
|
||
ls -la server/app/common/model/doctor/Appointment.php
|
||
|
||
# 检查控制器
|
||
ls -la server/app/adminapi/controller/doctor/AppointmentController.php
|
||
|
||
# 检查逻辑层
|
||
ls -la server/app/adminapi/logic/doctor/AppointmentLogic.php
|
||
|
||
# 检查验证器
|
||
ls -la server/app/adminapi/validate/doctor/AppointmentValidate.php
|
||
|
||
# 检查列表
|
||
ls -la server/app/adminapi/lists/doctor/AppointmentLists.php
|
||
```
|
||
|
||
### 3. 清除缓存
|
||
|
||
```bash
|
||
cd server
|
||
php think clear
|
||
```
|
||
|
||
### 4. 测试API接口
|
||
|
||
#### 4.1 获取可用时间段
|
||
|
||
```bash
|
||
GET /adminapi/doctor.appointment/availableSlots?doctor_id=1&appointment_date=2026-03-04&period=morning
|
||
```
|
||
|
||
预期返回:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"slots": [
|
||
{
|
||
"time": "09:00",
|
||
"available": true,
|
||
"quota": 5
|
||
},
|
||
...
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4.2 创建预约
|
||
|
||
```bash
|
||
POST /adminapi/doctor.appointment/create
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"patient_id": 1,
|
||
"doctor_id": 1,
|
||
"appointment_date": "2026-03-04",
|
||
"period": "morning",
|
||
"appointment_time": "09:00",
|
||
"appointment_type": "video",
|
||
"remark": "测试预约"
|
||
}
|
||
```
|
||
|
||
预期返回:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "预约成功",
|
||
"data": {
|
||
"id": 1
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 4.3 获取预约列表
|
||
|
||
```bash
|
||
GET /adminapi/doctor.appointment/lists?page_no=1&page_size=10
|
||
```
|
||
|
||
#### 4.4 取消预约
|
||
|
||
```bash
|
||
POST /adminapi/doctor.appointment/cancel
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"id": 1
|
||
}
|
||
```
|
||
|
||
#### 4.5 获取医生可用号源数
|
||
|
||
```bash
|
||
GET /adminapi/doctor.appointment/doctorAvailability?doctor_id=1&date=2026-03-04
|
||
```
|
||
|
||
预期返回:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"available_count": 10
|
||
}
|
||
}
|
||
```
|
||
|
||
## API接口说明
|
||
|
||
### 1. 获取可用时间段
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/availableSlots`
|
||
|
||
**请求方式**: GET
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| doctor_id | int | 是 | 医生ID |
|
||
| appointment_date | date | 是 | 预约日期 YYYY-MM-DD |
|
||
| period | string | 是 | 时段 morning/afternoon |
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"slots": [
|
||
{
|
||
"time": "09:00",
|
||
"available": true,
|
||
"quota": 5
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 2. 创建预约
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/create`
|
||
|
||
**请求方式**: POST
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| patient_id | int | 是 | 患者ID |
|
||
| doctor_id | int | 是 | 医生ID |
|
||
| appointment_date | date | 是 | 预约日期 |
|
||
| period | string | 是 | 时段 morning/afternoon |
|
||
| appointment_time | time | 是 | 预约时间 HH:mm |
|
||
| appointment_type | string | 否 | 预约类型 video/text/phone |
|
||
| remark | string | 否 | 备注 |
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"id": 1
|
||
}
|
||
```
|
||
|
||
### 3. 取消预约
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/cancel`
|
||
|
||
**请求方式**: POST
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| id | int | 是 | 预约ID |
|
||
|
||
### 4. 预约列表
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/lists`
|
||
|
||
**请求方式**: GET
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| page_no | int | 否 | 页码 |
|
||
| page_size | int | 否 | 每页数量 |
|
||
| patient_id | int | 否 | 患者ID |
|
||
| doctor_id | int | 否 | 医生ID |
|
||
| status | int | 否 | 状态 |
|
||
| appointment_date | date | 否 | 预约日期 |
|
||
|
||
### 5. 预约详情
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/detail`
|
||
|
||
**请求方式**: GET
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| id | int | 是 | 预约ID |
|
||
|
||
### 6. 医生可用号源数
|
||
|
||
**接口地址**: `/adminapi/doctor.appointment/doctorAvailability`
|
||
|
||
**请求方式**: GET
|
||
|
||
**请求参数**:
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| doctor_id | int | 是 | 医生ID |
|
||
| date | date | 是 | 日期 YYYY-MM-DD |
|
||
|
||
## 业务逻辑说明
|
||
|
||
### 1. 时间段生成规则
|
||
|
||
- 上午时段:09:00 - 11:30(30分钟间隔)
|
||
- 下午时段:13:00 - 20:30(30分钟间隔)
|
||
|
||
### 2. 预约规则
|
||
|
||
1. 必须有医生排班且状态为"出诊"(status=1)
|
||
2. 时间段不能重复预约
|
||
3. 预约数量不能超过排班设置的号源数(quota)
|
||
4. 使用数据库唯一索引防止并发冲突
|
||
|
||
### 3. 状态说明
|
||
|
||
**预约状态**:
|
||
- 1: 已预约
|
||
- 2: 已取消
|
||
- 3: 已完成
|
||
|
||
**排班状态**:
|
||
- 1: 出诊
|
||
- 2: 停诊
|
||
- 3: 休息
|
||
- 4: 请假
|
||
|
||
## 注意事项
|
||
|
||
1. **并发控制**: 使用数据库唯一索引 `unique_appointment` 防止重复预约
|
||
2. **事务处理**: 创建预约时使用事务确保数据一致性
|
||
3. **时间格式**:
|
||
- 日期格式:YYYY-MM-DD
|
||
- 时间格式:HH:mm
|
||
- 时间戳:整型(秒)
|
||
4. **权限控制**: 需要在后台权限管理中添加相应的权限节点
|
||
|
||
## 权限节点
|
||
|
||
建议添加以下权限节点:
|
||
|
||
```
|
||
doctor.appointment/availableSlots - 查看可用时间段
|
||
doctor.appointment/create - 创建预约
|
||
doctor.appointment/cancel - 取消预约
|
||
doctor.appointment/lists - 预约列表
|
||
doctor.appointment/detail - 预约详情
|
||
doctor.appointment/doctorAvailability - 医生可用号源
|
||
```
|
||
|
||
## 故障排查
|
||
|
||
### 1. 控制器不存在
|
||
|
||
**错误**: `控制器不存在: app\adminapi\controller\doctor\AppointmentController`
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 清除缓存
|
||
cd server
|
||
php think clear
|
||
|
||
# 检查文件是否存在
|
||
ls -la server/app/adminapi/controller/doctor/AppointmentController.php
|
||
|
||
# 检查命名空间是否正确
|
||
head -n 5 server/app/adminapi/controller/doctor/AppointmentController.php
|
||
```
|
||
|
||
### 2. 数据库表不存在
|
||
|
||
**错误**: `Table 'database.la_doctor_appointment' doesn't exist`
|
||
|
||
**解决方案**:
|
||
```bash
|
||
# 执行SQL脚本
|
||
mysql -u username -p database < server/sql/doctor_appointment.sql
|
||
|
||
# 或在MySQL中手动执行
|
||
mysql> source /path/to/server/sql/doctor_appointment.sql;
|
||
```
|
||
|
||
### 3. 参数验证失败
|
||
|
||
**错误**: `参数错误`
|
||
|
||
**解决方案**:
|
||
- 检查请求参数是否完整
|
||
- 检查参数类型是否正确
|
||
- 查看验证器规则是否匹配
|
||
|
||
## 测试数据
|
||
|
||
### 创建测试排班
|
||
|
||
```sql
|
||
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());
|
||
```
|
||
|
||
### 创建测试预约
|
||
|
||
```sql
|
||
INSERT INTO `la_doctor_appointment` (`patient_id`, `doctor_id`, `roster_id`, `appointment_date`, `period`, `appointment_time`, `appointment_type`, `status`, `create_time`, `update_time`)
|
||
VALUES
|
||
(1, 1, 1, '2026-03-04', 'morning', '09:00:00', 'video', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
|
||
```
|
||
|
||
## 完成状态
|
||
|
||
✅ 数据库模型创建完成
|
||
✅ 控制器创建完成
|
||
✅ 业务逻辑层创建完成
|
||
✅ 验证器创建完成
|
||
✅ 数据列表创建完成
|
||
✅ SQL脚本创建完成
|
||
⏳ 等待数据库表创建
|
||
⏳ 等待接口测试
|
||
|
||
---
|
||
|
||
**创建时间**: 2024-02-26
|
||
**最后更新**: 2024-02-26
|