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