jiangqs
2023-05-23 687dbd8e6ababc010a3da5503b95cd62cecf9f02
ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/member/MemberServiceImpl.java
@@ -2,40 +2,43 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.member.domain.dto.AppUserAuthorizeDto;
import com.ruoyi.member.domain.dto.MerCashMemberPageDto;
import com.ruoyi.member.domain.dto.MerMemberPageDto;
import com.ruoyi.member.domain.dto.*;
import com.ruoyi.member.domain.pojo.member.MemberNurse;
import com.ruoyi.member.domain.vo.*;
import com.ruoyi.member.mapper.member.MemberMapper;
import com.ruoyi.member.service.member.MemberNurseService;
import com.ruoyi.member.service.member.MemberService;
import com.ruoyi.member.util.HttpUtils;
import com.ruoyi.system.api.RemoteOrderService;
import com.ruoyi.system.api.RemoteShopService;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.service.RemoteConfigService;
import com.ruoyi.system.api.service.RemoteOrderService;
import com.ruoyi.system.api.service.RemoteShopService;
import com.ruoyi.system.api.service.RemoteUserService;
import com.ruoyi.system.api.constant.AppErrorConstant;
import com.ruoyi.system.api.constant.SecurityConstant;
import com.ruoyi.system.api.domain.dto.AppEditUserDto;
import com.ruoyi.system.api.domain.dto.AppMemberBindingDto;
import com.ruoyi.system.api.domain.dto.AppMemberGoodsTypeDto;
import com.ruoyi.system.api.domain.poji.config.SysTag;
import com.ruoyi.system.api.domain.poji.member.Member;
import com.ruoyi.system.api.domain.poji.shop.Shop;
import com.ruoyi.system.api.domain.poji.sys.SysUser;
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
import com.ruoyi.system.api.model.AppMiniLoginDto;
import com.ruoyi.system.api.model.AppMiniLoginVo;
import lombok.extern.log4j.Log4j;
import lombok.extern.log4j.Log4j2;
import lombok.val;
import com.ruoyi.common.core.utils.StringUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.util.EntityUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
@@ -43,6 +46,7 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
 * <p>
@@ -80,6 +84,12 @@
    @Resource
    private RemoteOrderService orderService;
    @Resource
    private MemberNurseService memberNurseService;
    @Resource
    private RemoteConfigService remoteConfigService;
    /**
     * @description: TODO
@@ -126,19 +136,25 @@
                sysUser = new SysUser();
                sysUser.setUserName(memberId);
                sysUser.setUserType("03");
                sysUser.setNickName("微信用户");
                sysUser.setNickName("鸿瑞堂用户");
                sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
                String password = "hongruitang";
                sysUser.setPassword(SecurityUtils.encryptPassword(password));
                sysUser = sysUserService.registerUser(sysUser).getData();
                log.info("sysUser1"+sysUser.toString());
                log.info("sysUser1-----------------"+sysUser.toString());
                member = new Member();
                member.setUserId(sysUser.getUserId());
                member.setDelFlag(0);
                member.setNickName("鸿瑞堂用户");
                member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
                member.setMemberId(memberId);
                member.setRelationShopId(1L);
                member.setWxUnionid(unionid);
                member.setMiniOpenid(openid);
                member.setBindingFlag(0);
                member.setCreateTime(new Date());
                this.save(member);
                log.info("member-----------------"+member.toString());
                this.saveOrUpdate(member);
            }else{
                log.info("member2"+member.toString());
@@ -169,61 +185,67 @@
    public AppUserAuthorizeVo getAppUserAuthorize(AppUserAuthorizeDto appUserAuthorizeDto){
        Member member = this.getById(appUserAuthorizeDto.getUserId());
        AppUserAuthorizeVo appUserAuthorizeVo = new AppUserAuthorizeVo();
        //获取code接口在redis里存放的sessionkey用于解密
        String sessionkey = stringRedisTemplate.opsForValue().get(SecurityConstant.SESSION_KEY+ member.getMiniOpenid());
        if(StringUtils.isBlank(sessionkey)){
            throw new ServiceException(AppErrorConstant.USER_NOT_LOGIN);
        }
        String mobile = null;
        try {
            //解密微信加密用户信息和手机号
            /*WxMaPhoneNumberInfo wxPhoneInfo;
            if(StringUtils.isNotBlank(appUserAuthorizeDto.getPhoneEncryptedData())&&StringUtils.isNotBlank(appUserAuthorizeDto.getPhoneIv())){
                wxPhoneInfo = wxMaService.getUserService().getPhoneNoInfo(sessionkey, appUserAuthorizeDto.getPhoneEncryptedData(), appUserAuthorizeDto.getPhoneIv());
            }else{
                throw new ServiceException(AppErrorConstant.AUTHORIZE_MISS);
        if(StringUtils.isBlank(member.getMobile())){
            //获取code接口在redis里存放的sessionkey用于解密
            String sessionkey = stringRedisTemplate.opsForValue().get(SecurityConstant.SESSION_KEY+ member.getMiniOpenid());
            if(StringUtils.isBlank(sessionkey)){
                throw new ServiceException(AppErrorConstant.USER_NOT_LOGIN);
            }
            if(StringUtils.isBlank(wxPhoneInfo.getPhoneNumber())){
                throw new ServiceException(AppErrorConstant.AUTHORIZE_FAILED);
            }
            mobile = wxPhoneInfo.getPhoneNumber();*/
            String accessToken = stringRedisTemplate.opsForValue().get("wx_access_token");
            if (StringUtils.isBlank(accessToken)) {
                String responseAccessToken = getAccessTokenByWX();
                JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken);
                accessToken = jsonAccessToken.getString("access_token");
                String errmsg = jsonAccessToken.getString("errmsg");
                Long expiresIn = jsonAccessToken.getLong("expires_in");
            try {
                String accessToken = stringRedisTemplate.opsForValue().get("wx_access_token");
                if (StringUtils.isBlank(accessToken)) {
                    throw new ServiceException(errmsg);
                } else {
                    expiresIn = expiresIn - 100;
                    stringRedisTemplate.opsForValue().set("wx_access_token", accessToken, expiresIn.intValue(), TimeUnit.SECONDS);
                    String responseAccessToken = getAccessTokenByWX();
                    JSONObject jsonAccessToken = JSONObject.parseObject(responseAccessToken);
                    accessToken = jsonAccessToken.getString("access_token");
                    String errmsg = jsonAccessToken.getString("errmsg");
                    Long expiresIn = jsonAccessToken.getLong("expires_in");
                    if (StringUtils.isBlank(accessToken)) {
                        throw new ServiceException(errmsg);
                    } else {
                        expiresIn = expiresIn - 100;
                        stringRedisTemplate.opsForValue().set("wx_access_token", accessToken, expiresIn.intValue(), TimeUnit.SECONDS);
                    }
                }
                String responseUserPhoneNumber = getMobileByWX(accessToken, appUserAuthorizeDto.getMobileCode());
                JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber);
                String errcode = jsonUserPhoneNumber.getString("errcode");
                String errmsg = jsonUserPhoneNumber.getString("errmsg");
                if (!errcode.equals("0")) {
                    throw new ServiceException(errmsg);
                }
                String phoneInfo = jsonUserPhoneNumber.getString("phone_info");
                JSONObject jsonUserPhoneInfo = JSONObject.parseObject(phoneInfo);
                mobile = jsonUserPhoneInfo.getString("purePhoneNumber");
            } catch (Exception e) {
                e.printStackTrace();
            }
            String responseUserPhoneNumber = getMobileByWX(accessToken, appUserAuthorizeDto.getMobileCode());
            JSONObject jsonUserPhoneNumber = JSONObject.parseObject(responseUserPhoneNumber);
            String errcode = jsonUserPhoneNumber.getString("errcode");
            String errmsg = jsonUserPhoneNumber.getString("errmsg");
            if (!errcode.equals("0")) {
                throw new ServiceException(errmsg);
            Member oldMember = this.getByMobile(mobile);
            if(oldMember!=null){
                member.setNickName(oldMember.getNickName());
                member.setGender(oldMember.getGender());
                member.setReferrer(oldMember.getReferrer());
                member.setBirthday(oldMember.getBirthday());
                member.setBindingFlag(1);
                member.setRelationShopId(oldMember.getRelationShopId());
                oldMember.setDelFlag(1);
                oldMember.setMiniOpenid(oldMember.getMiniOpenid()+"已删除");
                this.saveOrUpdate(oldMember);
            }else{
                //更新用户手机信息
                SysUser sysUser = new SysUser();
                sysUser.setUserId(appUserAuthorizeDto.getUserId());
                sysUser.setPhonenumber(mobile);
                sysUserService.updateUserMobile(sysUser);
                member.setNickName(sysUser.getNickName());
            }
            String phoneInfo = jsonUserPhoneNumber.getString("phone_info");
            JSONObject jsonUserPhoneInfo = JSONObject.parseObject(phoneInfo);
            mobile = jsonUserPhoneInfo.getString("purePhoneNumber");
        } catch (Exception e) {
            e.printStackTrace();
            member.setMobile(mobile);
            this.saveOrUpdate(member);
        }else{
            mobile = member.getMobile();
        }
        //更新用户手机信息
        SysUser sysUser = new SysUser();
        sysUser.setUserId(appUserAuthorizeDto.getUserId());
        sysUser.setPhonenumber(mobile);
        sysUserService.updateUserMobile(sysUser);
        member.setMobile(mobile);
        member.setRealName(sysUser.getNickName());
        this.saveOrUpdate(member);
        appUserAuthorizeVo.setMobile(mobile);
        appUserAuthorizeVo.setNickName(sysUser.getNickName());
        appUserAuthorizeVo.setNickName(member.getNickName());
        appUserAuthorizeVo.setOpenid(member.getMiniOpenid());
        appUserAuthorizeVo.setUnionid(member.getWxUnionid());
        return appUserAuthorizeVo;
@@ -259,20 +281,21 @@
    @Override
    public AppUserInfoVo getAppUserInfo(Long userId){
        AppUserInfoVo appUserInfoVo = new AppUserInfoVo();
        SysUser sysUser = sysUserService.getSysUser(userId).getData();
        Member member = this.getByUserId(userId);
        appUserInfoVo.setUserId(userId);
        appUserInfoVo.setRelationShopId(member.getRelationShopId());
        appUserInfoVo.setMemberNo(member.getMemberNo());
        appUserInfoVo.setNickName(sysUser.getNickName());
        appUserInfoVo.setPhonenumber(sysUser.getPhonenumber());
        if(member.getRelationShopId()!=null){
        appUserInfoVo.setNickName(member.getNickName());
        appUserInfoVo.setRealName(member.getRealName());
        appUserInfoVo.setPhonenumber(member.getMobile());
        if(member.getRelationShopId()!=null&&member.getBindingFlag()==1){
            appUserInfoVo.setRelationShopId(member.getRelationShopId());
            Shop shop = shopService.getShop(member.getRelationShopId()).getData();
            appUserInfoVo.setShopName(shop.getShopName());
            appUserInfoVo.setShopAddress(shop.getShopAreaName()+shop.getShopAddress());
        }
        appUserInfoVo.setBirthday(member.getBirthday());
        appUserInfoVo.setGender(member.getGender());
        appUserInfoVo.setAvatar(sysUser.getAvatar());
        appUserInfoVo.setAvatar(member.getAvatar());
        AppOrderTotalVo appOrderTotalVo = orderService.getAppOrderTotal(userId).getData();
        appUserInfoVo.setNoPayCount(appOrderTotalVo.getNoPayCount());
        appUserInfoVo.setNoUseCount(appOrderTotalVo.getNoUseCount());
@@ -291,7 +314,7 @@
        Member member = this.getByUserId(appEditUserDto.getUserId());
        switch (editType){
            case 1:
                member.setRealName(editValue);
                member.setNickName(editValue);
                member.setUpdateTime(new Date());
                member.setUpdateUserId(appEditUserDto.getUserId());
                this.saveOrUpdate(member);
@@ -329,7 +352,7 @@
    /**
     * @description: TODO
     * @description: 商户获取会员信息
     * @author jqs34
     * @date 2023/5/4 22:50
     * @version 1.0
@@ -337,12 +360,13 @@
    @Override
    public MerMemberInfoVo getMerMemberInfo(Long userId){
        MerMemberInfoVo merMemberInfoVo = new MerMemberInfoVo();
        SysUser sysUser = sysUserService.getSysUser(userId).getData();
        Member member = this.getByUserId(userId);
        merMemberInfoVo.setUserId(userId);
        merMemberInfoVo.setNickName(sysUser.getNickName());
        merMemberInfoVo.setPhonenumber(sysUser.getPhonenumber());
        merMemberInfoVo.setAvatar(sysUser.getAvatar());
        merMemberInfoVo.setNickName(member.getNickName());
        merMemberInfoVo.setPhonenumber(member.getMobile());
        merMemberInfoVo.setAvatar(member.getAvatar());
        merMemberInfoVo.setBirthday(member.getBirthday());
        merMemberInfoVo.setUserTags(member.getUserTags());
        //未完成
        return merMemberInfoVo;
@@ -360,4 +384,205 @@
        List<MerCashMemberPageVo> merCashMemberPageVos = memberMapper.pageMerCashMember(page,merCashMemberPageDto);
        return merCashMemberPageVos;
    }
    /**
     * 更新会员绑定商户
     * @param appMemberBindingDto
     */
    @Override
    public void updateMemberBinding(AppMemberBindingDto appMemberBindingDto){
        Member member = this.getByUserId(appMemberBindingDto.getUserId());
        member.setBindingFlag(appMemberBindingDto.getBindingFlag());
        member.setRelationShopId(appMemberBindingDto.getShopId());
        this.saveOrUpdate(member);
    }
    /**
     * 获取会员基础档案
     * @param userId
     * @return
     */
    @Override
    public MerMemberBasicFileVo getMerMemberBasicFile(Long userId){
        MerMemberBasicFileVo merMemberBasicFileVo = new MerMemberBasicFileVo();
        Member member = this.getByUserId(userId);
        BeanUtils.copyProperties(member, merMemberBasicFileVo);
        merMemberBasicFileVo.setNickName(member.getNickName());
        merMemberBasicFileVo.setPhonenumber(member.getMobile());
        merMemberBasicFileVo.setCreateTime(member.getCreateTime());
        List<MemberNurse> memberNurseList = memberNurseService.listByUserId(userId);
        List<String> valueList = memberNurseList.stream().map(k->k.getNurse()).collect(Collectors.toList());
        merMemberBasicFileVo.setMemberNurse(valueList);
        return merMemberBasicFileVo;
    }
    /**
     * 获取会员标签
     * @param userId
     * @return
     */
    @Override
    public List<MerMemberTagVo> getMerMemberTags(Long userId){
        Member member = this.getByUserId(userId);
        String userTags = member.getUserTags();
        String[] userTagsArr = null;
        if(StringUtils.isNotBlank(userTags)){
            userTagsArr = userTags.split(",");
        }
        List<SysTag> sysTagsList = remoteConfigService.listSysTag(1).getData();
        List<MerMemberTagVo> merMemberTagVoList = new ArrayList<>();
        MerMemberTagVo merMemberTagVo;
        String tagName;
        if(sysTagsList!=null&&!sysTagsList.isEmpty()){
            for(SysTag sysTag : sysTagsList){
                merMemberTagVo = new MerMemberTagVo();
                tagName = sysTag.getTagName();
                merMemberTagVo.setTagName(tagName);
                if(userTagsArr!=null &&  ArrayUtils.contains(userTagsArr, tagName)){
                    merMemberTagVo.setSelectFlag(1);
                }else{
                    merMemberTagVo.setSelectFlag(0);
                }
                merMemberTagVoList.add(merMemberTagVo);
            }
        }
        return merMemberTagVoList;
    }
    /**
     * 编辑会员标签
     * @param merMemberTagEditDto
     */
    @Override
    public void editMerMemberTags(MerMemberTagEditDto merMemberTagEditDto){
        Member member = this.getByUserId(merMemberTagEditDto.getMemberUserId());
        List<String> userTags = merMemberTagEditDto.getUserTags();
        StringJoiner sj = new StringJoiner(",");
        if(userTags!=null&&!userTags.isEmpty()){
            for(String str : userTags){
                sj.add(str);
            }
        }
        member.setUserTags(sj.toString());
        this.saveOrUpdate(member);
    }
    /**
     * 添加会员
     * @param merMemberAddDto
     */
    @Override
    public void addMerMember(MerMemberAddDto merMemberAddDto){
        String phonenumber = merMemberAddDto.getPhonenumber();
        Member oldMember = this.getByMobile(phonenumber);
        if(oldMember!=null){
            throw new ServiceException(AppErrorConstant.MOBILE_USER_DOUBLE);
        }
        SysUser sysUser = sysUserService.getSysUserByMobile(phonenumber).getData();
        if(sysUser==null){
            sysUser = new SysUser();
            sysUser.setUserName(phonenumber);
            sysUser.setUserType("03");
            sysUser.setNickName(merMemberAddDto.getNickName());
            sysUser.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
            String password = "hongruitang";
            sysUser.setPassword(SecurityUtils.encryptPassword(password));
            log.debug("sysUser"+sysUser.toString());
            sysUser = sysUserService.registerUser(sysUser).getData();
        }
        log.info("sysUser1-----------------"+sysUser.toString());
        String memberId = IdUtils.simpleUUID();
        Member member = new Member();
        member.setUserId(sysUser.getUserId());
        member.setDelFlag(0);
        member.setNickName(merMemberAddDto.getNickName());
        member.setGender(merMemberAddDto.getGender());
        member.setMobile(phonenumber);
        member.setReferrer(merMemberAddDto.getReferrer());
        member.setBirthday(merMemberAddDto.getBirthday());
        member.setAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
        member.setMemberId(memberId);
        member.setRelationShopId(1L);
        member.setWxUnionid(null);
        member.setMiniOpenid(null);
        member.setBindingFlag(1);
        member.setRelationShopId(merMemberAddDto.getShopId());
        member.setCreateTime(new Date());
        log.info("member-----------------"+member.toString());
        this.saveOrUpdate(member);
    }
    /**
     * 编辑会员
     * @param merMemberEditDto
     */
    @Override
    public void editMerMember(MerMemberEditDto merMemberEditDto){
        Member member = this.getByUserId(merMemberEditDto.getEditUserId());
        if(!member.getMobile().equals(merMemberEditDto.getPhonenumber())){
            Member memberOld = getByMobile(merMemberEditDto.getPhonenumber());
            if(memberOld!=null){
                throw new ServiceException(AppErrorConstant.MOBILE_DOUBLE);
            }
        }
        member.setRealName(merMemberEditDto.getNickName());
        member.setMobile(merMemberEditDto.getPhonenumber());
        member.setGender(merMemberEditDto.getGender());
        member.setReferrer(merMemberEditDto.getReferrer());
        member.setCustomerSource(merMemberEditDto.getCustomerSource());
        member.setLevel(merMemberEditDto.getLevel());
        member.setBirthday(merMemberEditDto.getBirthday());
        member.setUpdateUserId(merMemberEditDto.getUserId());
        member.setUpdateTime(new Date());
        log.info("member-----------------"+member.toString());
        this.saveOrUpdate(member);
        SysUser sysUser = new SysUser();
        sysUser.setUserId(merMemberEditDto.getEditUserId());
        sysUser.setPhonenumber(merMemberEditDto.getPhonenumber());
        sysUserService.updateUserMobile(sysUser);
    }
    /**
     *
     * @param mobile
     * @return
     */
    @Override
    public Member getByMobile(String mobile){
        LambdaQueryWrapper<Member> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(Member::getDelFlag, 0).eq(Member::getMobile, mobile);
        Member member = this.getOne(queryWrapper);
        return member;
    }
    /**
     * 更新用户商品类型
     * @param appMemberGoodsTypeDto
     */
    @Override
    public void updateMemberGoodsType(AppMemberGoodsTypeDto appMemberGoodsTypeDto){
        Member member = this.getByUserId(appMemberGoodsTypeDto.getUserId());
        HashSet<String> goodsTypeSet = appMemberGoodsTypeDto.getGoodsTypeSet();
        if(member!=null){
            String goodsType = member.getGoodsType();
            Boolean change = false;
            for(String str : goodsTypeSet){
                if(goodsType != null){
                    if(!goodsType.contains(str)){
                        goodsType = goodsType + "," + str;
                        change = true;
                    }
                }else{
                    goodsType = str;
                    change = true;
                }
            }
            if(change){
                member.setGoodsType(goodsType);
                this.saveOrUpdate(member);
            }
        }
    }
}