KKSU
2025-01-03 548a01654a5fdb158aa2cca86ae83ffaebbb0395
feat(mall): 增加 USDT 提现功能

- 新增 USDT 提现相关接口和页面
- 实现碳币兑换 USDT 和 USDT 提现的逻辑
- 更新会员等级配置,增加 USDT 提现权限设置- 优化团队统计功能,增加 USDT 相关数据展示
20 files modified
270 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/RunVipDataDictionaryEnum.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/RunVipMoneyFlowTypeEnum.java 24 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 12 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/RunVip.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java 4 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminRunVipServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 21 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 123 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 10 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MyTeamVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/TeamListVo.java 6 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 4 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html 1 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html 3 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/sellVipList.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/vipAdd.html 17 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/runVip/vipEdit.html 20 ●●●●● patch | view | raw | blame | history
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的最小数
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提现"),
    /**
     * 碳积分兑换碳币
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)
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWallet.java
@@ -40,7 +40,7 @@
    private BigDecimal prizeScore;
    /**
     * 佣金
     * USDT
     */
    private BigDecimal commission;
}
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;//每日碳积分增长倍数
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);
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("操作成功");
    }
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>()
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()
        );
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;
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 = "每日碳积分增长倍数")
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;
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否
     */
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;
}
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>
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},
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 '-';
                            }
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">
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>
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,