| | |
| | | @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()); |
| | |
| | | } |
| | | |
| | | @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); |
| | |
| | | |
| | | @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, |
| | | // 代员工提交时,流程发起人仍应为申请表上的申请人 |
| | | String processInstanceId = bpmProcessInstanceApi.createProcessInstance(application.getUserId(), |
| | | new BpmProcessInstanceCreateReqDTO().setProcessDefinitionKey(processDefinitionKey) |
| | | .setBusinessKey(String.valueOf(id))); |
| | | mapper.updateById(HrmOvertimeApplicationDO.builder().id(id).processInstanceId(processInstanceId) |
| | |
| | | |
| | | @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("申请人撤销加班申请")); |
| | | } |
| | | |
| | |
| | | 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); |
| | | } |
| | |
| | | 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) { |