人事管理 的大部分功能都需要依赖于 清晰完整的打卡逻辑与明确的考勤状态
所以需要先完成 考勤打卡功能
所以需要先弄懂后台的考勤组与班次
考勤状态分析
考勤状态分类
两大类打卡
签到(需要4值与4时,形成4时间段)
正常
迟到
严重迟到
缺卡/旷工
签退(需要2值与2时,形成4时间段)
正常
早退
缺卡
全组合有12种,但旷工特殊,算了旷工通常不管签退了
故有10种情况
正常到 正常退
正常到 早退
正常到 缺退卡
迟到 正常退
迟到 早退
迟到 缺退卡
严重迟到 正常退
严重迟到 早退
严重迟到 缺退卡
旷工
再分 位置 正常/异常,就有
9 * 2 + 1 = 19种状态
状态与时间区间
当前思路
后台原型图上的控件是有误导性的,意思是表示时间值的,而非时间段了,
由下面同样使用时间段但明显意思是时间值的可以判断出来
打卡(请假的不参与,单独统计)
****************************************
状态
正常、异常[迟到、(严重迟到、旷工、)早退、缺卡]
时间点:
上班时间、下班时间、当日与次日的打卡记录时间界点
分别简称:上点、下点、界点
时间长度:
严重迟到判断时间、旷工判断时间
分别简称:严迟时、旷时
****************************************
########################################
不验证 严重迟到,不验证 旷工
只有四种基础状态:正常、迟到、早退、缺卡
是否少一个基础的迟到早退时间长度?类比 严迟时 与 旷时
正常
签到:(界点,上点]打卡
签退:[下点,界点)打卡
迟到:(上点,下点)打卡
早退:(上点,下点)打卡
早退与迟到范围一样,区别是迟到是第一次打卡,早退前有一次打卡才能区分是签到卡签退卡
缺卡:~~(界点,界点)无打卡~~
(界点,下点)无打卡
一次打卡都没
假如在[下点,界点)第一次打卡,构不成签到打卡,无签到打卡就构不成签退打卡,
故范围可以缩小到(界点,下点),
不对不对,这应该是旷工的逻辑全日缺卡就应该是是(界点,界点)
等一下,应该分全日缺卡、签退缺卡
全日缺卡:(界点,界点)无打卡
签到缺卡:(界点,下点)无打卡,[下点,界点)有打卡
不知道怎么界定范围,
反正是不论是 正常到 还是 迟到 的打卡范围,都没有 签到卡,
在 正常退 、 早退 打卡范围内 有 签退卡。
但问题还是那个,迟到与早退的区间重叠,无法区分是签到卡还是签退卡
签退缺卡:(界点,下点)有一打卡,[下点,界点)无打卡
也存在迟到与早退也是区间重叠问题
可能的实际状态:
正常到 正常退
正常到 早退
正常到 缺退卡
迟到 正常退
迟到 早退
迟到 缺退卡
缺到卡 正常退
缺到卡 早退(如下面的问题中,若无基础迟到时间,该情况无法区分是签到卡还是签退卡)
缺到卡 缺退卡
########################################
验证 严重迟到,不验证 旷工
只有五种基础状态:正常、迟到、严重迟到、早退、缺卡
正常
签到:(界点,上点]打卡
签退:[下点,界点)打卡
迟到:(上点,上点 + 严迟时]打卡
严重迟到:(上点 + 严迟时,下点)打卡
早退:(上点,下点)打卡
迟到/严重迟到 是第一次打卡,早退前必须有一次打卡,
早退前有一次打卡才能区分是签到卡签退卡
缺卡:
全日缺卡:(界点,界点)无打卡
签到缺卡:(界点,下点)无打卡,[下点,界点)有打卡
有问题如上
签退缺卡:(界点,下点)有一打卡,[下点,界点)无打卡
有问题如上
可能的实际状态:
正常到 正常退
正常到 早退
正常到 缺退卡
迟到 正常退
迟到 早退
迟到 缺退卡
严重迟到 正常退
严重迟到 早退
严重迟到 缺退卡
缺到卡 正常退
缺到卡 早退(类似的,无法区分签到签退卡)
缺到卡 缺退卡
########################################
不验证 严重迟到,验证 旷工
只有五种基础状态:正常、迟到、早退、缺卡、旷工
正常
签到:(界点,上点]打卡
签退:[下点,界点)打卡
迟到:(上点,上点 + 旷时]打卡
旷工:(界点,上点 + 旷时]未打卡,也就是签到范围内未打卡
早退:(上点,下点)打卡
缺卡:
签退缺卡:(界点,下点)有一打卡,[下点,界点)无打卡
有问题如上
旷工:
全日缺卡:(界点,下点)无打卡
签到缺卡:(界点,下点)无打卡,[下点,界点)有打卡
有问题如上
简单统计:(界点,上点 + 旷时]无打卡 就算旷工
可能的实际状态:
正常到 正常退
正常到 早退
正常到 缺退卡
迟到 正常退
迟到 早退
迟到 缺退卡
旷工
########################################
验证 严重迟到,验证 旷工
只有六种基础状态:正常、迟到、严重迟到、早退、缺卡、旷工
正常
签到:(界点,上点]打卡
签退:[下点,界点)打卡
迟到:(上点,上点 + 严迟时]打卡
严重迟到:(上点 + 严迟时,上点 + 旷时)打卡
旷工:(界点,上点 + 旷时]未打卡,也就是签到范围内未打卡
早退:(上点,下点)打卡
缺卡:
签退缺卡:(界点,下点)有一打卡,[下点,界点)无打卡
有问题如上
旷工:
全日缺卡:(界点,下点)无打卡
签到缺卡:(界点,下点)无打卡,[下点,界点)有打卡
有问题如上
简单统计:(界点,上点 + 旷时]无打卡 就行?
可能的实际状态:
正常到 正常退
正常到 早退
正常到 缺退卡
迟到 正常退
迟到 早退
迟到 缺退卡
严重迟到 正常退
严重迟到 早退
严重迟到 缺退卡
旷工
❓可能的问题
- 是否缺少基础的签到时间区间(界点到上点都可作为 正常签到打卡时间 是否不合理,后续正常班次前的临时紧急加班(还没提交加班申请)的签到怎么与正常班次的签到区分)
- 是否缺少基础的迟到时间区间(在不启用验证严重迟到与旷工时,整个工作时间都可作为 签到打卡时间 是否不合理),
基础迟到时间应该不小于严重迟到时间(与旷工时间的大小关系呢?),
或者换一种说法是 签到与签退的时间界限,
不然迟到与早退区间重叠,若当天只有此区间有一个打卡时,无法区分是 (迟到 缺退卡) 还是 (缺到卡 早退)
弹性时间分析
上面考勤状态 后面需要 添加考虑此弹性时间
也就是将上点与下点改为实际的上点与下点
flexible_early
允许弹性早到早退:0否1是
flexible_late
允许弹性晚到晚退: 0否1是
flexible_late_tomorrow
允许弹性第一天晚退第二天晚到: 0否1是
flexible_early_time
允许弹性早到早退时间(分钟)
flexible_late_time
允许弹性晚到晚退时间(分钟)
flexible_late_today_time
允许弹性第一天晚退时间(分钟)
flexible_late_tomorrow_time
允许弹性第二天晚到时间(分钟)
这里分别简称为
弹早
弹晚
弹跨
弹早时
弹晚时
弹跨补时
弹跨用时
弹晚
本质是 先欠后补
弹早、弹跨
本质都是 先补后用
互斥关系
弹晚 与 弹跨 互斥,不能同时启用
其他不互斥
加班问题
加班分类
根据申请表提交顺序
有2种情况
- 申请加班表通过,按时来加班
- 未提交申请表,临时紧急加班,之后补交申请表
根据加班在班次前后关系
组合有10种
加班 组合情况
首先分
班次前加班,
班次前加班不相连
相连
班次后加班
班次后加班不相连
相连
正常班次
班次前的相连加班
班次前的不相连加班
班次后的相连加班
班次后的不相连加班
整日加班
简称:
班
前加连
前加不连
连后加
不连后加
整日加班
下面是考虑的加班组合(10种):
班
班 连后加
班 不连后加
前加连 班
前加连 班 连后加
前加连 班 不连后加
前加不连 班
前加不连 班 连后加
前加不连 班 不连后加
整日加班
举例说明
例如班次[9:00, 18:00),周一到周五
[09:00, 18:00)
[09:00, 18:00) + [18:00, 20:00)
[09:00, 18:00) + [19:00, 20:00)
[07:00, 09:00) + [09:00, 18:00)
[07:00, 09:00) + [09:00, 18:00) + [18:00, 20:00)
[07:00, 09:00) + [09:00, 18:00) + [19:00, 20:00)
[02:00, 04:00) + [09:00, 18:00)
[02:00, 04:00) + [09:00, 18:00) + [18:00, 20:00)
[02:00, 04:00) + [09:00, 18:00) + [19:00, 20:00)
非班次日的[09:00, 18:00),或者更长、或者更短的时间段
加班与打卡
- 如何区分 正常班次前加班 的 签到卡 与 正常班次 签到卡(之前上面的问题:是否缺少基础的签到时间区间)
- 各种缺卡问题,怎么匹配签到卡与签退卡
- 正常班次相连的加班 与 正常班次 打2次卡还是1次卡,还是能自动记录打卡(可能工作中会遗忘,或者在异常打卡区间打卡了)
- attendance_record_daily表是什么时机填充信息?定时任务?
是否全量?不然当天没有打卡的没有统计信息,如果后续统计只依赖于此表,会造成混乱,在有考勤组、班次变更的时候无法确定是当日休息还是全日缺卡
更新时机?有用户补卡或管理员补卡?
那看板的信息是实时计算的? - 员工岗位变更、考勤组变更、班次变更,带来的考勤统计问题,应到天数、实到、缺勤等天数的变化。
是根据考勤组历史?班次历史?但好像没历史记录功能,我新加了两个字段
ALTER TABLE attendance_record
ADD COLUMN group_id bigint DEFAULT NULL COMMENT '打卡时所属考勤组ID',
ADD COLUMN shift_id bigint DEFAULT NULL COMMENT '打卡时班次ID';
- attendance_group_actual_member考勤组实际成员表 无软删除与增改日期记录,