From 7bf5945cdd7560922828f225c882d82f95405648 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Fri, 03 Jan 2025 10:27:31 +0800
Subject: [PATCH] feat(mall): 添加会员购买功能并优化节点助力逻辑
---
src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java | 12 ++-
src/main/java/cc/mrbird/febs/mall/service/AsyncService.java | 2
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java | 60 ++++++++++++++++++++
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java | 7 ++
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 18 +++--
src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java | 18 ++---
src/main/java/cc/mrbird/febs/mall/dto/ApiBalanceBuyDto.java | 24 ++++++++
src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java | 7 +-
src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java | 5 +
9 files changed, 125 insertions(+), 28 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
index 920344b..5c776f5 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
@@ -8,6 +8,11 @@
/**
* 碳币兑换USDT
*/
+ COMMISSION_PAY(16,"购买会员,APP支付{}","购买会员,APP支付"),
+
+ /**
+ * 碳币兑换USDT
+ */
BALANCE_OUT_COMMISSION_IN(15,"{}碳币兑换{}USDT","获得USDT"),
/**
@@ -33,7 +38,7 @@
/**
* 节点助力
*/
- NODE_BALANCE(10,"节点助力碳币{}","节点助力碳币"),
+ NODE_COMMISSION(10,"节点助力{}","节点助力"),
/**
* 获得碳积分
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java
index 0b0591a..d62ce1d 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java
@@ -2,10 +2,7 @@
import cc.mrbird.febs.common.annotation.SubmitRepeat;
import cc.mrbird.febs.common.entity.FebsResponse;
-import cc.mrbird.febs.mall.dto.ApiChargeListDto;
-import cc.mrbird.febs.mall.dto.ApiGetRunDateDto;
-import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
-import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
+import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.*;
import io.swagger.annotations.Api;
@@ -75,6 +72,13 @@
return new FebsResponse().success().data(iRunVipService.getChargeList(apiChargeListDto));
}
+ @ApiOperation(value = "【购买VIP】APP支付", notes = "【购买VIP】APP支付")
+ @PostMapping(value = "/goCharge")
+ @SubmitRepeat
+ public FebsResponse balanceBuy(@RequestBody @Valid ApiBalanceBuyDto apiBalanceBuyDto) {
+ return iRunVipService.balanceBuy(apiBalanceBuyDto);
+ }
+
@ApiOperation(value = "【购买VIP】立即购买", notes = "【购买VIP】立即购买")
@ApiResponses({
@ApiResponse(code = 200, message = "success", response = ApiGoChargeVo.class)
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiBalanceBuyDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiBalanceBuyDto.java
new file mode 100644
index 0000000..82e9187
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiBalanceBuyDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel(value = "ApiBalanceBuyDto", description = "参数接收类")
+public class ApiBalanceBuyDto {
+
+ @NotNull(message = "请选择会员")
+ @ApiModelProperty(value = "会员ID", example = "123456")
+ private Long runVipId;
+
+ @NotNull(message = "请输入资金密码")
+ @ApiModelProperty(value = "资金密码", example = "123456")
+ private String tradeWord;
+
+ @NotNull(message = "请选择数量")
+ @ApiModelProperty(value = "数量", example = "123456")
+ private Integer vipCnt;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java b/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java
index f913a72..a8e517b 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/AsyncService.java
@@ -13,5 +13,5 @@
void releaseScore(BigDecimal amount,Long memberId);
@Async(FebsConstant.ASYNC_POOL)
- void releaseNodeCoin(BigDecimal amount, BigDecimal percent, BigDecimal balanceToCoin, Long memberId);
+ void releaseNodeCoin(BigDecimal amount, BigDecimal percent, Long memberId);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java b/src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java
index a642de2..28ef69a 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java
@@ -1,10 +1,7 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.common.entity.FebsResponse;
-import cc.mrbird.febs.mall.dto.ApiChargeListDto;
-import cc.mrbird.febs.mall.dto.ApiGetRunDateDto;
-import cc.mrbird.febs.mall.dto.ApiGoChargeDto;
-import cc.mrbird.febs.mall.dto.ApiGoChargeInfoDto;
+import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -16,6 +13,8 @@
FebsResponse goCharge(ApiGoChargeDto apiGoChargeDto);
+ FebsResponse balanceBuy(ApiBalanceBuyDto apiBalanceBuyDto);
+
FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto);
List<ApiChargeVo> getChargeList(ApiChargeListDto apiChargeListDto);
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java
index c3585fd..9063f79 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AsyncServiceImpl.java
@@ -43,26 +43,22 @@
}
@Override
- public void releaseNodeCoin(BigDecimal amount, BigDecimal percent, BigDecimal balanceToCoin, Long memberId) {
+ public void releaseNodeCoin(BigDecimal amount, BigDecimal percent, Long memberId) {
//实际节点助力的碳币
- BigDecimal multiply = amount.multiply(percent);
+ BigDecimal multiply = amount.multiply(percent).setScale(2,RoundingMode.DOWN);
if(BigDecimal.ZERO.compareTo(multiply) >=0){
return;
}
- BigDecimal divide = multiply.divide(balanceToCoin, 2, RoundingMode.DOWN);
- if(BigDecimal.ZERO.compareTo(divide) >=0){
- return;
- }
- walletService.addBalance(divide,memberId);
+ walletService.addCommission(multiply,memberId);
String orderNo = MallUtils.getOrderNum("JD");
mallMoneyFlowService.runVipMoneyFlowAdd(
memberId,
memberId,
orderNo,
- FlowTypeEnum.BALANCE.getValue(),
- RunVipMoneyFlowTypeEnum.NODE_BALANCE.getValue(),
- divide,
- StrUtil.format(RunVipMoneyFlowTypeEnum.NODE_BALANCE.getDescription(),divide),
+ FlowTypeEnum.COMMISSION.getValue(),
+ RunVipMoneyFlowTypeEnum.NODE_COMMISSION.getValue(),
+ multiply,
+ StrUtil.format(RunVipMoneyFlowTypeEnum.NODE_COMMISSION.getDescription(),multiply),
YesOrNoEnum.YES.getValue()
);
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
index d6a9301..0324149 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -857,24 +857,28 @@
}
//获取节点设置
List<RunNodeSet> runNodeSets = runNodeSetMapper.selectList(null);
- BigDecimal balanceToCoin = new BigDecimal(
- dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
- RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(),
- RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue()
- ).setScale(2, BigDecimal.ROUND_DOWN);
+
+ //获取节点设置runNodeSets中orderNumber最小的节点
+ RunNodeSet minRunNodeSet = runNodeSets.stream().min(Comparator.comparingInt(RunNodeSet::getOrderNumber)).orElse(null);
+ if(null == minRunNodeSet){
+ return;
+ }
DateTime endTime = DateUtil.date();
for (MallMember item : mallMembers) {
//获取总业绩
BigDecimal achieve = getDirectAchieve(item.getInviteId(),item.getDirectorTime(),endTime);
- if(BigDecimal.ZERO.compareTo(achieve) >= 0){
+ //判断总业绩是否小于最小业绩
+ if(minRunNodeSet.getMinAchieve().compareTo(achieve) > 0){
+ item.setDirector(YesOrNoEnum.NO.getValue());
+ mallMemberMapper.updateById(item);
continue;
}
BigDecimal nodePercent = getNodePercent(runNodeSets, achieve);
if(BigDecimal.ZERO.compareTo(nodePercent) >= 0){
continue;
}
- asyncService.releaseNodeCoin(achieve,nodePercent,balanceToCoin,item.getId());
+ asyncService.releaseNodeCoin(achieve,nodePercent,item.getId());
item.setDirectorTime(endTime);
mallMemberMapper.updateById(item);
}
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 37fad9e..635c78d 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
@@ -12,6 +12,8 @@
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.*;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.*;
import cc.mrbird.febs.rabbit.producter.AgentProducer;
@@ -48,6 +50,8 @@
private final MallMoneyFlowMapper mallMoneyFlowMapper;
private final MallMemberWalletMapper mallMemberWalletMapper;
private final MallMemberMapper mallMemberMapper;
+ private final IApiMallMemberWalletService walletService;
+ private final IMallMoneyFlowService mallMoneyFlowService;
@Override
public List<ApiRunVipVo> vipInfo() {
Long memberId = LoginUserUtil.getLoginUser().getId();
@@ -152,6 +156,62 @@
}
@Override
+ public FebsResponse balanceBuy(ApiBalanceBuyDto apiBalanceBuyDto) {
+ Long memberId = LoginUserUtil.getLoginUser().getId();
+ MallMember mallMember = mallMemberMapper.selectById(memberId);
+ if (StrUtil.isBlank(mallMember.getTradePassword())) {
+ throw new FebsException("未设置资金密码");
+ }
+
+ if (!mallMember.getTradePassword().equals(SecureUtil.md5(apiBalanceBuyDto.getTradeWord()))) {
+ throw new FebsException("资金密码错误");
+ }
+ Long runVipId = apiBalanceBuyDto.getRunVipId();
+ RunVip runVip = this.baseMapper.selectById(runVipId);
+ if(runVip.getState() != YesOrNoEnum.YES.getValue()){
+ throw new FebsException("会员套餐已下架");
+ }
+ //价格
+ BigDecimal presentAmount = runVip.getPresentPrice().setScale(2,BigDecimal.ROUND_DOWN);
+ MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
+ if(mallMemberWallet.getCommission().compareTo(BigDecimal.ZERO) <= 0){
+ throw new FebsException("余额不足");
+ }
+ if(mallMemberWallet.getCommission().compareTo(presentAmount) < 0){
+ throw new FebsException("余额不足");
+ }
+
+ String orderNo = MallUtils.getOrderNum();
+ walletService.reduceCommission(presentAmount,memberId);
+ mallMoneyFlowService.runVipMoneyFlowAdd(
+ memberId,
+ memberId,
+ orderNo,
+ FlowTypeEnum.COMMISSION.getValue(),
+ RunVipMoneyFlowTypeEnum.COMMISSION_PAY.getValue(),
+ presentAmount,
+ StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_PAY.getDescription(),presentAmount),
+ YesOrNoEnum.YES.getValue()
+ );
+
+ MallCharge mallCharge = new MallCharge();
+ mallCharge.setMemberId(memberId);
+ mallCharge.setOrderNo(orderNo);
+ mallCharge.setState(YesOrNoEnum.YES.getValue());
+ mallCharge.setType(StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_PAY.getDescription(),presentAmount));
+ mallCharge.setAddress(mallMember.getPhone());
+ mallCharge.setAmount(presentAmount);
+ mallCharge.setVipCode(runVip.getVipCode());
+ mallCharge.setVipName(runVip.getVipName());
+ mallCharge.setVipCnt(apiBalanceBuyDto.getVipCnt());
+ mallChargeMapper.insert(mallCharge);
+
+ agentProducer.sendBuyVipSuccessMsg(mallCharge.getId());
+
+ return new FebsResponse().success().message("操作成功");
+ }
+
+ @Override
public FebsResponse goChargeInfo(ApiGoChargeInfoDto apiGoChargeInfoDto) {
Long memberId = LoginUserUtil.getLoginUser().getId();
String orderNo = apiGoChargeInfoDto.getOrderNo();
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
index cea7b1d..645a1b1 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
@@ -34,10 +34,15 @@
private Integer commissionState;//是否允许USDT提现 1是0否
@ApiModelProperty(value = "是否允许内转 1-是0-否")
private Integer insideState;//是否允许内转 1-是0-否
+
+ @ApiModelProperty(value = "是否允许权益升级 1-是0-否")
+ private Integer growState;//是否允许权益升级 1-是0-否
+
@ApiModelProperty(value = "每日碳积分增长倍数")
private BigDecimal growthValue;//每日碳积分增长倍数
@ApiModelProperty(value = "每日获取碳积分最大值")
private Integer growthCnt;//每日获取碳积分最大值
+
@ApiModelProperty(value = "购买会员返利金额比例(实际支付金额 * rebatePercent = 返利金额)")
private BigDecimal rebatePercent;//购买会员返利金额比例(实际支付金额 * rebatePercent = 返利金额)
}
--
Gitblit v1.9.1