gaoluyang
5 天以前 defe1e1c3ade87de0a7990f565f08f93aeb2decc
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.hrm.service.approval;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
@@ -150,8 +151,12 @@
    @Override
    public void updateResignationApplication(HrmResignationApplicationSaveReqVO updateReqVO) {
        HrmResignationApplicationDO application = validateResignationApplicationExists(updateReqVO.getId());
        if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) {
        validateOperator(application, getCurrentUserId());
        if (!isEditableResignationStatus(application.getStatus())) {
            throw exception(RESIGNATION_APPLICATION_UPDATE_FAIL_NOT_DRAFT);
        }
        if (updateReqVO.getUserId() != null && !Objects.equals(updateReqVO.getUserId(), application.getUserId())) {
            throw exception(RESIGNATION_APPLICATION_APPLICANT_IMMUTABLE);
        }
        HrmResignationApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmResignationApplicationDO.class);
        // 不覆盖申请人;交接人统一解析成“员工ID + 用户ID”
@@ -177,6 +182,7 @@
    @Override
    public void deleteResignationApplication(Long id) {
        HrmResignationApplicationDO application = validateResignationApplicationExists(id);
        validateOperator(application, getCurrentUserId());
        if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) {
            throw exception(RESIGNATION_APPLICATION_UPDATE_FAIL_NOT_DRAFT);
        }
@@ -190,6 +196,11 @@
            throw exception(RESIGNATION_APPLICATION_NOT_EXISTS);
        }
        return application;
    }
    private boolean isEditableResignationStatus(Integer status) {
        return Objects.equals(status, HrmAuditStatusEnum.DRAFT.getStatus())
                || Objects.equals(status, HrmAuditStatusEnum.REJECT.getStatus());
    }
    @Override
@@ -323,28 +334,29 @@
    @Transactional(rollbackFor = Exception.class)
    public void submitResignationApplication(Long id, String processDefinitionKey, Long userId) {
        HrmResignationApplicationDO application = validateResignationApplicationExists(id);
        if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) {
        validateOperator(application, userId);
        if (!isEditableResignationStatus(application.getStatus())) {
            throw exception(RESIGNATION_APPLICATION_SUBMIT_FAIL_NOT_DRAFT);
        }
        // 全局免审批:业务校验通过后直接执行审批通过逻辑,无需流程模型。
        if (bpmProcessInstanceApi.isGlobalAutoApprove()) {
            resignationApplicationMapper.updateById(HrmResignationApplicationDO.builder()
                    .id(id)
                    .processInstanceId("")
                    .status(HrmAuditStatusEnum.PROCESS.getStatus())
                    .build());
            resignationApplicationMapper.startApproval(id, "", HrmAuditStatusEnum.PROCESS.getStatus());
            updateResignationApplicationAuditStatus(id, HrmAuditStatusEnum.APPROVE.getStatus());
            return;
        }
        ProcessDefinition processDefinition = resolveActiveProcessDefinition(processDefinitionKey);
        String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO()
                .setProcessDefinitionKey(processDefinition.getKey()).setBusinessKey(String.valueOf(id)));
        resignationApplicationMapper.updateById(HrmResignationApplicationDO.builder()
                .id(id)
                .processInstanceId(processInstanceId)
                .status(HrmAuditStatusEnum.PROCESS.getStatus())
                .build());
        String processInstanceId = bpmProcessInstanceApi.createProcessInstance(application.getUserId(), new BpmProcessInstanceCreateReqDTO()
                .setProcessDefinitionKey(processDefinition.getKey()).setBusinessKey(String.valueOf(id))
                .setVariables(Map.of("businessNo", application.getNo())));
        resignationApplicationMapper.startApproval(id, processInstanceId, HrmAuditStatusEnum.PROCESS.getStatus());
    }
    private void validateOperator(HrmResignationApplicationDO application, Long operatorId) {
        if (!Objects.equals(application.getUserId(), operatorId)
                && !Objects.equals(application.getCreator(), String.valueOf(operatorId))) {
            throw exception(RESIGNATION_APPLICATION_OPERATOR_NOT_ALLOWED);
        }
    }
    private void validateApproveCategoryAndProcessDefinition() {
@@ -439,11 +451,12 @@
            log.error("[updateResignationApplicationAuditStatus][application({}) 不处于审批中,无法更新审批结果({})]", id, status);
            throw exception(RESIGNATION_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS);
        }
        resignationApplicationMapper.updateById(HrmResignationApplicationDO.builder()
                .id(id)
                .status(status)
                .approveTime(java.time.LocalDateTime.now())
                .build());
        resignationApplicationMapper.update(null, new LambdaUpdateWrapper<HrmResignationApplicationDO>()
                .eq(HrmResignationApplicationDO::getId, id)
                .set(HrmResignationApplicationDO::getStatus, status)
                .set(HrmResignationApplicationDO::getApproveTime,
                        Objects.equals(status, HrmAuditStatusEnum.APPROVE.getStatus())
                                ? LocalDateTime.now() : null));
    }
    @Override
@@ -684,4 +697,4 @@
                : String.format("ID=%s", employeeId);
    }
}
}