什麼是租戶
在多個系統同時使用同一套數據庫的流程引擎時,這些系統就是租戶
舉個例子:我現在有一個通用的流程引擎平臺,現在 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();
}
}