BPM API

可以使用 Flowable API 与流程引擎交互。API 支持以编程的方式启动流程实例、完成任务以及执行各种查询,例如,获取用户的所有任务或者获取流程定义中激活的实例。

有两种方式获取 Flowable 服务:

  • 使用 ProcessEngines 作为起点:

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
    RuntimeService runtimeService = processEngine.getRuntimeService();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    TaskService taskService = processEngine.getTaskService();
  • 在 bean 中直接注入服务,因为服务也是作为 Spring bean 注册的:

    @Component("sample_MyCustomBean")
    public class MyCustomBean {
    
        @Autowired
        private RuntimeService runtimeService;

扩展组件提供 BpmTaskService 服务,该服务继承自 Flowable 中的 TaskService下面 有使用示例。

编程式启动流程

下面示例中,流程在常规实体编辑界面中使用 RuntimeService 编程式启动:

@Autowired
private RuntimeService runtimeService;

@Subscribe("commitAndCloseBtn")
public void onCommitAndCloseBtnClick(Button.ClickEvent event) {
    Customer customer = getEditedEntity();
    String name = customer.getName();
    Map<String, Object> params = new HashMap<>();
    params.put("customer", customer); (1)
    params.put("name", name); (2)
    runtimeService.startProcessInstanceByKey( (3)
            "new-customer", (4)
            params); (5)
}
1 将编辑实体作为流程变量传入,使用 customer 变量名。
2 将客户的名称也作为字符串类型的流程变量传入。
3 RuntimeService 用于启动流程。
4 new-customer 是流程定义键值。
5 传入流程变量 map。

获取用户任务列表

下面示例展示如何获取当前认证用户的激活任务列表:

@Autowired
private TaskService taskService;

@Autowired
private CurrentAuthentication currentAuthentication;

public List<Task> getCurrentUserTasks() {
    return taskService.createTaskQuery() (1)
            .processDefinitionKey("approval") (2)
            .taskAssignee(currentAuthentication.getUser().getUsername()) (3)
            .active()
            .orderByTaskCreateTime()
            .desc()
            .list();
}
1 使用 TaskService 获取任务列表。
2 搜索 approval 流程的任务。
3 搜索分配给当前用户的任务。

获取流程实例列表

下面示例展示如何获取与指定 Order 实体相关的 approval 定义的流程实例列表:

@Autowired
private RuntimeService runtimeService;

public List<ProcessInstance> getActiveProcessInstances() {
    return runtimeService.createProcessInstanceQuery() (1)
            .processDefinitionKey("approval") (2)
            .variableValueEquals("orderId", "N-1") (3)
            .active()
            .list();
}
1 使用 RuntimeService 获取任务列表。
2 搜索 approval 流程的实例。
3 通过指定的 orderId 流程变量搜索流程实例。

使用 BpmTaskService

BpmTaskService 继承自 TaskService 并添加一个用于完成带有输出的任务:

void completeTaskWithOutcome(String taskId, String outcomeId, Map<String, Object> processVariables);

可以在 Spring 组件中注入该服务:

@Autowired
private BpmTaskService bpmTaskService;

或者使用 ProcessEngines 类:

BpmTaskService bpmTaskService = (BpmTaskService) ProcessEngines
        .getDefaultProcessEngine()
        .getTaskService();