用途:面向 ServiceNow 的值班排班管理,解决“谁现在值班”这类需要跨多张表查询的问题,避免误查 sys_user_group.manager 得出错误人员。
主要能力:理清数据链。sys_user_group 是被覆盖的团队;其下 cmn_rota 是轮值(如 primary、secondary、escalation,彼此独立);cmn_rota 关联 cmn_schedule(覆盖时段及时区)与 cmn_rota_roster(轮换模式,如每周 7 天、起始日期);roster 下的 cmn_rota_member 为某人的 from/to 时间窗,指向 sys_user。
使用方式:get_current_oncall({action, rotation_sys_id}) 分三步解析当前值班人:查 active=true 的 roster,找 from/to 覆盖今天的 member 行,再解析到 sys_user。list_rotations 按组查轮值;list_shifts 查窗口内班次,默认 now 至未来 7 天,时间为 ServiceNow UTC 格式 YYYY-MM-DD HH:MM:SS;swap_shift 可改单人窗口,参数 roster_sys_id 实际接收 cmn_rota_member 的 sys_id,from_member_sys_id 作校验,不匹配则拒绝。可用 snow_create_schedule 建表,snow_add_schedule_entry 添加 include/exclude 时段建模节假日。
限制:某轮值若无覆盖今天的 member 窗口则返回空,这不是错误,而是窗口已过。member 的 from/to 是天,具体 03:00 是否值班由 cmn_schedule 及其 time_zone 决定,转换时区前须先读该字段。完整解析还涉及 OnCallRotation 脚本(含升级顺序与休假记录),如有休假覆盖需用 snow_execute_script 交叉核对。swap_shift 的 reason 不会被持久化,记录无 reason 字段;改期只改单个窗口,不改变轮换模式。修改 schedule 会影响所有引用它的 SLA,可先查 contract_sla。若组无轮值,正确答复是该组没有值班人,而非其经理。