package com.java110.job.export.adapt; import com.alibaba.fastjson.JSONObject; import com.java110.dto.attendanceClasses.AttendanceClassesTaskDetailDto; import com.java110.dto.attendanceClasses.AttendanceClassesTaskDto; import com.java110.dto.data.ExportDataDto; import com.java110.dto.reportFeeMonthStatistics.ReportFeeMonthStatisticsDto; import com.java110.intf.report.IReportAttendanceInnerServiceSMO; import com.java110.job.export.IExportDataAdapt; import com.java110.utils.util.BeanConvertUtil; import com.java110.utils.util.DateUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @Service("monthAttendance") public class MonthAttendanceAdapt implements IExportDataAdapt { private static final int MAX_ROW = 50; @Autowired private IReportAttendanceInnerServiceSMO reportAttendanceInnerServiceSMOImpl; @Override public SXSSFWorkbook exportData(ExportDataDto exportDataDto) { JSONObject reqJson = exportDataDto.getReqJson(); SXSSFWorkbook workbook = null; //工作簿 String userId = ""; //工作表 workbook = new SXSSFWorkbook(); workbook.setCompressTempFiles(false); Sheet sheet = workbook.createSheet(reqJson.getIntValue("taskYear") + "年" + reqJson.getIntValue("taskMonth") + "月考勤表"); Row row = sheet.createRow(0); row.createCell(0).setCellValue("部门"); row.createCell(1).setCellValue("员工"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, reqJson.getIntValue("taskYear")); calendar.set(Calendar.MONTH, reqJson.getIntValue("taskMonth") - 1); int maxDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); for (int day = 1; day <= maxDayOfMonth; day++) { row.createCell(day + 1).setCellValue(day + "日"); } row.createCell(1 + maxDayOfMonth + 1).setCellValue("正常考勤"); row.createCell(1 + maxDayOfMonth + 2).setCellValue("迟到"); row.createCell(1 + maxDayOfMonth + 3).setCellValue("早退"); row.createCell(1 + maxDayOfMonth + 4).setCellValue("旷工"); row.createCell(1 + maxDayOfMonth + 5).setCellValue("免考勤"); AttendanceClassesTaskDto attendanceClassesTaskDto = BeanConvertUtil.covertBean(reqJson, AttendanceClassesTaskDto.class); attendanceClassesTaskDto.setStoreId(reqJson.getString("storeId")); attendanceClassesTaskDto.setClassId(reqJson.getString("classesId")); //查询数据 getAttendanceClassesTask(sheet, attendanceClassesTaskDto, reqJson, maxDayOfMonth); return workbook; } private void getAttendanceClassesTask(Sheet sheet, AttendanceClassesTaskDto attendanceClassesTaskDto, JSONObject reqJson, int maxDayOfMonth) { int count = reportAttendanceInnerServiceSMOImpl.getMonthAttendanceCount(attendanceClassesTaskDto); count = (int) Math.ceil((double) count / (double) MAX_ROW); if (count < 1) { return; } for (int page = 1; page <= count; page++) { attendanceClassesTaskDto.setPage(page); attendanceClassesTaskDto.setRow(MAX_ROW); List attendanceClassesTaskDtos = reportAttendanceInnerServiceSMOImpl.getMonthAttendance(attendanceClassesTaskDto); //输入考勤明细 refreshDetail(attendanceClassesTaskDtos, reqJson); appendData(attendanceClassesTaskDtos, sheet, (page - 1) * MAX_ROW, maxDayOfMonth); } } private void appendData(List attendanceClassesTaskDtos, Sheet sheet, int step, int maxDayOfMonth) { Row row = null; JSONObject dayObj = null; AttendanceClassesTaskDto attendanceClassesTaskDto = null; List detailDtos = null; String value = ""; for (int roomIndex = 0; roomIndex < attendanceClassesTaskDtos.size(); roomIndex++) { row = sheet.createRow(roomIndex + step + 1); attendanceClassesTaskDto = attendanceClassesTaskDtos.get(roomIndex); row.createCell(0).setCellValue(attendanceClassesTaskDto.getDepartmentName()); row.createCell(1).setCellValue(attendanceClassesTaskDto.getStaffName()); dayObj = attendanceClassesTaskDto.getDays(); for (int day = 1; day <= maxDayOfMonth; day++) { if (!dayObj.containsKey(day)) { row.createCell(day + 1).setCellValue("休息"); continue; } if (dayObj.get(day) == null) { row.createCell(day + 1).setCellValue("休息"); continue; } detailDtos = (List) dayObj.get(day); if (detailDtos == null || detailDtos.size() < 1) { row.createCell(day + 1).setCellValue("休息"); continue; } value = ""; for (AttendanceClassesTaskDetailDto detailDto : detailDtos) { if (AttendanceClassesTaskDetailDto.SPEC_CD_START.equals(detailDto.getSpecCd())) { value += "上班:"; } else { value += "下班:"; } if (!AttendanceClassesTaskDetailDto.STATE_WAIT.equals(detailDto.getState())) { value += (detailDto.getCheckTime() + "(" + detailDto.getStateName() + ");" + String.valueOf((char) 10)); } else { value += (" - (" + detailDto.getStateName() + ");" + String.valueOf((char) 10)); } } row.createCell(day + 1).setCellValue(value); } row.createCell(1 + maxDayOfMonth + 1).setCellValue(attendanceClassesTaskDto.getClockIn()); row.createCell(1 + maxDayOfMonth + 2).setCellValue(attendanceClassesTaskDto.getLate()); row.createCell(1 + maxDayOfMonth + 3).setCellValue(attendanceClassesTaskDto.getEarly()); row.createCell(1 + maxDayOfMonth + 4).setCellValue(attendanceClassesTaskDto.getNoClockIn()); row.createCell(1 + maxDayOfMonth + 5).setCellValue(attendanceClassesTaskDto.getFree()); } } private void refreshDetail(List attendanceClassesTaskDtos, JSONObject reqJson) { if (attendanceClassesTaskDtos == null || attendanceClassesTaskDtos.size() < 1) { return; } List staffIds = new ArrayList<>(); for (AttendanceClassesTaskDto attendanceClassesTaskDto : attendanceClassesTaskDtos) { staffIds.add(attendanceClassesTaskDto.getStaffId()); } AttendanceClassesTaskDto tmpAttendanceClassesTaskDto = new AttendanceClassesTaskDto(); tmpAttendanceClassesTaskDto.setClassId(reqJson.getString("classesId")); tmpAttendanceClassesTaskDto.setTaskYear(reqJson.getString("taskYear")); tmpAttendanceClassesTaskDto.setTaskDay(reqJson.getString("taskDay")); tmpAttendanceClassesTaskDto.setStaffIds(staffIds.toArray(new String[staffIds.size()])); List attendanceClassesTaskDetailDtos = reportAttendanceInnerServiceSMOImpl.getMonthAttendanceDetail(tmpAttendanceClassesTaskDto); JSONObject days = null; List tAttendanceClassesTaskDetailDto = null; for (AttendanceClassesTaskDto attendanceClassesTaskDto : attendanceClassesTaskDtos) { days = attendanceClassesTaskDto.getDays(); if (days == null) { days = new JSONObject(); attendanceClassesTaskDto.setDays(days); } for (AttendanceClassesTaskDetailDto tmpAttendanceClassesTaskDetailDto : attendanceClassesTaskDetailDtos) { if (days.containsKey(tmpAttendanceClassesTaskDetailDto.getTaskDay())) { tAttendanceClassesTaskDetailDto = (List) days.get(tmpAttendanceClassesTaskDetailDto.getTaskDay()); tAttendanceClassesTaskDetailDto.add(tmpAttendanceClassesTaskDetailDto); } else { tAttendanceClassesTaskDetailDto = new ArrayList<>(); tAttendanceClassesTaskDetailDto.add(tmpAttendanceClassesTaskDetailDto); days.put(tmpAttendanceClassesTaskDetailDto.getTaskDay(), tAttendanceClassesTaskDetailDto); } } } } }