package com.nova.sankuai.service.impl;
|
|
import cn.hutool.core.date.DateUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.nova.sankuai.domain.api.tongbao.TBResposeInfo;
|
import com.nova.sankuai.domain.api.tongbao.TBUtil;
|
import com.nova.sankuai.domain.api.weiyaquanyi.WeiYaConfigProperties;
|
import com.nova.sankuai.domain.api.weiyaquanyi.WeiYaKeyUtil;
|
import com.nova.sankuai.domain.api.weiyaquanyi.WeiYaRespVO;
|
import com.nova.sankuai.domain.api.weiyaquanyi.WeiYaUtil;
|
import com.nova.sankuai.domain.entity.CustomerUser;
|
import com.nova.sankuai.domain.entity.TongbaoLog;
|
import com.nova.sankuai.domain.entity.VipCard;
|
import com.nova.sankuai.domain.vo.MemberRightAutoLoginVo;
|
import com.nova.sankuai.infra.config.CommonException;
|
import com.nova.sankuai.infra.mapper.CustomerUserMapper;
|
import com.nova.sankuai.infra.mapper.TongbaoLogMapper;
|
import com.nova.sankuai.infra.mapper.VipCardMapper;
|
import com.nova.sankuai.security.UserDetail;
|
import com.nova.sankuai.service.IMemberRightService;
|
import com.nova.sankuai.service.IShanTaiService;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.stereotype.Service;
|
|
import java.util.Date;
|
import java.util.Objects;
|
|
/**
|
* @Description 会员权益ServiceImpl
|
* @Author CWR
|
* @Date 2022/4/4 16:04
|
*/
|
|
@Slf4j
|
@Service
|
@AllArgsConstructor
|
public class MemberRightServiceImpl implements IMemberRightService {
|
|
private final WeiYaUtil weiYaUtil;
|
private final WeiYaConfigProperties properties;
|
|
private final CustomerUserMapper customerUserMapper;
|
|
private final VipCardMapper vipCardMapper;
|
|
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
|
|
private final TongbaoLogMapper tongbaoLogMapper;
|
|
private final IShanTaiService shanTaiService;
|
/**
|
* 渠道商用户开通会员卡回调
|
*
|
* @param userId 渠道侧会员id
|
* @param channelMemberId 渠道侧会员卡id
|
* @return
|
*/
|
@Override
|
public WeiYaRespVO channelMemberNotify(String userId, String channelMemberId) {
|
return this.weiYaUtil.channelMemberNotify(userId, channelMemberId);
|
}
|
|
/**
|
* 联登接口(AES加密请求参数并返回)
|
*
|
* @param vo 请求参数
|
* @return
|
*/
|
@Override
|
public String autoLogin(MemberRightAutoLoginVo vo) throws JsonProcessingException {
|
vo.setChannelCode(properties.getChannelCode());
|
String json = OBJECT_MAPPER.writeValueAsString(vo);
|
return WeiYaKeyUtil.encryptAES(json, properties.getAesSecretKey());
|
}
|
|
|
@Override
|
public String getChannelMemberId(UserDetail user) {
|
if (user == null) {
|
throw new CommonException("用户不存在");
|
}
|
CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.<CustomerUser>lambdaQuery()
|
.eq(CustomerUser::getPhone, user.getPhone()));
|
if (customerUser == null) {
|
throw new CommonException("用户不存在");
|
}
|
int compare = DateUtil.compare(new Date(), customerUser.getVipEndDate());
|
if (compare > 0) {
|
throw new CommonException("当前用户不存在有效的会员权益");
|
}
|
if (StringUtils.isNotEmpty(customerUser.getVipCardId())) {
|
return customerUser.getVipCardId();
|
} else {
|
VipCard vipCard = vipCardMapper.getVipLowestCard();
|
return vipCard.getCardId();
|
}
|
}
|
|
@Override
|
public String membershipInterests(String phone) {
|
//获取当前用户
|
CustomerUser customerUser = customerUserMapper.selectOne(new LambdaQueryWrapper<CustomerUser>()
|
.eq(CustomerUser::getPhone, phone));
|
//判断当前用户是否已经开通会员权益 true为开通
|
boolean ownership = isOwnership(customerUser);
|
String h5Url = "";
|
String serialNo = TBUtil.getOrder();
|
if (!ownership) {
|
//创建订单
|
TBResposeInfo tbRespose = TBUtil.createOrder(customerUser, serialNo);
|
if (tbRespose == null) {
|
throw new CommonException("通宝会员权益创建订单失败");
|
}
|
//存储数据记录
|
insertLog(customerUser, tbRespose, serialNo);
|
//修改用户
|
updateCustomer(customerUser, tbRespose);
|
h5Url = TBUtil.getH5Url(tbRespose.getOrderNumber(), customerUser);
|
} else {
|
//判断该用户是不是绑卡闪态
|
if (Objects.nonNull(customerUser)){
|
h5Url = shanTaiService.getEquityUrl(customerUser);
|
}
|
if (Objects.isNull(h5Url)){
|
h5Url = TBUtil.getH5Url(customerUser.getOrderNumber(), customerUser);
|
}
|
}
|
return h5Url;
|
|
}
|
|
@Override
|
public String manualMembershipInterests(String phone) {
|
//获取当前用户
|
CustomerUser customerUser = customerUserMapper.selectOne(new LambdaQueryWrapper<CustomerUser>()
|
.eq(CustomerUser::getPhone, phone));
|
boolean ownership = isOwnership(customerUser);
|
if (!ownership) {
|
String serialNo = TBUtil.getOrder();
|
//创建订单
|
TBResposeInfo tbRespose = TBUtil.createOrder(customerUser, serialNo);
|
if (tbRespose == null) {
|
throw new CommonException("通宝会员权益创建订单失败");
|
}
|
//存储数据记录
|
insertLog(customerUser, tbRespose, serialNo);
|
//修改用户
|
updateCustomer(customerUser, tbRespose);
|
return "操作成功";
|
} else {
|
throw new CommonException("该用户已开通会员权益");
|
}
|
}
|
|
public boolean isOwnership(CustomerUser customerUser) {
|
if (customerUser == null) {
|
throw new CommonException("当前用户不存在");
|
}
|
Date date = new Date();
|
if (customerUser.getVipStartDate() == null && customerUser.getVipEndDate() == null
|
&& customerUser.getSeniorVipStartDate() == null && customerUser.getSeniorVipEndDate() == null) {
|
throw new CommonException("当前用户不是会员");
|
} else if (date.getTime() > customerUser.getVipEndDate().getTime()) {
|
throw new CommonException("当前用户会员已过期");
|
}
|
if (StringUtils.isEmpty(customerUser.getOrderNumber())) {
|
return false;
|
}
|
return true;
|
}
|
|
public void insertLog(CustomerUser customerUser, TBResposeInfo tbRespose, String serialNo) {
|
TongbaoLog tongbaoLog = new TongbaoLog();
|
tongbaoLog.setCustomerUserId(customerUser.getId());
|
tongbaoLog.setCreationDate(new Date());
|
tongbaoLog.setOrderValidEndDay(tbRespose.getOrderValidEndDay());
|
tongbaoLog.setOrderNumber(tbRespose.getOrderNumber());
|
tongbaoLog.setPhone(customerUser.getPhone());
|
tongbaoLog.setName(customerUser.getName());
|
tongbaoLog.setSerialNo(serialNo);
|
tongbaoLogMapper.insert(tongbaoLog);
|
}
|
|
|
public void updateCustomer(CustomerUser customerUser, TBResposeInfo tbRespose) {
|
customerUserMapper.update(null, Wrappers.<CustomerUser>lambdaUpdate()
|
.set(CustomerUser::getOrderNumber, tbRespose.getOrderNumber())
|
.set(CustomerUser::getOrderValidEndDay, tbRespose.getOrderValidEndDay())
|
.eq(CustomerUser::getId, customerUser.getId()));
|
}
|
|
}
|