mitao
2024-09-07 2862c3e4da3adbb4bea43151514f0c43b86476d6
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
@@ -1,36 +1,48 @@
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;
@@ -50,6 +62,8 @@
    private final SysUserClient sysUserClient;
    private final RemoteUserService remoteUserService;
    private final AppUserTreeService appUserTreeService;
    private final AppUserQuestionService appUserQuestionService;
    private final TagService tagService;
    /**
     * 获取用户信息
     *
@@ -74,9 +88,10 @@
     * @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;
    }
    /**
@@ -86,33 +101,34 @@
     * @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());
@@ -128,41 +144,45 @@
            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 待完善默认头像
@@ -176,11 +196,16 @@
            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;
    }
    /**
@@ -191,21 +216,23 @@
     */
    @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));
@@ -215,7 +242,7 @@
                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());
@@ -230,8 +257,14 @@
            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;
    }
    /**
@@ -256,7 +289,7 @@
     * @return
     */
    @Override
    public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) {
    public AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) {
        Integer loginType = body.getLoginType();
        String wxOrAppleId = body.getWxOrAppleId();
        SysUser sysUser;
@@ -296,29 +329,21 @@
            }
            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()) {
@@ -337,7 +362,104 @@
        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);
    }
}