camunda 常用功能代码

文章目录

  • 环境
  • 部署流程定义
  • 开启流程实例
  • 删除流程定义
  • 我发起的流程
  • 查询我的代办
  • 查询我的已办
  • 查询当前任务所有的候选人
  • 组任务
  • 任务委托
  • 任务转办
  • 任务完成
  • 添加审批意见
  • 删除流程实例
  • 重启流程实例
  • 流程实例修改
  • 流程挂起与激活
  • 获取操作日志
  • 获取流程图xml
  • 获取流程节点


环境

camunda 7.18.0
spring boot 2.7.3
jdk 1.8
mysql

部署流程定义

//加载项目resources目录下的bpmn文件
Deployment deploy = repositoryService.createDeployment()
                .name("部署的第一个流程") // 定义部署文件的名称
                .addClasspathResource("process.bpmn") // 绑定需要部署的流程文件
                .deploy();// 部署流程

act_re_deployment表中增加一条部署记录,以及在act_re_procdef表中增加一流程定义。
act_re_deployment表
act_re_procdef表

开启流程实例

可以通过流程定义ID或者流程定义Key
第二个参数是业务ID,第三个参数是流程变量,都可以省略不给。

//发起人
identityService.setAuthenticatedUserId(userId);
// 根据key启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);
// 根据id启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceById(InstanceId);

删除流程定义

repositoryService.deleteProcessDefinition(processDefinationId);

我发起的流程

List<HistoricProcessInstance> ProcessInstanceList = historyService.createHistoricProcessInstanceQuery()
              .startedBy(userId)
              //.active()     //活跃
              //.finished()  //完结
              .list();

查询我的代办

根据办理人

List<Task> list = taskService.createTaskQuery()
                .taskAssignee(userId)
                .list();

根据候选人

		List list = taskService.createTaskQuery().taskCandidateUser(assignee).processInstanceId(processId).list();

查询我的已办

List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                .taskAssignee(userId)
                .finished()
                .list();

查询act_hi_taskinst表,结果包括正常审核完成的和因流程修改、撤销结束的,还有一个delete状态(比如或签节点有A,B,C三个审批人,A审批同意后,该节点通过,那么A对应的任务它的DELETE_REASON是completed,而B、C的就是deleted。或者是直接取消任务活动)
可以根据DELETE_REASON_字段区分一下。
camunda 常用功能代码_第1张图片

查询当前任务所有的候选人

List<IdentityLink> linksForTask = taskService.getIdentityLinksForTask(taskId);

组任务

查询组任务

List<Task> list = taskService.createTaskQuery()
                .taskCandidateGroup("super")
                .list();

组任务需要人签收,指定具体的ASSIGNEE_,表示指定的人已经明确要处理当前任务了,组成员的人已经查询不到这个任务了,且也无法进行签收。

taskService.claim(taskId,userId); //签收任务
taskService.claim(taskId,null); //归还任务

更新 act_ru_task表中ASSIGNEE_字段

任务委托

任务委派是委派人将当前的任务交给被委派人进行审批,解决任务后又重新回到委派人身上,当被委派人直接完成任务时,任务就不会回到委派人。

taskService.delegateTask(taskId,userId);

此时act_ru_task表中任务实例增加一个owner,办理人变成了被委派人。DELEGATION_字段的值为PENDING(等待)。
在这里插入图片描述在这里插入图片描述
委派人此时查询任务,根据办理人查询时查询不到的,此时任务的办理人时被委派人。所以委派人查询任务是根据owner

List<Task> list = taskService.createTaskQuery()
                .taskOwner(userId)
                .list();

被委托人解决任务

taskService.resolveTask(taskId);

此时任务并没有被完成,只是回到了委派人。DELEGATION_字段显示为RESOLVED(已解决)。
在这里插入图片描述
然后委托人完成任务。

任务转办

identityService.setAuthenticatedUserId(userId);
//任务转办
taskService.setAssignee(taskId,assignee);

可以在表act_hi_op_logact_hi_identitylink中查到记录。

任务完成

taskService.complete(taskId,variables);
//第一个参数是任务Id,第二个是流程变量 可以不给

添加审批意见

添加后可在act_hi_comment表里查询的到

//添加审批人 
identityService.setAuthenticatedUserId(user);
//添加审批意见,三个参数分别为待办任务ID,流程实例ID,审批意见
taskService.createComment(taskId,InstanceId,comment);

删除流程实例

删除运行中的流程实例,会变成历史流程实例

runtimeService.deleteProcessInstance(InstanceId,"发起人撤销了流程"); //第一个参数是流程实例Id,第二个是删除原因,

在历史表act_hi_procinst'DELETE_REASON_字段记录删除原因信息。

重启流程实例

runtimeService.restartProcessInstances(ProcessDefinitionId)//流程定义Id
                .startBeforeActivity("Activity_03je48a")  //活动Id
                .processInstanceIds(InstanceId) //流程实例Id
                .execute();

流程实例修改

identityService.setAuthenticatedUserId(user);//不设没有操作日志
runtimeService.createProcessInstanceModification(InstanceId)//流程实例Id
                .cancelAllForActivity(activityId)//运行中的活动Id
                .startBeforeActivity(beforeActivityId)//要 到的活动Id
                .setAnnotation(user+"取回/驳回了活动实例")//注释
                .execute();

可以在act_hi_op_log中可以查到操作记录及注释
在这里插入图片描述

流程挂起与激活

流程实例挂起后,仅可以更改变量、添加属性。完成、转办、修改审批人都是不支持的。


//挂起
runtimeService.suspendProcessInstanceById("InstanceId");
//激活
runtimeService.activateProcessInstanceById("InstanceId");

获取操作日志


List<UserOperationLogEntry> operationLog = historyService.createUserOperationLogQuery()
					.processInstanceId(processId)
					.list()

获取流程图xml

ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
InputStream b = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
BufferedInputStream bis = new BufferedInputStream(b);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while(result != -1) {
	buf.write((byte) result);
	result = bis.read();
}
bis.close();
String str = buf.toString("UTF-8");

获取流程节点

BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(processDefinitionId);
//获取所有UserTask类型的节点
Collection<UserTask> userTaskCollection = bpmnModelInstance.getModelElementsByType(UserTask.class);
//获取所有网关类型的节点
Collection<Gateway> gatewayCollection = bpmnModelInstance.getModelElementsByType(Gateway.class);
FlowNode element = bpmnModelInstance.getModelElementById(activityId);
//入线
Collection<SequenceFlow> sequenceFlow=element.getIncoming();
//出线
Collection<SequenceFlow> sequenceFlow=element.getOutgoing()

FlowNode element1 =sequenceFlow.getSource();

你可能感兴趣的:(Camunda,java)