| | |
| | | throw new BaseException("å½åç¨æ·æ²¡æå¯¹åºçå工信æ¯"); |
| | | } |
| | | |
| | | // å½åæ¶é´ |
| | | LocalDateTime currentDateTime = LocalDateTime.now(); |
| | | |
| | | // 妿æå¡æ¶é´è¶
è¿èå¤ä¸çæ¶é´ä¸è½æå¡ |
| | | // è·åèå¤ä¸çæ¶é´ç¹ |
| | | String[] timeConfigs = getAttendanceTimeConfig(); |
| | | String timeConfig = timeConfigs[1]; |
| | | String[] timeParts = timeConfig.split(":"); |
| | | int standardHour = Integer.parseInt(timeParts[0]); |
| | | int standardMinute = Integer.parseInt(timeParts[1]); |
| | | // å½åæ¶é´ |
| | | int actualHour = currentDateTime.getHour(); |
| | | int actualMinute = currentDateTime.getMinute(); |
| | | // 夿æå¡æ¶é´æ¯å¦æäºå½åæ¶é´ |
| | | if (actualHour > standardHour || (actualHour == standardHour && actualMinute > standardMinute)) { |
| | | throw new BaseException("æå¡æ¶é´ä¸è½æäºä¸çæ¶é´"); |
| | | } |
| | | |
| | | // æ ¹æ®åå·¥IDåå½åæ¥ææ¥è¯¢æå¡è®°å½ |
| | | QueryWrapper<PersonalAttendanceRecords> attendanceQueryWrapper = new QueryWrapper<>(); |
| | | attendanceQueryWrapper.eq("staff_on_job_id", staffOnJob.getId()) |
| | | .eq("date", currentDate); |
| | | PersonalAttendanceRecords attendanceRecord = personalAttendanceRecordsMapper.selectOne(attendanceQueryWrapper); |
| | | DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm"); |
| | | // æ ¹æ®åå
¸è®¾ç½®çè夿¶é´å¤æè¿å°æ©é |
| | | if (attendanceRecord == null) { |
| | | // ä¸å卿å¡è®°å½ï¼å建æ°è®°å½ |
| | | personalAttendanceRecords.setStaffOnJobId(staffOnJob.getId()); |
| | | personalAttendanceRecords.setDate(currentDate); |
| | | personalAttendanceRecords.setWorkStartAt(LocalDateTime.now()); |
| | | personalAttendanceRecords.setStatus(determineAttendanceStatus(personalAttendanceRecords.getWorkStartAt(), true)); |
| | | personalAttendanceRecords.setWorkStartAt(currentDateTime); |
| | | personalAttendanceRecords.setStatus(determineAttendanceStatus(personalAttendanceRecords, true)); |
| | | personalAttendanceRecords.setRemark(personalAttendanceRecords.getRemark()); |
| | | personalAttendanceRecords.setTenantId(staffOnJob.getTenantId()); |
| | | return personalAttendanceRecordsMapper.insert(personalAttendanceRecords); |
| | | } else { |
| | | if (attendanceRecord.getWorkEndAt() == null) { |
| | | // æ´æ°å·¥ä½ç»ææ¶é´å工使¶é¿ |
| | | attendanceRecord.setWorkEndAt(LocalDateTime.now()); |
| | | attendanceRecord.setWorkEndAt(currentDateTime); |
| | | // 计ç®å·¥ä½æ¶é¿ï¼ç²¾ç¡®å°åéï¼ä¿ç2ä½å°æ°ï¼ |
| | | LocalDateTime startTime = attendanceRecord.getWorkStartAt(); |
| | | LocalDateTime endTime = attendanceRecord.getWorkEndAt(); |
| | |
| | | .divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_UP); |
| | | attendanceRecord.setWorkHours(workHours); |
| | | // æ´æ°èå¤ç¶æ |
| | | attendanceRecord.setStatus(determineAttendanceStatus(attendanceRecord.getWorkEndAt(), false)); |
| | | attendanceRecord.setStatus(determineAttendanceStatus(attendanceRecord, false)); |
| | | return personalAttendanceRecordsMapper.updateById(attendanceRecord); |
| | | } else { |
| | | throw new BaseException("æ¨å·²ç»æè¿å¡äº,æ éé夿å¡!!!"); |
| | |
| | | } |
| | | } |
| | | |
| | | // è·åè夿¶é´é
ç½® |
| | | private String[] getAttendanceTimeConfig() { |
| | | String[] timeConfigs = new String[2]; |
| | | try { |
| | | String dictType = "sys_work_time"; |
| | | |
| | | // è·åä¸çæ¶é´é
ç½®ï¼é»è®¤ä¸º09:00 |
| | | String startTimeConfig = dictDataService.selectDictLabel(dictType, "start_at"); |
| | | timeConfigs[0] = (startTimeConfig == null || startTimeConfig.trim().isEmpty()) ? "09:00" : startTimeConfig; |
| | | |
| | | // è·åä¸çæ¶é´é
ç½®ï¼é»è®¤ä¸º18:00 |
| | | String endTimeConfig = dictDataService.selectDictLabel(dictType, "end_at"); |
| | | timeConfigs[1] = (endTimeConfig == null || endTimeConfig.trim().isEmpty()) ? "18:00" : endTimeConfig; |
| | | |
| | | return timeConfigs; |
| | | } catch (Exception e) { |
| | | timeConfigs[0] = "09:00"; // é»è®¤ä¸çæ¶é´ |
| | | timeConfigs[1] = "18:00"; // é»è®¤ä¸çæ¶é´ |
| | | return timeConfigs; |
| | | } |
| | | } |
| | | |
| | | // æ ¹æ®å®é
æ¶é´åæ¯å¦ä¸çæ¶é´å¤æèå¤ç¶æ |
| | | // 0 æ£å¸¸ 1 è¿å° 2 æ©é |
| | | private byte determineAttendanceStatus(LocalDateTime actualTime, boolean isStart) { |
| | | // 0 æ£å¸¸ 1 è¿å° 2 æ©é 3 è¿å°æ©é 4 ç¼ºå¤ |
| | | private Integer determineAttendanceStatus(PersonalAttendanceRecords attendanceRecord, boolean isStart) { |
| | | LocalDateTime actualTime = isStart ? attendanceRecord.getWorkStartAt() : attendanceRecord.getWorkEndAt(); |
| | | try { |
| | | // è·åè夿¶é´é
ç½® |
| | | String dictType = "sys_work_time"; // è夿¶é´åå
¸ç±»å |
| | | String timeConfig; |
| | | |
| | | if (isStart) { |
| | | // ä¸çæ¶é´é
ç½®ï¼é»è®¤ä¸º09:00 |
| | | timeConfig = dictDataService.selectDictLabel(dictType, "work_start_time"); |
| | | if (timeConfig == null || timeConfig.trim().isEmpty()) { |
| | | timeConfig = "09:00"; |
| | | } |
| | | } else { |
| | | // ä¸çæ¶é´é
ç½®ï¼é»è®¤ä¸º18:00 |
| | | timeConfig = dictDataService.selectDictLabel(dictType, "work_end_time"); |
| | | if (timeConfig == null || timeConfig.trim().isEmpty()) { |
| | | timeConfig = "18:00"; |
| | | } |
| | | } |
| | | String[] timeConfigs = getAttendanceTimeConfig(); |
| | | String timeConfig = isStart ? timeConfigs[0] : timeConfigs[1]; |
| | | |
| | | // è§£ææ åæ¶é´ |
| | | String[] timeParts = timeConfig.split(":"); |
| | |
| | | } else { |
| | | // ä¸çæå¡ï¼æ©äºæ åæ¶é´ç®æ©é |
| | | if (actualHour < standardHour || (actualHour == standardHour && actualMinute < standardMinute)) { |
| | | if (attendanceRecord.getStatus() == 1) { |
| | | return 3; // è¿å°æ©é |
| | | } |
| | | return 2; // æ©é |
| | | } |
| | | } |