| | |
| | | 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; |
| | |
| | | @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” |
| | |
| | | @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); |
| | | } |
| | |
| | | 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 |
| | |
| | | @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() { |
| | |
| | | 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 |
| | |
| | | : String.format("ID=%s", employeeId); |
| | | } |
| | | |
| | | } |
| | | } |