1. 程式人生 > 其它 >flowable 流程引擎API與服務

flowable 流程引擎API與服務

引擎API是與Flowable互動的最常用手段。總入口點是ProcessEngine。

1、RepositoryService很可能是使用Flowable引擎要用的第一個服務。這個服務提供了管理與控制部署(deployments)與流程定義(process definitions)的操作。管理靜態資訊,

2、RuntimeService用於啟動流程定義的新流程例項。

3、IdentityService很簡單。它用於管理(建立,更新,刪除,查詢……)組與使用者。

4、FormService是可選服務。也就是說Flowable沒有它也能很好地執行,而不必犧牲任何功能。

5、HistoryService暴露Flowable引擎收集的所有歷史資料。要提供查詢歷史資料的能力。

6、ManagementService通常在用Flowable編寫使用者應用時不需要使用。它可以讀取資料庫表與表原始資料的資訊,也提供了對作業(job)的查詢與管理操作。

7、DynamicBpmnService可用於修改流程定義中的部分內容,而不需要重新部署它。例如可以修改流程定義中一個使用者任務的辦理人設定,或者修改一個服務任務中的類名。

接下來使用之前的請假流程圖,上程式碼

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.idm.api.Group;
import org.flowable.idm.api.User;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;

/**
 * TestFlowable
 *
 * @Author fhadmin
 * @Date: 2021/10/17 23:35
 * @from fhadmin.cn
 */
@Slf4j
public class TestFlowable {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private HistoryService historyService;

    @Autowired
    private org.flowable.engine.TaskService taskService;

    @Autowired
    private org.flowable.engine.IdentityService identityService;

    public void createDeploymentZip() {
        /*
         * @Date: 2021/10/17 23:38
         * Step 1: 部署xml(壓縮到zip形式,直接xml需要配置相對路徑,麻煩,暫不用)
         */
        try {
            File zipTemp = new File("f:/leave_approval.bpmn20.zip");
            ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipTemp));
            Deployment deployment = repositoryService
                    .createDeployment()
                    .addZipInputStream(zipInputStream)
                    .deploy();
            log.info("部署成功:{}", deployment.getId());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        /*
         * @Date: 2021/10/17 23:40
         * Step 2: 查詢部署的流程定義
         */
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").list();
        List<ProcessDefinition> pages = repositoryService.createProcessDefinitionQuery().processDefinitionKey("leave_approval").listPage(1, 30);

        /*
         * @Date: 2021/10/17 23:40
         * Step 3: 啟動流程,建立例項
         */
        String processDefinitionKey = "leave_approval";//流程定義的key,對應請假的流程圖
        String businessKey = "schoolleave";//業務程式碼,根據自己的業務用
        Map<String, Object> variablesDefinition = new HashMap<>();//流程變數,可以自定義擴充
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variablesDefinition);
        log.info("啟動成功:{}", processInstance.getId());
        /*
         * @Date: 2021/10/17 23:40
         * Step 4: 查詢指定流程所有啟動的例項列表
         * 列表,或 分頁 刪除
         */
        List<Execution> executions = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").list();
        List<Execution> executionPages = runtimeService.createExecutionQuery().processDefinitionKey("leave_approval").listPage(1, 30);
//        runtimeService.deleteProcessInstance(processInstanceId, deleteReason); //刪除例項

        /*
         * @Date: 2021/10/17 23:40
         * Step 5: 學生查詢可以操作的任務,並完成任務
         */
        String candidateGroup = "stu_group"; //候選組 xml檔案裡面的 flowable:candidateGroups="stu_group"
        List<Task> taskList = taskService.createTaskQuery().taskCandidateGroup(candidateGroup).orderByTaskCreateTime().desc().list();
        for (Task task : taskList) {
            // 申領任務
            taskService.claim(task.getId(), "my");
            // 完成
            taskService.complete(task.getId());
        }

        /*
         * @Date: 2021/10/17 23:40
         * Step 6: 老師查詢可以操作的任務,並完成任務
         */
        String candidateGroupTe = "te_group"; //候選組 xml檔案裡面的 flowable:candidateGroups="te_group"
        List<Task> taskListTe = taskService.createTaskQuery().taskCandidateGroup(candidateGroupTe).orderByTaskCreateTime().desc().list();
        for (Task task : taskListTe) {
            // 申領任務
            taskService.claim(task.getId(), "myte");
            // 完成
            Map<String, Object> variables = new HashMap<>();
            variables.put("command","agree"); //攜帶變數,用於閘道器流程的條件判定,這裡的條件是同意
            taskService.complete(task.getId(), variables);
        }
        /*
         * @Date: 2021/10/18 0:17
         * Step 7: 歷史查詢,因為一旦流程執行完畢,活動的資料都會被清空,上面查詢的介面都查不到資料,但是提供歷史查詢介面
         */
        // 歷史流程例項
        List<HistoricProcessInstance> historicProcessList = historyService.createHistoricProcessInstanceQuery().processDefinitionKey("leave_approval").list();
        // 歷史任務
        List<HistoricTaskInstance> historicTaskList = historyService.createHistoricTaskInstanceQuery().processDefinitionKey("leave_approval").list();
        // 例項歷史變數 , 任務歷史變數
        // historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstanceId);
        // historyService.createHistoricVariableInstanceQuery().taskId(taskId);
        // *****************************************************分隔符********************************************************************
        // *****************************************************分隔符********************************************************************
        // 可能還需要的API
        // 移動任務,人為跳轉任務
        // runtimeService.createChangeActivityStateBuilder().processInstanceId(processInstanceId)
        //       .moveActivityIdTo(currentActivityTaskId, newActivityTaskId).changeState();

        // 如果在資料庫配置了分組和使用者,還會用到
        List<User> users = identityService.createUserQuery().list();    //使用者查詢,使用者id對應xml 裡面配置的使用者
        List<Group> groups = identityService.createGroupQuery().list(); //分組查詢,分組id對應xml 裡面配置的分組 如 stu_group,te_group 在表裡是id的值

        // 另外,每個查詢後面都可以拼條件,內建恁多查詢,包括模糊查詢,大小比較都有
    }
}