From 44c5e38a34b8fb705ea551097cbecf02338c3fa5 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Tue, 10 Nov 2026 09:58:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=B3=A8=E5=86=8C=E5=BC=80?= =?UTF-8?q?=E9=92=B1=E5=8C=85=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SysDeptInviteServiceImpl.java | 48 ++++++++----------- .../service/impl/SysUserServiceImpl.java | 39 +++++---------- 2 files changed, 32 insertions(+), 55 deletions(-) diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptInviteServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptInviteServiceImpl.java index d3d0d791f..f7ad8a9d2 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptInviteServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysDeptInviteServiceImpl.java @@ -27,6 +27,7 @@ import com.bsd.pjcloud.admin.api.vo.SysDeptInvitePreviewVO; import com.bsd.pjcloud.admin.mapper.SysDeptInviteMapper; import com.bsd.pjcloud.admin.mapper.SysUserMapper; import com.bsd.pjcloud.admin.mapper.SysUserRoleMapper; +import com.bsd.pjcloud.admin.handler.UserWalletCreateEvent; import com.bsd.pjcloud.admin.service.SysDeptInviteService; import com.bsd.pjcloud.admin.service.SysDeptService; import com.bsd.pjcloud.admin.service.SysMessageService; @@ -34,30 +35,30 @@ import com.bsd.pjcloud.admin.service.SysRoleService; import com.bsd.pjcloud.admin.service.SysUserIdentityService; import com.bsd.pjcloud.admin.utils.flow.FlowUtil; import com.bsd.pjcloud.admin.utils.flow.dto.UserApplyFlowDto; +import com.bsd.pjcloud.common.core.constant.CommonRoleConstant; import com.bsd.pjcloud.common.core.constant.enums.MerchantAttrEnum; import com.bsd.pjcloud.common.core.exception.ErrorCodes; import com.bsd.pjcloud.common.core.util.MsgUtils; import com.bsd.pjcloud.common.core.util.R; -import com.bsd.pjcloud.common.data.resolver.ParamResolver; +import com.bsd.pjcloud.common.data.tenant.TenantContextHolder; import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; -import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; import java.time.LocalDateTime; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.concurrent.CompletableFuture; +import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -79,7 +80,7 @@ public class SysDeptInviteServiceImpl extends ServiceImpl roleList = sysRoleService.list(); - String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE"); - String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - List roleIds = roleList.stream() - .filter(v -> ObjectUtil.equals(v.getRoleCode(), walletAutoCreate) - || ObjectUtil.equals(v.getRoleCode(), userDefaultRole)) - .map(SysRole::getRoleId) - .toList(); - for (Long roleId : roleIds) { + // 与后台新增用户一致:固定 GENERAL_USER + WALLET_AUTO_CREATE(按角色编码,避免参数配置漂移) + List roleCodes = List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.AUTO_CREATE_WALLET); + List defaultRoles = Optional.ofNullable(sysRoleService.findRolesByCodes(roleCodes)) + .orElseGet(Collections::emptyList); + Map roleIdByCode = defaultRoles.stream() + .collect(Collectors.toMap(SysRole::getRoleCode, SysRole::getRoleId, (a, b) -> a)); + if (!roleIdByCode.keySet().containsAll(roleCodes)) { + throw new IllegalStateException("默认用户角色配置不完整,请联系管理员配置 GENERAL_USER / WALLET_AUTO_CREATE"); + } + for (String code : roleCodes) { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); - userRole.setRoleId(roleId); + userRole.setRoleId(roleIdByCode.get(code)); sysUserRoleMapper.insert(userRole); } @@ -389,17 +391,9 @@ public class SysDeptInviteServiceImpl extends ServiceImpl { - try { - RequestContextHolder.setRequestAttributes(requestAttributes); - remoteWalletService.createWallet(sysUser.getUserId()); - remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); - } - catch (Exception e) { - log.error("|{}|创建用户钱包失败error:|{}|", TAG, e.getMessage()); - } - }); + // 事务提交后再异步开钱包(带租户),避免 CompletableFuture 抢跑读不到新用户/丢租户头 + applicationEventPublisher.publishEvent( + new UserWalletCreateEvent(sysUser.getUserId(), TenantContextHolder.getTenantId())); // 保留验证码供前端立即短信登录(登录时再消费) return R.ok(true, "注册成功"); } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 3a32ab121..4b9871a26 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -895,13 +895,9 @@ public class SysUserServiceImpl extends ServiceImpl impl }).forEach(SysUserPost::insert); } - // 创建用户默认钱包 - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - CompletableFuture.runAsync(() -> { - RequestContextHolder.setRequestAttributes(requestAttributes); - remoteWalletService.createWallet(userDto.getUserId()); - remoteWalletService.userChange(userDto.getUserId(), Boolean.FALSE); - }); + // 保存后补建默认钱包(幂等);提交后再异步执行,避免事务内/丢租户 + applicationEventPublisher.publishEvent( + new UserWalletCreateEvent(userDto.getUserId(), TenantContextHolder.getTenantId())); return Boolean.TRUE; } @@ -1044,13 +1040,9 @@ public class SysUserServiceImpl extends ServiceImpl impl sysUser.setDeptId(defaultDeptIdLong); } baseMapper.insert(sysUser); - // 如果角色为空,赋默认角色 + // 如果角色为空,赋默认角色(与后台新增一致:GENERAL_USER + WALLET_AUTO_CREATE) if (CollUtil.isEmpty(userDto.getRole())) { - List roleList = sysRoleService.list(); - String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE"); - String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); - List roleIds = roleList.stream().filter(v -> ObjectUtil.equals(v.getRoleCode(), walletAutoCreate) || ObjectUtil.equals(v.getRoleCode(), userDefaultRole)).map(SysRole::getRoleId).toList(); - userDto.setRole(roleIds); + userDto.setRole(getNonAdminNewUserRoleIds()); } // 插入用户角色关系表 userDto.getRole().stream().map(roleId -> { @@ -1060,19 +1052,9 @@ public class SysUserServiceImpl extends ServiceImpl impl return userRole; }).forEach(sysUserRoleMapper::insert); - // 创建用户默认钱包、保证线程header - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); - CompletableFuture.runAsync(() -> { - try { - RequestContextHolder.setRequestAttributes(requestAttributes); - // 创建钱包 - remoteWalletService.createWallet(sysUser.getUserId()); - // 通知钱包 - remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); - } catch (Exception e) { - log.error("|{}|创建用户钱包失败error:|{}|", TAG, e.getMessage()); - } - }); + // 事务提交后再异步开钱包(带租户),避免 CompletableFuture 抢跑/丢租户 + applicationEventPublisher.publishEvent( + new UserWalletCreateEvent(sysUser.getUserId(), TenantContextHolder.getTenantId())); return true; } @@ -1401,8 +1383,9 @@ public class SysUserServiceImpl extends ServiceImpl impl cache.evict(detail.getUsername()); } if (isConsent) { - // 创建用户默认钱包 - remoteWalletService.createWallet(detail.getUserId()); + // 审批事务提交后再开钱包,避免事务内远程调用读到未提交状态/丢租户 + applicationEventPublisher.publishEvent( + new UserWalletCreateEvent(detail.getUserId(), TenantContextHolder.getTenantId())); } } catch (Exception e) { e.printStackTrace();