# 医生排班管理功能说明 ## 数据来源 ### 医生数据 医生数据来自系统管理员表 `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. 排班冲突检测