From 5f3b24868fbe5a0ddd2274bd313e976a4aa51d15 Mon Sep 17 00:00:00 2001 From: dfdg <2710245601@qq.com> Date: Thu, 18 Sep 2025 11:15:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E5=8B=A4=E5=88=97=E8=A1=A8=E8=AF=A6?= =?UTF-8?q?=E6=83=85bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BusAttendanceController.java | 13 ++- .../BusAttendanceMonthByUserIdVo.java | 3 +- .../service/IBusAttendanceService.java | 13 ++- .../impl/BusAttendanceServiceImpl.java | 88 ++++++++++++++++++- 4 files changed, 106 insertions(+), 11 deletions(-) diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java index fd16b55a..88958947 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java @@ -6,8 +6,8 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.project.domain.dto.attendance.AttendanceExportDto; -import org.dromara.project.domain.vo.attendance.BusAttendanceClockDateForTwoWeekVo; +import org.dromara.project.domain.dto.attendance.*; +import org.dromara.project.domain.vo.attendance.*; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -47,6 +47,15 @@ public class BusAttendanceController extends BaseController { return busAttendanceService.queryPageList(bo, pageQuery); } + /** + * 查询施工人员月份考勤列表 + */ + @SaCheckPermission("project:attendance:list") + @GetMapping("/list/month/byUserId") + public R> listAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req) { + return R.ok(busAttendanceService.listAttendanceMonthListByUserId(req)); + } + /** * 导出考勤列表 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java index 6ea3e701..05df4ab7 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/BusAttendanceMonthByUserIdVo.java @@ -5,6 +5,7 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; import java.util.Date; import java.util.List; @@ -29,7 +30,7 @@ public class BusAttendanceMonthByUserIdVo implements Serializable { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8") - private Date clockDate; + private LocalDate clockDate; /** * 当天打卡状态 diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java index 5b2e8f92..f045b7fb 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java @@ -3,10 +3,7 @@ package org.dromara.project.service; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.NotNull; import org.dromara.common.core.domain.R; -import org.dromara.project.domain.dto.attendance.AttendanceCountDto; -import org.dromara.project.domain.dto.attendance.AttendanceExportDto; -import org.dromara.project.domain.dto.attendance.AttendanceUserCountDto; -import org.dromara.project.domain.dto.attendance.BusAttendancePunchCardByFaceReq; +import org.dromara.project.domain.dto.attendance.*; import org.dromara.project.domain.vo.BusAttendanceVo; import org.dromara.project.domain.bo.BusAttendanceBo; import org.dromara.project.domain.BusAttendance; @@ -41,6 +38,14 @@ public interface IBusAttendanceService extends IService{ */ BusAttendanceVo queryById(Long id); + /** + * 查询用户每月考勤列表 + * + * @param req 查询条件 + * @return 考勤列表 + */ + List listAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req); + /** * 分页查询考勤列表 * diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java index 2dd402f5..95b55897 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java @@ -16,9 +16,11 @@ import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; +import org.dromara.common.core.constant.DateConstant; import org.dromara.common.core.constant.HttpStatus; import org.dromara.common.core.domain.R; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.domain.GeoPoint; @@ -33,12 +35,10 @@ import org.dromara.contractor.service.ISubUserSalaryDetailService; import org.dromara.gps.domain.vo.ConstructionUser; import org.dromara.project.domain.*; import org.dromara.project.domain.bo.BusAttendanceBo; -import org.dromara.project.domain.dto.attendance.AttendanceCountDto; -import org.dromara.project.domain.dto.attendance.AttendanceExportDto; -import org.dromara.project.domain.dto.attendance.AttendanceUserCountDto; -import org.dromara.project.domain.dto.attendance.BusAttendancePunchCardByFaceReq; +import org.dromara.project.domain.dto.attendance.*; import org.dromara.project.domain.enums.BusAttendanceClockStatusEnum; import org.dromara.project.domain.enums.BusAttendanceCommuterEnum; +import org.dromara.project.domain.enums.BusAttendanceStatusEnum; import org.dromara.project.domain.vo.BusAttendanceRuleVo; import org.dromara.project.domain.vo.BusAttendanceVo; import org.dromara.project.domain.vo.BusMonthAttendanceVo; @@ -138,6 +138,86 @@ public class BusAttendanceServiceImpl extends ServiceImpl listAttendanceMonthListByUserId(BusAttendanceMonthByUserIdReq req) { + Long userId = req.getUserId(); + String clockMonth = req.getClockMonth(); + SubConstructionUser constructionUser = constructionUserService.getById(userId); + if ( constructionUser == null) { + throw new ServiceException("施工人员信息不存在", HttpStatus.NOT_FOUND); + } + // 解析月份 + YearMonth yearMonth; + if (StringUtils.isNotBlank(clockMonth)) { + // 校验月份格式 + if (!DateConstant.YEAR_MONTH_PATTERN.matcher(clockMonth).matches()) { + throw new ServiceException("月份格式不正确", HttpStatus.BAD_REQUEST); + } + yearMonth = YearMonth.parse(clockMonth); + } else { + // 如果月份为空,则默认查询当前月份 + yearMonth = YearMonth.now(); + } + // 计算当月第一天 / 最后一天 + Date start = DateUtils.toDate(yearMonth.atDay(1)); + Date end = DateUtils.toDate(yearMonth.atEndOfMonth()); + // 查询当月考勤记录 + Map> dateListMap = this.lambdaQuery() + .eq(BusAttendance::getUserId, constructionUser.getSysUserId()) + .between(BusAttendance::getClockDate, start, end) + .list() + .stream().collect(Collectors.groupingBy(BusAttendance::getClockDate)); + // 遍历每天,计算考勤状态 + List respList = new ArrayList<>(); + dateListMap.forEach((date, attendanceList) -> { + BusAttendanceMonthByUserIdVo resp = new BusAttendanceMonthByUserIdVo(); + resp.setId(userId); + resp.setClockDate(date); + List attendanceListByDayList = new ArrayList<>(); + String clockInStatus = null; + String clockOutStatus = null; + String clockAllDayStatus = null; + String status; + for (BusAttendance attendance : attendanceList) { + // 获取考勤记录 + BusAttendanceListByDay day = BusAttendanceListByDay.build(attendance); + attendanceListByDayList.add(day); + // 获取上下班状态 + if (BusAttendanceCommuterEnum.CLOCKIN.getValue().equals(attendance.getClockType())) { + clockInStatus = attendance.getClockStatus(); + } else if (BusAttendanceCommuterEnum.CLOCKOUT.getValue().equals(attendance.getClockType())) { + clockOutStatus = attendance.getClockStatus(); + } else { + clockAllDayStatus = attendance.getClockStatus(); + } + } + // 统计当天考勤状态 + if (BusAttendanceClockStatusEnum.LEAVE.getValue().equals(clockAllDayStatus)) { + return; + } else if (BusAttendanceClockStatusEnum.NORMAL.getValue().equals(clockInStatus) + && BusAttendanceClockStatusEnum.NORMAL.getValue().equals(clockOutStatus)) { + status = BusAttendanceStatusEnum.NORMAL.getValue(); + } else if (BusAttendanceClockStatusEnum.REISSUE.getValue().equals(clockInStatus) + || BusAttendanceClockStatusEnum.REISSUE.getValue().equals(clockOutStatus)) { + status = BusAttendanceStatusEnum.REISSUE.getValue(); + } else { + status = BusAttendanceStatusEnum.ERROR.getValue(); + } + resp.setStatus(status); + resp.setAttendanceList(attendanceListByDayList); + respList.add(resp); + }); + // 按打卡日期正序排列 + respList.sort(Comparator.comparing(BusAttendanceMonthByUserIdVo::getClockDate)); + return respList; + } + /** * 查询符合条件的考勤列表 *