自动注册开钱包问题

This commit is contained in:
zjf committed 2026-11-10 09:58:40 +08:00
1 parent ef4bc42ddb
commit 44c5e38a34
2 files changed
+32 -55

No files matched your search

@@ -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<SysDeptInviteMapper, S
private final SysRoleService sysRoleService;
private final SysUserIdentityService sysUserIdentityService;
private final RemoteMchService remoteMchService;
private final RemoteWalletService remoteWalletService;
private final ApplicationEventPublisher applicationEventPublisher;
private final FlowUtil flowUtil;
private final SysMessageService sysMessageService;
@@ -365,18 +366,19 @@ public class SysDeptInviteServiceImpl extends ServiceImpl<SysDeptInviteMapper, S
sysUser.setPasswordExpireFlag(UserExpireEnum.NORMAL.getCode());
sysUserMapper.insert(sysUser);
List<SysRole> roleList = sysRoleService.list();
String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE");
String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE");
List<Long> 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<String> roleCodes = List.of(CommonRoleConstant.DEFAULT_USER, CommonRoleConstant.AUTO_CREATE_WALLET);
List<SysRole> defaultRoles = Optional.ofNullable(sysRoleService.findRolesByCodes(roleCodes))
.orElseGet(Collections::emptyList);
Map<String, Long> 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<SysDeptInviteMapper, S
return R.ok(true, "注册成功,请等待审核通过后再登录");
}
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 R.ok(true, "注册成功");
}
@@ -895,13 +895,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
sysUser.setDeptId(defaultDeptIdLong);
}
baseMapper.insert(sysUser);
// 如果角色为空,赋默认角色
// 如果角色为空,赋默认角色(与后台新增一致:GENERAL_USER + WALLET_AUTO_CREATE)
if (CollUtil.isEmpty(userDto.getRole())) {
List<SysRole> roleList = sysRoleService.list();
String walletAutoCreate = ParamResolver.getStr("WALLET_AUTO_CREATE");
String userDefaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE");
List<Long> 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<SysUserMapper, SysUser> 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<SysUserMapper, SysUser> impl
cache.evict(detail.getUsername());
}
if (isConsent) {
// 创建用户默认钱包
remoteWalletService.createWallet(detail.getUserId());
// 审批事务提交后再开钱包,避免事务内远程调用读到未提交状态/丢租户
applicationEventPublisher.publishEvent(
new UserWalletCreateEvent(detail.getUserId(), TenantContextHolder.getTenantId()));
}
} catch (Exception e) {
e.printStackTrace();