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

8.4 KiB
Raw Permalink Blame History

医生排班管理功能说明

数据来源

医生数据

医生数据来自系统管理员表 zyt_admin,筛选条件:

  • role_id = 1(医生角色)
  • 使用管理员的 id 作为医生ID
  • 使用管理员的 nameaccount 作为医生姓名

排班数据

排班数据存储在 la_doctor_roster 表中,通过 doctor_id 关联到 zyt_admin 表。

功能特性

1. 时间维度

  • 周期:周一至周日,7天
  • 时段:上午、下午(可扩展为全天)
  • 支持按周查询和切换

2. 排班状态

  • 出诊:医生正常出诊,可预约
  • 停诊:临时停诊,不可预约
  • 休息:正常休息日
  • 请假:医生请假

3. 排班规则

  • 同一医生同一天可排上午、下午其中一个或两个
  • 同一时段可排多名医生
  • 支持设置可预约号源数/最大接诊数

4. 核心功能

  • 排班配置:新增、编辑、删除排班
  • 排班展示:周视图展示,直观清晰
  • 排班查询:按医院、科室、医生筛选
  • 排班修改:快速修改排班状态和号源数
  • 批量排班:支持多医生、多日期、多时段批量设置排班

页面结构

查询区域

  • 医院选择
  • 科室选择
  • 医生选择
  • 周选择器
  • 查询/重置按钮

排班表格

  • 横向:周一至周日
  • 纵向:医生列表
  • 单元格:上午/下午两个时段
  • 颜色标识:
    • 绿色:出诊
    • 红色:停诊
    • 蓝色:休息
    • 橙色:请假
    • 灰色:未排班

操作功能

  • 上一周/下一周:切换周
  • 本周:快速回到当前周
  • 点击单元格:编辑排班

数据结构

排班记录

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 表:

interface Doctor {
    id: number             // 管理员ID(作为医生ID使用)
    name: string           // 姓名
    account: string        // 账号
    role_id: number        // 角色ID1=医生)
    // ... 其他管理员字段
}

API 接口

1. 获取医生列表

接口: GET /perms.admin/lists

请求参数:

{
  "role_id": 1,
  "page_no": 1,
  "page_size": 1000
}

返回数据:

{
  "code": 1,
  "msg": "success",
  "data": {
    "lists": [
      {
        "id": 1,
        "name": "张医生",
        "account": "doctor1",
        "role_id": 1
      }
    ]
  }
}

2. 获取排班列表

接口: GET /doctor.roster/lists

请求参数:

{
  "hospital_id": 1,
  "department_id": 2,
  "doctor_id": 3,
  "start_date": "2024-03-04",
  "end_date": "2024-03-10"
}

返回数据:

{
  "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

请求参数:

{
  "id": 1,
  "doctor_id": 1,
  "date": "2024-03-04",
  "period": "morning",
  "status": 1,
  "quota": 20,
  "max_patients": 30,
  "remark": ""
}

3. 删除排班

接口: POST /doctor.roster/delete

请求参数:

{
  "id": 1
}

4. 批量保存排班

接口: POST /doctor.roster/batchSave

请求参数:

{
  "rosters": [
    {
      "doctor_id": 1,
      "date": "2024-03-04",
      "period": "morning",
      "status": 1,
      "quota": 20,
      "max_patients": 30
    }
  ]
}

5. 复制排班

接口: POST /doctor.roster/copy

请求参数:

{
  "source_start_date": "2024-03-04",
  "source_end_date": "2024-03-10",
  "target_start_date": "2024-03-11",
  "doctor_id": 1
}

数据库设计

排班表 (la_doctor_roster)

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 标准的周计算(周一为一周的开始)

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. 排班冲突检测