Flowable 快速入門教程:租戶案例

什麼是租戶

在多個系統同時使用同一套數據庫的流程引擎時,這些系統就是租戶

舉個例子:我現在有一個通用的流程引擎平臺,現在 A,B 兩個系統接入平臺,那麼 A 系統就只能看到租戶爲 A 的流程,B 只能看到租戶爲 B 的流程

優點

提高了流程模型的複用性,比如我兩個系統都用這一個模型,那我直接根據租戶,生成兩個系統各自的流程定義即可,而不需要兩個模型

設置租戶

該方式是在流程模型發佈生成流程定義時候設置

repositoryService.createDeployment()
                    .name(modelData.getName())
                    .addBytes(processName, bpmnBytes)
                    // 設置租戶
                    .tenantId(tenantId)
                    .deploy();

在這裏插入圖片描述

更換租戶

/**
 * 更換流程定義租戶
 * @param deploymentId 部署ID
 * @param tenantId 新租戶
 * @return
 */
@PutMapping(value = "/changeProcessDefinedTenant/{deploymentId}/{tenantId}")
public String changeProcessDefinedTenant(@PathVariable(value = "deploymentId") String deploymentId, @PathVariable(value = "tenantId") String tenantId) {
    repositoryService.changeDeploymentTenantId(deploymentId, tenantId);
    return JsonUtil.toJSON(ErrorMsg.UPDATE_SUCCESS);
}

查詢租戶的定義與實例數據

tenantId 即租戶

// 租戶流程定義列表查詢
rrepositoryService.createProcessDefinitionQuery().processDefinitionTenantId(tenantId).list()

// 租戶流程實例列表查詢
runtimeService.createProcessInstanceQuery().processInstanceTenantId(tenantId).list()

如 Key 爲 a 的流程定義,就是由同一個模型生成的
在這裏插入圖片描述

批量查詢租戶列表

租戶畢竟是系統,如果我係統使用的是公共的一套用戶,這時一個用戶就有對應多個系統的情況,那麼查就要一次查多個租戶的數據

可惜,官方並沒有給出租戶相關數據的 IN 查詢,只能自己寫了,下面以流程實例的查詢爲例,附帶分頁

/**
 * 流程實例列表查詢
 * @param tenantList 租戶列表
 * @param page 頁面
 * @param limit 每頁條數
 * @return
 */
@PostMapping(value = "/getFlowinfo/{page}/{limit}")
public String getFlowinfo(@RequestBody List<String> tenantList, @PathVariable(name="page") Integer page,  @PathVariable(name="limit") Integer limit) {
    // 把租戶列表轉化爲逗號分隔的字符串
    String tenantIds = "\"" + Joiner.on("\",\"").join(tenantList) + "\"";
    Integer startIndex = (page - 1) * limit;
    String sql = "SELECT * FROM " + managementService.getTableName(ProcessInstance.class) +
            " WHERE ID_ = PROC_INST_ID_ " +
            "AND TENANT_ID_ IN ("+ tenantIds +") " +
            "ORDER BY START_TIME_ DESC ";
    // 獲取數據總條數
    Integer total = runtimeService.createNativeProcessInstanceQuery().sql(sql).list().size();
    // 拼接分頁
    sql = sql + "LIMIT "+ startIndex +","+ limit;
    // 獲取當前頁數據
    List<ProcessInstance> processInstanceList = runtimeService.createNativeProcessInstanceQuery().sql(sql).list();
    List<ProcessInstanceVo> list = new ArrayList<>();
    processInstanceList.forEach(processInstance -> list.add(new ProcessInstanceVo(processInstance)));
    // 分頁數據組裝,返回前臺
    PageEntity pageEntity = new PageEntity(page, limit, total);
    pageEntity.setData(list);
    return JsonUtil.toJSON(ErrorMsg.SUCCESS.setNewData(pageEntity));
}

ProcessInstanceVo

/**
 * ProcessInstanceVo
 * @author: linjinp
 * @create: 2020-01-02 14:15
 **/
@Data
public class ProcessInstanceVo {

    private String id;

    private String processDefinitionKey;

    private String processDefinitionId;

    private String businessKey;

    private String processDefinitionName;

    private Date startTime;

    private String deploymentId;

    private String description;

    private String name;

    private Integer processDefinitionVersion;

    private Map<String, Object> processVariables;

    private String startUserId;

    private String callbackId;

    private String callbackType;

    private String tenantId;

    private String localizedDescription;

    private String localizedName;

    private String processInstanceId;

    private String activityId;

    private String parentId;

    private String rootProcessInstanceId;

    private String superExecutionId;

    private Boolean isSuspended;

    private Boolean isEnded;

    public ProcessInstanceVo(){}

    public ProcessInstanceVo(ProcessInstance processInstance){
        id = processInstance.getId();
        processDefinitionKey = processInstance.getProcessDefinitionKey();
        processDefinitionId = processInstance.getProcessDefinitionId();
        businessKey = processInstance.getBusinessKey();
        processDefinitionName = processInstance.getProcessDefinitionName();
        startTime = processInstance.getStartTime();
        deploymentId = processInstance.getDeploymentId();
        description = processInstance.getDescription();
        name = processInstance.getName();
        processDefinitionVersion = processInstance.getProcessDefinitionVersion();
        processVariables = processInstance.getProcessVariables();
        startUserId = processInstance.getStartUserId();
        callbackId = processInstance.getCallbackId();
        callbackType = processInstance.getCallbackType();
        tenantId = processInstance.getTenantId();
        localizedDescription = processInstance.getLocalizedDescription();
        localizedName = processInstance.getLocalizedName();
        processInstanceId = processInstance.getProcessInstanceId();
        activityId = processInstance.getActivityId();
        parentId = processInstance.getParentId();
        rootProcessInstanceId = processInstance.getRootProcessInstanceId();
        superExecutionId = processInstance.getSuperExecutionId();
        isSuspended = processInstance.isSuspended();
        isEnded = processInstance.isEnded();
    }
}
發佈了103 篇原創文章 · 獲贊 387 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章