【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)

  • 24
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoneWalker、

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值