考勤记录缺卡怎么统计? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
imyasON
V2EX    程序员

考勤记录缺卡怎么统计?

  •  
  •   imyasON 2023-10-31 10:18:04 +08:00 2194 次点击
    这是一个创建于 780 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    懂了,你要继续闭门造车,打扰了。
    thtznet
        17
    thtznet  
       2023-11-03 09:08:29 +08:00
    @imyasON OP ,考勤系统不是技术问题,你首先要有业务方面的顾问,如果你们都是技术实现者,靠自己去理解 HR 体系的一些业务是不可能完善的,即便勉强做出来,很有可能因为一个小的业务疏漏导致全部需要推倒重来。业务领域的建模不是工程师的事情,一定要有专业的业务顾问,没有就外包或者外聘,先出业务架构,然后再考虑技术实现。从你的描述来看,你们团队里很明显没有资深的业务顾问,我建议你先停下技术实现,集中资源搞定业务设计再来看实现。
    imyasON
        18
    imyasON  
    OP
       2023-11-03 09:46:32 +08:00
    @thtznet 多谢,确实缺少技术架构。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 14:37 PVG 22:37 LAX 06:37 JFK 09:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86