yudao-cloud考勤管理:打卡记录与请假审批

yudao-cloud考勤管理:打卡记录与请假审批

【免费下载链接】yudao-cloud ruoyi-vue-pro 全新 Cloud 版本,优化重构所有功能。基于 Spring Cloud Alibaba + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】yudao-cloud 项目地址: https://gitcode.com/gh_mirrors/yu/yudao-cloud

痛点:传统考勤管理的困境

在企业日常运营中,考勤管理一直是HR和员工共同关注的焦点。你是否遇到过以下场景:

  • ❌ 员工手动填写纸质请假单,审批流程繁琐耗时
  • ❌ 打卡记录分散在各个系统,数据统计困难
  • ❌ 审批流程不透明,员工无法实时跟踪进度
  • ❌ 考勤数据与薪资计算脱节,容易产生误差
  • ❌ 多分支机构考勤规则不统一,管理成本高

yudao-cloud基于Spring Cloud Alibaba微服务架构,提供了完整的考勤管理解决方案,将打卡记录与请假审批完美融合,让企业考勤管理变得简单高效。

技术架构:微服务下的考勤体系

mermaid

核心功能详解

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实现了灵活的请假审批流程:

mermaid

请假申请核心代码:

@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完整的管理功能
移动端APPUniApp跨平台支持
微信小程序原生小程序轻量级访问
API接口Spring Cloud第三方集成

2. 自定义审批流程

通过Flowable设计器,企业可以自定义审批流程:

mermaid

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,开启智能考勤管理新时代!

【免费下载链接】yudao-cloud ruoyi-vue-pro 全新 Cloud 版本,优化重构所有功能。基于 Spring Cloud Alibaba + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城、CRM、ERP、AI 大模型等功能。你的 ⭐️ Star ⭐️,是作者生发的动力! 【免费下载链接】yudao-cloud 项目地址: https://gitcode.com/gh_mirrors/yu/yudao-cloud

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值