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>