Flowable框架的入门与使用【一】
一、什么是Flowable框架?
Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable框架是由Activiti团队发起和开发的。在2013年,Activiti项目从Alfresco分离出来,成为一个独立的开源项目,并更名为Flowable,Flowable保留了Activiti的大部分核心功能,包括流程定义、流程执行引擎、任务管理等。Flowable致力于简化流程管理,并提供了各种功能来支持流程的自动化。
二、Flowable都有那些表?
主要有以下表信息,如果没用到flowable自带的用户体系的话,则ACT_ID_*表表都为空
-
ACT_RE_*表:这些表存储着流程引擎的静态信息,包括流程定义、流程资源等。例如:
- ACT_RE_PROCDEF: 存储流程定义信息,包括流程模型的ID、KEY、版本号等。
- ACT_RE_DEPLOYMENT: 存储流程部署信息,包括部署时间、部署名称等。
-
ACT_RU_*表:这些表用于存储流程运行时的实例和相关的数据。例如:
- ACT_RU_EXECUTION: 存储流程实例的执行信息,包括当前活动、父子流程关系等。
- ACT_RU_TASK: 存储任务实例的信息,包括任务名称、负责人、状态等。
- ACT_RU_VARIABLE 运行时变量表
-
ACT_HI_*表:这些表记录了历史数据,包括已完成的流程实例、任务等。例如:
- ACT_HI_PROCINST: 存储已完成的流程实例的信息,包括开始时间、结束时间等。
- ACT_HI_TASKINST: 存储已完成的任务实例的信息,包括任务名称、负责人、完成时间等。
- ACT_HI_VARINST 历史的流程运行中的变量信息
- ACT_HI_COMMENT 历史的说明性信息,审批意见
-
ACT_ID_*表:这些表用于存储身份和权限相关的信息,例如用户、组和权限等。例如:
- ACT_ID_USER: 存储用户信息,包括用户名、密码等。
- ACT_ID_GROUP: 存储用户组信息,用于进行用户与用户组的关联。
三、常用的API
集成springboot之后,runtimeService,taskService都可以直接注入进来
-
部署流程,可以通过以下方式部署,也可以通过web流程设计器直接点部署,也可以在springboot中将流程定义文件放到resource目录执行目录下,在配置文件中开启启动项目时自动部署。
scss// 创建流程引擎 ProcessEngine processEngine = Configuration.createProcessEngineConfigurationFromResourceDefault().buildProcessEngine(); // 部署流程定义 Deployment deployment = processEngine.getRepositoryService() .createDeployment() .addClasspathResource("leave.bpmn20.xml") .deploy();
-
启动流程实例
ini// 启动流程实例 RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");
-
设置流程变量,可以在流程启动时设置,也可以在流程启动之后再设置
javascript//设置流程变量 Map<String, Object> variables = new HashMap<>(); variables.put("candidate0", "zhangsan"); variables.put("candidate1", "lisi"); ProcessInstance processInstance = runtimeService.startProcessInstanceById("leaveProcess", variables);
-
查询流程实例的当前任务,可以查询某个候选用户或者候选组
scss// 查询当前任务 List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstance.getId()) .taskCandidateUser("zhangsan") .taskCandidateGroup("用户组") .list();
-
拾取任务,如果当前任务已经分配了候选人或候选组,需要先拾取任务
scsstaskService.claim(task.getId(),"zhangsan"); // 拾取完成之后,zhagnsan就变成了当前任务的持有者 Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()) .taskAssignee("zhangsan") .singleResult();
-
归还任务,如果拾取后不想处理了,可以归还任务
initaskService.unclaim(task.getId());
-
转办任务,拾取任务之后,如果不想归还,也不想自己处理,可以直接将任务转给别人
lesstaskService.setAssignee(task.getId(), "lisi");
-
委派任务,拾取任务之后,如果不想归还,也不想自己处理,可以直接将任务委派给别人,这里和转办的不同之点在于,被委派人完成之后任务所属人仍然是委派人,参考链接:www.cnblogs.com/laoxia/p/97...
scss// 委派任务 taskService.delegateTask(taskId, userId); // 被委派人处理任务,注意这里不是完成 taskService.resolveTask(taskId,variables);
-
完成当前任务
less// 完成请假申请任务 for (Task task : tasks) { System.out.println("Current Task: " + task.getName()); taskService.complete(task.getId()); }