package com.xinquan.user.service.impl;
|
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.crypto.SecureUtil;
|
import com.alibaba.nacos.common.utils.StringUtils;
|
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.AnswerTagEnum;
|
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.security.utils.SecurityUtils;
|
import com.xinquan.system.api.RemoteUserService;
|
import com.xinquan.system.api.domain.SysUser;
|
import com.xinquan.system.api.feignClient.SysUserClient;
|
import com.xinquan.system.api.model.AppCaptchaBody;
|
import com.xinquan.system.api.model.AppLoginUser;
|
import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
|
import com.xinquan.system.api.model.AppWXLoginBody;
|
import com.xinquan.user.api.domain.AppUser;
|
import com.xinquan.user.api.domain.dto.AppUserDTO;
|
import com.xinquan.user.domain.AppUserQuestion;
|
import com.xinquan.user.domain.AppUserTree;
|
import com.xinquan.user.domain.Tag;
|
import com.xinquan.user.domain.dto.UserAnswerDTO;
|
import com.xinquan.user.domain.vo.AppUserVO;
|
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 java.math.BigDecimal;
|
import java.time.LocalDateTime;
|
import java.util.List;
|
import java.util.Locale;
|
import java.util.Objects;
|
import java.util.Optional;
|
import java.util.stream.Collectors;
|
import lombok.RequiredArgsConstructor;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
/**
|
* <p>
|
* 用户信息表 服务实现类
|
* </p>
|
*
|
* @author mitao
|
* @since 2024-08-21
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> implements AppUserService {
|
|
private final SysUserClient sysUserClient;
|
private final RemoteUserService remoteUserService;
|
private final AppUserTreeService appUserTreeService;
|
private final AppUserQuestionService appUserQuestionService;
|
private final TagService tagService;
|
/**
|
* 获取用户信息
|
*
|
* @param dto
|
* @return
|
*/
|
@Override
|
public Optional<AppUser> getUserByCondition(AppUserDTO dto) {
|
return this.lambdaQuery()
|
.eq(Objects.nonNull(dto.getId()), AppUser::getId, dto.getId())
|
.eq(StringUtils.isNotBlank(dto.getAppleId()), AppUser::getAppleId, dto.getAppleId())
|
.eq(StringUtils.isNotBlank(dto.getCellPhone()), AppUser::getCellPhone,
|
dto.getCellPhone())
|
.eq(StringUtils.isNotBlank(dto.getWxOpenId()), AppUser::getWxOpenId,
|
dto.getWxOpenId())
|
.ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
|
}
|
|
/**
|
* app用户注册
|
* @param appUserDTO
|
* @return
|
*/
|
@Override
|
public AppUser registerAppUser(AppUserDTO appUserDTO) {
|
AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
|
this.save(appUser);
|
return appUser;
|
}
|
|
/**
|
* APP微信登录
|
*
|
* @param body
|
* @return
|
*/
|
@Override
|
public AppLoginUser wxLogin(AppWXLoginBody body) {
|
AppLoginUser appLoginUser = new AppLoginUser();
|
Optional<AppUser> optionalAppUser = this.getUserByCondition(
|
AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build());
|
AppUser appUser;
|
SysUser sysUser;
|
// 存在账户,查询关联系统用户
|
if (optionalAppUser.isPresent()) {
|
appUser = optionalAppUser.get();
|
if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) {
|
throw new ServiceException("账号已被冻结");
|
}
|
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
|
} else {
|
// 不存在账户,创建账户
|
// 注册用户信息
|
sysUser = new SysUser();
|
sysUser.setNickName(body.getNickname());
|
sysUser.setAvatar(body.getHeadImgUrl());
|
sysUser.setUserName(body.getNickname());
|
sysUser.setUserType("01"); // app用户
|
R<SysUser> 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.setWxOpenId(body.getWxOpenId());
|
appUser.setNickname(body.getNickname());
|
appUser.setAvatar(body.getHeadImgUrl());
|
appUser.setGender(body.getSex());
|
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());
|
this.save(appUser);
|
// 初始化用户树苗
|
initUserTree(appUser.getId());
|
}
|
appLoginUser.setUserid(sysUser.getUserId());
|
appLoginUser.setUsername(appUser.getNickname());
|
appLoginUser.setAppUserId(appUser.getId());
|
appLoginUser.setSysUser(sysUser);
|
if (Objects.nonNull(sysUser.getUserName())) {
|
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
|
appLoginUser.setCellPhone(appUser.getCellPhone());
|
}
|
return appLoginUser;
|
}
|
|
@Override
|
public AppLoginUser appleLogin(String appleId) {
|
AppLoginUser appLoginUser = new AppLoginUser();
|
Optional<AppUser> optionalAppUser = this.getUserByCondition(
|
AppUserDTO.builder().appleId(appleId).build());
|
SysUser sysUser;
|
AppUser appUser;
|
// 存在账户,查询关联系统用户
|
if (optionalAppUser.isPresent()) {
|
appUser = optionalAppUser.get();
|
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
|
} else {
|
// 不存在账户,创建账户
|
// 注册用户信息
|
sysUser = new SysUser();
|
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
|
sysUser.setNickName(nickname);
|
sysUser.setAvatar("qwer");
|
sysUser.setUserName(nickname);
|
sysUser.setUserType("01"); // app用户
|
R<SysUser> 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("qwer"); // 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());
|
this.save(appUser);
|
// 初始化用户树苗
|
initUserTree(appUser.getId());
|
}
|
appLoginUser.setUserid(sysUser.getUserId());
|
appLoginUser.setUsername(appUser.getNickname());
|
appLoginUser.setAppUserId(appUser.getId());
|
appLoginUser.setSysUser(sysUser);
|
if (Objects.nonNull(sysUser.getUserName())) {
|
appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
|
appLoginUser.setCellPhone(appUser.getCellPhone());
|
}
|
return appLoginUser;
|
}
|
|
/**
|
* 验证码登录
|
*
|
* @param body
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public AppLoginUser appCaptchaLogin(AppCaptchaBody body) {
|
AppLoginUser appLoginUser = new AppLoginUser();
|
Optional<AppUser> optionalAppUser = this.getUserByCondition(
|
AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
|
AppUser appUser;
|
SysUser sysUser;
|
if (optionalAppUser.isPresent()) {
|
appUser = optionalAppUser.get();
|
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
|
} else {
|
// 注册用户信息
|
sysUser = new SysUser();
|
String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
|
sysUser.setNickName(nickname);
|
sysUser.setAvatar("qwer");
|
sysUser.setUserName(body.getCellPhone());
|
sysUser.setUserType("01"); // app用户
|
// 设置默认密码123456
|
sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD));
|
|
R<SysUser> 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("qwer"); // 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());
|
this.save(appUser);
|
// 初始化用户树苗
|
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) {
|
AppUserTree appUserTree = new AppUserTree();
|
appUserTree.setAppUserId(appUserId);
|
appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode());
|
appUserTree.setGrowthValue(0);
|
appUserTree.setSowAgain(2);
|
appUserTree.setCurrentEnergyValue(0);
|
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<AppUser> baseOptionalAppUser = this.getUserByCondition(
|
AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
|
// 如果存在 更新wxOpenId 或appleId
|
if (baseOptionalAppUser.isPresent()) {
|
appUser = baseOptionalAppUser.get();
|
if (loginType.equals(1)) {
|
appUser.setWxOpenId(wxOrAppleId);
|
} else {
|
appUser.setAppleId(wxOrAppleId);
|
}
|
// 查询系统用户
|
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
|
if (Objects.isNull(sysUser)) {
|
throw new ServiceException("系统用户不存在");
|
}
|
} else {
|
Optional<AppUser> userOptional = getAppUserByThirdId(loginType, wxOrAppleId);
|
|
if (loginType.equals(1)) {
|
// 微信登录
|
handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
|
} else {
|
// 苹果登录
|
handleUserNotPresent(userOptional, "该用户不存在,请重新进行苹果授权登录");
|
}
|
appUser = userOptional.get();
|
appUser.setCellPhone(body.getCellPhone());
|
// 更新系统用户
|
sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
|
if (Objects.isNull(sysUser)) {
|
throw new ServiceException("系统用户不存在");
|
}
|
sysUser.setUserName(body.getCellPhone());
|
sysUser.setPassword(
|
SecurityUtils.encryptPassword(
|
SecureUtil.md5(Constants.DEFAULT_PASSWORD).toUpperCase(
|
Locale.ROOT)))
|
; // 默认密码为123456
|
sysUser.setPhonenumber(body.getCellPhone());
|
sysUserClient.updateSysUser(sysUser);
|
}
|
// 更新用户信息
|
this.updateById(appUser);
|
AppLoginUser appLoginUser = new AppLoginUser();
|
appLoginUser.setBindStatus(1);
|
appLoginUser.setCellPhone(body.getCellPhone());
|
appLoginUser.setSysUser(sysUser);
|
return appLoginUser;
|
}
|
// 定义一个方法来处理用户不存在的情况
|
private void handleUserNotPresent(Optional<AppUser> userOptional, String errorMessage) {
|
if (!userOptional.isPresent()) {
|
throw new ServiceException(errorMessage);
|
}
|
}
|
|
/**
|
* 根据第三方id获取未注销用户
|
*
|
* @param loginType 登录类型 1=微信 2=苹果
|
* @param wxOrAppleId 微信openid或苹果appleId
|
* @return Optional<AppUser>
|
*/
|
private Optional<AppUser> 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) {
|
// 获取当前登录用户
|
Long userId = SecurityUtils.getUserId();
|
AppUser appUser = this.getUserBySysUserId(userId);
|
List<AppUserQuestion> appUserQuestionList = BeanUtils.copyList(
|
dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
|
// 查询用户已填写的答案
|
List<AppUserQuestion> baseAppUserQuestionList = appUserQuestionService.lambdaQuery()
|
.eq(AppUserQuestion::getAppUserId, appUser.getUserId())
|
.list();
|
if (CollUtils.isNotEmpty(baseAppUserQuestionList)) {
|
// 根据类型更新答案
|
for (AppUserQuestion appUserQuestion : appUserQuestionList) {
|
Optional<AppUserQuestion> baseAppUserQuestionOptional = baseAppUserQuestionList.stream()
|
.filter(baseAppUserQuestion -> baseAppUserQuestion.getType()
|
.equals(appUserQuestion.getType())).findFirst();
|
baseAppUserQuestionOptional.ifPresent(
|
userQuestion -> appUserQuestion.setId(userQuestion.getId()));
|
}
|
}
|
appUserQuestionService.saveOrUpdateBatch(appUserQuestionList);
|
// 筛选答案为是和偶尔有的问题,为用户设置对应的标签
|
List<AppUserQuestion> appUserQuestionYesList = appUserQuestionList.stream()
|
.filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1")
|
|| appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList());
|
StringBuilder sb = new StringBuilder();
|
// 使用 StringBuilder 提高字符串拼接效率
|
if (CollUtils.isNotEmpty(appUserQuestionYesList)) {
|
List<Long> tagIdList = appUserQuestionYesList.stream()
|
.map(appUserQuestion -> AnswerTagEnum.getEnumByCode(appUserQuestion.getType())
|
.getTagId()).collect(Collectors.toList());
|
if (CollUtils.isNotEmpty(tagIdList)) {
|
sb.append(CollUtils.join(tagIdList, ","));
|
}
|
}
|
sb.append(",");
|
sb.append(dto.getTagIds());
|
appUser.setTagId(sb.toString());
|
this.updateById(appUser);
|
}
|
|
/**
|
* 获取AppUser
|
*
|
* @param userId 系统用户userId
|
* @return AppUser
|
*/
|
private AppUser getUserBySysUserId(Long userId) {
|
Optional<AppUser> appUserOptional = this.lambdaQuery().eq(AppUser::getUserId, userId)
|
.oneOpt();
|
if (!appUserOptional.isPresent()) {
|
throw new ServiceException("获取用户信息失败,请重新登录");
|
}
|
return appUserOptional.get();
|
}
|
|
/**
|
* 获取问题二的标签列表
|
*
|
* @return List<TagVO>
|
*/
|
@Override
|
public List<TagVO> getTagList() {
|
List<Tag> 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);
|
}
|
|
/**
|
* 获取当前登录用户信息
|
*
|
* @return 用户信息
|
* @see com.xinquan.user.domain.vo.AppUserVO
|
*/
|
@Override
|
public AppUserVO getCurrentUser() {
|
AppUser appUser = this.getById(SecurityUtils.getUserId());
|
return BeanUtils.copyBean(appUser, AppUserVO.class);
|
}
|
}
|