Commit 041d22344ba9d18cb60e10fa53d94a9db6f0433b
1 parent
9afefe9a
登录后缓存业务线及公司
Showing
14 changed files
with
211 additions
and
6 deletions
urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java
| @@ -24,6 +24,15 @@ public class OAuth2AccessTokenCheckRespDTO implements Serializable { | @@ -24,6 +24,15 @@ public class OAuth2AccessTokenCheckRespDTO implements Serializable { | ||
| 24 | */ | 24 | */ |
| 25 | private Integer userType; | 25 | private Integer userType; |
| 26 | /** | 26 | /** |
| 27 | + * 业务线 | ||
| 28 | + */ | ||
| 29 | + private String busiLine; | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * 公司id | ||
| 33 | + */ | ||
| 34 | + private Long companyId; | ||
| 35 | + /** | ||
| 27 | * 用户信息 | 36 | * 用户信息 |
| 28 | */ | 37 | */ |
| 29 | private Map<String, String> userInfo; | 38 | private Map<String, String> userInfo; |
urbanops-framework/urbanops-spring-boot-starter-mybatis/src/main/java/com/zteits/urbanops/framework/mybatis/config/BusinessLineSqlInterceptor.java
| 1 | package com.zteits.urbanops.framework.mybatis.config; | 1 | package com.zteits.urbanops.framework.mybatis.config; |
| 2 | 2 | ||
| 3 | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | 3 | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| 4 | +import com.baomidou.mybatisplus.core.toolkit.StringUtils; | ||
| 4 | import com.zteits.urbanops.framework.annotation.ProcessBusinessLine; | 5 | import com.zteits.urbanops.framework.annotation.ProcessBusinessLine; |
| 6 | +import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; | ||
| 5 | import lombok.extern.slf4j.Slf4j; | 7 | import lombok.extern.slf4j.Slf4j; |
| 6 | import org.apache.ibatis.cache.CacheKey; | 8 | import org.apache.ibatis.cache.CacheKey; |
| 7 | import org.apache.ibatis.executor.Executor; | 9 | import org.apache.ibatis.executor.Executor; |
| @@ -16,6 +18,7 @@ import org.apache.ibatis.session.RowBounds; | @@ -16,6 +18,7 @@ import org.apache.ibatis.session.RowBounds; | ||
| 16 | import org.springframework.stereotype.Component; | 18 | import org.springframework.stereotype.Component; |
| 17 | 19 | ||
| 18 | import java.lang.reflect.Method; | 20 | import java.lang.reflect.Method; |
| 21 | +import java.util.Arrays; | ||
| 19 | import java.util.HashSet; | 22 | import java.util.HashSet; |
| 20 | import java.util.Properties; | 23 | import java.util.Properties; |
| 21 | import java.util.Set; | 24 | import java.util.Set; |
| @@ -57,7 +60,10 @@ public class BusinessLineSqlInterceptor implements Interceptor { | @@ -57,7 +60,10 @@ public class BusinessLineSqlInterceptor implements Interceptor { | ||
| 57 | if (!isSkipAnnotation(invocation)) { | 60 | if (!isSkipAnnotation(invocation)) { |
| 58 | return invocation.proceed(); | 61 | return invocation.proceed(); |
| 59 | } | 62 | } |
| 60 | - | 63 | + String busiLine = SecurityFrameworkUtils.getBusiLine(); |
| 64 | + if (StringUtils.isEmpty(busiLine)) { | ||
| 65 | + return invocation.proceed(); | ||
| 66 | + } | ||
| 61 | // 1. 解析拦截参数 | 67 | // 1. 解析拦截参数 |
| 62 | Object[] args = invocation.getArgs(); | 68 | Object[] args = invocation.getArgs(); |
| 63 | MappedStatement ms = (MappedStatement) args[0]; | 69 | MappedStatement ms = (MappedStatement) args[0]; |
| @@ -85,8 +91,7 @@ public class BusinessLineSqlInterceptor implements Interceptor { | @@ -85,8 +91,7 @@ public class BusinessLineSqlInterceptor implements Interceptor { | ||
| 85 | 91 | ||
| 86 | // 3. 仅处理 SELECT/UPDATE/DELETE(INSERT 由自动填充处理) | 92 | // 3. 仅处理 SELECT/UPDATE/DELETE(INSERT 由自动填充处理) |
| 87 | if (SqlCommandType.SELECT.equals(sqlCommandType)) { | 93 | if (SqlCommandType.SELECT.equals(sqlCommandType)) { |
| 88 | - Set<String> businessLineSet = new HashSet<>();//UserContextHolder.getBusinessLine(); | ||
| 89 | - businessLineSet.add("yl"); | 94 | + Set<String> businessLineSet = new HashSet<>(Arrays.asList(busiLine.split(",")));//UserContextHolder.getBusinessLine(); |
| 90 | if (!CollectionUtils.isEmpty(businessLineSet)) { | 95 | if (!CollectionUtils.isEmpty(businessLineSet)) { |
| 91 | // 拼接业务线条件 | 96 | // 拼接业务线条件 |
| 92 | String newSql = buildSqlWithBusinessLine(originalSql, businessLineSet, sqlCommandType); | 97 | String newSql = buildSqlWithBusinessLine(originalSql, businessLineSet, sqlCommandType); |
urbanops-framework/urbanops-spring-boot-starter-security/src/main/java/com/zteits/urbanops/framework/security/core/LoginUser.java
| @@ -20,6 +20,8 @@ public class LoginUser { | @@ -20,6 +20,8 @@ public class LoginUser { | ||
| 20 | 20 | ||
| 21 | public static final String INFO_KEY_NICKNAME = "nickname"; | 21 | public static final String INFO_KEY_NICKNAME = "nickname"; |
| 22 | public static final String INFO_KEY_DEPT_ID = "deptId"; | 22 | public static final String INFO_KEY_DEPT_ID = "deptId"; |
| 23 | + public static final String INFO_KEY_COMPANY_ID = "companyId"; | ||
| 24 | + public static final String INFO_KEY_BUSI_LINE = "busiLine"; | ||
| 23 | 25 | ||
| 24 | /** | 26 | /** |
| 25 | * 用户编号 | 27 | * 用户编号 |
| @@ -31,6 +33,17 @@ public class LoginUser { | @@ -31,6 +33,17 @@ public class LoginUser { | ||
| 31 | * 关联 {@link UserTypeEnum} | 33 | * 关联 {@link UserTypeEnum} |
| 32 | */ | 34 | */ |
| 33 | private Integer userType; | 35 | private Integer userType; |
| 36 | + | ||
| 37 | + /** | ||
| 38 | + * 业务线 | ||
| 39 | + */ | ||
| 40 | + private String busiLine; | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * 公司id | ||
| 44 | + */ | ||
| 45 | + private Long companyId; | ||
| 46 | + | ||
| 34 | /** | 47 | /** |
| 35 | * 额外的用户信息 | 48 | * 额外的用户信息 |
| 36 | */ | 49 | */ |
urbanops-framework/urbanops-spring-boot-starter-security/src/main/java/com/zteits/urbanops/framework/security/core/filter/TokenAuthenticationFilter.java
| @@ -82,7 +82,10 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { | @@ -82,7 +82,10 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { | ||
| 82 | throw new AccessDeniedException("错误的用户类型"); | 82 | throw new AccessDeniedException("错误的用户类型"); |
| 83 | } | 83 | } |
| 84 | // 构建登录用户 | 84 | // 构建登录用户 |
| 85 | - return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) | 85 | + return new LoginUser().setId(accessToken.getUserId()) |
| 86 | + .setUserType(accessToken.getUserType()) | ||
| 87 | + .setBusiLine(accessToken.getBusiLine()) | ||
| 88 | + .setCompanyId(accessToken.getCompanyId()) | ||
| 86 | .setInfo(accessToken.getUserInfo()) // 额外的用户信息 | 89 | .setInfo(accessToken.getUserInfo()) // 额外的用户信息 |
| 87 | .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()) | 90 | .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes()) |
| 88 | .setExpiresTime(accessToken.getExpiresTime()); | 91 | .setExpiresTime(accessToken.getExpiresTime()); |
urbanops-framework/urbanops-spring-boot-starter-security/src/main/java/com/zteits/urbanops/framework/security/core/util/SecurityFrameworkUtils.java
| @@ -114,6 +114,28 @@ public class SecurityFrameworkUtils { | @@ -114,6 +114,28 @@ public class SecurityFrameworkUtils { | ||
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | /** | 116 | /** |
| 117 | + * 获得当前用户的业务线,从上下文中 | ||
| 118 | + * | ||
| 119 | + * @return 部门编号 | ||
| 120 | + */ | ||
| 121 | + @Nullable | ||
| 122 | + public static String getBusiLine() { | ||
| 123 | + LoginUser loginUser = getLoginUser(); | ||
| 124 | + return loginUser != null ? MapUtil.getStr(loginUser.getInfo(), LoginUser.INFO_KEY_BUSI_LINE) : ""; | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + /** | ||
| 128 | + * 获得当前用户的业务线,从上下文中 | ||
| 129 | + * | ||
| 130 | + * @return 部门编号 | ||
| 131 | + */ | ||
| 132 | + @Nullable | ||
| 133 | + public static Long getCompanyId() { | ||
| 134 | + LoginUser loginUser = getLoginUser(); | ||
| 135 | + return loginUser != null ? MapUtil.getLong(loginUser.getInfo(), LoginUser.INFO_KEY_COMPANY_ID) : null; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + /** | ||
| 117 | * 设置当前用户 | 139 | * 设置当前用户 |
| 118 | * | 140 | * |
| 119 | * @param loginUser 登录用户 | 141 | * @param loginUser 登录用户 |
| @@ -129,6 +151,8 @@ public class SecurityFrameworkUtils { | @@ -129,6 +151,8 @@ public class SecurityFrameworkUtils { | ||
| 129 | if (request != null) { | 151 | if (request != null) { |
| 130 | WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); | 152 | WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); |
| 131 | WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); | 153 | WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); |
| 154 | + WebFrameworkUtils.setLoginUserCompanyId(request, loginUser.getCompanyId()); | ||
| 155 | + WebFrameworkUtils.setLoginUserBusinessLine(request, loginUser.getBusiLine()); | ||
| 132 | } | 156 | } |
| 133 | } | 157 | } |
| 134 | 158 |
urbanops-framework/urbanops-spring-boot-starter-web/src/main/java/com/zteits/urbanops/framework/web/core/util/WebFrameworkUtils.java
| @@ -26,6 +26,10 @@ public class WebFrameworkUtils { | @@ -26,6 +26,10 @@ public class WebFrameworkUtils { | ||
| 26 | public static final String HEADER_TENANT_ID = "tenant-id"; | 26 | public static final String HEADER_TENANT_ID = "tenant-id"; |
| 27 | public static final String HEADER_VISIT_TENANT_ID = "visit-tenant-id"; | 27 | public static final String HEADER_VISIT_TENANT_ID = "visit-tenant-id"; |
| 28 | 28 | ||
| 29 | + public static final String REQUEST_ATTRIBUTE_COMPANY_ID = "companyId"; | ||
| 30 | + public static final String REQUEST_ATTRIBUTE_BUSINESS_LINE = "busiLine"; | ||
| 31 | + | ||
| 32 | + | ||
| 29 | /** | 33 | /** |
| 30 | * 终端的 Header | 34 | * 终端的 Header |
| 31 | * | 35 | * |
| @@ -67,6 +71,14 @@ public class WebFrameworkUtils { | @@ -67,6 +71,14 @@ public class WebFrameworkUtils { | ||
| 67 | request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); | 71 | request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); |
| 68 | } | 72 | } |
| 69 | 73 | ||
| 74 | + public static void setLoginUserBusinessLine(ServletRequest request, String businessLine) { | ||
| 75 | + request.setAttribute(REQUEST_ATTRIBUTE_BUSINESS_LINE, businessLine); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + public static void setLoginUserCompanyId(ServletRequest request, Long companyId) { | ||
| 79 | + request.setAttribute(REQUEST_ATTRIBUTE_COMPANY_ID, companyId); | ||
| 80 | + } | ||
| 81 | + | ||
| 70 | /** | 82 | /** |
| 71 | * 设置用户类型 | 83 | * 设置用户类型 |
| 72 | * | 84 | * |
| @@ -91,6 +103,14 @@ public class WebFrameworkUtils { | @@ -91,6 +103,14 @@ public class WebFrameworkUtils { | ||
| 91 | return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); | 103 | return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); |
| 92 | } | 104 | } |
| 93 | 105 | ||
| 106 | + public static String getLoginUserBusinessLine(ServletRequest request) { | ||
| 107 | + return (String)request.getAttribute(REQUEST_ATTRIBUTE_BUSINESS_LINE); | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + public static Long getLoginUserCompanyId(ServletRequest request) { | ||
| 111 | + return (Long)request.getAttribute(REQUEST_ATTRIBUTE_COMPANY_ID); | ||
| 112 | + } | ||
| 113 | + | ||
| 94 | /** | 114 | /** |
| 95 | * 获得当前用户的类型 | 115 | * 获得当前用户的类型 |
| 96 | * 注意:该方法仅限于 web 相关的 framework 组件使用!!! | 116 | * 注意:该方法仅限于 web 相关的 framework 组件使用!!! |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/dataobject/oauth2/OAuth2RefreshTokenDO.java
| @@ -10,6 +10,7 @@ import lombok.Data; | @@ -10,6 +10,7 @@ import lombok.Data; | ||
| 10 | 10 | ||
| 11 | import java.time.LocalDateTime; | 11 | import java.time.LocalDateTime; |
| 12 | import java.util.List; | 12 | import java.util.List; |
| 13 | +import java.util.Map; | ||
| 13 | 14 | ||
| 14 | /** | 15 | /** |
| 15 | * OAuth2 刷新令牌 | 16 | * OAuth2 刷新令牌 |
| @@ -40,6 +41,17 @@ public class OAuth2RefreshTokenDO extends TenantBaseDO { | @@ -40,6 +41,17 @@ public class OAuth2RefreshTokenDO extends TenantBaseDO { | ||
| 40 | * 枚举 {@link UserTypeEnum} | 41 | * 枚举 {@link UserTypeEnum} |
| 41 | */ | 42 | */ |
| 42 | private Integer userType; | 43 | private Integer userType; |
| 44 | + | ||
| 45 | + /** | ||
| 46 | + * 业务线 | ||
| 47 | + */ | ||
| 48 | + private String busiLine; | ||
| 49 | + | ||
| 50 | + /** | ||
| 51 | + * 公司id | ||
| 52 | + */ | ||
| 53 | + private Long companyId; | ||
| 54 | + | ||
| 43 | /** | 55 | /** |
| 44 | * 客户端编号 | 56 | * 客户端编号 |
| 45 | * | 57 | * |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/dal/dataobject/user/AdminUserDO.java
| @@ -55,6 +55,18 @@ public class AdminUserDO extends TenantBaseDO { | @@ -55,6 +55,18 @@ public class AdminUserDO extends TenantBaseDO { | ||
| 55 | * 部门 ID | 55 | * 部门 ID |
| 56 | */ | 56 | */ |
| 57 | private Long deptId; | 57 | private Long deptId; |
| 58 | + | ||
| 59 | + /** | ||
| 60 | + * 公司id(二级部门id) | ||
| 61 | + */ | ||
| 62 | + @TableField(exist = false) | ||
| 63 | + private Long companyId; | ||
| 64 | + | ||
| 65 | + /** | ||
| 66 | + * 业务线: yl-园林;wy-物业:sz-市政;例如:yl,wy' | ||
| 67 | + */ | ||
| 68 | + private String busiLine; | ||
| 69 | + | ||
| 58 | /** | 70 | /** |
| 59 | * 岗位编号数组 | 71 | * 岗位编号数组 |
| 60 | */ | 72 | */ |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/auth/AdminAuthServiceImpl.java
| @@ -206,6 +206,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | @@ -206,6 +206,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { | ||
| 206 | CaptchaVO captchaVO = new CaptchaVO(); | 206 | CaptchaVO captchaVO = new CaptchaVO(); |
| 207 | captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); | 207 | captchaVO.setCaptchaVerification(reqVO.getCaptchaVerification()); |
| 208 | return captchaService.verification(captchaVO); | 208 | return captchaService.verification(captchaVO); |
| 209 | + | ||
| 209 | } | 210 | } |
| 210 | 211 | ||
| 211 | private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { | 212 | private AuthLoginRespVO createTokenAfterLoginSuccess(Long userId, String username, LoginLogTypeEnum logType) { |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java
| @@ -133,4 +133,10 @@ public interface DeptService { | @@ -133,4 +133,10 @@ public interface DeptService { | ||
| 133 | */ | 133 | */ |
| 134 | List<DeptDO> getSubDeptList(Long id); | 134 | List<DeptDO> getSubDeptList(Long id); |
| 135 | 135 | ||
| 136 | + /** | ||
| 137 | + * 查询所有部门信息 | ||
| 138 | + * @return | ||
| 139 | + */ | ||
| 140 | + List<DeptDO> getSubDeptAllList(); | ||
| 141 | + | ||
| 136 | } | 142 | } |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java
| @@ -244,4 +244,9 @@ public class DeptServiceImpl implements DeptService { | @@ -244,4 +244,9 @@ public class DeptServiceImpl implements DeptService { | ||
| 244 | public List<DeptDO> getSubDeptList(Long id) { | 244 | public List<DeptDO> getSubDeptList(Long id) { |
| 245 | return deptMapper.selectList(DeptDO::getParentId,id); | 245 | return deptMapper.selectList(DeptDO::getParentId,id); |
| 246 | } | 246 | } |
| 247 | + | ||
| 248 | + @Override | ||
| 249 | + public List<DeptDO> getSubDeptAllList() { | ||
| 250 | + return deptMapper.selectList(); | ||
| 251 | + } | ||
| 247 | } | 252 | } |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/oauth2/OAuth2TokenServiceImpl.java
| 1 | package com.zteits.urbanops.module.system.service.oauth2; | 1 | package com.zteits.urbanops.module.system.service.oauth2; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | +import cn.hutool.core.collection.CollectionUtil; | ||
| 4 | import cn.hutool.core.map.MapUtil; | 5 | import cn.hutool.core.map.MapUtil; |
| 5 | import cn.hutool.core.util.IdUtil; | 6 | import cn.hutool.core.util.IdUtil; |
| 6 | import cn.hutool.core.util.ObjectUtil; | 7 | import cn.hutool.core.util.ObjectUtil; |
| @@ -14,6 +15,7 @@ import com.zteits.urbanops.framework.security.core.LoginUser; | @@ -14,6 +15,7 @@ import com.zteits.urbanops.framework.security.core.LoginUser; | ||
| 14 | import com.zteits.urbanops.framework.tenant.core.context.TenantContextHolder; | 15 | import com.zteits.urbanops.framework.tenant.core.context.TenantContextHolder; |
| 15 | import com.zteits.urbanops.framework.tenant.core.util.TenantUtils; | 16 | import com.zteits.urbanops.framework.tenant.core.util.TenantUtils; |
| 16 | import com.zteits.urbanops.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; | 17 | import com.zteits.urbanops.module.system.controller.admin.oauth2.vo.token.OAuth2AccessTokenPageReqVO; |
| 18 | +import com.zteits.urbanops.module.system.dal.dataobject.dept.DeptDO; | ||
| 17 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; | 19 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; |
| 18 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2ClientDO; | 20 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2ClientDO; |
| 19 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; | 21 | import com.zteits.urbanops.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO; |
| @@ -21,6 +23,7 @@ import com.zteits.urbanops.module.system.dal.dataobject.user.AdminUserDO; | @@ -21,6 +23,7 @@ import com.zteits.urbanops.module.system.dal.dataobject.user.AdminUserDO; | ||
| 21 | import com.zteits.urbanops.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; | 23 | import com.zteits.urbanops.module.system.dal.mysql.oauth2.OAuth2AccessTokenMapper; |
| 22 | import com.zteits.urbanops.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; | 24 | import com.zteits.urbanops.module.system.dal.mysql.oauth2.OAuth2RefreshTokenMapper; |
| 23 | import com.zteits.urbanops.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; | 25 | import com.zteits.urbanops.module.system.dal.redis.oauth2.OAuth2AccessTokenRedisDAO; |
| 26 | +import com.zteits.urbanops.module.system.service.dept.DeptService; | ||
| 24 | import com.zteits.urbanops.module.system.service.user.AdminUserService; | 27 | import com.zteits.urbanops.module.system.service.user.AdminUserService; |
| 25 | import jakarta.annotation.Resource; | 28 | import jakarta.annotation.Resource; |
| 26 | import org.springframework.context.annotation.Lazy; | 29 | import org.springframework.context.annotation.Lazy; |
| @@ -31,6 +34,7 @@ import java.time.LocalDateTime; | @@ -31,6 +34,7 @@ import java.time.LocalDateTime; | ||
| 31 | import java.util.Collections; | 34 | import java.util.Collections; |
| 32 | import java.util.List; | 35 | import java.util.List; |
| 33 | import java.util.Map; | 36 | import java.util.Map; |
| 37 | +import java.util.stream.Collectors; | ||
| 34 | 38 | ||
| 35 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; | 39 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception0; |
| 36 | import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; | 40 | import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertSet; |
| @@ -57,6 +61,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | @@ -57,6 +61,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | ||
| 57 | @Lazy // 懒加载,避免循环依赖 | 61 | @Lazy // 懒加载,避免循环依赖 |
| 58 | private AdminUserService adminUserService; | 62 | private AdminUserService adminUserService; |
| 59 | 63 | ||
| 64 | + @Resource | ||
| 65 | + private DeptService deptService; | ||
| 66 | + | ||
| 60 | @Override | 67 | @Override |
| 61 | @Transactional(rollbackFor = Exception.class) | 68 | @Transactional(rollbackFor = Exception.class) |
| 62 | public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes) { | 69 | public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes) { |
| @@ -173,14 +180,87 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | @@ -173,14 +180,87 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | ||
| 173 | } | 180 | } |
| 174 | 181 | ||
| 175 | private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes) { | 182 | private OAuth2RefreshTokenDO createOAuth2RefreshToken(Long userId, Integer userType, OAuth2ClientDO clientDO, List<String> scopes) { |
| 183 | + //获取用户信息 | ||
| 184 | + AdminUserDO user = adminUserService.getUser(userId); | ||
| 176 | OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) | 185 | OAuth2RefreshTokenDO refreshToken = new OAuth2RefreshTokenDO().setRefreshToken(generateRefreshToken()) |
| 177 | .setUserId(userId).setUserType(userType) | 186 | .setUserId(userId).setUserType(userType) |
| 187 | + .setCompanyId(getParentDeptId(user.getDeptId())) | ||
| 188 | + .setBusiLine(user.getBusiLine()) | ||
| 178 | .setClientId(clientDO.getClientId()).setScopes(scopes) | 189 | .setClientId(clientDO.getClientId()).setScopes(scopes) |
| 179 | .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())); | 190 | .setExpiresTime(LocalDateTime.now().plusSeconds(clientDO.getRefreshTokenValiditySeconds())); |
| 180 | oauth2RefreshTokenMapper.insert(refreshToken); | 191 | oauth2RefreshTokenMapper.insert(refreshToken); |
| 181 | return refreshToken; | 192 | return refreshToken; |
| 182 | } | 193 | } |
| 183 | 194 | ||
| 195 | + private Long getParentDeptId(Long deptId) { | ||
| 196 | + DeptDO dept = deptService.getDept(deptId); | ||
| 197 | + if (dept == null) { | ||
| 198 | + return null; | ||
| 199 | + } | ||
| 200 | + //顶级部门ID | ||
| 201 | + if(dept.getParentId().equals(0L)) { | ||
| 202 | + return dept.getId(); | ||
| 203 | + } | ||
| 204 | + //二级部门 | ||
| 205 | + if(dept.getParentId().equals(100L)) { | ||
| 206 | + return dept.getId(); | ||
| 207 | + } | ||
| 208 | + //一级以下查二级 | ||
| 209 | + List<DeptDO> allDeptList = deptService.getSubDeptAllList(); | ||
| 210 | + if (CollectionUtil.isEmpty(allDeptList)) { | ||
| 211 | + return null; | ||
| 212 | + } | ||
| 213 | + // 构建部门ID → 部门对象的Map(核心:快速根据ID查部门) | ||
| 214 | + Map<Long, DeptDO> deptMap = allDeptList.stream() | ||
| 215 | + // 第一个参数:Map 的 Key(取 deptId) | ||
| 216 | + // 第二个参数:Map 的 Value(取 Dept 对象本身) | ||
| 217 | + .collect(Collectors.toMap(DeptDO::getId, DeptDO -> DeptDO)); | ||
| 218 | + | ||
| 219 | + DeptDO findDept = findDeptByTargetParentIdLoop(dept.getParentId(), 100L, deptMap); | ||
| 220 | + return findDept == null ? null : findDept.getId(); | ||
| 221 | + } | ||
| 222 | + | ||
| 223 | + /** | ||
| 224 | + * 循环向上追溯,查找父部门ID等于目标值的部门对象(避免栈溢出) | ||
| 225 | + * @param startDeptId 起始部门ID(指定deptId) | ||
| 226 | + * @param targetParentId 目标parentId(要匹配的父部门ID) | ||
| 227 | + * @param deptIdMap 部门ID映射Map | ||
| 228 | + * @return 匹配的部门对象(无则返回null) | ||
| 229 | + */ | ||
| 230 | + public static DeptDO findDeptByTargetParentIdLoop(Long startDeptId, Long targetParentId, Map<Long, DeptDO> deptIdMap) { | ||
| 231 | + // 1. 入参校验 | ||
| 232 | + if (startDeptId == null || targetParentId == null || deptIdMap == null || targetParentId == 0) { | ||
| 233 | + return null; | ||
| 234 | + } | ||
| 235 | + | ||
| 236 | + Long currentDeptId = startDeptId; | ||
| 237 | + while (true) { | ||
| 238 | + // 2. 获取当前部门对象 | ||
| 239 | + DeptDO currentDept = deptIdMap.get(currentDeptId); | ||
| 240 | + if (currentDept == null) { | ||
| 241 | + break; | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + // 3. 获取当前部门的父ID(父部门的deptId) | ||
| 245 | + Long parentDeptId = currentDept.getParentId(); | ||
| 246 | + // 终止条件:追溯到顶级部门(parentId=0) | ||
| 247 | + if (parentDeptId == 0L) { | ||
| 248 | + break; | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + // 4. 校验是否匹配目标parentId | ||
| 252 | + if (parentDeptId.equals(targetParentId)) { | ||
| 253 | + return currentDept; // 匹配,返回对象 | ||
| 254 | + } | ||
| 255 | + | ||
| 256 | + // 5. 未匹配,继续追溯父部门 | ||
| 257 | + currentDeptId = currentDept.getParentId(); | ||
| 258 | + } | ||
| 259 | + | ||
| 260 | + // 遍历结束未匹配 | ||
| 261 | + return null; | ||
| 262 | + } | ||
| 263 | + | ||
| 184 | private OAuth2AccessTokenDO convertToAccessToken(OAuth2RefreshTokenDO refreshTokenDO) { | 264 | private OAuth2AccessTokenDO convertToAccessToken(OAuth2RefreshTokenDO refreshTokenDO) { |
| 185 | OAuth2AccessTokenDO accessTokenDO = BeanUtils.toBean(refreshTokenDO, OAuth2AccessTokenDO.class) | 265 | OAuth2AccessTokenDO accessTokenDO = BeanUtils.toBean(refreshTokenDO, OAuth2AccessTokenDO.class) |
| 186 | .setAccessToken(refreshTokenDO.getRefreshToken()); | 266 | .setAccessToken(refreshTokenDO.getRefreshToken()); |
| @@ -203,7 +283,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | @@ -203,7 +283,9 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService { | ||
| 203 | if (userType.equals(UserTypeEnum.ADMIN.getValue())) { | 283 | if (userType.equals(UserTypeEnum.ADMIN.getValue())) { |
| 204 | AdminUserDO user = adminUserService.getUser(userId); | 284 | AdminUserDO user = adminUserService.getUser(userId); |
| 205 | return MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, user.getNickname()) | 285 | return MapUtil.builder(LoginUser.INFO_KEY_NICKNAME, user.getNickname()) |
| 206 | - .put(LoginUser.INFO_KEY_DEPT_ID, StrUtil.toStringOrNull(user.getDeptId())).build(); | 286 | + .put(LoginUser.INFO_KEY_DEPT_ID, StrUtil.toStringOrNull(user.getDeptId())) |
| 287 | + .put(LoginUser.INFO_KEY_COMPANY_ID, StrUtil.toStringOrNull(user.getCompanyId())) | ||
| 288 | + .put(LoginUser.INFO_KEY_BUSI_LINE, user.getBusiLine()).build(); | ||
| 207 | } else if (userType.equals(UserTypeEnum.MEMBER.getValue())) { | 289 | } else if (userType.equals(UserTypeEnum.MEMBER.getValue())) { |
| 208 | // 注意:目前 Member 暂时不读取,可以按需实现 | 290 | // 注意:目前 Member 暂时不读取,可以按需实现 |
| 209 | return Collections.emptyMap(); | 291 | return Collections.emptyMap(); |
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/user/AdminUserServiceImpl.java
| @@ -42,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional; | @@ -42,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 42 | 42 | ||
| 43 | import java.time.LocalDateTime; | 43 | import java.time.LocalDateTime; |
| 44 | import java.util.*; | 44 | import java.util.*; |
| 45 | +import java.util.stream.Collectors; | ||
| 45 | 46 | ||
| 46 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; | 47 | import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 47 | import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.*; | 48 | import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.*; |
| @@ -263,7 +264,7 @@ public class AdminUserServiceImpl implements AdminUserService { | @@ -263,7 +264,7 @@ public class AdminUserServiceImpl implements AdminUserService { | ||
| 263 | 264 | ||
| 264 | @Override | 265 | @Override |
| 265 | public AdminUserDO getUserByUsername(String username) { | 266 | public AdminUserDO getUserByUsername(String username) { |
| 266 | - return userMapper.selectByUsername(username); | 267 | + return userMapper.selectByUsername(username); |
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | @Override | 270 | @Override |
urbanops-module-system/src/main/resources/mapper/DeptMapper.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||
| 3 | +<mapper namespace="com.zteits.urbanops.module.system.dal.mysql.dept.DeptMapper"> | ||
| 4 | + | ||
| 5 | + <!-- | ||
| 6 | + 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 | ||
| 7 | + 无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。 | ||
| 8 | + 代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。 | ||
| 9 | + 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ | ||
| 10 | + --> | ||
| 11 | + | ||
| 12 | +</mapper> | ||
| 0 | \ No newline at end of file | 13 | \ No newline at end of file |