Camunda常用接口汇总

举报
LoneWalker、 发表于 2023/08/15 14:39:32 2023/08/15
1.7k 0 0
【摘要】 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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。