yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceMyStatusRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportExcelVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordImportReqVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; @@ -54,6 +55,18 @@ @Resource private AdminUserApi adminUserApi; @GetMapping("/my-status") @Operation(summary = "è·åæç仿¥æå¡ç¶æ") @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')") public CommonResult<HrmAttendanceMyStatusRespVO> getMyStatus() { HrmEmployeeDO employee = employeeService.getEmployeeByUserId(getLoginUserId()); if (employee == null) { // æªå ³èåå·¥æ¶è¿å nullï¼ç±å端æç¤ºï¼é¿å æå¡é¡µå è½½ç´æ¥æ¥é return success(null); } return success(attendanceRecordService.getMyStatus(employee.getId())); } @PostMapping("/clock-in") @Operation(summary = "ä¸çæå¡") @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')") yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceMyStatusRespVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,81 @@ package cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; @Schema(description = "管çåå° - æç仿¥æå¡ç¶æ Response VO") @Data public class HrmAttendanceMyStatusRespVO { @Schema(description = "è夿¥æ") private LocalDate date; @Schema(description = "æ¯å¦å·¥ä½æ¥") private Boolean workDay; @Schema(description = "åå·¥ID") private Long employeeId; @Schema(description = "åå·¥å§å") private String userName; @Schema(description = "é¨é¨ID") private Long deptId; @Schema(description = "é¨é¨åç§°") private String deptName; @Schema(description = "èå¤è§ååç§°") private String ruleName; @Schema(description = "ä¸çæ¶é´") private LocalTime workStartTime; @Schema(description = "ä¸çæ¶é´") private LocalTime workEndTime; @Schema(description = "仿¥è®°å½IDï¼æªæå¡æ¶ä¸ºç©º") private Long recordId; @Schema(description = "ä¸çæå¡æ¶é´") private LocalDateTime clockInTime; @Schema(description = "ä¸çæå¡æ¶é´") private LocalDateTime clockOutTime; @Schema(description = "ä¸çæå¡ç±»å") private Integer clockInType; @Schema(description = "ä¸çæå¡ç±»å") private Integer clockOutType; @Schema(description = "æ¯å¦å·²ä¸çæå¡") private Boolean clockInDone; @Schema(description = "æ¯å¦å·²ä¸çæå¡") private Boolean clockOutDone; @Schema(description = "æ¯å¦å¯ä¸çæå¡") private Boolean canClockIn; @Schema(description = "æ¯å¦å¯ä¸çæå¡") private Boolean canClockOut; @Schema(description = "工使¶é¿ï¼å°æ¶ï¼") private BigDecimal workHours; @Schema(description = "å çæ¶é¿ï¼å°æ¶ï¼") private BigDecimal overtimeHours; @Schema(description = "æå¡å°ç¹") private String location; @Schema(description = "æ°æ®æ¥æº") private Integer dataSource; } yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRecordService.java
@@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.hrm.service.attendance; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceMyStatusRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO; @@ -64,6 +65,14 @@ HrmAttendanceRecordDO clockOut(Long userId, LocalDateTime clockTime, String location); /** * è·åå工仿¥æå¡ç¶æ * * @param userId åå·¥ID * @return 仿¥æå¡ç¶æï¼åå·¥ä¸å卿¶è¿å null */ HrmAttendanceMyStatusRespVO getMyStatus(Long userId); /** * è¡¥å¡å®¡æ¹éè¿åæ´æ°èå¤è®°å½ * * @param exception èå¤å¼å¸¸ç³è¯· yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceRecordServiceImpl.java
@@ -2,6 +2,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceMyStatusRespVO; import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordPageReqVO; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO; import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRuleDO; @@ -258,6 +259,52 @@ } @Override public HrmAttendanceMyStatusRespVO getMyStatus(Long userId) { // 1. åå·¥ä¸å卿¶è¿å nullï¼ç±å端æç¤ºæªå ³èåå·¥ï¼é¿å æå¡é¡µå è½½ç´æ¥æ¥é HrmEmployeeDO employee = employeeService.getEmployee(userId); if (employee == null) { return null; } LocalDate today = LocalDate.now(); // 2. æ¥è¯¢ä»æ¥èå¤è®°å½ä¸èå¤è§å HrmAttendanceRecordDO record = attendanceRecordMapper.selectByUserIdAndDate(userId, today); HrmAttendanceRuleDO rule = attendanceRuleService.getAttendanceRuleByDeptId(employee.getDeptId()); boolean workDay = attendanceHolidayService.isWorkDay(today); boolean clockInDone = record != null && record.getClockInTime() != null; boolean clockOutDone = record != null && record.getClockOutTime() != null; // 3. ç»è£ 仿¥æå¡ç¶æ HrmAttendanceMyStatusRespVO respVO = new HrmAttendanceMyStatusRespVO(); respVO.setDate(today); respVO.setWorkDay(workDay); respVO.setEmployeeId(employee.getId()); respVO.setUserName(employee.getName()); respVO.setDeptId(employee.getDeptId()); if (rule != null) { respVO.setRuleName(rule.getName()); respVO.setWorkStartTime(rule.getWorkStartTime()); respVO.setWorkEndTime(rule.getWorkEndTime()); } if (record != null) { respVO.setRecordId(record.getId()); respVO.setClockInTime(record.getClockInTime()); respVO.setClockOutTime(record.getClockOutTime()); respVO.setClockInType(record.getClockInType()); respVO.setClockOutType(record.getClockOutType()); respVO.setWorkHours(record.getWorkHours()); respVO.setOvertimeHours(record.getOvertimeHours()); respVO.setLocation(record.getLocation()); respVO.setDataSource(record.getDataSource()); } respVO.setClockInDone(clockInDone); respVO.setClockOutDone(clockOutDone); // é工使¥ä¸å¯æå¡ï¼ä¸æå¡æ¥å£çæ ¡éªä¿æä¸è´ respVO.setCanClockIn(workDay && !clockInDone); respVO.setCanClockOut(workDay && !clockOutDone); return respVO; } @Override @Transactional(rollbackFor = Exception.class) public void supplementClockIn(HrmAttendanceExceptionDO exception) { // ä» å¤çè¡¥å¡ç±»å