fix: 短信验证码登录,逻辑修改。
This commit is contained in:
@@ -105,58 +105,123 @@ public class SmsAuthStrategy implements IAuthStrategy {
|
||||
|
||||
/**
|
||||
* 根据手机号加载系统用户,如果不存在则自动创建
|
||||
* 逻辑:先查AquUser,再查系统用户
|
||||
* 1. 如果AquUser不存在,先创建AquUser,再创建系统用户
|
||||
* 2. 如果AquUser存在但系统用户不存在,根据AquUser数据创建系统用户
|
||||
* 3. 如果都存在,直接返回系统用户
|
||||
*
|
||||
* @param phonenumber 手机号
|
||||
* @return 系统用户信息
|
||||
*/
|
||||
private SysUserVo loadUserByPhonenumber(String phonenumber) {
|
||||
SysUserVo user = userMapper.selectVoOne(
|
||||
// 1. 先查询AquUser
|
||||
AquUser aquUser = aquUserMapper.selectOne(
|
||||
new LambdaQueryWrapper<AquUser>()
|
||||
.eq(AquUser::getMobilePhone, phonenumber)
|
||||
);
|
||||
|
||||
// 2. 查询系统用户
|
||||
SysUserVo sysUser = userMapper.selectVoOne(
|
||||
new LambdaQueryWrapper<SysUser>()
|
||||
.eq(SysUser::getPhonenumber, phonenumber)
|
||||
);
|
||||
|
||||
// 如果用户不存在,创建新用户
|
||||
if (ObjectUtil.isNull(user)) {
|
||||
log.info("系统中不存在该手机号的用户,自动创建新用户: phone={}", phonenumber);
|
||||
user = createNewUser(phonenumber);
|
||||
// 3. 根据不同情况处理
|
||||
if (ObjectUtil.isNull(aquUser)) {
|
||||
// 情况1:AquUser不存在,先创建AquUser,再创建系统用户
|
||||
log.info("AquUser不存在,先创建AquUser再创建系统用户: phone={}", phonenumber);
|
||||
aquUser = createAquUserFirst(phonenumber);
|
||||
sysUser = createSysUserFromPhone(phonenumber, aquUser);
|
||||
} else if (ObjectUtil.isNull(sysUser)) {
|
||||
// 情况2:AquUser存在但系统用户不存在,根据AquUser创建系统用户
|
||||
log.info("AquUser存在但系统用户不存在,根据AquUser创建系统用户: phone={}, aquUserId={}",
|
||||
phonenumber, aquUser.getId());
|
||||
sysUser = createSysUserFromAquUser(aquUser);
|
||||
}
|
||||
|
||||
// 检查用户状态
|
||||
if (SystemConstants.DISABLE.equals(user.getStatus())) {
|
||||
if (SystemConstants.DISABLE.equals(sysUser.getStatus())) {
|
||||
log.info("登录用户:{} 已被停用.", phonenumber);
|
||||
throw new UserException("user.blocked", phonenumber);
|
||||
}
|
||||
|
||||
return user;
|
||||
return sysUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新的系统用户
|
||||
* 先创建AquUser(当AquUser不存在时)
|
||||
*
|
||||
* @param phone 手机号
|
||||
* @return 新创建的用户信息
|
||||
* @return 新创建的AquUser
|
||||
*/
|
||||
private SysUserVo createNewUser(String phone) {
|
||||
private AquUser createAquUserFirst(String phone) {
|
||||
try {
|
||||
// 构建报警电话列表
|
||||
List<String> warnPhoneList = new ArrayList<>();
|
||||
warnPhoneList.add(phone);
|
||||
String warnPhoneJson = JsonUtils.toJsonString(warnPhoneList);
|
||||
|
||||
// 创建鱼测云用户对象
|
||||
AquUserBo aquUserBo = new AquUserBo();
|
||||
aquUserBo.setUserName("用户" + phone.substring(phone.length() - 4));
|
||||
aquUserBo.setMobilePhone(phone);
|
||||
aquUserBo.setWarnPhoneJson(warnPhoneJson);
|
||||
aquUserBo.setIsManager(0L);
|
||||
aquUserBo.setHasScreen(0L);
|
||||
aquUserBo.setRemark("短信登录自动创建");
|
||||
|
||||
// 调用服务创建鱼测云用户
|
||||
boolean success = aquUserService.insertByBo(aquUserBo);
|
||||
|
||||
if (!success) {
|
||||
log.error("创建AquUser失败: phone={}", phone);
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
|
||||
// 查询刚创建的AquUser
|
||||
AquUser createdAquUser = aquUserMapper.selectOne(
|
||||
new LambdaQueryWrapper<AquUser>()
|
||||
.eq(AquUser::getMobilePhone, phone)
|
||||
);
|
||||
|
||||
if (ObjectUtil.isNull(createdAquUser)) {
|
||||
log.error("创建AquUser后查询失败: phone={}", phone);
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
|
||||
log.info("成功创建AquUser: phone={}, aquUserId={}, userName={}",
|
||||
phone, createdAquUser.getId(), createdAquUser.getUserName());
|
||||
|
||||
return createdAquUser;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("创建AquUser异常: phone={}, error={}", phone, e.getMessage(), e);
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据手机号创建系统用户(当AquUser已创建但系统用户不存在时)
|
||||
*
|
||||
* @param phone 手机号
|
||||
* @param aquUser AquUser信息
|
||||
* @return 新创建的系统用户
|
||||
*/
|
||||
private SysUserVo createSysUserFromPhone(String phone, AquUser aquUser) {
|
||||
try {
|
||||
// 构建新用户对象
|
||||
SysUserBo newUser = new SysUserBo();
|
||||
// 使用手机号作为用户名
|
||||
// 使用AquUser的ID作为系统用户ID,保持一致
|
||||
newUser.setUserId(aquUser.getId());
|
||||
newUser.setUserName(phone);
|
||||
// 使用手机号作为昵称
|
||||
newUser.setNickName("用户" + phone.substring(phone.length() - 4));
|
||||
// 设置手机号
|
||||
newUser.setNickName(StringUtils.isNotBlank(aquUser.getUserName()) ?
|
||||
aquUser.getUserName() : "用户" + phone.substring(phone.length() - 4));
|
||||
newUser.setPhonenumber(phone);
|
||||
// 设置用户类型为系统用户
|
||||
newUser.setUserType("sys_user");
|
||||
// 设置默认部门ID
|
||||
newUser.setDeptId(SystemConstants.DEFAULT_DEPT_ID);
|
||||
// 设置状态为正常
|
||||
newUser.setStatus(SystemConstants.NORMAL);
|
||||
// 设置性别为未知
|
||||
newUser.setSex("2");
|
||||
// 设置默认密码
|
||||
newUser.setPassword(BCrypt.hashpw("yuceyun@123"));
|
||||
// 设置创建人和更新人为系统
|
||||
newUser.setCreateBy(0L);
|
||||
newUser.setUpdateBy(0L);
|
||||
|
||||
@@ -164,7 +229,7 @@ public class SmsAuthStrategy implements IAuthStrategy {
|
||||
boolean success = userService.registerUser(newUser, LoginHelper.getTenantId());
|
||||
|
||||
if (!success) {
|
||||
log.error("创建新用户失败: phone={}", phone);
|
||||
log.error("创建系统用户失败: phone={}, aquUserId={}", phone, aquUser.getId());
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
|
||||
@@ -175,77 +240,78 @@ public class SmsAuthStrategy implements IAuthStrategy {
|
||||
);
|
||||
|
||||
if (ObjectUtil.isNull(createdUser)) {
|
||||
log.error("创建用户后查询失败: phone={}", phone);
|
||||
log.error("创建系统用户后查询失败: phone={}, aquUserId={}", phone, aquUser.getId());
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
|
||||
log.info("成功创建系统用户: phone={}, userId={}, userName={}",
|
||||
phone, createdUser.getUserId(), createdUser.getUserName());
|
||||
|
||||
// 创建对应的鱼测云用户(AquUser)
|
||||
createAquUser(createdUser);
|
||||
log.info("成功创建系统用户(ID与AquUser一致): phone={}, userId={}, aquUserId={}, userName={}",
|
||||
phone, createdUser.getUserId(), aquUser.getId(), createdUser.getUserName());
|
||||
|
||||
return createdUser;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("创建新用户异常: phone={}, error={}", phone, e.getMessage(), e);
|
||||
log.error("创建系统用户异常: phone={}, aquUserId={}, error={}", phone, aquUser.getId(), e.getMessage(), e);
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建鱼测云用户(AquUser)
|
||||
* 根据AquUser信息创建系统用户
|
||||
*
|
||||
* @param sysUser 系统用户信息
|
||||
* @param aquUser AquUser信息
|
||||
* @return 新创建的系统用户
|
||||
*/
|
||||
private void createAquUser(SysUserVo sysUser) {
|
||||
private SysUserVo createSysUserFromAquUser(AquUser aquUser) {
|
||||
try {
|
||||
// 检查是否已存在鱼测云用户
|
||||
AquUser existingAquUser = aquUserMapper.selectById(sysUser.getUserId());
|
||||
if (existingAquUser != null) {
|
||||
log.info("鱼测云用户已存在,跳过创建: userId={}", sysUser.getUserId());
|
||||
return;
|
||||
String phone = aquUser.getMobilePhone();
|
||||
|
||||
// 构建新用户对象
|
||||
SysUserBo newUser = new SysUserBo();
|
||||
// 使用AquUser的ID作为系统用户ID,保持一致
|
||||
newUser.setUserId(aquUser.getId());
|
||||
newUser.setUserName(phone);
|
||||
// 使用AquUser的用户名作为昵称
|
||||
newUser.setNickName(StringUtils.isNotBlank(aquUser.getUserName()) ?
|
||||
aquUser.getUserName() : "用户" + phone.substring(phone.length() - 4));
|
||||
newUser.setPhonenumber(phone);
|
||||
newUser.setUserType("sys_user");
|
||||
newUser.setDeptId(SystemConstants.DEFAULT_DEPT_ID);
|
||||
newUser.setStatus(SystemConstants.NORMAL);
|
||||
newUser.setSex("2");
|
||||
newUser.setPassword(BCrypt.hashpw("yuceyun@123"));
|
||||
newUser.setCreateBy(0L);
|
||||
newUser.setUpdateBy(0L);
|
||||
|
||||
// 调用用户服务创建用户
|
||||
boolean success = userService.registerUser(newUser, LoginHelper.getTenantId());
|
||||
|
||||
if (!success) {
|
||||
log.error("根据AquUser创建系统用户失败: phone={}, aquUserId={}", phone, aquUser.getId());
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
|
||||
// 构建报警电话列表(包含用户手机号)
|
||||
List<String> warnPhoneList = new ArrayList<>();
|
||||
if (StringUtils.isNotBlank(sysUser.getPhonenumber())) {
|
||||
warnPhoneList.add(sysUser.getPhonenumber());
|
||||
// 查询刚创建的用户信息
|
||||
SysUserVo createdUser = userMapper.selectVoOne(
|
||||
new LambdaQueryWrapper<SysUser>()
|
||||
.eq(SysUser::getPhonenumber, phone)
|
||||
);
|
||||
|
||||
if (ObjectUtil.isNull(createdUser)) {
|
||||
log.error("根据AquUser创建系统用户后查询失败: phone={}, aquUserId={}", phone, aquUser.getId());
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
String warnPhoneJson = JsonUtils.toJsonString(warnPhoneList);
|
||||
|
||||
// 创建鱼测云用户对象
|
||||
AquUserBo aquUserBo = new AquUserBo();
|
||||
// 使用系统用户ID作为鱼测云用户ID,保持一致
|
||||
aquUserBo.setId(sysUser.getUserId());
|
||||
// 使用系统用户的昵称作为用户名
|
||||
aquUserBo.setUserName(sysUser.getNickName());
|
||||
// 设置手机号
|
||||
aquUserBo.setMobilePhone(sysUser.getPhonenumber());
|
||||
// 设置报警电话列表
|
||||
aquUserBo.setWarnPhoneJson(warnPhoneJson);
|
||||
// 非管理员
|
||||
aquUserBo.setIsManager(0L);
|
||||
// 没有大屏权限
|
||||
aquUserBo.setHasScreen(0L);
|
||||
// 备注
|
||||
aquUserBo.setRemark("短信登录自动创建");
|
||||
log.info("根据AquUser成功创建系统用户(ID一致): phone={}, userId={}, aquUserId={}, userName={}",
|
||||
phone, createdUser.getUserId(), aquUser.getId(), createdUser.getUserName());
|
||||
|
||||
// 调用服务创建鱼测云用户
|
||||
boolean success = aquUserService.insertByBo(aquUserBo);
|
||||
|
||||
if (success) {
|
||||
log.info("成功创建鱼测云用户: userId={}, userName={}, phone={}",
|
||||
sysUser.getUserId(), aquUserBo.getUserName(), aquUserBo.getMobilePhone());
|
||||
} else {
|
||||
log.error("创建鱼测云用户失败: userId={}", sysUser.getUserId());
|
||||
// 不抛异常,不影响登录流程
|
||||
}
|
||||
return createdUser;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("创建鱼测云用户异常: userId={}, error={}", sysUser.getUserId(), e.getMessage(), e);
|
||||
// 不抛异常,不影响登录流程
|
||||
log.error("根据AquUser创建系统用户异常: aquUserId={}, error={}", aquUser.getId(), e.getMessage(), e);
|
||||
throw new UserException("user.register.error");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user