基础使用方法
流程部署
- 前端传递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引擎是分开的;比如请假表中有一条数据:
为了让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.