package com.xinquan.user.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinquan.common.core.constant.Constants;
import com.xinquan.common.core.constant.SecurityConstants;
import com.xinquan.common.core.domain.R;
import com.xinquan.common.core.enums.AppUserStatusEnum;
import com.xinquan.common.core.enums.DisabledEnum;
import com.xinquan.common.core.enums.TreeLevelEnum;
import com.xinquan.common.core.exception.ServiceException;
import com.xinquan.common.core.utils.page.BeanUtils;
import com.xinquan.common.core.utils.page.CollUtils;
import com.xinquan.common.core.web.page.PageInfo;
import com.xinquan.common.security.service.TokenService;
import com.xinquan.common.security.utils.SecurityUtils;
import com.xinquan.meditation.api.feign.RemoteMeditationService;
import com.xinquan.system.api.RemoteUserService;
import com.xinquan.system.api.domain.*;
import com.xinquan.system.api.domain.vo.AppUserVO;
import com.xinquan.system.api.domain.vo.InviteRankListVO;
import com.xinquan.system.api.feignClient.SysUserClient;
import com.xinquan.system.api.model.*;
import com.xinquan.user.api.domain.dto.AppUserDTO;
import com.xinquan.user.domain.dto.UserAnswerDTO;
import com.xinquan.user.domain.vo.TagVO;
import com.xinquan.user.mapper.AppUserMapper;
import com.xinquan.user.service.AppUserQuestionService;
import com.xinquan.user.service.AppUserService;
import com.xinquan.user.service.AppUserTreeService;
import com.xinquan.user.service.TagService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
*
* 用户信息表 服务实现类
*
*
* @author mitao
* @since 2024-08-21
*/
@Service
@RequiredArgsConstructor
public class AppUserServiceImpl extends ServiceImpl implements AppUserService {
private final SysUserClient sysUserClient;
private final RemoteUserService remoteUserService;
private final AppUserTreeService appUserTreeService;
private final AppUserQuestionService appUserQuestionService;
private final TagService tagService;
@Resource
private RemoteMeditationService remoteMeditationService;
/**
* 获取用户信息
*
* @param dto
* @return
*/
@Override
public Optional getUserByCondition(AppUserDTO dto) {
String device = dto.getDevice();
if (StringUtils.hasLength(dto.getDevice())) {
Optional one = this.lambdaQuery()
.ne(AppUser::getUserStatus,3)
.eq(AppUser::getDevice, device)
.isNull(AppUser::getWxOpenId)
.isNull(AppUser::getAppleId)
.isNull(AppUser::getCellPhone).oneOpt();
Optional appUser = this.lambdaQuery()
.ne(AppUser::getUserStatus,3)
.eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
dto.getCellPhone())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
dto.getWxOpenId())
.ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
// 如果不存在
if (!appUser.isPresent()){
if (one.isPresent()) {
initUserTree(one.get().getId());
this.updateById(one.get());
return one;
} else {
return this.lambdaQuery()
.eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
dto.getCellPhone())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
dto.getWxOpenId())
.ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
}
}
}
return this.lambdaQuery()
.eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
dto.getCellPhone())
.eq(com.alibaba.nacos.common.utils.StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
dto.getWxOpenId())
.ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
}
@Override
public Optional getUserByCondition1(AppUserDTO dto) {
return this.lambdaQuery()
.eq(AppUser::getCellPhone,dto.getCellPhone())
.ne(AppUser::getUserStatus,3).oneOpt();
}
/**
* app用户注册
* @param appUserDTO
* @return
*/
@Override
public AppUser registerAppUser(AppUserDTO appUserDTO) {
if (StringUtils.hasLength(appUserDTO.getDevice())){
AppUser one = this.lambdaQuery().eq(AppUser::getDevice, appUserDTO.getDevice())
.isNull(AppUser::getCellPhone).one();
if (one == null){
AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH"+format+randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
initUserTree(appUser.getId());
return appUser;
}else{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
one.setCode("YH"+format+randomCode);
this.updateById(one);
initUserTree(one.getId());
return one;
}
}
AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH"+format+randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
initUserTree(appUser.getId());
return appUser;
}
/**
* APP微信登录
*
* @param body
* @return
*/
@Override
public AppLoginUser wxLogin(AppWXLoginBody body) {
AppLoginUser appLoginUser = new AppLoginUser();
Optional optionalAppUser = this.getUserByCondition(
AppUserDTO.builder().wxOpenId(body.getWxOpenId()).device(body.getDevice()).build());
AppUser appUser = new AppUser();
SysUser sysUser = new SysUser();
// 存在账户,查询关联系统用户
if (optionalAppUser.isPresent()) {
appUser = optionalAppUser.get();
if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) {
throw new ServiceException("账号已被冻结");
}
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
appUser.setAvatar(body.getHeadImgUrl());
appUser.setWxName(body.getNickname());
if (appUser.getCellPhone()!=null){
appLoginUser.setBindStatus(DisabledEnum.NO.getCode());
appLoginUser.setCellPhone(appUser.getCellPhone());
}else{
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
}
} else {
if (org.springframework.util.StringUtils.hasLength(body.getDevice())){
AppUser one = this.getOne(new LambdaQueryWrapper<>(AppUser.class)
.eq(AppUser::getDevice, body.getDevice())
.isNull(AppUser::getCellPhone));
if (one!=null){
initUserTree(appUser.getId());
appUser = one;
}else{
// 不存在账户,创建账户
// 注册用户信息
sysUser = new SysUser();
sysUser.setNickName(body.getNickname());
sysUser.setAvatar(body.getHeadImgUrl());
sysUser.setUserName(body.getNickname());
sysUser.setUserType("01"); // app用户
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setUserId(sysUserRes.getUserId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH"+format+randomCode);
appUser.setWxOpenId(body.getWxOpenId());
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
appUser.setNickname(nickname);
appUser.setDevice(body.getDevice());
appUser.setWxName(body.getNickname());
appUser.setAvatar(body.getHeadImgUrl());
appUser.setGender(3);
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
}else{
// 不存在账户,创建账户
// 注册用户信息
sysUser = new SysUser();
sysUser.setNickName(body.getNickname());
sysUser.setAvatar(body.getHeadImgUrl());
sysUser.setUserName(body.getNickname());
sysUser.setUserType("01"); // app用户
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setUserId(sysUserRes.getUserId());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH"+format+randomCode);
appUser.setWxOpenId(body.getWxOpenId());
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
appUser.setNickname(nickname);
appUser.setWxName(body.getNickname());
appUser.setAvatar(body.getHeadImgUrl());
appUser.setDevice(body.getDevice());
appUser.setGender(3);
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
}
appLoginUser.setUserid(sysUser.getUserId());
appLoginUser.setUsername(appUser.getNickname());
appLoginUser.setAppUserId(appUser.getId());
appLoginUser.setSysUser(sysUser);
this.updateById(appUser);
// if (Objects.nonNull(sysUser.getUserName())) {
// appLoginUser.setCellPhone(appUser.getCellPhone());
// }
return appLoginUser;
}
@Override
public AppLoginUser appleLogin(String appleId,String device) {
AppLoginUser appLoginUser = new AppLoginUser();
Optional optionalAppUser = this.getUserByCondition(
AppUserDTO.builder().appleId(appleId).device(device).build());
SysUser sysUser = new SysUser();
AppUser appUser = new AppUser();
// 存在账户,查询关联系统用户
if (optionalAppUser.isPresent()) {
appUser = optionalAppUser.get();
if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) {
throw new ServiceException("账号已被冻结");
}
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
if (appUser.getCellPhone() != null) {
appLoginUser.setBindStatus(DisabledEnum.NO.getCode());
appLoginUser.setCellPhone(appUser.getCellPhone());
}
} else {
if (org.springframework.util.StringUtils.hasLength(device)) {
AppUser one = this.getOne(new LambdaQueryWrapper<>(AppUser.class)
.eq(AppUser::getDevice, device)
.isNull(AppUser::getCellPhone));
if (one != null) {
initUserTree(one.getId());
appUser.setAppleId(appleId);
appUser = one;
this.updateById(appUser);
} else {
// 不存在账户,创建账户
// 注册用户信息
sysUser = new SysUser();
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
sysUser.setUserName(nickname);
sysUser.setUserType("01"); // app用户
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setAppleId(appleId);
appUser.setUserId(sysUserRes.getUserId());
appUser.setNickname(nickname);
appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setDevice(device);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH" + format + randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
}else{
// 不存在账户,创建账户
// 注册用户信息
sysUser = new SysUser();
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
sysUser.setUserName(nickname);
sysUser.setUserType("01"); // app用户
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setAppleId(appleId);
appUser.setUserId(sysUserRes.getUserId());
appUser.setNickname(nickname);
appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setDevice(device);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH" + format + randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
}
appLoginUser.setUserid(sysUser.getUserId());
appLoginUser.setUsername(appUser.getNickname());
appLoginUser.setAppUserId(appUser.getId());
appLoginUser.setSysUser(sysUser);
return appLoginUser;
}
/**
* 验证码登录
*
* @param body
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public AppLoginUser appCaptchaLogin (AppCaptchaBody body){
AppLoginUser appLoginUser = new AppLoginUser();
Optional optionalAppUser = this.getUserByCondition(
AppUserDTO.builder().device(body.getDevice()).cellPhone(body.getCellPhone()).build());
AppUser appUser = new AppUser();
SysUser sysUser = new SysUser();
if (optionalAppUser.isPresent()) {
appUser = optionalAppUser.get();
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
} else {
if (org.springframework.util.StringUtils.hasLength(body.getDevice())) {
AppUser one = this.getOne(new LambdaQueryWrapper<>(AppUser.class)
.eq(AppUser::getDevice, body.getDevice())
.isNull(AppUser::getCellPhone));
if (one != null) {
initUserTree(appUser.getId());
appUser = one;
} else {
// 注册用户信息
sysUser = new SysUser();
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
sysUser.setUserName(body.getCellPhone());
sysUser.setUserType("01"); // app用户
// 设置默认密码123456
sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setUserId(sysUserRes.getUserId());
appUser.setNickname(nickname);
appUser.setCellPhone(body.getCellPhone());
appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH" + format + randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
} else {
// 注册用户信息
sysUser = new SysUser();
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
sysUser.setUserName(body.getCellPhone());
sysUser.setUserType("01"); // app用户
// 设置默认密码123456
sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setUserId(sysUserRes.getUserId());
appUser.setNickname(nickname);
appUser.setCellPhone(body.getCellPhone());
appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH" + format + randomCode);
this.save(appUser);
remoteMeditationService.addHomeBackgroundMusicDefault(appUser.getId());
// 初始化用户树苗
initUserTree(appUser.getId());
}
}
appLoginUser.setUserid(sysUser.getUserId());
appLoginUser.setUsername(appUser.getNickname());
appLoginUser.setAppUserId(appUser.getId());
appLoginUser.setSysUser(sysUser);
appLoginUser.setCellPhone(appUser.getCellPhone());
return appLoginUser;
}
/**
* 初始化用户树苗
*
* @param appUserId 用户id
*/
private void initUserTree(Long appUserId) {
if (appUserTreeService.lambdaQuery().eq(AppUserTree::getSowAgain,2).eq(AppUserTree::getAppUserId,appUserId).one()!=null){
return;
}
AppUserTree appUserTree = new AppUserTree();
appUserTree.setAppUserId(appUserId);
appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode());
appUserTree.setGrowthValue(0);
appUserTree.setSowAgain(2);
appUserTree.setTime(LocalDateTime.now());
appUserTreeService.save(appUserTree);
}
/**
* 微信苹果登录验证手机号码操作
*
* @param body
* @return
*/
@Override
public AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) {
Integer loginType = body.getLoginType();
String wxOrAppleId = body.getWxOrAppleId();
SysUser sysUser;
AppUser appUser;
// 先通过手机号查询用户,如果用户先使用手机号码登录过,那么就已经存在这个手机号码的用户了。
Optional baseOptionalAppUser = this.getUserByCondition(
AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
// 如果存在 更新wxOpenId 或appleId
if (baseOptionalAppUser.isPresent()) {
appUser = baseOptionalAppUser.get();
if (appUser.getWxOpenId() !=null){
throw new ServiceException("该手机号已绑定其他微信号,请更换手机号重新绑定");
}
if (appUser.getAppleId() !=null){
throw new ServiceException("该手机号已绑定其他苹果号,请更换手机号重新绑定");
}
switch (body.getLoginType()){
case 1:
this.remove(new LambdaQueryWrapper()
.eq(AppUser::getWxOpenId,body.getWxOrAppleId())
.ne(AppUser::getId,appUser.getId()));
break;
case 2:
this.remove(new LambdaQueryWrapper()
.eq(AppUser::getAppleId,body.getWxOrAppleId())
.ne(AppUser::getId,appUser.getId()));
break;
}
if (loginType.equals(1)) {
appUser.setWxOpenId(wxOrAppleId);
} else {
appUser.setAppleId(wxOrAppleId);
}
appUser.setEmail(body.getEmail());
appUser.setNickname(body.getName());
// 查询系统用户
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
if (Objects.isNull(sysUser)) {
throw new ServiceException("系统用户不存在");
}
} else {
Optional userOptional = getAppUserByThirdId(loginType, wxOrAppleId);
if (!userOptional.isPresent()) {
if (loginType.equals(1)) {
// 微信登录
handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
} else {
// 苹果登录
handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录");
}
}
appUser = userOptional.get();
appUser.setCellPhone(body.getCellPhone());
appUser.setEmail(body.getEmail());
appUser.setNickname(body.getName());
// 更新系统用户
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
if (Objects.isNull(sysUser)) {
throw new ServiceException("系统用户不存在");
}
sysUser.setUserName(body.getCellPhone());
sysUser.setPassword(
SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD))
; // 默认密码为a12345678
sysUser.setPhonenumber(body.getCellPhone());
sysUserClient.updateSysUser(sysUser);
}
// 更新用户信息
this.updateById(appUser);
AppLoginUser appLoginUser = new AppLoginUser();
appLoginUser.setAppUserId(appUser.getId());
appLoginUser.setBindStatus(1);
appLoginUser.setCellPhone(body.getCellPhone());
appLoginUser.setSysUser(sysUser);
return appLoginUser;
}
// 定义一个方法来处理用户不存在的情况
private void handleUserNotPresent(Optional userOptional, String errorMessage) {
if (!userOptional.isPresent()) {
throw new ServiceException(errorMessage);
}
}
/**
* 根据第三方id获取未注销用户
*
* @param loginType 登录类型 1=微信 2=苹果
* @param wxOrAppleId 微信openid或苹果appleId
* @return Optional
*/
private Optional getAppUserByThirdId(Integer loginType, String wxOrAppleId) {
return this.lambdaQuery()
.eq(loginType.equals(1), AppUser::getWxOpenId, wxOrAppleId)
.eq(loginType.equals(2), AppUser::getAppleId, wxOrAppleId)
.ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode())
.oneOpt();
}
/**
* 保存计划引导页用户的答案
*
* @param dto 用户计划引导答案数据传输对象
*/
@Override
public void saveUserAnswers(UserAnswerDTO dto) {
if (tokenService.getLoginUser()==null){
// 获取当前登录用户
if (org.springframework.util.StringUtils.hasLength(dto.getDevice())){
AppUser one = this.lambdaQuery().eq(AppUser::getDevice, dto.getDevice())
.isNull(AppUser::getCellPhone).one();
if (one==null){
SysUser sysUser = new SysUser();
AppUser appUser = new AppUser();
// 注册用户信息
sysUser = new SysUser();
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
sysUser.setNickName(nickname);
sysUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg");
sysUser.setUserName(nickname);
sysUser.setUserType("01"); // app用户
// 设置默认密码123456
sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
R registerResult = remoteUserService.registerAppUserInfo(sysUser,
SecurityConstants.INNER);
if (registerResult.getCode() == Constants.FAIL) {
throw new ServiceException(registerResult.getMsg());
}
SysUser sysUserRes = registerResult.getData();
appUser = new AppUser();
appUser.setUserId(sysUserRes.getUserId());
appUser.setNickname(nickname);
appUser.setAvatar("https://xqgwzh.obs.cn-south-1.myhuaweicloud.com/Logo%E7%A1%AE%E8%AE%A4%E7%89%88%281%29.jpg"); // TODO 待完善默认头像
appUser.setBalance(BigDecimal.ZERO);
appUser.setSanskritFlag(DisabledEnum.NO.getCode());
appUser.setBalance(BigDecimal.ZERO);
appUser.setIncome(BigDecimal.ZERO);
appUser.setTotalEnergyValue(0);
appUser.setRegisterTime(LocalDateTime.now());
appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
appUser.setDevice(dto.getDevice());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
String format = simpleDateFormat.format(new Date());
// 生成四位随机数字
String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
appUser.setCode("YH"+format+randomCode);
this.save(appUser);
Long userId = appUser.getId();
List appUserQuestionList = BeanUtils.copyList(
dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
// 查询用户已填写的答案
List baseAppUserQuestionList = appUserQuestionService.lambdaQuery()
.eq(AppUserQuestion::getAppUserId, appUser.getUserId())
.list();
if (CollUtils.isNotEmpty(baseAppUserQuestionList)) {
// 根据类型更新答案
for (AppUserQuestion appUserQuestion : appUserQuestionList) {
Optional baseAppUserQuestionOptional = baseAppUserQuestionList.stream()
.filter(baseAppUserQuestion -> baseAppUserQuestion.getType()
.equals(appUserQuestion.getType())).findFirst();
baseAppUserQuestionOptional.ifPresent(
userQuestion -> appUserQuestion.setId(userQuestion.getId()));
appUserQuestion.setAppUserId(userId);
}
}
for (AppUserQuestion appUserQuestion : appUserQuestionList) {
appUserQuestion.setAppUserId(userId);
}
appUserQuestionService.saveOrUpdateBatch(appUserQuestionList);
// 筛选答案为是和偶尔有的问题,为用户设置对应的标签
List appUserQuestionYesList = appUserQuestionList.stream()
.filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1")
|| appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
appUser.setTagId(dto.getTagIds());
this.updateById(appUser);
}else{
List appUserQuestionList = BeanUtils.copyList(
dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
// 查询用户已填写的答案
// 删除之前答案
appUserQuestionService.lambdaUpdate().eq(AppUserQuestion::getAppUserId,one.getId()).remove();
// 根据类型更新答案
for (AppUserQuestion appUserQuestion : appUserQuestionList) {
appUserQuestion.setAppUserId(one.getId());
}
appUserQuestionService.saveBatch(appUserQuestionList);
// 筛选答案为是和偶尔有的问题,为用户设置对应的标签
List appUserQuestionYesList = appUserQuestionList.stream()
.filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1")
|| appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
one.setTagId(dto.getTagIds());
this.updateById(one);
}
}
}else{
Long userId = tokenService.getLoginUser().getUserid();
AppUser appUser = this.getById(userId);
List appUserQuestionList = BeanUtils.copyList(
dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
// 查询用户已填写的答案
// 删除之前答案
appUserQuestionService.lambdaUpdate().eq(AppUserQuestion::getAppUserId,userId).remove();
// 根据类型更新答案
for (AppUserQuestion appUserQuestion : appUserQuestionList) {
appUserQuestion.setAppUserId(userId);
}
appUserQuestionService.saveBatch(appUserQuestionList);
// 筛选答案为是和偶尔有的问题,为用户设置对应的标签
List appUserQuestionYesList = appUserQuestionList.stream()
.filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1")
|| appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
appUser.setTagId(dto.getTagIds());
this.updateById(appUser);
}
}
/**
* 获取AppUser
*
* @param userId 系统用户userId
* @return AppUser
*/
private AppUser getUserBySysUserId(Long userId) {
Optional appUserOptional = this.lambdaQuery().eq(AppUser::getUserId, userId)
.oneOpt();
if (!appUserOptional.isPresent()) {
throw new ServiceException("获取用户信息失败,请重新登录");
}
return appUserOptional.get();
}
/**
* 获取问题二的标签列表
*
* @return List
*/
@Override
public List getTagList() {
List list = tagService.list(Wrappers.lambdaQuery(Tag.class).eq(Tag::getTagType, 2));
return BeanUtils.copyList(list, TagVO.class);
}
/**
* 更新APP用户信息
*
* @param dto APP用户数据传输对象
*/
@Override
public void updateAppUser(AppUserDTO dto) {
// 拷贝数据
AppUser appUser = BeanUtils.copyBean(dto, AppUser.class);
this.updateById(appUser);
}
@Autowired
private TokenService tokenService;
/**
* 获取当前登录用户信息
*
* @return 用户信息
* @see AppUserVO
*/
@Override
public AppUserVO getCurrentUser() {
LoginUser loginUser = tokenService.getLoginUser();
Long userId = loginUser.getUserid();
AppUser appUser = this.getById(userId);
return BeanUtils.copyBean(appUser, AppUserVO.class);
}
@Override
public List inviteRankList(Integer pageCurr,Integer pageSize) {
List list = this.baseMapper.inviteRankList(pageCurr,pageSize);
return list;
}
@Override
public List inviteRankListNolimit() {
List list = this.baseMapper.inviteRankListNolimit();
return list;
}
}