考勤管理
这篇解决什么
部门怎么配打卡规则、子部门如何继承、假期和假种落哪张表、补卡销假走哪条流程。读完能改 hrm_attendance_config、AttendanceRuleService、hrm_holiday_plan、hrm_punch_record,以及 hr_card_replacement_bill / hr_leave_cancel_bill。
默认端口 48080,前缀 /admin-api。档案要先有 userId,见 员工管理。模块边界见 人力功能设计。
业务闭环
人事配部门规则和假日方案。员工按规则打卡。迟到 / 缺卡由规则引擎算,不在前端自己比时间。漏打卡走补卡单,请过的假要冲回走销假单。月统计读打卡流水,不另存一套考勤结果表当真相。
示意图:配置可继承。当日是否工作日、精确还是弹性,由规则引擎算。补卡通过后再写记录。
从哪改
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 考勤配置 | /hrm/attendance-config,按部门,支持继承父级 | ruoyi-office/yudao-module-hrm/.../AttendanceConfigController.java |
| 配置表 | 点位、班次、大小周、补卡额度 | hrm_attendance_config / AttendanceConfigDO |
| 规则引擎 | 工作日、夏冬令、精确/弹性 | AttendanceRuleServiceImpl |
| 假日方案 | /hrm/holiday-plan | HolidayPlanController |
| 打卡 | /hrm/attendance-punch | AttendancePunchController |
| 打卡记录 | /hrm/punch-record | PunchRecordController / hrm_punch_record |
| 月统计 | /hrm/punch-statistics | PunchStatisticsController |
| 假种 / 额度 | /hrm/leave-rule、/hrm/leave-balance | LeaveRuleController、LeaveBalanceController |
| 销假 | 205,hr_leave_cancel_bill | LeaveCancelBillController |
| 补卡 | 206,hr_card_replacement_bill | CardReplacementBillController |
| PC | views/hrm/attendance/ | ruoyi-office-vben/apps/web-antd/src/views/hrm/attendance/ |
页面:配置 attendance/config,打卡记录 punch-record,统计 punch-statistics,假种 leave-type,补卡 card-replacement/list|info,销假 leave-cancel/list|info。
请假申请不在这张枚举里
人事管假种、余额和销假。发起请假若走流程表单,key 以模型为准,不要写成 hrm_leave。
部门规则继承
打开 人力 → 考勤 → 考勤配置,左侧选部门。接口按部门 ID 取配置。
getAttendanceConfigByDeptId:本级 hrm_attendance_config 有行则 inherited=false;没有则沿 system_dept.parentId 往上找,找到后 inherited=true。打卡接口同样「按部门递归继承」。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
deptId | 配置挂哪个部门 | AttendanceConfigDO |
inherited | 响应上的继承标记,不落库 | AttendanceConfigRespVO |
| 保存 | 本级没有行则 insert;有则 update | AttendanceConfigServiceImpl |
| 删除本级 | 删后下次读取重新继承父级 | deleteAttendanceConfigByDeptId |
改父级会立刻影响未自建配置的子部门
子部门只要没自己保存过,打卡半径、班次、假日方案都跟父级。要独立规则,在该部门保存一份,不要只改公司节点指望个别组例外。
操作:选中部门 → 改经纬度 / 半径或 WiFi 白名单 → 选假日方案 → 配 timeRules 或回退的上下班时间 → 保存。保存只写当前部门一行,不会批量改子孙。
打卡规则
AttendanceRuleServiceImpl.resolveDayRule 算出当天规则,前端只展示,不算迟到。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
punchMode | 1 位置打卡 / 2 内网打卡 | AttendanceConfigDO |
longitude / latitude / punchRadius | 定位围栏(米) | 同上 |
wifiList | 内网模式 BSSID 白名单;空则只要求能访问系统 | JSON |
allowFieldPunch | 是否允许外勤 | 同上 |
weekMode | 0 固定工作日 / 1 大小周 | 同上 |
workDays / bigWeekDays / smallWeekDays | 周一=1 … 周日=7 | 同上 |
holidayPlanId | 假日方案优先于工作日 | 休假=非工作日,补班=工作日 |
timeRules | 全年 / 夏令 / 冬令;clockType 1 精确 / 2 弹性 | JSON |
workStartTime / workEndTime | timeRules 空时回退,再退到 09:00–18:00 | 规则引擎 |
弹性:晚于「最晚上班」算迟到;下班看最短工时。精确:晚于上班、早于下班分别算迟到 / 早退。
needCheck=0 时该部门不考核。月允许迟到 / 早退 / 缺卡次数和罚款金额在同一张配置上,给统计和薪资扣款用。
打卡写 hrm_punch_record。当前用户必须对上档案 userId。PC 打卡页 attendance/punch,移动见 移动端 HRM。
假日方案与假种
假日方案表 hrm_holiday_plan,明细 hrm_holiday_plan_detail(某日休假或补班)。配置页用 holiday-plan-modal 维护后,把 holidayPlanId 挂到部门配置。
假种 / 额度:hrm_leave_type、hrm_leave_account、hrm_leave_ledger。部门假种方案可继承上级;本级新增必须重新生成主键,见 LeaveRuleService。页面 人力 → 考勤 → 假种。
销假 205 冲已占用额度,不要手改流水。补卡 206 受配置里 allowCardReplacement、每月次数、截止类型(当天 / 本周 / 本月 / 自定义天数)限制。模型路径对 card-replacement/info、leave-cancel/info。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| 补卡 | 通过后补一行或改状态 | hr_card_replacement_bill |
| 销假 | 冲已通过请假占用 | hr_leave_cancel_bill |
| 月汇总 | 出勤、迟到等 | PunchStatisticsServiceImpl |
统计读部门树走 DeptApi,和档案部门同一套。
日历绿了不等于规则引擎认工作日
假日方案的补班 / 休假优先。只改 workDays 不改方案,法定假仍按方案走。
@RequestMapping("/hrm/attendance-config")
public class AttendanceConfigController { }
@TableName(value = "hrm_attendance_config", autoResultMap = true)
public class AttendanceConfigDO extends BaseDO { }
本系统截图:选中部门后的考勤配置。本级无行则继承父级,地图和班次在同一页。

本系统截图:配置页「应用节假日方案」旁的方案弹窗。休假 / 补班写在 hrm_holiday_plan_detail。

本系统截图:人力 → 考勤 → 假期类型。额度账本挂在假种上,不要只改配置页的班次。

本系统截图:打卡记录。统计和补卡都从这条流水派生。

本系统截图:补卡单 info。审批通过后才补记录,不要手改流水。
