用户每次打卡根据时间插入打卡状态,如果没有打卡则状态为缺卡,该怎么去统计这个状态记录?会有一个工作日表和打卡点表。 我写定时任务,月度考核表时发现表设计可能有缺陷。
/**
* 根据当日考勤状态 设置月考核表: 正常、异常、缺卡、早退、考勤率等字段
*
* @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 |
1
imyasON OP 大佬给看看
|
2
thtznet 2023-10-31 11:11:13 +08:00
先出日程,再用实际考勤匹配到日程,然后可以算出缺失
|
4
thtznet 2023-10-31 11:18:21 +08:00
和用户多少没关系的吧,再多用户也肯定要现有日程出来,没有日程怎么计算是漏考勤还是外出公干或者在休假?
|
5
BingoXuan 2023-10-31 11:24:17 +08:00
@imyasON
默认按工作日上班,周末休息。然后根据日程选不同的打卡策略(比如早午晚三班或者朝九晚六,外勤打卡等),根据打卡记录套日程计算考勤纪录。 |
6
Maboroshii 2023-10-31 11:29:41 +08:00 via Android
每天统计一下打卡的人,剩下的就是缺卡的,写入数据库就行。
用 sql 写的话,用户表 left join 打卡表指定日期,join 结果为 null 的就是缺勤的。 |
7
baihekong 2023-10-31 11:29:59 +08:00
没有迟到打卡、早退打卡、上班打卡、下班打卡,什么打卡都没有就是缺卡了
|
8
imyasON OP |
10
imyasON OP 现在有一个思路:
1. 查询当天是否为考勤日; 2. 查询永久签到点对应的机构;(不止一个永久签到点) 3. 查询临时签到点对应的机构;(不止一个) 4. 查询这些机构下对应的用户 id; 5. 根据 id 筛选出今日考勤记录表中无记录者;(这要考虑签到点开始签到结束时间 ?) 6. 然后对这些 id 去新增缺卡记录; 7. 这个定时任务 开始的时间怎么定? 每天凌晨一次 ? @thtznet @BingoXuan @Maboroshii @baihekong |
11
imyasON OP 像钉钉、企微微信他们是怎么做的啊?
|
12
thtznet 2023-10-31 15:53:26 +08:00
@imyasON 不管如何实现,最基础的逻辑肯定是要先出日程的,职员日程可以算是一个基础。唯一的区别是考虑的数据量的问题,是一次性预排多少日程,如果是轻度的功能,可以今天只出明天的日程(明天出后天的),如果是涉及到制造业排班次的,那么可能要某天出下周或者下个月的日程,或者一次性出一年的日程。排日程可以后台生成,也可以前台手工操作(例如排班次)。
|
13
NewYear 2023-10-31 17:41:15 +08:00
下载一个中控考勤系统,研究一下它的数据库结构和用法(逻辑)吧,自己做考勤系统还是挺折腾的,不要闭门造车。
其实也可以把企业微信的打卡数据采集生成到中控的数据库里,然后中控考勤软件就是你的考勤软件了,简直不要太简单。 别给自己找事情干,全是坑,直接把数据交给中控,简单靠谱,标准产品也不怕总是提需求。 |
15
imyasON OP @NewYear 这个中控考勤系统,我不是太了解。 需求给的是做一个考勤系统,完全就是类似钉钉或者企微,的打卡逻辑和统计。不过还有一个后台管理系统,可以设置打卡点,统计,月报导出,考勤人工审核等。不知道这个中控用不用的了
|