405 lines
8.4 KiB
Markdown
405 lines
8.4 KiB
Markdown
# 医生排班管理功能说明
|
||
|
||
## 数据来源
|
||
|
||
### 医生数据
|
||
|
||
医生数据来自系统管理员表 `zyt_admin`,筛选条件:
|
||
- `role_id = 1`(医生角色)
|
||
- 使用管理员的 `id` 作为医生ID
|
||
- 使用管理员的 `name` 或 `account` 作为医生姓名
|
||
|
||
### 排班数据
|
||
|
||
排班数据存储在 `la_doctor_roster` 表中,通过 `doctor_id` 关联到 `zyt_admin` 表。
|
||
|
||
## 功能特性
|
||
|
||
### 1. 时间维度
|
||
|
||
- 周期:周一至周日,7天
|
||
- 时段:上午、下午(可扩展为全天)
|
||
- 支持按周查询和切换
|
||
|
||
### 2. 排班状态
|
||
|
||
- 出诊:医生正常出诊,可预约
|
||
- 停诊:临时停诊,不可预约
|
||
- 休息:正常休息日
|
||
- 请假:医生请假
|
||
|
||
### 3. 排班规则
|
||
|
||
- 同一医生同一天可排上午、下午其中一个或两个
|
||
- 同一时段可排多名医生
|
||
- 支持设置可预约号源数/最大接诊数
|
||
|
||
### 4. 核心功能
|
||
|
||
- 排班配置:新增、编辑、删除排班
|
||
- 排班展示:周视图展示,直观清晰
|
||
- 排班查询:按医院、科室、医生筛选
|
||
- 排班修改:快速修改排班状态和号源数
|
||
- 批量排班:支持多医生、多日期、多时段批量设置排班
|
||
|
||
## 页面结构
|
||
|
||
### 查询区域
|
||
|
||
- 医院选择
|
||
- 科室选择
|
||
- 医生选择
|
||
- 周选择器
|
||
- 查询/重置按钮
|
||
|
||
### 排班表格
|
||
|
||
- 横向:周一至周日
|
||
- 纵向:医生列表
|
||
- 单元格:上午/下午两个时段
|
||
- 颜色标识:
|
||
- 绿色:出诊
|
||
- 红色:停诊
|
||
- 蓝色:休息
|
||
- 橙色:请假
|
||
- 灰色:未排班
|
||
|
||
### 操作功能
|
||
|
||
- 上一周/下一周:切换周
|
||
- 本周:快速回到当前周
|
||
- 点击单元格:编辑排班
|
||
|
||
## 数据结构
|
||
|
||
### 排班记录
|
||
|
||
```typescript
|
||
interface Roster {
|
||
id: number // 排班ID
|
||
doctor_id: number // 医生ID(对应 zyt_admin 表的 id)
|
||
date: string // 日期 YYYY-MM-DD
|
||
period: string // 时段 morning/afternoon
|
||
status: number // 状态 1-出诊 2-停诊 3-休息 4-请假
|
||
quota: number // 号源数
|
||
max_patients: number // 最大接诊数
|
||
remark: string // 备注
|
||
create_time: string // 创建时间
|
||
update_time: string // 更新时间
|
||
}
|
||
```
|
||
|
||
### 医生信息
|
||
|
||
医生信息来自 `zyt_admin` 表:
|
||
|
||
```typescript
|
||
interface Doctor {
|
||
id: number // 管理员ID(作为医生ID使用)
|
||
name: string // 姓名
|
||
account: string // 账号
|
||
role_id: number // 角色ID(1=医生)
|
||
// ... 其他管理员字段
|
||
}
|
||
```
|
||
|
||
## API 接口
|
||
|
||
### 1. 获取医生列表
|
||
|
||
**接口**: `GET /perms.admin/lists`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"role_id": 1,
|
||
"page_no": 1,
|
||
"page_size": 1000
|
||
}
|
||
```
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"lists": [
|
||
{
|
||
"id": 1,
|
||
"name": "张医生",
|
||
"account": "doctor1",
|
||
"role_id": 1
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 获取排班列表
|
||
|
||
**接口**: `GET /doctor.roster/lists`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"hospital_id": 1,
|
||
"department_id": 2,
|
||
"doctor_id": 3,
|
||
"start_date": "2024-03-04",
|
||
"end_date": "2024-03-10"
|
||
}
|
||
```
|
||
|
||
**返回数据**:
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"lists": [
|
||
{
|
||
"doctor_id": 1,
|
||
"doctor_name": "张医生",
|
||
"department_id": 2,
|
||
"department_name": "内科",
|
||
"rosters": [
|
||
{
|
||
"id": 1,
|
||
"date": "2024-03-04",
|
||
"period": "morning",
|
||
"status": 1,
|
||
"quota": 20,
|
||
"max_patients": 30,
|
||
"remark": ""
|
||
}
|
||
]
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 保存排班
|
||
|
||
**接口**: `POST /doctor.roster/save`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"id": 1,
|
||
"doctor_id": 1,
|
||
"date": "2024-03-04",
|
||
"period": "morning",
|
||
"status": 1,
|
||
"quota": 20,
|
||
"max_patients": 30,
|
||
"remark": ""
|
||
}
|
||
```
|
||
|
||
### 3. 删除排班
|
||
|
||
**接口**: `POST /doctor.roster/delete`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"id": 1
|
||
}
|
||
```
|
||
|
||
### 4. 批量保存排班
|
||
|
||
**接口**: `POST /doctor.roster/batchSave`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"rosters": [
|
||
{
|
||
"doctor_id": 1,
|
||
"date": "2024-03-04",
|
||
"period": "morning",
|
||
"status": 1,
|
||
"quota": 20,
|
||
"max_patients": 30
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### 5. 复制排班
|
||
|
||
**接口**: `POST /doctor.roster/copy`
|
||
|
||
**请求参数**:
|
||
```json
|
||
{
|
||
"source_start_date": "2024-03-04",
|
||
"source_end_date": "2024-03-10",
|
||
"target_start_date": "2024-03-11",
|
||
"doctor_id": 1
|
||
}
|
||
```
|
||
|
||
## 数据库设计
|
||
|
||
### 排班表 (la_doctor_roster)
|
||
|
||
```sql
|
||
CREATE TABLE `la_doctor_roster` (
|
||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||
`doctor_id` int(11) NOT NULL COMMENT '医生ID',
|
||
`hospital_id` int(11) DEFAULT NULL COMMENT '医院ID',
|
||
`department_id` int(11) DEFAULT NULL COMMENT '科室ID',
|
||
`date` date NOT NULL COMMENT '日期',
|
||
`period` varchar(20) NOT NULL COMMENT '时段 morning-上午 afternoon-下午',
|
||
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态 1-出诊 2-停诊 3-休息 4-请假',
|
||
`quota` int(11) DEFAULT '0' COMMENT '号源数',
|
||
`max_patients` int(11) DEFAULT '0' COMMENT '最大接诊数',
|
||
`booked_count` int(11) DEFAULT '0' COMMENT '已预约数',
|
||
`remark` varchar(500) DEFAULT '' COMMENT '备注',
|
||
`create_time` int(11) NOT NULL COMMENT '创建时间',
|
||
`update_time` int(11) NOT NULL COMMENT '更新时间',
|
||
`delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uk_doctor_date_period` (`doctor_id`,`date`,`period`,`delete_time`),
|
||
KEY `idx_date` (`date`),
|
||
KEY `idx_doctor` (`doctor_id`),
|
||
KEY `idx_hospital` (`hospital_id`),
|
||
KEY `idx_department` (`department_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='医生排班表';
|
||
```
|
||
|
||
## 使用流程
|
||
|
||
### 1. 查看排班
|
||
|
||
1. 选择医院、科室、医生(可选)
|
||
2. 选择要查看的周
|
||
3. 点击"查询"按钮
|
||
4. 查看排班表格
|
||
|
||
### 2. 新增排班
|
||
|
||
1. 点击表格中的空白单元格
|
||
2. 在弹窗中设置排班信息:
|
||
- 排班状态
|
||
- 号源数(出诊时)
|
||
- 最大接诊数(出诊时)
|
||
- 备注
|
||
3. 点击"保存"
|
||
|
||
### 3. 编辑排班
|
||
|
||
1. 点击表格中已有排班的单元格
|
||
2. 修改排班信息
|
||
3. 点击"保存"
|
||
|
||
### 4. 删除排班
|
||
|
||
1. 点击表格中已有排班的单元格
|
||
2. 在弹窗中点击"删除排班"
|
||
3. 确认删除
|
||
|
||
### 5. 周切换
|
||
|
||
- 点击"上一周"/"下一周"切换周
|
||
- 点击"本周"快速回到当前周
|
||
- 使用周选择器选择特定周
|
||
|
||
### 6. 批量排班
|
||
|
||
1. 点击"批量排班"按钮
|
||
2. 选择要排班的医生(可多选)
|
||
3. 选择日期范围
|
||
4. 选择时段(上午/下午,可多选)
|
||
5. 选择星期(周一至周日,可多选)
|
||
6. 设置排班状态和号源数
|
||
7. 点击"确定"批量创建排班
|
||
|
||
批量排班会根据选择的条件自动生成所有符合条件的排班记录。例如:
|
||
- 选择2位医生
|
||
- 日期范围:2024-03-04 至 2024-03-10(7天)
|
||
- 时段:上午、下午
|
||
- 星期:周一至周五(5天)
|
||
- 结果:2 × 5 × 2 = 20条排班记录
|
||
|
||
## 扩展功能
|
||
|
||
### 1. 批量操作
|
||
|
||
- 批量设置某医生一周的排班
|
||
- 批量复制排班到其他周
|
||
- 批量导入/导出排班
|
||
|
||
### 2. 统计分析
|
||
|
||
- 医生出诊统计
|
||
- 号源使用率统计
|
||
- 预约情况分析
|
||
|
||
### 3. 提醒功能
|
||
|
||
- 排班冲突提醒
|
||
- 号源不足提醒
|
||
- 排班变更通知
|
||
|
||
### 4. 权限控制
|
||
|
||
- 科室主任:管理本科室排班
|
||
- 医生:查看自己的排班
|
||
- 管理员:管理所有排班
|
||
|
||
## 注意事项
|
||
|
||
1. 同一医生同一天同一时段只能有一条排班记录
|
||
2. 修改排班时需要考虑已有预约
|
||
3. 删除排班前需要检查是否有预约
|
||
4. 号源数不能小于已预约数
|
||
5. 建议提前一周设置排班
|
||
|
||
## 技术要点
|
||
|
||
### 1. 周视图实现
|
||
|
||
使用 dayjs 的 isoWeek 插件实现 ISO 8601 标准的周计算(周一为一周的开始)
|
||
|
||
```typescript
|
||
import dayjs from 'dayjs'
|
||
import isoWeek from 'dayjs/plugin/isoWeek'
|
||
|
||
dayjs.extend(isoWeek)
|
||
|
||
const weekStart = dayjs().startOf('isoWeek')
|
||
```
|
||
|
||
### 2. 数据结构优化
|
||
|
||
后端返回数据按医生分组,每个医生包含其所有排班记录,前端根据日期和时段快速查找
|
||
|
||
### 3. 交互优化
|
||
|
||
- 点击单元格直接编辑
|
||
- 颜色区分不同状态
|
||
- 今日高亮显示
|
||
- 响应式布局
|
||
|
||
### 4. 性能优化
|
||
|
||
- 按周加载数据,减少数据量
|
||
- 使用计算属性缓存结果
|
||
- 防抖处理频繁操作
|
||
|
||
## 后续优化
|
||
|
||
1. 支持全天时段
|
||
2. 支持自定义时段(如夜诊)
|
||
3. 支持排班模板
|
||
4. 支持排班审批流程
|
||
5. 移动端适配
|
||
6. 打印排班表
|
||
7. 排班日历视图
|
||
8. 排班冲突检测
|