Camunda常用接口汇总
【摘要】 Camunda常用接口汇总
以下所有接口均为单租户情况下,多租户可查看专栏中的系列文章。
1、部署BPMN文件
camunda将后缀为 .bpmn20.xml或.bpmn 的文件视为bpmn文件。
//这种就是加载项目resources目录下的one.bpmn文件
Deployment deploy = repositoryService.createDeployment()
.name(name)
.addClasspathResource("one.bpmn")
.deploy();
//这种就可以使用自己拼接的xml字符串
Deployment deploy = repositoryService.createDeployment()
.name(definitionName)
.addString(名称+".bpmn",resource)
.deploy();
2、启动流程实例
两种方式,每种方式又提供了不同的重载方法,可以应对各种情况。有不懂的看看专栏文章或者评论区提问。
2.1指定版本
这种方式是使用给定流程定义id在流程定义的精确指定版本中启动一个新流程实例。
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//这里传入businessKey是方便后续可以只查某一类业务的待办
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,businessKey);
//传入一些参数
Map<String, Object> map = new HashMap<>(2);
map.put("initiator", processInitiator);
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId,businessKey,variables);
String processInstanceId = processInstance.getProcessInstanceId();
2.2最新版本
这种方式是在对应流程定义的对新版本中启动一个流程实例。
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId);
//这里传入businessKey是方便后续可以只查某一类业务的待办
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId,businessKey);
//传入一些参数
Map<String, Object> map = new HashMap<>(2);
map.put("initiator", processInitiator);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionId,businessKey,variables);
String processInstanceId = processInstance.getProcessInstanceId();
上述的传参在整个流程实例运行过程中都是可以获取到的,我们暂且称之为 全局参数。
3、查询待办
根据不同的业务指定人员来查询待办任务,比如:需要查询在合同签订业务中我的待办任务
List<Task> taskList = taskService.createTaskQuery()
.processInstanceBusinessKey(businessKey)
.taskAssignee(assignee)
.list();
//processInstanceBusinessKeyIn() 也就是多个业务key
注意:这里因为Camunda版本的问题,有的版本是不能直接返回得到的list,需要自己写个类转一下
4、完成待办
这个很简单,从上述查询结果中拿到taskId,直接调方法就可以了。
taskService.complete(taskId);
5、查询已办
这里需要根据不同的需求来处理,比如或签节点有A,B,C三个审批人,A审批同意后,该节点通过,那么A对应的任务它的DELETE_REASON是completed,而B、C的就是deleted。
严格意义上说B、C其实没有处理自己的待办任务,所以查询已办时应该排除。
List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery()
.processInstanceBusinessKey(businessKey)
.taskAssignee(assignee).finished().taskDeleteReason("completed").list();
6、转办
A把自己的待办任务转给B,这里除了传入taskId,还需要传入B的id。这里建议使用第二种,第一种按照官网的意思被委托人必须使用resolveTask(String)向任务所有者报告,这里存在一些权限的问题,当然我在使用过程中没加那些权限,所以可以正常使用。
taskService.delegateTask(taskId, userId);
taskService.setAssignee("1600669540055736416","10087");
比如把这个任务转办给用户10086
7、流程实例运行状态
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
//判断processInstance是否为null 是null就说明流程实例结束了
8、流程实例某节点上待办任务数
List<Task> taskList = taskService.createTaskQuery()
.processInstanceId("流程实例id")
.taskDefinitionKey("节点id").list();
//或者
List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId).taskDefinitionKey("节点id").unfinished().list();
9、流程实例某节点上所有的审批人
List<HistoricTaskInstance> taskList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId).taskDefinitionKey(nodeId).list();
//这里判空一下
Set<String> assigneeSet = taskList.stream().map(HistoricTaskInstance::getAssignee).collect(Collectors.toSet());
10、查询流程定义相关数据
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionId("流程定义id").singleResult();
//或者
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("流程定义key").processDefinitionVersion(版本号).singleResult();
.latestVersion()就是最新版本
11、流程实例的挂起与激活
流程实例挂起后,仅可以更改变量、添加属性。完成、转办、修改审批人都是不支持的,重新激活后就可以正常使用了。
//挂起
runtimeService.suspendProcessInstanceById("流程实例id");
//激活
runtimeService.activateProcessInstanceById("流程实例id");
12、重启流程实例
在流程实例终止后,其历史数据仍然存在,并且可以访问这些数据来恢复流程实例,前提是历史级别设置为FULL
runtimeService.restartProcessInstances("流程定义id")
.startAfterActivity("节点id")
.processInstanceIds("流程实例id")
.execute();
//startBeforeActivity(String activityId)
//startAfterActivity(String activityId)
//startTransition(String transitionId)
13、修改流程实例
虽然流程定义中已经定义了流程要按某种顺序执行,但有时需要灵活地再次启动活动或取消正在运行的活动。
//获取当前运行的环节实例
ActivityInstance activity = runtimeService.getActivityInstance("流程实例id");
runtimeService.createProcessInstanceModification("流程实例id")
.startBeforeActivity("节点id")
//设置参数
.setVariable("approver", "joe")
//取消正在运行的环节实例
.cancelAllForActivity(activity.getId())
.execute();
//startBeforeActivity(String activityId)
//startBeforeActivity(String activityId, String ancestorActivityInstanceId)
//startAfterActivity(String activityId)
//startAfterActivity(String activityId, String ancestorActivityInstanceId)
//startTransition(String transitionId)
//startTransition(String transition, String ancestorActivityInstanceId)
//cancelActivityInstance(String activityInstanceId)
//cancelTransitionInstance(String transitionInstanceId)
//cancelAllForActivity(String activityId)
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)