From e4432d49f9d74e69cc71ed1141ebcd30c817e998 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 17 十月 2026 20:34:24 +0800
Subject: [PATCH] feat(hrm): 新增我的考勤状态接口并开放全员打卡
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java | 43 +++++++++++++++++++++++++++++--------------
1 files changed, 29 insertions(+), 14 deletions(-)
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
index 3d677dc..0528f3e 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java
@@ -8,12 +8,14 @@
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.util.OperateLogUtils;
+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;
import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceRecordRespVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceRecordDO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
+import cn.iocoder.yudao.module.hrm.enums.HrmAttendanceClockTypeEnum;
import cn.iocoder.yudao.module.hrm.service.attendance.HrmAttendanceRecordService;
import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@@ -27,11 +29,13 @@
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
+import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
+import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -39,6 +43,7 @@
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_NOT_EXISTS;
import static cn.iocoder.yudao.module.hrm.enums.LogRecordConstants.*;
@@ -59,36 +64,46 @@
@PostMapping("/clock-in")
@Operation(summary = "涓婄彮鎵撳崱")
- @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')")
public CommonResult<HrmAttendanceRecordRespVO> clockIn(@RequestParam("location") String location) {
Long loginUserId = getLoginUserId();
HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId);
if (employee == null) {
- throw exception(EMPLOYEE_NOT_EXISTS, "褰撳墠鐢ㄦ埛鏈叧鑱斿憳宸ヤ俊鎭紝鏃犳硶鎵撳崱");
+ throw exception(EMPLOYEE_NOT_EXISTS,
+ "褰撳墠鐧诲綍璐﹀彿鏈叧鑱斿憳宸ユ。妗堬紝鏃犳硶鎵撳崱銆傝鑱旂郴绠$悊鍛樺湪銆愬憳宸ョ鐞嗐�戜腑灏嗚鐧诲綍璐﹀彿缁戝畾鍒板憳宸ャ��");
}
HrmAttendanceRecordDO record = attendanceRecordService.clockIn(employee.getId(), LocalDateTime.now(), location);
- HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(record, HrmAttendanceRecordRespVO.class);
- respVO.setUserName(employee.getName());
- if (record.getDeptId() != null) {
- DeptRespDTO dept = deptApi.getDept(record.getDeptId());
- if (dept != null) {
- respVO.setDeptName(dept.getName());
- }
- }
- return success(respVO);
+ return success(buildClockRespVO(record, employee));
}
@PostMapping("/clock-out")
@Operation(summary = "涓嬬彮鎵撳崱")
- @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')")
public CommonResult<HrmAttendanceRecordRespVO> clockOut(@RequestParam("location") String location) {
Long loginUserId = getLoginUserId();
HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId);
if (employee == null) {
- throw exception(EMPLOYEE_NOT_EXISTS, "褰撳墠鐢ㄦ埛鏈叧鑱斿憳宸ヤ俊鎭紝鏃犳硶鎵撳崱");
+ throw exception(EMPLOYEE_NOT_EXISTS,
+ "褰撳墠鐧诲綍璐﹀彿鏈叧鑱斿憳宸ユ。妗堬紝鏃犳硶鎵撳崱銆傝鑱旂郴绠$悊鍛樺湪銆愬憳宸ョ鐞嗐�戜腑灏嗚鐧诲綍璐﹀彿缁戝畾鍒板憳宸ャ��");
}
HrmAttendanceRecordDO record = attendanceRecordService.clockOut(employee.getId(), LocalDateTime.now(), location);
+ return success(buildClockRespVO(record, employee));
+ }
+
+ @GetMapping("/my-status")
+ @Operation(summary = "鑾峰緱褰撳墠鐧诲綍浜虹殑鑰冨嫟鐘舵��")
+ @Parameter(name = "date", description = "鑰冨嫟鏃ユ湡锛屾牸寮� yyyy-MM-dd锛岄粯璁ゆ湇鍔″櫒褰撳ぉ", example = "2026-10-17")
+ public CommonResult<HrmAttendanceMyStatusRespVO> getMyStatus(
+ @RequestParam(value = "date", required = false)
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY) LocalDate date) {
+ return success(attendanceRecordService.getMyStatus(getLoginUserId(), date));
+ }
+
+ /**
+ * 鏋勫缓鎵撳崱杩斿洖 VO锛屽瓧娈典笌 my-status.record 淇濇寔涓�鑷�
+ */
+ private HrmAttendanceRecordRespVO buildClockRespVO(HrmAttendanceRecordDO record, HrmEmployeeDO employee) {
HrmAttendanceRecordRespVO respVO = BeanUtils.toBean(record, HrmAttendanceRecordRespVO.class);
+ respVO.setClockInTypeName(HrmAttendanceClockTypeEnum.getNameByType(record.getClockInType()));
+ respVO.setClockOutTypeName(HrmAttendanceClockTypeEnum.getNameByType(record.getClockOutType()));
respVO.setUserName(employee.getName());
if (record.getDeptId() != null) {
DeptRespDTO dept = deptApi.getDept(record.getDeptId());
@@ -96,7 +111,7 @@
respVO.setDeptName(dept.getName());
}
}
- return success(respVO);
+ return respVO;
}
private Long getLoginUserId() {
--
Gitblit v1.9.3