Activiti入门参考文档

一、环境搭建

略…

二、表说明

  • ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)

  • ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快

  • ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等

  • ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等

  • ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件

  • 资源库流程规则表

    • act_re_deployment 部署信息表
    • act_re_model 流程设计模型部署表
    • act_re_procdef 流程定义数据表
  • 运行时数据库表

    • act_ru_execution 运行时流程执行实例表
    • act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
    • act_ru_task 运行时任务节点表
    • act_ru_variable 运行时流程变量数据表
    • act_ru_event_subscr 运行时事件
    • act_ru_job 运行时作业
  • 历史数据库表

    • act_hi_actinst 历史节点表
    • act_hi_attachment 历史附件表(历史的流程附件)
    • act_hi_comment 历史意见表(历史的说明性信息)
    • act_hi_identitylink 历史流程人员表(历史的流程运行过程中用户关系)
    • act_hi_detail 历史详情表,提供历史变量的查询(历史的流程运行中的细节信息)
    • act_hi_procinst 历史流程实例表
    • act_hi_taskinst 历史任务实例表
    • act_hi_varinst 历史变量表(历史的流程运行中的变量信息)
  • 组织机构表

    • act_id_group 用户组信息表
    • act_id_info 用户扩展信息表
    • act_id_membership 用户与用户组对应信息表
    • act_id_user 用户信息表
      这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
  • 通用数据表

    扫描二维码关注公众号,回复: 12659531 查看本文章
    • act_ge_bytearray 通用的流程定义和流程资源
    • act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

三、操作

1.部署

部署时会在act_re_deployment表中添加一条部署信息记录(一条流程),并且在act_re_procdef表中会添加一条流程定义信息记录(一个任务不同用户),act_ge_bytearray表中会保存资源数据,act_ge_property表中会保存流程信息

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
                .name("出差申请")
                .addClasspathResource("bpmn/evection.bpmn")
                .addClasspathResource("bpmn/evection.png")
                .deploy();

2.启动

任务启动后会修改act_ge_property表中的NAME_为next.dbid的值,act_hi_actinst表中添加两条节点记录,act_hi_procinst表中添加一条流程实例记录,act_hi_taskinst表中添加一条任务实例记录,act_ru_execution表中添加一条运行实例记录,在act_ru_task表中添加一条正在执行的任务记录

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("myEvection");
instance.getProcessDefinitionId(); //流程定义ID
instance.getId(); //流程实例ID
instance.getActivityId(); //当前活动ID

3.查询

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> taskList = taskService.createTaskQuery()
    .processDefinitionKey("myEvection") //流程ID
    .taskAssignee("zhangsan") //要查询的负责人
    .list(); //可以使用singleResult()获取一条记录
for (Task task : taskList) {
    
    
    task.getProcessDefinitionId(); //流程实例ID
    task.getId(); //任务ID
    task.getAssignee(); //任务负责人
    task.getName(); //任务名称
}

4.任务完成

当前任务完成后会自动进行下一个任务(在act_ru_task表中删除之前任务,添加新任务记录),在act_hi_taskinst表和act_hi_actinst中会修改完成任务的完成时间,并添加下一个任务记录,在act_hi_identitylink表和act_ru_identitylink表中添加一条当前执行任务的人员记录,更新的还有act_ru_execution

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
taskService.complete("2505"); //填写任务ID

5.查询所有流程

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取ProcessDefinitionQuery对象
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> list = definitionQuery.processDefinitionKey("myEvection")
    .orderByProcessDefinitionVersion()
    .desc()
    .list();
for (ProcessDefinition processDefinition : list) {
    
    
    System.out.println("流程定义ID:"+processDefinition.getId());
    System.out.println("流程定义名称:"+processDefinition.getName());
    System.out.println("流程定义Key:"+processDefinition.getKey());
    System.out.println("流程定义版本:"+processDefinition.getVersion());
    System.out.println("流程部署ID:"+processDefinition.getDeploymentId());
}

6.删除流程

将部署时对应的记录删除,不会影响历史表记录

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.deleteDeployment("1"); //填写流程部署ID

如果是如上代码,当删除的流程未执行完成,则会报错,可以在deleteDeployment方法中添加一个boolean值true来解决,如下代码

repositoryService.deleteDeployment("1",true);

7.下载资源文件

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
    .processDefinitionKey("myEvection")
    .singleResult();
String deploymentId = processDefinition.getDeploymentId(); //获取部署ID
String pngName = processDefinition.getDiagramResourceName(); //png名称
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName); //通过ID和名获取图片资源
String bpmnName = processDefinition.getResourceName(); //获取bpmn名
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName); //通过ID和名获取bpmn
File pngFile = new File("d:/evection.png");
File bpmnFile = new File("d:/evection.bpmn");
FileOutputStream outputStream = new FileOutputStream(pngFile);
FileOutputStream outputStream1 = new FileOutputStream(bpmnFile);
//利用commons-io依赖工具,对输入输出流进行转换
IOUtils.copy(pngInput, outputStream);
IOUtils.copy(bpmnInput, outputStream1);
outputStream.close();
outputStream1.close();
pngInput.close();
bpmnInput.close();

8.历史查询

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//查询条件,根据某一个字段查询
instanceQuery.processInstanceId("2501");
//根据开始时间升序排序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
List<HistoricActivityInstance> list = instanceQuery.list();
for (HistoricActivityInstance activityInstance : list) {
    
    
    System.out.println(activityInstance.getActivityId());
    System.out.println(activityInstance.getActivityName());
}

9.添加businessKey

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection", "1001");
System.out.println("businessKey:"+instance.getBusinessKey()); //检查是否已添加businessKey

10.流程定义全部挂起、激活

挂起与激活会使act_ru_task表和act_re_procdef表和act_ru_execution表中的SUSPENSION_STATE_值改变(1是激活,2是挂起)

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取流程定义查询对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
    .processDefinitionKey("myEvenction")
    .singleResult();
//获取当前流程定义的实例是否为全部挂起
boolean suspended = processDefinition.isSuspended();
//获取流程定义的ID
String definitionId = processDefinition.getId();
//如果是挂起,改为激活
if(suspended){
    
    
    //参数1:流程ID,参数2:是否激活,参数3:激活时间
    repositoryService.activateProcessDefinitionById(definitionId,true,null);
    System.out.println("流程"+definitionId+"已激活");
}else{
    
    
    //如果是激活,改为挂起,参数1:流程ID,参数2:是否暂停,参数3:暂停时间
    repositoryService.suspendProcessDefinitionById(definitionId,true,null);
    System.out.println("流程"+definitionId+"已挂起");
}

11.流程实例单个挂起、激活

挂起与激活会使act_ru_task表和act_ru_execution表中对应一行数据的SUSPENSION_STATE_值改变(1是激活,2是挂起)

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
//获取流程实例对象
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
    .processInstanceId("27501")
    .singleResult();
boolean suspended = instance.isSuspended();
String instanceId = instance.getId();
if(suspended){
    
    
    runtimeService.activateProcessInstanceById(instanceId);
    System.out.println("流程实例"+instanceId+"已激活");
}else{
    
    
    runtimeService.suspendProcessInstanceById(instanceId);
    System.out.println("流程实例"+instanceId+"已挂起");
}

12.任务完成2

当任务所在流程被挂起时,该任务无法被完成,只有在激活后才能够完成

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
    .processInstanceId("27501")
    .taskAssignee("zhangsan")
    .singleResult();
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("流程任务ID:"+task.getId());
System.out.println("负责人:"+task.getAssignee());
System.out.println("任务名称:"+task.getName());
taskService.complete(task.getId()); //根据任务ID完成任务

猜你喜欢

转载自blog.csdn.net/jl15988/article/details/111830245