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.MallCharge; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMemberPayment; import cc.mrbird.febs.mall.entity.RunVip; 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.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; @Slf4j @Service @RequiredArgsConstructor public class RunVipServiceImpl extends ServiceImpl implements IRunVipService { private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallMemberPaymentMapper mallMemberPaymentMapper; private final MallChargeMapper mallChargeMapper; private final AgentProducer agentProducer; @Override public List vipInfo() { MallMember member = LoginUserUtil.getLoginUser(); List apiRunVipVos = new ArrayList<>(); if (StrUtil.isEmpty(member.getLevel())) { return apiRunVipVos; } String level = member.getLevel(); //获取当前用户的VIP等级 RunVip runVip = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(RunVip::getVipCode, level)); //获取大于当前用户等级序号的所有的VIP等级 LambdaQueryWrapper runVipLambdaQueryWrapper = new LambdaQueryWrapper<>(); runVipLambdaQueryWrapper.eq(RunVip::getState, YesOrNoEnum.YES.getValue()); runVipLambdaQueryWrapper.gt(RunVip::getOrderNumber, runVip.getOrderNumber()); List 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 trcType = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getType(), RunVipDataDictionaryEnum.CHARGE_TYPE_TRC.getCode() ).getValue(); String sysAddress = ""; if(trcType.equals(mallMemberPayment.getBankNo())){ sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_TRC.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_TRC.getCode() ).getValue(); }else{ sysAddress = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_BSC.getType(), RunVipDataDictionaryEnum.CHARGE_SYS_ADDRESS_BSC.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()); apiGoChargeVo.setSysAddressType(mallCharge.getType()); /** * 充值接口调用后,发送一个延时队列 * 功能:延迟时间为【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 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()); apiGoChargeVo.setSysAddressType(mallCharge.getType()); return new FebsResponse().success().data(apiGoChargeVo); } @Override public List getChargeList(ApiChargeListDto apiChargeListDto) { Long memberId = LoginUserUtil.getLoginUser().getId(); apiChargeListDto.setMemberId(memberId); Page page = new Page<>(apiChargeListDto.getPageNum(), apiChargeListDto.getPageSize()); return mallChargeMapper.selectChargeListInPage(apiChargeListDto, page); } }