| | |
| | | |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.util.ObjUtil; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import cn.iocoder.yudao.framework.common.exception.ServiceException; |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationRespVO; |
| | | import cn.iocoder.yudao.module.hrm.controller.admin.approval.vo.HrmTransferApplicationSaveReqVO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.approval.HrmTransferApplicationDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.dataobject.employee.HrmEmployeeDO; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.approval.HrmTransferApplicationMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.mysql.employee.HrmEmployeeMapper; |
| | | import cn.iocoder.yudao.module.hrm.dal.redis.HrmNoRedisDAO; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmAuditStatusEnum; |
| | | import cn.iocoder.yudao.module.hrm.enums.HrmTransferTypeEnum; |
| | |
| | | @Resource |
| | | private HrmTransferApplicationMapper transferApplicationMapper; |
| | | @Resource |
| | | private HrmEmployeeMapper employeeMapper; |
| | | @Resource |
| | | private HrmNoRedisDAO noRedisDAO; |
| | | @Resource |
| | | private DeptApi deptApi; |
| | |
| | | if (Objects.equals(createReqVO.getTargetPostId(), createReqVO.getCurrentPostId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_POST); |
| | | } |
| | | validateTargetDeptAndPost(createReqVO.getTargetDeptId(), createReqVO.getTargetPostId()); |
| | | // 3. 确定被调岗员工(未指定时默认当前登录用户) |
| | | Long userId = createReqVO.getUserId() != null ? createReqVO.getUserId() : getLoginUserId(); |
| | | AdminUserRespDTO user = userId != null ? adminUserApi.getUser(userId) : null; |
| | |
| | | throw new ServiceException(TRANSFER_APPLICATION_APPLICANT_DEPT_EMPTY.getCode(), |
| | | String.format("调岗申请失败:员工[%s]未设置部门,无法确定原部门。请先到「员工管理」编辑该员工档案补全部门,再重新发起调岗申请。", user.getNickname())); |
| | | } |
| | | validateCurrentDept(userId, createReqVO.getCurrentDeptId()); |
| | | if (createReqVO.getCurrentPostId() == null) { |
| | | throw new ServiceException(TRANSFER_APPLICATION_APPLICANT_POST_EMPTY.getCode(), |
| | | String.format("调岗申请失败:员工[%s]未设置岗位,无法确定原岗位。请先到「员工管理」编辑该员工档案补全岗位,再重新发起调岗申请。", user.getNickname())); |
| | |
| | | @Override |
| | | public void updateTransferApplication(HrmTransferApplicationSaveReqVO updateReqVO) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(updateReqVO.getId()); |
| | | validateOperator(application, getLoginUserId()); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus()) |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.PROCESS.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | && !Objects.equals(application.getStatus(), HrmAuditStatusEnum.REJECT.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_FAIL_NOT_EDITABLE); |
| | | } |
| | | if (updateReqVO.getUserId() != null && !Objects.equals(updateReqVO.getUserId(), application.getUserId())) { |
| | | throw exception(TRANSFER_APPLICATION_APPLICANT_IMMUTABLE); |
| | | } |
| | | if (Objects.equals(updateReqVO.getTargetDeptId(), updateReqVO.getCurrentDeptId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_DEPT); |
| | |
| | | if (Objects.equals(updateReqVO.getTargetPostId(), updateReqVO.getCurrentPostId())) { |
| | | throw exception(TRANSFER_APPLICATION_SAME_POST); |
| | | } |
| | | validateTargetDeptAndPost(updateReqVO.getTargetDeptId(), updateReqVO.getTargetPostId()); |
| | | validateCurrentDept(application.getUserId(), |
| | | updateReqVO.getCurrentDeptId() != null ? updateReqVO.getCurrentDeptId() : application.getCurrentDeptId()); |
| | | HrmTransferApplicationDO updateObj = BeanUtils.toBean(updateReqVO, HrmTransferApplicationDO.class); |
| | | updateObj.setUserId(null); |
| | | transferApplicationMapper.updateById(updateObj); |
| | | storageAttachmentApi.updateAttachments("file", "hrm_transfer_application", updateReqVO.getId(), updateReqVO.getBlobIds()); |
| | | } |
| | |
| | | @Override |
| | | public void deleteTransferApplication(Long id) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(id); |
| | | validateOperator(application, getLoginUserId()); |
| | | if (!Objects.equals(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_FAIL_NOT_DRAFT); |
| | | } |
| | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void submitTransferApplication(Long id, String processDefinitionKey, Long userId) { |
| | | HrmTransferApplicationDO application = validateTransferApplicationExists(id); |
| | | if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus())) { |
| | | validateOperator(application, userId); |
| | | if (ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.DRAFT.getStatus()) |
| | | && ObjUtil.notEqual(application.getStatus(), HrmAuditStatusEnum.REJECT.getStatus())) { |
| | | throw exception(TRANSFER_APPLICATION_SUBMIT_FAIL_NOT_DRAFT); |
| | | } |
| | | validateTargetDeptAndPost(application.getTargetDeptId(), application.getTargetPostId()); |
| | | validateCurrentDept(application.getUserId(), application.getCurrentDeptId()); |
| | | // 全局免审批:业务校验通过后直接执行审批通过逻辑,无需流程模型。 |
| | | if (bpmProcessInstanceApi.isGlobalAutoApprove()) { |
| | | transferApplicationMapper.updateById(HrmTransferApplicationDO.builder() |
| | |
| | | } |
| | | |
| | | validateApproveCategoryAndProcessDefinition(); |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null) { |
| | | if (processDefinitionKey == null || processDefinitionKey.isBlank()) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(userId, new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id))); |
| | | transferApplicationMapper.updateById(HrmTransferApplicationDO.builder() |
| | | .id(id) |
| | | .processInstanceId(processInstanceId) |
| | | .status(HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .build()); |
| | | ProcessDefinition processDefinition = bpmProcessDefinitionService.getActiveProcessDefinition(processDefinitionKey); |
| | | if (processDefinition == null || bpmProcessDefinitionService |
| | | .getProcessDefinitionInfoListByCategory(APPROVE_CATEGORY_CODE).stream() |
| | | .noneMatch(info -> Objects.equals(info.getProcessDefinitionId(), processDefinition.getId()))) { |
| | | throw exception(TRANSFER_APPLICATION_BPM_PROCESS_DEFINITION_NOT_EXISTS); |
| | | } |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(application.getUserId(), new BpmProcessInstanceCreateReqDTO() |
| | | .setProcessDefinitionKey(processDefinitionKey).setBusinessKey(String.valueOf(id)) |
| | | .setVariables(Map.of("businessNo", application.getNo()))); |
| | | transferApplicationMapper.update(null, new LambdaUpdateWrapper<HrmTransferApplicationDO>() |
| | | .eq(HrmTransferApplicationDO::getId, id) |
| | | .set(HrmTransferApplicationDO::getProcessInstanceId, processInstanceId) |
| | | .set(HrmTransferApplicationDO::getStatus, HrmAuditStatusEnum.PROCESS.getStatus()) |
| | | .set(HrmTransferApplicationDO::getApproveTime, null)); |
| | | } |
| | | |
| | | private void validateTargetDeptAndPost(Long targetDeptId, Long targetPostId) { |
| | | deptApi.validateDeptList(Collections.singletonList(targetDeptId)); |
| | | postApi.validPostList(Collections.singletonList(targetPostId)); |
| | | } |
| | | |
| | | private void validateOperator(HrmTransferApplicationDO application, Long operatorId) { |
| | | if (!Objects.equals(application.getUserId(), operatorId) |
| | | && !Objects.equals(application.getCreator(), String.valueOf(operatorId))) { |
| | | throw exception(TRANSFER_APPLICATION_OPERATOR_NOT_ALLOWED); |
| | | } |
| | | } |
| | | |
| | | private void validateCurrentDept(Long userId, Long currentDeptId) { |
| | | HrmEmployeeDO employee = employeeMapper.selectByUserId(userId); |
| | | if (employee == null || employee.getDeptId() == null) { |
| | | throw exception(TRANSFER_APPLICATION_EMPLOYEE_DEPT_NOT_FOUND); |
| | | } |
| | | if (!Objects.equals(employee.getDeptId(), currentDeptId)) { |
| | | throw exception(TRANSFER_APPLICATION_CURRENT_DEPT_MISMATCH); |
| | | } |
| | | } |
| | | |
| | | private void validateApproveCategoryAndProcessDefinition() { |
| | |
| | | log.error("[updateTransferApplicationAuditStatus][application({}) 不处于审批中,无法更新审批结果({})]", id, status); |
| | | throw exception(TRANSFER_APPLICATION_UPDATE_AUDIT_STATUS_FAIL_NOT_PROCESS); |
| | | } |
| | | transferApplicationMapper.updateById(HrmTransferApplicationDO.builder() |
| | | .id(id) |
| | | .status(status) |
| | | .approveTime(java.time.LocalDateTime.now()) |
| | | .build()); |
| | | transferApplicationMapper.update(null, new LambdaUpdateWrapper<HrmTransferApplicationDO>() |
| | | .eq(HrmTransferApplicationDO::getId, id) |
| | | .set(HrmTransferApplicationDO::getStatus, status) |
| | | .set(HrmTransferApplicationDO::getApproveTime, |
| | | Objects.equals(status, HrmAuditStatusEnum.APPROVE.getStatus()) |
| | | ? java.time.LocalDateTime.now() : null)); |
| | | } |
| | | |
| | | @Override |
| | |
| | | return transferApplicationMapper.selectByProcessInstanceId(processInstanceId); |
| | | } |
| | | |
| | | } |
| | | } |