我们目前分为4中状态:未签收、办理中、运行中、已完成。
查询到任务或者流程实例后要显示在页面,这个时候需要添加业务数据,最终结果就是业务和流程的并集,请参考6.2。
5.1 未签收(Task)
此类任务针对于把Task分配给一个角色时,例如部门领导,因为部门领导角色可以指定多个人所以需要先签收再办理,术语:抢占式
对应的API查询:
/** * 获取未签收的任务查询对象 * @param userId 用户ID */ @Transactional(readOnly = true) public TaskQuery createUnsignedTaskQuery(String userId) { TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()) .taskCandidateUser(userId); return taskCandidateUserQuery; }
5.2 办理中(Task)
此类任务数据类源有两种:
签收后的,5.1中签收后就应该为办理中状态
节点指定的是具体到一个人,而不是角色
对应的API查询:
/** * 获取正在处理的任务查询对象 * @param userId 用户ID */ @Transactional(readOnly = true) public TaskQuery createTodoTaskQuery(String userId) { TaskQuery taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId); return taskAssigneeQuery; }
5.3 运行中(ProcessInstance)
说白了就是没有结束的流程,所有参与过的人都应该可以看到这个实例,但是Activiti的API没有可以通过用户查询的方法,这个只能自己用hack的方式处理了,我目前还没有处理。
从表ACT_RU_EXECUTION中查询数据。
对应的API查询:
/** * 获取未经完成的流程实例查询对象 * @param userId 用户ID */ @Transactional(readOnly = true) public ProcessInstanceQuery createUnFinishedProcessInstanceQuery(String userId) { ProcessInstanceQuery unfinishedQuery = runtimeService.createProcessInstanceQuery().processDefinitionKey(getProcessDefKey()) .active(); return unfinishedQuery; }
5.4 已完成(HistoricProcessInstance)
已经结束的流程实例。
从表ACT_HI_PROCINST中查询数据。
/** * 获取已经完成的流程实例查询对象 * @param userId 用户ID */ @Transactional(readOnly = true) public HistoricProcessInstanceQuery createFinishedProcessInstanceQuery(String userId) { HistoricProcessInstanceQuery finishedQuery = historyService.createHistoricProcessInstanceQuery() .processDefinitionKey(getProcessDefKey()).finished(); return finishedQuery; }
5.5 查询时和业务关联
提示:之前在业务对象添加了PROCESS_INSTANCE_ID字段
思路:现在可以利用这个字段查询了,不管是Task还是ProcessInstance都可以得到流程实例ID,可以根据流程实例ID查询实体然后把流程对象设置到实体的一个属性中由Action或者Controller输出到前台。
代码请参考: https://gist.github.com/2183557