工作流Activiti初體驗—流程撤回【二】

【寫在前面】如果看完這篇博客,對你有幫助的話,歡迎加入全棧技術交流羣,羣內不定時發佈熱門學習資料,也歡迎進行技術交流,對我的博客有疑問也可以在羣裏@我。《全棧技術交流羣歡迎你

已經玩工作流了,打算還是研究一下撤回的功能。但是流程圖裏面並不帶撤回的組件,所以需要自己動態改造一下,還是延續上一個流程繼續試驗撤回功能。《工作流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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章