【寫在前面】如果看完這篇博客,對你有幫助的話,歡迎加入全棧技術交流羣,羣內不定時發佈熱門學習資料,也歡迎進行技術交流,對我的博客有疑問也可以在羣裏@我。《全棧技術交流羣歡迎你》
已經玩工作流了,打算還是研究一下撤回的功能。但是流程圖裏面並不帶撤回的組件,所以需要自己動態改造一下,還是延續上一個流程繼續試驗撤回功能。《工作流Activiti初體驗【一】》
完整流程圖
我們研究一下分發任務撤回到發起任務,其他環節的撤回類似
撤回的原理大概如下:
將分發任務後面的方向清空,把發起任務拼接到原來的判斷網關,然後結束分發任務,這樣流程就到發起任務了
此時的流程如上圖,並且當前節點是發起任務,而後再將分發任務後面的方向清空,並還原爲最初的方向,如下圖:
撤回代碼
/**
* 撤回流程
*/
private void recall() {
List<String> roleCodeList = new ArrayList<>();
roleCodeList.add("user1");
// 取得已提交的任務
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery()
.taskCandidateGroupIn(roleCodeList).singleResult();
// HistoricTaskInstance historicTaskInstance =
// historyService.createHistoricTaskInstanceQuery().taskAssignee(assignee).singleResult();
// HistoricTaskInstance historicTaskInstance =
// historyService.createHistoricTaskInstanceQuery().taskCandidateUser(assignee).singleResult();
System.out.println(historicTaskInstance.getId());
// 取得流程實例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(historicTaskInstance.getProcessInstanceId()).singleResult();
System.out.println(processInstance.getId());
Map<String, Object> variables = runtimeService.getVariables(historicTaskInstance.getExecutionId());
System.out.println(variables);
// 取得流程定義
ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity) repositoryService
.getProcessDefinition(historicTaskInstance.getProcessDefinitionId());
System.out.println(definitionEntity);
// 取得上一步活動
ActivityImpl hisActivity = definitionEntity.findActivity(historicTaskInstance.getTaskDefinitionKey());
System.out.println(hisActivity);
// 取得當前活動
List<PvmTransition> currTransitionList = hisActivity.getOutgoingTransitions();
System.out.println(currTransitionList);
for (PvmTransition currTransition : currTransitionList) {
PvmActivity currActivity = currTransition.getDestination();
List<Task> currTasks = taskService.createTaskQuery().processInstanceId(processInstance.getId())
.taskDefinitionKey(currActivity.getId()).list();
for (Task currTask : currTasks) {
ArrayList<PvmTransition> oriPvmTransitionList = new ArrayList<>();
List<PvmTransition> pvmTransitionList = currActivity.getOutgoingTransitions();
System.out.println(pvmTransitionList);
for (PvmTransition pvmTransition : pvmTransitionList) {
oriPvmTransitionList.add(pvmTransition);
}
System.out.println(oriPvmTransitionList);
pvmTransitionList.clear();
// 建立新方向
ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definitionEntity)
.findActivity(currActivity.getId());
TransitionImpl newTransition = nextActivityImpl.createOutgoingTransition();
newTransition.setDestination(hisActivity);
taskService.claim(currTask.getId(), null);
taskService.complete(currTask.getId(), variables);
historyService.deleteHistoricTaskInstance(currTask.getId());
// 恢復方向
hisActivity.getIncomingTransitions().remove(newTransition);
List<PvmTransition> pvmTList = currActivity.getOutgoingTransitions();
pvmTList.clear();
for (PvmTransition pvmTransition : oriPvmTransitionList) {
pvmTransitionList.add(pvmTransition);
}
System.out.println(pvmTransitionList);
}
}
historyService.deleteHistoricTaskInstance(historicTaskInstance.getId());
}
項目地址 Activiti-Test