diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/BmWorkerAttController.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/BmWorkerAttController.java index 91f1500..1eef065 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/BmWorkerAttController.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/BmWorkerAttController.java @@ -4,6 +4,7 @@ import com.bonus.bmw.domain.vo.*; import com.bonus.bmw.service.BmWorkerAttService; import com.bonus.common.core.utils.poi.ExcelUtil; import com.bonus.common.core.web.controller.BaseController; +import com.bonus.common.core.web.domain.AjaxResult; import com.bonus.common.core.web.page.TableDataInfo; import com.bonus.common.log.annotation.SysLog; import com.bonus.common.log.enums.OperaType; @@ -164,6 +165,25 @@ public class BmWorkerAttController extends BaseController { return getDataTableError(new ArrayList<>()); } + /** + * 工程月考勤统计-按日期 + * @param o + * @return + */ + @RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth(isUser = false)) + @GetMapping("/getWorkerAttByMonth") + @SysLog(title = "月考勤总览表", businessType = OperaType.QUERY, logType = 0, module = "施工人员->考勤管理->月考勤总览表", details = "月考勤总览表") + public AjaxResult getWorkerAttByMonth(UserAttendanceVo o) { + try { + List res = service.getWorkerAttByMonth(o); + return success(res); + } catch (Exception e) { + logger.error(e.toString(), e); + } + return error("系统异常,请联系管理员"); + } + + /** * 考勤导出-工程维度 */ diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/UserAttendanceVo.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/UserAttendanceVo.java index f354349..0cf1263 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/UserAttendanceVo.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/UserAttendanceVo.java @@ -111,4 +111,13 @@ public class UserAttendanceVo { private String remark; + // 以下字段不返回给前端 + private Integer workerId; + private String workerName; + private String teamName; + private String einDay; + private String attDay; + private String isRepair; + + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/BmWorkerAttMapper.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/BmWorkerAttMapper.java index ab76122..6f4c6c5 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/BmWorkerAttMapper.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/mapper/BmWorkerAttMapper.java @@ -1,7 +1,7 @@ package com.bonus.bmw.mapper; import com.bonus.bmw.domain.vo.BmWorkerAtt; -import com.bonus.bmw.domain.vo.BmWorkerLight; +import com.bonus.bmw.domain.vo.UserAttendanceVo; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -42,4 +42,17 @@ public interface BmWorkerAttMapper { List getTeamAttListBySevenNotAtt(BmWorkerAtt o); List getSevenNotAttListByTeam(BmWorkerAtt o); -} \ No newline at end of file + + /** + * 通过三表一册查询某工程某月人员打卡总览 + * @param o + * @return + */ + List getWorkerAttRecordByMonth(UserAttendanceVo o); + /** + * 查询某工程某月人员打卡数据 + * @param o + * @return + */ + List getWorkerAttByMonth(UserAttendanceVo o); +} diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/BmWorkerAttService.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/BmWorkerAttService.java index a7e319d..4a63f87 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/BmWorkerAttService.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/BmWorkerAttService.java @@ -1,6 +1,7 @@ package com.bonus.bmw.service; import com.bonus.bmw.domain.vo.BmWorkerAtt; +import com.bonus.bmw.domain.vo.UserAttendanceVo; import java.util.List; @@ -47,4 +48,11 @@ public interface BmWorkerAttService { * @return */ List getSevenNotAttListByTeam(BmWorkerAtt o); + + /** + * 查询某工程某月人员打卡总览 + * @param o + * @return + */ + List getWorkerAttByMonth(UserAttendanceVo o); } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/BmWorkerAttServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/BmWorkerAttServiceImpl.java index 1ce237d..3672b09 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/BmWorkerAttServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/BmWorkerAttServiceImpl.java @@ -1,18 +1,25 @@ package com.bonus.bmw.service.impl; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.bonus.bmw.domain.dto.WorkerAttDayVo; import com.bonus.bmw.domain.vo.BmWorkerAtt; -import com.bonus.bmw.mapper.BmWorkerAttMapper; +import com.bonus.bmw.domain.vo.MapBeanVo; +import com.bonus.bmw.domain.vo.UserAttendanceVo; import com.bonus.bmw.mapper.BmWorkerAttMapper; import com.bonus.bmw.service.BmWorkerAttService; -import com.bonus.bmw.service.BmWorkerAttService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; +@Slf4j @Service public class BmWorkerAttServiceImpl implements BmWorkerAttService { @@ -111,10 +118,148 @@ public class BmWorkerAttServiceImpl implements BmWorkerAttService { @Override public List getSevenNotAttListByTeam(BmWorkerAtt o) { - List list = mapper.getSevenNotAttListByTeam(o); - return list; + return mapper.getSevenNotAttListByTeam(o); } + /** + * 询某工程某月人员打卡总览 + * @param o + * @return + */ + @Override + public List getWorkerAttByMonth(UserAttendanceVo o) { + //1.是否是当月 --当月需重新查询 --之前月份的可以从三表一册中读取 + if (isCurrentMonth(o.getMonth())) { + //--当月需重新查询 + List listAtt = mapper.getWorkerAttByMonth(o); + return dealAttData(listAtt, o.getMonth()); + }else{ + //--之前月份的可以从三表一册中读取 + return mapper.getWorkerAttRecordByMonth(o); + } + } + + public boolean isCurrentMonth(String yyyyMM) { + try { + YearMonth input = YearMonth.parse(yyyyMM, DateTimeFormatter.ofPattern("yyyy-MM")); + YearMonth current = YearMonth.now(); // 使用系统默认时区 + return input.equals(current); + } catch (Exception e) { + log.error("isCurrentMonth-日期格式错误", e); + return false; + } + } + + private List dealAttData(List listAtt, String lastMonth) { + // 按照 workerId 分组 + Map> groupedByWorkerId = listAtt.stream() + .collect(Collectors.groupingBy(UserAttendanceVo::getWorkerId)); + // 获取上个月的所有日期 + List daysOfMonth = generateDaysOfMonth(lastMonth); + // 处理每个员工的考勤数据 + // 处理每个员工的考勤数据 + // 获取第一条数据作为基础数据 + // 处理考勤日数据 + // 将处理后的考勤日数据设置到基础数据中 + return groupedByWorkerId.entrySet().stream() + .map(entry -> { + Integer workerId = entry.getKey(); + List workerAttendance = entry.getValue(); + // 获取第一条数据作为基础数据 + UserAttendanceVo baseData = workerAttendance.get(0); + // 处理考勤日数据 + List attendanceDays = processWorkerAttendance(workerAttendance, daysOfMonth); + //计算出勤天数 + int attNum = 0; + int repairNum = 0; + double salary = 0.0; + for (WorkerAttDayVo attendanceDay : attendanceDays) { + if("1".equals(attendanceDay.getIsAtt())){ + attNum++; + if("1".equals(attendanceDay.getIsRepair())){ + repairNum++; + } + } + } + baseData.setAttendanceNum(attNum); + baseData.setRepairNum(repairNum); + baseData.setCheckDay(attNum-repairNum); + JSONArray o = (JSONArray) JSON.toJSON(attendanceDays); + // 将处理后的考勤日数据设置到基础数据中 + baseData.setAttendanceDay(JSON.toJSONString(o)); + return baseData; + }) + .collect(Collectors.toList()); + } + + /** + * 生成指定年月的所有日期列表 + * @param yearMonthString 指定的年月 + * @return 日期列表,包含 yyyy-MM-dd 和 dd 两个字段的 MapBeanVo + */ + private List generateDaysOfMonth(String yearMonthString) { + List days = new ArrayList<>(); + YearMonth yearMonth = YearMonth.parse(yearMonthString, DateTimeFormatter.ofPattern("yyyy-MM")); + LocalDate firstDay = yearMonth.atDay(1); + LocalDate lastDay = yearMonth.atEndOfMonth(); + LocalDate currentDate = firstDay; + while (!currentDate.isAfter(lastDay)) { + MapBeanVo dayInfo = new MapBeanVo(); + dayInfo.setValue(currentDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + dayInfo.setKey(String.format("%02d", currentDate.getDayOfMonth())); + days.add(dayInfo); + currentDate = currentDate.plusDays(1); + } + return days; + } + + /** + * 处理单个员工的考勤数据 + * @param attendanceRecords 该员工的考勤记录 + * @param daysOfMonth 月份中的所有日期 + * @return 处理后的考勤数据列表 + */ + private List processWorkerAttendance(List attendanceRecords, List daysOfMonth) { + List result = new ArrayList<>(); + // 将该员工的考勤记录按日期分组,便于快速查找 + Map einByDate = attendanceRecords.stream() + .collect(Collectors.toMap( + UserAttendanceVo::getEinDay, + record -> record, + (existing, replacement) -> existing)); + // 遍历月份中的每一天 + for (MapBeanVo dayInfo : daysOfMonth) { + String dateStr = dayInfo.getValue(); + String dayStr = dayInfo.getKey(); + WorkerAttDayVo dayRecord = new WorkerAttDayVo(); + dayRecord.setDay(dayStr); + // 查找该日期是否有考勤记录 + UserAttendanceVo einForDate = einByDate.get(dateStr); + if (einForDate != null) { + // 存在入场记录 + dayRecord.setIsEin("1"); // 在场 + // 检查是否有打卡记录 + if (einForDate.getAttDay() != null) { + dayRecord.setIsAtt("1"); // 打卡 + }else{ + dayRecord.setIsAtt("0"); + } + // 检查是否有补卡记录 + if ("1".equals(einForDate.getIsRepair())) { + dayRecord.setIsRepair("1"); // 补卡 + }else { + dayRecord.setIsRepair("0"); + } + } else { + // 无考勤记录 + dayRecord.setIsEin("0"); // 不在场 + dayRecord.setIsAtt("0"); // 未打卡 + dayRecord.setIsRepair("0"); // 未补卡 + } + result.add(dayRecord); + } + return result; + } /** * 人员考勤统计 diff --git a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/BmWorkerAttMapper.xml b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/BmWorkerAttMapper.xml index fe5f5f2..72cb366 100644 --- a/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/BmWorkerAttMapper.xml +++ b/bonus-modules/bonus-bmw/src/main/resources/mapper/bmw/BmWorkerAttMapper.xml @@ -263,5 +263,55 @@ AND pro_id = #{proId} AND team_id = #{teamId} + + + +