| | |
| | | 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.system.api.model.AppleLoginUser; |
| | | import com.xinquan.system.api.model.LoginUser; |
| | | import com.xinquan.system.api.model.WXLoginUser; |
| | | 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; |
| | |
| | | private final SysUserClient sysUserClient; |
| | | private final RemoteUserService remoteUserService; |
| | | private final AppUserTreeService appUserTreeService; |
| | | private final AppUserQuestionService appUserQuestionService; |
| | | private final TagService tagService; |
| | | /** |
| | | * 获取用户信息 |
| | | * |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public Boolean registerAppUser(AppUserDTO appUserDTO) { |
| | | public AppUser registerAppUser(AppUserDTO appUserDTO) { |
| | | AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class); |
| | | return this.save(appUser); |
| | | this.save(appUser); |
| | | return appUser; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public WXLoginUser wxLogin(AppWXLoginBody body) { |
| | | WXLoginUser wxLoginUser = new WXLoginUser(); |
| | | 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 appUser = optionalAppUser.get(); |
| | | SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | wxLoginUser.setSysUser(sysUser); |
| | | if (Objects.nonNull(sysUser.getUserName())) { |
| | | wxLoginUser.setBindStatus(1); |
| | | wxLoginUser.setCellPhone(appUser.getCellPhone()); |
| | | appUser = optionalAppUser.get(); |
| | | if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) { |
| | | throw new ServiceException("账号已被冻结"); |
| | | } |
| | | sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | } else { |
| | | // 不存在账户,创建账户 |
| | | // 注册用户信息 |
| | | SysUser sysUser = new SysUser(); |
| | | 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 appUser = new AppUser(); |
| | | appUser = new AppUser(); |
| | | appUser.setUserId(sysUserRes.getUserId()); |
| | | appUser.setWxOpenId(body.getWxOpenId()); |
| | | appUser.setNickname(body.getNickname()); |
| | |
| | | this.save(appUser); |
| | | // 初始化用户树苗 |
| | | initUserTree(appUser.getId()); |
| | | wxLoginUser.setSysUser(null); |
| | | wxLoginUser.setBindStatus(DisabledEnum.NO.getCode()); |
| | | } |
| | | return wxLoginUser; |
| | | 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 AppleLoginUser appleLogin(String appleId) { |
| | | AppleLoginUser appleLoginUser = new AppleLoginUser(); |
| | | 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 appUser = optionalAppUser.get(); |
| | | SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | appleLoginUser.setSysUser(sysUser); |
| | | if (Objects.nonNull(sysUser.getUserName())) { |
| | | appleLoginUser.setBindStatus(1); |
| | | appleLoginUser.setCellPhone(appUser.getCellPhone()); |
| | | } |
| | | appUser = optionalAppUser.get(); |
| | | sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | } else { |
| | | // 不存在账户,创建账户 |
| | | // 注册用户信息 |
| | | SysUser sysUser = new SysUser(); |
| | | 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 appUser = new AppUser(); |
| | | appUser = new AppUser(); |
| | | appUser.setUserId(sysUserRes.getUserId()); |
| | | appUser.setNickname(nickname); |
| | | appUser.setAvatar("qwer"); // TODO 待完善默认头像 |
| | |
| | | this.save(appUser); |
| | | // 初始化用户树苗 |
| | | initUserTree(appUser.getId()); |
| | | appleLoginUser.setSysUser(null); |
| | | appleLoginUser.setBindStatus(DisabledEnum.NO.getCode()); |
| | | } |
| | | |
| | | return appleLoginUser; |
| | | 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 |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public LoginUser appCaptchaLogin(AppCaptchaBody body) { |
| | | LoginUser loginUser = new LoginUser(); |
| | | 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 appUser = optionalAppUser.get(); |
| | | SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | loginUser.setSysUser(sysUser); |
| | | appUser = optionalAppUser.get(); |
| | | sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); |
| | | } else { |
| | | // 注册用户信息 |
| | | SysUser sysUser = new SysUser(); |
| | | 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)); |
| | | |
| | |
| | | throw new ServiceException(registerResult.getMsg()); |
| | | } |
| | | SysUser sysUserRes = registerResult.getData(); |
| | | AppUser appUser = new AppUser(); |
| | | appUser = new AppUser(); |
| | | appUser.setUserId(sysUserRes.getUserId()); |
| | | appUser.setNickname(nickname); |
| | | appUser.setCellPhone(body.getCellPhone()); |
| | |
| | | this.save(appUser); |
| | | // 初始化用户树苗 |
| | | initUserTree(appUser.getId()); |
| | | |
| | | } |
| | | return loginUser; |
| | | appLoginUser.setUserid(sysUser.getUserId()); |
| | | appLoginUser.setUsername(appUser.getNickname()); |
| | | appLoginUser.setAppUserId(appUser.getId()); |
| | | appLoginUser.setSysUser(sysUser); |
| | | appLoginUser.setCellPhone(appUser.getCellPhone()); |
| | | return appLoginUser; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { |
| | | public AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { |
| | | Integer loginType = body.getLoginType(); |
| | | String wxOrAppleId = body.getWxOrAppleId(); |
| | | SysUser sysUser; |
| | |
| | | } |
| | | sysUser.setUserName(body.getCellPhone()); |
| | | sysUser.setPassword( |
| | | SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); // 默认密码为123456 |
| | | SecurityUtils.encryptPassword( |
| | | SecureUtil.md5(Constants.DEFAULT_PASSWORD).toUpperCase( |
| | | Locale.ROOT))) |
| | | ; // 默认密码为123456 |
| | | sysUser.setPhonenumber(body.getCellPhone()); |
| | | sysUserClient.updateSysUser(sysUser); |
| | | } |
| | | // 更新用户信息 |
| | | this.updateById(appUser); |
| | | if (loginType.equals(1)) { |
| | | // 微信登录 |
| | | WXLoginUser wxLoginUser = new WXLoginUser(); |
| | | wxLoginUser.setBindStatus(1); |
| | | wxLoginUser.setCellPhone(body.getCellPhone()); |
| | | wxLoginUser.setSysUser(sysUser); |
| | | return wxLoginUser; |
| | | } else { |
| | | // 苹果登录 |
| | | AppleLoginUser appleLoginUser = new AppleLoginUser(); |
| | | appleLoginUser.setBindStatus(1); |
| | | appleLoginUser.setCellPhone(body.getCellPhone()); |
| | | appleLoginUser.setSysUser(sysUser); |
| | | return appleLoginUser; |
| | | } |
| | | 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()) { |
| | |
| | | return this.lambdaQuery() |
| | | .eq(loginType.equals(1), AppUser::getWxOpenId, wxOrAppleId) |
| | | .eq(loginType.equals(2), AppUser::getAppleId, wxOrAppleId) |
| | | .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT) |
| | | .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); |
| | | } |
| | | } |