V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
imyasON
V2EX  ›  程序员

考勤记录缺卡怎么统计?

  •  
  •   imyasON · 183 天前 · 1452 次点击
    这是一个创建于 183 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    /**
     * 根据当日考勤状态 设置月考核表: 正常、异常、缺卡、早退、考勤率等字段
     *
     * @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
    18 条回复    2023-11-03 09:46:32 +08:00
    imyasON
        1
    imyasON  
    OP
       183 天前
    大佬给看看
    thtznet
        2
    thtznet  
       183 天前
    先出日程,再用实际考勤匹配到日程,然后可以算出缺失
    imyasON
        3
    imyasON  
    OP
       183 天前
    @thtznet 用户多的话?怎么出日程哇
    thtznet
        4
    thtznet  
       183 天前
    和用户多少没关系的吧,再多用户也肯定要现有日程出来,没有日程怎么计算是漏考勤还是外出公干或者在休假?
    BingoXuan
        5
    BingoXuan  
       183 天前
    @imyasON
    默认按工作日上班,周末休息。然后根据日程选不同的打卡策略(比如早午晚三班或者朝九晚六,外勤打卡等),根据打卡记录套日程计算考勤纪录。
    Maboroshii
        6
    Maboroshii  
       183 天前 via Android
    每天统计一下打卡的人,剩下的就是缺卡的,写入数据库就行。

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

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

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

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

    懂了,你要继续闭门造车,打扰了。
    thtznet
        17
    thtznet  
       180 天前
    @imyasON OP ,考勤系统不是技术问题,你首先要有业务方面的顾问,如果你们都是技术实现者,靠自己去理解 HR 体系的一些业务是不可能完善的,即便勉强做出来,很有可能因为一个小的业务疏漏导致全部需要推倒重来。业务领域的建模不是工程师的事情,一定要有专业的业务顾问,没有就外包或者外聘,先出业务架构,然后再考虑技术实现。从你的描述来看,你们团队里很明显没有资深的业务顾问,我建议你先停下技术实现,集中资源搞定业务设计再来看实现。
    imyasON
        18
    imyasON  
    OP
       180 天前
    @thtznet 多谢,确实缺少技术架构。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   897 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 705ms · UTC 22:54 · PVG 06:54 · LAX 15:54 · JFK 18:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.