Helius
2022-03-21 b001f06d73fcd2016071fe7e34e0a7bee2f96a79
add modules
4 files modified
6 files added
272 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/contants/AppContants.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java 47 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java 46 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java 87 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/dapp/DappFundFlowDao.xml 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -83,4 +83,19 @@
    public static final int INT_FLAG_Y = 1;
    public static final int INT_FLAG_N = 2;
    /**
     * 兑换
     */
    public static final int MONEY_TYPE_CHANGE = 1;
    /**
     * 提现
     */
    public static final int MONEY_TYPE_WITHDRAWAL = 2;
    /**
     * 采矿
     */
    public static final int MONEY_TYPE_MINE = 3;
}
src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.dapp.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.dapp.dto.RecordInPageDto;
import cc.mrbird.febs.dapp.dto.WalletOperateDto;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
@@ -39,12 +40,20 @@
    @ApiOperation(value = "兑换接口", notes = "兑换")
    @PostMapping(value = "/change")
    public FebsResponse change(@RequestBody WalletOperateDto walletOperateDto) {
        return null;
        dappWalletService.change(walletOperateDto);
        return new FebsResponse().success().message("兑换成功");
    }
    @ApiOperation(value = "提现接口", notes = "提现接口")
    @PostMapping(value = "/withdraw")
    public FebsResponse withdraw(@RequestBody WalletOperateDto walletOperateDto) {
        dappWalletService.withdraw(walletOperateDto);
        return new FebsResponse().success().message("申请成功, 等待审核");
    }
    @ApiOperation(value = "记录列表", notes = "记录列表")
    @PostMapping(value = "/recordInPage")
    public FebsResponse recordInPage(@RequestBody RecordInPageDto recordInPageDto) {
        return null;
    }
}
src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
New file
@@ -0,0 +1,23 @@
package cc.mrbird.febs.dapp.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author wzy
 * @date 2022-03-21
 **/
@Data
@ApiModel(value = "RecordInPageDto", description = "记录列表接收参数类")
public class RecordInPageDto {
    @ApiModelProperty(value = "页码")
    private Integer pageNum = 1;
    @ApiModelProperty(value = "每页数量")
    private Integer pageSize = 10;
    @ApiModelProperty(value = "类型", example = "1-兑换 2-提现 3-采矿")
    private Integer type;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java
New file
@@ -0,0 +1,47 @@
package cc.mrbird.febs.dapp.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author wzy
 * @date 2022-03-21
 **/
@Data
@TableName("dapp_account_money_change")
public class DappAccountMoneyChangeEntity extends BaseEntity {
    public DappAccountMoneyChangeEntity(Long memberId, BigDecimal preAmount, BigDecimal amount, BigDecimal afterAmount, String content, Integer type) {
        this.memberId = memberId;
        this.preAmount = preAmount;
        this.amount = amount;
        this.afterAmount = afterAmount;
        this.content = content;
        this.type = type;
        this.setCreateBy("system");
        this.setUpdateBy("system");
        this.setCreateTime(new Date());
        this.setUpdateTime(new Date());
        this.setVersion(1);
    }
    private Long memberId;
    private BigDecimal preAmount;
    private BigDecimal amount;
    private BigDecimal afterAmount;
    private String content;
    /**
     * 类型 1-兑换 2-提现 3-采矿
     */
    private Integer type;
}
src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
New file
@@ -0,0 +1,46 @@
package cc.mrbird.febs.dapp.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * @author wzy
 * @date 2022-03-21
 **/
@Data
@TableName("dapp_fund_flow")
public class DappFundFlowEntity extends BaseEntity {
    public DappFundFlowEntity() {}
    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status) {
        this.memberId = memberId;
        this.amount = amount;
        this.type = type;
        this.status = status;
        this.setCreateBy("system");
        this.setUpdateBy("system");
        this.setCreateTime(new Date());
        this.setUpdateTime(new Date());
        this.setVersion(1);
    }
    private Long memberId;
    private BigDecimal amount;
    /**
     * 类型 1-兑换 2-提现 3-采矿
     */
    private Integer type;
    /**
     * 状态 1-ing 2-成功 3-失败
     */
    private Integer status;
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.dapp.mapper;
import cc.mrbird.febs.dapp.entity.DappAccountMoneyChangeEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface DappAccountMoneyChangeDao extends BaseMapper<DappAccountMoneyChangeEntity> {
}
src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
New file
@@ -0,0 +1,12 @@
package cc.mrbird.febs.dapp.mapper;
import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
public interface DappFundFlowDao extends BaseMapper<DappFundFlowEntity> {
    IPage<DappFundFlowEntity> selectInPage(Page<DappFundFlowEntity> page, @Param("record") DappFundFlowEntity dappFundFlowEntity);
}
src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
@@ -1,9 +1,20 @@
package cc.mrbird.febs.dapp.service;
import cc.mrbird.febs.dapp.dto.RecordInPageDto;
import cc.mrbird.febs.dapp.dto.WalletOperateDto;
import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import java.util.List;
public interface DappWalletService {
    WalletInfoVo walletInfo();
    void change(WalletOperateDto walletOperateDto);
    void withdraw(WalletOperateDto walletOperateDto);
    List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto);
}
src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
@@ -1,17 +1,21 @@
package cc.mrbird.febs.dapp.service.impl;
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.exception.FebsException;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.entity.DappWalletCoinEntity;
import cc.mrbird.febs.dapp.entity.DappWalletMineEntity;
import cc.mrbird.febs.dapp.mapper.DappMemberDao;
import cc.mrbird.febs.dapp.mapper.DappWalletCoinDao;
import cc.mrbird.febs.dapp.mapper.DappWalletMineDao;
import cc.mrbird.febs.dapp.dto.RecordInPageDto;
import cc.mrbird.febs.dapp.dto.WalletOperateDto;
import cc.mrbird.febs.dapp.entity.*;
import cc.mrbird.febs.dapp.mapper.*;
import cc.mrbird.febs.dapp.service.DappWalletService;
import cc.mrbird.febs.dapp.vo.WalletInfoVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author wzy
@@ -25,6 +29,8 @@
    private final DappMemberDao dappMemberDao;
    private final DappWalletMineDao dappWalletMineDao;
    private final DappWalletCoinDao dappWalletCoinDao;
    private final DappFundFlowDao dappFundFlowDao;
    private final DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
    @Override
    public WalletInfoVo walletInfo() {
@@ -39,4 +45,73 @@
        walletInfo.setAvailableWallet(walletCoin.getAvailableAmount());
        return walletInfo;
    }
    @Override
    public void change(WalletOperateDto walletOperateDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        BigDecimal ethUsdtPrice = new BigDecimal("1234");
        DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
        if (walletOperateDto.getAmount().compareTo(walletMine.getAvailableAmount()) > 0) {
            throw new FebsException("可用金额不足");
        }
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_CHANGE, null);
        dappFundFlowDao.insert(fund);
        BigDecimal preEthAmount = walletMine.getAvailableAmount();
        // TODO 并发加悲观锁
        // 更新eth金额
        walletMine.setAvailableAmount(walletMine.getAvailableAmount().subtract(walletOperateDto.getAmount()));
        walletMine.setTotalAmount(walletMine.getTotalAmount().subtract(walletOperateDto.getAmount()));
        dappWalletMineDao.updateById(walletMine);
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
        BigDecimal preUsdtAmount = walletCoin.getAvailableAmount();
        // 更新usdt金额
        BigDecimal usdt = walletOperateDto.getAmount().multiply(ethUsdtPrice);
        walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().add(usdt));
        walletCoin.setTotalAmount(walletCoin.getTotalAmount().add(usdt));
        dappWalletCoinDao.updateById(walletCoin);
        DappAccountMoneyChangeEntity ethChange = new DappAccountMoneyChangeEntity(member.getId(), preEthAmount, walletOperateDto.getAmount(), walletMine.getTotalAmount(), "ETH兑换USDT-ETH", AppContants.MONEY_TYPE_CHANGE);
        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preUsdtAmount, usdt, walletCoin.getTotalAmount(), "ETH兑换USDT-USDT", AppContants.MONEY_TYPE_CHANGE);
        dappAccountMoneyChangeDao.insert(ethChange);
        dappAccountMoneyChangeDao.insert(usdtChange);
    }
    @Override
    public void withdraw(WalletOperateDto walletOperateDto) {
        DappMemberEntity member = LoginUserUtil.getAppUser();
        DappWalletCoinEntity walletCoin = dappWalletCoinDao.selectByMemberId(member.getId());
        if (walletOperateDto.getAmount().compareTo(walletCoin.getAvailableAmount()) > 0) {
            throw new FebsException("可用金额不足");
        }
        // TODO 并发加悲观锁
        BigDecimal preAmount = walletCoin.getAvailableAmount();
        walletCoin.setAvailableAmount(walletCoin.getAvailableAmount().subtract(walletOperateDto.getAmount()));
        walletCoin.setFrozenAmount(walletCoin.getFrozenAmount().subtract(walletOperateDto.getAmount()));
        dappWalletCoinDao.updateById(walletCoin);
        DappFundFlowEntity fund = new DappFundFlowEntity(member.getId(), walletOperateDto.getAmount().negate(), AppContants.MONEY_TYPE_WITHDRAWAL, 1);
        dappFundFlowDao.insert(fund);
        DappAccountMoneyChangeEntity usdtChange = new DappAccountMoneyChangeEntity(member.getId(), preAmount, walletOperateDto.getAmount(), walletCoin.getTotalAmount(), "USDT申请提现", AppContants.MONEY_TYPE_WITHDRAWAL);
        dappAccountMoneyChangeDao.insert(usdtChange);
    }
    @Override
    public List<DappFundFlowEntity> recordInPage(RecordInPageDto recordInPageDto) {
        Page<DappFundFlowEntity> page = new Page<>(recordInPageDto.getPageNum(), recordInPageDto.getPageSize());
        DappFundFlowEntity dappFundFlowEntity = new DappFundFlowEntity();
        dappFundFlowEntity.setType(recordInPageDto.getType());
        dappFundFlowDao.selectInPage(page, dappFundFlowEntity);
        return null;
    }
}
src/main/resources/mapper/dapp/DappFundFlowDao.xml
New file
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.dapp.mapper.DappFundFlowDao">
    <select id="selectInPage" resultType="cc.mrbird.febs.dapp.entity.DappFundFlowEntity">
        select * from dapp_fund_flow
        <where>
            <if test="record.type != null">
                and type = #{record.type}
            </if>
        </where>
    </select>
</mapper>