一 部署設計器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 建立流程引擎,而且部署一個流程定義瀏覽器
@Before public void Before() { 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("qing_jia_liu_cheng.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 = "qing_jia:1:4"; RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); //請假天數 <=5 由 twoUser 審批 int days = 2; //審批經過 則調用CallExternalSystemDelegate 不然 調用 SendRejectionMail boolean approved = false; Map<String, Object> variables = new HashMap<>(); variables.put("user", "張大大"); variables.put("days", days); //啓動流程 流程在第一個節點 候選組爲managers ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); System.out.println("processInstanceId = " + processInstance.getProcessInstanceId()); //查詢managers下的任務 List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list(); System.out.println("managers有" + tasks.size() + " 個任務:"); //設置條件 並結束第一個任務 進入網關 variables = new HashMap<>(); variables.put("oneUser", "李大大"); variables.put("twoUser", "王大大"); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----managers 結束了任務-----"); queryTask(); if(days <= 5) { System.out.println("-----任務到了王大大-----"); tasks = taskService.createTaskQuery().taskAssignee("王大大").list(); } else { System.out.println("-----任務到了李大大-----"); tasks = taskService.createTaskQuery().taskAssignee("李大大").list(); } variables = new HashMap<>(); variables.put("approved", approved); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----王大大/李大大 結束了任務-----"); queryTask(); tasks = taskService.createTaskQuery().taskAssignee("張大大").list(); System.out.println("-----張大大 結束了任務-----"); taskService.complete(tasks.get(0).getId()); queryTask(); } private void queryTask() { TaskService taskService = processEngine.getTaskService(); System.out.println("---------------------------"); List<Task> tasks = taskService.createTaskQuery().taskAssignee("張大大").list(); System.out.println("張大大有" + tasks.size() + " 個任務:"); tasks = taskService.createTaskQuery().taskAssignee("李大大").list(); System.out.println("李大大有" + tasks.size() + " 個任務:"); tasks = taskService.createTaskQuery().taskAssignee("王大大").list(); System.out.println("王大大有" + tasks.size() + " 個任務:"); System.out.println("---------------------------"); }
完整流程的執行結果:app
processInstanceId = 7501 managers有1 個任務: -----managers 結束了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有1 個任務: --------------------------- -----任務到了王大大----- SendRejectionMail start oneUser == 李大大 approved == false days == 2 user == 張大大 twoUser == 王大大 sid-0417597E-9B0F-4013-8F61-5139D73EF0D3 7504 [] null SendRejectionMail start -----王大大/李大大 結束了任務----- --------------------------- 張大大有1 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- -----張大大 結束了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有0 個任務: ---------------------------
3 駁回而且再次提交webapp
@Test public void Test04(){ String processDefinitionId = "qing_jia:1:4"; RuntimeService runtimeService = processEngine.getRuntimeService(); TaskService taskService = processEngine.getTaskService(); HistoryService historyService = processEngine.getHistoryService(); int days = 2; boolean approved = true; Map<String, Object> variables = new HashMap<>(); variables.put("user", "張大大"); variables.put("days", days); //啓動流程 流程在第一個節點 候選組爲managers ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables); System.out.println("processInstanceId = " + processInstance.getProcessInstanceId()); //查詢managers下的任務 List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list(); System.out.println("managers有" + tasks.size() + " 個任務:"); //結束第一個任務 進入網關 判斷參數 approved true:外部請假系統 而後到下一個用戶節點 false:發送拒絕郵件 variables = new HashMap<>(); variables.put("oneUser", "李大大"); variables.put("twoUser", "王大大"); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----managers 結束了任務-----"); queryTask2(); if(days <= 5) { System.out.println("-----任務到了王大大-----"); tasks = taskService.createTaskQuery().taskAssignee("王大大").list(); } else { System.out.println("-----任務到了李大大-----"); tasks = taskService.createTaskQuery().taskAssignee("李大大").list(); } variables = new HashMap<>(); variables.put("approved", approved); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----王大大/李大大 結束了任務-----"); queryTask2(); System.out.println("-----張大大 駁回了任務-----"); tasks = taskService.createTaskQuery().taskAssignee("張大大").list(); String processInstanceId = tasks.get(0).getProcessInstanceId(); List<String> activeActivityIds = runtimeService.getActiveActivityIds(tasks.get(0).getExecutionId()); String currentActivityId = activeActivityIds.get(0); String targetActivityId = getLastActivityId(historyService, processInstanceId, currentActivityId); //張大大回退了 流程 runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdTo(currentActivityId, targetActivityId) .changeState(); queryTask2(); if(days <= 5) { System.out.println("-----任務再次到了王大大-----"); tasks = taskService.createTaskQuery().taskAssignee("王大大").list(); } else { System.out.println("-----任務再次到了李大大-----"); tasks = taskService.createTaskQuery().taskAssignee("李大大").list(); } System.out.println("-----王大大/李大大 駁回了任務-----"); processInstanceId = tasks.get(0).getProcessInstanceId(); activeActivityIds = runtimeService.getActiveActivityIds(tasks.get(0).getExecutionId()); currentActivityId = activeActivityIds.get(0); targetActivityId = getLastActivityId(historyService, processInstanceId, currentActivityId); //王大大/李大大 回退了 流程 runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdTo(currentActivityId, targetActivityId) .changeState(); queryTask2(); //查詢managers下的任務 tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list(); System.out.println("再次查詢 managers 有" + tasks.size() + " 個任務:"); //設置條件 並結束第一個任務 進入網關 variables = new HashMap<>(); days = 9; variables.put("days", days); variables.put("oneUser", "李大大2"); variables.put("twoUser", "王大大2"); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----managers 結束了任務 而且修改審批人-----"); queryTask2(); if(days <= 5) { System.out.println("-----任務到了王大大2-----"); tasks = taskService.createTaskQuery().taskAssignee("王大大2").list(); } else { System.out.println("-----任務到了李大大2-----"); tasks = taskService.createTaskQuery().taskAssignee("李大大2").list(); } variables = new HashMap<>(); variables.put("approved", !approved); taskService.complete(tasks.get(0).getId(), variables); System.out.println("-----王大大2/李大大2 結束了任務-----"); queryTask2(); tasks = taskService.createTaskQuery().taskAssignee("張大大").list(); System.out.println("-----張大大 結束了任務-----"); taskService.complete(tasks.get(0).getId()); queryTask2(); } private String getLastActivityId(HistoryService historyService, String processInstanceId, String currentActivityId) { List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .finished() .activityType("userTask") .orderByHistoricActivityInstanceStartTime().desc() .list(); String lastActivityId = null; //找到上一個流程的 activityId for (int i=0; i<list.size(); i++) { HistoricActivityInstance activityInstance = list.get(i); if(activityInstance.getActivityId().equals(currentActivityId)) { lastActivityId = list.get(++i).getActivityId(); break; } } if(lastActivityId == null) { lastActivityId = list.get(0).getActivityId(); } return lastActivityId; } private void queryTask2() { TaskService taskService = processEngine.getTaskService(); queryTask(); List<Task> tasks = taskService.createTaskQuery().taskAssignee("張大大2").list(); System.out.println("張大大2有" + tasks.size() + " 個任務:"); tasks = taskService.createTaskQuery().taskAssignee("李大大2").list(); System.out.println("李大大2有" + tasks.size() + " 個任務:"); tasks = taskService.createTaskQuery().taskAssignee("王大大2").list(); System.out.println("王大大2有" + tasks.size() + " 個任務:"); System.out.println("---------------------------"); }
完整流程的執行結果:ui
processInstanceId = 10001 managers有1 個任務: -----managers 結束了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有1 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: --------------------------- -----任務到了王大大----- CallExternalSystemDelegate start oneUser == 李大大 approved == true days == 2 user == 張大大 twoUser == 王大大 sid-F69D3DA0-D2EC-4594-A6F3-2F6CBD4D76B4 10004 [] null CallExternalSystemDelegate end -----王大大/李大大 結束了任務----- --------------------------- 張大大有1 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: --------------------------- -----張大大 駁回了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有1 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: --------------------------- -----任務再次到了王大大----- -----王大大/李大大 駁回了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: --------------------------- 再次查詢 managers 有1 個任務: -----managers 結束了任務 而且修改審批人----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- 張大大2有0 個任務: 李大大2有1 個任務: 王大大2有0 個任務: --------------------------- -----任務到了李大大2----- SendRejectionMail start oneUser == 李大大2 approved == false days == 9 user == 張大大 twoUser == 王大大2 sid-0417597E-9B0F-4013-8F61-5139D73EF0D3 10028 [] null SendRejectionMail start -----王大大2/李大大2 結束了任務----- --------------------------- 張大大有1 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: --------------------------- -----張大大 結束了任務----- --------------------------- 張大大有0 個任務: 李大大有0 個任務: 王大大有0 個任務: --------------------------- 張大大2有0 個任務: 李大大2有0 個任務: 王大大2有0 個任務: ---------------------------