-
Springboot集成Activiti7
1)引入依赖<!--springboot与activiti7整合的starter--> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.10.0</version> </dependency>
2)属性配置
spring: #日志的相关配置 activiti: #是否让activiti自动创建所有的历史表 history-level: full #是否需要使用历史表,默认false不使用,而配置true是使用历史表 db-history-used: true #流程自动部署,关闭,需要手动部署流程 服务启动的时候自动检查resources目录下的bpmn文件 如果为true自动部署流程 check-process-definitions: false #关闭启动服务自动框架部署 deployment-mode: never-fail
3)在MySQL中创建一个新的数据库,准备一个引导类,然后启动项目,activiti会自动创建表结构。
-
bpmn-js画流程图,导出diagram.bpmn文件
- 排他网关(Exclusive Gateway):也称为XOR网关或基于数据的排他网关,用于在流程中创建决策点。当执行到达排他网关时,所有出口顺序流会按照它们定义的顺序进行计算。条件计算为true的顺序流会被选择用于继续流程。
- 排他网关(Exclusive Gateway):也称为XOR网关或基于数据的排他网关,用于在流程中创建决策点。当执行到达排他网关时,所有出口顺序流会按照它们定义的顺序进行计算。条件计算为true的顺序流会被选择用于继续流程。
-
调用activiti提供的api,实现部署流程、创建流程实例、执行任务:
- 流程定义ProcessDefinition是以BPMN文件定义的一个工作流程,是一组工作规范;
- 流程实例ProcessInstance则是指一个具体的业务流程。例如某个员工发起一次请假,就会实例化一个请假的流程实例,并且每个不同的流程实例之间是互不影响的。
1)RepositoryService:用于部署流程定义,可以添加、删除、查询和管理流程定义。
@Autowired private RepositoryService repositoryService; @Test public void deployProcess() { String fileName = "bpmn/diagram.bpmn"; //定义流程 Deployment deployment = repositoryService.createDeployment() .addClasspathResource(fileName) .name("Process_1") .deploy();//部署流程 }
2)RuntimeService:用于启动、查询和管理正在运行的流程实例。
@Autowired private RuntimeService runtimeService; @Test public void initProcessInstanceWithArgs() { //流程变量 Map<String,Object> variables = new HashMap<String,Object>(); variables.put("assingee0","采购员"); variables.put("assingee1","经理"); variables.put("assingee2","财务专员"); variables.put("assingee3","财务主管"); //启动流程实例 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "Process_1", "business_key_01", variables); System.out.println("流程实例ID: " + processInstance.getProcessDefinitionId()); }
3)TaskService:用于查询和管理当前用户可以操作的任务,以及完成任务。
- 采购员填写申请
@Autowired private TaskService taskService; //查询我的代办任务 @Test public void getTasksByAssignee() { String assingee = "采购员"; String businessKey = "business_key_01"; Task task = taskService.createTaskQuery() .processDefinitionKey("Process_1") //流程Key .taskAssignee(assingee) //要查询的负责人 .processInstanceBusinessKey(businessKey) .singleResult(); System.out.println("Id: " + task.getId()); System.out.println("Name: " + task.getName()); System.out.println("Assignee: " + task.getAssignee()); } //执行任务 @Test public void completeTask() { String assingee = "采购员"; String businessKey = "business_key_01"; //根据流程key 和 任务的负责人 查询任务 //返回一个任务对象 Task task = taskService.createTaskQuery() .processDefinitionKey("Process_1") //流程Key .taskAssignee(assingee) //要查询的负责人 .processInstanceBusinessKey(businessKey) .singleResult(); if (task == null) { System.out.println(assingee + ",没有任务可以执行..."); } else { //执行任务 // 把采购员填写的购买申请单中的数据,作为流程变量,设置到流程中 Map<String, Object> variables = new HashMap<>(); variables.put("userName", "采购员"); variables.put("startDate", "2024-1-1"); variables.put("money", "100000"); variables.put("info", "购买器材"); //完成任务 taskService.complete(task.getId(), variables); System.out.println("完成任务"); } }
- 经理审批同意,根据金额(大于10000由财务主管审批,小于等于则由财务专员审批)继续审批,最后审批通过即该流程结束。
@Test public void testAgree(){ Authentication authentication = new UsernamePasswordAuthenticationToken("经理","123456"); SecurityContextHolder.getContext().setAuthentication(authentication); Task task = taskService.createTaskQuery() .processDefinitionKey("Process_1") .taskAssignee("经理") .processInstanceBusinessKey("business_key_01").singleResult(); if(null != task){ Map<String,Object> variables = new HashMap<>(); variables.put("approvalStatus","同意"); variables.put("approvalNote","财务审核"); taskService.complete(task.getId(),variables); System.out.println("任务完成..."); } }
- 审批不同意,该流程结束
@Test public void testRejectTask() { Task task = taskService.createTaskQuery() .processDefinitionKey("Process_1") //流程Key .taskAssignee("经理") //要查询的负责人 .processInstanceBusinessKey("business_key_02") .singleResult(); String reason = "金额太大,不同意"; Map<String, Object> variables = new HashMap<>(); variables.put("approvalStatus", "不同意"); variables.put("approvalNode", reason); //记录流程变量 runtimeService.setVariables(task.getProcessInstanceId(), variables); //添加流程变量,删除流程实例,表示任务被拒绝 runtimeService.deleteProcessInstance(task.getProcessInstanceId(), reason);
4)HistoryService:用于查询历史数据,例如已完成的流程实例、已删除的流程实例、用户任务等。
@Autowired private HistoryService historyService; @Test public void getHistoryList(){ HistoricTaskInstanceQuery instanceQuery = historyService.createHistoricTaskInstanceQuery() .includeProcessVariables() .orderByHistoricTaskInstanceEndTime().desc() .finished() .taskAssignee("采购员"); List<HistoricTaskInstance> list = instanceQuery.list(); for (HistoricTaskInstance history : list) { System.out.println("Id: " + history.getId()); System.out.println("ProcessInstanceId: " + history.getProcessInstanceId()); System.out.println("StartTime: " + history.getStartTime()); System.out.println("Name: " + history.getName()); Map<String, Object> processVariables = history.getProcessVariables(); System.out.println(processVariables.get("money").toString()); } }
Springboot集成Activiti7案例--采购流程审批
于 2024-04-02 14:19:51 首次发布