mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-22 03:55:17 +08:00
299 lines
10 KiB
Java
299 lines
10 KiB
Java
package com.jsowell.service;
|
||
|
||
import com.github.pagehelper.PageHelper;
|
||
import com.github.pagehelper.PageInfo;
|
||
import com.jsowell.common.constant.CacheConstants;
|
||
import com.jsowell.common.constant.Constants;
|
||
import com.jsowell.common.core.page.PageResponse;
|
||
import com.jsowell.common.core.redis.RedisCache;
|
||
import com.jsowell.common.enums.uniapp.BalanceChangesEnum;
|
||
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
|
||
import com.jsowell.common.exception.BusinessException;
|
||
import com.jsowell.common.util.JWTUtils;
|
||
import com.jsowell.common.util.StringUtils;
|
||
import com.jsowell.common.util.id.IdUtils;
|
||
import com.jsowell.pile.domain.MemberBasicInfo;
|
||
import com.jsowell.pile.domain.MemberPlateNumberRelation;
|
||
import com.jsowell.pile.domain.MemberWalletInfo;
|
||
import com.jsowell.pile.domain.PileAuthCard;
|
||
import com.jsowell.pile.dto.*;
|
||
import com.jsowell.pile.service.IMemberBasicInfoService;
|
||
import com.jsowell.pile.service.IMemberPlateNumberRelationService;
|
||
import com.jsowell.pile.service.IPileAuthCardService;
|
||
import com.jsowell.pile.service.IPileMerchantInfoService;
|
||
import com.jsowell.pile.transaction.dto.MemberTransactionDTO;
|
||
import com.jsowell.pile.transaction.service.TransactionService;
|
||
import com.jsowell.pile.vo.uniapp.MemberVO;
|
||
import com.jsowell.pile.vo.uniapp.MemberWalletLogVO;
|
||
import com.jsowell.wxpay.service.WxAppletRemoteService;
|
||
import org.apache.commons.collections4.CollectionUtils;
|
||
import org.slf4j.Logger;
|
||
import org.slf4j.LoggerFactory;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.util.List;
|
||
import java.util.Objects;
|
||
|
||
@Service
|
||
public class MemberService {
|
||
private final Logger log = LoggerFactory.getLogger(this.getClass());
|
||
|
||
@Autowired
|
||
private RedisCache redisCache;
|
||
|
||
@Autowired
|
||
private TransactionService transactionService;
|
||
|
||
@Autowired
|
||
private IMemberBasicInfoService memberBasicInfoService;
|
||
|
||
@Autowired
|
||
private IPileMerchantInfoService pileMerchantInfoService;
|
||
|
||
@Autowired
|
||
private WxAppletRemoteService wxAppletRemoteService;
|
||
|
||
@Autowired
|
||
private IMemberPlateNumberRelationService memberPlateNumberRelationService;
|
||
|
||
@Autowired
|
||
private IPileAuthCardService pileAuthCardService;
|
||
|
||
/**
|
||
* 校验短信验证码
|
||
* @param dto
|
||
*/
|
||
public void checkVerificationCode(MemberRegisterAndLoginDTO dto) {
|
||
// 取出缓存中的验证码进行对比,如果缓存中没有,则超时
|
||
String captchaCode = redisCache.getCacheObject(CacheConstants.SMS_VERIFICATION_CODE_KEY + dto.getMobileNumber());
|
||
if (StringUtils.isEmpty(captchaCode)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_VERIFICATION_CODE_TIMEOUT_ERROR);
|
||
}
|
||
// 如果缓存中有,但与实际不一致,则为验证码错误
|
||
if (!StringUtils.equals(captchaCode, dto.getVerificationCode())) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_VERIFICATION_CODE_ERROR);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 短信验证码登录注册
|
||
* @param dto
|
||
* @return
|
||
*/
|
||
public String memberRegisterAndLogin(MemberRegisterAndLoginDTO dto) {
|
||
// 校验短信验证码 两种情况不能通过校验,1-验证码错误;2-超时 验证码10分钟有效
|
||
checkVerificationCode(dto);
|
||
String merchantId = "";
|
||
return memberRegisterAndLogin(dto.getMobileNumber(), merchantId, null);
|
||
}
|
||
|
||
/**
|
||
* 公共登陆注册方法
|
||
* @param phoneNumber 手机号
|
||
* @param merchantId 商户id
|
||
* @return
|
||
*/
|
||
private String memberRegisterAndLogin(String phoneNumber, String merchantId, String openId) {
|
||
if (StringUtils.isBlank(phoneNumber)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
|
||
}
|
||
// if (Objects.isNull(merchantId)) {
|
||
// throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR);
|
||
// }
|
||
// 查询手机号码是否注册过
|
||
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumberAndMerchantId(phoneNumber, merchantId);
|
||
if (Objects.isNull(memberBasicInfo)) {
|
||
// 不存在则新增数据
|
||
String memberId = IdUtils.getMemberId();
|
||
memberBasicInfo = new MemberBasicInfo();
|
||
memberBasicInfo.setStatus(Constants.ONE);
|
||
memberBasicInfo.setMemberId(memberId);
|
||
memberBasicInfo.setNickName("会员" + memberId);
|
||
memberBasicInfo.setMobileNumber(phoneNumber);
|
||
memberBasicInfo.setMerchantId(Long.valueOf(merchantId));
|
||
memberBasicInfo.setOpenId(openId);
|
||
|
||
// 首次新建会员,同时新建会员钱包
|
||
MemberWalletInfo memberWalletInfo = MemberWalletInfo.builder().memberId(memberId).build();
|
||
MemberTransactionDTO memberTransactionDTO = MemberTransactionDTO.builder()
|
||
.memberBasicInfo(memberBasicInfo)
|
||
.memberWalletInfo(memberWalletInfo)
|
||
.build();
|
||
transactionService.createMember(memberTransactionDTO);
|
||
} else {
|
||
if (StringUtils.isBlank(memberBasicInfo.getOpenId()) && StringUtils.isNotBlank(openId)) {
|
||
memberBasicInfo.setOpenId(openId);
|
||
memberBasicInfoService.updateMemberBasicInfo(memberBasicInfo);
|
||
}
|
||
}
|
||
// 服务器生成token返给前端
|
||
String memberToken = JWTUtils.createMemberToken(memberBasicInfo.getMemberId(), memberBasicInfo.getNickName());
|
||
// log.info("memToken:{}", memberToken);
|
||
return memberToken;
|
||
}
|
||
|
||
/**
|
||
* 微信一键登录
|
||
* @param dto
|
||
*/
|
||
public String wechatLogin(WechatLoginDTO dto) {
|
||
// 通过微信传的code获取手机号码
|
||
String mobileNumber = wxAppletRemoteService.getMobileNumberByCode(dto.getCode());
|
||
if (StringUtils.isBlank(mobileNumber)) {
|
||
throw new BusinessException(ReturnCodeEnum.CODE_GET_MOBILE_NUMBER_BY_CODE_ERROR);
|
||
}
|
||
// 通过appid获取运营商id
|
||
String merchantId = pileMerchantInfoService.getMerchantIdByAppId(dto.getAppId());
|
||
// if (Objects.isNull(merchantId)) {
|
||
// throw new BusinessException(ReturnCodeEnum.CODE_GET_MERCHANT_ID_BY_APP_ID_ERROR);
|
||
// }
|
||
// 通过code获取openId
|
||
String openId = "";
|
||
try {
|
||
openId = getOpenIdByCode(dto.getOpenIdCode());
|
||
} catch (Exception e) {
|
||
log.error("getOpenIdByCode发生异常", e);
|
||
}
|
||
// 查询手机号码是否注册过
|
||
return memberRegisterAndLogin(mobileNumber, merchantId, openId);
|
||
}
|
||
|
||
/**
|
||
* 获取openId
|
||
* @param code
|
||
* @return
|
||
*/
|
||
public String getOpenIdByCode(String code) {
|
||
return wxAppletRemoteService.getOpenIdByCode(code);
|
||
}
|
||
|
||
/**
|
||
* 处理用户信息
|
||
*
|
||
* @param dto 用户个人信息
|
||
*/
|
||
public void handleUserInfo(MemberRegisterDTO dto) {
|
||
// 通过用户手机号查询数据库,如果数据库中存在,则更新
|
||
MemberBasicInfo memberBasicInfo = memberBasicInfoService.selectInfoByMobileNumber(dto.getMobileNumber());
|
||
if (Objects.nonNull(memberBasicInfo)) {
|
||
MemberBasicInfo memberInfo = MemberBasicInfo.builder()
|
||
.avatarUrl(dto.getAvatarUrl())
|
||
.mobileNumber(dto.getMobileNumber())
|
||
.nickName(dto.getNickName())
|
||
.build();
|
||
memberBasicInfoService.updateMemberBasicInfo(memberInfo);
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 通过memberToken获取用户账户信息
|
||
*
|
||
* @param memberId
|
||
* @return
|
||
*/
|
||
public MemberVO getMemberInfoByMemberId(String memberId) {
|
||
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(memberId);
|
||
if (Objects.nonNull(memberVO)) {
|
||
memberVO.setTotalAccountAmount(memberVO.getPrincipalBalance().add(memberVO.getGiftBalance()));
|
||
}
|
||
return memberVO;
|
||
}
|
||
|
||
/**
|
||
* 查询用户账户余额变动信息
|
||
*
|
||
* @param dto
|
||
*/
|
||
public PageResponse getMemberBalanceChanges(UniAppQueryMemberBalanceDTO dto) {
|
||
|
||
// 获取分页信息以及memberId
|
||
int pageNum = dto.getPageNum() == 0 ? 1 : dto.getPageNum();
|
||
int pageSize = dto.getPageSize() == 0 ? 10 : dto.getPageSize();
|
||
String memberId = dto.getMemberId();
|
||
String type = dto.getType();
|
||
|
||
if (!StringUtils.equals("1", type) && !StringUtils.equals("2", type)) {
|
||
type = "";
|
||
}
|
||
// 分页
|
||
PageHelper.startPage(pageNum, pageSize);
|
||
List<MemberWalletLogVO> list = memberBasicInfoService.getMemberBalanceChanges(memberId, type);
|
||
PageInfo<MemberWalletLogVO> pageInfo = new PageInfo<>(list);
|
||
|
||
for (MemberWalletLogVO walletLogVO : pageInfo.getList()) {
|
||
String subType = walletLogVO.getSubType();
|
||
String subTypeValue = BalanceChangesEnum.getValueByCode(subType);
|
||
if (StringUtils.isNotBlank(subTypeValue)) {
|
||
walletLogVO.setSubType(subTypeValue);
|
||
}
|
||
// walletLogVO.setTotalAccountAmount(walletLogVO.getPrincipalBalance().add(walletLogVO.getGiftBalance()));
|
||
}
|
||
PageResponse pageResponse = PageResponse.builder()
|
||
.pageSize(pageSize)
|
||
.pageNum(pageNum)
|
||
.list(pageInfo.getList())
|
||
.pages(pageInfo.getPages())
|
||
.total(pageInfo.getTotal())
|
||
.build();
|
||
return pageResponse;
|
||
}
|
||
|
||
/**
|
||
* 用户绑定车牌号
|
||
* @param dto
|
||
*/
|
||
public void memberBindingCarNo(BindingCarNoDTO dto){
|
||
// 校验短信验证码
|
||
MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder()
|
||
.mobileNumber(dto.getPhoneNumber())
|
||
.verificationCode(dto.getVerificationCode())
|
||
.build();
|
||
checkVerificationCode(registerAndLoginDTO);
|
||
|
||
// 判断当前车牌号是否已经绑定
|
||
MemberPlateNumberRelation relation = new MemberPlateNumberRelation();
|
||
relation.setMemberId(dto.getMemberId());
|
||
relation.setLicensePlateNumber(dto.getCarNo());
|
||
List<MemberPlateNumberRelation> list = memberPlateNumberRelationService.selectMemberPlateNumberRelationList(relation);
|
||
if (CollectionUtils.isNotEmpty(list)) {
|
||
// 不为空说明该用户绑定过此车牌号
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARNO_HAS_BEEN_BINDING);
|
||
}
|
||
relation.setPhoneNumber(dto.getPhoneNumber());
|
||
memberPlateNumberRelationService.insertMemberPlateNumberRelation(relation);
|
||
}
|
||
|
||
/**
|
||
* 用户绑定鉴权卡
|
||
* @param dto
|
||
*/
|
||
public int memberBindCard(BindingCardDTO dto){
|
||
// 校验短信验证码
|
||
MemberRegisterAndLoginDTO registerAndLoginDTO = MemberRegisterAndLoginDTO.builder()
|
||
.mobileNumber(dto.getPhoneNumber())
|
||
.verificationCode(dto.getVerificationCode())
|
||
.build();
|
||
// checkVerificationCode(registerAndLoginDTO);
|
||
// 判断当前鉴权卡是否被绑定过
|
||
PileAuthCard authCard = PileAuthCard.builder()
|
||
.physicsCard(dto.getPhysicsCard())
|
||
.build();
|
||
PileAuthCard pileAuthCardInfo = pileAuthCardService.selectPileAuthCardInfo(authCard);
|
||
if (pileAuthCardInfo == null){
|
||
// 为空说明没查到此卡信息
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_NO_INFO);
|
||
}
|
||
if (StringUtils.isNotBlank(pileAuthCardInfo.getMemberId())) {
|
||
// memberId 不为空,说明此卡已被绑定
|
||
throw new BusinessException(ReturnCodeEnum.CODE_THIS_CARD_HAS_BEEN_BINDING);
|
||
}
|
||
authCard.setMemberId(dto.getMemberId());
|
||
authCard.setStatus("1"); // 1-正常使用
|
||
authCard.setCreateBy(dto.getMemberId());
|
||
authCard.setId(pileAuthCardInfo.getId());
|
||
return pileAuthCardService.updatePileAuthCard(authCard);
|
||
}
|
||
}
|