Flowable 6.6.0 BPMN使用者指南 - 17 高階用例 - 17.7 高階查詢API:執行時和歷史任務查詢之間的無縫切換

月滿閒庭發表於2021-01-05

《Flowable 6.6.0 BPMN使用者指南》

1. 入門
2. 配置
3 The Flowable API
4 Flowable 6.6.0 BPMN使用者指南 - (4)Spring整合
5 Spring Boot
6 部署
7 BPMN 2.0簡介
8 BPMN 2.0的構造
9 表單(Forms)
10 流程例項遷移
11 JPA
12 歷史(History)
13 身份管理(Identity management)
14 REST API
15 CDI整合
16 LDAP整合
17 高階用例

有關Flowable的更多文件,參見:

《Flowable文件大全》


17.7 高階查詢API:執行時和歷史任務查詢之間的無縫切換

One core component of any BPM user interface is the task list. Typically, end users work on open, runtime tasks, filtering their inbox with various setting. Often also the historic tasks need to be displayed in those lists, with similar filtering. To make that code-wise easier, the TaskQuery and HistoricTaskInstanceQuery both have a shared parent interface, which contains all common operations (and most of the operations are common).

This common interface is the org.flowable.engine.task.TaskInfoQuery class. Both org.flowable.engine.task.Task and org.flowable.engine.task.HistoricTaskInstance have a common superclass org.flowable.engine.task.TaskInfo (with common properties) which is returned from e.g. the list() method. However, Java generics are sometimes more harming than helping: if you want to use the TaskInfoQuery type directly, it would look like this:
TaskInfoQuery<? extends TaskInfoQuery<?,?>, ? extends TaskInfo> taskInfoQuery
Ugh, Right. To ‘solve’ this, a org.flowable.engine.task.TaskInfoQueryWrapper class that can be used to avoid the generics (the following code could come from REST code that returns a task list where the user can switch between open and completed tasks):

任何BPM使用者介面的一個核心元件是任務列表。通常,終端使用者處理開啟的執行時任務,使用各種設定過濾收件箱。通常,歷史任務也需要通過類似的過濾顯示在那些列表中。為了使程式碼更簡單,TaskQuery 和HistoricTaskInstanceQuery 都有一個共享的父介面,其中包含所有常用操作(大多數操作都是通用的)。

這個公共介面是 org.flowable.engine.task.TaskInfoQuery類。org.flowable.engine.task.Task和org.flowable.engine.task.HistoricTaskInstance 都有一個共同的超類org.flowable.engine.task.TaskInfo(具有公共屬性),它是從類似list()方法返回的。但是,Java泛型有時弊大於利:如果您想直接使用TaskInfoQuery 型別,它應該如下所示:

TaskInfoQuery<? extends TaskInfoQuery<?,?>, ? extends TaskInfo> taskInfoQuery
為了“解決”這個問題,可用org.flowable.engine.task.TaskInfoQueryWrapper類來避免泛型(以下程式碼可來自REST程式碼,該程式碼返回任務列表,使用者可以在開放的任務和已完成的任務之間切換):

TaskInfoQueryWrapper taskInfoQueryWrapper = null;
if (runtimeQuery) {
    taskInfoQueryWrapper = new TaskInfoQueryWrapper(taskService.createTaskQuery());
} else {
    taskInfoQueryWrapper = new TaskInfoQueryWrapper(historyService.createHistoricTaskInstanceQuery());
}

List<? extends TaskInfo> taskInfos = taskInfoQueryWrapper.getTaskInfoQuery().or()
    .taskNameLike("%k1%")
    .taskDueAfter(new Date(now.getTime() + (3 * 24L * 60L * 60L * 1000L)))
.endOr()
.list();

相關文章