Bläddra i källkod

调整优化菜单查询逻辑

hanzhengyi 5 dagar sedan
förälder
incheckning
069761d151

+ 35 - 26
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserTenantServiceImpl.java

@@ -23,8 +23,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -87,38 +88,46 @@ public class SysUserTenantServiceImpl extends AbstractCrudService<SysUserTenantM
      * 根据用户查询企业下拉框
      */
     @Override
-    @Transactional
+    @Transactional(readOnly = true)
     public List<SysTenant> getTenantByUser(Long userId) {
         LambdaQueryWrapper<SysUserTenant> queryWrapper = Wrappers.lambdaQuery();
         queryWrapper.eq(SysUserTenant::getUserId, userId);
         List<SysUserTenant> userTenants = this.list(queryWrapper);
-        List<Integer> tenantIdList = new ArrayList<>();
-        List<SysTenant> tenantList = new ArrayList<>();
-        List<SysTenantConfig> tenantConfigList = new ArrayList<>();
+        if (CollectionUtils.isEmpty(userTenants)) {
+            return new ArrayList<>();
+        }
+
+        List<Integer> tenantIdList = userTenants.stream()
+                .map(SysUserTenant::getTenantId)
+                .collect(Collectors.toList());
+
+        // 租户列表(仅启用状态)
         LambdaQueryWrapper<SysTenant> queryWrapper1 = Wrappers.lambdaQuery();
+        queryWrapper1.in(SysTenant::getId, tenantIdList).eq(SysTenant::getStatus, 0);
+        List<SysTenant> tenantList = sysTenantService.list(queryWrapper1);
+        if (CollectionUtils.isEmpty(tenantList)) {
+            return tenantList;
+        }
+
+        // 租户配置(用于 logo)
         LambdaQueryWrapper<SysTenantConfig> queryWrapper2 = Wrappers.lambdaQuery();
-        if (CollectionUtils.isNotEmpty(userTenants)) {
-            for (int i = 0; i < userTenants.size(); i++) {
-                tenantIdList.add(userTenants.get(i).getTenantId());
+        queryWrapper2.in(SysTenantConfig::getTenantId, tenantIdList);
+        List<SysTenantConfig> tenantConfigList = sysTenantConfigMapper.selectList(queryWrapper2);
+
+        // 用 Map 做 O(1) 查找,避免嵌套循环
+        Map<Integer, SysUserTenant> tenantIdToUserTenant = userTenants.stream()
+                .collect(Collectors.toMap(SysUserTenant::getTenantId, ut -> ut, (a, b) -> a));
+        Map<Integer, SysTenantConfig> tenantIdToConfig = tenantConfigList.stream()
+                .collect(Collectors.toMap(SysTenantConfig::getTenantId, c -> c, (a, b) -> a));
+
+        for (SysTenant tenant : tenantList) {
+            SysUserTenant ut = tenantIdToUserTenant.get(tenant.getId());
+            if (ut != null) {
+                tenant.setIsDefault(ut.getIsDefault());
             }
-            queryWrapper1.in(SysTenant::getId, tenantIdList)
-                    .eq(SysTenant::getStatus, 0);
-            tenantList = sysTenantService.list(queryWrapper1);
-            queryWrapper2.in(SysTenantConfig::getTenantId, tenantIdList);
-            tenantConfigList = sysTenantConfigMapper.selectList(queryWrapper2);
-            if (CollectionUtils.isNotEmpty(tenantList)) {
-                for (int k = 0; k < tenantList.size(); k++) {
-                    for (int j = 0; j < userTenants.size(); j++) {
-                        if (userTenants.get(j).getTenantId().equals(tenantList.get(k).getId())){
-                            tenantList.get(k).setIsDefault(userTenants.get(j).getIsDefault());
-                        }
-                    }
-                    for (int l = 0; l < tenantConfigList.size(); l++) {
-                        if (tenantConfigList.get(l).getTenantId().equals(tenantList.get(k).getId())){
-                            tenantList.get(k).setTenantLogo(tenantConfigList.get(l).getMiddleLogo());
-                        }
-                    }
-                }
+            SysTenantConfig config = tenantIdToConfig.get(tenant.getId());
+            if (config != null) {
+                tenant.setTenantLogo(config.getMiddleLogo());
             }
         }
         return tenantList;