最近公司做的一个项目要实现工作流程的收回,驳回等操作,而采用的工作流引擎并不支持驳回功能,这个项目恰好就我和一个实习生一块做,所以这个问题就落到我的头上来解决了。。。
客户提出的要求是驳回时要记录日志,但是审批意见之类的需要清除掉,收回时不记录日志,审批意见同样清除。
百度了一下,总结了5个解决方案:
第一种是清除当前任务的出口,实现回到上一步的功能。
根据任务ID获取当前的任务节点,进而获取流程实例,然后取到流程的定义,找到当前活动的节点与上一步活动的节点,然后清除当前活动的出口,将上一步活动的出口作为最新的活动节点。
第二种是直接将当前的activiti引擎更换为第三方的支持退会驳回的引擎。
第三种是自己编译activiti引擎,加入退回,驳回功能。
第四种是直接操作数据库,使用历史任务替换正在进行的任务。
第五种是直接实现Command接口,实现工作流程可以任意跳转。
因为时间紧急所以直接将3.编译activiti引擎给pass掉了,本来项目是接手的离职员工的项目,更换流程引擎可能会引起其他的问题,此计划暂放。
最后在1、4、5之间决定了采用第一种,代码如下
1 public String rollBackWorkFlow(String taskId) { 2 try { 3 Map<String, Object> variables; 4 // 取得当前任务.当前任务节点 5 HistoricTaskInstance currTask = historyService 6 .createHistoricTaskInstanceQuery().taskId(taskId) 7 .singleResult(); 8 // 取得流程实例,流程实例 9 ProcessInstance instance = runtimeService 10 .createProcessInstanceQuery() 11 .processInstanceId(currTask.getProcessInstanceId()) 12 .singleResult(); 13 if (instance == null) { 14 logger.info("流程结束"); 15 logger.error("出错啦!流程已经结束"); 16 return "ERROR"; 17 } 18 variables = instance.getProcessVariables(); 19 // 取得流程定义 20 ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) 21 .getDeployedProcessDefinition(currTask 22 .getProcessDefinitionId()); 23 if (definition == null) { 24 logger.info("流程定义未找到"); 25 logger.error("出错啦!流程定义未找到"); 26 return "ERROR"; 27 } 28 // 取得上一步活动 29 ActivityImpl currActivity = ((ProcessDefinitionImpl) definition) 30 .findActivity(currTask.getTaskDefinitionKey()); 31 32 //也就是节点间的连线 33 List<PvmTransition> nextTransitionList = currActivity 34 .getIncomingTransitions(); 35 // 清除当前活动的出口 36 List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>(); 37 //新建一个节点连线关系集合 38 39 List<PvmTransition> pvmTransitionList = currActivity 40 .getOutgoingTransitions(); 41 // 42 for (PvmTransition pvmTransition : pvmTransitionList) { 43 oriPvmTransitionList.add(pvmTransition); 44 } 45 pvmTransitionList.clear(); 46 47 // 建立新出口 48 List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>(); 49 for (PvmTransition nextTransition : nextTransitionList) { 50 PvmActivity nextActivity = nextTransition.getSource(); 51 ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition) 52 .findActivity(nextActivity.getId()); 53 TransitionImpl newTransition = currActivity 54 .createOutgoingTransition(); 55 newTransition.setDestination(nextActivityImpl); 56 newTransitions.add(newTransition); 57 } 58 // 完成任务 59 List<Task> tasks = taskService.createTaskQuery() 60 .processInstanceId(instance.getId()) 61 .taskDefinitionKey(currTask.getTaskDefinitionKey()).list(); 62 for (Task task : tasks) { 63 taskService.claim(task.getId(), task.getAssignee()); 64 taskService.complete(task.getId(), variables); 65 historyService.deleteHistoricTaskInstance(task.getId()); 66 } 67 // 恢复方向 68 for (TransitionImpl transitionImpl : newTransitions) { 69 currActivity.getOutgoingTransitions().remove(transitionImpl); 70 } 71 for (PvmTransition pvmTransition : oriPvmTransitionList) { 72 pvmTransitionList.add(pvmTransition); 73 } 74 logger.info("OK"); 75 logger.info("流程结束"); 76 return "SUCCESS"; 77 } catch (Exception e) { 78 logger.error("失败",e); 79 return "ERROR"; 80 } 81 }