| ÎļþÃû´Ó inspect-server/src/main/java/com/ruoyi/inspect/service/impl/StaffAttendanceTrackingRecordServiceImpl.java ÐÞ¸Ä |
| | |
| | | package com.ruoyi.inspect.service.impl; |
| | | package com.ruoyi.performance.service.impl; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | 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.StaffAttendanceReportType; |
| | | import com.ruoyi.common.enums.CalendarType; |
| | | import com.ruoyi.common.enums.SyncStatus; |
| | | 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 com.ruoyi.inspect.dto.StaffAttendanceDTO; |
| | | import com.ruoyi.inspect.excel.StaffAttendanceAnnotationTextExcelData; |
| | | import com.ruoyi.inspect.excel.StaffAttendanceExcelData; |
| | | import com.ruoyi.inspect.excel.handler.CommentWriteHandler; |
| | | import com.ruoyi.inspect.mapper.StaffAttendanceTrackingRecordMapper; |
| | | import com.ruoyi.inspect.pojo.StaffAttendanceTrackingRecord; |
| | | import com.ruoyi.inspect.service.StaffAttendanceTrackingRecordService; |
| | | import com.ruoyi.inspect.util.HourDiffCalculator; |
| | | import com.ruoyi.inspect.util.TimeDiffCalculator; |
| | | import com.ruoyi.inspect.vo.StaffAttendanceVO; |
| | | |
| | | import com.ruoyi.performance.dto.StaffAttendanceDTO; |
| | | import com.ruoyi.performance.excel.StaffAttendanceAnnotationTextExcelData; |
| | | import com.ruoyi.performance.excel.StaffAttendanceExcelData; |
| | | import com.ruoyi.performance.excel.handler.attendance.CommentWriteHandler; |
| | | import com.ruoyi.performance.mapper.StaffAttendanceTrackingRecordMapper; |
| | | import com.ruoyi.performance.pojo.StaffAttendanceTrackingRecord; |
| | | import com.ruoyi.performance.service.StaffAttendanceTrackingRecordService; |
| | | import com.ruoyi.performance.dto.PerformanceShiftMapDto; |
| | | import com.ruoyi.performance.mapper.PerformanceShiftMapper; |
| | | import com.ruoyi.performance.mapper.ShiftTimeMapper; |
| | | import com.ruoyi.performance.pojo.ShiftTime; |
| | | import com.ruoyi.performance.utils.HourDiffCalculator; |
| | | import com.ruoyi.performance.utils.TimeDiffCalculator; |
| | | import com.ruoyi.performance.vo.StaffAttendanceVO; |
| | | import com.ruoyi.system.mapper.UserMapper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.ObjectUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | |
| | | private PerformanceShiftMapper performanceShiftMapper; |
| | | |
| | | @Autowired |
| | | private UserMapper userMapper; |
| | | |
| | | @Autowired |
| | | private ShiftTimeMapper shiftTimeMapper; |
| | | |
| | | private DateTimeFormatter yyyMMdd = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | |
| | | private static final String marriageLeaveKeyword = "å©";//å©åçæ¬¡å
³é®å |
| | | private static final String bereavementLeaveKeyword = "丧";//丧åçæ¬¡å
³é®å |
| | | private static final String sickLeaveKeyword = "ç
";//ç
åçæ¬¡å
³é®å |
| | | private static final String maternityLeaveKeyword = "产";//产åçæ¬¡å
³é®å |
| | | |
| | | /** |
| | | * 忥çé¨ç¦è®¾å¤å表 |
| | |
| | | * @param staffAttendanceDTO è夿¥è¯¢æ¡ä»¶ |
| | | * @return |
| | | */ |
| | | public List<StaffAttendanceVO> getAttendanceRecord(List<PerformanceShiftMapDto> performanceShifts,StaffAttendanceDTO staffAttendanceDTO) { |
| | | @Override |
| | | public List<StaffAttendanceVO> getAttendanceRecord(List<PerformanceShiftMapDto> performanceShifts, StaffAttendanceDTO staffAttendanceDTO) { |
| | | // æ¥è¯¢æå¡è®°å½ |
| | | Wrapper<StaffAttendanceTrackingRecord> queryWrapper = Wrappers.<StaffAttendanceTrackingRecord>lambdaQuery() |
| | | .eq(StaffAttendanceTrackingRecord::getEnableReport, Boolean.TRUE) |
| | |
| | | vo.setShiftId(p.getShift()); |
| | | vo.setPersonCode(p.getPersonCode()); |
| | | vo.setPersonName(p.getUserName()); |
| | | vo.setUserId(p.getUserId()); |
| | | //åºå¤æ¶é¿ |
| | | double plannedWorkHours = Math.abs(hourDiff); |
| | | vo.setDiffHour(hourDiff); |
| | |
| | | AtomicInteger marriageLeaveCount = new AtomicInteger(0);//å©åå¤©æ° |
| | | AtomicInteger bereavementLeaveCount = new AtomicInteger(0);//丧åå¤©æ° |
| | | AtomicInteger sickLeaveCount = new AtomicInteger(0);//ç
åå¤©æ° |
| | | AtomicInteger maternityLeaveCount = new AtomicInteger(0);//产åå¤©æ° |
| | | AtomicInteger attendanceDayCount = new AtomicInteger(0);//åºå¤å¤©æ° |
| | | AtomicDouble attendanceWorkHourCount = new AtomicDouble(0D);//åºå¤æ»æ¶é´ |
| | | for (int j = 0; j < shiftMapDtos.size(); j++) { |
| | |
| | | bereavementLeaveCount.getAndIncrement(); |
| | | }else if(StringUtils.contains(shiftMapDto.getShiftName(),sickLeaveKeyword)){ |
| | | sickLeaveCount.getAndIncrement(); |
| | | }else if(StringUtils.contains(shiftMapDto.getShiftName(),maternityLeaveKeyword)){ |
| | | maternityLeaveCount.getAndIncrement(); |
| | | } |
| | | if(StringUtils.isAllBlank(shiftMapDto.getStartTime(),shiftMapDto.getEndTime())){ |
| | | shiftList.add(shiftMapDto.getShiftName()); |
| | |
| | | } |
| | | } |
| | | //æåº¦ç»è®¡ææå
¥æ¹æ³¨æ°æ® |
| | | if(StringUtils.isNoneBlank(staffAttendanceDTO.getAttendanceReportType()) && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), StaffAttendanceReportType.MONTH.name())){ |
| | | if(StringUtils.isNoneBlank(staffAttendanceDTO.getAttendanceReportType()) && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), CalendarType.MONTH.name())){ |
| | | if(StringUtils.isNotBlank(shiftMapDto.getAnnotationText())){ |
| | | annotationTextList.add(new StaffAttendanceAnnotationTextExcelData(i,j,shiftMapDto.getAnnotationText())); |
| | | } |
| | | } |
| | | } |
| | | if(StringUtils.isNoneBlank(staffAttendanceDTO.getAttendanceReportType()) && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), StaffAttendanceReportType.MONTH.name())){ |
| | | if(StringUtils.isNoneBlank(staffAttendanceDTO.getAttendanceReportType()) && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), CalendarType.MONTH.name())){ |
| | | attendanceExcelData.setShiftList(shiftList); |
| | | } |
| | | attendanceExcelData.setAttendanceDayCount(attendanceDayCount.get()); |
| | |
| | | attendanceExcelData.setMarriageLeaveCount(marriageLeaveCount.get()); |
| | | attendanceExcelData.setBereavementLeaveCount(bereavementLeaveCount.get()); |
| | | attendanceExcelData.setSickLeaveCount(sickLeaveCount.get()); |
| | | attendanceExcelData.setMaternityLeaveCount(maternityLeaveCount.get()); |
| | | excelData.add(attendanceExcelData); |
| | | } |
| | | //å¯¼åº |
| | |
| | | try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(resourceAsStream).registerWriteHandler(new CommentWriteHandler(excelData, annotationTextList)).relativeHeadRowIndex(4).build()) { |
| | | WriteSheet writeSheet = EasyExcel.writerSheet().build(); |
| | | excelWriter.fill(excelData, writeSheet); |
| | | if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),StaffAttendanceReportType.YEAR.name())){ |
| | | if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), CalendarType.YEAR.name())){ |
| | | String startDate = staffAttendanceDTO.getStartDate().format(yyyMMStr); |
| | | String endDate = staffAttendanceDTO.getEndDate().format(yyyMMStr); |
| | | Map<String, String> dateMap = new HashMap<>(); |
| | |
| | | for (LocalDate currentDate = startDate; !currentDate.isAfter(endDate); currentDate = currentDate.plusDays(1)) { |
| | | attendanceDateList.add(currentDate); |
| | | } |
| | | if (attendanceDateList.size() > 31 && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),StaffAttendanceReportType.MONTH.name())) { |
| | | if (attendanceDateList.size() > 31 && StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(), CalendarType.MONTH.name())) { |
| | | throw new IllegalArgumentException("å¯¼åºæ¶é´èå´ä¸è½è¶
è¿31天"); |
| | | } |
| | | return attendanceDateList; |
| | |
| | | |
| | | private InputStream buildAttendanceTemplate(List<LocalDate> attendanceDateList,String attendanceReportType) throws IOException { |
| | | String templateName = "/static/staff_attendance_month_template.xlsx"; |
| | | if(StringUtils.equals(attendanceReportType,StaffAttendanceReportType.YEAR.name())){ |
| | | if(StringUtils.equals(attendanceReportType, CalendarType.YEAR.name())){ |
| | | templateName = "/static/staff_attendance_year_template.xlsx"; |
| | | } |
| | | try (InputStream templateStream = this.getClass().getResourceAsStream(templateName)) { |
| | |
| | | try (Workbook workbook = WorkbookFactory.create(templateStream); |
| | | ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { |
| | | Sheet sheet = workbook.getSheetAt(0); |
| | | if(StringUtils.equals(attendanceReportType,StaffAttendanceReportType.MONTH.name())){ |
| | | if(StringUtils.equals(attendanceReportType, CalendarType.MONTH.name())){ |
| | | fillAttendanceHeader(sheet, attendanceDateList); |
| | | } |
| | | workbook.write(outputStream); |