From 328b61b252d818a226844ad4afc7eb6f356ada9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 7 Jul 2025 01:11:31 +0000 Subject: [PATCH] =?UTF-8?q?!726=20update=20=E4=BC=98=E5=8C=96=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=AD=97=E5=85=B8=E5=90=8C=E6=AD=A5=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=20*=20update=20=E4=BC=98=E5=8C=96=E5=AD=97=E5=85=B8=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=80=BB=E8=BE=91=E4=BB=A3=E7=A0=81=E5=B9=B6=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysTenantServiceImpl.java | 99 +++++++++++-------- 1 file changed, 56 insertions(+), 43 deletions(-) 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 ca088607b..4442157a9 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 @@ -414,12 +414,15 @@ public class SysTenantServiceImpl implements ISysTenantService { dictTypeList.addAll(dictTypeMapper.selectList()); dictDataList.addAll(dictDataMapper.selectList()); }); - Map> typeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); - Map>> typeDataMap = StreamUtils.groupBy2Key( - dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); - // 管理租户字典数据 - List defaultTypeMap = typeMap.get(TenantConstants.DEFAULT_TENANT_ID); - Map> defaultTypeDataMap = typeDataMap.get(TenantConstants.DEFAULT_TENANT_ID); + // 所有租户字典类型 + Map> dictTypeMap = StreamUtils.groupByKey(dictTypeList, TenantEntity::getTenantId); + // 所有租户字典数据 + Map>> dictDataMap = StreamUtils.groupBy2Key(dictDataList, TenantEntity::getTenantId, SysDictData::getDictType); + + // 默认租户字典类型列表 + List defaultDictTypeList = dictTypeMap.get(TenantConstants.DEFAULT_TENANT_ID); + // 默认租户字典数据 + Map> defaultDictDataMap = dictDataMap.get(TenantConstants.DEFAULT_TENANT_ID); // 获取所有租户编号 List tenantIds = baseMapper.selectObjs( @@ -427,57 +430,67 @@ public class SysTenantServiceImpl implements ISysTenantService { .eq(SysTenant::getStatus, SystemConstants.NORMAL), x -> { return Convert.toStr(x); }); + // 待入库的字典类型和字典数据 List saveTypeList = new ArrayList<>(); List saveDataList = new ArrayList<>(); - Set set = new HashSet<>(); + // 待同步的租户编号(用于清除对于租户的字典缓存) + Set syncTenantIds = new HashSet<>(); + // 循环所有租户,处理需要同步的数据 for (String tenantId : tenantIds) { + // 排除默认租户 if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { continue; } - for (SysDictType dictType : defaultTypeMap) { - List typeList = StreamUtils.toList(typeMap.get(tenantId), SysDictType::getDictType); - List dataList = defaultTypeDataMap.get(dictType.getDictType()); + // 根据默认租户的字典类型进行数据同步 + for (SysDictType dictType : defaultDictTypeList) { + // 获取当前租户的字典类型列表 + List typeList = StreamUtils.toList(dictTypeMap.get(tenantId), SysDictType::getDictType); + // 根据字典类型获取默认租户的字典数据 + List defaultDictDataList = defaultDictDataMap.get(dictType.getDictType()); + // 排除不需要同步的字典数据 + Set excludeDictDataSet = CollUtil.newHashSet(); + // 处理 存在type不存在data 的情况 if (typeList.contains(dictType.getDictType())) { - List dataListTenant = typeDataMap.get(tenantId).get(dictType.getDictType()); - Map map = StreamUtils.toIdentityMap(dataListTenant, SysDictData::getDictValue); - for (SysDictData dictData : dataList) { - if (!map.containsKey(dictData.getDictValue())) { - SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); - // 设置字典编码为 null - data.setDictCode(null); - data.setTenantId(tenantId); - data.setCreateTime(null); - data.setUpdateTime(null); - data.setCreateDept(null); - data.setCreateBy(null); - data.setUpdateBy(null); - set.add(tenantId); - saveDataList.add(data); - } - } + // 获取租户字典数据 + Optional.ofNullable(dictDataMap.get(tenantId)) + // 获取租户当前字典类型的字典数据 + .map(tenantDictDataMap -> tenantDictDataMap.get(dictType.getDictType())) + // 保存字典数据项的字典键值,用于判断数据是否需要同步 + .map(data -> StreamUtils.toSet(data, SysDictData::getDictValue)) + // 添加到排除集合中 + .ifPresent(excludeDictDataSet::addAll); } else { + // 同步字典类型 SysDictType type = BeanUtil.toBean(dictType, SysDictType.class); type.setDictId(null); type.setTenantId(tenantId); type.setCreateTime(null); type.setUpdateTime(null); - set.add(tenantId); + syncTenantIds.add(tenantId); saveTypeList.add(type); - if (CollUtil.isNotEmpty(dataList)) { - // 筛选出 dictType 对应的 data - for (SysDictData dictData : dataList) { - SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); - // 设置字典编码为 null - data.setDictCode(null); - data.setTenantId(tenantId); - data.setCreateTime(null); - data.setUpdateTime(null); - data.setCreateDept(null); - data.setCreateBy(null); - data.setUpdateBy(null); - set.add(tenantId); - saveDataList.add(data); + } + + // 默认租户字典数据不为空再去处理 + if (CollUtil.isNotEmpty(defaultDictDataList)) { + // 提前优化排除判断if条件语句,对于 && 并联条件,该优化可以避免不必要的 excludeDictDataSet.contains() 函数调用 + boolean isExclude = CollUtil.isNotEmpty(excludeDictDataSet); + // 筛选出 dictType 对应的 data + for (SysDictData dictData : defaultDictDataList) { + // 排除不需要同步的字典数据 + if (isExclude && excludeDictDataSet.contains(dictData.getDictValue())) { + continue; } + SysDictData data = BeanUtil.toBean(dictData, SysDictData.class); + // 设置字典编码为 null + data.setDictCode(null); + data.setTenantId(tenantId); + data.setCreateTime(null); + data.setUpdateTime(null); + data.setCreateDept(null); + data.setCreateBy(null); + data.setUpdateBy(null); + syncTenantIds.add(tenantId); + saveDataList.add(data); } } } @@ -490,7 +503,7 @@ public class SysTenantServiceImpl implements ISysTenantService { dictDataMapper.insertBatch(saveDataList); } }); - for (String tenantId : set) { + for (String tenantId : syncTenantIds) { TenantHelper.dynamic(tenantId, () -> CacheUtils.clear(CacheNames.SYS_DICT)); } }