From 288e2a2ca2e7c2f7158507174a42f8a417380d23 Mon Sep 17 00:00:00 2001 From: KKSU <15274802129@163.com> Date: Tue, 17 Dec 2024 18:03:35 +0800 Subject: [PATCH] feat(mall): 实现 VIP购买功能 --- src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java | 132 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 130 insertions(+), 2 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java index f1d39ed..7204a35 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java @@ -1,27 +1,52 @@ 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.entity.MallMember; -import cc.mrbird.febs.mall.entity.RunVip; +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(); @@ -41,4 +66,107 @@ 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); + } } -- Gitblit v1.9.1