更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://122.227.135.243:9888
撤回功能主要是针对我审批完后的一种操作方式,只能我自己审批完到下一节点的时候才能做撤回操作,比如我审批通过了,我可以进行撤回,但一旦下一个节点也被人审批了,那我就不能撤回了。
具体的代码如下,主要是修复对自定义业务关联表的数据更新:
@Override @Transactional(rollbackFor = Exception.class) public void revokeProcess(WfTaskBo taskBo) { String procInsId = taskBo.getProcInsId(); String taskId = taskBo.getTaskId(); // 校验流程是否结束 ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(procInsId) .active() .singleResult(); if(ObjectUtil.isNull(processInstance)) { throw new RuntimeException("流程已结束或已挂起,无法执行撤回操作"); } // 获取待撤回任务实例 HistoricTaskInstance currTaskIns = historyService.createHistoricTaskInstanceQuery() .taskId(taskId) .taskAssignee(TaskUtils.getUserName()) .singleResult(); if (ObjectUtil.isNull(currTaskIns)) { throw new RuntimeException("当前任务不存在,无法执行撤回操作"); } // 获取 bpmn 模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(currTaskIns.getProcessDefinitionId()); UserTask currUserTask = ModelUtils.getUserTaskByKey(bpmnModel, currTaskIns.getTaskDefinitionKey()); // 查找下一级用户任务列表 List<UserTask> nextUserTaskList = ModelUtils.findNextUserTasks(currUserTask); List<String> nextUserTaskKeys = nextUserTaskList.stream().map(UserTask::getId).collect(Collectors.toList()); // 获取当前节点之后已完成的流程历史节点 List<HistoricTaskInstance> finishedTaskInsList = historyService.createHistoricTaskInstanceQuery() .processInstanceId(procInsId) .taskCreatedAfter(currTaskIns.getEndTime()) .finished() .list(); for (HistoricTaskInstance finishedTaskInstance : finishedTaskInsList) { // 检查已完成流程历史节点是否存在下一级中 if (CollUtil.contains(nextUserTaskKeys, finishedTaskInstance.getTaskDefinitionKey())) { throw new RuntimeException("下一流程已处理,无法执行撤回操作"); } } // 获取所有激活的任务节点,找到需要撤回的任务 List<Task> activateTaskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); List<String> revokeExecutionIds = new ArrayList<>(); for (Task task : activateTaskList) { // 检查激活的任务节点是否存在下一级中,如果存在,则加入到需要撤回的节点 if (CollUtil.contains(nextUserTaskKeys, task.getTaskDefinitionKey())) { // 添加撤回审批信息 taskService.setAssignee(task.getId(), TaskUtils.getUserName()); taskService.addComment(task.getId(), task.getProcessInstanceId(), FlowComment.REVOKE.getType(), LoginHelper.getNickName() + "撤回流程审批"); revokeExecutionIds.add(task.getExecutionId()); } } try { runtimeService.createChangeActivityStateBuilder() .processInstanceId(procInsId) .moveExecutionsToSingleActivityId(revokeExecutionIds, currTaskIns.getTaskDefinitionKey()).changeState(); String dataId = taskBo.getDataId(); if(StringUtils.isNotEmpty(dataId)) { //当前任务信息 List<Task> listtask = taskService.createTaskQuery().processInstanceId(procInsId).taskAssignee(TaskUtils.getUserName()).list(); WfMyBusiness business = wfMyBusinessService.getByDataId(dataId); //更新自定义业务任务关联表与流程历史表,以便可以重新发起流程。 if (business != null) { if (listtask != null && listtask.size()>0) { business.setActStatus(ActStatus.revoke); business.setTodoUsers(listtask.get(0).getAssignee()); } else { business.setActStatus(ActStatus.revoke); business.setTodoUsers(""); business.setDoneUsers(""); business.setProposer(""); business.setTaskName(""); business.setTaskId(""); business.setTaskNameId(""); } wfMyBusinessService.updateById(business); } } } catch (FlowableObjectNotFoundException e) { throw new RuntimeException("未找到流程实例,流程可能已发生变化"); } catch (FlowableException e) { throw new RuntimeException("执行撤回操作失败"); } }