From ef3cbc1c6882786e8218b08be3e52ea44587f03b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 08 十一月 2026 09:45:42 +0800
Subject: [PATCH] feat(hrm): 请假批量导入、加班代申请人、批量排班与节假日区间联动

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java |   46 ++++++++++++++++++++++++++++++++--------------
 1 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java
index a044fba..37bfe49 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmOvertimeApplicationServiceImpl.java
@@ -60,7 +60,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long create(HrmOvertimeApplicationSaveReqVO reqVO, Long loginUserId) {
-        HrmEmployeeDO employee = requireEmployee(loginUserId);
+        HrmEmployeeDO employee = resolveEmployee(reqVO.getEmployeeId(), loginUserId);
         HrmOvertimeApplicationDO application = BeanUtils.toBean(reqVO, HrmOvertimeApplicationDO.class);
         applyApplicantAndCalculatedTime(application, employee);
         application.setNo(noRedisDAO.generateOvertimeApplicationNo());
@@ -70,20 +70,20 @@
     }
 
     @Override
-    public void update(HrmOvertimeApplicationSaveReqVO reqVO, Long loginUserId) {
-        HrmOvertimeApplicationDO existing = requireOwnedDraft(reqVO.getId(), loginUserId);
+    public void update(HrmOvertimeApplicationSaveReqVO reqVO, Long loginUserId, boolean canManage) {
+        HrmOvertimeApplicationDO existing = requireManageableDraft(reqVO.getId(), loginUserId, canManage);
         HrmOvertimeApplicationDO update = BeanUtils.toBean(reqVO, HrmOvertimeApplicationDO.class);
-        applyApplicantAndCalculatedTime(update, requireEmployee(loginUserId));
+        applyApplicantAndCalculatedTime(update, resolveEmployee(reqVO.getEmployeeId(), loginUserId));
         update.setId(existing.getId());
         mapper.updateById(update);
     }
 
     @Override
-    public void delete(Long id, Long loginUserId) {
+    public void delete(Long id, Long loginUserId, boolean canManage) {
         HrmOvertimeApplicationDO application = require(id);
         boolean deletable = Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())
                 || Objects.equals(application.getStatus(), HrmAuditStatusEnum.CANCEL.getStatus());
-        if (!Objects.equals(application.getUserId(), loginUserId) || !deletable) {
+        if ((!canManage && !Objects.equals(application.getUserId(), loginUserId)) || !deletable) {
             throw exception(OVERTIME_APPLICATION_UPDATE_FAIL_NOT_DRAFT);
         }
         mapper.deleteById(id);
@@ -115,14 +115,15 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void submit(Long id, String processDefinitionKey, Long loginUserId) {
-        HrmOvertimeApplicationDO application = requireOwnedDraft(id, loginUserId);
+    public void submit(Long id, String processDefinitionKey, Long loginUserId, boolean canManage) {
+        HrmOvertimeApplicationDO application = requireManageableDraft(id, loginUserId, canManage);
         validateProcessDefinitions();
         ProcessDefinition definition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey);
         if (definition == null || !BPM_PROCESS_DEFINITION_KEY.equals(definition.getKey())) {
             throw exception(OVERTIME_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS);
         }
-        String processInstanceId = bpmProcessInstanceApi.createProcessInstance(loginUserId,
+        // 浠e憳宸ユ彁浜ゆ椂锛屾祦绋嬪彂璧蜂汉浠嶅簲涓虹敵璇疯〃涓婄殑鐢宠浜�
+        String processInstanceId = bpmProcessInstanceApi.createProcessInstance(application.getUserId(),
                 new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(processDefinitionKey)
                         .setBusinessKey(String.valueOf(id)));
         mapper.updateById(HrmOvertimeApplicationDO.builder().id(id).processInstanceId(processInstanceId)
@@ -131,13 +132,13 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void cancel(Long id, Long loginUserId) {
+    public void cancel(Long id, Long loginUserId, boolean canManage) {
         HrmOvertimeApplicationDO application = require(id);
-        if (!Objects.equals(application.getUserId(), loginUserId)
+        if ((!canManage && !Objects.equals(application.getUserId(), loginUserId))
                 || !Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) {
             throw exception(OVERTIME_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS);
         }
-        bpmProcessInstanceService.cancelProcessInstanceByStartUser(loginUserId,
+        bpmProcessInstanceService.cancelProcessInstanceByStartUser(application.getUserId(),
                 new BpmProcessInstanceCancelReqVO().setId(application.getProcessInstanceId()).setReason("鐢宠浜烘挙閿�鍔犵彮鐢宠"));
     }
 
@@ -215,9 +216,9 @@
         return value;
     }
 
-    private HrmOvertimeApplicationDO requireOwnedDraft(Long id, Long userId) {
+    private HrmOvertimeApplicationDO requireManageableDraft(Long id, Long userId, boolean canManage) {
         HrmOvertimeApplicationDO value = require(id);
-        if (!Objects.equals(value.getUserId(), userId)
+        if ((!canManage && !Objects.equals(value.getUserId(), userId))
                 || !Objects.equals(value.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) {
             throw exception(OVERTIME_APPLICATION_UPDATE_FAIL_NOT_DRAFT);
         }
@@ -230,6 +231,23 @@
         return employee;
     }
 
+    /**
+     * 鐢宠浜轰负绌烘椂鍥為��鍒板綋鍓嶇櫥褰曡处鍙峰叧鑱旂殑鍛樺伐锛涢�夋嫨浠栦汉鏃舵寜鍛樺伐ID鍔犺浇
+     */
+    private HrmEmployeeDO resolveEmployee(Long employeeId, Long loginUserId) {
+        if (employeeId == null) {
+            return requireEmployee(loginUserId);
+        }
+        HrmEmployeeDO employee = employeeMapper.selectById(employeeId);
+        if (employee == null) {
+            throw exception(OVERTIME_APPLICATION_SELECTED_EMPLOYEE_NOT_EXISTS);
+        }
+        if (employee.getUserId() == null) {
+            throw exception(OVERTIME_APPLICATION_SELECTED_EMPLOYEE_NO_USER, employee.getName());
+        }
+        return employee;
+    }
+
     /** 褰撳墠寰呭姙瀹℃壒浜烘垨鏇惧鐞嗚繃璇ユ祦绋嬬殑瀹℃壒浜哄彲鏌ョ湅涓氬姟璇︽儏銆� */
     private boolean isProcessParticipant(String processInstanceId, Long userId) {
         if (processInstanceId == null || userId == null) {

--
Gitblit v1.9.3