mitao
2024-08-24 403fbe8fa8d3df96d692ad41ffa1c300b0db5493
xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java
@@ -1,13 +1,39 @@
package com.xinquan.user.service.impl;
import cn.hutool.core.util.IdUtil;
import com.alibaba.nacos.common.utils.StringUtils;
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.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.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.AppUserTree;
import com.xinquan.user.mapper.AppUserMapper;
import com.xinquan.user.service.AppUserService;
import com.xinquan.user.service.AppUserTreeService;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * <p>
@@ -18,20 +44,28 @@
 * @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;
    /**
     * 获取用户信息
     *
     * @param dto
     * @return
     */
    @Override
    public AppUser getUserByCondition(AppUserDTO dto) {
    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()).oneOpt().orElse(null);
                        dto.getWxOpenId())
                .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()).oneOpt();
    }
    /**
@@ -44,4 +78,266 @@
        AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class);
        return this.save(appUser);
    }
    /**
     * APP微信登录
     *
     * @param body
     * @return
     */
    @Override
    public WXLoginUser wxLogin(AppWXLoginBody body) {
        WXLoginUser wxLoginUser = new WXLoginUser();
        Optional<AppUser> optionalAppUser = this.getUserByCondition(
                AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build());
        // 存在账户,查询关联系统用户
        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());
            }
        } else {
            // 不存在账户,创建账户
            // 注册用户信息
            SysUser sysUser = new SysUser();
            sysUser.setNickName(body.getNickname());
            sysUser.setAvatar(body.getHeadImgUrl());
            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.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());
            wxLoginUser.setSysUser(null);
            wxLoginUser.setBindStatus(DisabledEnum.NO.getCode());
        }
        return wxLoginUser;
    }
    @Override
    public AppleLoginUser appleLogin(String appleId) {
        AppleLoginUser appleLoginUser = new AppleLoginUser();
        Optional<AppUser> optionalAppUser = this.getUserByCondition(
                AppUserDTO.builder().appleId(appleId).build());
        // 存在账户,查询关联系统用户
        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());
            }
        } else {
            // 不存在账户,创建账户
            // 注册用户信息
            SysUser sysUser = new SysUser();
            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
            sysUser.setNickName(nickname);
            sysUser.setAvatar("qwer");
            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.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());
            appleLoginUser.setSysUser(null);
            appleLoginUser.setBindStatus(DisabledEnum.NO.getCode());
        }
        return appleLoginUser;
    }
    /**
     * 验证码登录
     *
     * @param body
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public LoginUser appCaptchaLogin(AppCaptchaBody body) {
        LoginUser loginUser = new LoginUser();
        Optional<AppUser> optionalAppUser = this.getUserByCondition(
                AppUserDTO.builder().cellPhone(body.getCellPhone()).build());
        if (optionalAppUser.isPresent()) {
            AppUser appUser = optionalAppUser.get();
            SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData();
            loginUser.setSysUser(sysUser);
        } else {
            // 注册用户信息
            SysUser sysUser = new SysUser();
            String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6);
            sysUser.setNickName(nickname);
            sysUser.setAvatar("qwer");
            sysUser.setUserName(body.getCellPhone());
            // 设置默认密码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 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());
        }
        return loginUser;
    }
    /**
     * 初始化用户树苗
     *
     * @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 WXLoginUser 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(Constants.DEFAULT_PASSWORD)); // 默认密码为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;
        }
    }
    // 定义一个方法来处理用户不存在的情况
    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)
                .oneOpt();
    }
}