一 部署设计器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 个任务: ---------------------------