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
表中增加一流程定义。
可以通过流程定义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_
字段区分一下。
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_log
和act_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();
流程实例挂起后,仅可以更改变量、添加属性。完成、转办、修改审批人都是不支持的。
//挂起
runtimeService.suspendProcessInstanceById("InstanceId");
//激活
runtimeService.activateProcessInstanceById("InstanceId");
List<UserOperationLogEntry> operationLog = historyService.createUserOperationLogQuery()
.processInstanceId(processId)
.list()
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();