用户每次打卡根据时间插入打卡状态,如果没有打卡则状态为缺卡,该怎么去统计这个状态记录?会有一个工作日表和打卡点表。 我写定时任务,月度考核表时发现表设计可能有缺陷。
/** * 根据当日考勤状态 设置月考核表: 正常、异常、缺卡、早退、考勤率等字段 * * @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 |
