使用本 Skill 前,需确保 Python 环境中已安装以下依赖:
pip install openpyxl
openpyxl:用于 Excel 文件的读取、写入和格式化calendar、json、collections、hashlib),无需额外安装根据用户提供的主播信息和排班规则,自动生成月度排班表,支持终端输出和Excel导出。
从用户输入中解析以下信息:
用户在发送排班信息时,必须提供排班周期前至少2天的上播或排班计划。
为什么需要前2天数据:
要求格式:
用户提供排班信息时,需额外说明前2天每个主播的上播时段,例如:
【前2天排班】
5月30日:
慕何:18:00~20:00、22:00~24:00
林秀:16:00~18:00、20:00~22:00
...
5月31日:
慕何:16:00~18:00、20:00~22:00
...
如果用户未提供前2天排班数据,暂停排班,向用户说明原因并要求补充。
当用户提供了【其他限制】或特殊规则,且该规则与技能内置规则(规则1-4)存在冲突时,必须暂停排班,向用户确认优先级。
触发条件:
处理流程:
ask_followup_question 工具逐项询问优先级当用户通过步骤1.5做了规则冲突处理,且用户选择了「优先用户规则」后:
ask_followup_question 工具询问,提供三个选项:写入方式:
示例对话(排班输出完毕后):
排班已完成。本次排班应用了以下用户规则:
- "每日上播6小时"(优先于系统默认的4小时)
是否需要将此规则写入技能,供后续排班使用?
A) 写入技能 — 永久保存
B) 仅本次使用 — 下次恢复默认
C) 先不处理
示例对话:
检测到以下规则冲突:
1. 用户要求"每日上播6小时" vs 系统规则"每日固定4小时"
2. 用户要求"00:00~08:00主播 叶灵儿 在10:00~12:00上播" vs 系统规则"00-08主播不可跨区间"
请逐项确认优先级...
用户可能直接提供一个 Excel 模板文件(.xlsx),模板中包含前2天排班数据和休假安排,需要从模板中读取信息并填入排班结果。
触发条件:
处理流程:
prev_schedule = {-2: {slot: anchor}, -1: {slot: anchor}}vacation_raw = {"日期": [人员列表]}build_schedule() 生成排班ask_followup_question 询问用户选择输出方式:示例询问:
```
排班已完成。请选择输出方式:
A) 更新到本表 — 直接修改 999.xlsx
B) 输出到新表 — 另存为 妇炎洁领航_2026年7月排班表.xlsx
```
当用户要求将排班结果写入Excel模板的指定Sheet或新建Sheet时:
触发条件:
处理流程:
wb.create_sheet('sheet名称') 新建代码示例:
wb = openpyxl.load_workbook('模板.xlsx')
# 新建或获取指定sheet
if '新排班表' not in wb.sheetnames:
ws = wb.create_sheet('新排班表')
else:
ws = wb['新排班表']
# 从第一个sheet读取前2天数据
ws1 = wb[wb.sheetnames[0]]
prev_schedule = {-2: {}, -1: {}}
for h in range(24):
for col_idx, off in [(2, -2), (3, -1)]:
val = ws1.cell(row=h+3, column=col_idx).value
if val and val != '缺失':
# 解析到对应时段...
prev_schedule[off][sk] = val
# 在新sheet中构建完整排班表...
代码示例:
import openpyxl
from schedule import build_schedule, slot_to_hour_range, run_checks
# 读取模板
wb = openpyxl.load_workbook('模板.xlsx')
ws = wb.active
# 解析前2天数据
night_slots_map = {"A": (0,2), "B": (2,4), "C": (4,6), "D": (6,8)}
prev_schedule = {-2: {}, -1: {}}
for h in range(24):
row = h + 3
for col_idx, off in [(2, -2), (3, -1)]:
val = ws.cell(row=row, column=col_idx).value
if val and val != '缺失':
sk = None
for k in list(night_slots_map.keys()) + list(range(1, 9)):
s, e = (night_slots_map[k] if isinstance(k, str)
else ((k-1)*2+8, (k-1)*2+10))
if s <= h < e: sk = k; break
if sk:
prev_schedule[off][sk] = val
# 解析休假
vacation_raw = {}
for d in range(1, 32):
vac_list = []
for vac_idx in range(3):
val = ws.cell(row=27+vac_idx, column=d+3).value
if val and val != '缺失':
vac_list.append(val)
if vac_list:
vacation_raw[str(d)] = vac_list
# 执行排班并填入模板...
使用 scripts/schedule.py 脚本生成排班表。该脚本包含完整的排班逻辑:
python3 scripts/schedule.py
脚本内部逻辑:
使用 scripts/export_xlsx.py 将排班结果导出为Excel文件。在SKILL.md同级目录执行:
python3 scripts/export_xlsx.py
每次生成排班后,自动执行以下8项检查:
| 编号 | 检查项 | 规则 |
|---|---|---|
| ------ | -------- | ------ |
| 1 | 每时段仅1人 | 同一小时不能有多个主播 |
| 2 | 每人每日4小时 | 每天上播总时长恰好4小时 |
| 3 | 工作模式 | 连续2h → 休息2h → 连续2h |
| 4 | 休假合规 | 休假主播当天不排班 |
| 5 | 区间隔离 | 00-08主播不出现在8-24区间 |
| 6 | 替补合规 | 8-24主播仅在替补时进入00-08 |
| 7 | 单次时长 | 每次上播恰好2小时 |
| 8 | 阶梯轮转 | 验证阶梯式排班模式正确 |
检查未通过时,必须修正后重新排班,直到全部通过。
排班完成后,必须执行两轮完整检查以确保结果无误:
示例输出:
📋 第一轮检查
[1] 每时段仅1人: ✅
[2] 每人每日4小时: ✅
...
✅ 第一轮全部通过
📋 第二轮检查(复验)
[1] 每时段仅1人: ✅
...
✅ 第二轮全部通过
🎉 双重检查确认无误,排班表合格!
时间段 1日 2日 ... 31日00:00~01:00 到 23:00~24:00)休假01、休假02、休假03【店铺】护肤
【00:00~08:00主播】叶灵儿、宁夕
【休假】5月11日(无涯、双儿)、5月12日(琳琅)
【排班周期】2026年5月1日~2026年5月31日
【其他限制】无
scripts/schedule.py - 核心排班脚本(终端输出+检查)scripts/export_xlsx.py - Excel导出脚本共 2 个版本