package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.entity.FebsResponse;
|
import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum;
|
import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.common.utils.MallUtils;
|
import cc.mrbird.febs.mall.conversion.RunVipConversion;
|
import cc.mrbird.febs.mall.dto.ApiChargeListDto;
|
import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
|
import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
|
import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto;
|
import cc.mrbird.febs.mall.entity.*;
|
import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
|
import cc.mrbird.febs.mall.mapper.MallChargeMapper;
|
import cc.mrbird.febs.mall.mapper.MallMemberPaymentMapper;
|
import cc.mrbird.febs.mall.mapper.RunVipMapper;
|
import cc.mrbird.febs.mall.service.IRunVipService;
|
import cc.mrbird.febs.mall.vo.ApiChargeInfoVo;
|
import cc.mrbird.febs.mall.vo.ApiChargeVo;
|
import cc.mrbird.febs.mall.vo.ApiGoChargeVo;
|
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
|
import cc.mrbird.febs.rabbit.producter.AgentProducer;
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class RunVipServiceImpl extends ServiceImpl<RunVipMapper, RunVip> implements IRunVipService {
|
|
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
|
private final MallMemberPaymentMapper mallMemberPaymentMapper;
|
private final MallChargeMapper mallChargeMapper;
|
private final AgentProducer agentProducer;
|
@Override
|
public List<ApiRunVipVo> vipInfo() {
|
MallMember member = LoginUserUtil.getLoginUser();
|
List<ApiRunVipVo> apiRunVipVos = new ArrayList<>();
|
if (StrUtil.isEmpty(member.getLevel())) {
|
return apiRunVipVos;
|
}
|
String level = member.getLevel();
|
//获取当前用户的VIP等级
|
RunVip runVip = this.baseMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, level));
|
//获取大于当前用户等级序号的所有的VIP等级
|
LambdaQueryWrapper<RunVip> runVipLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
runVipLambdaQueryWrapper.eq(RunVip::getState, YesOrNoEnum.YES.getValue());
|
runVipLambdaQueryWrapper.gt(RunVip::getOrderNumber, runVip.getOrderNumber());
|
List<RunVip> runVips = this.baseMapper.selectList(runVipLambdaQueryWrapper);
|
apiRunVipVos = RunVipConversion.INSTANCE.entityToVos(runVips);
|
|
return apiRunVipVos;
|
}
|
|
@Override
|
public FebsResponse goCharge(ApiGoChargeDto apiGoChargeDto) {
|
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
|
Long runVipId = apiGoChargeDto.getRunVipId();
|
RunVip runVip = this.baseMapper.selectById(runVipId);
|
if(runVip.getState() != YesOrNoEnum.YES.getValue()){
|
throw new FebsException("会员套餐已下架");
|
}
|
//价格
|
BigDecimal presentAmount = runVip.getPresentPrice().multiply(new BigDecimal(apiGoChargeDto.getVipCnt())).setScale(2,BigDecimal.ROUND_DOWN);
|
|
Long addressId = apiGoChargeDto.getAddressId();
|
MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(addressId);
|
if(ObjectUtil.isEmpty(mallMemberPayment)){
|
return new FebsResponse().fail().message("请先绑定你的地址");
|
}
|
|
String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(),
|
RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode()
|
).getValue();
|
String failMinutes = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
RunVipDataDictionaryEnum.CHARGE_SYS_FAIL_TIME.getType(),
|
RunVipDataDictionaryEnum.CHARGE_SYS_FAIL_TIME.getCode()
|
).getValue();
|
DateTime failTime = DateUtil.offsetMinute(DateUtil.date(), Integer.parseInt(failMinutes));
|
|
MallCharge mallCharge = new MallCharge();
|
mallCharge.setMemberId(memberId);
|
mallCharge.setOrderNo(MallUtils.getOrderNum());
|
mallCharge.setState(YesOrNoEnum.ING.getValue());
|
mallCharge.setType(mallMemberPayment.getBankNo());
|
mallCharge.setAddress(mallMemberPayment.getBank());
|
mallCharge.setAmount(presentAmount);
|
mallCharge.setFailTime(failTime);
|
mallCharge.setSysAddress(sysAddress);
|
mallCharge.setVipCode(runVip.getVipCode());
|
mallCharge.setVipName(runVip.getVipName());
|
mallCharge.setVipCnt(apiGoChargeDto.getVipCnt());
|
mallChargeMapper.insert(mallCharge);
|
|
ApiGoChargeVo apiGoChargeVo = new ApiGoChargeVo();
|
apiGoChargeVo.setFailTime(mallCharge.getFailTime());
|
apiGoChargeVo.setAddress(mallCharge.getAddress());
|
apiGoChargeVo.setAmount(mallCharge.getAmount());
|
apiGoChargeVo.setSysAddress(mallCharge.getSysAddress());
|
|
/**
|
* 充值接口调用后,发送一个延时队列
|
* 功能:延迟时间为【failMinutes】后,更新充值记录为失败。
|
*/
|
ApiMemberChargeFailDto apiMemberChargeFailDto = new ApiMemberChargeFailDto();
|
apiMemberChargeFailDto.setChargeId(mallCharge.getId());
|
apiMemberChargeFailDto.setFailTime(Integer.parseInt(failMinutes) * 60L* 1000L);
|
agentProducer.sendMemberChargeFailMsg(apiMemberChargeFailDto);
|
|
return new FebsResponse().success().data(apiGoChargeVo);
|
}
|
|
@Override
|
public FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto) {
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
String orderNo = apiGoChargeInfoDto.getOrderNo();
|
|
LambdaQueryWrapper<MallCharge> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
objectLambdaQueryWrapper.eq(MallCharge::getMemberId,memberId);
|
objectLambdaQueryWrapper.eq(MallCharge::getOrderNo,orderNo);
|
MallCharge mallCharge = mallChargeMapper.selectOne(objectLambdaQueryWrapper);
|
|
ApiGoChargeVo apiGoChargeVo = new ApiGoChargeVo();
|
apiGoChargeVo.setFailTime(mallCharge.getFailTime());
|
apiGoChargeVo.setAddress(mallCharge.getAddress());
|
apiGoChargeVo.setAmount(mallCharge.getAmount());
|
apiGoChargeVo.setSysAddress(mallCharge.getSysAddress());
|
return new FebsResponse().success().data(apiGoChargeVo);
|
}
|
|
@Override
|
public FebsResponse getChargeInfo() {
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
ApiChargeInfoVo apiChargeInfoVo = new ApiChargeInfoVo();
|
|
String sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
|
RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getType(),
|
RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS.getCode()
|
).getValue();
|
apiChargeInfoVo.setChargeAddress(sysAddress);
|
List<DataDictionaryCustom> dataDictionaryCustoms = dataDictionaryCustomMapper.selectDicByType(RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getType());
|
List<String> coinTypeList = dataDictionaryCustoms.stream().map(DataDictionaryCustom::getValue).collect(Collectors.toList());
|
apiChargeInfoVo.setCoinType(coinTypeList);
|
return new FebsResponse().success().data(apiChargeInfoVo);
|
}
|
|
@Override
|
public List<ApiChargeVo> getChargeList(ApiChargeListDto apiChargeListDto) {
|
Long memberId = LoginUserUtil.getLoginUser().getId();
|
apiChargeListDto.setMemberId(memberId);
|
Page<ApiChargeVo> page = new Page<>(apiChargeListDto.getPageNum(), apiChargeListDto.getPageSize());
|
return mallChargeMapper.selectChargeListInPage(apiChargeListDto, page);
|
}
|
}
|