运行时依赖
安装命令
点击复制技能文档
值班安排优化器 构建不会让人员过度劳累的值班安排。分析当前轮班的公平性,平衡时区负载,尊重请假和节假日,尽量减少每人夜间页面,并生成优化的安排 — 适用于 PagerDuty、OpsGenie 或电子表格。使用时: "优化值班安排"、"值班轮班"、"公平值班分配"、"减少值班过度劳累"、"时区覆盖"、"谁值班太多" 或设计新团队的值班时。
命令
- analyze — 审计当前值班安排
# OpsGenie API curl -s "https://api.opsgenie.com/v2/schedules/$SCHEDULE_ID" \ -H "Authorization: GenieKey $OG_API_KEY" | python3 -c " 导入 json, sys 数据 = json.load(sys.stdin)['data'] 打印(f'安排:{数据["name"]}) 打印(f'时区:{数据["timezone"]})
步骤 2:计算公平性指标 从 collections 导入 defaultdict 从 datetime 导入 datetime, timedelta 定义 analyze_on_call_fairness(轮班): """分析值班分配的公平性""" 人员统计 = defaultdict(lambda: { 'total_hours': 0, 'weekend_hours': 0, 'holiday_hours': 0, 'night_hours': 0, 'incidents': 0, 'consecutive_days': 0, 'max_consecutive': 0, }) 对于轮班中的 shift: 人员 = shift['person'] 开始 = shift['start'] 结束 = shift['end'] 小时 = (结束 - 开始).total_seconds() / 3600 人员统计[人员]['total_hours'] += 小时 # 周末检查 如果开始.weekday() >= 5: 人员统计[人员]['weekend_hours'] += 小时 # 夜间检查 (22:00-08:00) 如果开始.hour >= 22 或 开始.hour < 8: 人员统计[人员]['night_hours'] += 小时 # 打印公平性报告 平均小时 = sum(s['total_hours'] for s in 人员统计.values()) / len(人员统计) 对于人员、统计 in sorted(人员统计.items(), key=lambda x: -x[1]['total_hours']): 偏差 = ((统计['total_hours'] - 平均小时) / 平均小时) * 100 公平性 = '🟢' 如果 abs(偏差) < 10 否则 '🟡' 如果 abs(偏差) < 25 否则 '🔴' 打印(f'{公平性} {人员}: {统计["total_hours"]:.0f}h 总计 ({偏差:+.0f}%), ' f'{统计["weekend_hours"]:.0f}h 周末, {统计["night_hours"]:.0f}h 夜间')
步骤 3:生成报告 # 值班安排分析
公平性评分:65/100 (⚠️ 不平衡)
负载分布(最近 90 天)
| 人员 | 总小时数 | 周末 | 夜间 | 事件 | 偏差 |
|---|---|---|---|---|---|
| 爱丽丝 | 720h | 180h | 240h | 23 | +15% 🟡 |
| 鲍勃 | 480h | 120h | 160h | 12 | -23% 🔴 |
| 卡罗尔 | 600h | 200h | 200h | 18 | -4% 🟢 |
| 戴夫 | 720h | 100h | 240h | 28 | +15% 🟡 |
- 🔴 爱丽丝和戴夫的负载比鲍勃多 30%
- 🟡 卡罗尔的周末小时数不成比例(33% vs 团队平均 25%)
- 🟡 没有时区多样性 — 所有 US-East,缺口 02:00-08:00 UTC
- 🔴 戴夫上个月有 14 个连续值班天(过度劳累风险)
推荐
- 均衡轮班:鲍勃需要更多轮班来平衡
- 添加周末权重:计算周末小时数为 1.5× 以实现公平
- 将连续天数限制为 7
- 考虑跟随太阳的轮班(如果可用)
- generate — 创建优化安排
- coverage — 分析时区覆盖
- burnout — 计算过度劳累风险评分