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