辅导C/C++国外、辅导JAVA、辅导python CS程序
- 首页 >> 其他一、班段考勤算法(普通员工正常班段考勤)
为方便描述,时间单位均为分钟。
员工的空间位置状态分厂外、单位内两种。
1)初始化数据
1.1)获取班段的开始时间Ts,结束时间Te,同时获取该班段打卡时间范围内的所有打卡记录,按打卡时间升序排列所有打卡记录。打开记录按时间可分[Ts-30, Ts],(Ts,Te)以及[Te, Te-30]3个区段。
1.2)[Ts-30, Ts]区间内仅保留最后一条所有打卡记录,删除其他记录。
1.3)[Te, Te-30]区间内仅保留第一条打卡记录,删除其他记录。
1.4)把[Ts, Te]区间内连续且超过3个单位打卡记录中除头尾之外的所有打卡记录删除,仅保留头尾两条记录。
把初始化后的所有打卡记录记为R,长度为n,Ri为第i条打卡记录。
2)计算员工是否在岗及相应的时长(不考虑请假)。
系统只记录头和尾两次出厂打卡记录。
系统从第一条时间开始检索
分为四种情况:
2.1若先查找到单位打卡时间再查找到出厂打卡时间,则该时间段为在岗时间
2.2若先查找到出厂打卡时间再查找到单位打卡时间,则该时间段为不在岗时间。
2.3若先查找到出厂打卡时间,而且下一次查找到的也是出厂打卡时间,那么该时间段为不在岗时间。
2.4若先查找到单位打卡时间,而且下一次查找到的也是单位打卡时间,那么该时间段为在岗时间。
数据结构:可以使用队列进行存储单位打卡时间和出厂打卡时间,单位打卡时间和出厂打卡时间使用不同的标记,利用队列先进先出的特点进行排序,然后进行每一次的单位打卡时间和出厂打卡时间的搜索。
3)结合请假条,进一步区分每个不在岗区段的类型及时长。(在岗区段可直接判定为出勤)
业务规则1)在一个连续不在岗时段A(不考虑请假,该不在岗的类型为早退)被假条切割后,请假时间区段B为请假,B后的区段算早退,其他区段的考勤参考该区段A之前的区段的状态。(如果有多张假条,则B为最后一张请假条的时间区段)
业务规则2)在一个连续不在岗时段(不考虑请假,该不在岗的类型为迟到或者溜号)被假条切割后,如果有溜号,溜号次数算一次,溜号时间累计)
(1)不正常上下班打卡
1.1不正常上班打卡
Case1如果在上班时间之后进行打卡,但是在正常下班时间内进行了下班打卡,则视为迟到,迟到时间为打卡时间-正常上班时间-30(迟到30分钟内不计)
员工在岗,相应的时长为:上班打卡时间到下班打卡时间
Case2如果在正常上班时间前半小时进行了上班打卡,且有正常下班打卡,则视为正常出勤,出勤时间为正常上班时间到正常下班时间。
Case3如果没有在规定时间内进行上班打卡,但是有到厂区内进行出厂打卡,那么从正常上班打卡时间到出厂打卡这段时间内视为迟到,从这以后到正常下班打卡时视为溜号,在岗时间为全天不在岗。
1.2不正常下班打卡
Case1如果在正常下班时间后半小时内进行打卡,且有正常上班打卡,则视为正常出勤,出勤时间为正常上班时间到正常下班时间。
Case2如果在正常下班半小时前进行打卡,且有正常上班打卡,则视为早退。
出勤时间为正常上班打卡时间打下班打卡时间,早退时间为正常下班打卡时间-打卡下班时间-30,若不足30分钟则不计。
Case3如果在正常上班打卡时间内进行打卡,而且有出厂打卡,但是无下班打卡,那么从出厂打卡到正常下班时间为早退,在岗时间为正常上班打卡时间到出厂打卡时间
1.3不正常上班打卡和下班打卡
Case1如果在单位没有任何打卡记录,则视为旷工一天(就算在厂有打卡记录,也算旷工)。
(2)正常上班打卡与正常下班打卡
Case1如果在正常上班打卡后,离开厂区,且有下班打卡,则视为溜号,溜号时间为离开厂区的打卡时间与下班打卡时间之差-30(30分钟内不计)
Case2如果正常上下班,但是有请假,且请假正常,则请假时间视为正常在岗时间。
4)统计班段考勤结论
业务规则:迟到、早退及溜号统计规则:假设迟到时间为X分钟,如果X<=30,则记迟到一次,累计为0分钟。如果X>30,则记迟到一次,累计为X-30分钟。早退及溜号统计规则类似。
细化算法框架中的第二步和第三步
完成算法中设计的数据的设计