From 1cbc592d8b674b63a6e2117d7c48ab4ff8cb867e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 05 十一月 2026 20:29:07 +0800
Subject: [PATCH] fix(hrm): 考勤异常申请字段匹配与申请人回填;补充 hrm_audit_status 字典脚本
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceExceptionPageReqVO.java | 5 ++
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java | 13 +++++-
yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java | 1
docs/sql/hrm_audit_status_dict.sql | 30 +++++++++++++++
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java | 20 ++++++++++
5 files changed, 66 insertions(+), 3 deletions(-)
diff --git a/docs/sql/hrm_audit_status_dict.sql b/docs/sql/hrm_audit_status_dict.sql
new file mode 100644
index 0000000..ca1eba5
--- /dev/null
+++ b/docs/sql/hrm_audit_status_dict.sql
@@ -0,0 +1,30 @@
+-- HRM 瀹℃壒鐘舵�佸瓧鍏�
+-- 褰卞搷椤甸潰锛氫汉鍔涜祫婧愭ā鍧椾腑鎵�鏈変娇鐢� hrm_audit_status 瀛楀吀鐨勫崟鎹垪琛�/璇︽儏锛堣�冨嫟寮傚父鐢宠銆佽鍋囥�佺鑱屻�佽皟宀楃瓑锛�
+--
+-- 鑳屾櫙锛氫唬鐮佷腑澶ч噺浣跨敤 @DictFormat("hrm_audit_status") 涓庡墠绔� DICT_TYPE.HRM_AUDIT_STATUS锛�
+-- 浣� system_dict_type / system_dict_data 涓己灏戣瀛楀吀锛屽鑷寸姸鎬佸垪鏄剧ず涓虹┖銆佸鍑烘棤涓枃鍚嶃��
+--
+-- 鏈剼鏈箓绛夛紝鍙噸澶嶆墽琛屻�傛墽琛屽悗娓呯悊瀛楀吀缂撳瓨锛堥噸鍚悗绔紝鎴栧垹闄� Redis 涓殑 dict_data:* 鐩稿叧閿級锛�
+-- 鍓嶇閲嶆柊鐧诲綍/鍒锋柊鍚庣敓鏁堛��
+
+-- 1. 瀛楀吀绫诲瀷
+INSERT INTO system_dict_type (name, type, status, remark, creator, updater)
+SELECT 'HRM 瀹℃壒鐘舵��', 'hrm_audit_status', 0, '浜哄姏妯″潡鍗曟嵁瀹℃壒鐘舵��', '1', '1'
+WHERE NOT EXISTS (
+ SELECT 1 FROM system_dict_type WHERE type = 'hrm_audit_status' AND deleted = b'0'
+);
+
+-- 2. 瀛楀吀鏁版嵁锛堜笌 HrmAuditStatusEnum 淇濇寔涓�鑷达級
+INSERT INTO system_dict_data (sort, label, value, dict_type, status, color_type, css_class, remark, creator, updater)
+SELECT s.sort, s.label, s.value, 'hrm_audit_status', 0, s.color_type, '', '', '1', '1'
+FROM (
+ SELECT 0 AS sort, '鑽夌' AS label, '0' AS value, 'info' AS color_type
+ UNION ALL SELECT 10, '瀹℃壒涓�', '10', 'default'
+ UNION ALL SELECT 20, '瀹℃壒閫氳繃', '20', 'success'
+ UNION ALL SELECT 30, '瀹℃壒椹冲洖', '30', 'danger'
+ UNION ALL SELECT 40, '宸叉挙閿�', '40', 'warning'
+) s
+WHERE NOT EXISTS (
+ SELECT 1 FROM system_dict_data d
+ WHERE d.dict_type = 'hrm_audit_status' AND d.value = s.value AND d.deleted = b'0'
+);
diff --git a/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java b/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
index f8c7833..257d6f5 100644
--- a/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
+++ b/yudao-module-hrm-api/src/main/java/cn/iocoder/yudao/module/hrm/enums/ErrorCodeConstants.java
@@ -93,6 +93,7 @@
ErrorCode ATTENDANCE_EXCEPTION_UPDATE_AUDIT_STATUS_FAIL = new ErrorCode(1_030_004_014, "鏇存柊鑰冨嫟寮傚父瀹℃壒鐘舵�佸け璐ワ紝鍘熷洜锛氫笉鏄鎵逛腑鐘舵��");
ErrorCode ATTENDANCE_EXCEPTION_BPM_PROCESS_DEFINITION_NOT_EXISTS = new ErrorCode(1_030_004_015, "鑰冨嫟寮傚父瀹℃壒娴佺▼涓嶅瓨鍦�");
ErrorCode ATTENDANCE_CLOCK_ALREADY_CLOCKED = new ErrorCode(1_030_004_016, "宸叉墦杩囧崱锛岃鍕块噸澶嶆墦鍗�");
+ ErrorCode ATTENDANCE_EXCEPTION_EMPLOYEE_NOT_EXISTS = new ErrorCode(1_030_004_018, "鏂板鑰冨嫟寮傚父鐢宠澶辫触锛屽綋鍓嶇櫥褰曡处鍙凤紙{}锛夋湭鍏宠仈鍛樺伐妗f锛屾棤娉曠‘瀹氱敵璇蜂汉鍜岄儴闂ㄣ�傝浣跨敤宸插叧鑱斿憳宸ユ。妗堢殑璐﹀彿鐧诲綍锛屾垨鍏堝湪銆屽憳宸ユ。妗堛�嶄腑缁存姢褰撳墠璐﹀彿鍚庡啀鎻愪氦");
// ========== 钖叕绠$悊 1-030-005-000 ==========
ErrorCode SALARY_STRUCTURE_NOT_EXISTS = new ErrorCode(1_030_005_000, "钖叕缁撴瀯涓嶅瓨鍦�");
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceExceptionPageReqVO.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceExceptionPageReqVO.java
index db5db32..225c1dc 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceExceptionPageReqVO.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/attendance/vo/HrmAttendanceExceptionPageReqVO.java
@@ -6,6 +6,8 @@
import lombok.EqualsAndHashCode;
import lombok.ToString;
+import java.time.LocalDate;
+
@Schema(description = "绠$悊鍚庡彴 - 鑰冨嫟寮傚父鐢宠鍒嗛〉 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@@ -27,4 +29,7 @@
@Schema(description = "鐘舵��", example = "0")
private Integer status;
+ @Schema(description = "寮傚父鏃ユ湡鍖洪棿锛屼紶 [寮�濮嬫棩鏈�, 缁撴潫鏃ユ湡]", example = "[\"2026-01-01\", \"2026-12-31\"]")
+ private LocalDate[] date;
+
}
\ No newline at end of file
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java
index 7cc071c..6441617 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/dal/mysql/attendance/HrmAttendanceExceptionMapper.java
@@ -7,6 +7,8 @@
import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO;
import org.apache.ibatis.annotations.Mapper;
+import java.time.LocalDate;
+
/**
* 鑰冨嫟寮傚父鐢宠 Mapper
*
@@ -16,13 +18,18 @@
public interface HrmAttendanceExceptionMapper extends BaseMapperX<HrmAttendanceExceptionDO> {
default PageResult<HrmAttendanceExceptionDO> selectPage(HrmAttendanceExceptionPageReqVO reqVO) {
- return selectPage(reqVO, new LambdaQueryWrapperX<HrmAttendanceExceptionDO>()
+ LambdaQueryWrapperX<HrmAttendanceExceptionDO> query = new LambdaQueryWrapperX<HrmAttendanceExceptionDO>()
.likeIfPresent(HrmAttendanceExceptionDO::getNo, reqVO.getNo())
.eqIfPresent(HrmAttendanceExceptionDO::getUserId, reqVO.getUserId())
.eqIfPresent(HrmAttendanceExceptionDO::getDeptId, reqVO.getDeptId())
.eqIfPresent(HrmAttendanceExceptionDO::getType, reqVO.getType())
- .eqIfPresent(HrmAttendanceExceptionDO::getStatus, reqVO.getStatus())
- .orderByDesc(HrmAttendanceExceptionDO::getId));
+ .eqIfPresent(HrmAttendanceExceptionDO::getStatus, reqVO.getStatus());
+ // 寮傚父鏃ユ湡鍖洪棿绛涢��
+ LocalDate[] dateRange = reqVO.getDate();
+ if (dateRange != null && dateRange.length >= 2 && dateRange[0] != null && dateRange[1] != null) {
+ query.between(HrmAttendanceExceptionDO::getExceptionDate, dateRange[0], dateRange[1]);
+ }
+ return selectPage(reqVO, query.orderByDesc(HrmAttendanceExceptionDO::getId));
}
default HrmAttendanceExceptionDO selectByNo(String no) {
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
index 625be8e..08474c4 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/attendance/HrmAttendanceExceptionServiceImpl.java
@@ -8,8 +8,12 @@
import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionPageReqVO;
import cn.iocoder.yudao.module.hrm.controller.admin.attendance.vo.HrmAttendanceExceptionSaveReqVO;
import cn.iocoder.yudao.module.hrm.dal.dataobject.attendance.HrmAttendanceExceptionDO;
+import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO;
import cn.iocoder.yudao.module.hrm.dal.mysql.attendance.HrmAttendanceExceptionMapper;
+import cn.iocoder.yudao.module.hrm.service.employee.HrmEmployeeService;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
+import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO;
import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum;
import jakarta.annotation.Resource;
@@ -36,6 +40,10 @@
@Resource
private HrmAttendanceExceptionMapper attendanceExceptionMapper;
@Resource
+ private HrmEmployeeService employeeService;
+ @Resource
+ private AdminUserApi adminUserApi;
+ @Resource
private HrmNoRedisDAO noRedisDAO;
@Resource
private BpmProcessInstanceApi bpmProcessInstanceApi;
@@ -48,6 +56,18 @@
public Long createAttendanceException(HrmAttendanceExceptionSaveReqVO createReqVO) {
HrmAttendanceExceptionDO attendanceException = BeanUtils.toBean(createReqVO, HrmAttendanceExceptionDO.class);
attendanceException.setNo(generateNo());
+ // 鐢宠浜洪粯璁や负褰撳墠鐧诲綍鐢ㄦ埛瀵瑰簲鐨勫憳宸ワ紝鍓嶇琛ㄥ崟涓嶉�夋嫨鐢宠浜�
+ Long loginUserId = cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId();
+ HrmEmployeeDO employee = employeeService.getEmployeeByUserId(loginUserId);
+ if (employee == null) {
+ AdminUserRespDTO loginUser = adminUserApi.getUser(loginUserId);
+ throw exception(ATTENDANCE_EXCEPTION_EMPLOYEE_NOT_EXISTS,
+ loginUser != null ? loginUser.getNickname() : String.valueOf(loginUserId));
+ }
+ attendanceException.setUserId(employee.getId());
+ if (attendanceException.getDeptId() == null) {
+ attendanceException.setDeptId(employee.getDeptId());
+ }
attendanceException.setStatus(HrmAuditStatusEnum.DRAFT.getStatus());
attendanceExceptionMapper.insert(attendanceException);
storageAttachmentApi.bindAttachments("file", "hrm_attendance_exception",
--
Gitblit v1.9.3