flowable 學習(三) 並行網關

一 部署設計器java

代碼:https://gitee.com/weim/flowable_demomysql

1. 將flowable-idm.war, flowable-modeler.war放到tomcat的webapps目錄下,而後啓動tomcatgit

2. 在瀏覽器中訪問http://localhost:8080/flowable-modeler,用戶名/密碼:admin/test 登錄,設計流程後,保存並導出文件。web

二 代碼sql

1 建立流程引擎,而且部署一個流程定義瀏覽器

ProcessEngine processEngine = null;

Map<String, String> userMap = new HashMap<>();


@Before
public void Before() {
	userMap.put("11", "週六");
	userMap.put("22", "週六大佬");
	userMap.put("33", "管週六大佬");
	userMap.put("44", "周天大佬");
	userMap.put("55", "管周天大佬");
	userMap.put("66", "大佬");

	ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
			.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true")
			.setJdbcUsername("xxxx")
			.setJdbcPassword("xxxx")
			.setJdbcDriver("com.mysql.cj.jdbc.Driver")
			.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

	processEngine = cfg.buildProcessEngine();
}


@Test
public void Test01(){
	// 獲取Flowable服務
	RepositoryService repositoryService = processEngine.getRepositoryService();

	// 部署流程定義
	Deployment deployment = repositoryService.createDeployment().addClasspathResource("bing_xing_wang_guan.bpmn20.xml").deploy();

	//查找部署流程定義
	ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
	System.out.println(processDefinition.getName() + "  " + processDefinition.getDeploymentId() + "   " + processDefinition.getId());
}

2 一個完整的流程tomcat

@Test
public void test02() {
	String processDefinitionId = "bing_xing_wang_guan_key:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "11");

	//啓動流程
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	//查詢週六下的任務
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("11").list();
	queryTask();

	//第一個並行網關
	variables = new HashMap<>();
	variables.put("oneManager", "22");
	variables.put("twoManager", "44");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("22").list();
	variables.put("oneNextManager", "33");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("44").list();
	variables.put("twoNextManager", "55");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----周天大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("33").list();
	variables.put("nextManager", "66");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----管週六大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("55").list();
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----管周天大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("66").list();
	taskService.complete(tasks.get(0).getId());
	System.out.println("-----大佬 結束了任務-----");

	queryTask();
}

private void queryTask() {
	TaskService taskService = processEngine.getTaskService();

	System.out.println("---------------------------");
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("11").list();
	System.out.println("週六有" + tasks.size() + " 個任務:");

	tasks = taskService.createTaskQuery().taskAssignee("22").list();
	System.out.println("週六大佬有" + tasks.size() + " 個任務:");

	tasks = taskService.createTaskQuery().taskAssignee("33").list();
	System.out.println("管週六大佬有" + tasks.size() + " 個任務:");

	tasks = taskService.createTaskQuery().taskAssignee("44").list();
	System.out.println("周天大佬有" + tasks.size() + " 個任務:");

	tasks = taskService.createTaskQuery().taskAssignee("55").list();
	System.out.println("管周天大佬有" + tasks.size() + " 個任務:");

	tasks = taskService.createTaskQuery().taskAssignee("66").list();
	System.out.println("大佬有" + tasks.size() + " 個任務:");
	System.out.println("---------------------------");
}

完整流程的執行結果:app

processInstanceId = 12501
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有1 個任務:
管週六大佬有0 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有1 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----周天大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有1 個任務:
周天大佬有0 個任務:
管周天大佬有1 個任務:
大佬有0 個任務:
---------------------------
-----管週六大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有1 個任務:
大佬有0 個任務:
---------------------------
-----管周天大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有1 個任務:
---------------------------
-----大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------

3 駁回狀況一: 同級別第一個或者第二個管理者駁回webapp

   駁回狀況二: 同級別第一個管理者結束了任務,同級別第二個管理者駁回ui

   駁回狀況三:管理者上級駁回

這裏主要問題在於如何尋找上一個節點的activityId,採用了一種迂迴的方式,保存到了變量裏。

 3.1 駁回狀況一

@Test
public void test03() {
	String processDefinitionId = "bing_xing_wang_guan_key:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "11");
	variables.put("11", null);

	//啓動流程
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	//查詢managers下的任務
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("11").list();
	String lastActivityId = tasks.get(0).getTaskDefinitionKey();

	queryTask();

	//第一個並行網關
	variables = new HashMap<>();
	variables.put("22", lastActivityId);
	variables.put("44", lastActivityId);
	variables.put("oneManager", "22");
	variables.put("twoManager", "44");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六 結束了任務-----");

	queryTask();

	System.out.println("-----周天大佬 回退了任務-----");
	List<Execution> executionList = runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list();
	List<String> currentExecutionIds = executionList.stream().map(item -> item.getId()).collect(Collectors.toList());

	tasks = taskService.createTaskQuery().taskAssignee("44").list();
	String targetActivityId = taskService.getVariable(tasks.get(0).getId(), "44").toString();

	runtimeService.createChangeActivityStateBuilder()
			.moveExecutionsToSingleActivityId(currentExecutionIds, targetActivityId)
			.changeState();
	queryTask();
}

駁回狀況一執行結果:

processInstanceId = 15001
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有1 個任務:
管週六大佬有0 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----周天大佬 回退了任務-----
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------

 3.2 駁回狀況二

@Test
public void test04() {
	String processDefinitionId = "bing_xing_wang_guan_key:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "11");
	variables.put("11", null);

	//啓動流程
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	String processInstanceId = processInstance.getProcessInstanceId();

	//查詢managers下的任務
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("11").list();
	String lastActivityId = tasks.get(0).getTaskDefinitionKey();

	queryTask();

	//第一個並行網關
	variables = new HashMap<>();
	variables.put("22", lastActivityId);
	variables.put("44", lastActivityId);
	variables.put("oneManager", "22");
	variables.put("twoManager", "44");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("22").list();
	lastActivityId = tasks.get(0).getTaskDefinitionKey();
	variables.put("33", lastActivityId);
	variables.put("oneNextManager", "33");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六大佬 結束了任務-----");

	queryTask();

	System.out.println("-----周天大佬 回退了任務-----");
	List<Execution> executionList = runtimeService.createExecutionQuery().parentId(processInstanceId).list();
	List<String> currentExecutionIds = executionList.stream().map(item -> item.getId()).collect(Collectors.toList());

	tasks = taskService.createTaskQuery().taskAssignee("44").list();
	String targetActivityId = taskService.getVariable(tasks.get(0).getId(), "44").toString();

	runtimeService.createChangeActivityStateBuilder()
			.processInstanceId(processInstanceId)
			.moveExecutionsToSingleActivityId(currentExecutionIds, targetActivityId)
			.changeState();
	queryTask();
}

駁回狀況二執行結果:

processInstanceId = 20001
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有1 個任務:
管週六大佬有0 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有1 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----周天大佬 回退了任務-----
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------

 3.3 駁回狀況三

@Test
public void test06() {
	String processDefinitionId = "bing_xing_wang_guan_key:1:4";

	RuntimeService runtimeService = processEngine.getRuntimeService();
	TaskService taskService = processEngine.getTaskService();

	Map<String, Object> variables = new HashMap<>();
	variables.put("user", "11");
	variables.put("11", null);

	//啓動流程
	ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
	System.out.println("processInstanceId = " + processInstance.getProcessInstanceId());

	String processInstanceId = processInstance.getProcessInstanceId();

	//查詢managers下的任務
	List<Task> tasks = taskService.createTaskQuery().taskAssignee("11").list();
	String lastActivityId = tasks.get(0).getTaskDefinitionKey();

	queryTask();

	//第一個並行網關
	variables = new HashMap<>();
	variables.put("22", lastActivityId);
	variables.put("44", lastActivityId);
	variables.put("oneManager", "22");
	variables.put("twoManager", "44");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("22").list();
	lastActivityId = tasks.get(0).getTaskDefinitionKey();
	variables.put("33", lastActivityId);
	variables.put("oneNextManager", "33");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----週六大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("33").list();
	lastActivityId = tasks.get(0).getTaskDefinitionKey();
	variables.put("nextManager", "66");
	variables.put("66", lastActivityId);
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----管週六大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("44").list();
	lastActivityId = tasks.get(0).getTaskDefinitionKey();
	variables.put("55", lastActivityId);
	variables.put("twoNextManager", "55");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----周天大佬 結束了任務-----");

	queryTask();

	tasks = taskService.createTaskQuery().taskAssignee("55").list();
	lastActivityId = tasks.get(0).getTaskDefinitionKey();
	Object variable = taskService.getVariable(tasks.get(0).getId(), "66");
	if(variable != null) {
		lastActivityId = String.valueOf(variable) + "&&" + lastActivityId;
	}
	variables.put("66", lastActivityId);
	variables.put("nextManager", "66");
	taskService.complete(tasks.get(0).getId(), variables);
	System.out.println("-----管周天大佬 結束了任務-----");

	queryTask();

	System.out.println("-----大佬 回退了任務-----");
	List<Execution> executionList = runtimeService.createExecutionQuery().parentId(processInstanceId).list();
	String currentActivityId02 = executionList.get(0).getActivityId();

	tasks = taskService.createTaskQuery().taskAssignee("66").list();
	String currentActivityId = runtimeService.getActiveActivityIds(tasks.get(0).getExecutionId()).get(0);
	String variable02 = taskService.getVariable(tasks.get(0).getId(), "66").toString();
	List<String> targetActivityIds = Arrays.asList(variable02.split("&&"));
	runtimeService.createChangeActivityStateBuilder()
			.processInstanceId(processInstanceId)
			.moveSingleActivityIdToActivityIds(currentActivityId, targetActivityIds)
			.changeState();

	queryTask();
}

駁回狀況三執行結果:

processInstanceId = 25001
---------------------------
週六有1 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有1 個任務:
管週六大佬有0 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----週六大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有1 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----管週六大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有1 個任務:
管周天大佬有0 個任務:
大佬有0 個任務:
---------------------------
-----周天大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有1 個任務:
大佬有0 個任務:
---------------------------
-----管周天大佬 結束了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有0 個任務:
周天大佬有0 個任務:
管周天大佬有0 個任務:
大佬有1 個任務:
---------------------------
-----大佬 回退了任務-----
---------------------------
週六有0 個任務:
週六大佬有0 個任務:
管週六大佬有1 個任務:
周天大佬有0 個任務:
管周天大佬有1 個任務:
大佬有0 個任務:
---------------------------
相關文章
相關標籤/搜索