# 考勤规则支持「同一个部门多条规则(多班次)」 > 变更日期:2026-10-16 模块:HRM → 考勤管理 → 考勤规则配置 ## 涉及页面 - HRM → 考勤管理 → 考勤规则(新增 / 编辑) - HRM → 考勤管理 → 考勤记录(打卡、导入、月度汇总依赖的规则匹配) - 移动端/大屏的打卡入口(走同一套 clock-in / clock-out 接口) ## 变更点 | 项 | 变更前 | 变更后 | |----|--------|--------| | 部门与规则的关系 | 一个部门只能配置一条规则,新增/编辑时若该部门已有规则,报错「该部门已配置考勤规则」 | 一个部门可以配置多条规则,用于多班次;新增/编辑不再报该错 | | 规则名称 | 全局唯一(`hrm_attendance_rule.name` 不允许重复) | **不变**,仍然全局唯一,请用「早班规则 / 夜班规则」这类可区分的名称 | | 打卡/导入时用哪条规则 | 该部门启用规则中的任意一条(按数据库返回顺序) | 按打卡时间匹配班次,见下表 | | 未配置部门规则时 | 回退到全局规则(`dept_id` 为空) | **不变** | ## 班次匹配规则(同一个部门有多条启用规则时) | 场景 | 取哪条规则 | |------|------------| | 打卡时间落在某条规则的 [上班时间, 下班时间] 内 | 取这条 | | 打卡时间不在任何班次窗口内(如提前 2 小时到岗) | 取班次窗口离打卡时间最近的那条 | | 有多条都符合(并列) | 按上班时间早的优先,再按规则编号,结果稳定不漂移 | | 跨天班次(如 22:00-06:00,即下班时间 ≤ 上班时间) | 凌晨的打卡(00:00-06:00)判给该跨天班次 | | 不关心班次(内部调用未传打卡时间) | 取上班时间最早的一条 | 匹配只在该部门启用的规则中进行;若该部门一条启用规则都没有,仍回退到全局规则(同样按上述规则匹配)。 ## API 接口路径、请求参数、响应结构**均无变化**: | 方法 | 路径 | 说明 | |------|------|------| | POST | /hrm/attendance-rule/create | 新增考勤规则(不再因部门重复而失败) | | PUT | /hrm/attendance-rule/update | 修改考勤规则(不再因部门重复而失败) | | POST | /hrm/attendance-clock/clock-in | 上班打卡(按打卡时间匹配班次判迟到) | | POST | /hrm/attendance-clock/clock-out | 下班打卡(按打卡时间匹配班次判早退、算加班) | 错误码 `1_030_004_007「该部门已配置考勤规则」` 已不再有触发点,前端无需再针对它做特殊处理(若有按错误码写死的文案,可删除)。 ## 前端修改点 无。前端的部门下拉本来就是拉取全量部门、不做「已配置则禁用」的过滤;该提示来自后端异常,后端不再返回即可。 ## 注意事项 - 同一个部门配多条规则时,**班次时间必须能区分开**(例如早班 08:00-16:00、晚班 16:00-24:00)。若两条规则的班次窗口完全重叠,打卡只会命中其中一条(上班时间早的那条),请避免配置重叠班次。 - 规则名称仍全局唯一,两个部门各配「白班」会提示「考勤规则名称已存在」,请改名区分。 - 已有的考勤记录不回溯重算:本次变更只影响变更之后新打卡、新导入/编辑的记录。历史记录如需按新班次重算,需要单独处理(重新导入或提供重算脚本)。 - 无表结构变更,无需执行 SQL;`hrm_attendance_rule.dept_id` 本来就是普通索引(`idx_dept_id`),不存在唯一索引。