From d85ec778237cd9af68c8d6b96895d22e0cf158df Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 02 十一月 2026 14:15:17 +0800
Subject: [PATCH] fix(hrm/system): 修复调岗申请与提交报错、公积金误扣、用户搜索,新增核算批量删除

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
index 3d02148..b436b05 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmTransferApplicationServiceImpl.java
@@ -1,14 +1,17 @@
 package cn.iocoder.yudao.module.hrm.service.approval;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
+import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCancelReqVO;
 import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
 import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
+import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
 import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationPageReqVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO;
 import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO;
@@ -35,6 +38,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -77,6 +81,8 @@
     private StorageAttachmentApi storageAttachmentApi;
     @Resource
     private BpmProcessDefinitionService bpmProcessDefinitionService;
+    @Resource
+    private BpmProcessInstanceService bpmProcessInstanceService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -269,17 +275,41 @@
             throw exception(TRANSFER_APPLICATION_SUBMIT_FAIL_NOT_DRAFT);
         }
         validateApproveCategoryAndProcessDefinition();
-        ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey);
+        // 鏈寚瀹氭祦绋嬪畾涔� Key 鏃讹紝鑷姩鍙栥�岃皟鍔ㄥ鎵广�嶅垎绫讳笅褰撳墠娲昏穬鐨勬祦绋嬶紝
+        // 閬垮厤鍓嶇鏈紶 key 瀵艰嚧鎺ュ彛鍙傛暟缂哄け鐩存帴鎶ョ郴缁熷紓甯�
+        String key = resolveProcessDefinitionKey(processDefinitionKey);
+        ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(key);
         if (processDefinition == null) {
             throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS);
         }
         String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
-                .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id)));
+                .setProcessDefinitionKey(key).setBusinessKey(String.valueOf(id)));
         transferApplicationMapper.updateById(HrmTransferApplicationDO.builder()
                 .id(id)
                 .processInstanceId(processInstanceId)
                 .status(HrmAuditStatusEnum.PROCESS.getStatus())
                 .build());
+    }
+
+    /**
+     * 瑙f瀽娴佺▼瀹氫箟 Key锛氫紭鍏堜娇鐢ㄨ皟鐢ㄦ柟浼犲叆鍊硷紝涓虹┖鏃跺彇銆岃皟鍔ㄥ鎵广�嶅垎绫讳笅鏈�鏂扮殑娲昏穬娴佺▼
+     */
+    private String resolveProcessDefinitionKey(String processDefinitionKey) {
+        if (StrUtil.isNotBlank(processDefinitionKey)) {
+            return processDefinitionKey.trim();
+        }
+        List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService
+                .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE);
+        if (CollUtil.isEmpty(definitionInfoList)) {
+            throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS);
+        }
+        Set<String> processDefinitionIds = convertSet(definitionInfoList, BpmProcessDefinitionInfoDO::getProcessDefinitionId);
+        List<ProcessDefinition> processDefinitions = bpmProcessDefinitionService.getProcessDefinitionList(processDefinitionIds);
+        return processDefinitions.stream()
+                .filter(pd -> !pd.isSuspended())
+                .max(Comparator.comparingInt(ProcessDefinition::getVersion))
+                .map(ProcessDefinition::getKey)
+                .orElseThrow(() -> exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS));
     }
 
     private void validateApproveCategoryAndProcessDefinition() {
@@ -302,6 +332,26 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void cancelTransferApplication(Long id, Long userId) {
+        HrmTransferApplicationDO application = validateTransferApplicationExists(id);
+        if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) {
+            throw exception(TRANSFER_APPLICATION_CANCEL_FAIL_NOT_PROCESS);
+        }
+        // 鍙栨秷瀵瑰簲鐨� BPM 娴佺▼瀹炰緥锛堜互鍙戣捣浜鸿韩浠芥挙閿�锛�
+        if (StrUtil.isNotBlank(application.getProcessInstanceId())) {
+            BpmProcessInstanceCancelReqVO cancelReqVO = new BpmProcessInstanceCancelReqVO();
+            cancelReqVO.setId(application.getProcessInstanceId());
+            cancelReqVO.setReason("鍛樺伐鎾ら攢璋冨矖鐢宠");
+            bpmProcessInstanceService.cancelProcessInstanceByStartUser(userId, cancelReqVO);
+        }
+        transferApplicationMapper.updateById(HrmTransferApplicationDO.builder()
+                .id(id)
+                .status(HrmAuditStatusEnum.CANCEL.getStatus())
+                .build());
+    }
+
+    @Override
     public List<Map<String, Object>> getApproveProcessDefinitionList() {
         validateApproveCategoryAndProcessDefinition();
         List<BpmProcessDefinitionInfoDO> definitionInfoList = bpmProcessDefinitionService

--
Gitblit v1.9.3