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

405 lines
8.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 医生排班管理功能说明
## 数据来源
### 医生数据
医生数据来自系统管理员表 `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 // 角色ID1=医生)
// ... 其他管理员字段
}
```
## 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-107天)
- 时段:上午、下午
- 星期:周一至周五(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. 排班冲突检测