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