From 933f6ebb410c68fb5c38876c403820b2f033a43c Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Thu, 21 Aug 2025 17:51:23 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/vo/WorkerAttendanceVo.java | 6 + ...fetyHatDataDailyStatisticsServiceImpl.java | 2 +- ...DailyAttendanceStatisticsV2Controller.java | 571 +++++++++++++----- ...tendancesStaticsByDepartmentTeamXlsBo.java | 26 + .../worker/entity/vo/StatisticsListVo.java | 46 ++ ...rkerDailyAttendanceStatisticsV2Mapper.java | 3 + .../mapper/xml/WorkerAttendanceMapper.xml | 1 + ...orkerDailyAttendanceStatisticsV2Mapper.xml | 62 +- ...kerDailyAttendanceStatisticsV2Service.java | 9 + ...ailyAttendanceStatisticsV2ServiceImpl.java | 13 +- .../service/impl/WorkerInfoServiceImpl.java | 5 + .../单个人员考勤出入明细报表.xlsx | Bin 9342 -> 9359 bytes .../考勤月报-按单位-出勤人数与考勤报表.xlsx | Bin 0 -> 13791 bytes ...勤月报-按班组-每日出入(打卡记录明细).xlsx | Bin 12842 -> 0 bytes .../考勤月报-按班组.xlsx | Bin 0 -> 13082 bytes .../考勤月报-按项目.xlsx | Bin 0 -> 13274 bytes 16 files changed, 582 insertions(+), 162 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo.java create mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx delete mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组-每日出入(打卡记录明细).xlsx create mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组.xlsx create mode 100644 src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按项目.xlsx diff --git a/src/main/java/com/zhgd/xmgl/modules/realnamestatistics/entity/vo/WorkerAttendanceVo.java b/src/main/java/com/zhgd/xmgl/modules/realnamestatistics/entity/vo/WorkerAttendanceVo.java index be18c881d..e5f41d991 100644 --- a/src/main/java/com/zhgd/xmgl/modules/realnamestatistics/entity/vo/WorkerAttendanceVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/realnamestatistics/entity/vo/WorkerAttendanceVo.java @@ -83,5 +83,11 @@ public class WorkerAttendanceVo { private String mockTime; private String enterpriseId; private String enterpriseName; + /** + * 人员id + */ + @ApiModelProperty(value = "人员id") + private java.lang.Long workerId; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDataDailyStatisticsServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDataDailyStatisticsServiceImpl.java index d5d27a439..58efa0d63 100644 --- a/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDataDailyStatisticsServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/safetyhat/service/impl/SafetyHatDataDailyStatisticsServiceImpl.java @@ -73,7 +73,7 @@ public class SafetyHatDataDailyStatisticsServiceImpl extends ServiceImpl devSn2WorkerMap = safetyHatDevService.list(new LambdaQueryWrapper() - .eq(SafetyHatDev::getProjectSn, projectSn)).stream().collect(Collectors.toMap(SafetyHatDev::getDevSn, SafetyHatDev::getWorkerInfoId, (o1, o2) -> o1)); + .eq(SafetyHatDev::getProjectSn, projectSn)).stream().filter(d -> Objects.nonNull(d.getDevSn()) && Objects.nonNull(d.getWorkerInfoId())).collect(Collectors.toMap(SafetyHatDev::getDevSn, SafetyHatDev::getWorkerInfoId, (o1, o2) -> o1)); //实时计算 ArrayList vos = new ArrayList<>(); List fences = safetyHatFenceService.list(new LambdaQueryWrapper().eq(SafetyHatFence::getProjectSn, projectSn)); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java index f5c54988d..6498258dc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerDailyAttendanceStatisticsV2Controller.java @@ -22,13 +22,16 @@ import com.zhgd.xmgl.async.AsyncAttendance; import com.zhgd.xmgl.base.entity.vo.echarts.ChartDataVo; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.service.IProjectService; +import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; import com.zhgd.xmgl.modules.worker.entity.WorkerDailyAttendanceStatisticsV2; import com.zhgd.xmgl.modules.worker.entity.WorkerInfo; +import com.zhgd.xmgl.modules.worker.entity.bo.ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo; import com.zhgd.xmgl.modules.worker.entity.dto.WorkerDailyAttendanceStatisticsV2Dto; import com.zhgd.xmgl.modules.worker.entity.vo.*; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.IWorkerDailyAttendanceStatisticsV2Service; +import com.zhgd.xmgl.modules.worker.service.impl.EnterpriseInfoServiceImpl; import com.zhgd.xmgl.modules.worker.service.impl.WorkerInfoServiceImpl; import com.zhgd.xmgl.security.util.SecurityUtils; import com.zhgd.xmgl.util.EasyPoiUtil; @@ -43,6 +46,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; +import org.jetbrains.annotations.Nullable; import org.simpleframework.xml.core.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -76,6 +80,9 @@ public class WorkerDailyAttendanceStatisticsV2Controller { @Lazy @Autowired IProjectService projectService; + @Autowired + @Lazy + EnterpriseInfoServiceImpl enterpriseInfoService; @Lazy @Autowired private IWorkerDailyAttendanceStatisticsV2Service workerDailyAttendanceStatisticsV2Service; @@ -250,6 +257,15 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setDailyDayMap(dailyDayMap); vo.setDailyAttendanceMap(dailyAttendanceMap); vo.setPersonSn(workerInfo.getPersonSn()); + vo.setWorkerId(workerInfo.getId()); + vo.setWorkerTypeName(workerInfo.getTypeName()); + vo.setPhoneNumber(workerInfo.getPhoneNumber()); + vo.setIdCard(workerInfo.getIdCard()); + vo.setSex(workerInfo.getSex()); + vo.setEnterDate(workerInfo.getEnterDate()); + vo.setProjectSn(workerInfo.getProjectSn()); + vo.setPayRollBankName(workerInfo.getPayRollBankName()); + vo.setPayRollBankNumber(workerInfo.getPayRollBankNumber()); vos.add(vo); } IPage p = new Page<>(); @@ -553,7 +569,7 @@ public class WorkerDailyAttendanceStatisticsV2Controller { vo.setPersonType(workerInfo.getPersonType()); vo.setEnterpriseName(workerInfo.getEnterpriseName()); vo.setWorkerName(workerInfo.getWorkerName()); - vo.setDeptName(workerInfo.getDepartmentName()); + vo.setDeptName(Objects.equals(workerInfo.getPersonType(), 1) ? workerInfo.getTeamName() : workerInfo.getDepartmentName()); vo.setProjectSn(workerInfo.getProjectSn()); vo.setPersonSn(workerInfo.getPersonSn()); vo.setAttendanceDate(DateUtil.parseDate(attendanceDate)); @@ -571,14 +587,10 @@ public class WorkerDailyAttendanceStatisticsV2Controller { } List attendances = personSn2AttendancesMap.get(workerInfo.getPersonSn()); if (Objects.equals(vo.getIsAttendance(), 1) && CollUtil.isNotEmpty(attendances)) { - String firstInTime = attendances.stream().filter(w -> Objects.equals(w.getPassType(), 1)).min(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime).orElse(null); - String endOutTime = attendances.stream().filter(w -> Objects.equals(w.getPassType(), 2)).max(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime).orElse(null); - vo.setFirstInTime(firstInTime); - vo.setEndOutTime(endOutTime); - String firstTimeAm = attendances.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(attendanceDate + " 12:00:00")) < 0).min(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime).orElse(null); - vo.setFirstTimeAm(firstTimeAm); - String endTimePm = attendances.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(attendanceDate + " 12:00:00")) >= 0).max(Comparator.comparing(WorkerAttendance::getCreateTime)).map(WorkerAttendance::getCreateTime).orElse(null); - vo.setEndTimePm(endTimePm); + vo.setFirstInTime(Optional.ofNullable(getFirstInTime(attendances)).map(WorkerAttendance::getCreateTime).orElse(null)); + vo.setEndOutTime(Optional.ofNullable(getEndOutTime(attendances)).map(WorkerAttendance::getCreateTime).orElse(null)); + vo.setFirstTimeAm(Optional.ofNullable(getFirstTimeAm(attendances)).map(WorkerAttendance::getCreateTime).orElse(null)); + vo.setEndTimePm(Optional.ofNullable(getEndTimePm(attendances)).map(WorkerAttendance::getCreateTime).orElse(null)); vo.setAttendanceList(attendances); } vo.setWorkerId(workerInfo.getId()); @@ -592,6 +604,50 @@ public class WorkerDailyAttendanceStatisticsV2Controller { return p; } + /** + * 下午打卡(未次) + * + * @param attendances + * @return + */ + @Nullable + private WorkerAttendance getEndTimePm(List attendances) { + return attendances.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(w.getCreateTime().substring(0, 10) + " 12:00:00")) >= 0) + .max(Comparator.comparing(WorkerAttendance::getCreateTime)).orElse(null); + } + + /** + * 上午打卡(首次) + * + * @param attendances + * @return + */ + @Nullable + private WorkerAttendance getFirstTimeAm(List attendances) { + return attendances.stream().filter(w -> DateUtil.compare(DateUtil.parseDateTime(w.getCreateTime()), DateUtil.parseDateTime(w.getCreateTime().substring(0, 10) + " 12:00:00")) < 0) + .min(Comparator.comparing(WorkerAttendance::getCreateTime)).orElse(null); + } + + /** + * 获取出场打卡(末次) + * + * @param attendances + * @return + */ + private WorkerAttendance getEndOutTime(List attendances) { + return attendances.stream().filter(w -> Objects.equals(w.getPassType(), 2)).max(Comparator.comparing(WorkerAttendance::getCreateTime)).orElse(null); + } + + /** + * 获取进场打卡(首次) + * + * @param attendances + * @return + */ + private WorkerAttendance getFirstInTime(List attendances) { + return attendances.stream().filter(w -> Objects.equals(w.getPassType(), 1)).min(Comparator.comparing(WorkerAttendance::getCreateTime)).orElse(null); + } + @ApiOperation(value = "统计考勤日报", notes = "统计考勤日报", httpMethod = "POST") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), @@ -774,141 +830,372 @@ public class WorkerDailyAttendanceStatisticsV2Controller { @ApiImplicitParam(name = "startDate", value = "开始日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "endDate", value = "结束日期(yyyy-MM-dd)", paramType = "body", required = true, dataType = "String"), @ApiImplicitParam(name = "groupByType", value = "1.按项目;2.按参建单位;3.按班组/部门;4.按人员", paramType = "body", required = true, dataType = "String"), - @ApiImplicitParam(name = "downloadType", value = "1上下午打卡2进出场打卡", paramType = "body", required = false, dataType = "String"), - @ApiImplicitParam(name = "effectiveHour", value = "有效工时", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "downloadType", value = "1每日明细(上下午打卡)2进出场打卡3每日工时4每日明细", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "hourValBegin", value = "大于有效工时", paramType = "body", required = false, dataType = "String"), + @ApiImplicitParam(name = "enterpriseId", value = "单位id", paramType = "body", required = false, dataType = "String"), }) @PostMapping(value = "/exportWorkerDailyAttendancesStaticsByMonthXls") public void exportWorkerDailyAttendancesStaticsByMonthXls(HttpServletResponse response, @RequestBody HashMap param) { -// String templateUrl = null; -// try { -// String projectSn = MapUtils.getString(param, "projectSn"); -// String startDate = MapUtils.getString(param, "startDate"); -// String endDate = MapUtils.getString(param, "endDate"); -// Integer downloadType = MapUtils.getInteger(param, "downloadType"); -// Integer groupByType = MapUtils.getInteger(param, "groupByType"); -// List dateTimes = DateUtil.rangeToList(DateUtil.parseDate(startDate), DateUtil.parseDate(endDate), DateField.DAY_OF_YEAR); -// Map> root = new HashMap<>(); -// if (Objects.equals(groupByType, 3)) { -// //按班组/部门 -// if (Objects.equals(downloadType, 1)) { -// //考勤月报-按班组-每日出入(打卡记录明细).xlsx -// param.put("startTime", startDate); -// param.put("endTime", endDate); -// param.put("pageSize", -1); -// List voList = this.doCountDailyAttendanceByDateRange(param).getRecords(); -// Map> deptNameMap = voList.stream().collect(Collectors.groupingBy(StatisticsListVo::getDeptName)); -// Map sheetMap = new HashMap<>(); -// List> listMap = new ArrayList<>(); -// for (Map.Entry> entry : deptNameMap.entrySet()) { -// int j = 0; -// for (StatisticsListVo vo : entry.getValue()) { -// Map map = new HashMap<>(); -// map.put("firstInTimeYes", StrUtil.isNotBlank(vo.getFirstInTime()) ? "√" : "×"); -// map.put("firstInTime", vo.getFirstInTime()); -// map.put("endOutTimeYes", StrUtil.isNotBlank(vo.getEndOutTime()) ? "√" : "×"); -// map.put("endOutTime", vo.getEndOutTime()); -// map.put("firstTimeAmYes", StrUtil.isNotBlank(vo.getFirstTimeAm()) ? "√" : "×"); -// map.put("firstTimeAm", vo.getFirstTimeAm()); -// map.put("endTimePmYes", StrUtil.isNotBlank(vo.getEndTimePm()) ? "√" : "×"); -// map.put("endTimePm", vo.getEndTimePm()); -// map.put("personType", vo.getPersonType()); -// map.put("enterpriseName", vo.getEnterpriseName()); -// map.put("workerName", vo.getWorkerName()); -// map.put("deptName", vo.getDeptName()); -// map.put("projectSn", vo.getProjectSn()); -// map.put("personSn", vo.getPersonSn()); -// map.put("attendanceDate", vo.getAttendanceDate()); -// map.put("hourVal", vo.getHourVal()); -// map.put("dayVal", vo.getDayVal()); -// map.put("isAttendance", vo.getIsAttendance()); -// map.put("overtimeHourVal", vo.getOvertimeHourVal()); -// map.put("overtimeDayVal", vo.getOvertimeDayVal()); -// map.put("inserviceType", vo.getInserviceType()); -// AtomicInteger i = new AtomicInteger(1); -// map.put("attendanceList", Objects.nonNull(vo.getAttendanceList()) ? vo.getAttendanceList().stream().map(a -> { -// return i.getAndIncrement() + ".(" + (Objects.equals(a.getPassType(), 1) ? "进场" : "出场") + a.getCreateTime() + ")"; -// }).collect(Collectors.joining("\n")) : ""); -// map.put("workerTypeName", vo.getWorkerTypeName()); -// map.put("phoneNumber", vo.getPhoneNumber()); -// map.put("idCard", vo.getIdCard()); -// map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); -// map.put("enterDate", vo.getEnterDate()); -// listMap.add(map); -// } -// } -// sheetMap.put("date", DateUtil.formatDate(dateTime)); -// sheetMap.put("listMap", listMap); -// root.put(j++, sheetMap); -// } -// } -// -// param.put("pageNo", 1); -// param.put("pageSize", -1); -// int j = 0; -// String tempSheetName; -// if (Objects.equals(downloadType, 1)) { -// tempSheetName = "考勤日报-出勤导出模版(上午下午).xlsx"; -// } else { -// tempSheetName = "考勤日报-出勤导出模版(进场出场).xlsx"; -// } -// for (DateTime dateTime : dateTimes) { -// param.put("attendanceDate", DateUtil.formatDate(dateTime)); -// List records = doGetWorkerDailyAttendancePageByDateVoIPage(param).getRecords(); -// Map sheetMap = new HashMap<>(); -// List> listMap = new ArrayList<>(); -// for (WorkerDailyAttendancesByDateVo vo : records) { -// Map map = new HashMap<>(); -// map.put("firstInTimeYes", StrUtil.isNotBlank(vo.getFirstInTime()) ? "√" : "×"); -// map.put("firstInTime", vo.getFirstInTime()); -// map.put("endOutTimeYes", StrUtil.isNotBlank(vo.getEndOutTime()) ? "√" : "×"); -// map.put("endOutTime", vo.getEndOutTime()); -// map.put("firstTimeAmYes", StrUtil.isNotBlank(vo.getFirstTimeAm()) ? "√" : "×"); -// map.put("firstTimeAm", vo.getFirstTimeAm()); -// map.put("endTimePmYes", StrUtil.isNotBlank(vo.getEndTimePm()) ? "√" : "×"); -// map.put("endTimePm", vo.getEndTimePm()); -// map.put("personType", vo.getPersonType()); -// map.put("enterpriseName", vo.getEnterpriseName()); -// map.put("workerName", vo.getWorkerName()); -// map.put("deptName", vo.getDeptName()); -// map.put("projectSn", vo.getProjectSn()); -// map.put("personSn", vo.getPersonSn()); -// map.put("attendanceDate", vo.getAttendanceDate()); -// map.put("hourVal", vo.getHourVal()); -// map.put("dayVal", vo.getDayVal()); -// map.put("isAttendance", vo.getIsAttendance()); -// map.put("overtimeHourVal", vo.getOvertimeHourVal()); -// map.put("overtimeDayVal", vo.getOvertimeDayVal()); -// map.put("inserviceType", vo.getInserviceType()); -// AtomicInteger i = new AtomicInteger(1); -// map.put("attendanceList", Objects.nonNull(vo.getAttendanceList()) ? vo.getAttendanceList().stream().map(a -> { -// return i.getAndIncrement() + ".(" + (Objects.equals(a.getPassType(), 1) ? "进场" : "出场") + a.getCreateTime() + ")"; -// }).collect(Collectors.joining("\n")) : ""); -// map.put("workerTypeName", vo.getWorkerTypeName()); -// map.put("phoneNumber", vo.getPhoneNumber()); -// map.put("idCard", vo.getIdCard()); -// map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); -// map.put("enterDate", vo.getEnterDate()); -// listMap.add(map); -// } -// sheetMap.put("date", DateUtil.formatDate(dateTime)); -// sheetMap.put("listMap", listMap); -// root.put(j++, sheetMap); -// } -// templateUrl = Fileutils.getExportTemplateFile("excel/" + tempSheetName).getAbsolutePath(); -// String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; -// EasyPoiUtil.cloneSheetMultipleTimes(templateUrl, outputTemplateFilePath, "1", dateTimes.size() - 1); -// TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); -// params.setSheetName(dateTimes.stream().map(DateUtil::formatDate).collect(Collectors.toList()).toArray(new String[]{})); -// Workbook workbook = ExcelExportUtil.exportExcel(root, params); -// //设置下拉 -// ExcelUtils.downLoadExcel(tempSheetName, response, workbook); -// } catch (IOException e) { -// log.error("", e); -// throw new OpenAlertException("系统错误"); -// } finally { -// if (templateUrl != null) { -// FileUtil.deleteFile(templateUrl); -// } -// } + String templateUrl = null; + try { + String projectSn = MapUtils.getString(param, "projectSn"); + Project project = projectService.getOne(new LambdaQueryWrapper() + .eq(Project::getProjectSn, projectSn)); + String startDate = MapUtils.getString(param, "startDate"); + String endDate = MapUtils.getString(param, "endDate"); + Integer downloadType = MapUtils.getInteger(param, "downloadType"); + Integer groupByType = MapUtils.getInteger(param, "groupByType"); + List dateTimes = DateUtil.rangeToList(DateUtil.parseDate(startDate), DateUtil.parseDate(endDate), DateField.DAY_OF_YEAR); + Map> root = new HashMap<>(); + int sheetIndex = 0; + List sheetNames = new ArrayList<>(); + String tempSheetName; + if (Objects.equals(groupByType, 3)) { + //按班组/部门 + tempSheetName = "考勤月报-按班组.xlsx"; + //考勤月报-按班组.xlsx + param.put("startTime", startDate); + param.put("endTime", endDate); + param.put("pageSize", -1); + List voList = this.doCountDailyAttendanceByDateRange(param).getRecords(); + Map> deptNameMap = voList.stream().collect(Collectors.groupingBy(StatisticsListVo::getDeptName)); + Map>> personSn2Date2AttendancesMap = workerAttendanceService.list(new LambdaQueryWrapper() + .eq(WorkerAttendance::getProjectSn, projectSn) + .ge(WorkerAttendance::getCreateTime, startDate) + .le(WorkerAttendance::getCreateTime, DateUtil.formatDateTime(DateUtil.endOfDay(DateUtil.parseDate(endDate)))) + .select(WorkerAttendance::getPersonSn, WorkerAttendance::getCreateTime, WorkerAttendance::getPassType)) + .stream().filter(w -> Objects.nonNull(w.getPersonSn())).collect(Collectors.groupingBy(WorkerAttendance::getPersonSn, + Collectors.groupingBy(o -> DateUtil.formatDate(DateUtil.parseDate(o.getCreateTime())), + Collectors.toList()))); + BigDecimal totalAttendanceDay = BigDecimal.ZERO; + BigDecimal totalHour = BigDecimal.ZERO; + for (Map.Entry> entry : deptNameMap.entrySet()) { + Map sheetMap = new HashMap<>(); + List> listMap = new ArrayList<>(); + List vos = entry.getValue(); + int index = 0; + for (StatisticsListVo vo : vos) { + Map map = new HashMap<>(); + map.put("no", ++index); + map.put("personType", vo.getPersonType()); + map.put("enterpriseName", vo.getEnterpriseName()); + map.put("workerName", vo.getWorkerName()); + map.put("deptName", vo.getDeptName()); + map.put("projectSn", vo.getProjectSn()); + map.put("personSn", vo.getPersonSn()); + map.put("workerTypeName", vo.getWorkerTypeName()); + map.put("phoneNumber", vo.getPhoneNumber()); + map.put("idCard", vo.getIdCard()); + map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); + map.put("enterDate", vo.getEnterDate()); + for (int z = 0; z < dateTimes.size(); z++) { + DateTime dateTime = dateTimes.get(z); + sheetMap.put("date" + (z + 1), DateUtil.format(dateTime, "M/d")); + sheetMap.put("delete" + (z + 1), false); + String value; + if (Objects.equals(downloadType, 1) || Objects.equals(downloadType, 2)) { + value = getExcelAmPmAttendanceByDate(personSn2Date2AttendancesMap, vo, dateTime, downloadType); + } else if (Objects.equals(downloadType, 3)) { + //每日工时 + value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse(""); + } else { + //每日明细 + value = Optional.ofNullable(vo.getDailyAttendanceMap().get(DateUtil.formatDate(dateTime))).map(integer -> Objects.equals(integer, 1) ? "√" : "×").orElse("x"); + } + map.put("attendanceByDate" + (z + 1), value); + } + for (int i = dateTimes.size(); i < 31; i++) { + sheetMap.put("delete" + (i + 1), true); + } + map.put("totalHour", vo.getTotalHour()); + map.put("totalAttendanceDay", vo.getTotalAttendanceDay()); + totalAttendanceDay = NumberUtil.add(vo.getTotalAttendanceDay(), totalAttendanceDay); + totalHour = NumberUtil.add(vo.getTotalHour(), totalHour); + listMap.add(map); + } + sheetMap.put("listMap", listMap); + sheetMap.put("projectName", project.getProjectName()); + StatisticsListVo vo = CollUtil.getFirst(vos); + sheetMap.put("title", StrUtil.format("项目名称:{} 参建单位名称:{} {}名称:{} 总人数:{} 时间:({} - {})", + project.getProjectName(), vo.getEnterpriseName(), vo.getPersonType() == 1 ? "班组" : "部门", vo.getDeptName(), vos.size(), startDate, endDate)); + sheetMap.put("totalAttendanceDay", totalAttendanceDay); + sheetMap.put("totalHour", totalHour); + root.put(sheetIndex++, sheetMap); + sheetNames.add(entry.getKey()); + } + templateUrl = Fileutils.getExportTemplateFile("excel/workerDailyAttendanceStatisticsV2/" + tempSheetName).getAbsolutePath(); + String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; + EasyPoiUtil.cloneSheetMultipleTimes(templateUrl, outputTemplateFilePath, "1", sheetNames.size() - 1); + TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); + params.setSheetName(sheetNames.toArray(new String[]{})); + Workbook workbook = ExcelExportUtil.exportExcel(root, params); + ExcelUtils.downLoadExcel(tempSheetName, response, workbook); + } else if (Objects.equals(groupByType, 2)) { + //按参建单位 + tempSheetName = "考勤月报-按单位-出勤人数与考勤报表.xlsx"; + //导出sheet1上海振南出勤人数 + List list = workerDailyAttendanceStatisticsV2Service.countExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo(param); + Map> date2Map = list.stream().collect(Collectors.groupingBy(ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo::getDate)); + Map sheetMap1 = new HashMap<>(); + List> colList = new ArrayList>(); + List> listMap1 = new ArrayList<>(); + Integer totalGlNum = 0; + Integer totalSgNum = 0; + Map deptKeyMap = new HashMap<>(); + for (Map.Entry> entry : date2Map.entrySet()) { + int index = 0; + Map map = new HashMap<>(); + map.put("no", ++index); + map.put("date", entry.getKey()); + Integer glNum = 0; + Integer sgNum = 0; + for (ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo bo : entry.getValue()) { + Map e = new HashMap<>(); + e.put("name", bo.getDeptName() + (bo.getPersonType() == 2 ? "(部门)" : "(班组)")); + e.put("glName", "管理人数"); + e.put("sgName", "施工人数"); + String glKey = "gl" + bo.getDeptName(); + String sgKey = "sg" + bo.getDeptName(); + e.put("glNum", "t." + glKey); + e.put("sgNum", "t." + sgKey); + e.put("glTotalNum", glKey); + e.put("sgTotalNum", sgKey); + colList.add(e); + if (Objects.equals(bo.getPersonType(), 1)) { + sgNum = bo.getWorkerNum() + sgNum; + } else { + glNum = bo.getWorkerNum() + glNum; + } + Integer glKeyVal = Objects.equals(bo.getPersonType(), 1) ? 0 : bo.getWorkerNum(); + Integer sgKeyVal = Objects.equals(bo.getPersonType(), 2) ? 0 : bo.getWorkerNum(); + map.put(glKey, glKeyVal); + map.put(sgKey, sgKeyVal); + deptKeyMap.merge(glKey, glKeyVal, (o, n) -> o + n); + deptKeyMap.merge(sgKey, sgKeyVal, (o, n) -> o + n); + } + map.put("glNum", glNum); + map.put("sgNum", sgNum); + map.put("totalNum", glNum + sgNum); + listMap1.add(map); + totalGlNum += glNum; + totalSgNum += sgNum; + } + sheetMap1.putAll(deptKeyMap); + sheetMap1.put("listMap", listMap1); + sheetMap1.put("totalGlNum", totalGlNum); + sheetMap1.put("totalSgNum", totalSgNum); + sheetMap1.put("totalNum", totalGlNum + totalSgNum); + sheetMap1.put("projectName", project.getProjectName()); + String enterpriseId = MapUtils.getString(param, "enterpriseId"); + sheetMap1.put("hourValBegin", MapUtils.getInteger(param, "hourValBegin")); + EnterpriseInfo enterpriseInfo = enterpriseInfoService.getById(enterpriseId); + String enterpriseName = enterpriseInfo.getEnterpriseName(); + sheetMap1.put("enterpriseName", enterpriseName); + sheetMap1.put("colList", colList); + root.put(0, sheetMap1); + sheetNames.add(enterpriseName + "出勤人数"); + + //导出sheet2上海振南考勤报表 + List voList = this.doCountDailyAttendanceByDateRange(param).getRecords(); + Map sheetMap2 = new HashMap<>(); + int index = 0; + List> listMap2 = new ArrayList<>(); + for (StatisticsListVo vo : voList) { + Map map = new HashMap<>(); + map.put("no", ++index); + map.put("personType", vo.getPersonType()); + map.put("enterpriseName", vo.getEnterpriseName()); + map.put("workerName", vo.getWorkerName()); + map.put("deptName", vo.getDeptName()); + map.put("projectSn", vo.getProjectSn()); + map.put("personSn", vo.getPersonSn()); + map.put("workerTypeName", vo.getWorkerTypeName()); + map.put("phoneNumber", vo.getPhoneNumber()); + map.put("idCard", vo.getIdCard()); + map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); + map.put("enterDate", vo.getEnterDate()); + map.put("totalHour", vo.getTotalHour()); + map.put("totalAttendanceDay", vo.getTotalAttendanceDay()); + for (int z = 0; z < dateTimes.size(); z++) { + DateTime dateTime = dateTimes.get(z); + sheetMap2.put("date" + (z + 1), DateUtil.format(dateTime, "M/d")); + sheetMap2.put("delete" + (z + 1), false); + //每日工时 + String value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse(""); + map.put("attendanceByDate" + (z + 1), value); + } + for (int i = dateTimes.size(); i < 31; i++) { + sheetMap2.put("delete" + (i + 1), true); + } + listMap2.add(map); + } + sheetMap2.put("listMap", listMap2); + sheetMap2.put("projectName", project.getProjectName()); + sheetMap2.put("title", StrUtil.format("项目名称:{} 参建单位名称:{} 班组名称:全部 总人数:{} 时间:({} - {})", + project.getProjectName(), enterpriseName, voList.size(), startDate, endDate)); + sheetMap2.put("enterpriseName", enterpriseName); + root.put(1, sheetMap2); + sheetNames.add(enterpriseName + "考勤报表"); + templateUrl = Fileutils.getExportTemplateFile("excel/workerDailyAttendanceStatisticsV2/" + tempSheetName).getAbsolutePath(); + String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; + TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); + params.setSheetName(sheetNames.toArray(new String[]{})); + Workbook workbook = ExcelExportUtil.exportExcel(root, params); + ExcelUtils.downLoadExcel(tempSheetName, response, workbook); + } else if (Objects.equals(groupByType, 4)) { + //按人员 + tempSheetName = "单个人员考勤出入明细报表.xlsx"; + List voList = this.doCountDailyAttendanceByDateRange(param).getRecords(); + Map>> personSn2Date2AttendancesMap = workerAttendanceService.list(new LambdaQueryWrapper() + .eq(WorkerAttendance::getProjectSn, projectSn) + .ge(WorkerAttendance::getCreateTime, startDate) + .le(WorkerAttendance::getCreateTime, DateUtil.formatDateTime(DateUtil.endOfDay(DateUtil.parseDate(endDate)))) + .select(WorkerAttendance::getPersonSn, WorkerAttendance::getCreateTime, WorkerAttendance::getPassType)) + .stream().filter(w -> Objects.nonNull(w.getPersonSn())).collect(Collectors.groupingBy(WorkerAttendance::getPersonSn, + Collectors.groupingBy(o -> DateUtil.formatDate(DateUtil.parseDate(o.getCreateTime())), + Collectors.toList()))); + for (StatisticsListVo vo : voList) { + Map sheetMap = new HashMap<>(); + sheetMap.put("startDate", startDate); + sheetMap.put("endDate", endDate); + List> listMap = new ArrayList<>(); + for (int z = 0; z < dateTimes.size(); z++) { + Map map = new HashMap<>(); + DateTime date = dateTimes.get(z); + map.put("date", DateUtil.formatDate(date)); + map.put("week", DateUtil.dayOfWeekEnum(date).toChinese()); + map.put("detail", Optional.ofNullable(personSn2Date2AttendancesMap.get(vo.getPersonSn())).map(m -> m.get(DateUtil.formatDate(date))) + .map(attendances -> attendances.stream().sorted(Comparator.comparing(WorkerAttendance::getCreateTime)) + .map(att -> DateUtil.format(DateUtil.parseDateTime(att.getCreateTime()), "HH:mm") + (att.getPassType() == 1 ? "入场" : "出场")).collect(Collectors.joining("\n"))).orElse("")); + listMap.add(map); + } + root.put(sheetIndex++, sheetMap); + sheetMap.put("projectName", project.getProjectName()); + sheetMap.put("personType", vo.getPersonType() == 1 ? "班组" : "部门"); + sheetMap.put("enterpriseName", vo.getEnterpriseName()); + sheetMap.put("workerName", vo.getWorkerName()); + sheetMap.put("deptName", vo.getDeptName()); + sheetMap.put("workerTypeName", vo.getWorkerTypeName()); + sheetMap.put("totalAttendanceDay", vo.getTotalAttendanceDay()); + sheetNames.add(vo.getWorkerName()); + } + templateUrl = Fileutils.getExportTemplateFile("excel/workerDailyAttendanceStatisticsV2/" + tempSheetName).getAbsolutePath(); + String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; + EasyPoiUtil.cloneSheetMultipleTimes(templateUrl, outputTemplateFilePath, "1", sheetNames.size() - 1); + TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); + params.setSheetName(sheetNames.toArray(new String[]{})); + Workbook workbook = ExcelExportUtil.exportExcel(root, params); + ExcelUtils.downLoadExcel(tempSheetName, response, workbook); + } else if (Objects.equals(groupByType, 1)) { + //按项目 + tempSheetName = "考勤月报-按项目.xlsx"; + param.put("startTime", startDate); + param.put("endTime", endDate); + param.put("pageSize", -1); + List vos = this.doCountDailyAttendanceByDateRange(param).getRecords(); + Map>> personSn2Date2AttendancesMap = workerAttendanceService.list(new LambdaQueryWrapper() + .eq(WorkerAttendance::getProjectSn, projectSn) + .ge(WorkerAttendance::getCreateTime, startDate) + .le(WorkerAttendance::getCreateTime, DateUtil.formatDateTime(DateUtil.endOfDay(DateUtil.parseDate(endDate)))) + .select(WorkerAttendance::getPersonSn, WorkerAttendance::getCreateTime, WorkerAttendance::getPassType)) + .stream().filter(w -> Objects.nonNull(w.getPersonSn())).collect(Collectors.groupingBy(WorkerAttendance::getPersonSn, + Collectors.groupingBy(o -> DateUtil.formatDate(DateUtil.parseDate(o.getCreateTime())), + Collectors.toList()))); + BigDecimal totalAttendanceDay = BigDecimal.ZERO; + BigDecimal totalHour = BigDecimal.ZERO; + Map sheetMap = new HashMap<>(); + List> listMap = new ArrayList<>(); + int index = 0; + for (StatisticsListVo vo : vos) { + Map map = new HashMap<>(); + map.put("no", ++index); + map.put("personType", vo.getPersonType()); + map.put("enterpriseName", vo.getEnterpriseName()); + map.put("workerName", vo.getWorkerName()); + map.put("deptName", vo.getDeptName()); + map.put("projectSn", vo.getProjectSn()); + map.put("personSn", vo.getPersonSn()); + map.put("workerTypeName", vo.getWorkerTypeName()); + map.put("phoneNumber", vo.getPhoneNumber()); + map.put("idCard", vo.getIdCard()); + map.put("sex", Objects.equals(vo.getSex(), 1) ? "男" : "女"); + map.put("enterDate", vo.getEnterDate()); + for (int z = 0; z < dateTimes.size(); z++) { + DateTime dateTime = dateTimes.get(z); + sheetMap.put("date" + (z + 1), DateUtil.format(dateTime, "M/d")); + sheetMap.put("delete" + (z + 1), false); + String value; + if (Objects.equals(downloadType, 1) || Objects.equals(downloadType, 2)) { + value = getExcelAmPmAttendanceByDate(personSn2Date2AttendancesMap, vo, dateTime, downloadType); + } else if (Objects.equals(downloadType, 3)) { + //每日工时 + value = Optional.ofNullable(vo.getDailyHourMap().get(DateUtil.formatDate(dateTime))).map(decimal -> decimal.toString()).orElse(""); + } else { + //每日明细 + value = Optional.ofNullable(vo.getDailyAttendanceMap().get(DateUtil.formatDate(dateTime))).map(integer -> Objects.equals(integer, 1) ? "√" : "×").orElse("x"); + } + map.put("attendanceByDate" + (z + 1), value); + } + for (int i = dateTimes.size(); i < 31; i++) { + sheetMap.put("delete" + (i + 1), true); + } + map.put("totalHour", vo.getTotalHour()); + map.put("totalAttendanceDay", vo.getTotalAttendanceDay()); + totalAttendanceDay = NumberUtil.add(vo.getTotalAttendanceDay(), totalAttendanceDay); + totalHour = NumberUtil.add(vo.getTotalHour(), totalHour); + listMap.add(map); + } + sheetMap.put("listMap", listMap); + sheetMap.put("totalAttendanceDay", totalAttendanceDay); + sheetMap.put("totalWorkerNum", vos.size()); + sheetMap.put("totalHour", totalHour); + sheetMap.put("startDate", startDate); + sheetMap.put("endDate", endDate); + sheetMap.put("projectName", project.getProjectName()); + root.put(0, sheetMap); + sheetNames.add(project.getProjectName()); + templateUrl = Fileutils.getExportTemplateFile("excel/workerDailyAttendanceStatisticsV2/" + tempSheetName).getAbsolutePath(); + String outputTemplateFilePath = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + ".xlsx"; + TemplateExportParams params = new TemplateExportParams(outputTemplateFilePath, true); + params.setSheetName(sheetNames.toArray(new String[]{})); + Workbook workbook = ExcelExportUtil.exportExcel(root, params); + ExcelUtils.downLoadExcel(tempSheetName, response, workbook); + } + } catch (IOException e) { + log.error("", e); + throw new OpenAlertException("系统错误"); + } finally { + if (templateUrl != null) { + FileUtil.deleteFile(templateUrl); + } + } + } + + /** + * 获取一天上下午/进出场打卡,格式: + * 07:19入场; + * 17:39出场 + * + * @param personSn2Date2AttendancesMap + * @param vo + * @param dateTime + * @param downloadType 1上下午打卡2进出场打卡 + * @return + */ + private String getExcelAmPmAttendanceByDate(Map>> personSn2Date2AttendancesMap, StatisticsListVo vo, DateTime dateTime, Integer downloadType) { + String attendanceByDate = ""; + Optional> workerAttendances = Optional.ofNullable(personSn2Date2AttendancesMap.get(vo.getPersonSn())).map(m -> m.get(DateUtil.formatDate(dateTime))); + WorkerAttendance first = workerAttendances.map(attendances -> downloadType == 1 ? getFirstTimeAm(attendances) : getFirstInTime(attendances)).orElse(null); + if (first != null) { + attendanceByDate = DateUtil.format(DateUtil.parseDateTime(first.getCreateTime()), "HH:mm") + (first.getPassType() == 1 ? "入场" : "出场"); + } + WorkerAttendance end = workerAttendances.map(attendances -> downloadType == 1 ? getEndTimePm(attendances) : getEndOutTime(attendances)).orElse(null); + if (end != null) { + if (StrUtil.isNotBlank(attendanceByDate)) { + attendanceByDate += "\n"; + } + attendanceByDate += DateUtil.format(DateUtil.parseDateTime(end.getCreateTime()), "HH:mm") + (end.getPassType() == 1 ? "入场" : "出场"); + } + return attendanceByDate; } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo.java new file mode 100644 index 000000000..b3c36cf48 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/bo/ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo.java @@ -0,0 +1,26 @@ +package com.zhgd.xmgl.modules.worker.entity.bo; + +import lombok.Data; + +@Data +public class ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo { + /** + * 人员类型 1、劳务人员 2、管理人员 + */ + private java.lang.Integer personType; + + /** + * 日期 + */ + private java.lang.String date; + + /** + * 班组/部门 + */ + private java.lang.String deptName; + + /** + * 人数 + */ + private java.lang.Integer workerNum; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/StatisticsListVo.java b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/StatisticsListVo.java index 74df243b5..aa919d352 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/StatisticsListVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/entity/vo/StatisticsListVo.java @@ -64,4 +64,50 @@ public class StatisticsListVo { */ @ApiModelProperty(value = "人员sn") private java.lang.String personSn; + /** + * 劳务人员Id + */ + @ApiModelProperty(value = "劳务人员Id") + private java.lang.Long workerId; + /** + * 工种名称 + */ + @ApiModelProperty(value = "工种名称") + private String workerTypeName; + /** + * 手机号 + */ + @ApiModelProperty(value = "手机号") + private java.lang.String phoneNumber; + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号") + private java.lang.String idCard; + /** + * 性别 + */ + @ApiModelProperty(value = "性别,1男,2女") + private java.lang.Integer sex; + /** + * 进场日期 + */ + @ApiModelProperty(value = "进场日期") + private java.lang.String enterDate; + + /** + * 项目sn + */ + @ApiModelProperty(value = "项目sn") + private java.lang.String projectSn; + /** + * 工人工资卡银行开户行名称 + */ + @ApiModelProperty(value = "工人工资卡银行开户行名称") + private java.lang.String payRollBankName; + /** + * 工人银行卡号 + */ + @ApiModelProperty(value = "工人银行卡号") + private java.lang.String payRollBankNumber; } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java index 5e63ef9a7..8e56c7594 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/WorkerDailyAttendanceStatisticsV2Mapper.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.xmgl.modules.worker.entity.WorkerDailyAttendanceStatisticsV2; import com.zhgd.xmgl.modules.worker.entity.bo.CountWorkerDailyAttendanceStatisticsV2ByDateBo; +import com.zhgd.xmgl.modules.worker.entity.bo.ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo; import com.zhgd.xmgl.modules.worker.entity.vo.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -79,4 +80,6 @@ public interface WorkerDailyAttendanceStatisticsV2Mapper extends BaseMapper countNumByEnterprise(HashMap param); List countNumByWorkerType(HashMap param); + + List countExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo(HashMap param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml index aa9f60460..998811569 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml @@ -55,6 +55,7 @@ ,ei.id as enterprise_id ,if(c.id is not null,c.id,d.id) as department_team_id ,if(c.team_name is not null,c.team_name,d.department_name) as department_team_name + ,b.id as worker_id from worker_attendance a LEFT JOIN worker_info b ON a.person_sn = b.person_sn LEFT JOIN team_info c ON b.team_id = c.id diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml index f335d1644..5edc446a3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerDailyAttendanceStatisticsV2Mapper.xml @@ -49,7 +49,7 @@ resultType="com.zhgd.xmgl.modules.worker.entity.vo.CountWorkerDailyAttendanceStatisticsV2Vo"> select t.* - ,ifnull(round(t.total_in_service_num/t.total_attendance_num*100,2),0) as attendance_rate_avg + ,ifnull(round(t.total_attendance_num/t.total_in_service_num*100,2),0) as attendance_rate_avg from ( select count(*) as total_in_service_num @@ -57,11 +57,11 @@ ,ifnull(sum(t.hour_val),0) as hour_val_total from worker_daily_attendance_statistics_v2 t JOIN worker_info a on t.person_sn=a.person_sn - JOIN team_info b ON a.team_id = b.id and a.person_type = 1 - JOIN department_info c ON a.department_id = c.id and a.person_type = 2 - JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 + LEFT JOIN team_info b ON a.team_id = b.id and a.person_type = 1 + LEFT JOIN department_info c ON a.department_id = c.id and a.person_type = 2 + LEFT JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 JOIN enterprise_info en ON en.id = a.enterprise_id - INNER JOIN project_enterprise pe ON a.id = pe.enterprise_id and pe.project_sn=t.project_sn + INNER JOIN project_enterprise pe ON en.id = pe.enterprise_id and pe.project_sn=t.project_sn where t.project_sn=#{projectSn} and a.person_sn = #{personSn} @@ -97,7 +97,7 @@ resultType="com.zhgd.xmgl.modules.worker.entity.bo.CountWorkerDailyAttendanceStatisticsV2ByDateBo"> select t.* - ,ifnull(round(t.total_in_service_num/t.total_attendance_num*100,2),0) as attendance_rate_avg + ,ifnull(round(t.total_attendance_num/t.total_in_service_num*100,2),0) as attendance_rate_avg from ( select @@ -110,11 +110,11 @@ ,ifnull(sum(t.is_attendance),0) as total_attendance_num from worker_daily_attendance_statistics_v2 t JOIN worker_info a on t.person_sn=a.person_sn - JOIN team_info b ON a.team_id = b.id and a.person_type = 1 - JOIN department_info c ON a.department_id = c.id and a.person_type = 2 - JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 + LEFT JOIN team_info b ON a.team_id = b.id and a.person_type = 1 + LEFT JOIN department_info c ON a.department_id = c.id and a.person_type = 2 + LEFT JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 JOIN enterprise_info en ON en.id = a.enterprise_id - INNER JOIN project_enterprise pe ON a.id = pe.enterprise_id and pe.project_sn=t.project_sn + INNER JOIN project_enterprise pe ON en.id = pe.enterprise_id and pe.project_sn=t.project_sn where t.project_sn=#{projectSn} and pe.enterprise_type_id = #{enterpriseTypeId} @@ -152,11 +152,11 @@ ,ifnull(sum(t.day_val),0) as day_val_total from worker_daily_attendance_statistics_v2 t JOIN worker_info a on t.person_sn=a.person_sn - JOIN team_info b ON a.team_id = b.id and a.person_type = 1 - JOIN department_info c ON a.department_id = c.id and a.person_type = 2 - JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 + LEFT JOIN team_info b ON a.team_id = b.id and a.person_type = 1 + LEFT JOIN department_info c ON a.department_id = c.id and a.person_type = 2 + LEFT JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 JOIN enterprise_info en ON en.id = a.enterprise_id - INNER JOIN project_enterprise pe ON a.id = pe.enterprise_id and pe.project_sn=t.project_sn + INNER JOIN project_enterprise pe ON en.id = pe.enterprise_id and pe.project_sn=t.project_sn where t.project_sn=#{projectSn} and pe.enterprise_type_id = #{enterpriseTypeId} @@ -195,11 +195,11 @@ ,ifnull(sum(t.is_attendance),0) as worker_count from worker_daily_attendance_statistics_v2 t JOIN worker_info a on t.person_sn=a.person_sn - JOIN team_info b ON a.team_id = b.id and a.person_type = 1 - JOIN department_info c ON a.department_id = c.id and a.person_type = 2 - JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 + LEFT JOIN team_info b ON a.team_id = b.id and a.person_type = 1 + LEFT JOIN department_info c ON a.department_id = c.id and a.person_type = 2 + LEFT JOIN worker_type wt ON b.worker_type_id = wt.id and a.person_type = 1 JOIN enterprise_info en ON en.id = a.enterprise_id - JOIN project_enterprise pe ON a.id = pe.enterprise_id and pe.project_sn=t.project_sn + JOIN project_enterprise pe ON en.id = pe.enterprise_id and pe.project_sn=t.project_sn where t.project_sn=#{projectSn} and a.person_type = #{personType} @@ -239,4 +239,30 @@ group by wt.id) t + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java index 6cb12645a..1d6cf9f2b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerDailyAttendanceStatisticsV2Service.java @@ -7,6 +7,7 @@ import com.zhgd.xmgl.base.entity.vo.echarts.ChartDataVo; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendanceRuleV2; import com.zhgd.xmgl.modules.worker.entity.WorkerDailyAttendanceStatisticsV2; import com.zhgd.xmgl.modules.worker.entity.bo.CalAttendanceBo; +import com.zhgd.xmgl.modules.worker.entity.bo.ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo; import com.zhgd.xmgl.modules.worker.entity.dto.WorkerDailyAttendanceStatisticsV2Dto; import com.zhgd.xmgl.modules.worker.entity.vo.*; @@ -101,4 +102,12 @@ public interface IWorkerDailyAttendanceStatisticsV2Service extends IService countNumByEnterprise(HashMap param); List countNumByWorkerType(HashMap param); + + /** + * 获取导出的 + * + * @param param + * @return + */ + List countExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo(HashMap param); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java index 4d7f22df1..85e60ce14 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerDailyAttendanceStatisticsV2ServiceImpl.java @@ -19,6 +19,7 @@ import com.zhgd.xmgl.modules.project.service.IProjectEnterpriseService; import com.zhgd.xmgl.modules.worker.entity.*; import com.zhgd.xmgl.modules.worker.entity.bo.CalAttendanceBo; import com.zhgd.xmgl.modules.worker.entity.bo.CountWorkerDailyAttendanceStatisticsV2ByDateBo; +import com.zhgd.xmgl.modules.worker.entity.bo.ExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo; import com.zhgd.xmgl.modules.worker.entity.bo.Hour2dayJsonBo; import com.zhgd.xmgl.modules.worker.entity.dto.WorkerDailyAttendanceStatisticsV2Dto; import com.zhgd.xmgl.modules.worker.entity.vo.*; @@ -450,7 +451,12 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl 0) { + //没入场不在职 + inserviceType = 2; + } + this.calAndSaveStatistics(worker.getProjectSn(), worker.getPersonSn(), inserviceType, dateTime, ruleV2, attendances, allAttendances); } } } @@ -588,4 +594,9 @@ public class WorkerDailyAttendanceStatisticsV2ServiceImpl extends ServiceImpl countExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo(HashMap param) { + return baseMapper.countExportWorkerDailyAttendancesStaticsByDepartmentTeamXlsBo(param); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index a3fd450ee..f15b3dca6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -18,6 +18,7 @@ import cn.hutool.poi.excel.ExcelWriter; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -617,6 +618,10 @@ public class WorkerInfoServiceImpl extends ServiceImpl() + .set(WorkerInfo::getAttendanceGroupV2Id, workerInfo.getAttendanceGroupV2Id()) + .eq(WorkerInfo::getId, workerInfo.getId()) + ); workerInfoMapper.updateById(workerInfo); systemUserService.updateRealNameFromWorker(workerInfo.getId(), workerInfo.getWorkerName()); boolean hikvisionConfig = projectUfaceConfigService.isHikvisionConfig(workerInfo.getProjectSn()); diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/单个人员考勤出入明细报表.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/单个人员考勤出入明细报表.xlsx index 73d137584531ca7133b77f5bd10bd06c443c98f7..88e51bd5c1705931eb039361577c9794ab23ca90 100644 GIT binary patch delta 5160 zcmZ8lbyU^gvOfooba!_gx>HJN@kk>e(jn4a;uj>OBu)@2-JrmsySqa{Kw3ZrX*fte zy}$e3UH9!j_S$P^e`aQ_J!|%S=0+{aH8N9T*eQi7HJy+Usv@!lhQaSNSecuzaZ_5ktQ%{Oa%d66DG%8^q9f>+P$Muwl?9l~(WhqW#%=7E%PqwPx-4^(E zS5F5ULInbW@IbF0t*eMS&gvtoz(T-uS@pEhRfzyUJ2}MGX?|vw!=Gbu@(k~TnKzkx zWUr7XT)F@Y&D0^Y(n>Fv>E=h?7UowbX{d$^QMXp(Lz%&*o+>5rLcOyXhvKI@seX0l zn)wIA2R9S|{V-3mjl<}E|ScxTMnnrB7lQHqcj7&e@Q+0maxDKqxR)TmV z6VNyl+!&_0&c>fH&ytXNswNZl&p-y&P?d;7k{NKHvL&fWi!via;r6HD{j#bVCHHJ0 zbpijqkA|6EHSQW$>-mp{55n+dE=&;X$aq?JpeM&6j~es0sblWP3V<{zJrj0}aiD z!4vfzn^&_?(3k32; ztU`nUk-J`YrX&n^?h)3i=wZByN>S=+6vps+_{-2V``$q>(mnN5lb($E(`54{g*sxn zu<85$aJ1}5lJ+sQtk9`wKW-O$T)9vjn8)n?%14}17C&NZJaJ$7;ySTw z@kFW0TnBl$qVIVTyvzZI^|SD78$^i3A>V!k z^jZ47+h&?JmiesVn)3&JIJ9)nn?+*DPGTe-^#fN(y@8VXs*@mh>LOT> zb3=nEC#(qFo1V9FkF$=!i!5U~=@mv;hBOYThYqzPn7^VZEcFS74J^pWy}&}36E|n5 zry&R1oYioxRzbw=qd#^Vqq*e9KF9)T#QbZh+U~6^c&eh@)vEE9bFGTT-qu;(uG?kd zcx&c%aN#!D15{`{y#2A)%iBeF>U=I$ zDTOi2)sE>AdZ9~jVJwfG`D#z?#2!K--wFQ%RB7gSN#~sV!(8Tic~?AM7>%=vIN^rr z)m%}f&wOeO` z#TX29g$an)@L1b3EM06))*Q6oyBx2-OxJ?{n^vO?=$v2 zqS4y{dC9I3M&YX@nd7uj@E*SMs>ACFRH}~;5^Dd|DR*^sQXVS5|LD<|2kc@N6-?&$ z65>+}TM5)20-NeYUmwm!CD6S!NEM>iv2HH|SyP!yM0J0lMu!=$$MS2wWDwu{bN%wlTPwR&Jn_`< zS00fz=^^-*Wdjjfz`f(;H=ZSC9rBN>-4!hi!Ae)B0erp{}e^vVNT`SiyE`F}o6{i)Eq$3@3jN^%L= zO?RP;+<{$bBwZCvJ+iM|pgufHO^hw}I$8eO^G@7+0F3(ZEm--e5f7&QkSnmaBE2hnHeCA=@U zQ>VVibW4g3sLmYro9HUk6|J8xi2%+{4DaP<$LvN3AYpX6A?sdb59_&|mu~^$FZ%!A?x=i$AV|ip9+Bn(H)O;9f7$uIeH> z!Z3lGV9)w;EFZo7?lnnz@OprqedDM~%ULI;Xc_ti3p&L3W;Yy#)^pZw_Z!fd`VrT1 zcO%24vCD`qu*PeW^7LCOS^M!8nLB?Tnfwwa+PdFu&854p(yE1Lg=Sd=m|O9ftZctH z8zo$R7I}L>xzZ>UWAGua-*~1mck;G9kjZlLxwyxaxr9fw%mez|!Z$Is?n8XHgTy%3 z7pI$#emY+zpk;%_g143iC%$6R=s4BqmzL;*?BMps;ez>hTkg&TMBXjJcF4;iB32kU zjskrlG3yWLFLH^}9i0G9furB5SD(;7baS=t--BslJY&^#o2AKUmXPF-!BsUbOr{+fY?zRvV$y zcq`pRw~D^KDz z65MERnOaU05IVvlCB8Cr&`SF@Vfrqh@-rAEc*vdDl>;l4cGE%nT~1OOncvYt)xA9p zp(!jkSU-MWmP!-oDIVpO{7ZJ|fHt_~V0@2+s1JLDmGPjS?CFYpW@qCwq8c0{Zwk2J zi;F=SU219!-zKCe3$PeS%$4I(6MB*}01bvP-HwoYE|Zr~o?t>!6` z>iB``4R-jOmUPNy7^n_?8qg*qYNJ|9`>MGYQ3YqA5xzSM0mZ z_*0MI07nm(bZbM)hG{;C2i_j)n{b1>41o!>v4w?}EoJ7qu>{%8gzNC7#@uphf2oMb zY|5fz>KQk0J#ih!5?Lrno>V0dUaR?n<9dHB-`dgDVXY=t;_(UhTd)1n@3g0mQ7jJJ z1XsfZR6%Jd=nkiB=ZG(p>Kwy@gp9VmI4|A|kR+?m)Gtt`_1sc(M!4uu8l-)FVDq!>i__MjgQMD0+!HnI z5x~nmPk5sxzu@lll+9}dx!(n7JSr#C*|!t?wA7-Eq;l42A$MjAr*b?K0>++ zUJzpK)Dif)u0&sG?e`)p2gl+?VotCH9o{DjoEMG-!9IR}cZ)b;EmdRJ9BXos=V677 zgba8A#;cb*-f7h|=#MxqHrgd5rlzle5^S2HRtrSgCOL5-M23vya11%0|OH%LPrhwx`X(Z=!xojO7lJ6n$s^^jx!#u^THOZbVm~wo&vI6mVo4Zhe&mro^ zSCdT$@u;Md0G5Q9qj@ZUc!r~`x;0NfYL=OKgP$-dRt#F2;4UfJTtSqcDE7YXBYxxX zu-$!qhfT3gV-pt24SswM()GA*_ zy0Cu|$76tW-0;VE0^)JA8lywKa&6=yu{o!h&p4q45xRwnh0|duh60$WdnbB(albSF z69>$HUgJE)5?OxxL-Gl)WR_DOvG=a)$DyvtSsV z>d7j$le1#w%{dlQ@Foj-?-yB0S8?&QxX*C?{*ZD^9as~p{eq2Gi2kkSP|otZXFbJt z#l>%%fZqo|-}+pVonna{kN6s|k%3J*a52>Pn>HF&LOH_a3+s^tAtF4Y8kHgEFK3pJvQ?EgLD2kOs%dGkQVD~6rxtAi4LMzs@ z2RQs@C+hBn!7nGCIF4~ej3nu0CL<%e4b;{gg(!emnms(Y6B98!QSa)t@V-;wqfhi2 zgW@Asr?g@=aedQUCp!XVJF=^=EpqZnG6NC^=bd6{QprVKw`1Sm{{H+sUoCPoGA@8x zLh#~zZ(TQOoAjkj2jFqIwjC=tLWp`-l6*vOCP|YkTj=c)d^l0lw{+Y8^FT1tUO*u` zOWF^(IS)Eg(7{LP#QrYc9y)f7&-I@748k~xWGlkdOodATOoy5!>()jZo7idQ()=_EcSkck$vD858w*KiKe&+jwM<#;+sz zM(4xV5-!m|qepm@FX1Av^sgmk=|%y4ZX@16{(bA!INR3#V!KoU?H+6!Yf$6W=o^A? z8@X~Xxp$1zSUuv8H^gOR_#x2_72^)VuLZP6%Fyqll0toC|E2b(@!ypdZPI5K74)&O zLSZ8qQ4pMNm16Vl`o#AoDv!Eva6&IKIo^$Ly1E1>EoPbO-aV>|IH( z7|c0+wjd2~nGlYq8y=-S$b3@PMSbW1p{SZJ*PKUgzSoo_7mGnwW-RpJ__&0KclT)f^~@E+7|*Q|CUC1LGIJIw9h4)ae-`Dgu|6oFDm32Vrif+64@L;{-%79JB~oJ|}o zhyb%2|7UuJuws{D{5w=K{=-k~|8Ph0e;ELQz#z6ir?-eob|o+iVvk(~9EcF%5Ct0{ ztU08?A&4{%A;$maoc{p-!GRGg9K4MGzsdc3;~#x9f}K+yj7C^+N@IP&Mcm?2BT6~R t82>*}`VXKS@rhFboPi+cVrTrnX$=ktME8%^f1B+?z_d)`l6nyN2#=kPc}CDe0k8x}@a?(o)V0B_Js{QqmzE3K9YmN(mA&NJ-Zq zAMbtd``vZ#UhC{X&OXoD=bW|IUi*16bpB|+kiy^kvhS#aiGg7XQxatmF#6W<`E~Qg zw`@gqJ~xK}P%@-$O`6r8r~sD4Mky?!#gmCeRYA7EFpQ!Bz1qBvfOT@(%d{SKgJQkJ znOP*<$@DNk3_pc@`R;GE4(JmKSaU^mKe4mHR#w{FNKmVt$Wb+2+1}!8vpwO*G~>>pDuifdCL_X{q*OHclk2h zH%G3@w`{i{!v|n2Dhvz^JdDJLYbxh`s}B&>m_mT@BTF6rs2OT)ZK{}WmS;`PNlc^C zO^P7TY{obUn?GT}YvLLe!J&ikd%l{Vc|2{nL{>X1^qjYz!BGE!=* z7&$Eb0}+mLvs&6w9lEXAaYP`@l@Gs=W(0I;O8NuZ{b+M_qSVk9x8 zdN$Ct=8fIFrz5HDI@QCc;e^wYgBI+DHj)G~q4fm6p9^r<6%<@lVSODz_TxZJ9enpB zM_t+!MjF?6)NgssKAZ$DLRtM|KY7Pfoz1?HrvqJooPJ_6DaE~d+V|nL%AqNqv}c;> ztYTxT&)gp@X5dMiuEC%!m~I@ zYG1&v8<;Ykd^=Wtjduk2%vn9bvL==-KwwE-+mziK>vY&p7_5>tOOihk>bHrbSaK45 zzoNe5mr=foJ7|-E+IufF&q-E_LMmJ{8H5|EFl3*a7AJ!+_lqI+4RsCDLcp6D51tEu*>m z!JjCnTL*o3!u0)~4tDs~!80~!bF)N(vD3-k)g^ZXOHqyZ3hs}#=;g&arbw4?9uGB6 zDs6h~(9s}(1O2V?qgFklbz}`JI;I<$h#A2zK~Ps1ZycPv3X}iNQ|GP5Fc%#~0sNjH zvVPOlOZ!#1iO)N;B@ch6Veb>O0^!4f!_m6S#yVU(9FkL2PL#%7U+lSCR2Yaub{fFj zXjvDeO4Usop6IaubzZ6=Y59~Lh5rka=2cMNtL9f?zl2{`*Lm;sQwVSxzD^lrg_)J* z_`9|W*p-lzmvzdoOvrA@Gb%papz38iL+(+4J@BbPdg4BF+_K>Py?x$%GDBBbwW%Mz z^r~2esCR8GDpQ;_0$<9$uzro^z9fJcO4p$DA*X!1+fnEwhTp|lszGXPnKzUxi=Fvs zmMTCnU*(1WgE)FoY}Mp%xLlozLlqCbP25}~kEnYR(Fz-G-bOv?3DibA_&tQ&Wht-o zpyo5g8ne-$pZ5CsslrbN^_cW|#wsF}0d-QFsCBJZ-<@a3Zd4-|i(t{XE=mAVyB!3$ zG6oy{W*|18{od*dB`)nCIKYV}T`+R{MPcA#8T+`_Bc;{WnfH?iaQ^(dCDiMW)6O{8 z?g1nxBz2%FK6(Q@#`51y7)h<@wR!i)a zlq{;K=@ziRR1|wL8OQsYK!1{7$~4P$`%F^S539nnk4)!7ARzhZ`{}TV0GYc`yMKC5y z`yrR#@^fuor1XTjY}KPT+01zf{+E{CW*fHCINvjcR zgu;r`fMR}<4E*&FG#cF)W%xcB#c7!YsQ-}+(2Ti9H{_#0*AXL;RGNR-YxjWzSgYNi zi$XUxUU^YBR!uMCWD3IWC+m??8o`780AMd#o=acK@G0E2ndaEc+jZ*VnQdP+ws6g@ zf1g)JLk+a@Rx47v%0|T?pz}bdGh%61TCtsUXSp?}O(d*6*=+O=dNa5K{oWebu4TQI z%*=h6zxj*X;C)ZnA>n^l1zzxj7W714C245A`l1)^KuFNt0=~yp1u%E`akJ| z0G&QI3)yGr)6tK7X$Y8^6`65L92PR~+q&~0bSxAK*U*ml!58GG;5W3W8EmLBR+_{h zbgXh&ypd?mk6aV^T_}+gn7)neE%FQnSu@!HnlQH!%t zU1y9k(9~5{cu`}mS;j$tm^?|SSdTC>P-x~}J6#rua&V(4l$#rO8YRGv{>`m;C_^-~ z2$!U1w62w%KN`x$JxE3ON~wj?GwLAx?OzVyQv@*SWNl_|K zO=S_{MfIw-tz%u^W`LNdzqcsd!C+?E`u@r1e6_Z>N%uE`R#=|Vx5mH2``R78mltUr z3bp}SReP?ENGqZ)G&!yki!K(tRWm6}C2QX&LGW+RkB6qPYq*bTYNU=`gUT|=7fQ*2 z`Z=MnKIMQ|)t;!Q?T9P(sE-zmU0908KD%!F*AG%*YrFgVsgW6+mZq$usL%VKH@ttO zZ>zlI=fTGX-+nI?j2P|5R`B6dnZQjwf=EIySECvqFbEDXEQ`HItDns5A? z<0>Ml&?>*>aeB)ts*Z;tfk-(a#!CF^$ zd2XhgW1P)@cC^tBb9L;M(iaj1L_TN5-z1f)rW)DI-JinAP{O(}3xtE6uQG9<@11o+p^nIjt^1EP?CRg|1uDZ9HUs4k-rGjn6@~t2bCCUMg#}y~O0O$B#-gT$U z_za#G$E@D=igq5~4Ma!6Hn_4U&mn}B-rbjTJo8W5>z7}8V3O}1<6%JfAo~ACzsq%1 zsEJQLDPbXU_^O{20;i(quAk~!W*TCM7lje+mN}g$pA5NMZ6~trn(XZpc^?m->){HQ ztFvEba5{951pf>N97BoZJwJVElqJ3iMcltn`T-R`;Rvb2kI#7aGC3=LLi00pDkt<~ z*PBwinSAQ-%q-sD0s@8`HfE*O8LJo~(>g>pp6&+AlCbRpR$b*ab$_~dNcNgACjE|+ z7U9;@iiPKnwsT#BqzUQ%O~c>S=c$Y-HjTCMGxgZGjN&t#0h_Msj7)V|7QPs`k}<`* zo%PA0{{8TgAsGY}>zgpX%uiRAy#0qwh85NCuuuEHI?>g6C%4KLTXyT(1PH{xJ$Ed6 zIh6B~JcMbIl2~x4J^6jAZ^oB>ZLLJ6hnh3nU>VwH!4*@OxIy?S?T0Qir|KfXA$mhf zN6^vO8y^9@Jpgk-h^6;|z`~jmy-@G33k6l;whKnp(>75uBp1=enD*(FD#(k3 z%5N%t?6xx)5BzB*$@VLI&%bU8y9ha26VLU-4Vmidu#9j8^}^cg7Ch?X`OKK=knk`* zwFoN#Q8rSVv;*_#_)Ap};TLISt?lf>9-(WZ7>js-kEaH-($e0~ygA2%Hu~e>_p|3` zKTZAIG?qFkG?{k!Ba1!gex(mOm=+po5XGA_37dW}WS{+Ee460#THHR1Uq)u%oKp0W zjtk8|u%Xom!E}4g2tGsZ<47|sSI4m?3R958_~7$iy;Ol3dAX0KG|ZGvhQ{>E?)E`8 z^rB2ofJ}rnrC(OoP+aNAh*NY`wF37?Q!{2T)MZnw1le#zx5_V&fv=I3r3Lo9+h-!E z`R5pw`CEl#+nc1h`$!iuNo3@WDcKKas&{F*>-B-*9F`QSI|o(7SK7EeFV3*DaH?lm zz54^e={LPm5ax24#|@*>{iNW)NMKa1FWP-dwlN`AQ}^%-8B))c^7ai4yHnV-Qk$K) z_pDZ0Loy#p61OJ;GaJ#l|3irLC|sko&%aVKBU8gq=lxl##!Bw{L^J!)MixZCq}2E&Ijik-DnNImjndMG&6mZPGbP`z5-HvVpFfvpGO}Y^V6}q__kOOIA{A zBukj*VX-R!qApSB*@y!uAUIM+4uTDJY^2C--J(Y~=R1<`&m2=?=IRCd9V+(G2ZZ zFS6tMjn#j+3eh~%D&xkTU`^(Z&u_87Ls1ddpBT1UlRcp_9Yqab zXmJ_IKnf$Q(ZEDVki*`wk5cw_y6RZ#E#4?T^+ANI#mUt2B@4?0Gdei<_B%Ru!q_sK zmj9j+`KCmJdy~4q?&jPHn#Jw7<5p+pM;OH?v!G{DQ#14HTieHiT#tmgT#E|cOf(85 zjJOPJE*Eu2o=H*z4(-JO?V{Ja(w4!b!Rz`zIyHE2MbHaJRFwB1O@ft4tz@`=yRa5BLL=P%#M ztz*81ZRqEpcWLViX4?zK(+FZ5URDLZ%)f(y4@+LHiRVyK7h5n=N0(x@{T-HF+yDZk z@9vl2;)57n`q!P>^~a#%n~5b)le+mqMN!&AXT9%Aq{QDm3>A3V$OGSbw+^;^adYw3 zcOe8#rgowpa6=>4NlV&1$uq5z1JOH7oS94o0T#qXuV5~F_C3q}f|*DyPBf7Mp~*oj zx1T-fAHwP0{bXgiZ=NCNq(qOJr(oxD#5Rq2X+D9zJySE+5!ct6=4P9JGT7=-p0X_l zR5u=WPuW7seNIjp>+niZiJ}WpTb! zImqvZ)4vQ8gZ0iAB6``BFxe5eY$}+M2o-iwOf`f*yELW;0?94}`EN@37wR7z5#l#H z56}M&z5j`4-KDuBMuGpDfDz>EtO#2U63kA7H-|LlI^s14H{^e5)PJzCh)oU!rB`?K z>fh8V(A~u)C{V=k0Vas*j@tgChW)>8gM)!V_ZR%m{(jXbEW{5i21FPq8IA+%U)%o& DS$cj_ diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按单位-出勤人数与考勤报表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..17ba258431869b9699829958e7b8c4370f94094f GIT binary patch literal 13791 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 =esjSNAB{RF6zingrpM`DJL8`F-Uo^Go$C^Gg9O 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 diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按班组.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0cc9171c3ffa7ec2edfd5e8f48adcee3e044d2e6 GIT binary patch literal 13082 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 LXykQI2K4^`)pEZ( literal 0 HcmV?d00001 diff --git a/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按项目.xlsx b/src/main/resources/excel/workerDailyAttendanceStatisticsV2/考勤月报-按项目.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4c07e80b351b4b7c16f7318c03918b231c6a8b9e GIT binary patch literal 13274 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 literal 0 HcmV?d00001