| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.google.common.util.concurrent.AtomicDouble; |
| | | import com.ruoyi.common.core.domain.entity.User; |
| | | import com.ruoyi.common.enums.ClockInState; |
| | | import com.ruoyi.common.enums.EnterOrExitType; |
| | | import com.ruoyi.common.enums.CalendarType; |
| | | import com.ruoyi.common.enums.SyncStatus; |
| | | import com.ruoyi.common.enums.*; |
| | | import com.ruoyi.common.utils.api.icc.IccApiUtil; |
| | | import com.ruoyi.common.utils.api.icc.model.GetResultPageRequest; |
| | | import com.ruoyi.common.utils.api.icc.model.GetResultPageResponse; |
| | |
| | | import java.math.RoundingMode; |
| | | import java.net.URLEncoder; |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.time.ZoneId; |
| | | import java.time.*; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | |
| | | if (!enterRecords.isEmpty()) { |
| | | // 上班时间和状态 |
| | | StaffAttendanceTrackingRecord enterRecord = enterRecords.stream() |
| | | .filter(s -> !s.getSwingTime().isAfter(currentShiftStartDateTime) && !s.getSwingTime().isBefore(boundaryTime)) |
| | | .filter(s -> (!s.getSwingTime().isAfter(currentShiftStartDateTime) && !s.getSwingTime().isBefore(boundaryTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.WORK.getValue())) |
| | | .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) |
| | | .orElse(new StaffAttendanceTrackingRecord()); |
| | | if (BeanUtil.isEmpty(enterRecord)) { |
| | | enterRecord = enterRecords.stream() |
| | | .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime) |
| | | && s.getSwingTime().isBefore(currentShiftEndDateTime))) |
| | | && s.getSwingTime().isBefore(currentShiftEndDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.WORK.getValue())) |
| | | .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) |
| | | .orElse(new StaffAttendanceTrackingRecord()); |
| | | workDateTime = enterRecord.getSwingTime(); |
| | |
| | | if (!exitRecords.isEmpty()) { |
| | | // 下班时间和状态 |
| | | StaffAttendanceTrackingRecord exitRecord = exitRecords.stream() |
| | | .filter(s -> !s.getSwingTime().isBefore(currentShiftEndDateTime) |
| | | && s.getSwingTime().isBefore(nextShiftStartDateTime)) |
| | | .filter(s -> (!s.getSwingTime().isBefore(currentShiftEndDateTime) |
| | | && s.getSwingTime().isBefore(nextShiftStartDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.OFF_WORK.getValue())) |
| | | .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) |
| | | .orElse(new StaffAttendanceTrackingRecord()); |
| | | if (BeanUtil.isEmpty(exitRecord) && !now.isBefore(currentShiftEndDateTime)) { |
| | | exitRecord = exitRecords.stream() |
| | | .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime) |
| | | && s.getSwingTime().isBefore(currentShiftEndDateTime))) |
| | | && s.getSwingTime().isBefore(currentShiftEndDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.OFF_WORK.getValue())) |
| | | .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime)) |
| | | .orElse(new StaffAttendanceTrackingRecord()); |
| | | offWorkDateTime = exitRecord.getSwingTime(); |
| | |
| | | return this.saveOrUpdateBatch(records); |
| | | } |
| | | |
| | | /** |
| | | * 根据导出日期格式化导出时间范围 |
| | | * @param staffAttendanceDTO |
| | | */ |
| | | private static void formatExportDateRange(StaffAttendanceDTO staffAttendanceDTO){ |
| | | if(StringUtils.isNoneBlank(staffAttendanceDTO.getReportDate())){ |
| | | LocalTime startTime = LocalTime.of(0,0,0); |
| | | LocalTime endTime = LocalTime.of(23,59,59); |
| | | YearMonth yearMonth; |
| | | if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),CalendarType.MONTH.name())){ |
| | | yearMonth = YearMonth.parse(staffAttendanceDTO.getReportDate(),DateTimeFormatter.ofPattern("yyyy-MM")); |
| | | LocalDateTime startDateTime = LocalDateTime.of(yearMonth.minusMonths(1L).atDay(26),startTime); |
| | | LocalDateTime endDateTime = LocalDateTime.of(yearMonth.atDay(25),endTime); |
| | | staffAttendanceDTO.setStartDate(startDateTime); |
| | | staffAttendanceDTO.setEndDate(endDateTime); |
| | | }else if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),CalendarType.YEAR.name())){ |
| | | Year year = Year.parse(staffAttendanceDTO.getReportDate(),DateTimeFormatter.ofPattern("yyyy")); |
| | | yearMonth = year.atMonth(1); |
| | | LocalDateTime startDateTime = LocalDateTime.of(yearMonth.minusMonths(1L).atDay(26),startTime); |
| | | LocalDateTime endDateTime = LocalDateTime.of(yearMonth.withMonth(12).atDay(25),endTime); |
| | | staffAttendanceDTO.setStartDate(startDateTime); |
| | | staffAttendanceDTO.setEndDate(endDateTime); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void exportStaffAttendanceRecords(HttpServletResponse response, StaffAttendanceDTO staffAttendanceDTO) { |
| | | response.reset(); |
| | | try{ |
| | | formatExportDateRange(staffAttendanceDTO); |
| | | //查询人员架构 |
| | | List<User> userList = userMapper.selectUserListByPerformance(false); |
| | | List<Integer> userIdList = userList.stream().map(User::getId).collect(Collectors.toList()); |
| | | List<LocalDate> attendanceDateList = buildAttendanceDateList(staffAttendanceDTO); |
| | | //批注信息坐标信息 |
| | | List<StaffAttendanceAnnotationTextExcelData> annotationTextList = new ArrayList<>(); |
| | | // 查询班次 |
| | | |
| | | List<PerformanceShiftMapDto> performanceShifts = performanceShiftMapper.selectListByWorkTime( |
| | | staffAttendanceDTO.getStartDate(), staffAttendanceDTO.getEndDate(), staffAttendanceDTO.getKeyword()); |
| | | //获取考勤数据 |
| | |
| | | //组装导出数据 |
| | | List<StaffAttendanceExcelData> excelData = new ArrayList<>(); |
| | | Map<Integer, List<PerformanceShiftMapDto>> groupByUserId = performanceShifts.stream().collect(Collectors.groupingBy(PerformanceShiftMapDto::getUserId)); |
| | | List<Integer> userIdKeys = groupByUserId.keySet().stream().sorted().collect(Collectors.toList()); |
| | | List<Integer> userIdKeys = groupByUserId.keySet().stream().sorted(Comparator.comparing(userIdList::indexOf)).collect(Collectors.toList()); |
| | | for (int i = 0; i < userIdKeys.size(); i++) { |
| | | List<PerformanceShiftMapDto> shiftMapDtos = groupByUserId.get(userIdKeys.get(i)); |
| | | StaffAttendanceExcelData attendanceExcelData = new StaffAttendanceExcelData(); |