From c60cf13dd095b3940b4402636274efe6b247de7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Thu, 23 Jul 2026 01:43:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(user):=20=E4=BF=AE=E5=A4=8D=E8=AE=BE?= =?UTF-8?q?=E4=B8=BA=E5=BC=80=E5=8F=91=E8=80=85=E6=97=B6=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E5=92=8C=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换用户角色为 developer,确保用户仅拥有该单一角色 - 在设为开发者后移除用户现有角色并绑定 developer 角色 - 角色替换失败时记录警告日志但不影响标记过程 - 保持通过MQ异步同步更新后的用户数据到 websopy - 增加相关日志以便追踪操作流程 --- .../system/service/impl/UserServiceImpl.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java b/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java index 3057326..82cd3df 100644 --- a/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/gxwebsoft/common/system/service/impl/UserServiceImpl.java @@ -13,6 +13,7 @@ import com.gxwebsoft.common.core.web.PageResult; import com.gxwebsoft.common.system.entity.*; import com.gxwebsoft.common.system.mapper.UserMapper; import com.gxwebsoft.common.system.param.LoginParam; +import com.gxwebsoft.common.system.param.RoleParam; import com.gxwebsoft.common.system.param.UserParam; import com.gxwebsoft.common.mq.producer.SyncMessageProducer; import com.gxwebsoft.common.system.service.*; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -223,12 +225,34 @@ public class UserServiceImpl extends ServiceImpl implements Us user.setUserId(userId); user.setIsDeveloper(true); boolean result = updateById(user); - // 标记开发者后,通过MQ异步同步用户数据到 websopy - if (result && syncMessageProducer != null) { - User updatedUser = getAllByUserId(String.valueOf(userId)); - if (updatedUser != null) { - syncMessageProducer.sendUserSyncMessage("websopy", "UPDATE", updatedUser); - log.info("用户设为开发者后同步到websopy: userId={}", userId); + if (result) { + // 替换用户角色为 developer:先按用户所在租户找到 developer 角色,删除该用户现有角色后 + // 只绑定 developer,保证用户最终只有「开发者」单一角色(不与原角色并存) + try { + User dbUser = getById(userId); + Integer tenantId = dbUser != null ? dbUser.getTenantId() : null; + RoleParam roleParam = new RoleParam(); + roleParam.setRoleCode("developer"); + if (tenantId != null) { + roleParam.setTenantId(tenantId); + } + Role developerRole = roleService.getByRoleCode(roleParam); + if (developerRole != null && developerRole.getRoleId() != null) { + userRoleService.remove(new LambdaUpdateWrapper().eq(UserRole::getUserId, userId)); + userRoleService.saveBatch(userId, Collections.singletonList(developerRole.getRoleId())); + log.info("用户设为开发者并替换角色为 developer: userId={}, roleId={}", userId, developerRole.getRoleId()); + } + } catch (Exception e) { + // 角色替换失败不影响 is_developer 标记位落库 + log.warn("替换用户角色为 developer 失败(不影响 is_developer 标记): userId={}", userId, e); + } + // 标记开发者后,通过MQ异步同步用户数据到 websopy + if (syncMessageProducer != null) { + User updatedUser = getAllByUserId(String.valueOf(userId)); + if (updatedUser != null) { + syncMessageProducer.sendUserSyncMessage("websopy", "UPDATE", updatedUser); + log.info("用户设为开发者后同步到websopy: userId={}", userId); + } } } return result;