diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java index f79aa6d87..b29e68110 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -193,4 +193,19 @@ public class SysTenantController extends BaseController { return R.ok("同步租户字典成功"); } + /** + * 同步租户参数配置 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @Log(title = "租户管理", businessType = BusinessType.INSERT) + @Lock4j + @GetMapping("/syncTenantConfig") + public R syncTenantConfig() { + if (!TenantHelper.isEnable()) { + return R.fail("当前未开启租户模式"); + } + tenantService.syncTenantConfig(); + return R.ok("同步租户参数配置成功"); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java index f69782902..1c763e0ec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -1,9 +1,9 @@ package org.dromara.system.service; -import org.dromara.system.domain.vo.SysTenantVo; -import org.dromara.system.domain.bo.SysTenantBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; import java.util.Collection; import java.util.List; @@ -84,4 +84,9 @@ public interface ISysTenantService { * 同步租户字典 */ void syncTenantDict(); + + /** + * 同步租户参数配置 + */ + void syncTenantConfig(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java index 4442157a9..efbb040d5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -508,4 +508,60 @@ public class SysTenantServiceImpl implements ISysTenantService { } } + /** + * 同步租户参数配置 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void syncTenantConfig() { + // 查询超管 所有参数配置 + List configList = TenantHelper.ignore(() -> configMapper.selectList()); + + // 所有租户参数配置 + Map> configMap = StreamUtils.groupByKey(configList, TenantEntity::getTenantId); + + // 默认租户字典类型列表 + List defaultConfigList = configMap.get(TenantConstants.DEFAULT_TENANT_ID); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId) + .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { + return Convert.toStr(x); + }); + // 待入库的字典类型和字典数据 + List saveConfigList = new ArrayList<>(); + // 待同步的租户编号(用于清除对于租户的字典缓存) + Set syncTenantIds = new HashSet<>(); + // 循环所有租户,处理需要同步的数据 + for (String tenantId : tenantIds) { + // 排除默认租户 + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + continue; + } + // 根据默认租户的字典类型进行数据同步 + for (SysConfig config : defaultConfigList) { + // 获取当前租户的字典类型列表 + List typeList = StreamUtils.toList(configMap.get(tenantId), SysConfig::getConfigKey); + if (!typeList.contains(config.getConfigKey())) { + SysConfig type = BeanUtil.toBean(config, SysConfig.class); + type.setConfigId(null); + type.setTenantId(tenantId); + type.setCreateTime(null); + type.setUpdateTime(null); + syncTenantIds.add(tenantId); + saveConfigList.add(type); + } + } + } + TenantHelper.ignore(() -> { + if (CollUtil.isNotEmpty(saveConfigList)) { + configMapper.insertBatch(saveConfigList); + } + }); + for (String tenantId : syncTenantIds) { + TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_CONFIG)); + } + } + }