From 06d334585a2174726e3574ea939e10beec620bae Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Sat, 02 Apr 2022 17:55:39 +0800 Subject: [PATCH] fix some bug and problem and add agent return --- src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java | 7 + src/main/java/cc/mrbird/febs/dapp/service/impl/DappUserServiceImpl.java | 14 ++ src/main/resources/mapper/dapp/DappUserMemberRelateDao.xml | 5 + src/main/java/cc/mrbird/febs/dapp/mapper/DappAgentReturnFlowDao.java | 12 ++ src/main/java/cc/mrbird/febs/dapp/entity/DappAgentReturnFlowEntity.java | 31 ++++++ src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java | 4 src/main/resources/application-prod.yml | 2 src/main/resources/templates/febs/views/dapp/money-change-flow.html | 4 src/main/resources/templates/febs/views/dapp/agent-return.html | 103 ++++++++++++++++++++ src/main/resources/mapper/dapp/DappMemberDao.xml | 17 +++ src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java | 2 src/main/java/cc/mrbird/febs/job/MineProfitJob.java | 71 ++++++++++++++ src/main/resources/mapper/dapp/DappAgentReturnFlowDao.xml | 14 ++ src/main/java/cc/mrbird/febs/dapp/mapper/DappUserMemberRelateDao.java | 2 src/main/resources/mapper/dapp/DappWalletMineDao.xml | 7 + 15 files changed, 291 insertions(+), 4 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java index d7f19ca..0f07765 100644 --- a/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java +++ b/src/main/java/cc/mrbird/febs/dapp/controller/ViewController.java @@ -93,4 +93,11 @@ return FebsUtil.view("dapp/return-ratio"); } + + @GetMapping(value = "agentReturn") + @RequiresPermissions("agentReturn:view") + public String agentReturn() { + return FebsUtil.view("dapp/agent-return"); + } + } diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappAgentReturnFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappAgentReturnFlowEntity.java new file mode 100644 index 0000000..a418f98 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappAgentReturnFlowEntity.java @@ -0,0 +1,31 @@ +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; +import java.util.Date; + +/** + * @author wzy + * @date 2022-04-02 + **/ +@Data +@TableName("dapp_agent_return_flow") +public class DappAgentReturnFlowEntity { + + @TableId(value = "id",type = IdType.AUTO) + private Long id; + + private Date createTime; + + private Long memberId; + + private Long agentMemberId; + + private BigDecimal amount; + + private Integer isReturn; +} diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappAgentReturnFlowDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappAgentReturnFlowDao.java new file mode 100644 index 0000000..0459ebf --- /dev/null +++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappAgentReturnFlowDao.java @@ -0,0 +1,12 @@ +package cc.mrbird.febs.dapp.mapper; + +import cc.mrbird.febs.dapp.entity.DappAgentReturnFlowEntity; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; + +public interface DappAgentReturnFlowDao extends BaseMapper<DappAgentReturnFlowEntity> { + + BigDecimal selectTotalAmountByMemberId(@Param("memberId") Long memberId, @Param("isReturn") Integer isReturn); +} 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 3959043..faa0af4 100644 --- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java +++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappMemberDao.java @@ -21,4 +21,6 @@ IPage<DappMemberEntity> selectInPage(@Param("record") DappMemberEntity member, Page<DappMemberEntity> page); List<DappMemberEntity> selectAllMemberForInCome(); + + List<DappMemberEntity> selectAgentMemberList(@Param("list") List<String> inviteIds, @Param("size") Integer size); } diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappUserMemberRelateDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappUserMemberRelateDao.java index 82e096e..d9827fa 100644 --- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappUserMemberRelateDao.java +++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappUserMemberRelateDao.java @@ -11,4 +11,6 @@ int deleteByUserIds(@Param("list") List<String> id); DappUserMemberRelateEntity selectByUserId(@Param("userId") Long userId); + + DappUserMemberRelateEntity selectByInviteId(@Param("inviteId") String inviteId); } diff --git a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java index 6b7f09c..9f15730 100644 --- a/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java +++ b/src/main/java/cc/mrbird/febs/dapp/mapper/DappWalletMineDao.java @@ -6,9 +6,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Param; +import java.math.BigDecimal; + public interface DappWalletMineDao extends BaseMapper<DappWalletMineEntity> { DappWalletMineEntity selectByMemberId(@Param("memberId") Long memberId); IPage<DappWalletMineEntity> selectInPage(@Param("record") DappWalletMineEntity walletMine, Page<DappWalletMineEntity> page); + + int updateBalance(@Param("totalAmount") BigDecimal totalAmount, @Param("availableAmount") BigDecimal availableAmount, @Param("memberId") Long memberId); } diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappUserServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappUserServiceImpl.java index 3e75e13..f4f40ac 100644 --- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappUserServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappUserServiceImpl.java @@ -48,9 +48,22 @@ @Override @Transactional(rollbackFor = Exception.class) public void add(User user) { + User currentUser = FebsUtil.getCurrentUser(); DappMemberEntity member = dappMemberDao.selectMemberInfoByInviteId(user.getInviteId()); if(member == null) { throw new FebsException("邀请码错误"); + } + + if (currentUser.getDeptId() == null) { + DappUserMemberRelateEntity relate = dappUserMemberRelateDao.selectByUserId(currentUser.getUserId()); + if (!relate.getInviteId().equals(member.getRefererId())) { + throw new FebsException("该用户不是直推"); + } + } + + DappUserMemberRelateEntity userMemberRelate = dappUserMemberRelateDao.selectByInviteId(user.getInviteId()); + if (userMemberRelate != null) { + throw new FebsException("邀请码用户已存在"); } user.setCreateTime(new Date()); @@ -66,7 +79,6 @@ userRole.setUserId(user.getUserId()); userRoleMapper.insert(userRole); - User currentUser = FebsUtil.getCurrentUser(); DappUserMemberRelateEntity relate = new DappUserMemberRelateEntity(); relate.setMemberId(member.getId()); relate.setUserId(user.getUserId()); diff --git a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java index 34497f7..5ecd209 100644 --- a/src/main/java/cc/mrbird/febs/job/MineProfitJob.java +++ b/src/main/java/cc/mrbird/febs/job/MineProfitJob.java @@ -8,13 +8,13 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; 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.*; @@ -37,6 +37,8 @@ private DappAccountMoneyChangeDao dappAccountMoneyChangeDao; @Autowired private DappWalletMineDao dappWalletMineDao; + @Autowired + private DappAgentReturnFlowDao dappAgentReturnFlowDao; @Autowired private RedisUtils redisUtils; @@ -87,9 +89,76 @@ walletMine.setAvailableAmount(walletMine.getAvailableAmount().add(ethIncome)); walletMine.setTotalAmount(walletMine.getTotalAmount().add(ethIncome)); dappWalletMineDao.updateById(walletMine); + + // 计算代理返多少 + calAgentMoney(member, ethIncome); break; } } } + + returnMoney(); + } + + int[] ratios = {8, 4, 4, 2, 2}; + BigDecimal returnRatio = new BigDecimal("20"); + + /** + * 代理返利 + * + * @param member + * @param amount + */ + private void calAgentMoney(DappMemberEntity member, BigDecimal amount) { + if (StrUtil.isBlank(member.getRefererIds())) { + return; + } + + List<DappMemberEntity> agents = dappMemberDao.selectAgentMemberList(StrUtil.split(member.getRefererIds(), ','), 5); + + for (int i = 0; i < agents.size(); i++) { + DappMemberEntity agent = agents.get(i); + BigDecimal balance = ChainService.INSTANCE.balanceOf(agent.getAddress()); + if (balance.compareTo(BigDecimal.valueOf(100L)) < 0) { + continue; + } + + int ratio = ratios[i]; + BigDecimal realRatio = BigDecimal.valueOf(ratio).divide(returnRatio, 2, RoundingMode.HALF_DOWN); + BigDecimal returnMoney = amount.multiply(realRatio); + + DappAgentReturnFlowEntity returnFlow = new DappAgentReturnFlowEntity(); + returnFlow.setCreateTime(new Date()); + returnFlow.setMemberId(member.getId()); + returnFlow.setAgentMemberId(agent.getId()); + returnFlow.setAmount(returnMoney); + returnFlow.setIsReturn(2); + dappAgentReturnFlowDao.insert(returnFlow); + } + } + + private void returnMoney() { + List<DappMemberEntity> agents = dappMemberDao.selectAgentMemberList(null, null); + if (CollUtil.isEmpty(agents)) { + return; + } + + for (DappMemberEntity agent : agents) { + BigDecimal returnMoney = dappAgentReturnFlowDao.selectTotalAmountByMemberId(agent.getId(), 2); + if (returnMoney.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + + DappWalletMineEntity walletMine = dappWalletMineDao.selectByMemberId(agent.getId()); + dappWalletMineDao.updateBalance(returnMoney, returnMoney, agent.getId()); + + // 流水 + DappFundFlowEntity fundFlow = new DappFundFlowEntity(agent.getId(), returnMoney, 4, null, null); + dappFundFlowDao.insert(fundFlow); + + String content = "代理返利:" + returnMoney.toPlainString(); + DappAccountMoneyChangeEntity accountMoneyChange = new DappAccountMoneyChangeEntity(agent.getId(), walletMine.getAvailableAmount(), returnMoney, walletMine.getAvailableAmount().add(returnMoney), content, 4); + dappAccountMoneyChangeDao.insert(accountMoneyChange); + } } } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 8ff710a..be7f21d 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -18,7 +18,7 @@ username: sys_dapp password: sys_dapp!@#123 driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/sys-dapp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b9 + url: jdbc:mysql://127.0.0.1:3306/sys_dapp?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b9 redis: # Redis数据库索引(默认为 0) diff --git a/src/main/resources/mapper/dapp/DappAgentReturnFlowDao.xml b/src/main/resources/mapper/dapp/DappAgentReturnFlowDao.xml new file mode 100644 index 0000000..2c796bf --- /dev/null +++ b/src/main/resources/mapper/dapp/DappAgentReturnFlowDao.xml @@ -0,0 +1,14 @@ +<?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.DappAgentReturnFlowDao"> + + <select id="selectTotalAmountByMemberId" resultType="java.math.BigDecimal"> + select IFNULL(sum(amount),0) + from dapp_agent_return_flow + where agent_member_id=#{memberId} + <if test="isReturn!=null"> + and is_return=#{isReturn} + </if> + </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 7434256..8d3baac 100644 --- a/src/main/resources/mapper/dapp/DappMemberDao.xml +++ b/src/main/resources/mapper/dapp/DappMemberDao.xml @@ -36,4 +36,21 @@ select * from dapp_member where account_status=1 </select> + + <select id="selectAgentMemberList" resultType="cc.mrbird.febs.dapp.entity.DappMemberEntity"> + select * from dapp_member a + inner join dapp_user_member_relate b on a.id=b.member_id + <where> + 1=1 + <if test="list != null"> + and a.invite_id in + <foreach collection="list" close=")" open="(" item="item" separator=","> + ${item} + </foreach> + </if> + </where> + <if test="size != null"> + limit ${size} + </if> + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/dapp/DappUserMemberRelateDao.xml b/src/main/resources/mapper/dapp/DappUserMemberRelateDao.xml index 685387e..6c49d4d 100644 --- a/src/main/resources/mapper/dapp/DappUserMemberRelateDao.xml +++ b/src/main/resources/mapper/dapp/DappUserMemberRelateDao.xml @@ -16,4 +16,9 @@ select * from dapp_user_member_relate where user_id=#{userId} </select> + + <select id="selectByInviteId" resultType="cc.mrbird.febs.dapp.entity.DappUserMemberRelateEntity"> + select * from dapp_user_member_relate + where invite_id=#{inviteId} + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/dapp/DappWalletMineDao.xml b/src/main/resources/mapper/dapp/DappWalletMineDao.xml index 3e09ca2..6f103bb 100644 --- a/src/main/resources/mapper/dapp/DappWalletMineDao.xml +++ b/src/main/resources/mapper/dapp/DappWalletMineDao.xml @@ -18,4 +18,11 @@ </if> </where> </select> + + <update id="updateBalance"> + update dapp_wallet_mine + set total_amount = total_amount + #{totalAmount}, + available_amount = available_amount + #{availableAmount} + where member_id=#{memberId} + </update> </mapper> \ No newline at end of file diff --git a/src/main/resources/templates/febs/views/dapp/agent-return.html b/src/main/resources/templates/febs/views/dapp/agent-return.html new file mode 100644 index 0000000..fdbea0e --- /dev/null +++ b/src/main/resources/templates/febs/views/dapp/agent-return.html @@ -0,0 +1,103 @@ +<div class="layui-fluid layui-anim febs-anim" id="febs-agent-return" lay-title="代理返利"> + <div class="layui-row febs-container"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-body febs-table-full"> + <form class="layui-form layui-table-form" lay-filter="withdraw-table-form"> + <div class="layui-row"> + <div class="layui-col-md10"> + <div class="layui-form-item"> + <div class="layui-inline"> + <div class="layui-input-inline"> + <input type="text" name="address" autocomplete="off" placeholder="输入地址或邀请码" class="layui-input"> + </div> + </div> + </div> + </div> + <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> + <i class="layui-icon"></i> + </div> + <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> + <i class="layui-icon"></i> + </div> + </div> + </div> + </form> + <table lay-filter="agentReturnTable" lay-data="{id: 'agentReturnTable'}"></table> + </div> + </div> + </div> + </div> +</div> +<style> + .layui-table-cell { + height: auto !important; + } +</style> +<script data-th-inline="none" type="text/javascript"> + layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () { + var $ = layui.jquery, + laydate = layui.laydate, + febs = layui.febs, + form = layui.form, + table = layui.table, + dropdown = layui.dropdown, + $view = $('#febs-agent-return'), + $query = $view.find('#query'), + $reset = $view.find('#reset'), + $searchForm = $view.find('form'), + sortObject = {field: 'createTime', type: null}, + tableIns; + + form.render(); + + initTable(); + + table.on('tool(agentReturnTable)', function (obj) { + var data = obj.data, + layEvent = obj.event; + }); + + table.on('sort(agentReturnTable)', function (obj) { + sortObject = obj; + tableIns.reload({ + initSort: obj, + where: $.extend(getQueryParams(), { + field: obj.field, + order: obj.type + }) + }); + }); + + $query.on('click', function () { + var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); + tableIns.reload({where: params, page: {curr: 1}}); + }); + + $reset.on('click', function () { + $searchForm[0].reset(); + tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); + }); + + function initTable() { + tableIns = febs.table.init({ + elem: $view.find('table'), + id: 'agentReturnTable', + url: ctx + 'flow/fundFlow?type=4', + cols: [[ + {field: 'address', title: '地址', minWidth: 130}, + {field: 'createTime', title: '创建时间', minWidth: 180}, + {field: 'amount', title: '返利金额(ETH)', minWidth: 130} + ]] + }); + } + + function getQueryParams() { + return { + address: $searchForm.find('input[name="address"]').val().trim(), + invalidate_ie_cache: new Date() + }; + } + }) +</script> diff --git a/src/main/resources/templates/febs/views/dapp/money-change-flow.html b/src/main/resources/templates/febs/views/dapp/money-change-flow.html index d5c9c36..de7ecbb 100644 --- a/src/main/resources/templates/febs/views/dapp/money-change-flow.html +++ b/src/main/resources/templates/febs/views/dapp/money-change-flow.html @@ -20,6 +20,7 @@ <option value="1">兑换</option> <option value="2">提现</option> <option value="3">采矿</option> + <option value="4">代理返利</option> </select> </div> </div> @@ -71,7 +72,8 @@ var type = { 1: {title: '兑换'}, 2: {title: '提现'}, - 3: {title: '采矿'} + 3: {title: '采矿'}, + 4: {title: '代理返利'} }[d.type]; }} <span>{{ type.title }}</span> -- Gitblit v1.9.1