部署流程定义
//这种就是加载项目resources目录下的one.bpmn文件Deploymentdeploy=repositoryService.createDeployment() .name(name) .addClasspathResource("one.bpmn") .deploy(); //这种就可以使用自己拼接的xml字符串Deploymentdeploy=repositoryService.createDeployment() .name(definitionName) .addString(名称+".bpmn",resource) .deploy();
开启流程实例
可以通过流程定义ID或者流程定义Key,第二个参数是业务ID,第三个参数是流程变量,都可以不给。
//通过KeyruntimeService.startProcessInstanceByKey(StringprocessDefinitionKey, StringbusinessKey, Map<String, Object>variables) //通过IDruntimeService.startProcessInstanceById(StringprocessDefinitionId, StringbusinessKey, Map<String, Object>variables)
比如我这里设置发起人为第一个节点的审批人
那么在流程定义的xml里是有这样一个参数的
查询我的待办
List<Task>taskList=taskService.createTaskQuery().taskAssignee(userId).list();
查询我的已办
List<HistoricTaskInstance>historicTaskInstances=historyService.createHistoricTaskInstanceQuery().taskAssignee(userId).finished().list();
审批通过
上一步查询返回的待办任务中可以获取到taskId
//添加审批人 identityService.setAuthenticatedUserId(assignee); //添加审批意见,可在Act_Hi_Comment里的message查询到//三个参数分别为待办任务ID,流程实例ID,审批意见taskService.createComment(taskId, processInstanceId, comment); //任务完成 也就是审批通过taskService.complete(taskId);
审批转办
也就是把自己的待办任务转给别人【传任务ID和处理人】
taskService.delegateTask(taskId, assignee);
查询流程状态
processInstance不等于null 说明流程还在运行中,反之流程已经结束了。
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
删除流程定义
//通过流程定义Key删除 repositoryService.deleteProcessDefinitions().byKey(processDefinitionKey).delete(); //通过流程定义ID删除 repositoryService.deleteProcessDefinitions().byIds("1111").delete();
查询环节状态
对于单实例环节,只需要判断是否有结束时间,有就说明已完成,没有就是运行中
HistoricActivityInstance instance = historyService.createHistoricActivityInstanceQuery().activityId("111").processInstanceId(processInstanceId).singleResult(); Date endTime = instance1.getEndTime();
或者转为HistoricActivityInstanceEntity 判断状态码是否等于4,等于4则是完成
HistoricActivityInstanceEntity activityEntity = (HistoricActivityInstanceEntity) instance; if(4 == activityEntity.getActivityInstanceState()){ }else{ }
对于多实例环节,需要判断多实例主体,所传activityId也需要拼接。
首先我们查询出流程实例中所有的环节实例
List<HistoricActivityInstance> activityInstanceList = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .orderByHistoricActivityInstanceStartTime() .asc() .list(); for (HistoricActivityInstance instance : activityInstanceList) { HistoricActivityInstanceEntity activityEntity = (HistoricActivityInstanceEntity) instance; if("multiInstanceBody".equals(activityEntity.getActivityType())){ //多实例节点 int endIndex = activityEntity.getActivityId().indexOf("#"); activityId = activityEntity.getActivityId().substring(0,endIndex); if (4 == activityEntity.getActivityInstanceState()){ //已完成 }else{ //运行中 } } }
发起人撤回
撤回对于流程来说还是同一条流程,由于我这里的发起人节点ID是固定的,所以直接写死了。不同的项目场景中也各有不同,总之思路就是查询当前环节实例,对应取消相关任务,找到目标环节的ID即可实现。【这里运用好还可以实现,审批环节撤回,不过都是单实例环节,不包括会签。以及实现驳回等操作,将会在后续博文中记录实战操作】
//获取当前环节实例 ActivityInstance activity = runtimeService.getActivityInstance(processInstanceId); runtimeService.createProcessInstanceModification(processInstanceId) //关闭相关任务 .cancelActivityInstance(activity.getId()) .setAnnotation("发起人撤回") //启动目标活动节点 .startBeforeActivity("root") .execute();
添加审批意见
在通过、驳回等操作前执行
taskService.createComment(taskId, processInstanceId, "审核无误,允许执行");
查询历史任务
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()//历史任务表查询 .processInstanceId(processInstanceId)//使用流程实例ID查询 .list();
紧接着就可以遍历拿到每一步的审批意见
for(HistoricTaskInstance hti:htiList){//任务ID String taskId = hti.getId();//获取批注信息 List<Comment> taskComments = taskService.getTaskComments(taskId); }
更多实战应用请关注后续文章