基础使用方法

流程部署

  • 前端传递bpmn文件
String filename = file.getOriginalFilename();
InputStream inputStream = file.getInputStream();
Deployment deploy = repositoryService.createDeployment().addInputStream(filename, inputStream)
        .name("name").category("category")
        .key("key")
        .deploy();
  • 后端自己加载bpmn等静态文件
repositoryService.createDeployment().addClasspathResource("diagram/holiday.bpmn")
        .addClasspathResource("diagram/holiday.png").name("请假流程").category("category")
        .key("key")
        .deploy();

部署成功后,以下表发生了变化:
act_re_deployment(流程部署表)
act_re_procdef(流程定义表)
act_ge_bytearray(静态文件存储表)

启动流程实例

ProcessInstance instance = runtimeService.startProcessInstanceByKey("流程key")
instance.getDeploymentId();	//获取部署id
instance.getId();		//获取实例id

此时,以下表发生了变化:
act_hi_actinst(流程信息记录表)
act_hi_identitylink(参加者记录表)
act_hi_procinst(流程实例信息记录表)
act_hi_taskinst(任务实例记录表)
act_ru_identitylink(运行时参加者表)
act_ru_execution(运行时执行表)
act_ru_task(运行时任务表)

查询任务列表

TaskQuery taskQuery = taskService.createTaskQuery();
List<Task> allTasks = taskQuery.taskAssignee("张三")
        .processDefinitionKey(definitionKey)
        .processInstanceBusinessKeyLike(businessKey)
        .orderByTaskCreateTime()
        .desc()
        .listPage((pageNum - 1) * pageSize, pageSize);
task.getProcessInstanceId();    //实例id
task.getId();   //任务id
task.getName(); //任务name
task.getAssignee(); //责任人

以上的信息均可从act_hi_taskinst任务实例表中看出

审批流程

taskService.complete(task.getId());

此时act_hi_taskinst表中任务增加了ENDTIME,说明此节点已完成。同时,增加了一条下一步任务的数据,只有开始时间没有结束时间。
act_hi_actinst记录了节点的信息
act_hi_identitylink记录了参加者
act_ru_execution执行表增加了相应的记录
act_ru_identitylink记录了运行时的参加者
act_ru_task任务表,变更了当前任务的记录删除了老任务,增加了新任务

流程定义信息查询

ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday").orderByProcessDefinitionVersion()
        .desc().list();
for (ProcessDefinition processDefinition : holiday) {
        processDefinition.getId();      //流程定义ID、以下是key、name、版本
        processDefinition.getKey();
        processDefinition.getName();
        processDefinition.getVersion();
        }

流程删除

repositoryService.deleteDeployment("1");

参数为流程部署的id
若有流程没有走完,则无法删除。若需要强制删除,第二个参数加true

repositoryService.deleteDeployment("1",true);

相关的流程也会被一并删除

获取静态资源

ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
processDefinitionQuery.processDefinitionKey("holiday");
ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
String deploymentId = processDefinition.getDeploymentId();
InputStream pngIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
InputStream bpmnIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());       

获取历史信息

HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
historicActivityInstanceQuery.processInstanceId("2501");
List<HistoricActivityInstance> list = historicActivityInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();

这样就可以获取实例id为2501的所有节点的历史信息了

进阶

业务与activiti关联

业务有很多表,比如请假表、调岗表、调薪表等等,但这些表与activiti引擎是分开的;比如请假表中有一条数据:
截屏20210315 下午4.19.36.png
为了让activiti的实例审批节点的人知道谁要请假、请多久、事由是什么,所以需要将业务表的id与activiti的act_ru_execution表的businesskey联系在一起。

加入businessKey,启动流程实例

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", "这里是businessKey");

流程定义的激活与刮起

//流程定义对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
        .processDefinitionKey("holiday").singleResult();
//判断此流程是否暂停
boolean suspended = processDefinition.isSuspended();
//若暂停则激活
if (suspended) {
    repositoryService.activateProcessDefinitionById(processDefinition.getId(), true, null);
    } else {
    //若激活则刮起
    repositoryService.suspendProcessDefinitionById(processDefinition.getId(), true, null);
    }

若流程定义被暂停挂起,则无法启动新的流程实例,同时未完成的流程实例也将全部暂停

流程实例的激活与挂起

如果只想激活或者挂起单个的流程实例,则:

//获取流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
        .processInstanceId("2501").singleResult();
//判断是否挂起
boolean suspended = processInstance.isSuspended();
//如果挂起则激活
if (suspended) {
    runtimeService.activateProcessInstanceById(processInstance.getId());
    } else {
    //如果激活则挂起
    runtimeService.suspendProcessInstanceById(processInstance.getId());
    }

挂起流程实例,可以看做审批节点人选择了拒绝

个人任务(设置审批人)

在bmpn文件中设置审批人占位符如$、$、$

//设定节点审批人参数
Map<String, Object> map = new HashMap<>();
map.put("assignee0", "zhangsan");
map.put("assignee1", "lisi");
map.put("assignee2", "wangwu");
//启动实例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday", map);

Q.E.D.


To see the world as it is and to love it.