无关风月
2024-11-09 8ccb2603009768c366f197d23ad9840811100cd2
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
@@ -3,6 +3,7 @@
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.nacos.common.utils.StringUtils;
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;
@@ -15,21 +16,19 @@
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.service.TokenService;
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.system.api.model.*;
import com.xinquan.system.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.system.api.domain.AppUserQuestion;
import com.xinquan.system.api.domain.AppUserTree;
import com.xinquan.system.api.domain.Tag;
import com.xinquan.user.domain.dto.UserAnswerDTO;
import com.xinquan.user.domain.vo.AppUserVO;
import com.xinquan.system.api.domain.vo.AppUserVO;
import com.xinquan.user.domain.vo.TagVO;
import com.xinquan.user.mapper.AppUserMapper;
import com.xinquan.user.service.AppUserQuestionService;
@@ -37,13 +36,12 @@
import com.xinquan.user.service.AppUserTreeService;
import com.xinquan.user.service.TagService;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -82,6 +80,10 @@
                .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
    }
    public static void main(String[] args) {
        String randomCode = String.valueOf((int) ((Math.random() * 9 + 1) * 1000));
        System.err.println(randomCode);
    }
    /**
     * app用户注册
     * @param appUserDTO
@@ -90,7 +92,13 @@
    @Override
    public AppUser registerAppUser(AppUserDTO appUserDTO) {
        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);
        initUserTree(appUser.getId());
        return appUser;
    }
@@ -114,6 +122,12 @@
                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 {
            // 不存在账户,创建账户
            // 注册用户信息
@@ -130,10 +144,18 @@
            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());
            appUser.setNickname(body.getNickname());
            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
            sysUser.setNickName(nickname);
            appUser.setNickname(nickname);
            appUser.setWxName(body.getNickname());
            appUser.setAvatar(body.getHeadImgUrl());
            appUser.setGender(body.getSex());
            appUser.setGender(3);
            appUser.setBalance(BigDecimal.ZERO);
            appUser.setSanskritFlag(DisabledEnum.NO.getCode());
            appUser.setBalance(BigDecimal.ZERO);
@@ -141,6 +163,7 @@
            appUser.setTotalEnergyValue(0);
            appUser.setRegisterTime(LocalDateTime.now());
            appUser.setLevelSettingId(TreeLevelEnum.SEED.getCode());
            appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
            this.save(appUser);
            // 初始化用户树苗
            initUserTree(appUser.getId());
@@ -149,10 +172,10 @@
        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());
        }
        this.updateById(appUser);
//        if (Objects.nonNull(sysUser.getUserName())) {
//            appLoginUser.setCellPhone(appUser.getCellPhone());
//        }
        return appLoginUser;
    }
@@ -166,14 +189,21 @@
        // 存在账户,查询关联系统用户
        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 {
            // 不存在账户,创建账户
            // 注册用户信息
            sysUser = new SysUser();
            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
            sysUser.setNickName(nickname);
            sysUser.setAvatar("qwer");
            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<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser,
@@ -183,9 +213,10 @@
            }
            SysUser sysUserRes = registerResult.getData();
            appUser = new AppUser();
            appUser.setAppleId(appleId);
            appUser.setUserId(sysUserRes.getUserId());
            appUser.setNickname(nickname);
            appUser.setAvatar("qwer"); // TODO 待完善默认头像
            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);
@@ -193,6 +224,11 @@
            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);
            // 初始化用户树苗
            initUserTree(appUser.getId());
@@ -201,10 +237,10 @@
        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());
        }
//        if (Objects.nonNull(sysUser.getUserName())) {
//            appLoginUser.setBindStatus(DisabledEnum.YES.getCode());
//            appLoginUser.setCellPhone(appUser.getCellPhone());
//        }
        return appLoginUser;
    }
@@ -230,7 +266,7 @@
            sysUser = new SysUser();
            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
            sysUser.setNickName(nickname);
            sysUser.setAvatar("qwer");
            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
@@ -246,7 +282,7 @@
            appUser.setUserId(sysUserRes.getUserId());
            appUser.setNickname(nickname);
            appUser.setCellPhone(body.getCellPhone());
            appUser.setAvatar("qwer"); // TODO 待完善默认头像
            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);
@@ -254,6 +290,11 @@
            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);
            // 初始化用户树苗
            initUserTree(appUser.getId());
@@ -278,7 +319,7 @@
        appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode());
        appUserTree.setGrowthValue(0);
        appUserTree.setSowAgain(2);
        appUserTree.setCurrentEnergyValue(0);
        appUserTree.setTime(LocalDateTime.now());
        appUserTreeService.save(appUserTree);
    }
@@ -300,11 +341,32 @@
        // 如果存在 更新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<AppUser>()
                            .eq(AppUser::getWxOpenId,body.getWxOrAppleId())
                            .ne(AppUser::getId,appUser.getId()));
                    break;
                case 2:
                    this.remove(new LambdaQueryWrapper<AppUser>()
                            .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)) {
@@ -312,7 +374,6 @@
            }
        } else {
            Optional<AppUser> userOptional = getAppUserByThirdId(loginType, wxOrAppleId);
            if (loginType.equals(1)) {
                // 微信登录
                handleUserNotPresent(userOptional, "该用户不存在,请重新进行微信授权登录");
@@ -322,6 +383,8 @@
            }
            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)) {
@@ -329,10 +392,8 @@
            }
            sysUser.setUserName(body.getCellPhone());
            sysUser.setPassword(
                    SecurityUtils.encryptPassword(
                            SecureUtil.md5(Constants.DEFAULT_PASSWORD).toUpperCase(
                                    Locale.ROOT)))
            ; // 默认密码为123456
                    SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD))
            ; // 默认密码为a12345678
            sysUser.setPhonenumber(body.getCellPhone());
            sysUserClient.updateSysUser(sysUser);
        }
@@ -374,8 +435,8 @@
    @Override
    public void saveUserAnswers(UserAnswerDTO dto) {
        // 获取当前登录用户
        Long userId = SecurityUtils.getUserId();
        AppUser appUser = this.getUserBySysUserId(userId);
        Long userId = tokenService.getLoginUser().getUserid();
        AppUser appUser = this.getById(userId);
        List<AppUserQuestion> appUserQuestionList = BeanUtils.copyList(
                dto.getUserAnswerOneDTOList(), AppUserQuestion.class);
        // 查询用户已填写的答案
@@ -385,31 +446,24 @@
        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()));
                appUserQuestion.setAppUserId(userId);
            }
        }
        for (AppUserQuestion appUserQuestion : appUserQuestionList) {
            appUserQuestion.setAppUserId(userId);
        }
        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());
        appUser.setTagId(dto.getTagIds());
        this.updateById(appUser);
    }
@@ -451,15 +505,20 @@
        this.updateById(appUser);
    }
    @Autowired
    private TokenService tokenService;
    /**
     * 获取当前登录用户信息
     *
     * @return 用户信息
     * @see com.xinquan.user.domain.vo.AppUserVO
     * @see AppUserVO
     */
    @Override
    public AppUserVO getCurrentUser() {
        AppUser appUser = this.getById(SecurityUtils.getUserId());
        LoginUser loginUser = tokenService.getLoginUser();
        Long userId = loginUser.getUserid();
        AppUser appUser = this.getById(userId);
        return BeanUtils.copyBean(appUser, AppUserVO.class);
    }
}