From feedd62ec46b9faada80505387526acf914cf4c5 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 11 十月 2026 22:49:44 +0800
Subject: [PATCH] 海西州-同仁堂 1.添加操作日志生成
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/HrmAttendanceRecordController.java | 126 ++++++++++++++++++++++++++++++++++++++++-
1 files changed, 121 insertions(+), 5 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 e99c45f..3d677dc 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
@@ -7,6 +7,9 @@
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.framework.operatelog.core.util.OperateLogUtils;
+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;
@@ -17,6 +20,7 @@
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
+import com.mzt.logapi.starter.annotation.LogRecord;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -36,6 +40,7 @@
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.module.hrm.enums.ErrorCodeConstants.EMPLOYEE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.hrm.enums.LogRecordConstants.*;
@Tag(name = "绠$悊鍚庡彴 - HRM 鑰冨嫟璁板綍")
@RestController
@@ -54,7 +59,7 @@
@PostMapping("/clock-in")
@Operation(summary = "涓婄彮鎵撳崱")
- @PreAuthorize("@ss.hasPermission('hrm:attendance:clock')")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')")
public CommonResult<HrmAttendanceRecordRespVO> clockIn(@RequestParam("location") String location) {
Long loginUserId = getLoginUserId();
HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId);
@@ -75,7 +80,7 @@
@PostMapping("/clock-out")
@Operation(summary = "涓嬬彮鎵撳崱")
- @PreAuthorize("@ss.hasPermission('hrm:attendance:clock')")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:clock')")
public CommonResult<HrmAttendanceRecordRespVO> clockOut(@RequestParam("location") String location) {
Long loginUserId = getLoginUserId();
HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId);
@@ -100,7 +105,7 @@
@GetMapping("/page")
@Operation(summary = "鑾峰緱鑰冨嫟璁板綍鍒嗛〉")
- @PreAuthorize("@ss.hasPermission('hrm:attendance:query')")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:query')")
public CommonResult<PageResult<HrmAttendanceRecordRespVO>> getAttendanceRecordPage(@Valid HrmAttendanceRecordPageReqVO pageReqVO) {
PageResult<HrmAttendanceRecordDO> pageResult = attendanceRecordService.getAttendanceRecordPage(pageReqVO);
// 杞崲涓� VO
@@ -142,6 +147,7 @@
HrmEmployeeDO employee = employeeMap.get(respVO.getUserId());
if (employee != null) {
respVO.setUserName(employee.getName());
+ respVO.setPhone(employee.getPhone());
}
// 閮ㄩ棬鍚嶇О
DeptRespDTO dept = deptMap.get(respVO.getDeptId());
@@ -154,7 +160,7 @@
@GetMapping("/get")
@Operation(summary = "鑾峰緱鑰冨嫟璁板綍")
@Parameter(name = "id", description = "璁板綍ID", required = true)
- @PreAuthorize("@ss.hasPermission('hrm:attendance:query')")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:query')")
public CommonResult<HrmAttendanceRecordRespVO> getAttendanceRecord(@RequestParam("id") Long id) {
HrmAttendanceRecordDO attendanceRecord = attendanceRecordService.getAttendanceRecord(id);
if (attendanceRecord == null) {
@@ -166,6 +172,7 @@
HrmEmployeeDO employee = employeeService.getEmployee(attendanceRecord.getUserId());
if (employee != null) {
respVO.setUserName(employee.getName());
+ respVO.setPhone(employee.getPhone());
}
}
if (attendanceRecord.getDeptId() != null) {
@@ -177,9 +184,118 @@
return success(respVO);
}
+ @GetMapping("/get-import-template")
+ @Operation(summary = "涓嬭浇鑰冨嫟璁板綍瀵煎叆妯℃澘")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:import')")
+ public void importTemplate(HttpServletResponse response) throws IOException {
+ List<HrmAttendanceRecordImportExcelVO> list = Collections.singletonList(
+ HrmAttendanceRecordImportExcelVO.builder()
+ .userName("寮犱笁")
+ .phone("13800138000")
+ .date(java.time.LocalDate.of(2026, 1, 15))
+ .clockInTime(java.time.LocalDateTime.of(2026, 1, 15, 8, 30))
+ .clockOutTime(java.time.LocalDateTime.of(2026, 1, 15, 17, 30))
+ .clockInType(1)
+ .clockOutType(1)
+ .location("鍔炲叕鍖�")
+ .remark("绀轰緥鏁版嵁")
+ .build()
+ );
+ ExcelUtils.write(response, "鑰冨嫟瀵煎叆妯℃澘.xls", "鑰冨嫟璁板綍", HrmAttendanceRecordImportExcelVO.class, list);
+ }
+
+ @PostMapping("/import")
+ @Operation(summary = "瀵煎叆鑰冨嫟璁板綍")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:import')")
+ @LogRecord(type = HRM_ATTENDANCE_RECORD_TYPE, subType = HRM_ATTENDANCE_RECORD_IMPORT_SUB_TYPE, bizNo = "0",
+ success = HRM_ATTENDANCE_RECORD_IMPORT_SUCCESS)
+ public CommonResult<String> importExcel(@Valid HrmAttendanceRecordImportReqVO importReqVO) throws IOException {
+ List<HrmAttendanceRecordImportExcelVO> list = ExcelUtils.read(importReqVO.getFile(), HrmAttendanceRecordImportExcelVO.class);
+ if (CollUtil.isEmpty(list)) {
+ // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+ OperateLogUtils.putImportSummary(0, null, null);
+ return success("娌℃湁鍙鍏ョ殑鏁版嵁");
+ }
+ int successCount = 0;
+ int createCount = 0; // 鏂板鐨勮褰曟暟
+ int updateCount = 0; // 鏇存柊鐨勮褰曟暟锛堜粎鍕鹃�夈�屾敮鎸佹洿鏂般�嶆椂鎵嶄細璧版洿鏂帮級
+ Set<String> missingNames = new LinkedHashSet<>();
+ Set<String> duplicateNames = new LinkedHashSet<>();
+ Set<String> invalidRows = new LinkedHashSet<>();
+ for (HrmAttendanceRecordImportExcelVO item : list) {
+ if (item.getDate() == null) {
+ invalidRows.add((item.getUserName() == null || item.getUserName().isBlank()) ? "鏈~濮撳悕鐨勮" : "鑰冨嫟鏃ユ湡涓虹┖(" + item.getUserName().trim() + ")");
+ continue;
+ }
+ if (item.getUserName() == null || item.getUserName().isBlank()) {
+ invalidRows.add("鑰冨嫟鏃ユ湡涓� " + item.getDate() + " 浣嗘湭濉憳宸ュ鍚�");
+ continue;
+ }
+ List<HrmEmployeeDO> employees = employeeService.getEmployeeListByName(item.getUserName().trim());
+ if (employees.isEmpty()) {
+ missingNames.add(item.getUserName().trim());
+ continue;
+ }
+ HrmEmployeeDO employee = employees.get(0);
+ // 瀛樺湪澶氫釜鍚屽悕鍛樺伐鏃讹紝鐢ㄦ墜鏈哄彿鍖哄垎
+ if (employees.size() > 1) {
+ String phone = item.getPhone() != null ? item.getPhone().trim() : null;
+ List<HrmEmployeeDO> matchedByPhone = new ArrayList<>();
+ if (phone != null && !phone.isEmpty()) {
+ for (HrmEmployeeDO emp : employees) {
+ if (phone.equals(emp.getPhone())) {
+ matchedByPhone.add(emp);
+ }
+ }
+ }
+ if (matchedByPhone.size() == 1) {
+ employee = matchedByPhone.get(0);
+ } else {
+ duplicateNames.add(item.getUserName().trim());
+ continue;
+ }
+ }
+ HrmAttendanceRecordDO record = attendanceRecordService.getAttendanceRecordByUserIdAndDate(employee.getId(), item.getDate());
+ if (record == null) {
+ record = HrmAttendanceRecordDO.builder()
+ .userId(employee.getId()).deptId(employee.getDeptId()).date(item.getDate())
+ .clockInTime(item.getClockInTime()).clockOutTime(item.getClockOutTime())
+ .clockInType(item.getClockInType()).clockOutType(item.getClockOutType())
+ .location(item.getLocation()).remark(item.getRemark())
+ .dataSource(2).build();
+ attendanceRecordService.createImportedRecord(record);
+ createCount++;
+ } else if (Boolean.TRUE.equals(importReqVO.getUpdateSupport())) {
+ record.setClockInTime(item.getClockInTime());
+ record.setClockOutTime(item.getClockOutTime());
+ record.setClockInType(item.getClockInType());
+ record.setClockOutType(item.getClockOutType());
+ record.setLocation(item.getLocation());
+ record.setRemark(item.getRemark());
+ attendanceRecordService.updateImportedRecord(record);
+ updateCount++;
+ }
+ successCount++;
+ }
+ StringBuilder msg = new StringBuilder("鎴愬姛瀵煎叆 " + successCount + " 鏉�");
+ if (!missingNames.isEmpty()) {
+ msg.append("锛涗互涓嬪憳宸ヤ笉瀛樺湪锛屾湭鑳藉鍏ワ細").append(String.join("銆�", missingNames));
+ }
+ if (!duplicateNames.isEmpty()) {
+ msg.append("锛涗互涓嬪憳宸ュ瓨鍦ㄥ鍚嶅悓鍚嶅憳宸ワ紝闇�琛ュ厖鎵嬫満鍙峰尯鍒嗭紝鏈兘瀵煎叆锛�").append(String.join("銆�", duplicateNames));
+ }
+ if (!invalidRows.isEmpty()) {
+ msg.append("锛涗互涓嬭褰曟暟鎹笉瀹屾暣锛屾湭鑳藉鍏ワ細").append(String.join("銆�", invalidRows));
+ }
+ // 璁板綍瀵煎叆缁撴灉姹囨�伙紝渚� @LogRecord 鐨� success 鏂囨寮曠敤
+ OperateLogUtils.putImportSummary(createCount, updateCount,
+ missingNames.size() + duplicateNames.size() + invalidRows.size());
+ return success(msg.toString());
+ }
+
@GetMapping("/export-excel")
@Operation(summary = "瀵煎嚭鑰冨嫟璁板綍 Excel")
- @PreAuthorize("@ss.hasPermission('hrm:attendance:export')")
+ @PreAuthorize("@ss.hasPermission('hrm:attendance-record:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportAttendanceRecordExcel(@Valid HrmAttendanceRecordPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
--
Gitblit v1.9.3