一 部署設計器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 個任務: ---------------------------