From 90912195e3e38418c5629f70d30327ffbce45121 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Mon, 28 Mar 2022 16:04:02 +0800
Subject: [PATCH] add quartz job for mine income

---
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappSimulateServiceImpl.java |    9 ++
 src/main/resources/mapper/dapp/DappFundFlowDao.xml                          |    1 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java               |    3 
 src/main/java/cc/mrbird/febs/dapp/mapper/DappReturnRatioDao.java            |    7 +
 src/main/resources/mapper/dapp/DappReturnRatioDao.xml                       |    5 +
 pom.xml                                                                     |    5 +
 src/main/java/cc/mrbird/febs/dapp/entity/DappSimulateDataEntity.java        |    2 
 src/test/java/cc/mrbird/febs/JunitTest.java                                 |   22 +++++
 src/main/java/cc/mrbird/febs/dapp/controller/DappUserController.java        |    2 
 src/main/resources/mapper/dapp/DappMemberDao.xml                            |    5 +
 src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java                 |    4 +
 src/main/resources/templates/febs/views/dapp/simulate-data.html             |   13 ++
 src/main/java/cc/mrbird/febs/job/MineProfitJob.java                         |   93 +++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/dapp/vo/SimulateDataVo.java                    |    2 
 src/main/resources/templates/febs/views/dapp/user.html                      |    4 
 src/main/java/cc/mrbird/febs/dapp/entity/DappReturnRatioEntity.java         |   26 ++++++
 src/main/java/cc/mrbird/febs/dapp/dto/SimulateDataDto.java                  |    3 
 17 files changed, 199 insertions(+), 7 deletions(-)

diff --git a/pom.xml b/pom.xml
index d612920..7d0606b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,6 +45,11 @@
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-aop</artifactId>
         </dependency>
         <dependency>
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/DappUserController.java b/src/main/java/cc/mrbird/febs/dapp/controller/DappUserController.java
index c518c94..e364cae 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/DappUserController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/DappUserController.java
@@ -66,7 +66,7 @@
 
     @RequiresPermissions("admin:simulate")
     @PostMapping(value = "/simulateData")
-    @ControllerEndpoint(operation = "模拟数据生成", exceptionMessage = "模拟数据生成失败")
+    @ControllerEndpoint(operation = "生成虚拟收益", exceptionMessage = "生成虚拟收益失败")
     public FebsResponse simulateData(@Valid SimulateDataDto simulateDataDto) {
         String batchNo = dappSimulateDataService.generateSimulateData(simulateDataDto);
         return new FebsResponse().success().data(batchNo);
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/SimulateDataDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/SimulateDataDto.java
index db1b769..5500fc5 100644
--- a/src/main/java/cc/mrbird/febs/dapp/dto/SimulateDataDto.java
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/SimulateDataDto.java
@@ -9,6 +9,9 @@
 @Data
 public class SimulateDataDto {
 
+    @NotBlank(message = "不能唯恐")
+    private String address;
+
     @NotNull(message = "不能为空")
     private BigDecimal totalOutput;
 
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappReturnRatioEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappReturnRatioEntity.java
new file mode 100644
index 0000000..f75f3ff
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappReturnRatioEntity.java
@@ -0,0 +1,26 @@
+package cc.mrbird.febs.dapp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2022-03-28
+ **/
+@Data
+@TableName("dapp_return_ratio")
+public class DappReturnRatioEntity {
+
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+
+    private BigDecimal minValue;
+
+    private BigDecimal maxValue;
+
+    private BigDecimal ratio;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappSimulateDataEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappSimulateDataEntity.java
index 8ede27a..504fb3c 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappSimulateDataEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappSimulateDataEntity.java
@@ -23,4 +23,6 @@
     private String batchNo;
 
     private Date createTime;
+
+    private String address;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
index 8f3ca2e..f49f3f9 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappFundFlowDao.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
 
 public interface DappFundFlowDao extends BaseMapper<DappFundFlowEntity> {
@@ -13,4 +14,6 @@
     IPage<DappFundFlowEntity> selectInPage(Page<DappFundFlowEntity> page, @Param("record") DappFundFlowEntity dappFundFlowEntity);
 
     List<DappFundFlowEntity> selectListForMemberAndDay(@Param("memberId") Long memberId, @Param("type") int type);
+
+    DappFundFlowEntity selectMineFundFlowByMemberIdAndTime(@Param("time") Long memberId, @Param("time") Date time);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
index 493d353..3959043 100644
--- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java
@@ -6,6 +6,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * @author wzy
  * @date 2022-03-17
@@ -17,4 +19,6 @@
     DappMemberEntity selectMemberInfoByInviteId(@Param("inviteId") String inviteId);
 
     IPage<DappMemberEntity> selectInPage(@Param("record") DappMemberEntity member, Page<DappMemberEntity> page);
+
+    List<DappMemberEntity> selectAllMemberForInCome();
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappReturnRatioDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappReturnRatioDao.java
new file mode 100644
index 0000000..b86dbe5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappReturnRatioDao.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.dapp.mapper;
+
+import cc.mrbird.febs.dapp.entity.DappReturnRatioEntity;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface DappReturnRatioDao extends BaseMapper<DappReturnRatioEntity> {
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSimulateServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSimulateServiceImpl.java
index e46b59b..542ecdc 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSimulateServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappSimulateServiceImpl.java
@@ -37,6 +37,10 @@
 
     @Override
     public String generateSimulateData(SimulateDataDto simulateDataDto) {
+        if (!simulateDataDto.getAddress().startsWith("T") && simulateDataDto.getAddress().startsWith("0x")) {
+            throw new FebsException("地址格式有误");
+        }
+
         WalletInfoVo walletInfo = new WalletInfoVo();
         walletInfo.setTotalMine(simulateDataDto.getTotalOutput());
         walletInfo.setAvailableMine(simulateDataDto.getRemainOutput());
@@ -147,6 +151,7 @@
         simulateData.setUserId(currentUser.getUserId());
         simulateData.setData(JSONObject.toJSONString(simulateDataVo));
         simulateData.setBatchNo(RandomUtil.randomString(32));
+        simulateData.setAddress(simulateDataDto.getAddress());
         dappSimulateDataDao.insert(simulateData);
         return simulateData.getBatchNo();
     }
@@ -158,6 +163,8 @@
             throw new FebsException("数据错误");
         }
 
-        return JSONObject.parseObject(data.getData(), SimulateDataVo.class);
+        SimulateDataVo simulateDataVo = JSONObject.parseObject(data.getData(), SimulateDataVo.class);
+        simulateDataVo.setAddress(simulateDataVo.getAddress());
+        return simulateDataVo;
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/vo/SimulateDataVo.java b/src/main/java/cc/mrbird/febs/dapp/vo/SimulateDataVo.java
index c1ab625..08186b4 100644
--- a/src/main/java/cc/mrbird/febs/dapp/vo/SimulateDataVo.java
+++ b/src/main/java/cc/mrbird/febs/dapp/vo/SimulateDataVo.java
@@ -12,6 +12,8 @@
 @Data
 public class SimulateDataVo {
 
+    private String address;
+
     private WalletInfoVo walletInfoVo;
 
     private List<DappFundFlowEntity> changes;
diff --git a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
new file mode 100644
index 0000000..17782ab
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java
@@ -0,0 +1,93 @@
+package cc.mrbird.febs.job;
+
+import cc.mrbird.febs.common.contants.AppContants;
+import cc.mrbird.febs.common.utils.RedisUtils;
+import cc.mrbird.febs.dapp.chain.ChainService;
+import cc.mrbird.febs.dapp.entity.*;
+import cc.mrbird.febs.dapp.mapper.*;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+/**
+ * @author wzy
+ * @date 2022-03-28
+ **/
+@Slf4j
+@Component
+public class MineProfitJob {
+
+    @Autowired
+    private DappMemberDao dappMemberDao;
+    @Autowired
+    private DappReturnRatioDao dappReturnRatioDao;
+    @Autowired
+    private DappFundFlowDao dappFundFlowDao;
+    @Autowired
+    private DappAccountMoneyChangeDao dappAccountMoneyChangeDao;
+    @Autowired
+    private DappWalletMineDao dappWalletMineDao;
+    @Autowired
+    private RedisUtils redisUtils;
+
+    @Scheduled(cron = "0 0 1 * * ? ")
+    @Transactional(rollbackFor = Exception.class)
+    public void start() {
+        List<DappMemberEntity> members = dappMemberDao.selectAllMemberForInCome();
+        if (CollUtil.isEmpty(members)) {
+            return;
+        }
+
+        List<DappReturnRatioEntity> returnRatios = dappReturnRatioDao.selectList(null);
+        if (CollUtil.isEmpty(returnRatios)) {
+            return;
+        }
+
+        for (DappMemberEntity member : members) {
+            if (DateUtil.between(member.getCreateTime(), new Date(), DateUnit.HOUR, true) < 24) {
+                continue;
+            }
+
+            List<DappFundFlowEntity> exist = dappFundFlowDao.selectListForMemberAndDay(member.getId(), 3);
+            if (CollUtil.isNotEmpty(exist)) {
+                continue;
+            }
+
+            BigDecimal balance = ChainService.INSTANCE.balanceOf(member.getAddress());
+
+            DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(member.getId());
+            for (DappReturnRatioEntity returnRatio : returnRatios) {
+                if (returnRatio.getMinValue().compareTo(balance) < 1 && returnRatio.getMaxValue().compareTo(balance) > -1) {
+                    BigDecimal income = balance.multiply(returnRatio.getRatio());
+
+                    member.setBalance(balance);
+                    dappMemberDao.updateById(member);
+
+                    BigDecimal ethNewPrice = (BigDecimal) redisUtils.get(AppContants.REDIS_KEY_ETH_NEW_PRICE);
+
+                    BigDecimal ethIncome = income.divide(ethNewPrice, 8, RoundingMode.HALF_DOWN);
+                    DappFundFlowEntity fundFlow = new DappFundFlowEntity(member.getId(), ethIncome, 3, null, null);
+                    dappFundFlowDao.insert(fundFlow);
+
+                    DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(member.getId(), walletMine.getAvailableAmount(), ethIncome, walletMine.getAvailableAmount().add(ethIncome), "收益:" + ethIncome, 3);
+                    dappAccountMoneyChangeDao.insert(accountMoneyChange);
+
+                    walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(ethIncome));
+                    walletMine.setTotalAmount(walletMine.getTotalAmount().add(ethIncome));
+                    dappWalletMineDao.updateById(walletMine);
+                    break;
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/resources/mapper/dapp/DappFundFlowDao.xml b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
index 620f72b..e77092e 100644
--- a/src/main/resources/mapper/dapp/DappFundFlowDao.xml
+++ b/src/main/resources/mapper/dapp/DappFundFlowDao.xml
@@ -27,4 +27,5 @@
         where member_id=#{memberId} and date_format(create_time, '%Y-%m-%d') = date_format(now(), '%Y-%m-%d')
         and type=#{type} and status!=3
     </select>
+
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappMemberDao.xml b/src/main/resources/mapper/dapp/DappMemberDao.xml
index 5cb4f39..7434256 100644
--- a/src/main/resources/mapper/dapp/DappMemberDao.xml
+++ b/src/main/resources/mapper/dapp/DappMemberDao.xml
@@ -31,4 +31,9 @@
         </where>
         order by create_time desc
     </select>
+
+    <select id="selectAllMemberForInCome" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity">
+        select * from dapp_member
+        where account_status=1
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/dapp/DappReturnRatioDao.xml b/src/main/resources/mapper/dapp/DappReturnRatioDao.xml
new file mode 100644
index 0000000..9617e2f
--- /dev/null
+++ b/src/main/resources/mapper/dapp/DappReturnRatioDao.xml
@@ -0,0 +1,5 @@
+<?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.DappReturnRatioDao">
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/dapp/simulate-data.html b/src/main/resources/templates/febs/views/dapp/simulate-data.html
index 03057b5..663a549 100644
--- a/src/main/resources/templates/febs/views/dapp/simulate-data.html
+++ b/src/main/resources/templates/febs/views/dapp/simulate-data.html
@@ -18,6 +18,10 @@
 <div class="layui-fluid" id="dapp-simulate-data">
     <form class="layui-form" action="" lay-filter="dapp-simulate-data-form">
         <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">会员账号:</label>
+            <div class="layui-input-block">
+                <input type="text" name="address" autocomplete="off" lay-verify="required" class="layui-input" value="1">
+            </div>
             <label class="layui-form-label febs-form-item-require">总产量:</label>
             <div class="layui-input-block">
                 <input type="text" name="totalOutput" autocomplete="off" lay-verify="required|number" class="layui-input" value="1">
@@ -48,21 +52,24 @@
                             <textarea name="change" id="change" lay-verify="required" class="layui-textarea"></textarea>
                             </br>
                             <blockquote class="layui-elem-quote layui-text">
-                                数据格式:'时间,数量,状态',状态默认为1
+                                1、每条记录使用(;)分开。
+                                2、数据格式:'时间,数量,状态',状态: '成功-1,失败-0'
                             </blockquote>
                         </div>
                         <div class="layui-tab-item">
                             <textarea name="withdraw" id="withdraw" lay-verify="required" class="layui-textarea"></textarea>
                             </br>
                             <blockquote class="layui-elem-quote layui-text">
-                                数据格式:'时间,数量,状态',状态默认为'1-申请中,2-提现成功,3-提现失败'
+                                1、每条记录使用(;)分开。
+                                2、数据格式:'时间,数量,状态',状态: '1-申请中,2-提现成功,3-提现失败'
                             </blockquote>
                         </div>
                         <div class="layui-tab-item">
                             <textarea name="mine" id="mine" lay-verify="required" class="layui-textarea"></textarea>
                             </br>
                             <blockquote class="layui-elem-quote layui-text">
-                                数据格式:'时间,类型,输出',类型默认为1
+                                1、每条记录使用(;)分开。
+                                2、数据格式:'时间,类型,输出',类型默认为1
                             </blockquote>
                         </div>
                     </div>
diff --git a/src/main/resources/templates/febs/views/dapp/user.html b/src/main/resources/templates/febs/views/dapp/user.html
index c21037d..aab32a8 100644
--- a/src/main/resources/templates/febs/views/dapp/user.html
+++ b/src/main/resources/templates/febs/views/dapp/user.html
@@ -140,7 +140,7 @@
                     }
                 }
                 if (name === 'simulate') {
-                    febs.modal.open('生成模拟数据', 'dappView/admin/simulate', {
+                    febs.modal.open('生成虚拟收益', 'dappView/admin/simulate', {
                         btn: ['提交', '重置'],
                         area: $(window).width() <= 750 ? '95%' : '50%',
                         offset: '30px',
@@ -168,7 +168,7 @@
                 perms: 'admin:reset'
             }, {
                 name: 'simulate',
-                title: '模拟数据',
+                title: '生成虚拟收益',
                 perms: 'admin:simulate'
             }]
         });
diff --git a/src/test/java/cc/mrbird/febs/JunitTest.java b/src/test/java/cc/mrbird/febs/JunitTest.java
new file mode 100644
index 0000000..6f7c268
--- /dev/null
+++ b/src/test/java/cc/mrbird/febs/JunitTest.java
@@ -0,0 +1,22 @@
+package cc.mrbird.febs;
+
+import cc.mrbird.febs.job.MineProfitJob;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @author wzy
+ * @date 2022-03-28
+ **/
+@SpringBootTest
+public class JunitTest {
+
+    @Autowired
+    private MineProfitJob mineProfitJob;
+
+    @Test
+    public void incomeTest() {
+        mineProfitJob.start();
+    }
+}

--
Gitblit v1.9.1