下文先介绍下用户任务的办理相关操作
用户任务分类:
分为4中状态:未签收/待办理、已签收/办理中、运行中/办理中、已完成/已办结
首先,我们要了解下 TaskService 这个服务的作用:
从类 org.activiti.engine.impl.ServiceImpl 继承的字段
所有已实现的接口:TaskService
TaskService taskService = processEngine.getTaskService();
这边定义了几个通用的变量:
String userId = "Ypp";
String userGroup = new String["Ypp1","Ypp101"];
那么流程开启之后,如何能让下一个办理人取得待办任务呢?
通过下面几种的方法,将取得指定签收人/办理人的待办数据
单人待签收/待办理
List tasks = taskService.createTaskQuery().taskCandidateUser(userId).list();
用户组待签收/待办理
List tasks = taskService.createTaskQuery().taskCandidateGroup(userGroup).list();
进行签收操作,也就是将要接收办理这个任务
这边可以使用循环,也可以通过其他方法,常用的是先加载一个任务待办列表到页面上,签收任务传递后台一个taskId
task.getId() = taskId
// 完成签收这个时候就任务Task的Assignee属性就有了值
taskService.claim(task.getId(), userId);
已经签收过的任务列表,某种意义上我理解为真正的办理人
List tasks = taskService.createTaskQuery().taskAssignee(userId).list();
通过 1、未签收/待办理 中取得需要办理的任务Task之后
// 调用 task.getId() = taskId 完成任务的办理,taskService服务自动流转到下一个办理节点
taskService.complete(task.getId());
// taskService.complete()方法 提供了重载,提供了3种方式供你选择
complete(String taskId)
complete(String taskId, Map variables)
complete(String taskId, Map variables, boolean localScope)
如果更深的了解如何流转的,可以查看源码
任务并不一定要先签收再办理,可以直接到待办理中,而不是待签收中
可以把
taskService.claim(task.getId(), userId);
替换为
setAssignee(String taskId, String userId);
经过以上步骤,任务已经在办理中状态了。
任务的已完成(调用过complete方法)是指当前待办的任务状态,而非整个流程实例的完成状态
流程中数据使用到 historyService 服务
查询指定用户发起的流程 (流程历史 用户发起 )
下面的3种方法:
historyService.createHistoricProcessInstanceQuery()
.finished()
.startedBy(name)
.orderByProcessInstanceStartTime()
.desc()
.listPage(firstResult, maxResults);
查询指定用户参与的流程信息 (流程历史 用户参与 )
historyService.createHistoricProcessInstanceQuery()
.involvedUser(name)
.orderByProcessInstanceStartTime()
.desc()
.listPage(firstResult, maxResults);
查询指定流程的任务流转路径 (流程历史 任务流转路经)
historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceEndTime()
.asc()
.list();
查看流程是否完整的运行完毕方法也有好几种:
for (HistoricActivityInstance hai : hais) {
//如果下面的方法返回不是空,那就是已办结
hai.getEndTime();
}
//查看ACT_RU_TASK表
Long long = taskService.createTaskQuery().processInstanceId("processInstanceId").taskId("taskId").count();
//如果long为空,那么也是办结了
taskService.createTaskQuery()查询条件是可选的
可以是
taskService.createTaskQuery().processInstanceId("processInstanceId");
taskService.createTaskQuery().taskId("taskId");
或者其他更多条件
流程在流转中对于当前办理人/组和签收人/组来说,都是可以进行动态调整变化的
需要对程序进行特殊处理,添加监听或者其他方法
得到用户组待签收
TaskService taskService = processEngine.getTaskService();
单人待签收
List tasks = taskService.createTaskQuery().taskCandidateUser(userId).list();
List tasks = taskService.createTaskQuery().taskCandidateGroup(userGroup).list();
for (Task task : tasks) {
// 签收
taskService.claim(task.getId(), userId);
}
//得到用户待办
tasks = taskService.createTaskQuery().taskAssignee(userId).list();
for (Task task : tasks) {
//办理
taskService.complete(task.getId());
}
//顺便查看历史看看
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(procId)
.singleResult();