From 548a01654a5fdb158aa2cca86ae83ffaebbb0395 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Fri, 03 Jan 2025 09:37:11 +0800
Subject: [PATCH] feat(mall): 增加 USDT 提现功能

---
 src/main/resources/templates/febs/views/modules/runVip/vipEdit.html            |   20 +++
 src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java                             |    6 +
 src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java    |   24 ++++
 src/main/resources/mapper/modules/MallMemberMapper.xml                         |    4 
 src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java                 |    2 
 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java           |    4 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java   |  123 ++++++++++++++++++-----
 src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java                          |    2 
 src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html |    1 
 src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java                           |    6 +
 src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java                         |   10 +
 src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html  |    3 
 src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java     |    2 
 src/main/resources/templates/febs/views/modules/runVip/vipAdd.html             |   17 +++
 src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java   |    2 
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java      |   12 ++
 src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java           |   21 +++-
 src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java    |    7 +
 src/main/resources/templates/febs/views/modules/runVip/sellVipList.html        |    2 
 src/main/java/cc/mrbird/febs/mall/entity/RunVip.java                           |    2 
 20 files changed, 220 insertions(+), 50 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
index a853314..5b44448 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java
@@ -29,7 +29,7 @@
     //系统充值地址
     CHARGE_SYS_ADDRESS_BSC("CHARGE_TYPE", "CHARGE_SYS_ADDRESS_BSC"),
 
-    //碳币兑换USDT的手续费率
+    //USDT提现的最小数
     RUN_VIP_BALANCE_TO_COIN_PERCENT("CHARGE_TYPE", "RUN_VIP_BALANCE_TO_COIN_PERCENT"),
 
     //碳币兑换USDT的最小数
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 f835dd3..920344b 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java
@@ -6,6 +6,26 @@
 public enum RunVipMoneyFlowTypeEnum {
 
     /**
+     * 碳币兑换USDT
+     */
+    BALANCE_OUT_COMMISSION_IN(15,"{}碳币兑换{}USDT","获得USDT"),
+
+    /**
+     * 碳币兑换USDT
+     */
+    BALANCE_OUT_COMMISSION(14,"{}碳币兑换{}USDT","碳币兑换"),
+
+    /**
+     * USDT转赠好友-转入
+     */
+    COMMISSION_IN_GIVE_FRIEND(13,"获得好友{},{}USDT","USDT转赠好友-转入"),
+
+    /**
+     * USDT转赠好友-转出
+     */
+    COMMISSION_OUT_GIVE_FRIEND(12,"转赠好友{},{}USDT","USDT转赠好友-转出"),
+
+    /**
      * 节点助力
      */
     DIRECT_SCORE(11,"团队助力碳积分{}","团队助力碳积分"),
@@ -36,9 +56,9 @@
     BUY_VIP_REBATE(6,"{}购买{},返利{}碳币","用户返利碳币"),
 
     /**
-     * 碳币提现
+     * USDT提现
      */
-    BALANCE_OUT(5,"{}碳币兑换{}USDT,手续费{}USDT","碳币提现"),
+    COMMISSION_OUT(5,"提现{}USDT,手续费{}USDT","USDT提现"),
 
     /**
      * 碳积分兑换碳币
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
index 5da3a9a..4864b80 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -112,14 +112,22 @@
         return new FebsResponse().success().message("操作成功");
     }
 
-    @ApiOperation(value = "兑换提现")
+    @ApiOperation(value = "碳币兑换USDT")
     @PostMapping(value = "/withdrawal")
     @SubmitRepeat
-    public FebsResponse withdrawal(@RequestBody @Validated WithdrawalDto withdrawalDto) {
+    public FebsResponse withdrawal(@RequestBody @Validated CommissionChangeDto withdrawalDto) {
         memberService.withdrawal(withdrawalDto);
         return new FebsResponse().success().message("操作成功");
     }
 
+    @ApiOperation(value = "USDT提现")
+    @PostMapping(value = "/withdrawalU")
+    @SubmitRepeat
+    public FebsResponse withdrawalU(@RequestBody @Validated WithdrawalDto withdrawalDto) {
+        memberService.withdrawalU(withdrawalDto);
+        return new FebsResponse().success().message("操作成功");
+    }
+
     @ApiOperation(value = "榜单")
     @ApiResponses({
             @ApiResponse(code = 200, message = "success", response = ApiChartVo.class)
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
index 8792662..9216444 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
@@ -40,7 +40,7 @@
     private BigDecimal prizeScore;
 
     /**
-     * 佣金
+     * USDT
      */
     private BigDecimal commission;
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/RunVip.java b/src/main/java/cc/mrbird/febs/mall/entity/RunVip.java
index 999892e..ba0d84a 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/RunVip.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/RunVip.java
@@ -25,6 +25,8 @@
 
     private Integer withdrawState;//是否允许碳币提现 1是0否
 
+    private Integer commissionState;//是否允许USDT提现 1是0否
+
     private Integer insideState;//是否允许内转 1-是0-否
 
     private BigDecimal growthValue;//每日碳积分增长倍数
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
index d9a2968..597cb82 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -43,7 +43,9 @@
 
     void transfer(TransferDto transferDto);
 
-    void withdrawal(WithdrawalDto withdrawalDto);
+    void withdrawal(CommissionChangeDto withdrawalDto);
+
+    void withdrawalU(WithdrawalDto withdrawalDto);
 
     void commissionChange(CommissionChangeDto commissionChange);
 
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java
index 8cbd603..236c3a2 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java
@@ -116,7 +116,7 @@
         mallMoneyFlow.setStatus(mallMemberWithdraw.getStatus());
         mallMoneyFlowMapper.updateById(mallMoneyFlow);
         if(mallMemberWithdraw.getStatus() == YesOrNoEnum.NO.getValue()){
-            walletService.addBalance(mallMemberWithdraw.getWithdrawTimes(), mallMemberWithdraw.getMemberId());
+            walletService.addCommission(mallMemberWithdraw.getWithdrawTimes(), mallMemberWithdraw.getMemberId());
         }
         return new FebsResponse().success().message("操作成功");
     }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
index a939650..2aea39f 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -4,10 +4,7 @@
 import cc.mrbird.febs.common.enumerates.RunVipDataDictionaryEnum;
 import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
 import cc.mrbird.febs.mall.dto.ApiMemberChargeFailDto;
-import cc.mrbird.febs.mall.entity.AgentInfo;
-import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
-import cc.mrbird.febs.mall.entity.MallCharge;
-import cc.mrbird.febs.mall.entity.MallMember;
+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.MallMemberMapper;
@@ -28,7 +25,9 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -211,7 +210,8 @@
             // 获取会员信息
             MallMember mallMember = mallMemberMapper.selectById(memberId);
             if (mallMember == null) {
-                throw new IllegalArgumentException("会员不存在");
+                log.info("会员不存在");
+                return;
             }
 
             // 已经是节点则跳过
@@ -219,6 +219,17 @@
                 return;
             }
 
+            //节点不是最高等级不升级节点
+            Optional<RunVip> max = runVipMapper.selectList(null).stream().max(Comparator.comparing(RunVip::getOrderNumber));
+            RunVip maxRunVip = max.orElse(null);
+            if (maxRunVip == null) {
+                log.info("会员等级不存在");
+                return;
+            }
+            if (!maxRunVip.getVipCode().equals(mallMember.getLevel())) {
+                return;
+            }
+
             // 获取直推成员和团队成员
             List<MallMember> allMembers = mallMemberMapper.selectList(
                     new LambdaQueryWrapper<MallMember>()
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index e97d254..af1c944 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -47,6 +47,7 @@
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -295,11 +296,13 @@
         mallMemberVo.setChangeState(runVip.getChangeState());
         mallMemberVo.setWithdrawState(runVip.getWithdrawState());
         mallMemberVo.setInsideState(runVip.getInsideState());
+        mallMemberVo.setCommissionState(runVip.getCommissionState());
 
 
         MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId());
         mallMemberVo.setBalance(wallet.getBalance());
         mallMemberVo.setScore(wallet.getScore());
+        mallMemberVo.setCommission(wallet.getCommission());
         return new FebsResponse().success().data(mallMemberVo);
     }
 
@@ -440,6 +443,7 @@
         //获取个人的碳币
         MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
         myTeamVo.setMyBalance(mallMemberWallet.getBalance());
+        myTeamVo.setMyCommission(mallMemberWallet.getCommission());
         //全部直推
         List<MallMember> mallMembers = this.baseMapper.selectByRefererId(mallMember.getInviteId());
         /**
@@ -448,6 +452,7 @@
         if(CollUtil.isEmpty(mallMembers)){
             myTeamVo.setMyTeamCnt(0);
             myTeamVo.setMyTeamBalance(BigDecimal.ZERO);
+            myTeamVo.setMyTeamCommission(BigDecimal.ZERO);
             myTeamVo.setTeam(null);
             return new FebsResponse().success().data(myTeamVo);
         }
@@ -455,7 +460,8 @@
          * 如果有下级,获取所有的团队
          */
         myTeamVo.setMyTeamCnt(mallMembers.size());
-        myTeamVo.setMyTeamBalance(getTeamBalance(mallMembers));
+        myTeamVo.setMyTeamBalance(getTeamBalance(mallMembers).getMyTeamBalance());
+        myTeamVo.setMyTeamCommission(getTeamBalance(mallMembers).getMyTeamCommission());
 
         List<TeamListVo> teamListVos = MallMemberConversion.INSTANCE.entityToTeamListVos(mallMembers);
         teamListVos.forEach(item -> {
@@ -465,10 +471,12 @@
             if(CollUtil.isEmpty(mallMemberRefs)){
                 item.setMyTeamCnt(0);
                 item.setMyTeamBalance(BigDecimal.ZERO);
+                item.setMyTeamCommission(BigDecimal.ZERO);
             }else{
                 item.setMyTeamCnt(mallMemberRefs.size());
                 //获取mallMembers的所有id
-                item.setMyTeamBalance(getTeamBalance(mallMemberRefs));
+                item.setMyTeamBalance(getTeamBalance(mallMemberRefs).getMyTeamBalance());
+                item.setMyTeamCommission(getTeamBalance(mallMemberRefs).getMyTeamCommission());
             }
         });
         myTeamVo.setTeam(teamListVos);
@@ -485,15 +493,17 @@
      * @param mallMembers 商城成员列表,用于计算总余额
      * @return 团队的总余额,表示为BigDecimal类型
      */
-    private BigDecimal getTeamBalance(List<MallMember> mallMembers) {
+    private TeamListVo getTeamBalance(List<MallMember> mallMembers) {
+        TeamListVo teamListVo = new TeamListVo();
         // 提取所有商城成员的ID,以便进行后续的钱包信息查询
         List<Long> ids = mallMembers.stream().map(MallMember::getId).collect(Collectors.toList());
 
         // 根据成员ID列表查询所有相关成员的钱包信息
         List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectList(new LambdaQueryWrapper<MallMemberWallet>().in(MallMemberWallet::getMemberId, ids));
-
         // 计算所有成员钱包余额的总和,并返回该总和
-        return mallMemberWallets.stream().map(MallMemberWallet::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
+        teamListVo.setMyTeamBalance(mallMemberWallets.stream().map(MallMemberWallet::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add));
+        teamListVo.setMyTeamCommission(mallMemberWallets.stream().map(MallMemberWallet::getCommission).reduce(BigDecimal.ZERO, BigDecimal::add));
+        return teamListVo;
     }
 
     @Override
@@ -587,35 +597,35 @@
             throw new FebsException("资金密码错误");
         }
 
-        walletService.reduceBalance(transferDto.getAmount(), loginMember.getId());
+        walletService.reduceCommission(transferDto.getAmount(), loginMember.getId());
         String orderNo = MallUtils.getOrderNum("HZ");
         this.runVipMoneyFlowAdd(
                 loginMember.getId(),
                 mallMember.getId(),
                 orderNo,
-                FlowTypeEnum.BALANCE.getValue(),
-                RunVipMoneyFlowTypeEnum.BALANCE_OUT_GIVE_FRIEND.getValue(),
+                FlowTypeEnum.COMMISSION.getValue(),
+                RunVipMoneyFlowTypeEnum.COMMISSION_OUT_GIVE_FRIEND.getValue(),
                 transferDto.getAmount().negate(),
-                StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_GIVE_FRIEND.getDescription(),mallMember.getInviteId(),transferDto.getAmount()),
+                StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_OUT_GIVE_FRIEND.getDescription(),mallMember.getInviteId(),transferDto.getAmount()),
                 YesOrNoEnum.YES.getValue()
         );
-        walletService.addBalance(transferDto.getAmount(), mallMember.getId());
+        walletService.addCommission(transferDto.getAmount(), mallMember.getId());
 
         this.runVipMoneyFlowAdd(
                 mallMember.getId(),
                 loginMember.getId(),
                 orderNo,
-                FlowTypeEnum.BALANCE.getValue(),
-                RunVipMoneyFlowTypeEnum.BALANCE_IN_GIVE_FRIEND.getValue(),
+                FlowTypeEnum.COMMISSION.getValue(),
+                RunVipMoneyFlowTypeEnum.COMMISSION_IN_GIVE_FRIEND.getValue(),
                 transferDto.getAmount(),
-                StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_IN_GIVE_FRIEND.getDescription(),loginMember.getInviteId(),transferDto.getAmount()),
+                StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_IN_GIVE_FRIEND.getDescription(),loginMember.getInviteId(),transferDto.getAmount()),
                 YesOrNoEnum.YES.getValue()
         );
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void withdrawal(WithdrawalDto withdrawalDto) {
+    public void withdrawal(CommissionChangeDto withdrawalDto) {
         Long memberId = LoginUserUtil.getLoginUser().getId();
         MallMember loginMember = this.baseMapper.selectById(memberId);
         /**
@@ -634,15 +644,11 @@
             throw new FebsException("资金密码错误");
         }
 
-        MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(withdrawalDto.getAddressId());
-        if (mallMemberPayment == null) {
-            throw new FebsException("无效的提现地址");
-        }
         BigDecimal minCnt = new BigDecimal(
                 dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getType(),
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_MIN.getCode()).getValue()
-        ).setScale(4, BigDecimal.ROUND_DOWN);
+        ).setScale(4, RoundingMode.DOWN);
         if(minCnt.compareTo(withdrawalDto.getAmount()) > 0){
             throw new FebsException(minCnt+"碳币起提");
         }
@@ -651,25 +657,84 @@
                 dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getType(),
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN.getCode()).getValue()
-        ).setScale(2, BigDecimal.ROUND_DOWN);
+        ).setScale(2, RoundingMode.DOWN);
+        BigDecimal withdrawalAmount = withdrawalDto.getAmount().multiply(balanceToCoin).setScale(2, RoundingMode.DOWN);
+        if(BigDecimal.ZERO.compareTo(withdrawalAmount) >= 0){
+            throw new FebsException("转换异常");
+        }
+
+        /**
+         *  减少碳币
+         */
+        walletService.reduceBalance(withdrawalDto.getAmount(), loginMember.getId());
+        String orderNo = MallUtils.getOrderNum("BU");
+        this.runVipMoneyFlowAdd(
+                loginMember.getId(),
+                loginMember.getId(),
+                orderNo,
+                FlowTypeEnum.BALANCE.getValue(),
+                RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION.getValue(),
+                withdrawalDto.getAmount().negate(),
+                StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION.getDescription(),withdrawalDto.getAmount(),withdrawalAmount),
+                YesOrNoEnum.YES.getValue()
+        );
+        walletService.addCommission(withdrawalAmount, loginMember.getId());
+        this.runVipMoneyFlowAdd(
+                loginMember.getId(),
+                loginMember.getId(),
+                orderNo,
+                FlowTypeEnum.COMMISSION.getValue(),
+                RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION_IN.getValue(),
+                withdrawalAmount,
+                StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT_COMMISSION_IN.getDescription(),withdrawalDto.getAmount(),withdrawalAmount),
+                YesOrNoEnum.YES.getValue()
+        );
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void withdrawalU(WithdrawalDto withdrawalDto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        MallMember loginMember = this.baseMapper.selectById(memberId);
+        /**
+         * 用户的等级level是否允许USDT提现
+         */
+        RunVip runVip = runVipMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, loginMember.getLevel()));
+        if(ObjectUtil.isEmpty(runVip) || runVip.getCommissionState() != YesOrNoEnum.YES.getValue()){
+            throw new FebsException("请先升级会员");
+        }
+
+        if (StrUtil.isBlank(loginMember.getTradePassword())) {
+            throw new FebsException("未设置资金密码");
+        }
+
+        if (!loginMember.getTradePassword().equals(SecureUtil.md5(withdrawalDto.getTradePwd()))) {
+            throw new FebsException("资金密码错误");
+        }
+
+        MallMemberPayment mallMemberPayment = mallMemberPaymentMapper.selectById(withdrawalDto.getAddressId());
+        if (mallMemberPayment == null) {
+            throw new FebsException("无效的提现地址");
+        }
         BigDecimal balanceToCoinPercent = new BigDecimal(
                 dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getType(),
                         RunVipDataDictionaryEnum.RUN_VIP_BALANCE_TO_COIN_PERCENT.getCode()).getValue()
-        ).setScale(2, BigDecimal.ROUND_DOWN);
+        ).setScale(2, RoundingMode.DOWN);
 
-        BigDecimal withdrawalAmount = withdrawalDto.getAmount().multiply(balanceToCoin).setScale(2, BigDecimal.ROUND_DOWN);
+        if(balanceToCoinPercent.compareTo(withdrawalDto.getAmount()) > 0){
+            throw new FebsException("手续费不足");
+        }
         BigDecimal fee = balanceToCoinPercent;
-//        BigDecimal fee = balanceToCoinPercent.multiply(withdrawalAmount).setScale(2, BigDecimal.ROUND_DOWN);
-        BigDecimal withdrawalAmountReal = withdrawalAmount.subtract(fee);
+        BigDecimal withdrawalAmountReal = withdrawalDto.getAmount().subtract(fee).setScale(2, RoundingMode.DOWN);
         if(BigDecimal.ZERO.compareTo(withdrawalAmountReal) >= 0){
-            throw new FebsException(minCnt+"手续费不足");
+            throw new FebsException("手续费不足");
         }
 
         /**
          *  减少碳币,增加进行中提现记录
          */
-        walletService.reduceBalance(withdrawalDto.getAmount(), loginMember.getId());
+        walletService.reduceCommission(withdrawalDto.getAmount(), loginMember.getId());
 
         String orderNo = MallUtils.getOrderNum("TX");
         MallMemberWithdraw withdraw = new MallMemberWithdraw();
@@ -687,10 +752,10 @@
                 loginMember.getId(),
                 loginMember.getId(),
                 orderNo,
-                FlowTypeEnum.BALANCE.getValue(),
-                RunVipMoneyFlowTypeEnum.BALANCE_OUT.getValue(),
+                FlowTypeEnum.COMMISSION.getValue(),
+                RunVipMoneyFlowTypeEnum.COMMISSION_OUT.getValue(),
                 withdrawalDto.getAmount().negate(),
-                StrUtil.format(RunVipMoneyFlowTypeEnum.BALANCE_OUT.getDescription(),withdrawalDto.getAmount(),withdrawalAmount,fee),
+                StrUtil.format(RunVipMoneyFlowTypeEnum.COMMISSION_OUT.getDescription(),withdrawalDto.getAmount(),fee),
                 YesOrNoEnum.ING.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 8e464dd..d6a9301 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
@@ -920,6 +920,9 @@
                 new LambdaQueryWrapper<MallMember>()
                         .eq(MallMember::getReferrerId, inviteId)
         );
+        if(CollUtil.isEmpty(directMembers)){
+            return memberIds;
+        }
         memberIds.addAll(directMembers.stream().map(MallMember::getId).collect(Collectors.toSet()));
 
         // 获取团队成员
@@ -927,6 +930,10 @@
                 new LambdaQueryWrapper<MallMember>()
                         .in(MallMember::getReferrerId, directMembers.stream().map(MallMember::getInviteId).collect(Collectors.toSet()))
         );
+
+        if(CollUtil.isEmpty(teamMembers)){
+            return memberIds;
+        }
         memberIds.addAll(teamMembers.stream().map(MallMember::getId).collect(Collectors.toSet()));
 
         return memberIds;
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 340f7c0..cea7b1d 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
@@ -30,6 +30,8 @@
     private Integer changeState;//是否允许碳积分兑换碳币 1是0否
     @ApiModelProperty(value = "是否允许碳币提现 1是0否")
     private Integer withdrawState;//是否允许碳币提现 1是0否
+    @ApiModelProperty(value = "是否允许USDT提现 1是0否")
+    private Integer commissionState;//是否允许USDT提现 1是0否
     @ApiModelProperty(value = "是否允许内转 1-是0-否")
     private Integer insideState;//是否允许内转 1-是0-否
     @ApiModelProperty(value = "每日碳积分增长倍数")
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
index 9c8a924..18c9434 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -38,10 +38,16 @@
     @ApiModelProperty(value = "是否允许内转 1-是0-否")
     private Integer insideState;//是否允许内转 1-是0-否
 
+
+    @ApiModelProperty(value = "是否允许USDT提现 1是0否")
+    private Integer commissionState;//是否允许USDT提现 1是0否
+
     @ApiModelProperty(value = "碳币")
-    private BigDecimal balance;
+    private BigDecimal balance = BigDecimal.ZERO;
     @ApiModelProperty(value = "碳积分")
-    private BigDecimal score;
+    private BigDecimal score = BigDecimal.ZERO;
+    @ApiModelProperty(value = "USDT")
+    private BigDecimal commission = BigDecimal.ZERO;
 
     @ApiModelProperty(value = "是否有支付密码 1:是 0:否")
     private Integer tradeWord;
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java
index b343329..dc1bb43 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java
@@ -17,12 +17,18 @@
     @ApiModelProperty(value = "我的碳币")
     private BigDecimal myBalance = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "我的USDT")
+    private BigDecimal myCommission = BigDecimal.ZERO;
+
     @ApiModelProperty(value = "团队总数")
     private int myTeamCnt = 0;
 
     @ApiModelProperty(value = "团队碳币")
     private BigDecimal myTeamBalance = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "团队USDT")
+    private BigDecimal myTeamCommission = BigDecimal.ZERO;
+
     /**
      * 是否是节点 1是 0否
      */
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java
index a2c2c9c..b9fe900 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java
@@ -34,6 +34,9 @@
     @ApiModelProperty(value = "我的碳币")
     private BigDecimal myBalance = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "我的USDT")
+    private BigDecimal myCommission = BigDecimal.ZERO;
+
     @ApiModelProperty(value = "用户等级")
     private String levelName;
 
@@ -42,4 +45,7 @@
     @ApiModelProperty(value = "团队碳币")
     private BigDecimal myTeamBalance = BigDecimal.ZERO;
 
+    @ApiModelProperty(value = "团队USDT")
+    private BigDecimal myTeamCommission = BigDecimal.ZERO;
+
 }
diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml
index f9b30b3..554fad1 100644
--- a/src/main/resources/mapper/modules/MallMemberMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -8,6 +8,7 @@
                a.phone referrerName,
                IFNULL(c.balance,0) balance,
                IFNULL(c.score,0) score,
+                IFNULL(c.commission,0) commission,
                vipConfig.vip_name levelName
         FROM mall_member m
         left join mall_member a on m.referrer_id = a.invite_id
@@ -35,7 +36,8 @@
             </if>
         </where>
         GROUP BY
-        m.id, a.phone, c.balance, c.score,vipConfig.vip_name
+        m.id, a.phone, c.balance, c.score,
+        c.commission,vipConfig.vip_name
         order by m.CREATED_TIME desc
     </select>
 
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
index e283efb..4659eb4 100644
--- a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
+++ b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -254,6 +254,7 @@
                     {field: 'phone', title: '账号', minWidth: 150,align:'left',totalRowText:"合计"},
                     {field: 'name', title: '昵称', minWidth: 100,align:'left'},
                     {field: 'inviteId', title: '邀请码', minWidth: 100,align:'left'},
+                    {field: 'commission', title: 'USDT', minWidth: 100,align:'left', totalRow:true},
                     {field: 'balance', title: '碳币', minWidth: 100,align:'left', totalRow:true},
                     {field: 'score', title: '碳积分', minWidth: 100,align:'left', totalRow:true},
                     {field: 'directCnt', title: '直推', minWidth: 100,align:'left', totalRow:true},
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
index 91659f2..3e3db7b 100644
--- a/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
+++ b/src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
@@ -28,6 +28,7 @@
                                                 <option value="">请选择</option>
                                                 <option value="1">碳币</option>
                                                 <option value="2">碳积分</option>
+                                                <option value="4">USDT</option>
                                             </select>
                                         </div>
                                     </div>
@@ -144,6 +145,8 @@
                                 return '碳币';
                             } else if(d.flowType === 2) {
                                 return '碳积分'
+                            } else if(d.flowType === 4) {
+                                return 'USDT'
                             } else {
                                 return '-';
                             }
diff --git a/src/main/resources/templates/febs/views/modules/runVip/sellVipList.html b/src/main/resources/templates/febs/views/modules/runVip/sellVipList.html
index f2fe76d..f9f23e2 100644
--- a/src/main/resources/templates/febs/views/modules/runVip/sellVipList.html
+++ b/src/main/resources/templates/febs/views/modules/runVip/sellVipList.html
@@ -1,4 +1,4 @@
-<div class="layui-fluid layui-anim febs-anim" id="febs-withdraw-list" lay-title="碳币提现">
+<div class="layui-fluid layui-anim febs-anim" id="febs-withdraw-list" lay-title="提现">
     <div class="layui-row febs-container">
         <div class="layui-col-md12">
             <div class="layui-card">
diff --git a/src/main/resources/templates/febs/views/modules/runVip/vipAdd.html b/src/main/resources/templates/febs/views/modules/runVip/vipAdd.html
index 304c5b0..50b927a 100644
--- a/src/main/resources/templates/febs/views/modules/runVip/vipAdd.html
+++ b/src/main/resources/templates/febs/views/modules/runVip/vipAdd.html
@@ -140,13 +140,26 @@
 
         <div class="layui-form-item">
             <div class="layui-col-lg6">
-                <label class="layui-form-label febs-form-item-require">碳币提现:</label>
+                <label class="layui-form-label febs-form-item-require">兑换USDT:</label>
                 <div class="layui-input-block">
                     <select name="withdrawState" class="valid-type" lay-filter="type-select">
                         <option value="1">允许</option>
                         <option value="0">不允许</option>
                     </select>
-                    <div class="layui-form-mid layui-word-aux">是否允许碳币提现。</div>
+                    <div class="layui-form-mid layui-word-aux">是否允许碳币兑换USDT。</div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <div class="layui-col-lg6">
+                <label class="layui-form-label febs-form-item-require">USDT提现:</label>
+                <div class="layui-input-block">
+                    <select name="commissionState" class="valid-type" lay-filter="type-select">
+                        <option value="1">允许</option>
+                        <option value="0">不允许</option>
+                    </select>
+                    <div class="layui-form-mid layui-word-aux">是否允许USDT提现。</div>
                 </div>
             </div>
         </div>
diff --git a/src/main/resources/templates/febs/views/modules/runVip/vipEdit.html b/src/main/resources/templates/febs/views/modules/runVip/vipEdit.html
index 454e579..8ce591a 100644
--- a/src/main/resources/templates/febs/views/modules/runVip/vipEdit.html
+++ b/src/main/resources/templates/febs/views/modules/runVip/vipEdit.html
@@ -138,15 +138,30 @@
             </div>
         </div>
 
+
+
         <div class="layui-form-item">
             <div class="layui-col-lg6">
-                <label class="layui-form-label febs-form-item-require">碳币提现:</label>
+                <label class="layui-form-label febs-form-item-require">兑换USDT:</label>
                 <div class="layui-input-block">
                     <select name="withdrawState" class="valid-type" lay-filter="type-select">
                         <option value="1">允许</option>
                         <option value="0">不允许</option>
                     </select>
-                    <div class="layui-form-mid layui-word-aux">是否允许碳币提现。</div>
+                    <div class="layui-form-mid layui-word-aux">是否允许碳币兑换USDT。</div>
+                </div>
+            </div>
+        </div>
+
+        <div class="layui-form-item">
+            <div class="layui-col-lg6">
+                <label class="layui-form-label febs-form-item-require">USDT提现:</label>
+                <div class="layui-input-block">
+                    <select name="commissionState" class="valid-type" lay-filter="type-select">
+                        <option value="1">允许</option>
+                        <option value="0">不允许</option>
+                    </select>
+                    <div class="layui-form-mid layui-word-aux">是否允许USDT提现。</div>
                 </div>
             </div>
         </div>
@@ -185,6 +200,7 @@
                 "state":runVip.state,
                 "changeState":runVip.changeState,
                 "withdrawState" : runVip.withdrawState,
+                "commissionState" : runVip.commissionState,
                 "insideState" : runVip.insideState,
                 "growthValue" : runVip.growthValue,
                 "growthCnt" : runVip.growthCnt,

--
Gitblit v1.9.1