From b001f06d73fcd2016071fe7e34e0a7bee2f96a79 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Mon, 21 Mar 2022 12:02:15 +0800
Subject: [PATCH] add modules

---
 src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java    |    7 +
 src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java           |   11 ++
 src/main/resources/mapper/dapp/DappFundFlowDao.xml                         |   13 ++
 src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java  |   11 ++
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java              |   15 +++
 src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java              |   12 ++
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java  |   87 ++++++++++++++++-
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java           |   46 +++++++++
 src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java |   47 +++++++++
 src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java                 |   23 ++++
 10 files changed, 265 insertions(+), 7 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index 1477082..14cdfbe 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/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;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
index 44d9079..0b7aea5 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiDappMemberController.java
+++ b/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;
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
new file mode 100644
index 0000000..e1e2ce1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/RecordInPageDto.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java
new file mode 100644
index 0000000..d757116
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappAccountMoneyChangeEntity.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
new file mode 100644
index 0000000..c697fa3
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -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;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java
new file mode 100644
index 0000000..8e8a610
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappAccountMoneyChangeDao.java
@@ -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> {
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
new file mode 100644
index 0000000..c21f0b0
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
@@ -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);
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
index b572bca..9d28cfa 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappWalletService.java
+++ b/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);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
index 125da6c..4e7c1e1 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappWalletServiceImpl.java
+++ b/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;
+    }
 }
diff --git a/src/main/resources/mapper/dapp/DappFundFlowDao.xml b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
new file mode 100644
index 0000000..4a360a1
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -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>
\ No newline at end of file

--
Gitblit v1.9.1