考勤记录缺卡怎么统计?

197 天前
 imyasON

用户每次打卡根据时间插入打卡状态,如果没有打卡则状态为缺卡,该怎么去统计这个状态记录?会有一个工作日表和打卡点表。 我写定时任务,月度考核表时发现表设计可能有缺陷。

/**
 * 根据当日考勤状态 设置月考核表: 正常、异常、缺卡、早退、考勤率等字段
 *
 * @param record                {@link AttendanceRecord}
 * @param attendanceMonthAssess {@link AttendanceMonthAssess}
 */
public void setRecordStatus(AttendanceRecord record, AttendanceMonthAssess attendanceMonthAssess) {

    // 根据今天打卡状态 更新天数
    Integer signStatus = record.getSignStatus();
    Integer outStatus = record.getOutStatus();
    if (outStatus.equals(RecordStatusEnum.IGNORE.getKey()) || signStatus.equals(outStatus)) {
        switch (signStatus) {
            case 0:
                // 异常天
                attendanceMonthAssess.setAbnormal(attendanceMonthAssess.getAbnormal() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                break;
            case 1:
                // 正常天
                attendanceMonthAssess.setNormal(attendanceMonthAssess.getNormal() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                break;
            case 2:
                // 缺卡天
                attendanceMonthAssess.setAbnormal(attendanceMonthAssess.getAbnormal() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                attendanceMonthAssess.setAbsent(attendanceMonthAssess.getAbsent() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                break;
            case 3:
                // 早退天
                attendanceMonthAssess.setAbnormal(attendanceMonthAssess.getAbnormal() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                attendanceMonthAssess.setEarlyLeave(attendanceMonthAssess.getEarlyLeave() == null ? 1 : attendanceMonthAssess.getNormal() + 1);
                break;
            default:
        }
    } else {
        // todo:签到签退状态不同,且签退计入考勤

    }

这是考勤表设计:

字段 类型 备注
id long id
agent_code String 代理人编码
agent_name String 代理人姓名
lng double 经度
lat double 纬度
sign_address String
sign_id long 考勤点 id
sign_time datetime 实际签到时间
out_time datetime 实际签退时间
sign_status int 状态:有效、无效、缺卡
out_status int 状态:有效、无效、缺卡、不计考勤
face_url String 打卡底片 url
attendance_group String 考勤组
modify_by String 修改人
modify_time date 修改时间
is_delete int 是否删除
sign_date date 考勤日期 yyyyMMdd
extra1 String 备用字段 1
extra2 String 备用字段 2
1479 次点击
所在节点    程序员
18 条回复
imyasON
197 天前
大佬给看看
thtznet
197 天前
先出日程,再用实际考勤匹配到日程,然后可以算出缺失
imyasON
197 天前
@thtznet 用户多的话?怎么出日程哇
thtznet
197 天前
和用户多少没关系的吧,再多用户也肯定要现有日程出来,没有日程怎么计算是漏考勤还是外出公干或者在休假?
BingoXuan
197 天前
@imyasON
默认按工作日上班,周末休息。然后根据日程选不同的打卡策略(比如早午晚三班或者朝九晚六,外勤打卡等),根据打卡记录套日程计算考勤纪录。
Maboroshii
197 天前
每天统计一下打卡的人,剩下的就是缺卡的,写入数据库就行。

用 sql 写的话,用户表 left join 打卡表指定日期,join 结果为 null 的就是缺勤的。
baihekong
197 天前
没有迟到打卡、早退打卡、上班打卡、下班打卡,什么打卡都没有就是缺卡了
imyasON
197 天前
@BingoXuan
@Maboroshii
签到点设置,分永久和临时。每个签到点对应不同的机构,还有签退不计考勤选项。统计所有机构用户的缺卡,还是没有具体的思路
imyasON
197 天前
@baihekong 是的用户考勤记录表里没有考勤日记录,就是缺卡了。但是统计出来的话有点棘手
imyasON
197 天前
现在有一个思路:
1. 查询当天是否为考勤日;
2. 查询永久签到点对应的机构;(不止一个永久签到点)
3. 查询临时签到点对应的机构;(不止一个)
4. 查询这些机构下对应的用户 id;
5. 根据 id 筛选出今日考勤记录表中无记录者;(这要考虑签到点开始签到结束时间 ?)
6. 然后对这些 id 去新增缺卡记录;
7. 这个定时任务 开始的时间怎么定? 每天凌晨一次 ?

@thtznet
@BingoXuan
@Maboroshii
@baihekong
imyasON
197 天前
像钉钉、企微微信他们是怎么做的啊?
thtznet
197 天前
@imyasON 不管如何实现,最基础的逻辑肯定是要先出日程的,职员日程可以算是一个基础。唯一的区别是考虑的数据量的问题,是一次性预排多少日程,如果是轻度的功能,可以今天只出明天的日程(明天出后天的),如果是涉及到制造业排班次的,那么可能要某天出下周或者下个月的日程,或者一次性出一年的日程。排日程可以后台生成,也可以前台手工操作(例如排班次)。
NewYear
197 天前
下载一个中控考勤系统,研究一下它的数据库结构和用法(逻辑)吧,自己做考勤系统还是挺折腾的,不要闭门造车。

其实也可以把企业微信的打卡数据采集生成到中控的数据库里,然后中控考勤软件就是你的考勤软件了,简直不要太简单。

别给自己找事情干,全是坑,直接把数据交给中控,简单靠谱,标准产品也不怕总是提需求。
imyasON
197 天前
@thtznet 日程表,是有的默认俺周六日为休,后台可手动维护。
imyasON
197 天前
@NewYear 这个中控考勤系统,我不是太了解。 需求给的是做一个考勤系统,完全就是类似钉钉或者企微,的打卡逻辑和统计。不过还有一个后台管理系统,可以设置打卡点,统计,月报导出,考勤人工审核等。不知道这个中控用不用的了
NewYear
197 天前
@imyasON

懂了,你要继续闭门造车,打扰了。
thtznet
194 天前
@imyasON OP ,考勤系统不是技术问题,你首先要有业务方面的顾问,如果你们都是技术实现者,靠自己去理解 HR 体系的一些业务是不可能完善的,即便勉强做出来,很有可能因为一个小的业务疏漏导致全部需要推倒重来。业务领域的建模不是工程师的事情,一定要有专业的业务顾问,没有就外包或者外聘,先出业务架构,然后再考虑技术实现。从你的描述来看,你们团队里很明显没有资深的业务顾问,我建议你先停下技术实现,集中资源搞定业务设计再来看实现。
imyasON
194 天前
@thtznet 多谢,确实缺少技术架构。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/986978

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX