查询流程定义
查询流程定义的信息代码:
@Test public void testDeployQuery(){ ProcessEngine processEngine = configuration.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); /*ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); ProcessDefinition processDefinition = processDefinitionQuery.deploymentId("1").singleResult();*/ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .deploymentId("1") .singleResult(); System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId()); System.out.println("processDefinition.getName() = " + processDefinition.getName()); System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription()); System.out.println("processDefinition.getId() = " + processDefinition.getId()); }
结果如下:
挂起和激活
部署的流程默认的状态为激活,如果我们暂时不想使用该定义的流程,那么可以挂起该流程。当然该流程定义下边所有的流程实例全部暂停。
流程定义为挂起状态,该流程定义将不允许启动新的流程实例,同时该流程定义下的所有的流程实例都将全部挂起暂停执行。
/** * 挂起流程 */ @Test public void test05(){ // 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId("holiday:1:4") .singleResult(); // 获取流程定义的状态 boolean suspended = processDefinition.isSuspended(); System.out.println("suspended = " + suspended); if(suspended){ // 表示被挂起 System.out.println("激活流程定义"); repositoryService.activateProcessDefinitionById("holiday:1:4",true,null); }else{ // 表示激活状态 System.out.println("挂起流程"); repositoryService.suspendProcessDefinitionById("holiday:1:4",true,null); } }
具体的实现其实就是更新了流程定义表中的字段
而且通过REV_字段来控制数据安全,也是一种乐观锁的体现了,如果要启动一个已经挂起的流程就会出现如下的错误
启动流程实例
然后我们来看看启动流程实例的过程。实现代码如下:
/** * 启动流程实例 */ @Test public void testRunProcess(){ // 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 启动流程实例通过 RuntimeService 对象 RuntimeService runtimeService = processEngine.getRuntimeService(); // 构建流程变量 Map<String,Object> variables = new HashMap<>(); variables.put("employee","张三") ;// 谁申请请假 variables.put("nrOfHolidays",3); // 请几天假 variables.put("description","工作累了,想出去玩玩"); // 请假的原因 // 启动流程实例,第一个参数是流程定义的id ProcessInstance processInstance = runtimeService .startProcessInstanceById("holiday:1:4", variables);// 启动流程实例 // 输出相关的流程实例信息 System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId()); System.out.println("流程实例的ID:" + processInstance.getId()); System.out.println("当前活动的ID:" + processInstance.getActivityId()); }
当我们启动了一个流程实例后,会在ACT_RU_*对应的表结构中操作,运行时实例涉及的表结构共10张:
- ACT_RU_DEADLETTER_JOB 正在运行的任务表
- ACT_RU_EVENT_SUBSCR 运行时事件
- ACT_RU_EXECUTION 运行时流程执行实例
- ACT_RU_HISTORY_JOB 历史作业表
- ACT_RU_IDENTITYLINK 运行时用户关系信息
- ACT_RU_JOB 运行时作业表
- ACT_RU_SUSPENDED_JOB 暂停作业表
- ACT_RU_TASK 运行时任务表
- ACT_RU_TIMER_JOB 定时作业表
- ACT_RU_VARIABLE 运行时变量表
启动一个流程实例的时候涉及到的表有
- ACT_RU_EXECUTION 运行时流程执行实例
- ACT_RU_IDENTITYLINK 运行时用户关系信息
- ACT_RU_TASK 运行时任务表
- ACT_RU_VARIABLE 运行时变量表
ACT_RU_EXECUTION表结构
字段 | 名称 | 备注 |
ID_ | 主键 | |
REV_ | 版本号 | |
PROC_INST_ID_ | 流程实例ID | |
BUSINESS_KEY_ | 业务主键ID | |
PARENT_ID_ | 父执行流的ID | |
PROC_DEF_ID_ | 流程定义的数据ID | |
SUPER_EXEC_ | ||
ROOT_PROC_INST_ID_ | 流程实例的root流程id | |
ACT_ID_ | 节点实例ID | |
IS_ACTIVE_ | 是否存活 | |
IS_CONCURRENT_ | 执行流是否正在并行 | |
IS_SCOPE_ | ||
IS_EVENT_SCOPE_ | ||
IS_MI_ROOT_ | ||
SUSPENSION_STATE_ | 流程终端状态 | |
CACHED_ENT_STATE_ | ||
TENANT_ID_ | 租户编号 | |
NAME_ | ||
START_TIME_ | 开始时间 | |
START_USER_ID_ | 开始的用户编号 | |
LOCK_TIME_ | 锁定时间 | |
IS_COUNT_ENABLED_ | ||
EVT_SUBSCR_COUNT_ | ||
TASK_COUNT_ | ||
JOB_COUNT_ | ||
TIMER_JOB_COUNT_ | ||
SUSP_JOB_COUNT_ | ||
DEADLETTER_JOB_COUNT_ | ||
VAR_COUNT_ | ||
ID_LINK_COUNT_ |
创建流程实例后对应的表结构的数据
ACT_RU_TASK 运行时任务表
字段 | 名称 | 备注 |
ID_ | 主键 | |
REV_ | 版本号 | |
EXECUTION_ID_ | 任务所在的执行流ID | |
PROC_INST_ID_ | 流程实例ID | |
PROC_DEF_ID_ | 流程定义数据ID | |
NAME_ | 任务名称 | |
PARENT_TASK_ID_ | 父任务ID | |
DESCRIPTION_ | 说明 | |
TASK_DEF_KEY_ | 任务定义的ID值 | |
OWNER_ | 任务拥有人 | |
ASSIGNEE_ | 被指派执行该任务的人 | |
DELEGATION_ | 委托人 | |
PRIORITY_ | 优先级 | |
CREATE_TIME_ | 创建时间 | |
DUE_DATE_ | 耗时 | |
CATEGORY_ | 类别 | |
SUSPENSION_STATE_ | 是否挂起 | 1代表激活 2代表挂起 |
TENANT_ID_ | 租户编号 | |
FORM_KEY_ | ||
CLAIM_TIME_ | 拾取时间 |
创建流程实例后对应的表结构的数据
ACT_RU_VARIABLE 运行时变量表
字段 | 名称 | 备注 |
ID_ | 主键 | |
REV_ | 版本号 | |
TYPE_ | 参数类型 | 可以是基本的类型,也可以用户自行扩展 |
NAME_ | 参数名称 | |
EXECUTION_ID_ | 参数执行ID | |
PROC_INST_ID_ | 流程实例ID | |
TASK_ID_ | 任务ID | |
BYTEARRAY_ID_ | 资源ID | |
DOUBLE_ | 参数为double,则保存在该字段中 | |
LONG_ | 参数为long,则保存在该字段中 | |
TEXT_ | 用户保存文本类型的参数值 | |
TEXT2_ | 用户保存文本类型的参数值 |
创建流程实例后对应的表结构的数据
ACT_RU_IDENTITYLINK 运行时用户关系信息
字段 | 名称 | 备注 |
ID_ | 主键 | |
REV_ | 版本号 | |
GROUP_ID_ | 用户组ID | |
TYPE_ | 关系数据类型 | assignee支配人(组)、candidate候选人(组)、owner拥有人,participant参与者 |
USER_ID_ | 用户ID | |
TASK_ID_ | 任务ID | |
PROC_INST_ID_ | 流程定义ID | |
PROC_DEF_ID_ | 属性ID |
创建流程实例后对应的表结构的数据:
处理流程
上面的流程已经流转到了zhangsan这个用户这里,然后可以开始审批了
// 获取流程引擎对象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery() .processDefinitionId("holiday:1:4") .taskAssignee("zhangsan") .singleResult(); // 添加流程变量 Map<String,Object> variables = new HashMap<>(); variables.put("approved",false); // 拒绝请假 // 完成任务 taskService.complete(task.getId(),variables);
在正常处理流程中涉及到的表结构
- ACT_RU_EXECUTION 运行时流程执行实例
- ACT_RU_IDENTITYLINK 运行时用户关系信息
- ACT_RU_TASK 运行时任务表
- ACT_RU_VARIABLE 运行时变量表