package com.doumee.service.business.impl; import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import com.alibaba.fastjson.JSONObject; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.config.Jwt.JwtPayLoad; import com.doumee.config.Jwt.JwtTokenUtil; import com.doumee.core.annotation.excel.ExcelImporter; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.oss.FileModel; import com.doumee.core.oss.UploadFileService; import com.doumee.core.utils.CodeVerifyUtils; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.core.wx.WxMiniConfig; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.SmsrecordMapper; import com.doumee.dao.business.join.MemberJoinMapper; import com.doumee.dao.business.model.Areas; import com.doumee.dao.business.model.Goodsorder; import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Smsrecord; import com.doumee.dao.system.SystemUserMapper; import com.doumee.dao.system.dto.MemberRechargeDTO; import com.doumee.dao.web.dto.MemberOwnDTO; import com.doumee.dao.web.dto.shop.Position; import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.web.request.DealIntegralRequest; import com.doumee.dao.web.request.UpdMobileRequest; import com.doumee.dao.web.request.UpdateMemberRequest; import com.doumee.dao.web.request.WxPhoneRequest; import com.doumee.dao.web.response.AccountResponse; import com.doumee.service.business.AreasService; import com.doumee.service.business.IntegralService; import com.doumee.service.business.MemberService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import lombok.extern.log4j.Log4j; import me.chanjar.weixin.common.error.WxErrorException; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.apache.commons.lang3.StringUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.shiro.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 用户信息表Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service @Log4j public class MemberServiceImpl implements MemberService { @Autowired private MemberMapper memberMapper; @Autowired private SmsrecordMapper smsrecordMapper; @Autowired private MemberJoinMapper memberJoinMapper; @Autowired private SystemUserMapper systemUserMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private UploadFileService uploadFileService; @Autowired private AreasService areasService; @Autowired private IntegralService integralService; @Override public Integer create(Member member) { memberMapper.insert(member); return member.getId(); } @Override public void deleteById(Integer id) { memberMapper.deleteById(id); } @Override public void delete(Member member) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(member); memberMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } memberMapper.deleteBatchIds(ids); } @Override public void updateById(Member member) { if(member.getStatus()==null){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),ResponseStatus.BAD_REQUEST.getMessage()); } LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); member.setEditDate(new Date()); member.setEditor(user.getId()); memberMapper.updateById(member); } @Override public void updateByIdInBatch(List members) { if (CollectionUtils.isEmpty(members)) { return; } for (Member member: members) { this.updateById(member); } } @Override public Member findById(Integer id) { return memberMapper.selectById(id); } @Override public Member findOne(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectOne(wrapper); } @Override public List findList(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectList(wrapper); } @Override public List findList(List memberIds) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(Member::getId,memberIds); return memberMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Member.class); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickname()),ms->ms.like(Member::getNickname,pageWrap.getModel().getNickname()) .or().like(Member::getName,pageWrap.getModel().getNickname()) .or().like(Member::getPhone,pageWrap.getModel().getNickname()) ); queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Member::getStatus,pageWrap.getModel().getStatus()); queryWrapper.eq(Member::getIsdeleted,Constants.ZERO); queryWrapper.ge(pageWrap.getModel().getStarttime()!=null, Member::getCreateDate,pageWrap.getModel().getStarttime()); queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Member::getCreateDate, pageWrap.getModel().getEndtime()); queryWrapper.orderByDesc(Member::getCreateDate); IPage result = memberJoinMapper.selectJoinPage(page, Member.class, queryWrapper); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILE).getCode(); if(org.apache.commons.collections.CollectionUtils.isNotEmpty(result.getRecords())){ for(Member model:result.getRecords()){ if(StringUtils.isNotBlank(model.getImgurl())){ model.setImgFullUrl(path); } } } return PageData.from(result); } @Override public List findAll(PageWrap pageWrap) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(Member.class); queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNickname()),ms->ms.like(Member::getNickname,pageWrap.getModel().getNickname()) .or().like(Member::getPhone,pageWrap.getModel().getNickname()) ); queryWrapper.eq(pageWrap.getModel().getStatus()!=null,Member::getStatus,pageWrap.getModel().getStatus()); queryWrapper.eq(Member::getIsdeleted,Constants.ZERO); queryWrapper.orderByDesc(Member::getCreateDate); List result = memberJoinMapper.selectJoinList(Member.class, queryWrapper); return result; } @Override public long count(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectCount(wrapper); } /****************************************移动端接口开始********************************************************************/ @Override public AccountResponse wxLogin(String code,Integer recId){ try { //获取微信敏感数据 WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code); String openId = session.getOpenid(); if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员"); } Member member = memberMapper.selectOne(new QueryWrapper().eq("OPEN_ID", openId)); if (member == null) { member = new Member(); member.setImgurl("20230410/4010b821-2137-4e6d-86e4-5ab9c06184a4.png"); member.setNickname("微信用户"+ CodeVerifyUtils.createVerificationCode(4)); member.setCreateDate(new Date()); member.setIsdeleted(Constants.ZERO); member.setType(Constants.ZERO); member.setOrigin(Constants.ZERO); member.setRecId(recId); member.setOpenId(openId); memberMapper.insert(member); } member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+ systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl()); //创建token JwtPayLoad payLoad = new JwtPayLoad(member.getId()); String token = JwtTokenUtil.generateToken(payLoad); AccountResponse accountResponse = new AccountResponse(); accountResponse.setToken(token); accountResponse.setSessionKey(session.getSessionKey()); accountResponse.setMember(member); return accountResponse; } catch (WxErrorException e) { e.printStackTrace(); } throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员"); } @Override public AccountResponse wxLoginTest( Integer memberId){ //创建token JwtPayLoad payLoad = new JwtPayLoad(memberId); String token = JwtTokenUtil.generateToken(payLoad); AccountResponse accountResponse = new AccountResponse(); accountResponse.setToken(token); return accountResponse; } @Override public void wxPhone(WxPhoneRequest wxPhoneRequest){ try { WxMaPhoneNumberInfo userPhoneInfo = WxMiniConfig.wxMaService.getUserService().getPhoneNoInfo( wxPhoneRequest.getSessionKey(), wxPhoneRequest.getEncryptedData(), wxPhoneRequest.getIv()); //获取手机号 String phone= userPhoneInfo.getPurePhoneNumber(); if(Objects.isNull(phone)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未获取到手机号"); } Member member = memberMapper.selectById(wxPhoneRequest.getMemberId()); member.setPhone(phone); member.setEditDate(new Date()); member.setEditor(wxPhoneRequest.getMemberId()); member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+ systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl()); //生成分享码 String accessToken = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.ACCESS_TOKEN).getCode(); if(StringUtils.isBlank(member.getSharingCode())){ //生成图片上传OSS Map body = new HashMap<>(); // 场景码,与前端约定,最终是需要前端解析 body.put("scene", member.getId()); // 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。 body.put("env_version", "release"); // 透明,根据你的场景自行设置body参数 body.put("is_hyaline", true); OkHttpClient client = new OkHttpClient().newBuilder().build(); okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json"); okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType, JSONObject.toJSONString(body)); Request request = new Request.Builder().url("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken) .method("POST", requestBody).build(); try { Response response = client.newCall(request).execute(); if (response.isSuccessful()) { InputStream inputStream = new ByteArrayInputStream(response.body().bytes()); FileModel fileModel = uploadFileService.uploadWxCode(inputStream,member.getId().toString()); member.setSharingCode(fileModel.getFileUrl()); inputStream.close(); } } catch (Exception e) { e.printStackTrace(); } } memberMapper.updateById(member); } catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"更新手机号失败"); } } @Override public Member updateMember(UpdateMemberRequest updateMemberRequest){ if(StringUtils.isBlank(updateMemberRequest.getImgurl()) && StringUtils.isBlank(updateMemberRequest.getNickname()) && StringUtils.isBlank(updateMemberRequest.getName()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = new Member(); BeanUtils.copyProperties(updateMemberRequest,member); member.setId(updateMemberRequest.getMemberId()); member.setEditor(updateMemberRequest.getMemberId()); member.setEditDate(new Date()); memberMapper.updateById(member); Member dbMember = memberMapper.selectById(updateMemberRequest.getMemberId()); dbMember.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+ systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+dbMember.getImgurl()); return dbMember; } @Override public MemberOwnDTO getMemberOwnDTO(Integer memberId) { Member member = memberMapper.selectById(memberId); MemberOwnDTO memberOwnDTO = new MemberOwnDTO(); BeanUtils.copyProperties(member,memberOwnDTO); return memberOwnDTO; } @Transactional(rollbackFor = {Exception.class,BusinessException.class}) @Override public void updateMemberOwnDTO(MemberOwnDTO memberOwnDTO) { LoginUserInfo userInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal(); Integer mId = Optional.ofNullable(userInfo) .map(s -> s.getMemberId()) .orElseThrow(() -> new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "用户ID缺失")); Member member = new Member(); member.setId(mId); member.setEditor(userInfo.getId()); member.setEditDate(new Date()); member.setNickname(memberOwnDTO.getNickname()); member.setImgurl(memberOwnDTO.getImgurl()); member.setBirthday(memberOwnDTO.getBirthday()); member.setName(memberOwnDTO.getName()); member.setPhone(memberOwnDTO.getPhone()); member.setSex(memberOwnDTO.getSex()); memberMapper.updateById(member); UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(SystemUser::getMemberId,mId); SystemUser systemUser = new SystemUser(); systemUser.setRealname(memberOwnDTO.getName()); systemUser.setBirthday(memberOwnDTO.getBirthday()); systemUser.setSex(String.valueOf(memberOwnDTO.getSex())); systemUser.setUpdateTime(new Date()); systemUser.setUpdateUser(userInfo.getId()); systemUserMapper.update(systemUser,wrapper); } @Override public Areas getMemberAreas(Position position, Integer memberId) { Areas area = areasService.getAreasByPosition(position); UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.lambda().eq(Member::getId,memberId); Member member = new Member(); member.setLongitude(position.getLongitude()); member.setLatitude(position.getLatitude()); member.setCityId(area.getCityId()); memberMapper.update(member,wrapper); return area; } @Override public void updateMemberCity(Integer cityId, Integer memberId) { Member member = new Member(); member.setId(memberId); member.setCityId(cityId); memberMapper.updateById(member); } @Override public void verifyUserPhone(UpdMobileRequest request){ if(Objects.isNull(request) || Objects.isNull(request.getMemberId()) || StringUtils.isBlank(request.getPhone()) || StringUtils.isBlank(request.getCode()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = memberMapper.selectById(request.getMemberId()); if(StringUtils.isNotBlank(member.getPhone())&&!member.getPhone().equals(request.getPhone())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"手机号错误"); } this.verifyPhoneCode(request.getCode(),request.getMemberId()); } public void verifyPhoneCode(String code,Integer memberId){ //验证码 Smsrecord smsrecord = smsrecordMapper.selectOne(new QueryWrapper().lambda() .eq(Smsrecord::getIsdeleted,Constants.ZERO) .eq(Smsrecord::getCode,code) .eq(Smsrecord::getMemberId,memberId) .last(" limit 1") ); if(Objects.isNull(smsrecord)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"验证码错误!"); } if(!Constants.equalsInteger(smsrecord.getStatus(),Constants.ZERO)){ if(Constants.equalsInteger(smsrecord.getStatus(),Constants.ONE)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"验证码已使用"); }else{ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"验证码已过期"); } } smsrecordMapper.update(new UpdateWrapper().lambda() .set(Smsrecord::getStatus,Constants.ONE) .eq(Smsrecord::getId,smsrecord.getId()) ); } @Override public void updateUserPhone(UpdMobileRequest request){ if(Objects.isNull(request) || Objects.isNull(request.getMemberId()) || StringUtils.isBlank(request.getPhone()) || StringUtils.isBlank(request.getCode()) ){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = memberMapper.selectById(request.getMemberId()); if(StringUtils.isNotBlank(member.getPhone())&&member.getPhone().equals(request.getPhone())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无法更换相同手机号"); } this.verifyPhoneCode(request.getCode(),request.getMemberId()); memberMapper.update(new UpdateWrapper().lambda() .eq(Member::getPhone,request.getPhone()) .eq(Member::getId,request.getMemberId()) ); } @Transactional(rollbackFor = {Exception.class,BusinessException.class}) @Override public Integer importMemberRechargeBatch(MultipartFile file) { try { ExcelImporter ie = new ExcelImporter(file,0,0); List dataList = ie.getDataList(MemberRechargeDTO.class, null); if(dataList == null || dataList.size() ==0){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,录入数据为空!"); } List phoneNums = dataList.stream().map(s -> s.getPhone()).distinct().collect(Collectors.toList()); if ( dataList.size() != phoneNums.size()){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"手机号码有重复"); } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(Member::getPhone,phoneNums); List members = memberMapper.selectList(wrapper); if(phoneNums.size() != members.size()){ List collect = members.stream().map(s -> s.getPhone()).collect(Collectors.toList()); List unFindMember = phoneNums.stream().filter(s -> !collect.contains(s)).collect(Collectors.toList()); throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),unFindMember.toString()+"不存在该手机号码用户"); } Map collect = dataList.stream().collect(Collectors.toMap(s -> s.getPhone(), s -> s)); members.forEach(s->{ MemberRechargeDTO memberRechargeDTO = collect.get(s.getPhone()); if (Objects.isNull(memberRechargeDTO.getIntegralType()) || (memberRechargeDTO.getIntegralType() > Constants.ONE) || (memberRechargeDTO.getIntegralType() < Constants.ZERO)){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"调整类型不符合规范"); } BigDecimal integralNum = new BigDecimal(memberRechargeDTO.getNum()); if (Constants.equalsInteger(memberRechargeDTO.getIntegralType(),Constants.ONE) && (s.getIntegral().compareTo(integralNum) == -1) ){ integralNum = s.getIntegral(); } Constants.IntegralObjType integralObjType = Constants.equalsInteger(memberRechargeDTO.getIntegralType(),Constants.ONE) ? Constants.IntegralObjType.SYSTEM_DEDUCT : Constants.IntegralObjType.SYSTEM_RECHARGE; DealIntegralRequest dealIntegralRequest = new DealIntegralRequest(); dealIntegralRequest.setIntegralObjType(integralObjType); dealIntegralRequest.setIntegralNum(integralNum); dealIntegralRequest.setMemberId(s.getId()); dealIntegralRequest.setObjId(s.getId()); dealIntegralRequest.setOrderCode(null); dealIntegralRequest.setDealType(memberRechargeDTO.getIntegralType()); integralService.dealIntegral(dealIntegralRequest); }); // integralService.dealIntegral() } catch (Exception e) { log.error(String.format("批量插入异常%s ",e.getMessage())); throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage()); } return null; } @Override public Integer changeMemberRechargeBatch(MemberRechargeDTO memberRechargeDTO) { Member member = memberMapper.selectById(memberRechargeDTO.getMemberId()); //如果扣除金额大于用户拥金额 取用户剩余金额 BigDecimal integralNum = new BigDecimal(memberRechargeDTO.getNum()); if (Constants.equalsInteger(memberRechargeDTO.getIntegralType(),Constants.ONE) && (member.getIntegral().compareTo(integralNum) == -1) ){ integralNum = member.getIntegral(); } Constants.IntegralObjType integralObjType = Constants.equalsInteger(memberRechargeDTO.getIntegralType(),Constants.ONE) ? Constants.IntegralObjType.SYSTEM_DEDUCT : Constants.IntegralObjType.SYSTEM_RECHARGE; DealIntegralRequest dealIntegralRequest = new DealIntegralRequest(); dealIntegralRequest.setIntegralObjType(integralObjType); dealIntegralRequest.setIntegralNum(integralNum); dealIntegralRequest.setMemberId(memberRechargeDTO.getMemberId()); dealIntegralRequest.setObjId(memberRechargeDTO.getMemberId()); dealIntegralRequest.setOrderCode(null); dealIntegralRequest.setDealType(memberRechargeDTO.getIntegralType()); Integer integer = integralService.dealIntegral(dealIntegralRequest); return integer; } }