| | |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.time.temporal.TemporalAdjusters; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | | /** |
| | |
| | | IPage<PerformanceShiftMapDto> mapIPage = baseMapper.performanceShiftPage(page, time, userName, sysDeptId); |
| | | //æ¥è¯¢ææç次(æå¡è§å) |
| | | List<PersonalAttendanceLocationConfig> personalAttendanceLocationConfigs = personalAttendanceLocationConfigMapper.selectList(null); |
| | | |
| | | // è·å彿æ¶é´èå´ |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | LocalDateTime localDateTime = LocalDateTime.parse(time, formatters); |
| | | LocalDate firstDayOfMonth = localDateTime.toLocalDate().withDayOfMonth(1); |
| | | LocalDate lastDayOfMonth = localDateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth()); |
| | | |
| | | // æ¶éææåå·¥ID |
| | | List<Long> staffIds = mapIPage.getRecords().stream() |
| | | .filter(dto -> dto.getUserId() != null) |
| | | .map(dto -> Long.valueOf(dto.getUserId())) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | |
| | | // æ¥è¯¢å½æå®¡æ ¸éè¿ç请åè®°å½ï¼ä»approval_instanceçform_configè§£æï¼ |
| | | Map<Long, List<String>> staffHolidayMap = new HashMap<>(); |
| | | if (!staffIds.isEmpty()) { |
| | | // éè¿å
³èæ¥è¯¢è·åå工请åä¿¡æ¯ |
| | | List<Map<String, Object>> holidayRecords = baseMapper.selectStaffHolidayDates(staffIds); |
| | | |
| | | // æå»ºåå·¥-è¯·åæ¥ææ å°ï¼ä»form_config JSONè§£æï¼ |
| | | for (Map<String, Object> record : holidayRecords) { |
| | | Long staffId = ((Number) record.get("staff_id")).longValue(); |
| | | String formConfig = (String) record.get("form_config"); |
| | | |
| | | if (formConfig != null && !formConfig.isEmpty()) { |
| | | try { |
| | | // è§£æform_config JSON |
| | | Map<String, Object> formMap = JackSonUtil.unmarshal(formConfig, Map.class); |
| | | Object formPayloadObj = formMap.get("formPayload"); |
| | | |
| | | if (formPayloadObj instanceof Map) { |
| | | Map<String, Object> formPayload = (Map<String, Object>) formPayloadObj; |
| | | Object dateRangeObj = formPayload.get("00"); // è¯·åæ¥æå段key为"00" |
| | | |
| | | if (dateRangeObj instanceof List) { |
| | | List<String> dateRange = (List<String>) dateRangeObj; |
| | | if (dateRange.size() >= 2) { |
| | | String startDateTime = dateRange.get(0); |
| | | String endDateTime = dateRange.get(1); |
| | | |
| | | // è§£ææ¥æï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ssï¼ |
| | | LocalDate startDate = LocalDate.parse(startDateTime.substring(0, 10)); |
| | | LocalDate endDate = LocalDate.parse(endDateTime.substring(0, 10)); |
| | | |
| | | // è¿æ»¤å½æèå´å
çè¯·åæ¥æ |
| | | List<String> dates = getDatesBetween(startDate, endDate).stream() |
| | | .filter(date -> { |
| | | LocalDate d = LocalDate.parse(date); |
| | | return !d.isBefore(firstDayOfMonth) && !d.isAfter(lastDayOfMonth); |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | if (!dates.isEmpty()) { |
| | | staffHolidayMap.computeIfAbsent(staffId, k -> new ArrayList<>()).addAll(dates); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | // JSONè§£æå¤±è´¥ï¼è·³è¿æ¤è®°å½ |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | for (PerformanceShiftMapDto i : mapIPage.getRecords()) { |
| | | // è®¾ç½®è¯·åæ¥æå表 |
| | | if (i.getUserId() != null) { |
| | | Long staffId = Long.valueOf(i.getUserId()); |
| | | List<String> holidayDates = staffHolidayMap.getOrDefault(staffId, new ArrayList<>()); |
| | | i.setHolidayDates(holidayDates); |
| | | } |
| | | |
| | | List<String> shiftTimes = StrUtil.split(i.getShiftTime(), ";"); |
| | | if(CollUtil.isEmpty(shiftTimes)){ |
| | | continue; |
| | | } |
| | | double totalAttendance = 0;//æ»åºå¤å¤©æ° |
| | | List<Map<String, Object>> map = new ArrayList<>(); |
| | | // è·å该åå·¥çè¯·åæ¥æéå |
| | | Set<String> holidayDateSet = new HashSet<>(i.getHolidayDates()); |
| | | // å岿¥æ |
| | | for (String shiftTime : shiftTimes) { |
| | | i.setShiftTime(null); |
| | |
| | | hashMap.put("id", shiftTimeAndShift.get(2)); |
| | | hashMap.put("shift", shiftTimeAndShift.get(1)); |
| | | hashMap.put("time", shiftTimeAndShift.get(0)); |
| | | |
| | | // æåæ¥æé¨åï¼æ ¼å¼ï¼yyyy-MM-dd HH:mm:ss -> yyyy-MM-ddï¼ |
| | | String workTimeStr = shiftTimeAndShift.get(0); |
| | | String workDate = workTimeStr.length() >= 10 ? workTimeStr.substring(0, 10) : workTimeStr; |
| | | |
| | | // å¦æè¯¥æ¥ææå®¡æ ¸éè¿ç请åè®°å½ï¼è®¾ç½®isHoliday为trueï¼å¹¶å°çæ¬¡è®¾ä¸ºä¼æ¯ |
| | | if (holidayDateSet.contains(workDate)) { |
| | | hashMap.put("isHoliday", true); |
| | | hashMap.put("shift", "伿¯"); |
| | | } else { |
| | | hashMap.put("isHoliday", false); |
| | | } |
| | | |
| | | map.add(hashMap); |
| | | i.setList(map); |
| | | //æ±æ»çåçæ¬¡ç»è®¡æ°æ® |
| | | for (PersonalAttendanceLocationConfig personalAttendanceLocationConfig : personalAttendanceLocationConfigs) { |
| | | if (!i.getMonthlyAttendance().containsKey(personalAttendanceLocationConfig.getShift())){ |
| | | i.getMonthlyAttendance().put(personalAttendanceLocationConfig.getShift(), 0); |
| | | |
| | | // ç»è®¡çæ¬¡æ°æ® |
| | | if (holidayDateSet.contains(workDate)) { |
| | | // 妿æ¯è¯·åæ¥æï¼ç»è®¡ä¸ºä¼æ¯ï¼åªç»è®¡ä¸æ¬¡ï¼ |
| | | if (!i.getMonthlyAttendance().containsKey("伿¯")){ |
| | | i.getMonthlyAttendance().put("伿¯", 0); |
| | | } |
| | | if (personalAttendanceLocationConfig.getShift().equals(shiftTimeAndShift.get(1))) { |
| | | BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(personalAttendanceLocationConfig.getShift()).toString()); |
| | | i.getMonthlyAttendance().put(personalAttendanceLocationConfig.getShift(), bigDecimal.add(new BigDecimal("1"))); |
| | | i.getMonthlyAttendance().put("伿¯", new BigDecimal(i.getMonthlyAttendance().get("伿¯").toString()).add(new BigDecimal("1"))); |
| | | } else { |
| | | // 䏿¯è¯·åæ¥æï¼ç»è®¡åçæ¬¡ |
| | | for (PersonalAttendanceLocationConfig personalAttendanceLocationConfig : personalAttendanceLocationConfigs) { |
| | | if (!i.getMonthlyAttendance().containsKey(personalAttendanceLocationConfig.getShift())){ |
| | | i.getMonthlyAttendance().put(personalAttendanceLocationConfig.getShift(), 0); |
| | | } |
| | | if (personalAttendanceLocationConfig.getShift().equals(shiftTimeAndShift.get(1))) { |
| | | BigDecimal bigDecimal = new BigDecimal(i.getMonthlyAttendance().get(personalAttendanceLocationConfig.getShift()).toString()); |
| | | i.getMonthlyAttendance().put(personalAttendanceLocationConfig.getShift(), bigDecimal.add(new BigDecimal("1"))); |
| | | } |
| | | } |
| | | } |
| | | //ç»è®¡æ»åºå¤å¤©æ°(æ©/ä¸/æ/å¤)é½ç®åºå¤,å
¶ä½é½æ¯ä¼æ¯ |
| | | if (shiftTimeAndShift.get(1).contains("æ©") || |
| | | // ç»è®¡æ»åºå¤å¤©æ°(æ©/ä¸/æ/å¤)é½ç®åºå¤ |
| | | if (shiftTimeAndShift.get(1).contains("æ©") || |
| | | shiftTimeAndShift.get(1).contains("ä¸") || |
| | | shiftTimeAndShift.get(1).contains("æ") || |
| | | shiftTimeAndShift.get(1).contains("å¤")) { |
| | | i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 1); |
| | | i.getMonthlyAttendance().put("totalAttendance", totalAttendance += 1); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // è·åheaderæ¶é´ |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
| | | // å°å符串æ¶é´è½¬æ¢ä¸º LocalDateTime ç±»åæ¶é´ |
| | | LocalDateTime localDateTime = LocalDateTime.parse(time, formatters); |
| | | LocalDate firstDayOfMonth = localDateTime.toLocalDate().withDayOfMonth(1); |
| | | LocalDate lastDayOfMonth = localDateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth()); |
| | | List<LocalDateTime> localDateTimesBetween = getLocalDateTimesBetween(firstDayOfMonth.atStartOfDay(), lastDayOfMonth.atStartOfDay()); |
| | | List<Object> list1 = new ArrayList<>(); |
| | | for (LocalDateTime dateTime : localDateTimesBetween) { |
| | |
| | | return resultMap; |
| | | } |
| | | |
| | | /** |
| | | * è·åä¸¤ä¸ªæ¥æä¹é´çæææ¥æï¼æ ¼å¼ï¼yyyy-MM-ddï¼ |
| | | * 注æï¼ç»ææ¥æä¸å
å«å¨å
ï¼è¯·åæ¥æèå´æ¯å¼å§æ¥æå°ç»ææ¥æï¼ä¸å«ç»ææ¥æï¼ |
| | | */ |
| | | private List<String> getDatesBetween(LocalDate startDate, LocalDate endDate) { |
| | | List<String> dates = new ArrayList<>(); |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | LocalDate current = startDate; |
| | | while (current.isBefore(endDate)) { |
| | | dates.add(current.format(formatter)); |
| | | current = current.plusDays(1); |
| | | } |
| | | return dates; |
| | | } |
| | | |
| | | @Override |
| | | public void performanceShiftUpdate(PersonalShift personalShift) { |
| | | baseMapper.update(new PersonalShift(), Wrappers.<PersonalShift>lambdaUpdate() |