PC+APP双端企业考勤打卡系统——部门级配置继承、GPS围栏/内网双模打卡、节假日方案、定时预生成

0 阅读23分钟

PC+APP双端企业考勤打卡系统——部门级配置继承、GPS围栏/内网双模打卡、节假日方案、定时预生成

🌐 文档地址ruoyioffice.com | 📦 源码1ruoyi-office-vben |📦 源码2ruoyi-office |📦 源码3ruoyi-office | 💬 :17156169080(备注「RuoYi Office」)

考勤打卡看似简单——上班签到、下班签退,但当你真正着手为企业实现一套考勤系统时,会发现"简单"二字背后隐藏着大量工程决策:总部和分公司的打卡规则不同怎么办?GPS 定位和内网打卡如何共存?法定节假日的调休补班怎么配置?每天几百人打卡的空白记录谁来生成?PC 端和手机端如何统一体验?RuoYi Office 的考勤模块,用 4 张表 + 部门级配置继承 + GPS/内网双模 + XXL-Job 预生成 + PC/APP 双端,交出了一份"轻量但完整"的答卷。

引言:企业考勤系统到底难在哪?

做过企业管理系统的开发者都知道,考勤管理是 HRM 模块中使用频率最高、规则最琐碎的功能:

  • 🏢 多级组织差异化:集团公司的总部、分公司、项目部可能有完全不同的上下班时间、打卡方式、容忍规则
  • 📍 定位方式多样:有的企业用 GPS 位置围栏,有的企业内网部署只需能访问系统就算打卡
  • 🗓️ 节假日复杂:法定节假日的调休、补班每年不同,国庆调休可能周六上班,元旦可能周一补休
  • 异常状态判定:迟到、早退、外勤、加班——每一种状态的判定规则和记录方式都不同
  • 📱 多端打卡:员工可能在 PC 端、手机 APP、小程序上打卡,体验要一致
  • 📊 数据可靠性:每天几百上千人的打卡记录不能丢,即使员工忘打卡也要有据可查

这些需求叠加在一起,让考勤系统成为"看似简单实则处处是坑"的经典模块。

RuoYi Office 的考勤模块基于 Spring Boot 3.5 + Vue3 + Vben Admin + UniApp 技术栈,设计了一套面向中小企业的考勤管理体系。本文从业务场景到技术实现,完整拆解考勤配置、打卡、记录管理的全链路设计。


一、系统设计:考勤模块的整体架构

1.1 模块组成

RuoYi Office 的考勤管理位于 人力资源管理 → 假勤管理 目录下,由四个紧密协作的子模块组成:

模块菜单路径功能面向角色
考勤配置人力资源管理 → 假勤管理 → 考勤配置按部门设置打卡规则、工作日、上下班时间、地图选点HR 管理员
考勤打卡人力资源管理 → 假勤管理 → 考勤打卡员工每日签到/签退操作,含 GPS 围栏和内网双模全体员工
打卡记录人力资源管理 → 假勤管理 → 打卡记录管理员查看/编辑/导入/导出全量打卡数据HR 管理员
节假日方案考勤配置页内弹窗配置配置法定节假日的休假/补班日期矩阵HR 管理员

1.2 核心设计决策

决策点方案理由
配置粒度按部门(非按人)企业考勤通常按部门统一规则,按人粒度太细
配置继承递归向上查找父部门子部门默认用父部门规则,需要时才覆盖
打卡方式GPS 围栏 + 内网免定位覆盖外出企业(GPS)和内网部署(免定位)两种场景
记录预生成XXL-Job 每日定时保证"缺卡"有据可查,不依赖员工打卡触发
状态判定前端计算 + 后端记录前端实时反馈,后端原样存储

二、考勤配置:部门级规则 + 递归继承

2.1 页面布局与功能概览

考勤配置页采用左侧部门树 + 右侧配置表单的经典布局。页面顶部醒目的蓝色提示栏说明了继承规则:"考勤规则优先用自己单位设置的规则,如自己组织没有设置,则使用父级最近的组织所设置的规则。"

image.png

▲ 考勤配置页:左侧展示完整的部门组织树(支持搜索),右侧根据选中部门加载对应的考勤配置表单

在左侧部门树中点击任意部门,右侧即刻加载该部门的考勤规则。如果该部门没有独立配置,则自动向上查找最近的父级配置并加载,同时显示一条蓝色提示:"当前部门未设置考勤规则,以下配置继承自上级组织。如需自定义,请修改后点击保存。"

2.2 "不配置即继承"的设计哲学

这是 RuoYi Office 考勤配置的核心设计理念——只要上级部门配置过规则,下级部门就自动继承,无需逐个设置:

  • 总部只需配置一次:集团公司在总部级别设置一套通用规则(如上午 9:00、下午 18:00)
  • 分公司按需覆盖:分公司如果有不同的上下班时间,配置一次即自动生效,不影响其他部门
  • 新部门零配置:新建的部门自动继承上级规则,HR 不需要逐一设置

后端通过递归查找实现这一机制:先查本部门是否有配置,没有则向上查找父部门,直到找到配置或到达顶级部门。查询结果中通过 inherited 字段标记配置来源,前端据此显示不同的提示信息。

2.3 考勤配置的完整字段

右侧配置表单涵盖了企业考勤所需的各项参数,按功能分为以下几组:

打卡模式与位置设置

配置项组件类型说明
打卡模式RadioGroup位置打卡(需 GPS 定位)/ 内网打卡(无需定位,访问系统即打卡)
经度 / 纬度InputNumber + 天地图仅位置模式显示,通过天地图组件可视化选点
打卡半径InputNumber50~5000 米可调,默认 200 米
允许外勤打卡Select仅位置模式生效,超出半径时是否允许标记为"外勤"打卡

工作时间与考核规则

配置项组件类型说明
是否考核Select开启/关闭考勤考核
工作日设置Checkbox.Group周一至周日多选,支持全选/反选,默认周一至周五
应用节假日方案Select + 配置按钮下拉选择已启用的节假日方案,也可点击按钮打开方案配置弹窗
上班时间 / 下班时间TimePicker默认 09:00 / 18:00

容忍与扣款规则

配置项组件类型说明
每月允许迟到天数InputNumber每月允许迟到的天数上限
每月允许早退天数InputNumber每月允许早退的天数上限
每月允许缺卡次数InputNumber每月允许缺卡的次数上限
迟到 / 早退 / 缺卡罚款InputNumber对应扣款金额(元),精确到分

2.4 天地图选点

当打卡模式选择"位置打卡"时,配置表单下方会展示一个天地图地图组件,提供可视化的打卡中心选点功能:

  • 点击选点:管理员在地图上直接点击即可设置打卡中心点坐标
  • 地址搜索:在搜索框输入地址名称(如"深圳市南山区科技园"),自动定位到该位置
  • 半径圈可视化:根据 punchRadius 的值在地图上绘制一个打卡范围圆圈,直观展示有效打卡区域
  • Geocoder 兜底:当 LocalSearch 搜索无结果时,自动切换到天地图 Geocoder API 进行地理编码查询

天地图是国内官方免费地图服务,相比高德/百度不需要商业授权,特别适合企业内部管理系统使用。


三、PC 端考勤打卡:左列表 + 右卡片

3.1 页面布局

PC 端考勤打卡页是整个考勤模块的员工核心操作页面。采用独特的左右分栏布局——左侧是个人打卡记录的 VxeTable 表格列表,右侧是固定宽度的"手机风"打卡卡片:

image.png

▲ PC端考勤打卡页:左侧展示当前用户近期的打卡记录(日期、星期、签到时间/状态、签退时间/状态、加班标记),右侧为实时打卡卡片

3.2 右侧打卡卡片详解

右侧打卡卡片自上而下包含以下信息区域:

  1. 用户信息栏:显示当前用户姓名和所属部门(如"宇宙源码 · 研发部门")
  2. 上下班时间:展示配置中的上班时间(如 09:00)和下班时间(如 18:00),已打卡的时间段会标注具体签到时间和状态
  3. 打卡圆钮:页面中央的大圆形按钮,显示"上班打卡"或"下班打卡"文字和实时时间
  4. 状态提示区:圆钮下方展示当前打卡模式和位置状态(如"内网打卡模式,无需定位即可打卡"或"已进入打卡范围")

3.3 打卡按钮的六态变色

打卡圆钮不是简单的"能打/不能打"二态——它通过六种渐变色精确传达当前打卡场景,员工无需阅读文字就能理解状态:

场景按钮样式渐变色含义
正常工作日可打卡蓝色渐变#6ea1ff → #4080ff在打卡范围内,正常打卡
非工作日加班打卡橙色渐变#ffc069 → #fa8c16今天不是工作日,将记为加班
不在范围可外勤紫色渐变#b37feb → #722ed1超出 GPS 围栏但允许外勤打卡
不在范围不可打卡红色渐变#ff7d7d → #ff4d4f超出围栏且不允许外勤
今日打卡完成灰色渐变#d9d9d9 → #bfbfbf上下班均已打卡完成
暂无考勤配置禁用灰色#e8e8e8 → #d9d9d9该部门未配置考勤规则

状态提示区也会根据定位情况动态切换六种提示文案——从"暂无考勤配置"到"内网打卡模式"到"正在获取位置"到"已进入打卡范围"到"不在范围,将记录为外勤打卡"到"不在打卡范围内",覆盖所有可能的场景。

3.4 双模打卡的设计思路

RuoYi Office 支持两种打卡模式,通过考勤配置中的 punchMode 字段区分:

模式punchMode定位行为适用场景
位置打卡1触发 GPS 定位 → Haversine 公式计算与打卡中心的距离 → 与打卡半径比较需要确认员工在公司附近的企业
内网打卡2不触发定位,系统默认在范围内内网部署的企业,能访问系统即说明在公司

位置打卡模式下,前端使用 Haversine 公式计算当前位置与打卡中心的球面距离。如果距离超过配置的打卡半径且允许外勤打卡,按钮变为紫色"外勤打卡"模式;如果不允许外勤则变为红色"不可打卡"状态。

内网打卡模式是 RuoYi Office 的特色设计——许多企业的 OA 系统部署在内网,员工能访问系统本身就证明人在公司,因此完全不需要触发定位。这种模式下打卡按钮始终为蓝色可用状态,大大简化了打卡流程。

3.5 打卡状态的三态设计

每次打卡记录的签到/签退状态使用三态标记

statusFlag含义颜色标识触发条件
0正常绿色签到在上班时间前 / 签退在下班时间后
1迟到/早退橙色签到晚于上班时间 / 签退早于下班时间
2外勤紫色不在 GPS 围栏范围内,但允许外勤打卡

PC 端打卡还实现了定位降级策略——浏览器高精度定位失败后自动降级为普通精度重试,避免因定位权限或硬件问题导致打卡受阻。

3.6 打卡决策流程

打卡的核心逻辑是一棵多层决策树——根据配置、位置、时间、日期等条件层层判断,最终决定按钮颜色、文字和是否可点击: attendance-punch-decision-flow.png

▲ 打卡决策流程:依次检查配置→打卡模式→GPS围栏→工作日→签到/签退→迟到/早退


四、移动端打卡:波纹动画 + 跨平台定位

4.1 移动端页面功能

移动端打卡页是 RuoYi Office 考勤模块的体验亮点。基于 UniApp + wot-design-uni 构建,支持 H5、小程序、APP 多端运行。

image.png

▲ 移动端打卡页:自定义导航栏 + 用户信息 + 上下班时间卡片 + 波纹动画大圆按钮,与主流企业打卡 App 体验一致

移动端页面自上而下包含以下区域:

  1. 自定义导航栏:深蓝色渐变背景,显示"考勤打卡"标题,底部有考勤记录入口按钮
  2. 用户信息卡片:显示当前用户头像、姓名和所属部门
  3. 上下班时间卡片:左右并排展示上班时间和下班时间,已打卡则显示具体时间和状态标签(如"已签到(迟到)")
  4. 波纹动画大圆按钮:页面中央核心区域,蓝色渐变大圆按钮显示"上班打卡"/"下班打卡"文字和实时时钟
  5. 状态提示信息:按钮下方展示当前模式和位置提示(如"内网打卡成功,无需定位即可打卡")

4.2 波纹动画效果

波纹效果是移动端的视觉亮点——当处于可打卡状态时,大圆按钮周围会有三层圆形波纹以不同延迟向外扩散,形成"呼吸"般的动画效果。三个波纹分别延迟 0s、1s、2s 开始动画,周期 3s,从 60% 大小渐变放大到 100% 并逐渐透明。波纹颜色同样会根据打卡状态动态切换——范围内蓝色、外勤紫色、超范围红色,与按钮形成统一的视觉语言。

4.3 跨平台定位策略

移动端使用 UniApp 的条件编译能力,在不同平台使用不同的定位 API:

  • H5 环境:使用浏览器原生 navigator.geolocation.getCurrentPosition,设置高精度模式、15秒超时
  • 小程序 / APP:使用 uni.getLocation,坐标系指定为 GCJ-02(国测局坐标),开启高精度定位

定位获取后,同样使用 Haversine 公式计算与配置中心点的距离,判断是否在打卡范围内。整个定位→计算→打卡的流程在移动端和 PC 端逻辑完全一致,只是定位 API 和 UI 展示不同。

4.4 移动端特色设计

  • 实时时钟:打卡按钮上的时间每秒更新,增强"即时打卡"的感知
  • 打卡状态实时反馈:签到/签退成功后按钮文字和颜色立即切换,无需刷新
  • 自适应安全区:顶部导航栏和底部操作区均适配 iPhone 安全区域
  • 支持加班打卡:非工作日也可打卡,自动标记为加班记录

五、打卡记录管理:全量 CRUD + 导入导出

5.1 页面布局

打卡记录页面面向 HR 管理员,提供全量查看、编辑、导入、导出能力。同样采用左侧部门树 + 右侧记录表格的布局: attendance-punch-record-page.png

▲ 打卡记录管理页:左侧部门树过滤,顶部搜索栏支持按用户姓名、日期范围、签到状态筛选,表格展示所有员工的打卡明细

5.2 核心功能

搜索筛选

表格上方提供多维度搜索条件:

  • 部门筛选:左侧部门树点击自动筛选该部门及下属所有部门的记录
  • 用户姓名:模糊搜索员工姓名
  • 打卡日期:日期范围选择器,查看指定时段的打卡数据
  • 签到状态:下拉选择(全部/正常/迟到/外勤),快速筛选异常记录

新增打卡记录

HR 管理员可手动新增打卡记录,用于补录忘打卡员工的考勤。弹窗表单支持选择员工(员工选择器组件)、设置日期、签到/签退时间和状态。

Excel 导入

支持 Excel 批量导入打卡记录,适用于从其他系统迁移数据或批量补录。导入功能的亮点在于字典双映射——签到/签退状态既支持输入数字(如"0")也支持输入标签(如"正常"),系统自动转换。

Excel 导出

支持按当前筛选条件导出打卡记录为 Excel 文件,方便 HR 做月度考勤汇总和薪资计算。

修改操作

每行记录右侧提供"修改"按钮,HR 可直接编辑打卡时间和状态,用于处理申诉和纠正异常数据。


六、节假日方案:休假/补班的灵活矩阵

6.1 方案设计

节假日方案独立于工作日配置,通过考勤配置页面内的弹窗进行管理。采用主从表结构:

  • 主表:方案名称、年份、启用状态
  • 明细表:日期 + 类型(1=休假 / 2=补班)+ 名称

例如,2026 年国庆节假日方案:

日期类型名称
2026-10-01 ~ 10-07休假(1)国庆节
2026-09-27(周六)补班(2)国庆调休
2026-10-10(周六)补班(2)国庆调休

6.2 工作日判定的三级优先级

判断"今天是否工作日"时,系统遵循明确的三级优先级:

  1. 最高优先级——节假日方案:如果配置了节假日方案且该日期在方案中,按方案类型判断(休假→非工作日,补班→工作日)
  2. 次优先级——工作日配置:如果节假日方案中没有该日期,按考勤配置中的工作日(如周一至周五)判断
  3. 兜底——默认周一至周五:如果没有任何工作日配置,默认周一至周五为工作日

这种三级优先级的设计非常灵活——比如某个部门配置了"周一至周六上班",同时应用了 2026 年国庆方案,那么国庆期间即使是周一到周六也不用上班,但 9.27 周六需要补班。


七、定时预生成:每天的"底线数据"

7.1 为什么需要预生成?

如果只在员工打卡时才创建记录,那忘记打卡的员工就没有记录——"缺卡"就变成了"不存在",HR 无从追查。

RuoYi Office 通过 XXL-Job 定时任务,每天凌晨为所有在职员工预生成空白打卡记录。这样即使员工一整天没有打卡,打卡记录表中依然有这条空白记录(签到/签退时间为空),HR 查看考勤报表时可以明确看到"缺卡"状态。

7.2 预生成的关键设计

设计点实现方式说明
幂等性按 userId + realDate 唯一判断同一天同一人只有一条记录,重复执行不会重复创建
周末跳过判断 dayOfWeek周六日不生成空白记录(补班场景由节假日方案控制)
在职过滤排除离职和退休状态只为在职员工生成记录
多租户支持@TenantJob 注解定时任务自动遍历所有租户执行,SaaS 场景开箱即用
打卡时兜底mobilePunch 方法内判断即使定时任务未执行,员工打卡时也会自动创建当天记录

7.3 日期衍生字段

每条打卡记录除了存储日期(real_date)外,还自动填充两个衍生字段:

  • 星期week_day):1=周一 ... 7=周日,方便按星期统计
  • 年度周year_week):如"2026年第13周",方便按周维度查看考勤报表

八、表结构设计

8.1 四张表总览

表名记录数增长核心职责
hrm_attendance_config按部门数一个部门最多一条配置记录
hrm_punch_record按人×天每人每天一条打卡记录(预生成 + 打卡回填)
hrm_holiday_plan按年/方案节假日方案主表
hrm_holiday_plan_detail按方案×天节假日方案的每一天明细

8.2 考勤配置表 hrm_attendance_config

字段类型说明
dept_idbigint部门 ID(唯一约束)
punch_modetinyint打卡模式:1=位置打卡 2=内网打卡
longitude / latitudedoubleGPS 中心坐标(仅位置模式)
punch_radiusint打卡半径(米),默认 200
allow_field_punchtinyint是否允许外勤打卡
need_checktinyint是否纳入考核
work_daysvarchar(50)工作日(如 "1,2,3,4,5"
holiday_plan_idbigint关联的节假日方案
work_start_time / work_end_timevarchar(20)上下班时间(如 "09:00:00"
allow_late_days / allow_early_leave_daysint每月允许迟到/早退天数
late_deduct_amount / early_leave_deduct_amountdecimal迟到/早退扣款金额

8.3 打卡记录表 hrm_punch_record

字段类型说明
user_id / user_namebigint / varchar打卡人
dept_id / dept_namebigint / varchar所在部门
real_datedate打卡日期
week_dayint星期(1=周一 ... 7=周日)
year_weekvarchar(50)年度周(如"2026年第13周")
check_in_timetime签到时间(空=未签到/缺卡)
check_in_statustinyint签到状态:0=正常 1=迟到 2=外勤
check_out_timetime签退时间(空=未签退/缺卡)
check_out_statustinyint签退状态:0=正常 1=早退 2=外勤
is_overtimetinyint是否加班打卡(非工作日打卡自动标记)

九、核心代码精选

9.1 考勤配置递归继承

后端通过递归查找实现配置继承——先查本部门,没有则查父部门,逐级向上直到找到配置或到达组织树顶端:

@Override
public AttendanceConfigRespVO getAttendanceConfigByDeptId(Long deptId) {
    AttendanceConfigDO config = attendanceConfigMapper.selectByDeptId(deptId);
    if (config != null) {
        AttendanceConfigRespVO respVO = BeanUtils.toBean(config, AttendanceConfigRespVO.class);
        respVO.setInherited(false); // 本级自有配置
        return respVO;
    }
    DeptRespDTO dept = deptApi.getDept(deptId).getCheckedData();
    if (dept == null || dept.getParentId() == null || dept.getParentId() == 0) {
        return null; // 已到顶级
    }
    AttendanceConfigRespVO parentConfig = getAttendanceConfigByDeptId(dept.getParentId());
    if (parentConfig != null) {
        parentConfig.setInherited(true); // 标记为继承配置
    }
    return parentConfig;
}

9.2 工作日三级优先级判定

打卡时判断"今天是否工作日"的核心逻辑,节假日方案优先级最高:

private boolean isWorkDay(AttendanceConfigRespVO config) {
    LocalDate today = LocalDate.now();
    int dayOfWeek = today.getDayOfWeek().getValue();
    // 1. 优先检查节假日方案
    if (config.getHolidayPlanId() != null) {
        Integer holidayType = holidayPlanService.getHolidayType(
            config.getHolidayPlanId(), today);
        if (holidayType != null) {
            if (holidayType == 1) return false; // 休假 → 非工作日
            if (holidayType == 2) return true;  // 补班 → 工作日
        }
    }
    // 2. 根据工作日设置判断
    String workDays = config.getWorkDays();
    if (workDays == null || workDays.isEmpty()) {
        workDays = "1,2,3,4,5"; // 默认周一到周五
    }
    Set<Integer> workDaySet = Arrays.stream(workDays.split(","))
            .map(String::trim).filter(s -> !s.isEmpty())
            .map(Integer::parseInt).collect(Collectors.toSet());
    return workDaySet.contains(dayOfWeek);
}

9.3 外勤状态后端强制覆盖

前端提交打卡请求时携带 statusFlag(正常/迟到),但如果是外勤打卡,后端会强制将状态覆盖为外勤(2),确保数据准确性:

int statusFlag = reqVO.getStatusFlag();
if (isFieldPunch) {
    statusFlag = 2; // 外勤打卡,强制标记
}

十、RuoYi Office 的创新性设计总结

10.1 "配置下发 + 前端决策"的轻量架构

与很多考勤系统将所有校验逻辑放在后端不同,RuoYi Office 采用了**"后端下发配置 + 前端实时决策"**的轻量模式:

  • 后端 /info 接口一次性下发配置(上下班时间、GPS中心、半径、打卡模式、是否工作日)和今日已有记录
  • 前端拿到配置后独立完成:GPS 定位 → 距离计算 → 迟到/早退判定 → 按钮状态渲染
  • 前端 /do 接口提交打卡(punchType、statusFlag、isOvertime、isFieldPunch)
  • 后端只负责记录写入,外勤时强制覆盖 statusFlag

好处:用户无需等待网络往返即可看到"迟到""早退""外勤"等提示,交互响应更快;后端逻辑简洁,易于维护。

10.2 技术亮点汇总

能力实现方式价值
部门级配置继承递归向上查找 + inherited 标记总部一次配置,分支自动继承
GPS/内网双模punchMode 切换 + 条件定位覆盖外出企业和内网部署两种场景
Haversine 围栏前端实时距离计算精确判定是否在打卡范围内
外勤打卡超范围 + 允许外勤 → status=2灵活覆盖出差、外出等场景
六态按钮变色computed + 动态 CSS class打卡场景一目了然
波纹动画CSS @keyframes 三层错时移动端体验对标主流打卡 App
节假日方案主从表 + 三级优先级判定灵活配置法定节假日调休
定时预生成XXL-Job + @TenantJob 幂等缺卡有据可查,多租户支持
跨端定位条件编译 H5/小程序/APP一套代码覆盖多端
Excel 导入字典标签/值双映射兼容"正常"和"0"两种输入
多租户隔离全表带 tenant_idSaaS 场景开箱即用

十一、快速体验

在线体验

  • 演示地址ruoyioffice.com/web/
  • 账号密码:admin / admin123
  • 操作路径:人力资源管理 → 假勤管理 → 考勤配置 / 考勤打卡 / 打卡记录

推荐体验路径

  1. 在"考勤配置"中选择一个部门,设置打卡模式为"内网打卡",配置上下班时间
  2. 到"考勤打卡"页面体验圆钮打卡,观察按钮颜色和状态提示的变化
  3. 在"打卡记录"中查看打卡数据,尝试 Excel 导入导出功能
  4. 在手机端(H5)打开系统,体验波纹动画打卡效果

源码获取

平台仓库地址
GitCode(后端)gitcode.com/zhouzhongya…
GitCode(前端)gitcode.com/zhouzhongya…
GitHub(后端)github.com/yuqing2026/…

技术栈速览

层次技术版本
后端框架Spring Boot / Spring Cloud3.5
定时任务XXL-Job最新版
PC 前端Vue 3 + Vben Admin + Ant Design Vue5.x / 4.x
移动端UniApp + Vue 3 + wot-design-uni最新版
地图天地图 SDK最新版

结语

考勤管理的复杂度不在于"打个卡",而在于围绕这个动作的一整套规则体系。 哪些部门什么时间上下班?GPS 围栏还是内网免定位?法定节假日怎么调休?员工忘打卡怎么追查?PC 端和手机端怎么保持一致?

RuoYi Office 的考勤模块,用部门级配置继承解决了多级组织的规则差异,用 GPS/内网双模覆盖了不同部署场景,用节假日方案灵活应对调休补班,用定时预生成确保数据的完整性,用六态变色按钮 + 波纹动画打造了直观的打卡体验——在"轻量"和"完整"之间找到了恰当的平衡。

如果你正在寻找一套开箱即用的企业考勤解决方案,或者需要了解考勤系统的技术设计思路,RuoYi Office 值得一试。


💡 觉得有价值?

Star 仓库gitee.com/yqzy1688/ru…

💬 技术交流:添加💬 17156169080,备注「RuoYi Office」,加入技术交流群

📚 更多文章ruoyioffice.com