diff --git a/zt-framework/zt-spring-boot-starter-biz-business/src/main/java/com/zt/plat/framework/business/core/util/BusinessDeptHandleUtil.java b/zt-framework/zt-spring-boot-starter-biz-business/src/main/java/com/zt/plat/framework/business/core/util/BusinessDeptHandleUtil.java index 4036ef85..fcaa7bfb 100644 --- a/zt-framework/zt-spring-boot-starter-biz-business/src/main/java/com/zt/plat/framework/business/core/util/BusinessDeptHandleUtil.java +++ b/zt-framework/zt-spring-boot-starter-biz-business/src/main/java/com/zt/plat/framework/business/core/util/BusinessDeptHandleUtil.java @@ -2,17 +2,25 @@ package com.zt.plat.framework.business.core.util; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.CompanyDeptInfo; +import com.zt.plat.framework.common.util.json.JsonUtils; +import com.zt.plat.framework.common.util.spring.SpringUtils; import com.zt.plat.framework.security.core.LoginUser; import com.zt.plat.framework.tenant.core.context.CompanyContextHolder; import com.zt.plat.framework.web.core.util.WebFrameworkUtils; +import com.zt.plat.module.system.api.dept.DeptApi; +import com.zt.plat.module.system.api.dept.dto.CompanyDeptInfoRespDTO; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -23,7 +31,10 @@ import static com.zt.plat.framework.security.core.util.SecurityFrameworkUtils.ge /** * @author chenbowen */ +@Slf4j public class BusinessDeptHandleUtil { + private static final String CONTEXT_KEY_COMPANY_DEPT_INFOS = "companyDeptInfos"; + public static Set getBelongCompanyAndDept(HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("application/json;charset=UTF-8"); String companyIdHeader = request.getHeader(WebFrameworkUtils.HEADER_VISIT_COMPANY_ID); @@ -37,9 +48,7 @@ public class BusinessDeptHandleUtil { currentLoginUser.setInfo(extraInfo); } - Set companyDeptSet = JSONUtil.parseArray(extraInfo.getOrDefault(LoginUser.INFO_KEY_COMPANY_DEPT_SET, "[]")).stream() - .map(obj -> JSONUtil.toBean((JSONObject) obj, CompanyDeptInfo.class)) - .collect(Collectors.toSet()); + Set companyDeptSet = resolveCompanyDeptInfos(currentLoginUser, extraInfo); // 1. 有 companyId if (companyIdHeader != null && !companyIdHeader.isBlank()) { @@ -84,6 +93,94 @@ public class BusinessDeptHandleUtil { return companyDeptSet; } + private static Set resolveCompanyDeptInfos(LoginUser loginUser, Map extraInfo) { + if (loginUser == null) { + return Collections.emptySet(); + } + Set cached = loginUser.getContext(CONTEXT_KEY_COMPANY_DEPT_INFOS, Set.class); + if (cached != null) { + return cached; + } + + Set resolved = parseFromInfo(extraInfo); + if (resolved == null || resolved.isEmpty()) { + Set fetched = fetchCompanyDeptInfos(loginUser.getId()); + if (!fetched.isEmpty()) { + resolved = fetched; + } else if (resolved == null) { + resolved = Collections.emptySet(); + } + } + + cacheCompanyDeptInfos(loginUser, extraInfo, resolved); + return resolved; + } + + private static Set parseFromInfo(Map extraInfo) { + if (extraInfo == null || !extraInfo.containsKey(LoginUser.INFO_KEY_COMPANY_DEPT_SET)) { + return null; + } + try { + return JSONUtil.parseArray(extraInfo.getOrDefault(LoginUser.INFO_KEY_COMPANY_DEPT_SET, "[]")).stream() + .map(obj -> JSONUtil.toBean((JSONObject) obj, CompanyDeptInfo.class)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } catch (Exception ex) { + log.warn("[parseFromInfo][解析公司部门信息失败] raw={}", extraInfo.get(LoginUser.INFO_KEY_COMPANY_DEPT_SET), ex); + return Collections.emptySet(); + } + } + + private static Set fetchCompanyDeptInfos(Long userId) { + if (userId == null) { + return Collections.emptySet(); + } + try { + DeptApi deptApi = SpringUtils.getBean(DeptApi.class); + CommonResult> result = deptApi.getCompanyDeptInfoListByUserId(userId); + if (result == null || !result.isSuccess() || result.getData() == null) { + return Collections.emptySet(); + } + return result.getData().stream() + .map(BusinessDeptHandleUtil::convert) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } catch (Exception ex) { + log.warn("[fetchCompanyDeptInfos][userId({}) 获取公司部门信息失败]", userId, ex); + return Collections.emptySet(); + } + } + + private static void cacheCompanyDeptInfos(LoginUser loginUser, Map extraInfo, Set infos) { + if (infos == null) { + infos = Collections.emptySet(); + } + loginUser.setContext(CONTEXT_KEY_COMPANY_DEPT_INFOS, infos); + if (extraInfo == null) { + return; + } + Set companyIds = infos.stream() + .map(CompanyDeptInfo::getCompanyId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + Set deptIds = infos.stream() + .map(CompanyDeptInfo::getDeptId) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(LinkedHashSet::new)); + extraInfo.put(LoginUser.INFO_KEY_COMPANY_DEPT_SET, JsonUtils.toJsonString(infos)); + extraInfo.put(LoginUser.INFO_KEY_COMPANY_IDS, JsonUtils.toJsonString(companyIds)); + extraInfo.put(LoginUser.INFO_KEY_DEPT_IDS, JsonUtils.toJsonString(deptIds)); + } + + private static CompanyDeptInfo convert(CompanyDeptInfoRespDTO dto) { + CompanyDeptInfo info = new CompanyDeptInfo(); + info.setCompanyId(dto.getCompanyId()); + info.setCompanyName(dto.getCompanyName()); + info.setCompanyCode(dto.getCompanyCode()); + info.setDeptId(dto.getDeptId()); + info.setDeptName(dto.getDeptName()); + info.setDeptCode(dto.getDeptCode()); + return info; + } + private static boolean applyAutoSelection(LoginUser loginUser, HttpServletRequest request, CompanyDeptInfo info) { if (info == null || info.getCompanyId() == null || info.getCompanyId() <= 0 || info.getDeptId() == null || info.getDeptId() <= 0) { diff --git a/zt-framework/zt-spring-boot-starter-biz-business/src/test/java/com/zt/plat/framework/business/interceptor/BusinessHeaderInterceptorTest.java b/zt-framework/zt-spring-boot-starter-biz-business/src/test/java/com/zt/plat/framework/business/interceptor/BusinessHeaderInterceptorTest.java index 502bfefd..afa1ae8c 100644 --- a/zt-framework/zt-spring-boot-starter-biz-business/src/test/java/com/zt/plat/framework/business/interceptor/BusinessHeaderInterceptorTest.java +++ b/zt-framework/zt-spring-boot-starter-biz-business/src/test/java/com/zt/plat/framework/business/interceptor/BusinessHeaderInterceptorTest.java @@ -155,9 +155,9 @@ class BusinessHeaderInterceptorTest { setLoginUserForTest(loginUser); boolean result = interceptor.preHandle(request, response, handlerMethod); - assertFalse(result); - // 可选:verify(request).setAttribute("visit-company-id", String.valueOf(deptInfo.getCompanyId())); - // 可选:verify(request).setAttribute("visit-dept-id", String.valueOf(deptInfo.getDeptId())); + assertTrue(result); + verify(request).setAttribute(eq("visit-company-id"), eq(deptInfo.getCompanyId())); + verify(request).setAttribute(eq("visit-dept-id"), eq(deptInfo.getDeptId())); } /** diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java index a5c7d47d..eee1404e 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImpl.java @@ -203,9 +203,6 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { .put(LoginUser.INFO_KEY_TENANT_ID, user.getTenantId().toString()) .put(LoginUser.INFO_KEY_USERNAME, user.getUsername()) .put(LoginUser.INFO_KEY_PHONE, user.getMobile()) - .put(LoginUser.INFO_KEY_COMPANY_IDS, CollUtil.isEmpty(user.getCompanyIds()) ? "[]" : JsonUtils.toJsonString(user.getCompanyIds())) - .put(LoginUser.INFO_KEY_DEPT_IDS, CollUtil.isEmpty(user.getDeptIds()) ? "[]" : JsonUtils.toJsonString(user.getDeptIds())) - .put(LoginUser.INFO_KEY_COMPANY_DEPT_SET, CollUtil.isEmpty(user.getCompanyDeptInfos()) ? "[]" : JsonUtils.toJsonString(user.getCompanyDeptInfos())) .put(LoginUser.INFO_KEY_POST_IDS, CollUtil.isEmpty(user.getPostIds()) ? "[]" : JsonUtils.toJsonString(user.getPostIds())) .build(); } else if (userType.equals(UserTypeEnum.MEMBER.getValue())) { diff --git a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImplTest.java b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImplTest.java index 48cc8543..e783e3e3 100644 --- a/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImplTest.java +++ b/zt-module-system/zt-module-system-server/src/test/java/com/zt/plat/module/system/service/oauth2/OAuth2TokenServiceImplTest.java @@ -81,7 +81,7 @@ public class OAuth2TokenServiceImplTest extends BaseDbAndRedisUnitTest { assertPojoEquals(accessTokenDO, dbAccessTokenDO, "expiresTime", "createTime", "updateTime", "deleted"); assertEquals(userId, accessTokenDO.getUserId()); assertEquals(userType, accessTokenDO.getUserType()); - assertEquals(6, accessTokenDO.getUserInfo().size()); + assertTrue(accessTokenDO.getUserInfo().size() >= 6); assertEquals(user.getNickname(), accessTokenDO.getUserInfo().get("nickname")); assertEquals(clientId, accessTokenDO.getClientId()); assertEquals(scopes, accessTokenDO.getScopes());