2026-10-07 · 喵窝资源铺
排班线第三篇。换班申请单是排班管理里最容易被「人情」绕过的一环:班长看一眼「张三换李四,行吧」就批了,没人核对值班表。结果就是有人拿不存在的班去换别人的班、有人原班日根本没排班也来申请换、有人接完班 一天排两个班。这版脚本把换班申请逐条对着值班表核,代码实跑验证,真实输出贴在下面。
测试数据:7 人 18 条排班 + 7 条换班申请,故意埋 6 处陷阱——王五 10-25 没排班却申请换(空手套白狼);周洁拿 10-15 的班换但那天压根没排班(换出个不存在的班);张三接周洁的班但 10-15 自己已有夜班(一天两班);孙七拿 10-30 的班换(那天没排班);周洁自己换自己(手滑);「王二麻子」查无此人。张三↔李四正常换班做对照组。跑完:
异常[申请人原班日无排班] 王五 申请换掉 2026-10-25 的班,但值班表里 TA 当天根本没排班(空手套白狼) 异常[对班人换出日无班] 周洁 说拿 2026-10-15 的班换,但值班表里 TA 当天没排班(换了个不存在的班) 异常[申请人新班日已有班] 张三 在对班日 2026-10-15 本身已有班次[夜班],再接 周洁 的班会一天两班 异常[对班人换出日无班] 孙七 说拿 2026-10-30 的班换,但值班表里 TA 当天没排班(换了个不存在的班) 异常[自己换自己] 周洁 申请人和对班人是同一人 异常[对班人查无此人] 王二麻子 在值班表里一条排班都没有(姓名写错或未排班) 换班申请 7 条 / 值班记录 18 条 / 异常 6 条
逐项验收:6 处陷阱全对出;对照组张三↔李四零误报;周洁尾随空格归一后正常命中。边界:值班表/换班表缺列明确报错(列出缺哪些)、datetime 日期可解析、坏日期「10月1号」明确报错不静默、空申请表不崩、幂等连跑两次内容级一致。
| 场景 | 处理 |
|---|---|
| 申请人原班日没排班 | 标「空手套白狼」——查是否冒名申请或日期写错 |
| 对班人换出日没排班 | TA 在值班表里完全查无此人 → 单独标「查无此人」;有此人但那天没班 → 标「换了个不存在的班」 |
| 申请人接班日已有班 | 标「一天两班」——除非那班正是对班人换给 TA 的 |
| 申请人 = 对班人 | 标「自己换自己」,多半是表单填错 |
| 姓名匹配 | 去首尾+内部空格后归一,防「周洁 」这类 Excel 尾随空格 |
先 pip install openpyxl。值班表列:姓名/日期/班次(班次可选);换班申请列:申请人/原班日期/对班人/对班日期(事由可选)。运行:
python shift_swap_check.py 值班表.xlsx 换班申请.xlsx 核对结果.xlsx
输出 xlsx 三张表:换班明细 / 异常清单 / 跳过脏行,直接贴进审批流当附件。
第一版想当然地检查「对班人在申请人原班日(d1)有没有排班,没班就报异常」。结果对照组张三↔李四正常换班被误报——因为换班的语义是 A 拿 d1 的班换 B 在 d2 的班,B 在 d1 有没有班根本无关,该查的是 B 在 d2 是不是真有班可换出。把检查对象从 d1 改成 d2 后,7 条申请 6 处异常全对出、对照组零误报。教训:写对账规则前先把业务动词的主宾画清楚——「换」的主语是各自拿出来的班,不是对方要顶的班。
排班系列:值班表×请假单冲突核对、排班冲突检查;钱账系列:借款×报销冲抵对账、加班表×工资表工时对账、考勤时间列清洗×工资核算。