中心药房排班工具
概述
为南医三院中心药房16人团队自动生成一周排班表(周一至周日),严格遵循用户确认的8条排班规则(约束力由强至弱)。排班结果写入指定的 Excel 文件。
触发条件
当用户提出以下需求时触发:
- 生成/制作/排一周排班表
- 优化/调整排班
- 排下一周/下周排班
- 按规则排班
人员名单(16人)
- 李舒婕
- 冯亮
- 钟庆强
- 薛书华
- 李晓舒
- 覃夏汐
- 吴敬嫦
- 何炳洪(20220101)
- 张垚(20220523)
- 林清雯(20230703)— 组长
- 詹诗琦(20240220)
- 黄玉婷(20250401)
- 杨茜(20250501)
- 何乐为(20250506)
- 黄万巧(20250603)
- 黎燕萍(20260413)
注:徐国玮已退出(约2026年4月后);黎燕萍2026年4月加入。人员变动时需更新此名单。
班次类型
| 班次 | 时间 | 说明 |
|---|---|---|
| A班 | 8:00-15:00 | 早班,当天临时负责人 |
| A半天班 | 8:30-12:00 | 半天 |
| B班/B1班 | 9:00-16:00 | |
| C班/C1班 | 10:00-17:00 | |
| 静A班 | 8:00-15:00 | 静配核对、摆处方 |
| 静B班 | 8:30-15:30 | 静配处方审方、摆药 |
| 小夜 | 14:00-21:00 | |
| 夜班 | 通宵 | 次日进入恢复周期 |
| 夜休 | — | 夜班后第1天恢复 |
| 休 | — | 休息 |
| 医嘱审核 | — | 李舒婕固定任务 |
| C/麻药 | — | C班+麻药管理(何炳洪) |
| C1/办公 | — | C1班+办公(林清雯) |
排班规则(约束力由强至弱)
以下规则按优先级排列,冲突时强约束优先:
规则1:夜班循环顺序(最强)
夜班按以下10人顺序循环安排,每天1个夜班:
詹诗琦 → 黄玉婷 → 钟庆强 → 李晓舒 → 覃夏汐 → 吴敬嫦 → 张垚 → 何乐为 → 冯亮 → 杨茜 → 回到詹诗琦
确定本周夜班起始人的方法:
1. 读取上一周(或更早)的排班表,找到最后一个夜班执行人
2. 该人在循环中的下一位即本周第一个夜班人
3. 若上周日无人夜班(特殊情况),则从循环顺序中本周可用的人开始
规则2:双周五夜班固定林清雯
每隔一周的周五,夜班由林清雯固定执行,不进入10人循环。
- 判断方法:查阅历史排班,找到林清雯最近一次周五夜班的日期,加14天即下一次
- 已知日期:8月14日、8月28日、9月11日、9月25日...(每14天一次)
- 双周五当天,10人循环跳过该天,周六继续从下一位接续
规则3:夜班后5天恢复周期
夜班执行人后续4天为固定恢复期,不可安排其他班次:
- 第0天:夜班
- 第1天:夜休
- 第2天:休
- 第3天:休
- 第4天:小夜
恢复期跨周时,未完成的恢复天数顺延至下周。例如周四夜班→周五夜休→周六休→周日休→下周一小夜。
跨周衔接处理:
- 读取上一周排班,找出周日(及周六、周五等)执行夜班的人
- 计算其恢复期在本周的剩余天数,锁定这些天数的班次
- 典型情况:上周日→本周一夜休、二休、三休、四小夜
规则4:每人每周2天休息
每位员工在一周内(周一至周日)恰好获得2天「休」。
- 夜班恢复期内的「休」天计入这2天
- 若恢复期跨周导致本周内只有1天休,则在其他可用日补1天休
- 若恢复期跨周导致本周内0天休,则在其他可用日补2天休
规则5:医嘱审核指定李舒婕
- 李舒婕固定执行医嘱审核(周二至周五,共4天)
- 周一和周日为李舒婕的休息日
规则6:静B班优先人员
- 优先安排:冯亮、钟庆强
- 备选安排:李舒婕、詹诗琦
- 每天安排1人静B班(若优先人员可用)
- 若优先人员均在夜班/恢复期中,可缺位或启用备选
规则7:A班优先人员
- 优先安排:薛书华、黄万巧
- 每天1-2人A班,优先人员各休2天
- 当1人休息时另1人独立覆盖A班
规则8:C/麻药固定何炳洪
- 何炳洪固定执行C/麻药班
- 何炳洪每周2天休(周二、周六或其他),休日无C/麻药覆盖
规则9:C班优先人员
- 优先安排:覃夏汐、吴敬嫦、何炳洪
- 工作日C班以这3人为主力
- 周末部分人转入夜班,C班由其他人补充
工作流程
第1步:确定目标周和文件
- 确认要排的日期范围(周几到周几,具体日期)
- 确认目标 Excel 文件路径
- 检查文件是否已在编辑器中打开(通过 get_pool_status)
- 若未打开,用 present_files 打开,再 get_pool_status 获取 file_id
第2步:读取历史排班确定循环位置
- 读取目标文件 Sheet1,获取子表信息(sheet_get_sheet_info)
- 读取第一列(A列)定位各周区块标题,找到最近一周的排班
- 读取最近一周的完整排班数据(sheet_get_cell_data)
- 分析:
- 上周每天的夜班执行人 → 确定循环顺序中的位置
- 上周最后一位夜班人 → 本周第一位夜班人(循环中的下一位)
- 林清雯最近一次周五夜班日期 → 判断本周五是否为双周五
- 上周夜班人员的恢复期 → 计算本周需锁定的跨周恢复天数
第3步:生成排班表
按以下顺序逐步填入排班(强约束优先):
-
填入跨周恢复期(来自上周夜班的延续)
- 对上周日/六/五/四的夜班人,计算其在本周的剩余恢复天数
- 锁定:夜休→休→休→小夜 的对应天数 -
填入本周夜班和恢复期(规则1-3)
- 按循环顺序分配7天夜班(周一至周日各1人)
- 为每个夜班人填写5天恢复周期
- 若本周五为双周五,林清雯代替该天夜班 -
填入固定角色(规则5-8)
- 李舒婕:周二至五医嘱审核,周一/日休
- 薛书华/黄万巧:A班,各2天休
- 何炳洪:C/麻药,2天休
- 静B:冯亮/钟庆强优先 -
填入剩余班次和休息天(规则4、9)
- 确保每人恰好2天休(含恢复期内的休)
- C班优先覃夏汐/吴敬嫦/何炳洪
- B/B1班分配给黎燕萍、张垚、何乐为等
- 每天小夜由恢复周期第4天的人覆盖(1天1人) -
校验
- 每人恰好2天休 ✓
- 夜班→夜休→休→休→小夜 全部配对 ✓
- 夜班循环顺序正确 ✓
- 无同一人同一天两个班次冲突 ✓
- 每天合计16人 ✓
第4步:写入Excel文件
- 确定写入位置(文件末尾新增区块,或覆盖已有区块)
- 若行数不足,用 sheet_insert_dimension 扩展
- 用 sheet_set_range_value_by_csv 批量写入
- CSV 每行11列(A-K),用 Python csv.writer 生成避免格式问题
- 通过 subprocess + --json 传参避免 shell 转义 - 格式化:sheet_merge_cell(合并标题)、sheet_set_border(边框)、sheet_set_cell_style(样式)
- sheet_save_file 保存
第5步:验证并呈现
- 读取写入区域验证数据正确性
- 生成可视化总览(show_widget HTML表格)
- present_files 呈现文件
- 在回复中说明规则验证结果
Excel文件结构
- 文件:26年排班表.xlsx(路径由用户指定)
- 单 Sheet "Sheet1",按月分周排列
- 每周区块21行:标题(1) + 表头(1) + 日期(1) + 16人(16) + 说明(1) + 备注(1)
- 列:A=姓名, B-H=周一至周日, I=积扣假, J=总积假, K=备注
- 行列索引均为 0-based
工具使用
操作 Excel 通过 tencent-local-office-edit 技能的 edsdk.py:
- 基础路径:C:\Users\Administrator.workbuddy\plugins\cache\workbuddy-builtin\skill-tencent-local-office-edit\0.0.1
- 命令:python3 edsdk.py list|schema|call ...
- file_id 通过 present_files + get_pool_status 获取
- 批量写入用 sheet_set_range_value_by_csv
- 中文数据用 Python subprocess + --json 传参
详细工具用法见 references/tool_usage.md
关键注意事项
- 跨周恢复期是最大复杂点:上周夜班人的恢复期会延续到本周,必须先锁定这些天数
- 5天恢复周期导致在岗人数降低:工作日10-11人,周末8-9人(旧版无此规则时为13-14/10-11人)
- 周三静B可能缺位:当冯亮和钟庆强同时处于夜班/恢复期时,周三无静B覆盖
- 双周五判断:必须查阅历史排班确认林清雯上次周五夜班日期,不可凭记忆
- 积扣假/总积假留空:由用户手动填写,不自动生成