yudao-cloud考勤管理:打卡记录与请假审批
痛点:传统考勤管理的困境
在企业日常运营中,考勤管理一直是HR和员工共同关注的焦点。你是否遇到过以下场景:
- ❌ 员工手动填写纸质请假单,审批流程繁琐耗时
- ❌ 打卡记录分散在各个系统,数据统计困难
- ❌ 审批流程不透明,员工无法实时跟踪进度
- ❌ 考勤数据与薪资计算脱节,容易产生误差
- ❌ 多分支机构考勤规则不统一,管理成本高
yudao-cloud基于Spring Cloud Alibaba微服务架构,提供了完整的考勤管理解决方案,将打卡记录与请假审批完美融合,让企业考勤管理变得简单高效。
技术架构:微服务下的考勤体系
核心功能详解
1. 智能打卡记录系统
yudao-cloud的打卡模块支持多种打卡方式:
| 打卡方式 | 技术实现 | 适用场景 | 安全特性 |
|---|---|---|---|
| GPS定位打卡 | 高德地图API + 地理围栏 | 外勤人员 | 位置验证+时间戳 |
| WiFi打卡 | MAC地址识别 | 办公室内 | 指定网络环境 |
| 二维码打卡 | 动态二维码生成 | 固定点位 | 防作弊机制 |
| 人脸识别打卡 | 生物特征识别 | 高安全要求 | 活体检测 |
打卡数据模型示例:
@Data
@TableName("attendance_checkin")
public class AttendanceCheckinDO extends BaseDO {
@TableId
private Long id;
private Long userId; // 用户ID
private LocalDateTime checkinTime; // 打卡时间
private String location; // 打卡位置
private Integer checkinType; // 打卡类型:1-上班,2-下班
private String deviceId; // 设备标识
private String wifiSsid; // WiFi名称
private Integer status; // 状态:1-正常,2-迟到,3-早退,4-缺卡
private String remark; // 备注信息
}
2. 请假审批工作流
基于Flowable工作流引擎,yudao-cloud实现了灵活的请假审批流程:
请假申请核心代码:
@PostMapping("/create")
@PreAuthorize("@ss.hasPermission('bpm:oa-leave:create')")
@Operation(summary = "创建请假申请")
public CommonResult<Long> createLeave(@Valid @RequestBody BpmOALeaveCreateReqVO createReqVO) {
return success(leaveService.createLeave(getLoginUserId(), createReqVO));
}
@Service
public class BpmOALeaveServiceImpl implements BpmOALeaveService {
@Transactional
public Long createLeave(Long userId, BpmOALeaveCreateReqVO createReqVO) {
// 计算请假天数
long day = LocalDateTimeUtil.between(
createReqVO.getStartTime(),
createReqVO.getEndTime()
).toDays();
// 保存请假数据
BpmOALeaveDO leave = BeanUtils.toBean(createReqVO, BpmOALeaveDO.class)
.setUserId(userId)
.setDay(day)
.setStatus(BpmTaskStatusEnum.RUNNING.getStatus());
leaveMapper.insert(leave);
// 发起审批流程
Map<String, Object> variables = new HashMap<>();
variables.put("day", day);
String processInstanceId = processInstanceApi.createProcessInstance(userId,
new BpmProcessInstanceCreateReqDTO()
.setProcessDefinitionKey("oa_leave")
.setVariables(variables)
.setBusinessKey(String.valueOf(leave.getId()))
).getCheckedData();
// 关联流程实例
leaveMapper.updateById(new BpmOALeaveDO()
.setId(leave.getId())
.setProcessInstanceId(processInstanceId));
return leave.getId();
}
}
3. 考勤数据统计与分析
yudao-cloud提供多维度的考勤统计功能:
-- 月度考勤统计查询
SELECT
u.username as 姓名,
COUNT(CASE WHEN c.checkin_type = 1 AND c.status = 1 THEN 1 END) as 正常上班,
COUNT(CASE WHEN c.checkin_type = 1 AND c.status = 2 THEN 1 END) as 迟到次数,
COUNT(CASE WHEN c.checkin_type = 2 AND c.status = 3 THEN 1 END) as 早退次数,
COUNT(CASE WHEN c.checkin_type = 1 AND c.status = 4 THEN 1 END) as 缺卡次数,
SUM(l.day) as 请假天数
FROM system_users u
LEFT JOIN attendance_checkin c ON u.id = c.user_id
AND c.checkin_time BETWEEN '2024-01-01' AND '2024-01-31'
LEFT JOIN bpm_oa_leave l ON u.id = l.user_id
AND l.status = 2
AND l.start_time <= '2024-01-31'
AND l.end_time >= '2024-01-01'
GROUP BY u.id, u.username;
集成与扩展能力
1. 多终端支持
yudao-cloud考勤系统支持多种终端接入:
| 终端类型 | 技术栈 | 特性 |
|---|---|---|
| Web管理端 | Vue3 + Element Plus | 完整的管理功能 |
| 移动端APP | UniApp | 跨平台支持 |
| 微信小程序 | 原生小程序 | 轻量级访问 |
| API接口 | Spring Cloud | 第三方集成 |
2. 自定义审批流程
通过Flowable设计器,企业可以自定义审批流程:
3. 数据安全与合规
- 🔐 数据加密:敏感信息 AES256 加密存储
- 👥 权限控制:基于RBAC的细粒度权限管理
- 📊 审计日志:所有操作留痕,满足合规要求
- 🌐 多租户隔离:SaaS模式下数据完全隔离
实战:快速搭建考勤系统
1. 环境准备
# 克隆项目
git clone https://gitcode.com/gh_mirrors/yu/yudao-cloud.git
# 安装依赖
cd yudao-cloud
mvn clean install -DskipTests
# 启动Nacos服务
docker-compose -f script/docker/docker-compose.yml up -d nacos
# 初始化数据库
mysql -uroot -p < sql/mysql/ruoyi-vue-pro.sql
2. 考勤模块配置
# application-attendance.yml
yudao:
attendance:
checkin:
# 打卡时间容差(分钟)
tolerance-time: 10
# 允许打卡距离(米)
allow-distance: 100
# 工作日设置
work-days: [1,2,3,4,5]
leave:
# 请假类型配置
types:
- { id: 1, name: '年假', code: 'annual_leave' }
- { id: 2, name: '病假', code: 'sick_leave' }
- { id: 3, name: '事假', code: 'personal_leave' }
3. 核心业务实现
打卡服务示例:
@Service
@Slf4j
public class AttendanceCheckinService {
@Resource
private AttendanceCheckinMapper checkinMapper;
@Resource
private RedisTemplate<String, Object> redisTemplate;
public CheckinResult checkin(CheckinRequest request) {
// 1. 验证打卡频率(防刷)
String lockKey = "checkin:lock:" + request.getUserId();
if (Boolean.TRUE.equals(redisTemplate.hasKey(lockKey))) {
throw new ServiceException("打卡过于频繁,请稍后再试");
}
redisTemplate.opsForValue().set(lockKey, 1, 30, TimeUnit.SECONDS);
// 2. 位置验证
if (!validateLocation(request.getLatitude(), request.getLongitude())) {
throw new ServiceException("不在允许的打卡范围内");
}
// 3. 保存打卡记录
AttendanceCheckinDO checkin = BeanUtils.toBean(request, AttendanceCheckinDO.class);
checkin.setCheckinTime(LocalDateTime.now());
checkin.setStatus(calculateCheckinStatus(checkin));
checkinMapper.insert(checkin);
// 4. 返回结果
return new CheckinResult(checkin.getId(), checkin.getStatus(), "打卡成功");
}
private boolean validateLocation(Double lat, Double lng) {
// 实现地理围栏验证逻辑
return true;
}
private Integer calculateCheckinStatus(AttendanceCheckinDO checkin) {
// 根据打卡时间计算状态(正常、迟到、早退)
LocalTime checkinTime = checkin.getCheckinTime().toLocalTime();
if (checkin.getCheckinType() == 1) { // 上班打卡
return checkinTime.isAfter(LocalTime.of(9, 10)) ? 2 : 1;
} else { // 下班打卡
return checkinTime.isBefore(LocalTime.of(18, 0)) ? 3 : 1;
}
}
}
性能优化策略
1. 缓存设计
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
return RedisCacheManager.builder(factory)
.cacheDefaults(RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(1))
.disableCachingNullValues())
.withInitialCacheConfigurations(Map.of(
"attendanceStats", RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1)),
"userCheckinRecords", RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofHours(6))
)).build();
}
}
2. 数据库优化
-- 创建考勤记录索引
CREATE INDEX idx_checkin_user_time ON attendance_checkin(user_id, checkin_time);
CREATE INDEX idx_leave_user_status ON bpm_oa_leave(user_id, status);
-- 分区表设计(按月份分区)
ALTER TABLE attendance_checkin PARTITION BY RANGE (YEAR(checkin_time)*100 + MONTH(checkin_time)) (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
PARTITION p202403 VALUES LESS THAN (202404)
);
总结与展望
yudao-cloud的考勤管理系统通过微服务架构实现了打卡记录与请假审批的高度集成,具备以下优势:
🎯 核心价值:
- 一站式解决企业考勤管理全流程需求
- 灵活可配置的审批流程,适应不同企业制度
- 高性能高可用的分布式架构设计
- 完善的安全控制和审计追踪
🚀 未来规划:
- 集成AI人脸识别技术,提升打卡安全性
- 支持更多考勤设备硬件对接
- 增强移动端体验,支持离线打卡
- 提供更丰富的考勤数据分析报表
通过yudao-cloud的考勤管理解决方案,企业可以快速构建稳定、高效、智能的考勤系统,大幅提升人力资源管理效率,降低运营成本。
立即体验:部署yudao-cloud,开启智能考勤管理新时代!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



