🐛 BPM:多租户的工作流隔离

This commit is contained in:
YunaiV 2023-12-30 09:38:01 +08:00
parent b5e19c63f7
commit 9a03f1a796
5 changed files with 23 additions and 3 deletions

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.framework.tenant.core.context; package cn.iocoder.yudao.framework.tenant.core.context;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.DocumentEnum; import cn.iocoder.yudao.framework.common.enums.DocumentEnum;
import com.alibaba.ttl.TransmittableThreadLocal; import com.alibaba.ttl.TransmittableThreadLocal;
@ -21,7 +22,7 @@ public class TenantContextHolder {
private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>(); private static final ThreadLocal<Boolean> IGNORE = new TransmittableThreadLocal<>();
/** /**
* 获得租户编号 * 获得租户编号
* *
* @return 租户编号 * @return 租户编号
*/ */
@ -29,6 +30,16 @@ public class TenantContextHolder {
return TENANT_ID.get(); return TENANT_ID.get();
} }
/**
* 获得租户编号 String
*
* @return 租户编号
*/
public static String getTenantIdStr() {
Long tenantId = getTenantId();
return StrUtil.toStringOrNull(tenantId);
}
/** /**
* 获得租户编号如果不存在则抛出 NullPointerException 异常 * 获得租户编号如果不存在则抛出 NullPointerException 异常
* *

View File

@ -3,6 +3,7 @@ package cn.iocoder.yudao.framework.flowable.config;
import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter; import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncListenableTaskExecutor;
@ -17,6 +18,7 @@ public class YudaoFlowableConfiguration {
* 如果不创建会导致项目启动时Flowable 报错的问题 * 如果不创建会导致项目启动时Flowable 报错的问题
*/ */
@Bean @Bean
@ConditionalOnMissingBean
public AsyncListenableTaskExecutor taskExecutor() { public AsyncListenableTaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(8); executor.setCorePoolSize(8);
@ -40,4 +42,5 @@ public class YudaoFlowableConfiguration {
registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER); registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER);
return registrationBean; return registrationBean;
} }
} }

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.*;
import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert; import cn.iocoder.yudao.module.bpm.convert.definition.BpmModelConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
@ -71,7 +72,8 @@ public class BpmModelServiceImpl implements BpmModelService {
modelQuery.modelCategory(pageVO.getCategory()); modelQuery.modelCategory(pageVO.getCategory());
} }
// 执行查询 // 执行查询
List<Model> models = modelQuery.orderByCreateTime().desc() List<Model> models = modelQuery.modelTenantId(TenantContextHolder.getTenantIdStr())
.orderByCreateTime().desc()
.listPage(PageUtils.getStart(pageVO), pageVO.getPageSize()); .listPage(PageUtils.getStart(pageVO), pageVO.getPageSize());
// 获得 Form Map // 获得 Form Map
@ -107,6 +109,7 @@ public class BpmModelServiceImpl implements BpmModelService {
// 创建流程定义 // 创建流程定义
Model model = repositoryService.newModel(); Model model = repositoryService.newModel();
BpmModelConvert.INSTANCE.copy(model, createReqVO); BpmModelConvert.INSTANCE.copy(model, createReqVO);
model.setTenantId(TenantContextHolder.getTenantIdStr());
// 保存流程定义 // 保存流程定义
repositoryService.saveModel(model); repositoryService.saveModel(model);
// 保存 BPMN XML // 保存 BPMN XML

View File

@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.PageUtils; import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionListReqVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageItemRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionPageReqVO;
@ -124,6 +126,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
Deployment deploy = repositoryService.createDeployment() Deployment deploy = repositoryService.createDeployment()
.key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory()) .key(createReqDTO.getKey()).name(createReqDTO.getName()).category(createReqDTO.getCategory())
.addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes()) .addBytes(createReqDTO.getKey() + BPMN_FILE_SUFFIX, createReqDTO.getBpmnBytes())
.tenantId(TenantContextHolder.getTenantIdStr())
.deploy(); .deploy();
// 设置 ProcessDefinition category 分类 // 设置 ProcessDefinition category 分类
@ -234,6 +237,7 @@ public class BpmProcessDefinitionServiceImpl implements BpmProcessDefinitionServ
definitionQuery.active(); definitionQuery.active();
} }
// 执行查询 // 执行查询
definitionQuery.processDefinitionTenantId(TenantContextHolder.getTenantIdStr());
List<ProcessDefinition> processDefinitions = definitionQuery.list(); List<ProcessDefinition> processDefinitions = definitionQuery.list();
if (CollUtil.isEmpty(processDefinitions)) { if (CollUtil.isEmpty(processDefinitions)) {
return Collections.emptyList(); return Collections.emptyList();

View File

@ -1 +0,0 @@
package cn.iocoder.yudao.module.bpm.service.task;